From e637f7237c338ead02026e15754f44b2cf15429e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 Feb 2024 10:28:06 -0800 Subject: [PATCH 001/275] straighten out a few key stability issues in eval watch views; editing expressions will no longer eliminate view rules; stale view rules will no longer find their way into inserted expressions --- src/df/core/df_core.c | 8 ++--- src/df/core/df_core.h | 2 +- src/df/gfx/df_gfx.c | 4 ++- src/df/gfx/df_views.c | 68 ++++++++++++++++++++++++++++++------------- src/df/gfx/df_views.h | 2 ++ 5 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index a70712f6..2cc202da 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -5429,13 +5429,11 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie } internal DF_EvalVizBlockList -df_eval_viz_block_list_from_eval_view_expr_num(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, String8 expr, U64 num) +df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key) { ProfBeginFunction(); DF_EvalVizBlockList blocks = {0}; { - DF_ExpandKey start_parent_key = df_expand_key_make(5381, num); - DF_ExpandKey start_key = df_expand_key_make(df_hash_from_expand_key(start_parent_key), df_hash_from_string(expr)); DF_Eval eval = df_eval_from_string(arena, scope, ctrl_ctx, parse_ctx, macro_map, expr); U64 expr_comma_pos = str8_find_needle(expr, 0, str8_lit(","), 0); String8List default_view_rules = {0}; @@ -5460,14 +5458,14 @@ df_eval_viz_block_list_from_eval_view_expr_num(Arena *arena, DBGI_Scope *scope, str8_list_pushf(arena, &default_view_rules, "array:{%S}", expr_extension); } } - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, start_key); + String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); DF_CfgTable view_rule_table = {0}; for(String8Node *n = default_view_rules.first; n != 0; n = n->next) { df_cfg_table_push_unparsed_string(arena, &view_rule_table, n->string, DF_CfgSrc_User); } df_cfg_table_push_unparsed_string(arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, start_parent_key, start_key, expr, eval, 0, &view_rule_table, 0, &blocks); + df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, parent_key, key, expr, eval, 0, &view_rule_table, 0, &blocks); } ProfEnd(); return blocks; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 848f50a7..48b0845c 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1618,7 +1618,7 @@ internal DF_EvalVizBlock *df_eval_viz_block_begin(Arena *arena, DF_EvalVizBlockK internal DF_EvalVizBlock *df_eval_viz_block_split_and_continue(Arena *arena, DF_EvalVizBlockList *list, DF_EvalVizBlock *split_block, U64 split_idx); internal void df_eval_viz_block_end(DF_EvalVizBlockList *list, DF_EvalVizBlock *block); internal void df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalView *view, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out); -internal DF_EvalVizBlockList df_eval_viz_block_list_from_eval_view_expr_num(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, String8 expr, U64 num); +internal DF_EvalVizBlockList df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key); internal void df_eval_viz_block_list_concat__in_place(DF_EvalVizBlockList *dst, DF_EvalVizBlockList *to_push); //- rjf: viz block list <-> table coordinates diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index eab71082..82561444 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -5105,7 +5105,9 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D U64 expr_hash = df_hash_from_string(expr); DF_EvalViewKey eval_view_key = df_eval_view_key_from_stringf("eval_hover_%I64x", expr_hash); DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); - DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_num(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, expr, 1); + DF_ExpandKey parent_key = df_expand_key_make(5381, 1); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), 1); + DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, expr, parent_key, key); DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, 10, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); //- rjf: animate diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index eb45f21e..0a0a3fd9 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -610,9 +610,7 @@ df_eval_root_from_expand_key(DF_EvalWatchViewState *ews, DF_EvalView *eval_view, DF_EvalRoot *root = 0; for(DF_EvalRoot *r = ews->first_root; r != 0; r = r->next) { - DF_ExpandKey parent_key = df_expand_key_make(5381, (U64)r); - U64 parent_key_hash = df_hash_from_expand_key(parent_key); - DF_ExpandKey key = df_expand_key_make(parent_key_hash, df_hash_from_string(df_string_from_eval_root(r))); + DF_ExpandKey key = df_expand_key_from_eval_root(r); if(df_expand_key_match(key, expand_key)) { root = r; @@ -629,6 +627,21 @@ df_string_from_eval_root(DF_EvalRoot *root) return string; } +internal DF_ExpandKey +df_parent_expand_key_from_eval_root(DF_EvalRoot *root) +{ + DF_ExpandKey parent_key = df_expand_key_make(5381, (U64)root); + return parent_key; +} + +internal DF_ExpandKey +df_expand_key_from_eval_root(DF_EvalRoot *root) +{ + DF_ExpandKey parent_key = df_parent_expand_key_from_eval_root(root); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), (U64)root); + return key; +} + //- rjf: windowed watch tree visualization (both single-line and multi-line) internal DF_EvalVizBlockList @@ -655,7 +668,9 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); if(matches.count == matches.needle_part_count) { - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, (U64)root); + DF_ExpandKey parent_key = df_parent_expand_key_from_eval_root(root); + DF_ExpandKey key = df_expand_key_from_eval_root(root); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -679,7 +694,9 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); if(matches.count == matches.needle_part_count) { - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, num); + DF_ExpandKey parent_key = df_expand_key_make(5381, 0); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -689,7 +706,9 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); if(matches.count == matches.needle_part_count) { - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, num); + DF_ExpandKey parent_key = df_expand_key_make(5381, 0); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -707,7 +726,9 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); if(matches.count == matches.needle_part_count) { - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, num); + DF_ExpandKey parent_key = df_expand_key_make(5381, 0); + DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -1624,7 +1645,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW { DF_EvalWatchViewColumnKind commit_column = (DF_EvalWatchViewColumnKind)cursor_tbl.x; cursor_tbl = next_cursor_tbl; - if(edit_commit) + if(commit_row != 0 && edit_commit) { ewv->input_editing = 0; String8 commit_string = str8(ewv->input_buffer, ewv->input_size); @@ -1653,6 +1674,10 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW if(!root && df_expand_key_match(commit_row->key, empty_row_key)) { root = df_eval_root_alloc(view, ewv); + DF_ExpandKey parent_key = df_parent_expand_key_from_eval_root(root); + DF_ExpandKey key = df_expand_key_from_eval_root(root); + df_expand_set_expansion(eval_view->arena, &eval_view->expand_tree_table, parent_key, key, 0); + df_eval_view_set_key_rule(eval_view, key, str8_lit("")); } if(root != 0) { @@ -6650,6 +6675,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(Watch) // rjf: add roots for watches { + Temp scratch = scratch_begin(0, 0); DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ewv); DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); for(DF_CfgNode *expr = cfg_root->first; expr != &df_g_nil_cfg_node; expr = expr->next) @@ -6657,17 +6683,17 @@ DF_VIEW_SETUP_FUNCTION_DEF(Watch) if(expr->flags & DF_CfgNodeFlag_StringLiteral) { DF_EvalRoot *root = df_eval_root_alloc(view, ewv); - DF_ExpandKey parent_key = df_expand_key_make(5381, (U64)root); - U64 parent_key_hash = df_hash_from_expand_key(parent_key); - df_eval_root_equip_string(root, expr->string); + DF_ExpandKey key = df_expand_key_from_eval_root(root); + String8 expr_raw = df_cfg_raw_from_escaped_string(scratch.arena, expr->string); + df_eval_root_equip_string(root, expr_raw); if(expr->first != &df_g_nil_cfg_node) { - DF_ExpandKey root_key = df_expand_key_make(parent_key_hash, df_hash_from_string(expr->string)); - String8 view_rule = expr->first->string; - df_eval_view_set_key_rule(eval_view, root_key, view_rule); + String8 view_rule_raw = df_cfg_raw_from_escaped_string(scratch.arena, expr->first->string); + df_eval_view_set_key_rule(eval_view, key, view_rule_raw); } } } + scratch_end(scratch); } ProfEnd(); @@ -6683,15 +6709,15 @@ DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch) { for(DF_EvalRoot *root = ewv->first_root; root != 0; root = root->next) { - DF_ExpandKey parent_key = df_expand_key_make(5381, (U64)root); - U64 parent_key_hash = df_hash_from_expand_key(parent_key); + DF_ExpandKey key = df_expand_key_from_eval_root(root); String8 string = df_string_from_eval_root(root); - str8_list_pushf(arena, &strs, "\"%S\"", string); - DF_ExpandKey root_key = df_expand_key_make(parent_key_hash, df_hash_from_string(string)); - String8 view_rule = df_eval_view_rule_from_key(eval_view, root_key); - if(view_rule.size != 0) + String8 string_escaped = df_cfg_escaped_from_raw_string(scratch.arena, string); + str8_list_pushf(arena, &strs, "\"%S\"", string_escaped); + String8 view_rule = df_eval_view_rule_from_key(eval_view, key); + String8 view_rule_escaped = df_cfg_escaped_from_raw_string(scratch.arena, view_rule); + if(view_rule_escaped.size != 0) { - str8_list_pushf(arena, &strs, ":{\"%S\"}", view_rule); + str8_list_pushf(arena, &strs, ":{\"%S\"}", view_rule_escaped); } if(root->next != 0) { diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 0a5933dc..b32c90a0 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -453,6 +453,8 @@ internal void df_eval_root_equip_string(DF_EvalRoot *root, String8 str internal DF_EvalRoot * df_eval_root_from_string(DF_EvalWatchViewState *ews, String8 string); internal DF_EvalRoot * df_eval_root_from_expand_key(DF_EvalWatchViewState *ews, DF_EvalView *eval_view, DF_ExpandKey expand_key); internal String8 df_string_from_eval_root(DF_EvalRoot *root); +internal DF_ExpandKey df_parent_expand_key_from_eval_root(DF_EvalRoot *root); +internal DF_ExpandKey df_expand_key_from_eval_root(DF_EvalRoot *root); //- rjf: windowed watch tree visualization internal DF_EvalVizBlockList df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_EvalWatchViewState *ews); From ccec64750d65da7ad05766e256be063602b7096d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 Feb 2024 12:59:56 -0800 Subject: [PATCH 002/275] fix raddbg_dump build --- src/raddbg_dump/raddbg_dump.c | 36 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/raddbg_dump/raddbg_dump.c b/src/raddbg_dump/raddbg_dump.c index 96b42364..2fa2dc50 100644 --- a/src/raddbg_dump/raddbg_dump.c +++ b/src/raddbg_dump/raddbg_dump.c @@ -196,7 +196,7 @@ main(int argc, char **argv){ if (raddbg->binary_sections != 0 && params->dump_binary_sections){ str8_list_pushf(arena, &dump, "# BINARY SECTIONS:\n"); RADDBG_BinarySection *ptr = raddbg->binary_sections; - for (U32 i = 0; i < raddbg->binary_section_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->binary_sections_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " section[%u]:\n", i); raddbg_stringize_binary_section(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); @@ -209,12 +209,12 @@ main(int argc, char **argv){ RADDBG_FilePathBundle file_path_bundle = {0}; { file_path_bundle.file_paths = raddbg->file_paths; - file_path_bundle.file_path_count = raddbg->file_path_count; + file_path_bundle.file_path_count = raddbg->file_paths_count; } str8_list_pushf(arena, &dump, "# FILE PATHS\n"); RADDBG_FilePathNode *ptr = raddbg->file_paths; - for (U32 i = 0; i < raddbg->file_path_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->file_paths_count; i += 1, ptr += 1){ if (ptr->parent_path_node == 0){ raddbg_stringize_file_path(arena, &dump, raddbg, &file_path_bundle, ptr, 1); } @@ -226,7 +226,7 @@ main(int argc, char **argv){ if (raddbg->source_files != 0 && params->dump_source_files){ str8_list_pushf(arena, &dump, "# SOURCE FILES\n"); RADDBG_SourceFile *ptr = raddbg->source_files; - for (U32 i = 0; i < raddbg->source_file_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->source_files_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " source_file[%u]:\n", i); raddbg_stringize_source_file(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); @@ -238,7 +238,7 @@ main(int argc, char **argv){ if (raddbg->units != 0 && params->dump_units){ str8_list_pushf(arena, &dump, "# UNITS\n"); RADDBG_Unit *ptr = raddbg->units; - for (U32 i = 0; i < raddbg->unit_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->units_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " unit[%u]:\n", i); raddbg_stringize_unit(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); @@ -260,7 +260,7 @@ main(int argc, char **argv){ if (raddbg->type_nodes != 0 && params->dump_type_nodes){ str8_list_pushf(arena, &dump, "# TYPE NODES:\n"); RADDBG_TypeNode *ptr = raddbg->type_nodes; - for (U32 i = 0; i < raddbg->type_node_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->type_nodes_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " type[%u]:\n", i); raddbg_stringize_type_node(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); @@ -274,13 +274,13 @@ main(int argc, char **argv){ { member_bundle.members = raddbg->members; member_bundle.enum_members = raddbg->enum_members; - member_bundle.member_count = raddbg->member_count; - member_bundle.enum_member_count = raddbg->enum_member_count; + member_bundle.member_count = raddbg->members_count; + member_bundle.enum_member_count = raddbg->enum_members_count; } str8_list_pushf(arena, &dump, "# UDTS:\n"); RADDBG_UDT *ptr = raddbg->udts; - for (U32 i = 0; i < raddbg->udt_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->udts_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " udt[%u]:\n", i); raddbg_stringize_udt(arena, &dump, raddbg, &member_bundle, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); @@ -292,7 +292,7 @@ main(int argc, char **argv){ if (raddbg->global_variables != 0 && params->dump_global_variables){ str8_list_pushf(arena, &dump, "# GLOBAL VARIABLES:\n"); RADDBG_GlobalVariable *ptr = raddbg->global_variables; - for (U32 i = 0; i < raddbg->global_variable_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->global_variables_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " global_variable[%u]:\n", i); raddbg_stringize_global_variable(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); @@ -314,7 +314,7 @@ main(int argc, char **argv){ if (raddbg->thread_variables != 0 && params->dump_thread_variables){ str8_list_pushf(arena, &dump, "# THREAD VARIABLES:\n"); RADDBG_ThreadVariable *ptr = raddbg->thread_variables; - for (U32 i = 0; i < raddbg->thread_variable_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->thread_variables_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " thread_variable[%u]:\n", i); raddbg_stringize_thread_variable(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); @@ -326,7 +326,7 @@ main(int argc, char **argv){ if (raddbg->procedures != 0 && params->dump_procedures){ str8_list_pushf(arena, &dump, "# PROCEDURES:\n"); RADDBG_Procedure *ptr = raddbg->procedures; - for (U32 i = 0; i < raddbg->procedure_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->procedures_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " procedure[%u]:\n", i); raddbg_stringize_procedure(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); @@ -339,20 +339,20 @@ main(int argc, char **argv){ RADDBG_ScopeBundle scope_bundle = {0}; { scope_bundle.scopes = raddbg->scopes; - scope_bundle.scope_count = raddbg->scope_count; + scope_bundle.scope_count = raddbg->scopes_count; scope_bundle.scope_voffs = raddbg->scope_voffs; - scope_bundle.scope_voff_count = raddbg->scope_voff_count; + scope_bundle.scope_voff_count = raddbg->scope_voffs_count; scope_bundle.locals = raddbg->locals; - scope_bundle.local_count = raddbg->local_count; + scope_bundle.local_count = raddbg->locals_count; scope_bundle.location_blocks = raddbg->location_blocks; - scope_bundle.location_block_count = raddbg->location_block_count; + scope_bundle.location_block_count = raddbg->location_blocks_count; scope_bundle.location_data = raddbg->location_data; scope_bundle.location_data_size = raddbg->location_data_size; } str8_list_pushf(arena, &dump, "# SCOPES:\n"); RADDBG_Scope *ptr = raddbg->scopes; - for (U32 i = 0; i < raddbg->scope_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->scopes_count; i += 1, ptr += 1){ if (ptr->parent_scope_idx == 0){ raddbg_stringize_scope(arena, &dump, raddbg, &scope_bundle, ptr, 1); str8_list_push(arena, &dump, str8_lit("\n")); @@ -375,7 +375,7 @@ main(int argc, char **argv){ if (raddbg->name_maps != 0 && params->dump_name_map){ str8_list_pushf(arena, &dump, "# NAME MAP:\n"); RADDBG_NameMap *ptr = raddbg->name_maps; - for (U32 i = 0; i < raddbg->name_map_count; i += 1, ptr += 1){ + for (U32 i = 0; i < raddbg->name_maps_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " name_map[%u]:\n", i); RADDBG_ParsedNameMap name_map = {0}; From 390aab2699201a35922591941f700de476a0075d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 Feb 2024 13:35:14 -0800 Subject: [PATCH 003/275] raddbg from pdb: correctly parse several c13 files in single c13 subsection, rather than just assuming a single one --- src/raddbg_convert/pdb/raddbg_codeview.c | 148 ++++++++++-------- src/raddbg_convert/pdb/raddbg_codeview.h | 12 +- .../pdb/raddbg_codeview_stringize.c | 19 ++- src/raddbg_convert/pdb/raddbg_from_pdb.c | 13 +- 4 files changed, 111 insertions(+), 81 deletions(-) diff --git a/src/raddbg_convert/pdb/raddbg_codeview.c b/src/raddbg_convert/pdb/raddbg_codeview.c index 099365e4..472906a9 100644 --- a/src/raddbg_convert/pdb/raddbg_codeview.c +++ b/src/raddbg_convert/pdb/raddbg_codeview.c @@ -399,76 +399,90 @@ cv_c13_from_data(Arena *arena, String8 c13_data, { // read header if (sizeof(CV_C13_SubSecLinesHeader) <= cap){ - CV_C13_SubSecLinesHeader *hdr = (CV_C13_SubSecLinesHeader*)first; + U32 read_off = 0; + U64 read_off_opl = node->size; + CV_C13_SubSecLinesHeader *hdr = (CV_C13_SubSecLinesHeader*)(first + read_off); + read_off += sizeof(*hdr); - // read file - U32 file_info_off = sizeof(*hdr); - if (file_info_off + sizeof(CV_C13_File) <= cap){ - CV_C13_File *file = (CV_C13_File*)(first + file_info_off); + // extract top level info + U32 sec_idx = hdr->sec; + B32 has_cols = !!(hdr->flags & CV_C13_SubSecLinesFlag_HasColumns); + U64 secrel_off = hdr->sec_off; + U64 secrel_opl = secrel_off + hdr->len; + U64 sec_base_off = sections->sections[sec_idx - 1].voff; + + // rjf: bad section index -> skip + if(sec_idx < 1 || sections->count < sec_idx) + { + continue; + } + + // read files + for(;read_off+sizeof(CV_C13_File) <= read_off_opl;) + { + // rjf: grab next file header + CV_C13_File *file = (CV_C13_File*)(first + read_off); + U32 file_off = file->file_off; + U32 line_count_unclamped = file->num_lines; + U32 block_size = file->block_size; - // extract top level info - U32 sec_idx = hdr->sec; - if (1 <= sec_idx && sec_idx <= sections->count){ - B32 has_cols = !!(hdr->flags & CV_C13_SubSecLinesFlag_HasColumns); - U64 secrel_off = hdr->sec_off; - U64 secrel_opl = secrel_off + hdr->len; - - U64 sec_base_off = sections->sections[sec_idx - 1].voff; - - U32 file_off = file->file_off; - U32 line_count_unclamped = file->num_lines; - U32 block_size = file->block_size; - - // file_name from file_off - String8 file_name = {0}; - if (file_off + sizeof(CV_C13_Checksum) <= file_chksms->size){ - CV_C13_Checksum *checksum = (CV_C13_Checksum*)(c13_data.str + file_chksms->off + file_off); - U32 name_off = checksum->name_off; - file_name = pdb_strtbl_string_from_off(strtbl, name_off); - } - - // array layouts - U32 line_item_size = sizeof(CV_C13_Line); - if (has_cols){ - line_item_size += sizeof(CV_C13_Column); - } - - U32 line_array_off = file_info_off + sizeof(*file); - U32 line_count_max = (cap - line_array_off)/line_item_size; - U32 line_count = ClampTop(line_count_unclamped, line_count_max); - - U32 col_array_off = line_array_off + line_count*sizeof(CV_C13_Line); - - // parse lines - U64 *voffs = push_array_no_zero(arena, U64, line_count + 1); - U32 *line_nums = push_array_no_zero(arena, U32, line_count); - - { - CV_C13_Line *line_ptr = (CV_C13_Line*)(first + line_array_off); - CV_C13_Line *line_opl = line_ptr + line_count; - - // TODO(allen): check order correctness here - - U32 i = 0; - for (; line_ptr < line_opl; line_ptr += 1, i += 1){ - voffs[i] = line_ptr->off + secrel_off + sec_base_off; - line_nums[i] = CV_C13_LineFlags_ExtractLineNumber(line_ptr->flags); - } - voffs[i] = secrel_opl + sec_base_off; - } - - // emit parsed lines - CV_C13LinesParsed *lines_parsed = push_array(arena, CV_C13LinesParsed, 1); - lines_parsed->sec_idx = sec_idx; - lines_parsed->file_off = file_off; - lines_parsed->secrel_base_off = secrel_off; - lines_parsed->file_name = file_name; - lines_parsed->voffs = voffs; - lines_parsed->line_nums = line_nums; - lines_parsed->line_count = line_count; - - node->lines = lines_parsed; + // file_name from file_off + String8 file_name = {0}; + if (file_off + sizeof(CV_C13_Checksum) <= file_chksms->size){ + CV_C13_Checksum *checksum = (CV_C13_Checksum*)(c13_data.str + file_chksms->off + file_off); + U32 name_off = checksum->name_off; + file_name = pdb_strtbl_string_from_off(strtbl, name_off); } + + // array layouts + U32 line_item_size = sizeof(CV_C13_Line); + if (has_cols){ + line_item_size += sizeof(CV_C13_Column); + } + + U32 line_array_off = read_off + sizeof(*file); + U32 line_count_max = (read_off_opl - line_array_off) / line_item_size; + U32 line_count = ClampTop(line_count_unclamped, line_count_max); + + U32 col_array_off = line_array_off + line_count*sizeof(CV_C13_Line); + + // parse lines + U64 *voffs = push_array_no_zero(arena, U64, line_count + 1); + U32 *line_nums = push_array_no_zero(arena, U32, line_count); + + { + CV_C13_Line *line_ptr = (CV_C13_Line*)(first + line_array_off); + CV_C13_Line *line_opl = line_ptr + line_count; + + // TODO(allen): check order correctness here + + U32 i = 0; + for (; line_ptr < line_opl; line_ptr += 1, i += 1){ + voffs[i] = line_ptr->off + secrel_off + sec_base_off; + if(voffs[i] == 0x0002318c) + { + int x = 0; + } + line_nums[i] = CV_C13_LineFlags_ExtractLineNumber(line_ptr->flags); + } + voffs[i] = secrel_opl + sec_base_off; + } + + // emit parsed lines + CV_C13LinesParsedNode *lines_parsed_node = push_array(arena, CV_C13LinesParsedNode, 1); + CV_C13LinesParsed *lines_parsed = &lines_parsed_node->v; + lines_parsed->sec_idx = sec_idx; + lines_parsed->file_off = file_off; + lines_parsed->secrel_base_off = secrel_off; + lines_parsed->file_name = file_name; + lines_parsed->voffs = voffs; + lines_parsed->line_nums = line_nums; + lines_parsed->line_count = line_count; + SLLQueuePush(node->lines_first, node->lines_last, lines_parsed_node); + + // rjf: advance + read_off += sizeof(*file); + read_off += line_item_size*line_count; } } }break; diff --git a/src/raddbg_convert/pdb/raddbg_codeview.h b/src/raddbg_convert/pdb/raddbg_codeview.h index aeed9188..3f1c5d4a 100644 --- a/src/raddbg_convert/pdb/raddbg_codeview.h +++ b/src/raddbg_convert/pdb/raddbg_codeview.h @@ -2977,14 +2977,20 @@ typedef struct CV_C13LinesParsed{ U32 line_count; } CV_C13LinesParsed; +typedef struct CV_C13LinesParsedNode CV_C13LinesParsedNode; +struct CV_C13LinesParsedNode +{ + CV_C13LinesParsedNode *next; + CV_C13LinesParsed v; +}; + typedef struct CV_C13SubSectionNode{ struct CV_C13SubSectionNode *next; CV_C13_SubSectionKind kind; U32 off; U32 size; - union{ - CV_C13LinesParsed *lines; - }; + CV_C13LinesParsedNode *lines_first; + CV_C13LinesParsedNode *lines_last; } CV_C13SubSectionNode; typedef struct CV_C13Parsed{ diff --git a/src/raddbg_convert/pdb/raddbg_codeview_stringize.c b/src/raddbg_convert/pdb/raddbg_codeview_stringize.c index 10534908..b8729609 100644 --- a/src/raddbg_convert/pdb/raddbg_codeview_stringize.c +++ b/src/raddbg_convert/pdb/raddbg_codeview_stringize.c @@ -2330,21 +2330,26 @@ cv_stringize_leaf_array(Arena *arena, String8List *out, static void cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13){ - for (CV_C13SubSectionNode *node = c13->first_sub_section; - node != 0; - node = node->next){ + for(CV_C13SubSectionNode *node = c13->first_sub_section; + node != 0; + node = node->next) + { String8 kind_str = cv_string_from_c13_sub_section_kind(node->kind); str8_list_pushf(arena, out, "C13 Sub Section [%llx] (%.*s):\n", node->off, str8_varg(kind_str)); - switch (node->kind){ + switch(node->kind) + { case CV_C13_SubSectionKind_Lines: { - CV_C13LinesParsed *lines = node->lines; - if (lines == 0){ + if (node->lines_first == 0) + { str8_list_push(arena, out, str8_lit(" failed to extract info\n")); } - else{ + else for(CV_C13LinesParsedNode *n = node->lines_first; n != 0; n = n->next) + { + CV_C13LinesParsed *lines = &n->v; + str8_list_pushf(arena, out, " section: %u\n", lines->sec_idx); str8_list_pushf(arena, out, " file off: %u\n", lines->file_off); str8_list_pushf(arena, out, " file name: %.*s\n", str8_varg(lines->file_name)); diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 01963467..46eeb0d4 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -3419,10 +3419,15 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // unit's line info for (CV_C13SubSectionNode *node = unit_c13->first_sub_section; node != 0; - node = node->next){ - if (node->kind == CV_C13_SubSectionKind_Lines){ - CV_C13LinesParsed *lines = node->lines; - if (lines != 0){ + node = node->next) + { + if(node->kind == CV_C13_SubSectionKind_Lines) + { + for(CV_C13LinesParsedNode *lines_n = node->lines_first; + lines_n != 0; + lines_n = lines_n->next) + { + CV_C13LinesParsed *lines = &lines_n->v; CONS_LineSequence seq = {0}; seq.file_name = lines->file_name; seq.voffs = lines->voffs; From 2c73c6587843ff3067efa1ca81a1271bfc8cd77f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 Feb 2024 13:35:34 -0800 Subject: [PATCH 004/275] remove debug --- src/raddbg_convert/pdb/raddbg_codeview.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/raddbg_convert/pdb/raddbg_codeview.c b/src/raddbg_convert/pdb/raddbg_codeview.c index 472906a9..83ee6e44 100644 --- a/src/raddbg_convert/pdb/raddbg_codeview.c +++ b/src/raddbg_convert/pdb/raddbg_codeview.c @@ -459,10 +459,6 @@ cv_c13_from_data(Arena *arena, String8 c13_data, U32 i = 0; for (; line_ptr < line_opl; line_ptr += 1, i += 1){ voffs[i] = line_ptr->off + secrel_off + sec_base_off; - if(voffs[i] == 0x0002318c) - { - int x = 0; - } line_nums[i] = CV_C13_LineFlags_ExtractLineNumber(line_ptr->flags); } voffs[i] = secrel_opl + sec_base_off; From fb9e890653143bd0a34e66cd492c1258ec62cc31 Mon Sep 17 00:00:00 2001 From: axeldaguerre Date: Tue, 30 Jan 2024 17:52:19 +0100 Subject: [PATCH 005/275] fix utf8 encoding missing one bit shift For Unicode code point in the highest range, 1 bit shift operation on the 4th byte is missing, giving a wrong encoding --- src/base/base_string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/base_string.c b/src/base/base_string.c index 41df6577..4959dbb7 100644 --- a/src/base/base_string.c +++ b/src/base/base_string.c @@ -1306,7 +1306,7 @@ utf8_encode(U8 *str, U32 codepoint){ inc = 3; } else if (codepoint <= 0x10FFFF){ - str[0] = (bitmask4 << 3) | ((codepoint >> 18) & bitmask3); + str[0] = (bitmask4 << 4) | ((codepoint >> 18) & bitmask3); str[1] = bit8 | ((codepoint >> 12) & bitmask6); str[2] = bit8 | ((codepoint >> 6) & bitmask6); str[3] = bit8 | ( codepoint & bitmask6); From b9cec99cd422c1638c5746c768a733f626e80ab7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 Feb 2024 14:20:21 -0800 Subject: [PATCH 006/275] ui code -> extend 'active' system to all left/middle/right mouse buttons, rather than just min/max (left/right) --- src/base/base_types.h | 3 + src/df/gfx/df_gfx.c | 5 +- src/ui/ui_core.c | 168 ++++++++++++++++++++++++------------------ src/ui/ui_core.h | 20 ++++- 4 files changed, 118 insertions(+), 78 deletions(-) diff --git a/src/base/base_types.h b/src/base/base_types.h index 3abf3251..bdc6a916 100644 --- a/src/base/base_types.h +++ b/src/base/base_types.h @@ -170,6 +170,9 @@ #define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end)) #define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end)) +#define EachEnumVal(type, it) type it = (type)0; it < type##_COUNT; it = (type)(it+1) +#define EachNonZeroEnumVal(type, it) type it = (type)1; it < type##_COUNT; it = (type)(it+1) + #if LANG_CPP # define zero_struct {} #else diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 82561444..5adc9838 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -7537,7 +7537,10 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop internal void df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_CtrlCtx ctrl_ctx, DF_Entity *file, TxtPt pt, U64 vaddr, String8 string) { - if(ws->hover_eval_last_frame_idx+1 < df_frame_index() && ui_key_match(ui_active_key(Side_Min), ui_key_zero()) && ui_key_match(ui_active_key(Side_Max), ui_key_zero())) + if(ws->hover_eval_last_frame_idx+1 < df_frame_index() && + ui_key_match(ui_active_key(UI_MouseButtonKind_Left), ui_key_zero()) && + ui_key_match(ui_active_key(UI_MouseButtonKind_Middle), ui_key_zero()) && + ui_key_match(ui_active_key(UI_MouseButtonKind_Right), ui_key_zero())) { B32 is_new_string = !str8_match(ws->hover_eval_string, string, 0); if(is_new_string) diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 0ee5cf2b..f5fdc9a1 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -591,9 +591,9 @@ ui_hot_key(void) } internal UI_Key -ui_active_key(Side side) +ui_active_key(UI_MouseButtonKind button_kind) { - return ui_state->active_box_key[side]; + return ui_state->active_box_key[button_kind]; } //- rjf: controls over interaction @@ -601,7 +601,10 @@ ui_active_key(Side side) internal void ui_kill_action(void) { - ui_state->active_box_key[Side_Min] = ui_state->active_box_key[Side_Max] = ui_key_zero(); + for(EachEnumVal(UI_MouseButtonKind, k)) + { + ui_state->active_box_key[k] = ui_key_zero(); + } } //- rjf: box cache lookup @@ -958,32 +961,41 @@ ui_begin_build(OS_EventList *events, OS_Handle window, UI_NavActionList *nav_act } //- rjf: reset hot if we don't have an active widget - if(ui_key_match(ui_state->active_box_key[Side_Min], ui_key_zero()) && - ui_key_match(ui_state->active_box_key[Side_Max], ui_key_zero())) { - ui_state->hot_box_key = ui_key_zero(); + B32 has_active = 0; + for(EachEnumVal(UI_MouseButtonKind, k)) + { + if(!ui_key_match(ui_state->active_box_key[k], ui_key_zero())) + { + has_active = 1; + } + } + if(!has_active) + { + ui_state->hot_box_key = ui_key_zero(); + } } //- rjf: reset active if our active box is disabled - for(Side side = (Side)0; side < Side_COUNT; side = (Side)(side+1)) + for(EachEnumVal(UI_MouseButtonKind, k)) { - if(!ui_key_match(ui_state->active_box_key[side], ui_key_zero())) + if(!ui_key_match(ui_state->active_box_key[k], ui_key_zero())) { - UI_Box *box = ui_box_from_key(ui_state->active_box_key[side]); + UI_Box *box = ui_box_from_key(ui_state->active_box_key[k]); if(!ui_box_is_nil(box) && box->flags & UI_BoxFlag_Disabled) { - ui_state->active_box_key[side] = ui_key_zero(); + ui_state->active_box_key[k] = ui_key_zero(); } } } //- rjf: reset active keys if they have been pruned - for(Side side = Side_Min; side < Side_COUNT; side = (Side)(side + 1)) + for(EachEnumVal(UI_MouseButtonKind, k)) { - UI_Box *box = ui_box_from_key(ui_state->active_box_key[side]); + UI_Box *box = ui_box_from_key(ui_state->active_box_key[k]); if(ui_box_is_nil(box)) { - ui_state->active_box_key[side] = ui_key_zero(); + ui_state->active_box_key[k] = ui_key_zero(); } } @@ -993,9 +1005,9 @@ ui_begin_build(OS_EventList *events, OS_Handle window, UI_NavActionList *nav_act if((event->kind == OS_EventKind_Press || event->kind == OS_EventKind_Release) && !os_handle_match(event->window, window)) { - for(Side side = Side_Min; side < Side_COUNT; side = (Side)(side + 1)) + for(EachEnumVal(UI_MouseButtonKind, k)) { - ui_state->active_box_key[side] = ui_key_zero(); + ui_state->active_box_key[k] = ui_key_zero(); } break; } @@ -1154,7 +1166,7 @@ ui_end_build(void) { // rjf: grab states informing animation B32 is_hot = ui_key_match(box->key, ui_state->hot_box_key); - B32 is_active = ui_key_match(box->key, ui_state->active_box_key[Side_Min]); + B32 is_active = ui_key_match(box->key, ui_state->active_box_key[UI_MouseButtonKind_Left]); B32 is_disabled = !!(box->flags & UI_BoxFlag_Disabled) && (box->first_disabled_build_index+10 < ui_state->build_index || box->first_touched_build_index == box->first_disabled_build_index); B32 is_focus_hot = !!(box->flags & UI_BoxFlag_FocusHot) && !(box->flags & UI_BoxFlag_FocusHotDisabled); @@ -1273,7 +1285,7 @@ ui_end_build(void) //- rjf: hover cursor { UI_Box *hot = ui_box_from_key(ui_state->hot_box_key); - UI_Box *active = ui_box_from_key(ui_state->active_box_key[Side_Min]); + UI_Box *active = ui_box_from_key(ui_state->active_box_key[UI_MouseButtonKind_Left]); UI_Box *box = ui_box_is_nil(active) ? hot : active; OS_Cursor cursor = box->hover_cursor; if(box->flags & UI_BoxFlag_Disabled && box->flags & UI_BoxFlag_Clickable) @@ -1313,58 +1325,68 @@ ui_end_build(void) } //- rjf: hovering possibly-truncated drawn text -> store text - if(ui_key_match(ui_key_zero(), ui_state->active_box_key[Side_Min]) && - ui_key_match(ui_key_zero(), ui_state->active_box_key[Side_Max])) { - B32 found = 0; - for(UI_Box *box = ui_state->root, *next = 0; !ui_box_is_nil(box); box = next) + B32 inactive = 1; + for(EachEnumVal(UI_MouseButtonKind, k)) { - UI_BoxRec rec = ui_box_rec_df_pre(box, ui_state->root); - next = rec.next; - S32 pop_idx = 0; - for(UI_Box *b = box; !ui_box_is_nil(b) && pop_idx <= rec.pop_count; b = b->parent, pop_idx += 1) + if(!ui_key_match(ui_key_zero(), ui_state->active_box_key[k])) { - if(b->flags & UI_BoxFlag_DrawText && !(b->flags & UI_BoxFlag_DisableTextTrunc)) + inactive = 0; + break; + } + } + if(inactive) + { + B32 found = 0; + for(UI_Box *box = ui_state->root, *next = 0; !ui_box_is_nil(box); box = next) + { + UI_BoxRec rec = ui_box_rec_df_pre(box, ui_state->root); + next = rec.next; + S32 pop_idx = 0; + for(UI_Box *b = box; !ui_box_is_nil(b) && pop_idx <= rec.pop_count; b = b->parent, pop_idx += 1) { - String8 box_display_string = ui_box_display_string(b); - Vec2F32 text_pos = ui_box_text_position(b); - Vec2F32 drawn_text_dim = b->display_string_runs.dim; - B32 text_is_truncated = (drawn_text_dim.x + text_pos.x > b->rect.x1); - B32 mouse_is_hovering = contains_2f32(r2f32p(text_pos.x, - b->rect.y0, - Min(text_pos.x+drawn_text_dim.x, b->rect.x1), - b->rect.y1), - ui_state->mouse); - if(text_is_truncated && mouse_is_hovering) + if(b->flags & UI_BoxFlag_DrawText && !(b->flags & UI_BoxFlag_DisableTextTrunc)) { - if(!str8_match(box_display_string, ui_state->string_hover_string, 0)) + String8 box_display_string = ui_box_display_string(b); + Vec2F32 text_pos = ui_box_text_position(b); + Vec2F32 drawn_text_dim = b->display_string_runs.dim; + B32 text_is_truncated = (drawn_text_dim.x + text_pos.x > b->rect.x1); + B32 mouse_is_hovering = contains_2f32(r2f32p(text_pos.x, + b->rect.y0, + Min(text_pos.x+drawn_text_dim.x, b->rect.x1), + b->rect.y1), + ui_state->mouse); + if(text_is_truncated && mouse_is_hovering) { - arena_clear(ui_state->string_hover_arena); - ui_state->string_hover_string = push_str8_copy(ui_state->string_hover_arena, box_display_string); - ui_state->string_hover_fancy_runs = d_fancy_run_list_copy(ui_state->string_hover_arena, &b->display_string_runs); - ui_state->string_hover_begin_us = os_now_microseconds(); + if(!str8_match(box_display_string, ui_state->string_hover_string, 0)) + { + arena_clear(ui_state->string_hover_arena); + ui_state->string_hover_string = push_str8_copy(ui_state->string_hover_arena, box_display_string); + ui_state->string_hover_fancy_runs = d_fancy_run_list_copy(ui_state->string_hover_arena, &b->display_string_runs); + ui_state->string_hover_begin_us = os_now_microseconds(); + } + ui_state->string_hover_build_index = ui_state->build_index; + found = 1; + goto break_all_hover_string; } - ui_state->string_hover_build_index = ui_state->build_index; - found = 1; + } + if(b != box && contains_2f32(b->rect, ui_state->mouse) && b->flags & UI_BoxFlag_DrawText) + { goto break_all_hover_string; } } - if(b != box && contains_2f32(b->rect, ui_state->mouse) && b->flags & UI_BoxFlag_DrawText) - { - goto break_all_hover_string; - } } - } - break_all_hover_string:; - if(!found) - { - arena_clear(ui_state->string_hover_arena); - ui_state->string_hover_build_index = 0; - MemoryZeroStruct(&ui_state->string_hover_string); - } - if(found && !ui_string_hover_active()) - { - ui_state->is_animating = 1; + break_all_hover_string:; + if(!found) + { + arena_clear(ui_state->string_hover_arena); + ui_state->string_hover_build_index = 0; + MemoryZeroStruct(&ui_state->string_hover_string); + } + if(found && !ui_string_hover_active()) + { + ui_state->is_animating = 1; + } } } @@ -2449,8 +2471,8 @@ ui_signal_from_box(UI_Box *box) if(box->flags & UI_BoxFlag_MouseClickable && !ui_key_match(ui_key_zero(), box->key)) ProfScope("clickability") { // rjf: hot management - if((ui_key_match(ui_key_zero(), ui_state->active_box_key[Side_Min]) && - ui_key_match(ui_key_zero(), ui_state->active_box_key[Side_Max])) && + if((ui_key_match(ui_key_zero(), ui_state->active_box_key[UI_MouseButtonKind_Left]) && + ui_key_match(ui_key_zero(), ui_state->active_box_key[UI_MouseButtonKind_Right])) && ui_key_match(ui_key_zero(), ui_state->hot_box_key) && mouse_is_over) { @@ -2458,8 +2480,8 @@ ui_signal_from_box(UI_Box *box) } else if(ui_key_match(ui_state->hot_box_key, box->key) && !mouse_is_over && - !ui_key_match(ui_state->active_box_key[Side_Min], box->key) && - !ui_key_match(ui_state->active_box_key[Side_Max], box->key)) + !ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key) && + !ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], box->key)) { ui_state->hot_box_key = ui_key_zero(); } @@ -2467,48 +2489,48 @@ ui_signal_from_box(UI_Box *box) // rjf: active management (left click) if(!disabled && ui_key_match(ui_state->hot_box_key, box->key) && - ui_key_match(ui_state->active_box_key[Side_Min], ui_key_zero()) && + ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) && left_press != 0) { os_eat_event(ui_state->events, left_press); result.pressed = 1; - ui_state->active_box_key[Side_Min] = box->key; + ui_state->active_box_key[UI_MouseButtonKind_Left] = box->key; } else if(!disabled && - ui_key_match(ui_state->active_box_key[Side_Min], box->key) && + ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key) && left_release != 0) { os_eat_event(ui_state->events, left_release); result.released = 1; result.clicked = mouse_is_over; ui_state->hot_box_key = mouse_is_over ? box->key : ui_key_zero(); - ui_state->active_box_key[Side_Min] = ui_key_zero(); + ui_state->active_box_key[UI_MouseButtonKind_Left] = ui_key_zero(); } // rjf: active management (right click) if(!disabled && ui_key_match(ui_state->hot_box_key, box->key) && - ui_key_match(ui_state->active_box_key[Side_Max], ui_key_zero()) && + ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], ui_key_zero()) && right_press != 0) { os_eat_event(ui_state->events, right_press); // NOTE(rjf): Add this in if it ever needs to exist: // result.right_pressed = 1; - ui_state->active_box_key[Side_Max] = box->key; + ui_state->active_box_key[UI_MouseButtonKind_Right] = box->key; } else if(!disabled && - ui_key_match(ui_state->active_box_key[Side_Max], box->key) && + ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], box->key) && right_release != 0) { os_eat_event(ui_state->events, right_release); // NOTE(rjf): Add this in if it ever needs to exist: // result.right_released = 1; result.right_clicked = mouse_is_over; - ui_state->active_box_key[Side_Max] = ui_key_zero(); + ui_state->active_box_key[UI_MouseButtonKind_Right] = ui_key_zero(); } // rjf: dragging - if(ui_key_match(ui_state->active_box_key[Side_Min], box->key)) + if(ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key)) { result.dragging = 1; if(result.pressed) @@ -2700,8 +2722,8 @@ ui_signal_from_box(UI_Box *box) //- rjf: set hovering status result.hovering = mouse_is_over && ((ui_key_match(ui_state->hot_box_key, ui_key_zero()) || ui_key_match(ui_state->hot_box_key, box->key)) && - (ui_key_match(ui_state->active_box_key[Side_Min], ui_key_zero()) || - ui_key_match(ui_state->active_box_key[Side_Min], box->key))); + (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) || + ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key))); result.mouse_over = mouse_is_over; //- rjf: clicking in default nav -> set navigation state to this box diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index 1d4663a1..52699667 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -31,6 +31,18 @@ struct UI_IconInfo String8 icon_kind_text_map[UI_IconKind_COUNT]; }; +//////////////////////////////// +//~ rjf: Mouse Button Kinds + +typedef enum UI_MouseButtonKind +{ + UI_MouseButtonKind_Left, + UI_MouseButtonKind_Middle, + UI_MouseButtonKind_Right, + UI_MouseButtonKind_COUNT +} +UI_MouseButtonKind; + //////////////////////////////// //~ rjf: Focus Types @@ -415,10 +427,10 @@ struct UI_State //- rjf: user interaction state UI_Key hot_box_key; - UI_Key active_box_key[Side_COUNT]; + UI_Key active_box_key[UI_MouseButtonKind_COUNT]; UI_Key clipboard_copy_key; - F32 time_since_last_click[Side_COUNT]; - UI_Key last_click_key[Side_COUNT]; + F32 time_since_last_click[UI_MouseButtonKind_COUNT]; + UI_Key last_click_key[UI_MouseButtonKind_COUNT]; Vec2F32 drag_start_mouse; Arena *drag_state_arena; String8 drag_state_data; @@ -551,7 +563,7 @@ internal D_FancyRunList ui_string_hover_runs(Arena *arena); //- rjf: interaction keys internal UI_Key ui_hot_key(void); -internal UI_Key ui_active_key(Side side); +internal UI_Key ui_active_key(UI_MouseButtonKind button_kind); //- rjf: controls over interaction internal void ui_kill_action(void); From c637ad6ede46aef2ef55ddbfecbed751ac3e67c9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 Feb 2024 16:46:57 -0800 Subject: [PATCH 007/275] rewrite ui box -> signal path for less lossy event processing & correctness; also extend to use all 3 mouse buttons. eliminate ui signal bitfields, just use flags & helper macros everywhere. --- src/df/gfx/df_gfx.c | 275 +++++++++++++-------------- src/df/gfx/df_view_rule_hooks.c | 16 +- src/df/gfx/df_views.c | 212 ++++++++++----------- src/os/gfx/win32/os_gfx_win32.c | 4 + src/ui/ui_basic_widgets.c | 30 +-- src/ui/ui_core.c | 324 +++++++++++++++++++++++++++++++- src/ui/ui_core.h | 79 ++++++-- 7 files changed, 655 insertions(+), 285 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 5adc9838..e629835e 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -2992,7 +2992,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D case DF_EntityKind_Module: { DF_Entity *bin_file = df_binary_file_from_module(entity); - if(df_icon_buttonf(DF_IconKind_Module, 0, "Inspect Binary File Memory").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Module, 0, "Inspect Binary File Memory"))) { DF_CmdParams params = df_cmd_params_from_panel(ws, panel); params.entity = df_handle_from_entity(bin_file); @@ -3000,7 +3000,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PendingEntity)); ui_ctx_menu_close(); } - if(df_icon_buttonf(DF_IconKind_Module, 0, "View Binary File Disassembly").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Module, 0, "View Binary File Disassembly"))) { DF_CmdParams params = df_cmd_params_from_panel(ws, panel); params.entity = df_handle_from_entity(bin_file); @@ -3011,7 +3011,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D }break; case DF_EntityKind_Process: { - if(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Open Process Log").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Open Process Log"))) { DF_Entity *log = df_log_from_entity(entity); DF_CmdParams params = df_cmd_params_from_panel(ws, panel); @@ -3023,7 +3023,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D }break; case DF_EntityKind_Thread: { - if(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Open Thread Log").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Open Thread Log"))) { DF_Entity *log = df_log_from_entity(entity); DF_CmdParams params = df_cmd_params_from_panel(ws, panel); @@ -3047,7 +3047,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D //- rjf: toggles for(U64 idx = 0; idx < ArrayCount(DEV_toggle_table); idx += 1) { - if(df_icon_button(*DEV_toggle_table[idx].value_ptr ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, DEV_toggle_table[idx].name).clicked) + if(ui_clicked(df_icon_button(*DEV_toggle_table[idx].value_ptr ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, DEV_toggle_table[idx].name))) { *DEV_toggle_table[idx].value_ptr ^= 1; } @@ -3194,7 +3194,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(op_flags & DF_EntityOpFlag_Rename) { UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, entity->name, "%S###entity_name_edit_%p", df_g_entity_kind_name_label_table[entity->kind], entity); - if(sig.commit) + if(ui_committed(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3210,7 +3210,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { DF_Entity *condition = df_entity_child_from_kind(entity, DF_EntityKind_Condition); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border|DF_LineEditFlag_CodeContents, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, condition->name, "Condition###entity_cond_edit_%p", entity); - if(sig.commit) + if(ui_committed(sig)) { String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); if(new_string.size != 0) @@ -3239,7 +3239,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { DF_Entity *exe = df_entity_child_from_kind(entity, DF_EntityKind_Executable); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, exe->name, "Executable###entity_exe_edit_%p", entity); - if(sig.commit) + if(ui_committed(sig)) { String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); if(new_string.size != 0) @@ -3268,7 +3268,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { DF_Entity *args = df_entity_child_from_kind(entity, DF_EntityKind_Arguments); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, args->name, "Arguments###entity_args_edit_%p", entity); - if(sig.commit) + if(ui_committed(sig)) { String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); if(new_string.size != 0) @@ -3293,20 +3293,20 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } // rjf: copy name - if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Name").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Name"))) { os_set_clipboard_text(display_name); ui_ctx_menu_close(); } // rjf: is command line only? -> make permanent - if(entity->cfg_src == DF_CfgSrc_CommandLine && df_icon_buttonf(DF_IconKind_Save, 0, "Save To Profile").clicked) + if(entity->cfg_src == DF_CfgSrc_CommandLine && ui_clicked(df_icon_buttonf(DF_IconKind_Save, 0, "Save To Profile"))) { df_entity_equip_cfg_src(entity, DF_CfgSrc_Profile); } // rjf: duplicate - if(op_flags & DF_EntityOpFlag_Duplicate && df_icon_buttonf(DF_IconKind_XSplit, 0, "Duplicate").clicked) + if(op_flags & DF_EntityOpFlag_Duplicate && ui_clicked(df_icon_buttonf(DF_IconKind_XSplit, 0, "Duplicate"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3316,7 +3316,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } // rjf: edit - if(op_flags & DF_EntityOpFlag_Edit && df_icon_buttonf(DF_IconKind_Pencil, 0, "Edit").clicked) + if(op_flags & DF_EntityOpFlag_Edit && ui_clicked(df_icon_buttonf(DF_IconKind_Pencil, 0, "Edit"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3326,7 +3326,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } // rjf: deletion - if(op_flags & DF_EntityOpFlag_Delete && df_icon_buttonf(DF_IconKind_Trash, 0, "Delete").clicked) + if(op_flags & DF_EntityOpFlag_Delete && ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "Delete"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3339,14 +3339,14 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(op_flags & DF_EntityOpFlag_Enable) { B32 is_enabled = entity->b32; - if(!is_enabled && df_icon_buttonf(DF_IconKind_CheckHollow, 0, "Enable###enabler").clicked) + if(!is_enabled && ui_clicked(df_icon_buttonf(DF_IconKind_CheckHollow, 0, "Enable###enabler"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EnableEntity)); } - if(is_enabled && df_icon_buttonf(DF_IconKind_CheckFilled, 0, "Disable###enabler").clicked) + if(is_enabled && ui_clicked(df_icon_buttonf(DF_IconKind_CheckFilled, 0, "Disable###enabler"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3364,14 +3364,14 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D color.y *= 0.7f; color.z *= 0.7f; ui_set_next_background_color(color); - if(is_frozen && df_icon_buttonf(DF_IconKind_Locked, 0, "Thaw###freeze_thaw").clicked) + if(is_frozen && ui_clicked(df_icon_buttonf(DF_IconKind_Locked, 0, "Thaw###freeze_thaw"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ThawEntity)); } - if(!is_frozen && df_icon_buttonf(DF_IconKind_Unlocked, 0, "Freeze###freeze_thaw").clicked) + if(!is_frozen && ui_clicked(df_icon_buttonf(DF_IconKind_Unlocked, 0, "Freeze###freeze_thaw"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3384,7 +3384,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(entity->flags & DF_EntityFlag_HasTextPoint) { DF_Entity *file_ancestor = df_entity_ancestor_from_kind(entity, DF_EntityKind_File); - if(!df_entity_is_nil(file_ancestor) && df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location").clicked) + if(!df_entity_is_nil(file_ancestor) && ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location"))) { Temp scratch = scratch_begin(&arena, 1); DF_CmdParams params = df_cmd_params_from_window(ws); @@ -3403,7 +3403,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { DF_CtrlCtx ctrl_ctx = df_ctrl_ctx(); DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - if(entity->vaddr != 0 && !df_entity_is_nil(thread) && df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location").clicked) + if(entity->vaddr != 0 && !df_entity_is_nil(thread) && ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process)); @@ -3425,7 +3425,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D case DF_EntityKind_File: { if(entity->flags & DF_EntityFlag_IsFolder && - df_icon_buttonf(DF_IconKind_FolderOpenOutline, 0, "Open File In Folder").clicked) + ui_clicked(df_icon_buttonf(DF_IconKind_FolderOpenOutline, 0, "Open File In Folder"))) { String8 path = df_full_path_from_entity(scratch.arena, entity); String8 path_w_slash = push_str8f(scratch.arena, "%S/", path); @@ -3445,7 +3445,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } if(!(entity->flags & DF_EntityFlag_IsFolder) && !(entity->flags & DF_EntityFlag_IsMissing) && - df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To File").clicked) + ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To File"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.file_path = df_full_path_from_entity(scratch.arena, entity); @@ -3468,7 +3468,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { df_icon_buttonf(DF_IconKind_Thread, 0, "[Selected]###select_entity"); } - else if(df_icon_buttonf(DF_IconKind_Thread, 0, "Select###select_entity").clicked) + else if(ui_clicked(df_icon_buttonf(DF_IconKind_Thread, 0, "Select###select_entity"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3478,7 +3478,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } } - if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy ID").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy ID"))) { U32 ctrl_id = entity->ctrl_id; String8 string = push_str8f(scratch.arena, "%i", (int)ctrl_id); @@ -3488,7 +3488,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(entity->kind == DF_EntityKind_Thread) { - if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Instruction Pointer Address").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Instruction Pointer Address"))) { U64 rip = df_query_cached_rip_from_thread(entity); String8 string = push_str8f(scratch.arena, "0x%I64x", rip); @@ -3499,7 +3499,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(entity->kind == DF_EntityKind_Thread) { - if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Call Stack").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Call Stack"))) { DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process); CTRL_Unwind unwind = df_query_cached_unwind_from_thread(entity); @@ -3531,7 +3531,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(entity->kind == DF_EntityKind_Thread) { - if(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Find").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Find"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3545,25 +3545,25 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D case DF_EntityKind_Module: { UI_Signal copy_full_path_sig = df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Full Path"); - if(copy_full_path_sig.clicked) + if(ui_clicked(copy_full_path_sig)) { String8 string = entity->name; os_set_clipboard_text(string); ui_ctx_menu_close(); } - if(copy_full_path_sig.hovering) UI_Tooltip + if(ui_hovering(copy_full_path_sig)) UI_Tooltip { String8 string = entity->name; ui_label(string); } - if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Base Address").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Base Address"))) { Rng1U64 vaddr_rng = entity->vaddr_rng; String8 string = push_str8f(scratch.arena, "0x%I64x", vaddr_rng.min); os_set_clipboard_text(string); ui_ctx_menu_close(); } - if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Address Range Size").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Address Range Size"))) { Rng1U64 vaddr_rng = entity->vaddr_rng; String8 string = push_str8f(scratch.arena, "0x%I64x", dim_1u64(vaddr_rng)); @@ -3574,7 +3574,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D case DF_EntityKind_Target: { - if(df_icon_buttonf(DF_IconKind_Play, 0, "Launch And Run").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Launch And Run"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3582,7 +3582,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); ui_ctx_menu_close(); } - if(df_icon_buttonf(DF_IconKind_PlayStepForward, 0, "Launch And Initialize").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_PlayStepForward, 0, "Launch And Initialize"))) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -3627,7 +3627,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_BoxFlag_DrawActiveEffects, "###color_preset_%i", (int)preset_idx); UI_Signal sig = ui_signal_from_box(box); - if(sig.clicked) + if(ui_clicked(sig)) { Vec3F32 hsv = hsv_from_rgb(v3f32(presets[preset_idx].x, presets[preset_idx].y, presets[preset_idx].z)); Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, 1); @@ -3653,7 +3653,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_Row UI_Padding(ui_pct(1, 0)) UI_PrefWidth(ui_em(12.f, 1.f)) UI_CornerRadius(8.f) { - if(df_icon_buttonf(DF_IconKind_Trash, 0, "Remove Color").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "Remove Color###color_toggle"))) { entity->flags &= ~DF_EntityFlag_HasColor; } @@ -3661,7 +3661,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D ui_spacer(ui_em(1.5f, 1.f)); } - if(!entity_has_color && df_icon_buttonf(DF_IconKind_Palette, 0, "Equip With Color").clicked) + if(!entity_has_color && ui_clicked(df_icon_buttonf(DF_IconKind_Palette, 0, "Apply Color###color_toggle"))) { df_entity_equip_color_rgba(entity, v4f32(1, 1, 1, 1)); } @@ -3701,7 +3701,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } // rjf: copy name - if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Name").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Name"))) { os_set_clipboard_text(display_name); ui_ctx_menu_close(); @@ -3712,12 +3712,12 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { UI_Signal copy_full_path_sig = df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Full Path"); String8 full_path = df_full_path_from_entity(scratch.arena, entity); - if(copy_full_path_sig.clicked) + if(ui_clicked(copy_full_path_sig)) { os_set_clipboard_text(full_path); ui_ctx_menu_close(); } - if(copy_full_path_sig.hovering) UI_Tooltip + if(ui_hovering(copy_full_path_sig)) UI_Tooltip { ui_label(full_path); } @@ -3726,7 +3726,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D // rjf: filter controls if(view->spec->info.flags & DF_ViewSpecFlag_CanFilter) { - if(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Filter)).clicked) + if(ui_clicked(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Filter)))) { DF_CmdParams params = df_cmd_params_from_window(ws); { @@ -3736,7 +3736,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Filter)); ui_ctx_menu_close(); } - if(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClearFilter)).clicked) + if(ui_clicked(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClearFilter)))) { DF_CmdParams params = df_cmd_params_from_window(ws); { @@ -3749,7 +3749,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } // rjf: close tab - if(df_icon_buttonf(DF_IconKind_X, 0, "Close Tab").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "Close Tab"))) { DF_CmdParams params = df_cmd_params_from_window(ws); { @@ -3793,7 +3793,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { UI_CornerRadius00(ui_top_font_size()*0.25f) UI_CornerRadius01(ui_top_font_size()*0.25f) - if(ui_buttonf("Cancel").clicked || os_key_press(ui_events(), ui_window(), 0, OS_Key_Esc)) + if(ui_clicked(ui_buttonf("Cancel")) || os_key_press(ui_events(), ui_window(), 0, OS_Key_Esc)) { DF_CmdParams p = df_cmd_params_zero(); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmCancel)); @@ -3803,7 +3803,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_BackgroundColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBackground)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_ActionText)) UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBorder)) - if(ui_buttonf("OK").clicked || os_key_press(ui_events(), ui_window(), 0, OS_Key_Return)) + if(ui_clicked(ui_buttonf("OK")) || os_key_press(ui_events(), ui_window(), 0, OS_Key_Return)) { DF_CmdParams p = df_cmd_params_zero(); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmAccept)); @@ -3989,7 +3989,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D ui_label(item->kind_string); } UI_Signal item_sig = ui_signal_from_box(item_box); - if(item_sig.clicked) + if(ui_clicked(item_sig)) { UI_NavAction autocomp_action = {UI_NavActionFlag_ReplaceAndCommit, {0}, (UI_NavDeltaUnit)0, push_str8_copy(ui_build_arena(), item->string)}; ui_nav_action_list_push(ui_build_arena(), ui_nav_actions(), autocomp_action); @@ -4185,7 +4185,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_Signal sig = {0}; UI_TextColor(color) sig = df_icon_buttonf(DF_IconKind_Target, 0, "%S##%p", target_name, target); - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(target); @@ -4254,11 +4254,11 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_TextAlignment(UI_TextAlign_Center) { UI_Signal url_sig = ui_buttonf("github.com/EpicGames/raddebugger"); - if(url_sig.hovering) UI_Tooltip + if(ui_hovering(url_sig)) UI_Tooltip { ui_labelf("Copy To Clipboard"); } - if(url_sig.clicked) + if(ui_clicked(url_sig)) { os_set_clipboard_text(str8_lit("https://github.com/EpicGames/raddebugger")); } @@ -4346,12 +4346,12 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_Signal sig = df_menu_bar_button(items[idx].name); if(menu_open) { - if((sig.hovering && !ui_ctx_menu_is_open(items[idx].menu_key)) || (open_menu_idx_prime == idx && open_menu_idx_prime != open_menu_idx)) + if((ui_hovering(sig) && !ui_ctx_menu_is_open(items[idx].menu_key)) || (open_menu_idx_prime == idx && open_menu_idx_prime != open_menu_idx)) { ui_ctx_menu_open(items[idx].menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); } } - else if(sig.pressed || alt_fastpath_key) + else if(ui_pressed(sig) || alt_fastpath_key) { if(ui_ctx_menu_is_open(items[idx].menu_key)) { @@ -4382,7 +4382,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_Key key = ui_key_from_stringf(ui_key_zero(), "task_%p", task); UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, key); UI_Signal sig = ui_signal_from_box(box); - if(sig.hovering) UI_Tooltip + if(ui_hovering(sig)) UI_Tooltip { ui_label(raddbg_path); } @@ -4412,7 +4412,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D ui_label(str8_skip_last_slash(user_path)); } UI_Signal user_sig = ui_signal_from_box(user_box); - if(user_sig.clicked) + if(ui_clicked(user_sig)) { DF_CmdParams p = df_cmd_params_from_window(ws); p.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenUser); @@ -4442,7 +4442,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D ui_label(str8_skip_last_slash(prof_path)); } UI_Signal prof_sig = ui_signal_from_box(prof_box); - if(prof_sig.clicked) + if(ui_clicked(prof_sig)) { DF_CmdParams p = df_cmd_params_from_window(ws); p.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenProfile); @@ -4470,14 +4470,14 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(can_play || !have_targets) UI_TextAlignment(UI_TextAlign_Center) UI_Flags((can_play ? 0 : UI_BoxFlag_Disabled)) { UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Play]); - if(sig.hovering && can_play == 0) + if(ui_hovering(sig) && !can_play) { UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) ui_labelf("Disabled: %s", have_targets ? "Targets are currently running" : "No active targets exist"); } - if(sig.hovering && can_play) + if(ui_hovering(sig) && can_play) { UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) @@ -4497,7 +4497,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } } } - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Run)); @@ -4507,7 +4507,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(!can_play && have_targets && !can_send_signal) UI_TextAlignment(UI_TextAlign_Center) { UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Redo]); - if(sig.hovering) + if(ui_hovering(sig)) { UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) @@ -4528,7 +4528,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } } } - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Restart)); @@ -4538,21 +4538,21 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_pause ? 0 : UI_BoxFlag_Disabled) { UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Pause]); - if(sig.hovering && can_pause == 0) + if(ui_hovering(sig) && !can_pause) { UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) ui_labelf("Disabled: Already halted"); } - if(sig.hovering && can_pause) + if(ui_hovering(sig) && can_pause) { UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) ui_labelf("Halt all target processes"); } - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Halt)); @@ -4565,21 +4565,21 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Stop]); } - if(sig.hovering && can_stop == 0) + if(ui_hovering(sig) && !can_stop) { UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) ui_labelf("Disabled: No processes are running"); } - if(sig.hovering && can_stop) + if(ui_hovering(sig) && can_stop) { UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) ui_labelf("Kill all target processes"); } - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Kill)); @@ -4975,7 +4975,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D 0, str8(view->query_buffer, view->query_string_size), str8_lit("###query_text_input")); - if(sig.pressed) + if(ui_pressed(sig)) { ws->query_view_selected = 1; } @@ -5022,7 +5022,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D //- rjf: take fallthrough interaction in query view { UI_Signal sig = ui_signal_from_box(query_container_box); - if(sig.pressed) + if(ui_pressed(sig)) { ws->query_view_selected = 1; } @@ -5221,7 +5221,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D B32 row_is_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row->key); if(row->flags & DF_EvalVizRowFlag_CanExpand) UI_PrefWidth(ui_em(1.5f, 1)) UI_Flags(UI_BoxFlag_DrawSideLeft*(row->depth>0)) - if(ui_expanderf(row_is_expanded, "###%I64x_%I64x_is_expanded", row->key.parent_hash, row->key.child_num).pressed) + if(ui_pressed(ui_expanderf(row_is_expanded, "###%I64x_%I64x_is_expanded", row->key.parent_hash, row->key.child_num))) { df_expand_set_expansion(eval_view->arena, &eval_view->expand_tree_table, row->parent_key, row->key, !row_is_expanded); } @@ -5250,7 +5250,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D DF_LineEditFlag_PreferDisplayString| DF_LineEditFlag_Border, 0, 0, &ws->hover_eval_txt_cursor, &ws->hover_eval_txt_mark, ws->hover_eval_txt_buffer, sizeof(ws->hover_eval_txt_buffer), &ws->hover_eval_txt_size, 0, row->edit_value, "%S###val_%I64x", row->display_value, row_hash); - if(sig.commit) + if(ui_committed(sig)) { String8 commit_string = str8(ws->hover_eval_txt_buffer, ws->hover_eval_txt_size); DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, commit_string); @@ -5285,11 +5285,11 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_CornerRadius11(0) { UI_Signal watch_sig = df_icon_buttonf(DF_IconKind_List, 0, "###watch_hover_eval"); - if(watch_sig.hovering) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) + if(ui_hovering(watch_sig)) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) { ui_labelf("Add the hovered expression to an opened watch view."); } - if(watch_sig.clicked) + if(ui_clicked(watch_sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.string = expr; @@ -5303,7 +5303,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_CornerRadius11(corner_radius) { UI_Signal pin_sig = df_icon_buttonf(DF_IconKind_Pin, 0, "###pin_hover_eval"); - if(pin_sig.hovering) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) + if(ui_hovering(pin_sig)) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) UI_CornerRadius00(0) UI_CornerRadius01(0) UI_CornerRadius10(0) @@ -5311,7 +5311,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { ui_labelf("Pin the hovered expression to this code location."); } - if(pin_sig.clicked) + if(ui_clicked(pin_sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); if(ws->hover_eval_vaddr != 0) @@ -5340,7 +5340,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D //- rjf: interact { UI_Signal hover_eval_sig = ui_signal_from_box(hover_eval_box); - if(hover_eval_sig.mouse_over) + if(ui_mouse_over(hover_eval_sig)) { ws->hover_eval_last_frame_idx = df_frame_index(); } @@ -5395,19 +5395,19 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D ui_set_next_hover_cursor(split_axis == Axis2_X ? OS_Cursor_LeftRight : OS_Cursor_UpDown); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%p_%p", min_child, max_child); UI_Signal sig = ui_signal_from_box(box); - if(sig.double_clicked) + if(ui_double_clicked(sig)) { ui_kill_action(); F32 sum_pct = min_child->size_pct_of_parent_target.v[split_axis] + max_child->size_pct_of_parent_target.v[split_axis]; min_child->size_pct_of_parent_target.v[split_axis] = 0.5f * sum_pct; max_child->size_pct_of_parent_target.v[split_axis] = 0.5f * sum_pct; } - else if(sig.pressed) + else if(ui_pressed(sig)) { Vec2F32 v = {min_child->size_pct_of_parent_target.v[split_axis], max_child->size_pct_of_parent_target.v[split_axis]}; ui_store_drag_struct(&v); } - else if(sig.dragging) + else if(ui_dragging(sig)) { Vec2F32 v = *ui_get_drag_struct(Vec2F32); Vec2F32 mouse_delta = ui_drag_delta(); @@ -5435,7 +5435,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D max_child->size_pct_of_parent.v[split_axis] = max_child->size_pct_of_parent_target.v[split_axis] = max_pct__after; is_changing_panel_boundaries = 1; } - if(sig.released || sig.double_clicked) + if(ui_released(sig) || ui_double_clicked(sig)) { df_panel_notify_mutation(ws, min_child); } @@ -5536,7 +5536,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D 0, str8(view->query_buffer, view->query_string_size), str8_lit("###filter_text_input")); - if(sig.pressed) + if(ui_pressed(sig)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); @@ -5747,7 +5747,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D //- rjf: consume panel fallthrough interaction events // UI_Signal panel_sig = ui_signal_from_box(panel_box); - if(panel_sig.pressed) + if(ui_pressed(panel_sig)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); @@ -5827,7 +5827,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D ui_label(label); } UI_Signal sig = ui_signal_from_box(tab_list_item_box); - if(sig.clicked) + if(ui_clicked(sig)) { next_selected_tab_view = view; DF_CmdParams p = df_cmd_params_from_panel(ws, panel); @@ -5840,7 +5840,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(panel->tab_view_count > 5) UI_PrefWidth(ui_em(2.25f, 1.f)) UI_PrefHeight(ui_px(tab_bar_vheight, 1)) { UI_Signal sig = df_icon_buttonf(DF_IconKind_List, 0, "###tab_list_%p", panel); - if(sig.clicked) + if(ui_clicked(sig)) { if(ui_ctx_menu_is_open(tab_list_ctx_menu_key)) { @@ -5922,7 +5922,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_BackgroundColor(v4f32(0, 0, 0, 0)) UI_CornerRadius00(0) UI_CornerRadius01(0) - if(ui_buttonf("%S###close_view_%p", df_g_icon_kind_text_table[DF_IconKind_X], view).clicked) + if(ui_clicked(ui_buttonf("%S###close_view_%p", df_g_icon_kind_text_table[DF_IconKind_X], view))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); @@ -5932,13 +5932,13 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D // rjf: consume events for tab clicking { UI_Signal sig = ui_signal_from_box(tab_box); - if(sig.pressed) + if(ui_pressed(sig)) { next_selected_tab_view = view; DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } - else if(sig.dragging && !df_drag_is_active() && length_2f32(ui_drag_delta()) > 10.f) + else if(ui_dragging(sig) && !df_drag_is_active() && length_2f32(ui_drag_delta()) > 10.f) { DF_DragDropPayload payload = {0}; { @@ -5948,12 +5948,12 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } df_drag_begin(&payload); } - else if(sig.right_clicked) + else if(ui_right_clicked(sig)) { ui_ctx_menu_open(ws->tab_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0)); ws->tab_ctx_menu_view = df_handle_from_view(view); } - if(sig.released) + if(ui_released(sig)) { df_panel_notify_mutation(ws, panel); } @@ -8504,26 +8504,26 @@ df_cmd_binding_button(DF_CmdSpec *spec) UI_Signal sig = ui_signal_from_box(box); { // rjf: hover => visualize clickability - if(sig.hovering) + if(ui_hovering(sig)) { box->flags |= UI_BoxFlag_DrawBorder; box->flags |= UI_BoxFlag_DrawBackground; } // rjf: click => toggle activity - if(!df_gfx_state->bind_change_active && sig.clicked) + if(!df_gfx_state->bind_change_active && ui_clicked(sig)) { df_gfx_state->bind_change_active = 1; df_gfx_state->bind_change_cmd_spec = spec; df_gfx_state->bind_change_binding = binding; } - else if(df_gfx_state->bind_change_active && sig.clicked) + else if(df_gfx_state->bind_change_active && ui_clicked(sig)) { df_gfx_state->bind_change_active = 0; } // rjf: hover w/ conflicts => show conflicts - if(sig.hovering && has_conflicts) UI_Tooltip + if(ui_hovering(sig) && has_conflicts) UI_Tooltip { ui_labelf("This binding conflicts with others:"); for(DF_CmdSpecNode *n = specs_with_binding.first; n != 0; n = n->next) @@ -8608,7 +8608,7 @@ df_cmd_list_menu_buttons(DF_Window *ws, U64 count, DF_CoreCmdKind *cmds, U32 *fa DF_CmdSpec *spec = df_cmd_spec_from_core_cmd_kind(cmds[idx]); ui_set_next_fastpath_codepoint(fastpath_codepoints[idx]); UI_Signal sig = df_cmd_spec_button(spec); - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.cmd_spec = spec; @@ -8885,7 +8885,7 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam info_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "%S###%p_temp_info", df_g_icon_kind_text_table[DF_IconKind_Info], entity); } UI_Signal info_sig = ui_signal_from_box(info_box); - if(info_sig.hovering) UI_Tooltip + if(ui_hovering(info_sig)) UI_Tooltip { ui_labelf("Specified via command line; not saved in profile."); } @@ -8959,7 +8959,7 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam } // rjf: click => fastpath or dropdown for this entity - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(entity); @@ -8968,7 +8968,7 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam } // rjf: right-click => context menu for this entity - else if(sig.right_clicked) + else if(ui_right_clicked(sig)) { DF_Handle handle = df_handle_from_entity(entity); if(ui_ctx_menu_is_open(ws->entity_ctx_menu_key) && df_handle_match(ws->entity_ctx_menu_entity, handle)) @@ -8983,7 +8983,7 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam } // rjf: drag+drop - else if(sig.dragging && !contains_2f32(box->rect, ui_mouse())) + else if(ui_dragging(sig) && !contains_2f32(box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; payload.key = box->key; @@ -9025,7 +9025,7 @@ df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt point) } // rjf: click => find code location - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.file_path = full_path; @@ -9036,7 +9036,7 @@ df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt point) } // rjf: drag+drop - else if(sig.dragging && !contains_2f32(box->rect, ui_mouse())) + else if(ui_dragging(sig) && !contains_2f32(box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; payload.key = box->key; @@ -9046,7 +9046,7 @@ df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt point) } // rjf: hover => show full path - else if(sig.hovering && !sig.dragging) UI_Tooltip + else if(ui_hovering(sig) && !ui_dragging(sig)) UI_Tooltip { ui_labelf("%S:%I64d:%I64d", full_path, point.line, point.column); } @@ -9245,28 +9245,28 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ DF_TextLineDasm2SrcInfoList *line_dasm2src_list = ¶ms->line_dasm2src[line_idx]; //- rjf: copy selection - if(!txt_pt_match(*cursor, *mark) && df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Copy)).clicked) + if(!txt_pt_match(*cursor, *mark) && ui_clicked(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Copy)))) { result.copy_range = txt_rng(*cursor, *mark); ui_ctx_menu_close(); } //- rjf: watch selection - if(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpressionAtCursor)).clicked) + if(ui_clicked(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpressionAtCursor)))) { result.toggle_cursor_watch = 1; ui_ctx_menu_close(); } //- rjf: set-next-statement - if(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetNextStatement)).clicked) + if(ui_clicked(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetNextStatement)))) { result.set_next_statement_line_num = line_num; ui_ctx_menu_close(); } //- rjf: run-to-line - if(df_icon_buttonf(DF_IconKind_Play, 0, "Run To Line").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Run To Line"))) { result.run_to_line_num = line_num; ui_ctx_menu_close(); @@ -9274,9 +9274,9 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ //- rjf: breakpoint placing if((params->line_bps[line_idx].count == 0 && - df_icon_buttonf(DF_IconKind_CircleFilled, 0, "Place Breakpoint").clicked) || + ui_clicked(df_icon_buttonf(DF_IconKind_CircleFilled, 0, "Place Breakpoint"))) || (params->line_bps[line_idx].count != 0 && - df_icon_buttonf(DF_IconKind_CircleFilled, 0, "Remove Breakpoint").clicked)) + ui_clicked(df_icon_buttonf(DF_IconKind_CircleFilled, 0, "Remove Breakpoint")))) { result.clicked_margin_line_num = line_num; ui_ctx_menu_close(); @@ -9284,7 +9284,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ //- rjf: go from src -> disasm if(line_src2dasm_list->first != 0 && - df_icon_buttonf(DF_IconKind_Find, 0, "Go To Disassembly").clicked) + ui_clicked(df_icon_buttonf(DF_IconKind_Find, 0, "Go To Disassembly"))) { result.goto_disasm_line_num = line_num; ui_ctx_menu_close(); @@ -9292,7 +9292,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ //- rjf: go from disasm -> src if(line_dasm2src_list->first != 0 && - df_icon_buttonf(DF_IconKind_Find, 0, "Go To Source").clicked) + ui_clicked(df_icon_buttonf(DF_IconKind_Find, 0, "Go To Source"))) { result.goto_src_line_num = line_num; ui_ctx_menu_close(); @@ -9421,13 +9421,13 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: hover tooltips - if(thread_sig.hovering) + if(ui_hovering(thread_sig)) { df_entity_tooltips(thread); } // rjf: ip right-click menu - if(thread_sig.right_clicked) + if(ui_right_clicked(thread_sig)) { DF_Handle handle = df_handle_from_entity(thread); if(ui_ctx_menu_is_open(ws->entity_ctx_menu_key) && df_handle_match(ws->entity_ctx_menu_entity, handle)) @@ -9442,7 +9442,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: double click => select - if(thread_sig.double_clicked) + if(ui_double_clicked(thread_sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(thread); @@ -9451,7 +9451,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: drag start - if(thread_sig.dragging && !contains_2f32(thread_box->rect, ui_mouse())) + if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; payload.key = thread_box->key; @@ -9511,13 +9511,13 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_Signal bp_sig = ui_signal_from_box(bp_box); // rjf: bp hovering - if(bp_sig.hovering) + if(ui_hovering(bp_sig)) { df_entity_tooltips(bp); } // rjf: click => remove breakpoint - if(bp_sig.clicked) + if(ui_clicked(bp_sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(bp); @@ -9526,7 +9526,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: drag start - if(bp_sig.dragging && !contains_2f32(bp_box->rect, ui_mouse())) + if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; payload.entity = df_handle_from_entity(bp); @@ -9534,7 +9534,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: bp right-click menu - if(bp_sig.right_clicked) + if(ui_right_clicked(bp_sig)) { DF_Handle handle = df_handle_from_entity(bp); if(ui_ctx_menu_is_open(ws->entity_ctx_menu_key) && df_handle_match(ws->entity_ctx_menu_entity, handle)) @@ -9578,13 +9578,13 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_Signal pin_sig = ui_signal_from_box(pin_box); // rjf: watch hovering - if(pin_sig.hovering) + if(ui_hovering(pin_sig)) { df_entity_tooltips(pin); } // rjf: click => remove pin - if(pin_sig.clicked) + if(ui_clicked(pin_sig)) { DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(pin); @@ -9593,7 +9593,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: drag start - if(pin_sig.dragging && !contains_2f32(pin_box->rect, ui_mouse())) + if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; payload.entity = df_handle_from_entity(pin); @@ -9601,7 +9601,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: watch right-click menu - if(pin_sig.right_clicked) + if(ui_right_clicked(pin_sig)) { DF_Handle handle = df_handle_from_entity(pin); if(ui_ctx_menu_is_open(ws->entity_ctx_menu_key) && df_handle_match(ws->entity_ctx_menu_entity, handle)) @@ -9617,7 +9617,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } } UI_Signal line_margin_sig = ui_signal_from_box(line_margin_box); - if(line_margin_sig.clicked) + if(ui_clicked(line_margin_sig)) { result.clicked_margin_line_num = line_num; } @@ -9713,13 +9713,13 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_Flags(UI_BoxFlag_DisableTextTrunc) { UI_Signal sig = ui_buttonf("%S###pin_nub", df_g_icon_kind_text_table[DF_IconKind_Pin]); - if(sig.dragging && !contains_2f32(sig.box->rect, ui_mouse())) + if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; payload.entity = df_handle_from_entity(pin); df_drag_begin(&payload); } - if(sig.clicked || sig.right_clicked) + if(ui_clicked(sig) || ui_right_clicked(sig)) { ui_ctx_menu_open(ws->entity_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); ws->entity_ctx_menu_entity = df_handle_from_entity(pin); @@ -9790,7 +9790,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ DF_Entity *line_drag_entity = &df_g_nil_entity; { //- rjf: clicking/dragging over the text container - if(!ctrlified && text_container_sig.dragging) + if(!ctrlified && ui_dragging(text_container_sig)) { if(mouse_pt.line == 0) { @@ -9804,7 +9804,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ mouse_pt.line = params->line_num_range.max + 2; } } - if(text_container_sig.pressed) + if(ui_pressed(text_container_sig)) { *mark = mouse_pt; } @@ -9813,7 +9813,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } //- rjf: right-click => active context menu for line - if(text_container_sig.right_clicked) + if(ui_right_clicked(text_container_sig)) { S64 line_idx = mouse_pt.line-params->line_num_range.min; if(0 <= line_idx && line_idx < dim_1s64(params->line_num_range)) @@ -9827,7 +9827,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } //- rjf: hovering text container & ctrl+scroll -> change font size - if(text_container_sig.hovering) + if(ui_hovering(text_container_sig)) { for(OS_Event *event = ui_events()->first; event != 0; event = event->next) { @@ -9879,7 +9879,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ ////////////////////////////// //- rjf: mouse -> expression range info // - if(text_container_sig.hovering && contains_1s64(params->line_num_range, mouse_pt.line)) ProfScope("mouse -> expression range") + if(ui_hovering(text_container_sig) && contains_1s64(params->line_num_range, mouse_pt.line)) ProfScope("mouse -> expression range") { TxtRng selected_rng = txt_rng(*cursor, *mark); if(!txt_pt_match(*cursor, *mark) && cursor->line == mark->line && @@ -9914,7 +9914,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ ////////////////////////////// //- rjf: mouse -> set global frontend hovered line info // - if(text_container_sig.hovering && contains_1s64(params->line_num_range, mouse_pt.line)) + if(ui_hovering(text_container_sig) && contains_1s64(params->line_num_range, mouse_pt.line)) { U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; if(params->line_src2dasm[line_slice_idx].first != 0 && @@ -10615,7 +10615,7 @@ df_help_label(String8 string) UI_Parent(box) { UI_PrefWidth(ui_pct(1, 0)) ui_label(string); - if(sig.hovering) UI_PrefWidth(ui_em(2.25f, 1)) + if(ui_hovering(sig)) UI_PrefWidth(ui_em(2.25f, 1)) { result = 1; ui_set_next_font(ui_icon_font()); @@ -10842,7 +10842,7 @@ df_line_edit(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, Tx UI_Focus(UI_FocusKind_Off) { UI_Signal expander_sig = ui_expanderf(*expanded_out, "expander"); - if(expander_sig.pressed) + if(ui_pressed(expander_sig)) { *expanded_out ^= 1; } @@ -10896,13 +10896,16 @@ df_line_edit(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, Tx //- rjf: get signal UI_Signal sig = ui_signal_from_box(box); - sig.commit = sig.commit || commit; + if(commit) + { + sig.f |= UI_SignalFlag_Commit; + } //- rjf: do start/end editing interaction B32 focus_started = 0; if(!is_focus_active) { - B32 start_editing_via_sig = (sig.double_clicked || sig.keyboard_clicked); + B32 start_editing_via_sig = (ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed); B32 start_editing_via_typing = 0; if(is_focus_hot) { @@ -10933,10 +10936,10 @@ df_line_edit(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, Tx focus_started = 1; } } - else if(is_focus_active && sig.keyboard_clicked) + else if(is_focus_active && sig.f&UI_SignalFlag_KeyboardPressed) { ui_set_auto_focus_active_key(ui_key_zero()); - sig.commit = 1; + sig.f |= UI_SignalFlag_Commit; } //- rjf: take navigation actions for editing @@ -11081,15 +11084,15 @@ df_line_edit(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, Tx } //- rjf: click+drag - if(is_focus_active && sig.dragging) + if(is_focus_active && ui_dragging(sig)) { - if(sig.pressed) + if(ui_pressed(sig)) { *mark = mouse_pt; } *cursor = mouse_pt; } - if(!is_focus_active && is_focus_active_disabled && sig.pressed) + if(!is_focus_active && is_focus_active_disabled && ui_pressed(sig)) { *cursor = *mark = mouse_pt; } diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 3e2568b4..87826f35 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -546,7 +546,7 @@ DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba) //- rjf: hover color box -> show components UI_Signal sig = ui_signal_from_box(color_box); - if(sig.hovering) + if(ui_hovering(sig)) { ui_do_color_tooltip_hsva(hsva); } @@ -587,12 +587,12 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) UI_PrefWidth(ui_px(dim.y, 1.f)) { UI_Signal sv_sig = ui_sat_val_pickerf(hsva.x, &hsva.y, &hsva.z, "sat_val_picker"); - commit = commit || sv_sig.released; + commit = commit || ui_released(sv_sig); } UI_PrefWidth(ui_em(3.f, 1.f)) { UI_Signal h_sig = ui_hue_pickerf(&hsva.x, hsva.y, hsva.z, "hue_picker"); - commit = commit || h_sig.released; + commit = commit || ui_released(h_sig); } UI_PrefWidth(ui_children_sum(1)) UI_Column UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) { @@ -916,7 +916,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) draw_data->texture = texture; draw_data->src = r2f32(v2f32(0, 0), v2f32((F32)topology_info.width, (F32)topology_info.height)); draw_data->loaded_t = state->loaded_t; - draw_data->hovered = sig.hovering; + draw_data->hovered = ui_hovering(sig); draw_data->mouse_px = mouse_bitmap_px_off; draw_data->ui_per_bmp_px = ui_per_bmp_px; ui_box_equip_custom_draw(box, df_view_rule_hooks__bitmap_box_draw, draw_data); @@ -933,11 +933,11 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) df_gfx_request_frame(); } } - if(sig.hovering && r_handle_match(texture, r_handle_zero())) UI_Tooltip + if(ui_hovering(sig) && r_handle_match(texture, r_handle_zero())) UI_Tooltip { ui_labelf("Texture not loaded."); } - if(sig.hovering && !r_handle_match(texture, r_handle_zero())) + if(ui_hovering(sig) && !r_handle_match(texture, r_handle_zero())) { if(dim.y > (F32)topology_info.height) { @@ -1169,9 +1169,9 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo) { UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, "geo_box"); UI_Signal sig = ui_signal_from_box(box); - if(sig.dragging) + if(ui_dragging(sig)) { - if(sig.pressed) + if(ui_pressed(sig)) { Vec2F32 data = v2f32(state->yaw_target, state->pitch_target); ui_store_drag_struct(&data); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 0a0a3fd9..12778ccd 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1228,7 +1228,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW } } UI_Signal sig = ui_signal_from_box(vector); - if(sig.pressed) + if(ui_pressed(sig)) { edit_commit = edit_commit || (!row_selected && ewv->input_editing); next_cursor_tbl = v2s64(DF_EvalWatchViewColumnKind_Expr, (semantic_idx+1)); @@ -1340,8 +1340,8 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW row->expr, "###row_%I64x", row_hash); } - edit_commit = edit_commit || sig.commit; - if(sig.hovering && is_inherited) UI_Tooltip + edit_commit = edit_commit || ui_committed(sig); + if(is_inherited && ui_hovering(sig)) UI_Tooltip { String8List inheritance_chain_type_names = {0}; for(TG_KeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next) @@ -1360,13 +1360,13 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1.f, df_rgba_from_theme_color(DF_ThemeColor_CodeType), inheritance_type); } } - if(sig.hovering && DEV_eval_watch_key_tooltips) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Code)) + if(DEV_eval_watch_key_tooltips && ui_hovering(sig)) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Code)) { ui_labelf("Parent Key: %I64x, %I64x", row->parent_key.parent_hash, row->parent_key.child_num); ui_labelf("Hover Key: %I64x, %I64x", row->key.parent_hash, row->key.child_num); ui_labelf("Cursor Key: %I64x, %I64x", ewv->cursor.key.parent_hash, ewv->cursor.key.child_num); } - if(sig.hovering && row->depth == 0 && DEV_eval_compiler_tooltips) UI_Tooltip + if(DEV_eval_compiler_tooltips && row->depth == 0 && ui_hovering(sig)) UI_Tooltip { Temp scratch = scratch_begin(0, 0); String8 string = row->expr; @@ -1415,7 +1415,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW } // rjf: press -> commit if editing & select - if(sig.pressed) + if(ui_pressed(sig)) { edit_commit = edit_commit || (!cell_selected && ewv->input_editing); next_cursor_tbl = v2s64(DF_EvalWatchViewColumnKind_Expr, (semantic_idx+1)); @@ -1429,7 +1429,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW } // rjf: double-click -> start editing - if(sig.double_clicked && !ewv->input_editing && can_edit_expr) + if(ui_double_clicked(sig) && !ewv->input_editing && can_edit_expr) { ui_kill_action(); ewv->input_editing = 1; @@ -1515,18 +1515,18 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW if(value_is_simple) { sig = df_line_editf(DF_LineEditFlag_CodeContents|DF_LineEditFlag_NoBackground, 0, 0, &ewv->input_cursor, &ewv->input_mark, ewv->input_buffer, sizeof(ewv->input_buffer), &ewv->input_size, 0, row->display_value, "%S###val_%I64x", row->display_value, row_hash); - edit_commit = (edit_commit || sig.commit); + edit_commit = (edit_commit || ui_committed(sig)); } } // rjf: bad & hovering -> display - if(row_is_bad && sig.hovering) UI_Tooltip + if(row_is_bad && ui_hovering(sig)) UI_Tooltip { UI_PrefWidth(ui_children_sum(1)) df_error_label(str8_lit("Could not read process memory successfully.")); } // rjf: press -> focus & commit if editing & not selected - if(sig.pressed) + if(ui_pressed(sig)) { pressed = 1; edit_commit = edit_commit || (ewv->input_editing && !cell_selected); @@ -1534,7 +1534,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW } // rjf: double-click -> start editing - if(sig.double_clicked && value_is_simple) + if(ui_double_clicked(sig) && value_is_simple) { ui_kill_action(); ewv->input_editing = 1; @@ -1562,7 +1562,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeType), string); } UI_Signal sig = ui_signal_from_box(box); - if(sig.pressed) + if(ui_pressed(sig)) { pressed = 1; edit_commit = edit_commit || (ewv->input_editing && !cell_selected); @@ -1596,11 +1596,11 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW { rule_editing_active = ui_is_focus_active(); sig = df_line_editf(DF_LineEditFlag_CodeContents|DF_LineEditFlag_NoBackground, 0, 0, &ewv->input_cursor, &ewv->input_mark, ewv->input_buffer, sizeof(ewv->input_buffer), &ewv->input_size, 0, view_rule, "###view_rule_%I64x", row_hash); - edit_commit = edit_commit || sig.commit; + edit_commit = edit_commit || ui_committed(sig); } // rjf: press -> commit if not selected, select this cell - if(sig.pressed) + if(ui_pressed(sig)) { pressed = 1; edit_commit = edit_commit || (ewv->input_editing && !cell_selected); @@ -1608,7 +1608,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW } // rjf: double-click -> begin editing - if(sig.double_clicked && !ewv->input_editing) + if(ui_double_clicked(sig) && !ewv->input_editing) { ui_kill_action(); ewv->input_editing = 1; @@ -1832,7 +1832,7 @@ DF_VIEW_UI_FUNCTION_DEF(Empty) UI_BackgroundColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBackground)) UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBorder)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_ActionText)) - if(df_icon_buttonf(DF_IconKind_Add, 0, "Add Target").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Add, 0, "Add Target"))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddTarget); @@ -1857,7 +1857,7 @@ DF_VIEW_UI_FUNCTION_DEF(Empty) UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBorder)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_ActionText)) { - if(df_icon_buttonf(DF_IconKind_Play, 0, "Launch %S", target_name).clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Launch %S", target_name))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.entity = df_handle_from_entity(target); @@ -1865,7 +1865,7 @@ DF_VIEW_UI_FUNCTION_DEF(Empty) df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); } ui_spacer(ui_em(1.5f, 1)); - if(df_icon_buttonf(DF_IconKind_Play, 0, "Step Into %S", target_name).clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Step Into %S", target_name))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.entity = df_handle_from_entity(target); @@ -2082,14 +2082,14 @@ DF_VIEW_UI_FUNCTION_DEF(Commands) //- rjf: interact UI_Signal sig = ui_signal_from_box(box); - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = item->cmd_spec; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); } - if(sig.right_clicked) + if(ui_right_clicked(sig)) { ui_ctx_menu_open(item_ctx_menu_key, ui_key_zero(), sub_2f32(ui_mouse(), v2f32(2, 2))); } @@ -2382,7 +2382,7 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem) UI_Signal sig = ui_sort_header(sorting, fs->cached_files_sort_side == Side_Min, kinds[idx].string); - if(sig.clicked) + if(ui_clicked(sig)) { if(fs->sort_kind != kinds[idx].kind) { @@ -2454,7 +2454,7 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem) } // rjf: click => up one directory - if(sig.clicked) + if(ui_clicked(sig)) { String8 new_path = str8_chop_last_slash(str8_chop_last_slash(path_query.path)); if(new_path.size != 0) @@ -2536,7 +2536,7 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem) } // rjf: click => activate this file - if(file_sig.clicked) + if(ui_clicked(file_sig)) { String8 existing_path = str8_chop_last_slash(path_query.path); String8 new_path = push_str8f(scratch.arena, "%S/%S/", existing_path, file->filename); @@ -2704,7 +2704,7 @@ DF_VIEW_UI_FUNCTION_DEF(SystemProcesses) } // rjf: click => activate this specific process - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.id = info->info.pid; @@ -2854,7 +2854,7 @@ DF_VIEW_UI_FUNCTION_DEF(EntityLister) UI_Box *name_label = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S##label_%p", display_string, ent); ui_box_equip_fuzzy_match_ranges(name_label, &item.name_match_ranges); } - if(ui_signal_from_box(box).clicked) + if(ui_clicked(ui_signal_from_box(box))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.entity = df_handle_from_entity(ent); @@ -2992,14 +2992,14 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) } } UI_Signal sig = ui_signal_from_box(box); - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); p.string = name; df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); } - if(sig.hovering) UI_Tooltip + if(ui_hovering(sig)) UI_Tooltip { U64 binary_voff = df_voff_from_binary_symbol_name(binary, name); DF_TextLineDasm2SrcInfo dasm2src_info = df_text_line_dasm2src_info_from_binary_voff(binary, binary_voff); @@ -3246,18 +3246,18 @@ DF_VIEW_UI_FUNCTION_DEF(Target) UI_FocusActive((value_selected && tv->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) { sig = df_line_editf(DF_LineEditFlag_NoBackground, 0, 0, &tv->input_cursor, &tv->input_mark, tv->input_buffer, sizeof(tv->input_buffer), &tv->input_size, 0, kv_info[idx].current_text, "###kv_editor_%i", (S32)idx); - edit_commit = edit_commit || sig.commit; + edit_commit = edit_commit || ui_committed(sig); } // rjf: focus panel on press - if(sig.pressed) + if(ui_pressed(sig)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } // rjf: begin editing on double-click - if(!tv->input_editing && sig.double_clicked) + if(!tv->input_editing && ui_double_clicked(sig)) { ui_kill_action(); tv->input_editing = 1; @@ -3268,7 +3268,7 @@ DF_VIEW_UI_FUNCTION_DEF(Target) } // rjf: press on non-selected => commit edit, change selected cell - if(sig.pressed && !value_selected) + if(ui_pressed(sig) && !value_selected) { edit_end = 1; edit_commit = tv->input_editing; @@ -3276,7 +3276,7 @@ DF_VIEW_UI_FUNCTION_DEF(Target) } // rjf: apply commit deltas - if(sig.commit) + if(ui_committed(sig)) { next_cursor.y += 1; } @@ -3293,7 +3293,7 @@ DF_VIEW_UI_FUNCTION_DEF(Target) { UI_FocusHot((row_selected && next_cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) UI_TextAlignment(UI_TextAlign_Center) - if(ui_buttonf("Browse...").clicked) + if(ui_clicked(ui_buttonf("Browse..."))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(kv_info[idx].fill_with_file ? DF_CoreCmdKind_PickFile : DF_CoreCmdKind_PickFolder); @@ -3427,7 +3427,7 @@ DF_VIEW_UI_FUNCTION_DEF(Targets) UI_Signal add_sig = {0}; UI_FocusHot(cursor.y == 1 ? UI_FocusKind_On : UI_FocusKind_Off) add_sig = df_icon_buttonf(DF_IconKind_Add, 0, "Add New Target"); - if(add_sig.clicked) + if(ui_clicked(add_sig)) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddTarget); @@ -3450,13 +3450,13 @@ DF_VIEW_UI_FUNCTION_DEF(Targets) UI_FocusHot((row_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) { UI_Signal sig = df_icon_buttonf(target->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, "###ebl_%p", target); - if(sig.clicked && sig.event_flags == 0) + if(ui_clicked(sig) && sig.event_flags == 0) { DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); p.entity = df_handle_from_entity(target); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectTarget)); } - else if(sig.clicked && sig.event_flags == OS_EventFlag_Ctrl) + else if(ui_clicked(sig) && sig.event_flags == OS_EventFlag_Ctrl) { DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); p.entity = df_handle_from_entity(target); @@ -3493,11 +3493,11 @@ DF_VIEW_UI_FUNCTION_DEF(Targets) { sig = df_icon_buttonf(ctrls[ctrl_idx].icon, 0, "###%p_ctrl_%i", target, (int)ctrl_idx); } - if(sig.hovering) UI_Tooltip + if(ui_hovering(sig)) UI_Tooltip { ui_label(ctrls[ctrl_idx].text); } - if(sig.clicked) + if(ui_clicked(sig)) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.entity = df_handle_from_entity(target); @@ -3700,18 +3700,18 @@ DF_VIEW_UI_FUNCTION_DEF(FilePathMap) UI_FocusActive((value_selected && fpms->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) { sig = df_line_editf(DF_LineEditFlag_NoBackground, 0, 0, &fpms->input_cursor, &fpms->input_mark, fpms->input_buffer, sizeof(fpms->input_buffer), &fpms->input_size, 0, map_src_path, "###src_editor_%p", map); - edit_commit = edit_commit || sig.commit; + edit_commit = edit_commit || ui_committed(sig); } // rjf: focus panel on press - if(sig.pressed) + if(ui_pressed(sig)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } // rjf: begin editing on double-click - if(!fpms->input_editing && sig.double_clicked) + if(!fpms->input_editing && ui_double_clicked(sig)) { fpms->input_editing = 1; fpms->input_size = Min(sizeof(fpms->input_buffer), map_src_path.size); @@ -3721,7 +3721,7 @@ DF_VIEW_UI_FUNCTION_DEF(FilePathMap) } // rjf: press on non-selected => commit edit, change selected cell - if(sig.pressed && !value_selected) + if(ui_pressed(sig) && !value_selected) { edit_end = 1; edit_commit = fpms->input_editing; @@ -3740,7 +3740,7 @@ DF_VIEW_UI_FUNCTION_DEF(FilePathMap) //- rjf: browse button UI_FocusHot((row_selected && fpms->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) UI_PrefWidth(ui_text_dim(10, 1)) - if(ui_buttonf("Browse...").clicked) + if(ui_clicked(ui_buttonf("Browse..."))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFileOrFolder); @@ -3774,18 +3774,18 @@ DF_VIEW_UI_FUNCTION_DEF(FilePathMap) UI_FocusActive((value_selected && fpms->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) { sig = df_line_editf(DF_LineEditFlag_NoBackground, 0, 0, &fpms->input_cursor, &fpms->input_mark, fpms->input_buffer, sizeof(fpms->input_buffer), &fpms->input_size, 0, map_dst_path, "###dst_editor_%p", map); - edit_commit = edit_commit || sig.commit; + edit_commit = edit_commit || ui_committed(sig); } // rjf: focus panel on press - if(sig.pressed) + if(ui_pressed(sig)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } // rjf: begin editing on double-click - if(!fpms->input_editing && sig.double_clicked) + if(!fpms->input_editing && ui_double_clicked(sig)) { fpms->input_editing = 1; fpms->input_size = Min(sizeof(fpms->input_buffer), map_dst_path.size); @@ -3795,7 +3795,7 @@ DF_VIEW_UI_FUNCTION_DEF(FilePathMap) } // rjf: press on non-selected => commit edit, change selected cell - if(sig.pressed && !value_selected) + if(ui_pressed(sig) && !value_selected) { edit_end = 1; edit_commit = fpms->input_editing; @@ -3815,7 +3815,7 @@ DF_VIEW_UI_FUNCTION_DEF(FilePathMap) { UI_FocusHot((row_selected && fpms->cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) UI_PrefWidth(ui_text_dim(10, 1)) - if(ui_buttonf("Browse...").clicked) + if(ui_clicked(ui_buttonf("Browse..."))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFileOrFolder); @@ -4009,11 +4009,11 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler) } sig = df_icon_buttonf(frozen ? DF_IconKind_Locked : DF_IconKind_Unlocked, 0, "###lock_%p", entity); } - if(frozen_by_solo_mode && sig.hovering) UI_Tooltip + if(frozen_by_solo_mode && ui_hovering(sig)) UI_Tooltip { ui_label(str8_lit("This thread is frozen during stepping operations because it isn't selected, and Solo Stepping Mode is enabled.")); } - if(sig.clicked) + if(ui_clicked(sig)) { DF_CoreCmdKind cmd_kind = frozen ? DF_CoreCmdKind_ThawEntity : DF_CoreCmdKind_FreezeEntity; DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); @@ -4040,7 +4040,7 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler) { UI_PrefWidth(ui_text_dim(10, 1)) UI_TextAlignment(UI_TextAlign_Center) - if(ui_buttonf("Detach").clicked) + if(ui_clicked(ui_buttonf("Detach"))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.entity = df_handle_from_entity(entity); @@ -4052,7 +4052,7 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler) } UI_TableCellSized(ui_em(2.25f, 1.f)) UI_FocusHot((row_is_selected && cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) { - if(df_icon_buttonf(DF_IconKind_Redo, 0, "###retry").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Redo, 0, "###retry"))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); df_handle_list_push(scratch.arena, ¶ms.entity_list, df_handle_from_entity(entity)); @@ -4065,7 +4065,7 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler) UI_BackgroundColor(df_rgba_from_theme_color(DF_ThemeColor_FailureBackground)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_FailureText)) UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_FailureBorder)) - if(df_icon_buttonf(DF_IconKind_X, 0, "###kill").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "###kill"))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); df_handle_list_push(scratch.arena, ¶ms.entity_list, df_handle_from_entity(entity)); @@ -4220,13 +4220,13 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, "%S###selection_%i", selected_string, (int)frame_idx); UI_Signal sig = ui_signal_from_box(box); - if(sig.pressed) + if(ui_pressed(sig)) { next_cursor = v2s64(0, (S64)frame_idx+1); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } - if(sig.double_clicked || sig.keyboard_clicked) + if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.index = frame_idx; @@ -4242,7 +4242,7 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) { UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "(No Module)###moduleless_frame_%I64x", frame_idx); UI_Signal sig = ui_signal_from_box(box); - if(sig.pressed) + if(ui_pressed(sig)) { next_cursor = v2s64(1, (S64)frame_idx+1); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); @@ -4271,13 +4271,13 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) } UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, symbol); UI_Signal sig = ui_signal_from_box(box); - if(sig.pressed) + if(ui_pressed(sig)) { next_cursor = v2s64(2, (S64)frame_idx+1); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } - if(sig.double_clicked || sig.keyboard_clicked) + if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.index = frame_idx; @@ -4292,13 +4292,13 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) { UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "0x%I64x", rip_vaddr); UI_Signal sig = ui_signal_from_box(box); - if(sig.pressed) + if(ui_pressed(sig)) { next_cursor = v2s64(3, (S64)frame_idx+1); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } - if(sig.double_clicked || sig.keyboard_clicked) + if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.index = frame_idx; @@ -4532,7 +4532,7 @@ DF_VIEW_UI_FUNCTION_DEF(Modules) { UI_Box *range_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, "[0x%I64x, 0x%I64x)###vaddr_range_%p", entity->vaddr_rng.min, entity->vaddr_rng.max, entity); UI_Signal sig = ui_signal_from_box(range_box); - if(sig.pressed) + if(ui_pressed(sig)) { next_cursor = v2s64(1, (S64)idx+1); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); @@ -4567,11 +4567,11 @@ DF_VIEW_UI_FUNCTION_DEF(Modules) { UI_TextColor(!dbgi_is_valid ? df_rgba_from_theme_color(DF_ThemeColor_FailureBackground) : ui_top_text_color()) sig = df_line_editf(DF_LineEditFlag_NoBackground, 0, 0, &mv->txt_cursor, &mv->txt_mark, mv->txt_buffer, sizeof(mv->txt_buffer), &mv->txt_size, 0, dbgi->dbg_path, "###dbg_path_%p", entity); - edit_commit = (edit_commit || sig.commit); + edit_commit = (edit_commit || ui_committed(sig)); } // rjf: press -> focus - if(sig.pressed) + if(ui_pressed(sig)) { edit_commit = (mv->txt_editing && !txt_is_selected); next_cursor = v2s64(2, (S64)idx+1); @@ -4580,7 +4580,7 @@ DF_VIEW_UI_FUNCTION_DEF(Modules) } // rjf: double-click -> begin editing - if(sig.double_clicked && !mv->txt_editing) + if(ui_double_clicked(sig) && !mv->txt_editing) { ui_kill_action(); mv->txt_editing = 1; @@ -4599,7 +4599,7 @@ DF_VIEW_UI_FUNCTION_DEF(Modules) // rjf: build browse button UI_FocusHot(brw_is_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_PrefWidth(ui_text_dim(10, 1)) { - if(ui_buttonf("Browse...").clicked || (brw_is_selected && edit_begin)) + if(ui_clicked(ui_buttonf("Browse...")) || (brw_is_selected && edit_begin)) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile); @@ -4800,7 +4800,7 @@ DF_VIEW_UI_FUNCTION_DEF(PendingEntity) UI_CornerRadius(ui_top_font_size()/3) UI_PrefWidth(ui_text_dim(10, 1)) UI_Focus(UI_FocusKind_On) - if(ui_buttonf("Find alternative...").clicked) + if(ui_clicked(ui_buttonf("Find alternative..."))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile); @@ -5242,7 +5242,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) UI_CornerRadius(ui_top_font_size()/3) UI_PrefWidth(ui_text_dim(10, 1)) UI_Focus(UI_FocusKind_On) - if(ui_buttonf("Find alternative...").clicked) + if(ui_clicked(ui_buttonf("Find alternative..."))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile); @@ -5461,7 +5461,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) } //- rjf: hover eval - if(!sig.base.dragging && sig.mouse_expr_rng.min.line != 0 && sig.base.event_flags == 0) + if(!ui_dragging(sig.base) && sig.mouse_expr_rng.min.line != 0 && sig.base.event_flags == 0) { TxtRng expr_rng = sig.mouse_expr_rng; String8 expr = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_rng); @@ -5476,20 +5476,20 @@ DF_VIEW_UI_FUNCTION_DEF(Code) } //- rjf: press code slice? -> focus panel - if(sig.base.pressed) + if(ui_pressed(sig.base)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } //- rjf: dragging? -> contain cursor - if(sig.base.dragging && sig.base.event_flags == 0) + if(ui_dragging(sig.base) && sig.base.event_flags == 0) { tv->contain_cursor = 1; } //- rjf: ctrl+pressed? -> go to name - if(sig.base.pressed && sig.base.event_flags & OS_EventFlag_Ctrl) + if(ui_pressed(sig.base) && sig.base.event_flags & OS_EventFlag_Ctrl) { ui_kill_action(); DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); @@ -5826,7 +5826,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "%S###file_ood_warning", df_g_icon_kind_text_table[DF_IconKind_WarningBig]); } UI_Signal sig = ui_signal_from_box(box); - if(sig.hovering) UI_Tooltip + if(ui_hovering(sig)) UI_Tooltip { UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(1, 1)) { @@ -6369,7 +6369,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) } //- rjf: hover eval - if(!sig.base.dragging && sig.mouse_expr_rng.min.line != 0 && contains_1s64(visible_line_num_range, sig.mouse_expr_rng.min.line) && sig.mouse_expr_rng.max.line == sig.mouse_expr_rng.min.line && sig.base.event_flags == 0) + if(!ui_dragging(sig.base) && sig.mouse_expr_rng.min.line != 0 && contains_1s64(visible_line_num_range, sig.mouse_expr_rng.min.line) && sig.mouse_expr_rng.max.line == sig.mouse_expr_rng.min.line && sig.base.event_flags == 0) { U64 line_idx = sig.mouse_expr_rng.min.line-visible_line_num_range.min; String8 expr = str8_substr(code_slice_params.line_text[line_idx], r1u64(sig.mouse_expr_rng.min.column-1, sig.mouse_expr_rng.max.column-1)); @@ -6386,14 +6386,14 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) } //- rjf: press code slice? -> focus panel - if(sig.base.pressed) + if(ui_pressed(sig.base)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } //- rjf: dragging? -> contain cursor - if(sig.base.dragging && sig.base.event_flags == 0) + if(ui_dragging(sig.base) && sig.base.event_flags == 0) { dv->contain_cursor = 1; } @@ -7264,7 +7264,7 @@ DF_VIEW_UI_FUNCTION_DEF(Output) } //- rjf: hover eval - if(!sig.base.dragging && sig.mouse_expr_rng.min.line != 0) + if(!ui_dragging(sig.base) && sig.mouse_expr_rng.min.line != 0) { TxtRng expr_rng = sig.mouse_expr_rng; String8 expr = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_rng); @@ -7279,14 +7279,14 @@ DF_VIEW_UI_FUNCTION_DEF(Output) } //- rjf: press code slice? -> focus panel - if(sig.base.pressed) + if(ui_pressed(sig.base)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } //- rjf: dragging? -> contain cursor - if(sig.base.dragging) + if(ui_dragging(sig.base)) { tv->contain_cursor = 1; } @@ -8040,7 +8040,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) UI_Signal sig = ui_signal_from_box(row_container_box); // rjf: calculate hovered byte - if(sig.hovering || sig.dragging) + if(ui_hovering(sig) || ui_dragging(sig)) { Vec2F32 mouse_rel = sub_2f32(ui_mouse(), row_container_box->rect.p0); U64 row_idx = ClampBot(0, mouse_rel.y) / row_height_px; @@ -8067,25 +8067,25 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) } // rjf: press -> focus panel - if(sig.pressed) + if(ui_pressed(sig)) { DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } // rjf: click & drag -> select - if(sig.dragging && mouse_hover_byte_num != 0) + if(ui_dragging(sig) && mouse_hover_byte_num != 0) { mv->contain_cursor = 1; mv->cursor = mouse_hover_byte_num-1; - if(sig.pressed) + if(ui_pressed(sig)) { mv->mark = mv->cursor; } } // rjf: ctrl+scroll -> change font size - if(sig.hovering) + if(ui_hovering(sig)) { for(OS_Event *event = ui_events()->first, *next = 0; event != 0; event = next) { @@ -8429,7 +8429,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints) { UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) { - if(df_icon_buttonf(entity->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, "###ebl_%p", entity).clicked) + if(ui_clicked(df_icon_buttonf(entity->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, "###ebl_%p", entity))) { df_entity_equip_b32(entity, !entity->b32); } @@ -8467,7 +8467,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints) } } UI_Signal sig = ui_signal_from_box(box); - if(sig.double_clicked || sig.keyboard_clicked) + if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) { DF_CmdParams params = df_cmd_params_from_window(ws); params.file_path = df_full_path_from_entity(scratch.arena, file_parent); @@ -8476,7 +8476,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints) df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); } - if(sig.pressed) + if(ui_pressed(sig)) { next_cursor = v2s64(2, (S64)(idx)); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); @@ -8492,7 +8492,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints) UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), hit_count_string); } UI_Signal sig = ui_signal_from_box(box); - if(sig.pressed) + if(ui_pressed(sig)) { next_cursor = v2s64(3, (S64)(idx)); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); @@ -8501,7 +8501,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints) } UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 4) ? UI_FocusKind_On : UI_FocusKind_Off) { - if(df_icon_buttonf(DF_IconKind_Trash, 0, "###del_%p", entity).clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "###del_%p", entity))) { df_entity_mark_for_deletion(entity); } @@ -8613,7 +8613,7 @@ DF_VIEW_UI_FUNCTION_DEF(WatchPins) } UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, "%S###loc_%p", loc_string, entity); UI_Signal sig = ui_signal_from_box(box); - if(sig.double_clicked || sig.keyboard_clicked) + if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) { DF_CmdParams params = df_cmd_params_from_window(ws); params.file_path = df_full_path_from_entity(scratch.arena, file_parent); @@ -8622,7 +8622,7 @@ DF_VIEW_UI_FUNCTION_DEF(WatchPins) df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); } - if(sig.pressed) + if(ui_pressed(sig)) { next_cursor = v2s64(1, (S64)(idx)); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); @@ -8631,7 +8631,7 @@ DF_VIEW_UI_FUNCTION_DEF(WatchPins) } UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off) { - if(df_icon_buttonf(DF_IconKind_Trash, 0, "###del_%p", entity).clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "###del_%p", entity))) { df_entity_mark_for_deletion(entity); } @@ -8760,7 +8760,7 @@ DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters) { DF_ExceptionFiltersOption *opt = &opts.v[row]; UI_Signal sig = df_icon_buttonf(opt->is_enabled ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, &opt->matches, "%S", opt->name); - if(sig.clicked) + if(ui_clicked(sig)) { if(opt->exception_code_kind != CTRL_ExceptionCodeKind_Null) { @@ -8884,7 +8884,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) ui_set_next_background_color(bg_color); ui_set_next_text_color(tx_color); ui_set_next_border_color(bd_color); - if(ui_buttonf("%S", df_g_theme_preset_display_string_table[preset]).clicked) + if(ui_clicked(ui_buttonf("%S", df_g_theme_preset_display_string_table[preset]))) { MemoryCopy(df_gfx_state->cfg_theme_target.colors, colors, sizeof(df_gfx_state->cfg_theme_target.colors)); } @@ -8966,7 +8966,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("Hex"); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, hex_string, "###hex_edit"); - if(sig.commit) + if(ui_committed(sig)) { String8 string = str8(sv->txt_buffer, sv->txt_size); Vec4F32 new_rgba = rgba_from_hex_string_4f32(string); @@ -8979,7 +8979,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("R"); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, r_string, "###r_edit"); - if(sig.commit) + if(ui_committed(sig)) { String8 string = str8(sv->txt_buffer, sv->txt_size); Vec4F32 new_rgba = v4f32((F32)f64_from_str8(string), rgba.y, rgba.z, rgba.w); @@ -8991,7 +8991,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("G"); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, g_string, "###g_edit"); - if(sig.commit) + if(ui_committed(sig)) { String8 string = str8(sv->txt_buffer, sv->txt_size); Vec4F32 new_rgba = v4f32(rgba.x, (F32)f64_from_str8(string), rgba.z, rgba.w); @@ -9003,7 +9003,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("B"); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, b_string, "###b_edit"); - if(sig.commit) + if(ui_committed(sig)) { String8 string = str8(sv->txt_buffer, sv->txt_size); Vec4F32 new_rgba = v4f32(rgba.x, rgba.y, (F32)f64_from_str8(string), rgba.w); @@ -9016,7 +9016,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("H"); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, h_string, "###h_edit"); - if(sig.commit) + if(ui_committed(sig)) { String8 string = str8(sv->txt_buffer, sv->txt_size); Vec4F32 new_hsva = v4f32((F32)f64_from_str8(string), hsva.y, hsva.z, hsva.w); @@ -9027,7 +9027,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("S"); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, s_string, "###s_edit"); - if(sig.commit) + if(ui_committed(sig)) { String8 string = str8(sv->txt_buffer, sv->txt_size); Vec4F32 new_hsva = v4f32(hsva.x, (F32)f64_from_str8(string), hsva.z, hsva.w); @@ -9038,7 +9038,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("V"); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, v_string, "###v_edit"); - if(sig.commit) + if(ui_committed(sig)) { String8 string = str8(sv->txt_buffer, sv->txt_size); Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, (F32)f64_from_str8(string), hsva.w); @@ -9050,7 +9050,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("A"); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, a_string, "###a_edit"); - if(sig.commit) + if(ui_committed(sig)) { String8 string = str8(sv->txt_buffer, sv->txt_size); Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, hsva.z, (F32)f64_from_str8(string)); @@ -9075,7 +9075,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) UI_FocusHot((sv->cursor.y == 1 && sv->cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) { UI_Signal preset_sig = df_icon_buttonf(DF_IconKind_Palette, 0, "Apply Preset"); - if(preset_sig.clicked) + if(ui_clicked(preset_sig)) { ui_ctx_menu_open(preset_ctx_menu_key, preset_sig.box->key, v2f32(0, dim_2f32(preset_sig.box->rect).y)); } @@ -9084,7 +9084,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) // rjf: load-from-file UI_FocusHot((sv->cursor.y == 1 && sv->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) { - if(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Load From File").clicked) + if(ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Load From File"))) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile); @@ -9147,7 +9147,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) ui_set_next_corner_radius_11(ui_top_font_size()/4.f); UI_Box *color_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, "###color_box"); UI_Signal color_sig = ui_signal_from_box(color_box); - if(color_sig.hovering) + if(ui_hovering(color_sig)) { ui_do_color_tooltip_hsva(hsva); } @@ -9155,7 +9155,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) ui_spacer(ui_em(0.3f, 1)); } UI_Signal color_row_sig = ui_signal_from_box(color_row); - if(color_row_sig.clicked || color_row_sig.right_clicked) + if(ui_clicked(color_row_sig) || ui_right_clicked(color_row_sig)) { ui_ctx_menu_open(color_ctx_menu_keys[color], color_row->key, v2f32(0, color_row->rect.y1-color_row->rect.y0)); sv->color_ctx_menu_color = color; @@ -9163,7 +9163,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme) DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } - if(color_row_sig.hovering) UI_Tooltip + if(ui_hovering(color_row_sig)) UI_Tooltip { ui_label(df_g_theme_color_display_string_table[color]); } diff --git a/src/os/gfx/win32/os_gfx_win32.c b/src/os/gfx/win32/os_gfx_win32.c index 12f103d4..740c4936 100644 --- a/src/os/gfx/win32/os_gfx_win32.c +++ b/src/os/gfx/win32/os_gfx_win32.c @@ -440,6 +440,8 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { S16 wheel_delta = HIWORD(wParam); OS_Event *event = w32_push_event(OS_EventKind_Scroll, window); + event->pos.x = (F32)LOWORD(lParam); + event->pos.y = (F32)HIWORD(lParam); event->delta = v2f32(0.f, -(F32)wheel_delta); }break; @@ -447,6 +449,8 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { S16 wheel_delta = HIWORD(wParam); OS_Event *event = w32_push_event(OS_EventKind_Scroll, window); + event->pos.x = (F32)LOWORD(lParam); + event->pos.y = (F32)HIWORD(lParam); event->delta = v2f32((F32)wheel_delta, 0.f); }break; diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index 417abf17..7edbfd2b 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -96,7 +96,7 @@ ui_hover_label(String8 string) { UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, string); UI_Signal interact = ui_signal_from_box(box); - if(interact.hovering) + if(ui_hovering(interact)) { box->flags |= UI_BoxFlag_DrawBorder; } @@ -271,7 +271,7 @@ ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, //- rjf: interact UI_Signal sig = ui_signal_from_box(box); - if(!is_focus_active && (sig.double_clicked || sig.keyboard_clicked)) + if(!is_focus_active && sig.f&(UI_SignalFlag_DoubleClicked|UI_SignalFlag_KeyboardPressed)) { String8 edit_string = pre_edit_value; edit_string.size = Min(edit_buffer_size, pre_edit_value.size); @@ -282,14 +282,14 @@ ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, *cursor = txt_pt(1, edit_string.size+1); *mark = txt_pt(1, 1); } - if(is_focus_active && sig.keyboard_clicked) + if(is_focus_active && sig.f&UI_SignalFlag_KeyboardPressed) { ui_set_auto_focus_active_key(ui_key_zero()); - sig.commit = 1; + sig.f |= UI_SignalFlag_Commit; } - if(is_focus_active && sig.dragging) + if(is_focus_active && ui_dragging(sig)) { - if(sig.pressed) + if(ui_pressed(sig)) { *mark = mouse_pt; } @@ -565,7 +565,7 @@ ui_sat_val_picker(F32 hue, F32 *out_sat, F32 *out_val, String8 string) UI_Signal sig = ui_signal_from_box(box); // rjf: click+draw behavior - if(sig.dragging) + if(ui_dragging(sig)) { Vec2F32 dim = dim_2f32(box->rect); *out_sat = (ui_mouse().x - box->rect.x0) / dim.x; @@ -662,7 +662,7 @@ ui_hue_picker(F32 *out_hue, F32 sat, F32 val, String8 string) UI_Signal sig = ui_signal_from_box(box); // rjf: click+draw behavior - if(sig.dragging) + if(ui_dragging(sig)) { Vec2F32 dim = dim_2f32(box->rect); *out_hue = (ui_mouse().y - box->rect.y0) / dim.y; @@ -740,7 +740,7 @@ ui_alpha_picker(F32 *out_alpha, String8 string) UI_Signal sig = ui_signal_from_box(box); // rjf: click+draw behavior - if(sig.dragging) + if(ui_dragging(sig)) { Vec2F32 dim = dim_2f32(box->rect); F32 drag_pct = (ui_mouse().y - box->rect.y0) / dim.y; @@ -889,9 +889,9 @@ ui_table_begin(U64 column_pct_count, F32 **column_pcts, String8 string) // rjf: boundary dragging UI_Signal interact = ui_signal_from_box(box); - if(interact.dragging) + if(ui_dragging(interact)) { - if(interact.pressed) + if(ui_pressed(interact)) { Vec2F32 v = v2f32(*left_pct_ptr, *right_pct_ptr); ui_store_drag_struct(&v); @@ -1228,9 +1228,9 @@ ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_ran UI_ScrollPt start_pt; F32 scroll_space_px; }; - if(scroller_sig.dragging) + if(ui_dragging(scroller_sig)) { - if(scroller_sig.pressed) + if(ui_pressed(scroller_sig)) { UI_ScrollBarDragData drag_data = {pt, (floor_f32(dim_2f32(scroll_area_box->rect).v[axis])-floor_f32(dim_2f32(scroller_box->rect).v[axis]))}; ui_store_drag_struct(&drag_data); @@ -1244,13 +1244,13 @@ ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_ran ui_scroll_pt_target_idx(&new_pt, new_idx); new_pt.off = 0; } - if(min_scroll_sig.dragging || space_before_sig.dragging) + if(ui_dragging(min_scroll_sig) || ui_dragging(space_before_sig)) { S64 new_idx = new_pt.idx-1; new_idx = Clamp(idx_range.min, new_idx, idx_range.max); ui_scroll_pt_target_idx(&new_pt, new_idx); } - if(max_scroll_sig.dragging || space_after_sig.dragging) + if(ui_dragging(max_scroll_sig) || ui_dragging(space_after_sig)) { S64 new_idx = new_pt.idx+1; new_idx = Clamp(idx_range.min, new_idx, idx_range.max); diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index f5fdc9a1..67ac8d7c 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -1012,12 +1012,6 @@ ui_begin_build(OS_EventList *events, OS_Handle window, UI_NavActionList *nav_act break; } } - - //- rjf: tick click timers - for(Side side = (Side)0; side < Side_COUNT; side = (Side)(side + 1)) - { - ui_state->time_since_last_click[side] += real_dt; - } } internal void @@ -2378,8 +2372,321 @@ internal UI_Signal ui_signal_from_box(UI_Box *box) { ProfBeginFunction(); - UI_Signal result = {0}; - result.box = box; + B32 is_focus_hot = box->flags & UI_BoxFlag_FocusHot && !(box->flags & UI_BoxFlag_FocusHotDisabled); + UI_Signal sig = {box}; + sig.event_flags |= os_get_event_flags(); + + ////////////////////////////// + //- rjf: calculate possibly-clipped box rectangle + // + Rng2F32 rect = box->rect; + for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) + { + if(b->flags & UI_BoxFlag_Clip) + { + rect = intersect_2f32(rect, b->rect); + } + } + + ////////////////////////////// + //- rjf: determine if we're under the context menu or not + // + B32 ctx_menu_is_ancestor = 0; + ProfScope("check context menu ancestor") + { + for(UI_Box *parent = box; !ui_box_is_nil(parent); parent = parent->parent) + { + if(parent == ui_state->ctx_menu_root) + { + ctx_menu_is_ancestor = 1; + break; + } + } + } + + ////////////////////////////// + //- rjf: calculate blacklist rectangles + // + Rng2F32 blacklist_rect = {0}; + if(!ctx_menu_is_ancestor && ui_state->ctx_menu_open) + { + blacklist_rect = ui_state->ctx_menu_root->rect; + } + + ////////////////////////////// + //- rjf: process events related to this box + // + B32 view_scrolled = 0; + for(OS_Event *evt = ui_state->events->first, *next = 0; + evt != 0; + evt = next) + { + B32 taken = 0; + next = evt->next; + + //- rjf: skip disqualified events + if(!os_handle_match(evt->window, ui_state->window)) {continue;} + + //- rjf: unpack event + Vec2F32 evt_mouse = evt->pos; + B32 evt_mouse_in_bounds = !contains_2f32(blacklist_rect, evt_mouse) && contains_2f32(rect, evt_mouse); + UI_MouseButtonKind evt_mouse_button_kind = (evt->key == OS_Key_LeftMouseButton ? UI_MouseButtonKind_Left : + evt->key == OS_Key_MiddleMouseButton ? UI_MouseButtonKind_Middle : + evt->key == OS_Key_RightMouseButton ? UI_MouseButtonKind_Right : + UI_MouseButtonKind_Left); + B32 evt_key_is_mouse = (evt->key == OS_Key_LeftMouseButton || + evt->key == OS_Key_MiddleMouseButton || + evt->key == OS_Key_RightMouseButton); + sig.event_flags |= evt->flags; + + //- rjf: mouse presses in box -> set hot/active; mark signal accordingly + if(box->flags & UI_BoxFlag_MouseClickable && + evt->kind == OS_EventKind_Press && + evt_mouse_in_bounds && + evt_key_is_mouse) + { + ui_state->hot_box_key = box->key; + ui_state->active_box_key[evt_mouse_button_kind] = box->key; + sig.f |= (UI_SignalFlag_LeftPressed<drag_start_mouse = evt->pos; + if(ui_key_match(box->key, ui_state->last_press_key[evt_mouse_button_kind]) && + evt->timestamp_us-ui_state->last_press_timestamp_us[evt_mouse_button_kind] <= 1000000*os_double_click_time()) + { + sig.f |= (UI_SignalFlag_LeftDoubleClicked<last_press_key[evt_mouse_button_kind] = box->key; + ui_state->last_press_timestamp_us[evt_mouse_button_kind] = evt->timestamp_us; + taken = 1; + } + + //- rjf: mouse releases in active box -> unset active; mark signal accordingly + if(box->flags & UI_BoxFlag_MouseClickable && + evt->kind == OS_EventKind_Release && + ui_key_match(ui_state->active_box_key[evt_mouse_button_kind], box->key) && + evt_mouse_in_bounds && + evt_key_is_mouse) + { + ui_state->active_box_key[evt_mouse_button_kind] = ui_key_zero(); + sig.f |= (UI_SignalFlag_LeftReleased< unset hot/active + if(box->flags & UI_BoxFlag_MouseClickable && + evt->kind == OS_EventKind_Release && + ui_key_match(ui_state->active_box_key[evt_mouse_button_kind], box->key) && + !evt_mouse_in_bounds && + evt_key_is_mouse) + { + ui_state->hot_box_key = ui_key_zero(); + ui_state->active_box_key[evt_mouse_button_kind] = ui_key_zero(); + sig.f |= (UI_SignalFlag_LeftReleased< mark signal + if(box->flags & UI_BoxFlag_KeyboardClickable && + is_focus_hot && + evt->kind == OS_EventKind_Press && + evt->key == OS_Key_Return) + { + sig.f |= UI_SignalFlag_KeyboardPressed; + taken = 1; + } + + //- rjf: scrolling + if(box->flags & UI_BoxFlag_Scroll && + evt->kind == OS_EventKind_Scroll && + evt->flags != OS_EventFlag_Ctrl && + evt_mouse_in_bounds) + { + Vec2F32 delta = evt->delta; + if(evt->flags & OS_EventFlag_Shift) + { + Swap(F32, delta.x, delta.y); + } + sig.scroll.x += (S16)(delta.x/30.f); + sig.scroll.y += (S16)(delta.y/30.f); + taken = 1; + } + + //- rjf: view scrolling + if(box->flags & UI_BoxFlag_ViewScroll && box->first_touched_build_index != box->last_touched_build_index && + evt->kind == OS_EventKind_Scroll && + evt->flags != OS_EventFlag_Ctrl && + evt_mouse_in_bounds) + { + Vec2F32 delta = evt->delta; + if(evt->flags & OS_EventFlag_Shift) + { + Swap(F32, delta.x, delta.y); + } + if(!(box->flags & UI_BoxFlag_ViewScrollX)) + { + delta.x = 0; + } + if(!(box->flags & UI_BoxFlag_ViewScrollY)) + { + delta.y = 0; + } + os_eat_event(ui_state->events, evt); + box->view_off_target.x += delta.x; + box->view_off_target.y += delta.y; + view_scrolled = 1; + taken = 1; + } + + //- rjf: taken -> eat event + if(taken) + { + os_eat_event(ui_state->events, evt); + } + } + + ////////////////////////////// + //- rjf: process nav actions related to this box + // + { + for(UI_NavActionNode *n = ui_state->nav_actions->first, *next = 0; + n != 0; + n = next) + { + next = n->next; + UI_NavAction *action = &n->v; + B32 taken = 0; + if(is_focus_hot && box->flags & UI_BoxFlag_KeyboardClickable && action->flags & UI_NavActionFlag_Copy) + { + ui_state->clipboard_copy_key = box->key; + taken = 1; + } + if(box->flags & UI_BoxFlag_Clickable && box->fastpath_codepoint != 0) + { + B32 ancestor_is_focused = 0; + for(UI_Box *parent = box->parent; !ui_box_is_nil(parent); parent = parent->parent) + { + if(parent->flags & UI_BoxFlag_FocusActive) + { + ancestor_is_focused = 1; + if(parent->flags & UI_BoxFlag_FocusActiveDisabled || + !ui_key_match(parent->default_nav_focus_active_key, ui_key_zero())) + { + ancestor_is_focused = 0; + break; + } + } + } + if(ancestor_is_focused && action->insertion.size != 0) + { + Temp scratch = scratch_begin(0, 0); + String32 insertion32 = str32_from_8(scratch.arena, action->insertion); + if(insertion32.size == 1 && insertion32.str[0] == box->fastpath_codepoint) + { + taken = 1; + sig.f |= UI_SignalFlag_Clicked|UI_SignalFlag_Pressed; + } + scratch_end(scratch); + } + } + if(taken) + { + ui_nav_eat_action_node(ui_nav_actions(), n); + } + } + } + + ////////////////////////////// + //- rjf: clamp view scrolling + // + if(view_scrolled && box->flags & UI_BoxFlag_ViewClamp) + { + Vec2F32 max_view_off_target = + { + ClampBot(0, box->view_bounds.x - box->fixed_size.x), + ClampBot(0, box->view_bounds.y - box->fixed_size.y), + }; + if(box->flags & UI_BoxFlag_ViewClampX) { box->view_off_target.x = Clamp(0, box->view_off_target.x, max_view_off_target.x); } + if(box->flags & UI_BoxFlag_ViewClampY) { box->view_off_target.y = Clamp(0, box->view_off_target.y, max_view_off_target.y); } + } + + ////////////////////////////// + //- rjf: active -> dragging + // + for(EachEnumVal(UI_MouseButtonKind, k)) + { + if(ui_key_match(ui_state->active_box_key[k], box->key)) + { + sig.f |= (UI_SignalFlag_LeftDragging< always mark mouse-over + // + { + if(contains_2f32(rect, ui_state->mouse) && + !contains_2f32(blacklist_rect, ui_state->mouse)) + { + sig.f |= UI_SignalFlag_MouseOver; + } + } + + ////////////////////////////// + //- rjf: mouse is over this box's rect, no other hot key? -> set hot key, mark hovering + // + { + if(contains_2f32(rect, ui_state->mouse) && + !contains_2f32(blacklist_rect, ui_state->mouse) && + (ui_key_match(ui_state->hot_box_key, ui_key_zero()) || ui_key_match(ui_state->hot_box_key, box->key)) && + (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key)) && + (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Middle], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Middle], box->key)) && + (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], box->key))) + { + ui_state->hot_box_key = box->key; + sig.f |= UI_SignalFlag_Hovering; + } + } + + ////////////////////////////// + //- rjf: clicking on something outside the context menu kills the context menu + // + if(!ctx_menu_is_ancestor && sig.f & (UI_SignalFlag_LeftPressed|UI_SignalFlag_RightPressed|UI_SignalFlag_MiddlePressed)) + { + ui_ctx_menu_close(); + } + + ////////////////////////////// + //- rjf: get default nav ancestor + // + UI_Box *default_nav_parent = &ui_g_nil_box; + for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & UI_BoxFlag_DefaultFocusNav) + { + default_nav_parent = p; + break; + } + } + + ////////////////////////////// + //- rjf: clicking in default nav -> set navigation state to this box + // + if(box->flags & UI_BoxFlag_ClickToFocus && sig.f&UI_SignalFlag_Pressed && !ui_box_is_nil(default_nav_parent)) + { + default_nav_parent->default_nav_focus_next_hot_key = box->key; + if(!ui_key_match(default_nav_parent->default_nav_focus_active_key, box->key)) + { + default_nav_parent->default_nav_focus_next_active_key = ui_key_zero(); + } + } + + + ProfEnd(); + return sig; + +#if 0 + ProfBeginFunction(); + UI_Signal result = {box}; result.event_flags = os_get_event_flags(); B32 disabled = !!(box->flags & UI_BoxFlag_Disabled); B32 is_focused = !!(box->flags & UI_BoxFlag_FocusHot) && !(box->flags & UI_BoxFlag_FocusHotDisabled); @@ -2745,6 +3052,7 @@ ui_signal_from_box(UI_Box *box) ProfEnd(); return result; +#endif } //////////////////////////////// diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index 52699667..044e0d2c 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -351,24 +351,79 @@ struct UI_BoxList U64 count; }; +typedef U32 UI_SignalFlags; +enum +{ + // rjf: mouse press -> box was pressed while hovering + UI_SignalFlag_LeftPressed = (1<<0), + UI_SignalFlag_MiddlePressed = (1<<1), + UI_SignalFlag_RightPressed = (1<<2), + + // rjf: dragging -> box was previously pressed, user is still holding button + UI_SignalFlag_LeftDragging = (1<<3), + UI_SignalFlag_MiddleDragging = (1<<4), + UI_SignalFlag_RightDragging = (1<<5), + + // rjf: released -> box was previously pressed & user released, in or out of bounds + UI_SignalFlag_LeftReleased = (1<<6), + UI_SignalFlag_MiddleReleased = (1<<7), + UI_SignalFlag_RightReleased = (1<<8), + + // rjf: clicked -> box was previously pressed & user released, in bounds + UI_SignalFlag_LeftClicked = (1<<9), + UI_SignalFlag_MiddleClicked = (1<<10), + UI_SignalFlag_RightClicked = (1<<11), + + // rjf: double clicked -> box was previously clicked, pressed again + UI_SignalFlag_LeftDoubleClicked = (1<<12), + UI_SignalFlag_MiddleDoubleClicked = (1<<13), + UI_SignalFlag_RightDoubleClicked = (1<<14), + + // rjf: triple clicked -> box was previously clicked twice, pressed again + UI_SignalFlag_LeftTripleClicked = (1<<15), + UI_SignalFlag_MiddleTripleClicked = (1<<16), + UI_SignalFlag_RightTripleClicked = (1<<17), + + // rjf: keyboard pressed -> box had focus, user activated via their keyboard + UI_SignalFlag_KeyboardPressed = (1<<18), + + // rjf: passive mouse info + UI_SignalFlag_Hovering = (1<<19), // hovering specifically this box + UI_SignalFlag_MouseOver = (1<<20), // mouse is over, but may be occluded + + // rjf: committing state changes via user interaction + UI_SignalFlag_Commit = (1<<21), + + // rjf: high-level combos + UI_SignalFlag_Pressed = UI_SignalFlag_LeftPressed|UI_SignalFlag_KeyboardPressed, + UI_SignalFlag_Released = UI_SignalFlag_LeftReleased, + UI_SignalFlag_Clicked = UI_SignalFlag_LeftClicked|UI_SignalFlag_KeyboardPressed, + UI_SignalFlag_DoubleClicked = UI_SignalFlag_LeftDoubleClicked, + UI_SignalFlag_TripleClicked = UI_SignalFlag_LeftTripleClicked, + UI_SignalFlag_Dragging = UI_SignalFlag_LeftDragging, +}; + typedef struct UI_Signal UI_Signal; struct UI_Signal { UI_Box *box; OS_EventFlags event_flags; Vec2S16 scroll; - B8 clicked :1; - B8 keyboard_clicked :1; - B8 double_clicked :1; - B8 right_clicked :1; - B8 pressed :1; - B8 released :1; - B8 dragging :1; - B8 hovering :1; - B8 mouse_over :1; - B8 commit :1; + UI_SignalFlags f; }; +#define ui_pressed(s) !!((s).f&UI_SignalFlag_Pressed) +#define ui_clicked(s) !!((s).f&UI_SignalFlag_Clicked) +#define ui_released(s) !!((s).f&UI_SignalFlag_Released) +#define ui_double_clicked(s) !!((s).f&UI_SignalFlag_DoubleClicked) +#define ui_triple_clicked(s) !!((s).f&UI_SignalFlag_TripleClicked) +#define ui_middle_clicked(s) !!((s).f&UI_SignalFlag_MiddleClicked) +#define ui_right_clicked(s) !!((s).f&UI_SignalFlag_RightClicked) +#define ui_dragging(s) !!((s).f&UI_SignalFlag_Dragging) +#define ui_hovering(s) !!((s).f&UI_SignalFlag_Hovering) +#define ui_mouse_over(s) !!((s).f&UI_SignalFlag_MouseOver) +#define ui_committed(s) !!((s).f&UI_SignalFlag_Commit) + typedef struct UI_Nav UI_Nav; struct UI_Nav { @@ -429,8 +484,8 @@ struct UI_State UI_Key hot_box_key; UI_Key active_box_key[UI_MouseButtonKind_COUNT]; UI_Key clipboard_copy_key; - F32 time_since_last_click[UI_MouseButtonKind_COUNT]; - UI_Key last_click_key[UI_MouseButtonKind_COUNT]; + U64 last_press_timestamp_us[UI_MouseButtonKind_COUNT]; + UI_Key last_press_key[UI_MouseButtonKind_COUNT]; Vec2F32 drag_start_mouse; Arena *drag_state_arena; String8 drag_state_data; From 0bced47404435cdef66493596ca0d3a2be22eac4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 Feb 2024 16:47:21 -0800 Subject: [PATCH 008/275] eliminate old ui box -> signal path --- src/ui/ui_core.c | 370 ----------------------------------------------- 1 file changed, 370 deletions(-) diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 67ac8d7c..b55ff54b 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2683,376 +2683,6 @@ ui_signal_from_box(UI_Box *box) ProfEnd(); return sig; - -#if 0 - ProfBeginFunction(); - UI_Signal result = {box}; - result.event_flags = os_get_event_flags(); - B32 disabled = !!(box->flags & UI_BoxFlag_Disabled); - B32 is_focused = !!(box->flags & UI_BoxFlag_FocusHot) && !(box->flags & UI_BoxFlag_FocusHotDisabled); - - //- rjf: gather events - OS_Event *left_press = 0; - OS_Event *left_release = 0; - OS_Event *right_press = 0; - OS_Event *right_release = 0; - for(OS_Event *evt = ui_state->events->first; evt != 0; evt = evt->next) - { - if(os_handle_match(ui_state->window, evt->window)) - { - if(left_press == 0 && evt->kind == OS_EventKind_Press && evt->key == OS_Key_LeftMouseButton) - { - left_press = evt; - } - if(left_release == 0 && evt->kind == OS_EventKind_Release && evt->key == OS_Key_LeftMouseButton) - { - left_release = evt; - } - if(right_press == 0 && evt->kind == OS_EventKind_Press && evt->key == OS_Key_RightMouseButton) - { - right_press = evt; - } - if(right_release == 0 && evt->kind == OS_EventKind_Release && evt->key == OS_Key_RightMouseButton) - { - right_release = evt; - } - } - } - - //- rjf: unpack mouse position info - Vec2F32 mouse = ui_state->mouse; - if(left_press != 0) { mouse = left_press->pos; } - if(left_release != 0) { mouse = left_release->pos; } - if(right_press != 0) { mouse = right_press->pos; } - if(right_release != 0) { mouse = right_release->pos; } - B32 mouse_is_over = contains_2f32(box->rect, mouse); - - //- rjf: check for parent that is clipping - if(box->flags & (UI_BoxFlag_Clickable|UI_BoxFlag_ViewScroll) && mouse_is_over) - { - for(UI_Box *parent = box->parent; !ui_box_is_nil(parent); parent = parent->parent) - { - if(parent->flags & UI_BoxFlag_Clip) - { - mouse_is_over = mouse_is_over && contains_2f32(parent->rect, mouse); - break; - } - } - } - - //- rjf: get default nav ancestor - UI_Box *default_nav_parent = &ui_g_nil_box; - for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & UI_BoxFlag_DefaultFocusNav) - { - default_nav_parent = p; - break; - } - } - - //- rjf: determine if we're under the context menu or not - B32 ctx_menu_is_ancestor = 0; - ProfScope("check context menu ancestor") - { - for(UI_Box *parent = box; !ui_box_is_nil(parent); parent = parent->parent) - { - if(parent == ui_state->ctx_menu_root) - { - ctx_menu_is_ancestor = 1; - break; - } - } - } - - //- rjf: clip against floaters - if(mouse_is_over) ProfScope("clip against floaters") - { - if(!ctx_menu_is_ancestor && ui_state->ctx_menu_open != 0 && contains_2f32(ui_state->ctx_menu_root->rect, mouse)) - { - mouse_is_over = 0; - } - } - - //- rjf: mouse clickability - if(box->flags & UI_BoxFlag_MouseClickable && !ui_key_match(ui_key_zero(), box->key)) ProfScope("clickability") - { - // rjf: hot management - if((ui_key_match(ui_key_zero(), ui_state->active_box_key[UI_MouseButtonKind_Left]) && - ui_key_match(ui_key_zero(), ui_state->active_box_key[UI_MouseButtonKind_Right])) && - ui_key_match(ui_key_zero(), ui_state->hot_box_key) && - mouse_is_over) - { - ui_state->hot_box_key = box->key; - } - else if(ui_key_match(ui_state->hot_box_key, box->key) && - !mouse_is_over && - !ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key) && - !ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], box->key)) - { - ui_state->hot_box_key = ui_key_zero(); - } - - // rjf: active management (left click) - if(!disabled && - ui_key_match(ui_state->hot_box_key, box->key) && - ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) && - left_press != 0) - { - os_eat_event(ui_state->events, left_press); - result.pressed = 1; - ui_state->active_box_key[UI_MouseButtonKind_Left] = box->key; - } - else if(!disabled && - ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key) && - left_release != 0) - { - os_eat_event(ui_state->events, left_release); - result.released = 1; - result.clicked = mouse_is_over; - ui_state->hot_box_key = mouse_is_over ? box->key : ui_key_zero(); - ui_state->active_box_key[UI_MouseButtonKind_Left] = ui_key_zero(); - } - - // rjf: active management (right click) - if(!disabled && - ui_key_match(ui_state->hot_box_key, box->key) && - ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], ui_key_zero()) && - right_press != 0) - { - os_eat_event(ui_state->events, right_press); - // NOTE(rjf): Add this in if it ever needs to exist: - // result.right_pressed = 1; - ui_state->active_box_key[UI_MouseButtonKind_Right] = box->key; - } - else if(!disabled && - ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], box->key) && - right_release != 0) - { - os_eat_event(ui_state->events, right_release); - // NOTE(rjf): Add this in if it ever needs to exist: - // result.right_released = 1; - result.right_clicked = mouse_is_over; - ui_state->active_box_key[UI_MouseButtonKind_Right] = ui_key_zero(); - } - - // rjf: dragging - if(ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key)) - { - result.dragging = 1; - if(result.pressed) - { - ui_state->drag_start_mouse = mouse; - } - } - } - - //- rjf: plain scrolling - if(box->flags & UI_BoxFlag_Scroll) - { - OS_EventList *events = ui_events(); - for(OS_Event *event = events->first, *next = 0; event != 0; event = next) - { - next = event->next; - if(os_handle_match(event->window, ui_state->window) && event->flags != OS_EventFlag_Ctrl) - { - switch(event->kind) - { - default:break; - case OS_EventKind_Scroll: - if(mouse_is_over) - { - Vec2F32 delta = event->delta; - if(event->flags & OS_EventFlag_Shift) - { - Swap(F32, delta.x, delta.y); - } - os_eat_event(events, event); - result.scroll.x += (S16)(delta.x/30.f); - result.scroll.y += (S16)(delta.y/30.f); - }break; - } - } - } - } - - //- rjf: view scrolling - if(box->first_touched_build_index != box->last_touched_build_index && box->flags & UI_BoxFlag_ViewScroll) - { - OS_EventList *events = ui_events(); - for(OS_Event *event = events->first, *next = 0; event != 0; event = next) - { - next = event->next; - if(os_handle_match(event->window, ui_state->window) && event->flags != OS_EventFlag_Ctrl) - { - switch(event->kind) - { - default:break; - case OS_EventKind_Scroll: - if(mouse_is_over) - { - Vec2F32 delta = event->delta; - if(event->flags & OS_EventFlag_Shift) - { - Swap(F32, delta.x, delta.y); - } - if(!(box->flags & UI_BoxFlag_ViewScrollX)) - { - delta.x = 0; - } - if(!(box->flags & UI_BoxFlag_ViewScrollY)) - { - delta.y = 0; - } - os_eat_event(events, event); - box->view_off_target.x += delta.x; - box->view_off_target.y += delta.y; - }break; - } - } - } - if(box->flags & UI_BoxFlag_ViewClamp) - { - Vec2F32 max_view_off_target = - { - ClampBot(0, box->view_bounds.x - box->fixed_size.x), - ClampBot(0, box->view_bounds.y - box->fixed_size.y), - }; - if(box->flags & UI_BoxFlag_ViewClampX) { box->view_off_target.x = Clamp(0, box->view_off_target.x, max_view_off_target.x); } - if(box->flags & UI_BoxFlag_ViewClampY) { box->view_off_target.y = Clamp(0, box->view_off_target.y, max_view_off_target.y); } - } - } - - //- rjf: focus + clicks - B32 keyboard_click = 0; - if(!disabled && is_focused && box->flags & UI_BoxFlag_KeyboardClickable) - { - if(os_key_press(ui_events(), ui_window(), 0, OS_Key_Return) != 0) - // TODO(rjf): need to handle case where this would conflict with typing. - // if(os_key_press(ui_events(), ui_window(), 0, OS_Key_Return) != 0 || - // os_key_press(ui_events(), ui_window(), 0, OS_Key_Space) != 0) - { - keyboard_click = 1; - result.clicked = 1; - result.pressed = 1; - result.keyboard_clicked = 1; - } - } - - //- rjf: focus + ctrl+clicks - if(!disabled && is_focused && box->flags & UI_BoxFlag_KeyboardClickable) - { - if(os_key_press(ui_events(), ui_window(), OS_EventFlag_Shift, OS_Key_Return)) - { - result.right_clicked = 1; - } - } - - //- rjf: focus & ctrl+c - if(is_focused && box->flags & UI_BoxFlag_KeyboardClickable) - { - for(UI_NavActionNode *n = ui_nav_actions()->first, *next = 0; n != 0; n = next) - { - next = n->next; - if(n->v.flags & UI_NavActionFlag_Copy) - { - ui_state->clipboard_copy_key = box->key; - ui_nav_eat_action_node(ui_nav_actions(), n); - } - } - } - - //- rjf: focused ancestors and fastpath codepoint -> click - if(box->flags & UI_BoxFlag_Clickable && box->fastpath_codepoint != 0) - { - B32 is_focused = 0; - for(UI_Box *parent = box->parent; !ui_box_is_nil(parent); parent = parent->parent) - { - if(parent->flags & UI_BoxFlag_FocusActive) - { - is_focused = 1; - if(parent->flags & UI_BoxFlag_FocusActiveDisabled || - !ui_key_match(parent->default_nav_focus_active_key, ui_key_zero())) - { - is_focused = 0; - break; - } - } - } - if(is_focused) - { - Temp scratch = scratch_begin(0, 0); - B32 clicked = 0; - for(UI_NavActionNode *n = ui_nav_actions()->first; n != 0; n = n->next) - { - UI_NavAction *action = &n->v; - if(action->insertion.size != 0) - { - String32 insertion32 = str32_from_8(scratch.arena, action->insertion); - if(insertion32.size == 1 && insertion32.str[0] == box->fastpath_codepoint) - { - clicked = 1; - ui_nav_eat_action_node(ui_nav_actions(), n); - break; - } - } - } - if(clicked) - { - keyboard_click = 1; - result.clicked = 1; - result.pressed = 1; - result.keyboard_clicked = 1; - } - scratch_end(scratch); - } - } - - //- rjf: double-clicks - if(!keyboard_click && result.pressed) - { - if(ui_key_match(ui_state->last_click_key[Side_Min], box->key) && - ui_state->time_since_last_click[Side_Min] < os_double_click_time()) - { - result.double_clicked = 1; - } - ui_state->time_since_last_click[Side_Min] = 0; - ui_state->last_click_key[Side_Min] = box->key; - } - - //- rjf: clicking on something outside the context menu kills the context menu - if(!ctx_menu_is_ancestor && result.pressed) - { - ui_ctx_menu_close(); - } - - //- rjf: set hovering status - result.hovering = mouse_is_over && ((ui_key_match(ui_state->hot_box_key, ui_key_zero()) || - ui_key_match(ui_state->hot_box_key, box->key)) && - (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) || - ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key))); - result.mouse_over = mouse_is_over; - - //- rjf: clicking in default nav -> set navigation state to this box - if(box->flags & UI_BoxFlag_ClickToFocus && result.pressed && !ui_box_is_nil(default_nav_parent)) - { - default_nav_parent->default_nav_focus_next_hot_key = box->key; - if(!ui_key_match(default_nav_parent->default_nav_focus_active_key, box->key)) - { - default_nav_parent->default_nav_focus_next_active_key = ui_key_zero(); - } - } - - //- rjf: focus & external commit events -> commit - if(is_focused && ui_state->external_focus_commit) - { - ui_state->external_focus_commit = 0; - result.commit = 1; - } - - ProfEnd(); - return result; -#endif } //////////////////////////////// From 3a811e5e1633a463a7c4995db63ee6d206c495f9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 Feb 2024 16:49:05 -0800 Subject: [PATCH 009/275] middle click -> close tabs --- src/df/gfx/df_gfx.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index e629835e..d9e15664 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -5922,10 +5922,13 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_BackgroundColor(v4f32(0, 0, 0, 0)) UI_CornerRadius00(0) UI_CornerRadius01(0) - if(ui_clicked(ui_buttonf("%S###close_view_%p", df_g_icon_kind_text_table[DF_IconKind_X], view))) { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); + UI_Signal sig = ui_buttonf("%S###close_view_%p", df_g_icon_kind_text_table[DF_IconKind_X], view); + if(ui_clicked(sig) || ui_middle_clicked(sig)) + { + DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); + } } } @@ -5953,6 +5956,11 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D ui_ctx_menu_open(ws->tab_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0)); ws->tab_ctx_menu_view = df_handle_from_view(view); } + else if(ui_middle_clicked(sig)) + { + DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); + } if(ui_released(sig)) { df_panel_notify_mutation(ws, panel); From 2967d8be2ad34967060a2e8005821e5e9d85a925 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 8 Feb 2024 04:12:29 -0800 Subject: [PATCH 010/275] fix double assignment to strtable buckets_min in raddbg_pdb --- src/raddbg_convert/pdb/raddbg_pdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raddbg_convert/pdb/raddbg_pdb.c b/src/raddbg_convert/pdb/raddbg_pdb.c index 0460653a..b2f7867e 100644 --- a/src/raddbg_convert/pdb/raddbg_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_pdb.c @@ -191,7 +191,7 @@ pdb_strtbl_from_data(Arena *arena, String8 data){ result->strblock_min = strblock_off; result->strblock_max = strblock_off + strblock_size; result->buckets_min = bucket_array_off; - result->buckets_min = bucket_array_off + bucket_array_size; + result->buckets_max = bucket_array_off + bucket_array_size; } } From 6e3242848fd409a65421dd097735170ce99d2982 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 8 Feb 2024 10:05:29 -0800 Subject: [PATCH 011/275] wm_mousewheel and wm_mousehwheel report mouse coordinates in screen space, not client space; fix to account fo rthat --- src/os/gfx/win32/os_gfx_win32.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/os/gfx/win32/os_gfx_win32.c b/src/os/gfx/win32/os_gfx_win32.c index 740c4936..a4d97f67 100644 --- a/src/os/gfx/win32/os_gfx_win32.c +++ b/src/os/gfx/win32/os_gfx_win32.c @@ -440,8 +440,12 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { S16 wheel_delta = HIWORD(wParam); OS_Event *event = w32_push_event(OS_EventKind_Scroll, window); - event->pos.x = (F32)LOWORD(lParam); - event->pos.y = (F32)HIWORD(lParam); + POINT p; + p.x = (S32)LOWORD(lParam); + p.y = (S32)HIWORD(lParam); + ScreenToClient(window->hwnd, &p); + event->pos.x = (F32)p.x; + event->pos.y = (F32)p.y; event->delta = v2f32(0.f, -(F32)wheel_delta); }break; @@ -449,8 +453,12 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { S16 wheel_delta = HIWORD(wParam); OS_Event *event = w32_push_event(OS_EventKind_Scroll, window); - event->pos.x = (F32)LOWORD(lParam); - event->pos.y = (F32)HIWORD(lParam); + POINT p; + p.x = (S32)LOWORD(lParam); + p.y = (S32)HIWORD(lParam); + ScreenToClient(window->hwnd, &p); + event->pos.x = (F32)p.x; + event->pos.y = (F32)p.y; event->delta = v2f32((F32)wheel_delta, 0.f); }break; From fed0a13aca9a3c111d8f417bfde223b25048825b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 8 Feb 2024 10:09:51 -0800 Subject: [PATCH 012/275] eliminate leftover events system, since ui codepaths should now consume as many events as possible within a single frame --- src/raddbg/raddbg.c | 28 +--------------------------- src/raddbg/raddbg.h | 2 -- 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index d8414795..88f48b56 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -65,10 +65,7 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data) OS_EventList events = {0}; if(os_handle_match(repaint_window_handle, os_handle_zero())) { - OS_EventList leftover_events_copy = os_event_list_copy(scratch.arena, &leftover_events); - OS_EventList new_events = os_get_events(scratch.arena, df_gfx_state->num_frames_requested == 0); - os_event_list_concat_in_place(&events, &leftover_events_copy); - os_event_list_concat_in_place(&events, &new_events); + events = os_get_events(scratch.arena, df_gfx_state->num_frames_requested == 0); } //- rjf: enable txti change detection @@ -321,26 +318,6 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data) } } - //- rjf: gather leftover events for subsequent frame - // TODO(rjf): need to prevent spurious unconsumed events in UI layer & other event handling paths - if(events.count != 0 && 0) - { - arena_clear(leftover_events_arena); - leftover_events = os_event_list_copy(leftover_events_arena, &events); - for(OS_Event *ev = leftover_events.first, *next = 0; ev != 0; ev = next) - { - next = ev->next; - if(ev->timestamp_us+1000000 < os_now_microseconds() || - ev->kind == OS_EventKind_Text || - (ev->kind == OS_EventKind_Press && ev->key != OS_Key_LeftMouseButton && ev->key != OS_Key_RightMouseButton && ev->key != OS_Key_MiddleMouseButton) || - (ev->kind == OS_EventKind_Release && ev->key != OS_Key_LeftMouseButton && ev->key != OS_Key_RightMouseButton && ev->key != OS_Key_MiddleMouseButton) || - (ev->kind == OS_EventKind_Scroll)) - { - os_eat_event(&leftover_events, ev); - } - } - } - //- rjf: determine frame time, record into history U64 end_time_us = os_now_microseconds(); U64 frame_time_us = end_time_us-begin_time_us; @@ -449,9 +426,6 @@ entry_point(int argc, char **argv) IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; ipc_info->msg_size = 0; - //- rjf: set up leftover event arena - leftover_events_arena = arena_alloc(); - //- rjf: initialize stuff we depend on { hs_init(); diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 54cdf7e7..30ce9ea5 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -446,8 +446,6 @@ read_only global String8 ipc_shared_memory_name = str8_lit_comp("_raddbg_ipc_sha read_only global String8 ipc_semaphore_name = str8_lit_comp("_raddbg_ipc_semaphore_"); global U64 frame_time_us_history[64] = {0}; global U64 frame_time_us_history_idx = 0; -global Arena *leftover_events_arena = 0; -global OS_EventList leftover_events = {0}; //////////////////////////////// //~ rjf: Frontend Entry Points From 95a6579f89d3e1b1ca3dbd76d03d462fb5149792 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 8 Feb 2024 10:28:41 -0800 Subject: [PATCH 013/275] expand eval machine interpretation error codes; visualize --- src/ctrl/ctrl_core.c | 2 +- src/df/core/df_core.c | 4 ++ src/eval/eval.mdesk | 28 +++++++++++++ src/eval/eval_core.h | 1 + src/eval/eval_machine.c | 76 ++++++++++++++++++++-------------- src/eval/eval_machine.h | 11 +++-- src/eval/generated/eval.meta.h | 31 ++++++++++++++ 7 files changed, 118 insertions(+), 35 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index e97f1142..416ab856 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -2916,7 +2916,7 @@ ctrl_thread__run(CTRL_Msg *msg) machine.tls_base = &tls_base; eval = eval_interpret(&machine, bytecode); } - if(eval.bad_eval == 0 && eval.value.u64 == 0) + if(eval.code == EVAL_ResultCode_Good && eval.value.u64 == 0) { hit_user_bp = 0; hit_conditional_bp_but_filtered = 1; diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 2cc202da..2ec1dfa8 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4227,6 +4227,10 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ }break; } result.errors = errors; + if(EVAL_ResultCode_Good < eval.code && eval.code < EVAL_ResultCode_COUNT) + { + eval_error(arena, &result.errors, EVAL_ErrorKind_InterpretationError, 0, eval_result_code_display_strings[eval.code]); + } } //- rjf: apply dynamic type overrides diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 8e26553a..ec8f3a7f 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -54,6 +54,22 @@ EVAL_ExprKindTable: { LeafIdent 0 "leaf_ident" } } +@table(name display_string) +EVAL_ResultCodeTable: +{ + { Good "" } + { DivideByZero "Cannot divide by zero." } + { BadOp "Invalid operation." } + { BadOpTypes "Invalid operation types." } + { BadMemRead "Failed memory read." } + { BadRegRead "Failed register read." } + { BadFrameBase "Invalid frame base address." } + { BadModuleBase "Invalid module base address." } + { BadTLSBase "Invalid thread-local storage base address." } + { InsufficientStackSpace "Insufficient evaluation machine stack space." } + { MalformedBytecode "Malformed bytecode." } +} + @table_gen { `typedef U32 EVAL_ExprKind;`; @@ -65,6 +81,12 @@ EVAL_ExprKindTable: ``; } +@table_gen_enum EVAL_ResultCode: +{ + @expand(EVAL_ResultCodeTable a) `EVAL_ResultCode_$(a.name),`; + EVAL_ResultCode_COUNT +} + @table_gen_data(type:U8, fallback:0) eval_expr_kind_child_counts: { @@ -77,6 +99,12 @@ eval_expr_kind_strings: @expand(EVAL_ExprKindTable a) `str8_lit_comp("$(a.name)"),`; } +@table_gen_data(type:String8, fallback:`{0}`) +eval_result_code_display_strings: +{ + @expand(EVAL_ResultCodeTable a) `str8_lit_comp("$(a.display_string)"),`; +} + @table_gen_data(type:String8, fallback:`{0}`) eval_expr_op_strings: { diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 7a1d47cf..b2031631 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -13,6 +13,7 @@ typedef enum EVAL_ErrorKind EVAL_ErrorKind_MalformedInput, EVAL_ErrorKind_MissingInfo, EVAL_ErrorKind_ResolutionFailure, + EVAL_ErrorKind_InterpretationError, EVAL_ErrorKind_COUNT } EVAL_ErrorKind; diff --git a/src/eval/eval_machine.c b/src/eval/eval_machine.c index 6afd7e12..9e1dae77 100644 --- a/src/eval/eval_machine.c +++ b/src/eval/eval_machine.c @@ -5,7 +5,8 @@ //~ allen: Eval Machine Functions internal EVAL_Result -eval_interpret(EVAL_Machine *machine, String8 bytecode){ +eval_interpret(EVAL_Machine *machine, String8 bytecode) +{ ProfBeginFunction(); EVAL_Result result = {0}; @@ -23,7 +24,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ // consume opcode RADDBG_EvalOp op = (RADDBG_EvalOp)*ptr; if (op >= RADDBG_EvalOp_COUNT){ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOp; goto done; } U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op]; @@ -35,7 +36,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ U32 decode_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits); U8 *next_ptr = ptr + decode_size; if (next_ptr > opl){ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOp; goto done; } // TODO(allen): to improve this: @@ -55,7 +56,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ { U32 pop_count = RADDBG_POPN_FROM_CTRLBITS(ctrlbits); if (pop_count > stack_count){ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOp; goto done; } if (pop_count <= stack_count){ @@ -99,7 +100,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ good_read = 1; } if (!good_read){ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadMemRead; goto done; } }break; @@ -117,7 +118,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ MemoryCopy(&nval, (U8*)machine->reg_data + off, size); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadRegRead; goto done; } }break; @@ -130,7 +131,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ MemoryCopy(&nval, (U8*)machine->reg_data + off, size); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadRegRead; goto done; } }break; @@ -141,7 +142,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = *machine->frame_base + imm; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadFrameBase; goto done; } }break; @@ -152,7 +153,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = *machine->module_base + imm; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadModuleBase; goto done; } }break; @@ -163,7 +164,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = *machine->tls_base + imm; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadTLSBase; goto done; } }break; @@ -256,20 +257,35 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ if (svals[1].f32 != 0.f){ nval.f32 = svals[0].f32/svals[1].f32; } + else + { + result.code = EVAL_ResultCode_DivideByZero; + goto done; + } } else if (imm == RADDBG_EvalTypeGroup_F64){ if (svals[1].f64 != 0.){ nval.f64 = svals[0].f64/svals[1].f64; } + else + { + result.code = EVAL_ResultCode_DivideByZero; + goto done; + } } else if (imm == RADDBG_EvalTypeGroup_U || imm == RADDBG_EvalTypeGroup_S){ if (svals[1].u64 != 0){ nval.u64 = svals[0].u64/svals[1].u64; } + else + { + result.code = EVAL_ResultCode_DivideByZero; + goto done; + } } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -283,7 +299,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ } } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -295,7 +311,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = svals[0].u64 << svals[1].u64; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -309,7 +325,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = svals[0].s64 >> svals[1].u64; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -321,7 +337,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = svals[0].u64&svals[1].u64; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -333,7 +349,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = svals[0].u64|svals[1].u64; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -345,7 +361,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = svals[0].u64^svals[1].u64; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -357,7 +373,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = ~svals[0].u64; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -369,7 +385,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = (svals[0].u64 && svals[1].u64); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -381,7 +397,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = (svals[0].u64 || svals[1].u64); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -393,7 +409,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = (!svals[0].u64); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -423,7 +439,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = (svals[0].s64 <= svals[1].s64); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -443,7 +459,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = (svals[0].s64 >= svals[1].s64); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -463,7 +479,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = (svals[0].s64 < svals[1].s64); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -483,7 +499,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval.u64 = (svals[0].s64 > svals[1].s64); } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOpTypes; goto done; } }break; @@ -573,7 +589,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ nval = stack[stack_count - imm - 1]; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOp; goto done; } }break; @@ -595,7 +611,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ } } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_BadOp; goto done; } }break; @@ -610,7 +626,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ stack_count += 1; } else{ - result.bad_eval = 1; + result.code = EVAL_ResultCode_InsufficientStackSpace; goto done; } } @@ -622,8 +638,8 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode){ if (stack_count == 1){ result.value = stack[0]; } - else{ - result.bad_eval = 1; + else if(result.code == EVAL_ResultCode_Good){ + result.code = EVAL_ResultCode_MalformedBytecode; } scratch_end(scratch); diff --git a/src/eval/eval_machine.h b/src/eval/eval_machine.h index b520629e..12b77b2f 100644 --- a/src/eval/eval_machine.h +++ b/src/eval/eval_machine.h @@ -10,7 +10,8 @@ typedef B32 EVAL_MemoryRead(void *u, void *out, U64 addr, U64 size); typedef struct EVAL_Machine EVAL_Machine; -struct EVAL_Machine{ +struct EVAL_Machine +{ void *u; Architecture arch; EVAL_MemoryRead *memory_read; @@ -22,7 +23,8 @@ struct EVAL_Machine{ }; typedef union EVAL_Slot EVAL_Slot; -union EVAL_Slot{ +union EVAL_Slot +{ U64 u256[4]; U64 u128[2]; U64 u64; @@ -32,9 +34,10 @@ union EVAL_Slot{ }; typedef struct EVAL_Result EVAL_Result; -struct EVAL_Result{ +struct EVAL_Result +{ EVAL_Slot value; - B32 bad_eval; + EVAL_ResultCode code; }; //////////////////////////////// diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 418412c8..c02d018d 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -6,6 +6,22 @@ #ifndef EVAL_META_H #define EVAL_META_H +typedef enum EVAL_ResultCode +{ +EVAL_ResultCode_Good, +EVAL_ResultCode_DivideByZero, +EVAL_ResultCode_BadOp, +EVAL_ResultCode_BadOpTypes, +EVAL_ResultCode_BadMemRead, +EVAL_ResultCode_BadRegRead, +EVAL_ResultCode_BadFrameBase, +EVAL_ResultCode_BadModuleBase, +EVAL_ResultCode_BadTLSBase, +EVAL_ResultCode_InsufficientStackSpace, +EVAL_ResultCode_MalformedBytecode, +EVAL_ResultCode_COUNT +} EVAL_ResultCode; + typedef U32 EVAL_ExprKind; enum { @@ -137,6 +153,21 @@ str8_lit_comp("Define"), str8_lit_comp("LeafIdent"), }; +String8 eval_result_code_display_strings[] = +{ +str8_lit_comp(""), +str8_lit_comp("Cannot divide by zero."), +str8_lit_comp("Invalid operation."), +str8_lit_comp("Invalid operation types."), +str8_lit_comp("Failed memory read."), +str8_lit_comp("Failed register read."), +str8_lit_comp("Invalid frame base address."), +str8_lit_comp("Invalid module base address."), +str8_lit_comp("Invalid thread-local storage base address."), +str8_lit_comp("Insufficient evaluation machine stack space."), +str8_lit_comp("Malformed bytecode."), +}; + String8 eval_expr_op_strings[] = { str8_lit_comp("[]"), From 77337f9e860cd32c473878932fded8c56e5e355a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 8 Feb 2024 10:37:08 -0800 Subject: [PATCH 014/275] use globals, thread-locals, types, procedures in default panel layout --- src/df/gfx/df_gfx.c | 56 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index d9e15664..bdff10c4 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -1249,6 +1249,10 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D DF_View *watch = &df_g_nil_view; DF_View *locals = &df_g_nil_view; DF_View *regs = &df_g_nil_view; + DF_View *globals = &df_g_nil_view; + DF_View *tlocals = &df_g_nil_view; + DF_View *types = &df_g_nil_view; + DF_View *procs = &df_g_nil_view; DF_View *callstack = &df_g_nil_view; DF_View *breakpoints = &df_g_nil_view; DF_View *watch_pins = &df_g_nil_view; @@ -1271,18 +1275,22 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D switch(view_kind) { default:{}break; - case DF_GfxViewKind_Watch: {if(df_view_is_nil(watch)) { needs_delete = 0; watch = view;} }break; - case DF_GfxViewKind_Locals: {if(df_view_is_nil(locals)) { needs_delete = 0; locals = view;} }break; - case DF_GfxViewKind_Registers: {if(df_view_is_nil(regs)) { needs_delete = 0; regs = view;} }break; - case DF_GfxViewKind_CallStack: {if(df_view_is_nil(callstack)) { needs_delete = 0; callstack = view;} }break; - case DF_GfxViewKind_Breakpoints:{if(df_view_is_nil(breakpoints)) { needs_delete = 0; breakpoints = view;} }break; - case DF_GfxViewKind_WatchPins: {if(df_view_is_nil(watch_pins)) { needs_delete = 0; watch_pins = view;} }break; - case DF_GfxViewKind_Output: {if(df_view_is_nil(output)) { needs_delete = 0; output = view;} }break; - case DF_GfxViewKind_Targets: {if(df_view_is_nil(targets)) { needs_delete = 0; targets = view;} }break; - case DF_GfxViewKind_Scheduler: {if(df_view_is_nil(scheduler)) { needs_delete = 0; scheduler = view;} }break; - case DF_GfxViewKind_Modules: {if(df_view_is_nil(modules)) { needs_delete = 0; modules = view;} }break; - case DF_GfxViewKind_Disassembly:{if(df_view_is_nil(disasm)) { needs_delete = 0; disasm = view;} }break; - case DF_GfxViewKind_Memory: {if(df_view_is_nil(memory)) { needs_delete = 0; memory = view;} }break; + case DF_GfxViewKind_Watch: {if(df_view_is_nil(watch)) { needs_delete = 0; watch = view;} }break; + case DF_GfxViewKind_Locals: {if(df_view_is_nil(locals)) { needs_delete = 0; locals = view;} }break; + case DF_GfxViewKind_Registers: {if(df_view_is_nil(regs)) { needs_delete = 0; regs = view;} }break; + case DF_GfxViewKind_Globals: {if(df_view_is_nil(globals)) { needs_delete = 0; globals = view;} }break; + case DF_GfxViewKind_ThreadLocals:{if(df_view_is_nil(tlocals)) { needs_delete = 0; tlocals = view;} }break; + case DF_GfxViewKind_Types: {if(df_view_is_nil(types)) { needs_delete = 0; types = view;} }break; + case DF_GfxViewKind_Procedures: {if(df_view_is_nil(procs)) { needs_delete = 0; procs = view;} }break; + case DF_GfxViewKind_CallStack: {if(df_view_is_nil(callstack)) { needs_delete = 0; callstack = view;} }break; + case DF_GfxViewKind_Breakpoints: {if(df_view_is_nil(breakpoints)) { needs_delete = 0; breakpoints = view;} }break; + case DF_GfxViewKind_WatchPins: {if(df_view_is_nil(watch_pins)) { needs_delete = 0; watch_pins = view;} }break; + case DF_GfxViewKind_Output: {if(df_view_is_nil(output)) { needs_delete = 0; output = view;} }break; + case DF_GfxViewKind_Targets: {if(df_view_is_nil(targets)) { needs_delete = 0; targets = view;} }break; + case DF_GfxViewKind_Scheduler: {if(df_view_is_nil(scheduler)) { needs_delete = 0; scheduler = view;} }break; + case DF_GfxViewKind_Modules: {if(df_view_is_nil(modules)) { needs_delete = 0; modules = view;} }break; + case DF_GfxViewKind_Disassembly: {if(df_view_is_nil(disasm)) { needs_delete = 0; disasm = view;} }break; + case DF_GfxViewKind_Memory: {if(df_view_is_nil(memory)) { needs_delete = 0; memory = view;} }break; case DF_GfxViewKind_Code: { needs_delete = 0; @@ -1328,6 +1336,26 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D regs = df_view_alloc(); df_view_equip_spec(regs, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Registers), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); } + if(df_view_is_nil(globals)) + { + globals = df_view_alloc(); + df_view_equip_spec(globals, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Globals), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); + } + if(df_view_is_nil(tlocals)) + { + tlocals = df_view_alloc(); + df_view_equip_spec(tlocals, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_ThreadLocals), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); + } + if(df_view_is_nil(types)) + { + types = df_view_alloc(); + df_view_equip_spec(types, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Types), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); + } + if(df_view_is_nil(procs)) + { + procs = df_view_alloc(); + df_view_equip_spec(procs, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Procedures), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); + } if(df_view_is_nil(callstack)) { callstack = df_view_alloc(); @@ -1442,6 +1470,10 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, watch); df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, locals); df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, regs); + df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, globals); + df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, tlocals); + df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, types); + df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, procs); root_0_1_0->selected_tab_view = df_handle_from_view(watch); root_0_1_0->tab_side = Side_Max; df_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, callstack); From 11dd5fd21a47f8b3634b4e6892623d39fc0d025a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 8 Feb 2024 15:10:53 -0800 Subject: [PATCH 015/275] fix dragging interpretation in ui box -> signal path --- src/ui/ui_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index b55ff54b..4f4e7c51 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2614,7 +2614,8 @@ ui_signal_from_box(UI_Box *box) // for(EachEnumVal(UI_MouseButtonKind, k)) { - if(ui_key_match(ui_state->active_box_key[k], box->key)) + if(ui_key_match(ui_state->active_box_key[k], box->key) || + sig.f & (UI_SignalFlag_LeftPressed< Date: Thu, 8 Feb 2024 17:05:24 -0800 Subject: [PATCH 016/275] os_gfx_win32: fix preservation of sign info in x/y lparams for mouse events --- src/os/gfx/win32/os_gfx_win32.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/os/gfx/win32/os_gfx_win32.c b/src/os/gfx/win32/os_gfx_win32.c index a4d97f67..94d93f00 100644 --- a/src/os/gfx/win32/os_gfx_win32.c +++ b/src/os/gfx/win32/os_gfx_win32.c @@ -417,8 +417,8 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) event->key = OS_Key_RightMouseButton; }break; } - event->pos.x = (F32)LOWORD(lParam); - event->pos.y = (F32)HIWORD(lParam); + event->pos.x = (F32)(S16)LOWORD(lParam); + event->pos.y = (F32)(S16)HIWORD(lParam); if(release) { ReleaseCapture(); @@ -432,8 +432,8 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_MOUSEMOVE: { OS_Event *event = w32_push_event(OS_EventKind_MouseMove, window); - event->pos.x = (F32)LOWORD(lParam); - event->pos.y = (F32)HIWORD(lParam); + event->pos.x = (F32)(S16)LOWORD(lParam); + event->pos.y = (F32)(S16)HIWORD(lParam); }break; case WM_MOUSEWHEEL: @@ -441,8 +441,8 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) S16 wheel_delta = HIWORD(wParam); OS_Event *event = w32_push_event(OS_EventKind_Scroll, window); POINT p; - p.x = (S32)LOWORD(lParam); - p.y = (S32)HIWORD(lParam); + p.x = (S32)(S16)LOWORD(lParam); + p.y = (S32)(S16)HIWORD(lParam); ScreenToClient(window->hwnd, &p); event->pos.x = (F32)p.x; event->pos.y = (F32)p.y; @@ -454,8 +454,8 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) S16 wheel_delta = HIWORD(wParam); OS_Event *event = w32_push_event(OS_EventKind_Scroll, window); POINT p; - p.x = (S32)LOWORD(lParam); - p.y = (S32)HIWORD(lParam); + p.x = (S32)(S16)LOWORD(lParam); + p.y = (S32)(S16)HIWORD(lParam); ScreenToClient(window->hwnd, &p); event->pos.x = (F32)p.x; event->pos.y = (F32)p.y; From 2d63234c92e7dea861d08405c82e4e11a0d05ced Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 9 Feb 2024 11:50:04 -0800 Subject: [PATCH 017/275] eliminate static, absurdly large table sizes in all cases in pdb->raddbg path; markup & diagnostics of table sizes vs. counts, to begin gathering data for table size prediction path --- project.4coder | 22 +++++++++- src/raddbg_cons/raddbg_cons.c | 38 +++++++++++++---- src/raddbg_cons/raddbg_cons.h | 14 +++++-- src/raddbg_convert/pdb/raddbg_from_pdb.c | 52 ++++++++++++++++++++---- src/raddbg_convert/pdb/raddbg_from_pdb.h | 16 ++++++-- 5 files changed, 118 insertions(+), 24 deletions(-) diff --git a/project.4coder b/project.4coder index 0c9adfff..d096ed67 100644 --- a/project.4coder +++ b/project.4coder @@ -56,7 +56,7 @@ commands = }, .rjf_f2 = { - .win = "build raddbg_from_pdb", + .win = "build raddbg_from_pdb telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, @@ -72,6 +72,24 @@ commands = .save_dirty_files = true, .cursor_at_end = false, }, + .rjf_f4 = + { + .win = "build raddbg_from_pdb release telemetry && pushd build && raddbg_from_pdb.exe --exe:mule_main.exe --pdb:mule_main.pdb --out:mule_main.raddbg --capture && popd", + .linux = "", + .out = "*compilation*", + .footer_panel = true, + .save_dirty_files = true, + .cursor_at_end = false, + }, + .rjf_f5 = + { + .win = "pushd build && raddbg_from_pdb.exe --exe:mule_main.exe --pdb:mule_main.pdb --out:mule_main.raddbg --capture && popd", + .linux = "", + .out = "*compilation*", + .footer_panel = true, + .save_dirty_files = true, + .cursor_at_end = false, + }, .build_raddbg = { .win = "build raddbg", @@ -141,5 +159,7 @@ fkey_command_override = .F1 = "rjf_f1", .F2 = "rjf_f2", .F3 = "rjf_f3", + .F4 = "rjf_f4", + .F5 = "rjf_f5", }, }; diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index 6e2214db..5f65074e 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -7,7 +7,7 @@ //- init static CONS_Root* cons_root_new(CONS_RootParams *params){ - Arena *arena = arena_alloc__sized(GB(64), MB(256)); + Arena *arena = arena_alloc__sized(GB(64), MB(64)); CONS_Root *result = push_array(arena, CONS_Root, 1); result->arena = arena; @@ -49,6 +49,7 @@ cons_root_new(CONS_RootParams *params){ cons__u64toptr_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); cons__u64toptr_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); cons__u64toptr_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); + cons__str8toptr_init(arena, &result->construct_map, 4096); #undef BKTCOUNT } @@ -1336,6 +1337,7 @@ cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id){ static void cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info){ + ProfBeginFunction(); CONS_SymbolKind kind = info->kind; if (symbol->kind != CONS_SymbolKind_NULL){ @@ -1408,7 +1410,8 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Procedures); }break; } - if (map != 0){ + if(map != 0) ProfScope("save name map") + { cons__name_map_add_pair(root, map, symbol->name, symbol->idx); } } @@ -1419,6 +1422,7 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info cons__name_map_add_pair(root, map, symbol->link_name, symbol->idx); } } + ProfEnd(); } // scopes @@ -1697,12 +1701,14 @@ cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type){ static void cons__scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol){ + ProfBeginFunction(); scope->symbol = symbol; for (CONS_Scope *node = scope->first_child; node != 0; node = node->next_sibling){ cons__scope_recursive_set_symbol(node, symbol); } + ProfEnd(); } // name maps @@ -1713,6 +1719,8 @@ cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind){ if (kind < RADDBG_NameMapKind_COUNT){ if (root->name_maps[kind] == 0){ root->name_maps[kind] = push_array(root->arena, CONS__NameMap, 1); + root->name_maps[kind]->buckets_count = 16384; + root->name_maps[kind]->buckets = push_array(root->arena, CONS__NameMapNode *, root->name_maps[kind]->buckets_count); } result = root->name_maps[kind]; } @@ -1721,9 +1729,11 @@ cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind){ static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 idx){ + ProfBeginFunction(); + // hash U64 hash = raddbg_hash(string.str, string.size); - U64 bucket_idx = hash%ArrayCount(map->buckets); + U64 bucket_idx = hash%map->buckets_count; // find existing name node CONS__NameMapNode *match = 0; @@ -1774,6 +1784,8 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 idx_node->idx[insert_i] = idx; match->idx_count += 1; } + + ProfEnd(); } // u64 to ptr map @@ -1830,11 +1842,18 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, // str8 to ptr map +static void +cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count) +{ + map->buckets_count = bucket_count; + map->buckets = push_array(arena, CONS__Str8ToPtrNode*, map->buckets_count); +} + static void* cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash){ ProfBeginFunction(); void *result = 0; - U64 bucket_idx = hash%ArrayCount(map->buckets); + U64 bucket_idx = hash%map->buckets_count; for (CONS__Str8ToPtrNode *node = map->buckets[bucket_idx]; node != 0; node = node->next){ @@ -1850,7 +1869,7 @@ cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash){ static void cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 hash, void *ptr){ ProfBeginFunction(); - U64 bucket_idx = hash%ArrayCount(map->buckets); + U64 bucket_idx = hash%map->buckets_count; CONS__Str8ToPtrNode *node = push_array(arena, CONS__Str8ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); @@ -1858,6 +1877,7 @@ cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 h node->key = push_str8_copy(arena, key); node->hash = hash; node->ptr = ptr; + map->pair_count += 1; ProfEnd(); } @@ -1883,6 +1903,10 @@ cons__bake_ctx_begin(void){ Arena *arena = arena_alloc(); CONS__BakeCtx *result = push_array(arena, CONS__BakeCtx, 1); result->arena = arena; + result->strs.buckets_count = 16384; + result->strs.buckets = push_array(arena, CONS__StringNode *, result->strs.buckets_count); + result->idxs.buckets_count = 16384; + result->idxs.buckets = push_array(arena, CONS__IdxRunNode *, result->idxs.buckets_count); cons__string(result, str8_lit("")); @@ -1913,7 +1937,7 @@ cons__string(CONS__BakeCtx *bctx, String8 str){ CONS__Strings *strs = &bctx->strs; U64 hash = raddbg_hash(str.str, str.size); - U64 bucket_idx = hash%ArrayCount(strs->buckets); + U64 bucket_idx = hash%strs->buckets_count; // look for a match CONS__StringNode *match = 0; @@ -1965,7 +1989,7 @@ cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count){ CONS__IdxRuns *idxs = &bctx->idxs; U64 hash = cons__idx_run_hash(idx_run, count); - U64 bucket_idx = hash%ArrayCount(idxs->buckets); + U64 bucket_idx = hash%idxs->buckets_count; // look for a match CONS__IdxRunNode *match = 0; diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index 3fcbca6e..1e8f91df 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -483,7 +483,8 @@ typedef struct CONS__NameMapNode{ } CONS__NameMapNode; typedef struct CONS__NameMap{ - CONS__NameMapNode *buckets[1<<24]; + CONS__NameMapNode **buckets; + U64 buckets_count; CONS__NameMapNode *first; CONS__NameMapNode *last; U64 name_count; @@ -529,9 +530,12 @@ typedef struct CONS__Str8ToPtrNode{ } CONS__Str8ToPtrNode; typedef struct CONS__Str8ToPtrMap{ - CONS__Str8ToPtrNode *buckets[1<<24]; + CONS__Str8ToPtrNode **buckets; + U64 buckets_count; + U64 pair_count; } CONS__Str8ToPtrMap; +static void cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count); static void*cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash); static void cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 hash, void *ptr); @@ -640,7 +644,8 @@ typedef struct CONS__StringNode{ typedef struct CONS__Strings{ CONS__StringNode *order_first; CONS__StringNode *order_last; - CONS__StringNode *buckets[1<<24]; + CONS__StringNode **buckets; + U64 buckets_count; U32 count; } CONS__Strings; @@ -657,7 +662,8 @@ typedef struct CONS__IdxRunNode{ typedef struct CONS__IdxRuns{ CONS__IdxRunNode *order_first; CONS__IdxRunNode *order_last; - CONS__IdxRunNode *buckets[1<<24]; + CONS__IdxRunNode **buckets; + U64 buckets_count; U32 count; U32 idx_count; } CONS__IdxRuns; diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 46eeb0d4..16a7462f 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -151,6 +151,14 @@ pdbconv_types_and_symbols(PDBCONV_TypesSymbolsParams *params, CONS_Root *out_roo pdb_ctx->section_count = params->sections->count; pdb_ctx->root = out_root; pdb_ctx->temp_arena = arena_alloc(); + pdb_ctx->fwd_map.buckets_count = 16384; + pdb_ctx->fwd_map.buckets = push_array(pdb_ctx->temp_arena, PDBCONV_FwdNode *, pdb_ctx->fwd_map.buckets_count); + pdb_ctx->frame_proc_map.buckets_count = 16384; + pdb_ctx->frame_proc_map.buckets = push_array(pdb_ctx->temp_arena, PDBCONV_FrameProcNode *, pdb_ctx->frame_proc_map.buckets_count); + pdb_ctx->known_globals.buckets_count = 16384; + pdb_ctx->known_globals.buckets = push_array(pdb_ctx->temp_arena, PDBCONV_KnownGlobalNode *, pdb_ctx->known_globals.buckets_count); + pdb_ctx->link_names.buckets_count = 16384; + pdb_ctx->link_names.buckets = push_array(pdb_ctx->temp_arena, PDBCONV_LinkNameNode *, pdb_ctx->link_names.buckets_count); // convert types pdbconv_type_cons_main_passes(pdb_ctx); @@ -1733,7 +1741,7 @@ pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name){ static void pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_TypeId val){ - U64 bucket_idx = key%ArrayCount(map->buckets); + U64 bucket_idx = key%map->buckets_count; // search for an existing match PDBCONV_FwdNode *match = 0; @@ -1751,6 +1759,7 @@ pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_Ty match = push_array(arena, PDBCONV_FwdNode, 1); SLLStackPush(map->buckets[bucket_idx], match); match->key = key; + map->pair_count += 1; } // set node's val @@ -1760,7 +1769,7 @@ pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_Ty static CV_TypeId pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key){ ProfBeginFunction(); - U64 bucket_idx = key%ArrayCount(map->buckets); + U64 bucket_idx = key%map->buckets_count; // search for an existing match PDBCONV_FwdNode *match = 0; @@ -1880,6 +1889,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ default:break; case CV_SymKind_END: + ProfScope("CV_SymKind_END") { // pop scope stack pdbconv_symbol_pop_scope(ctx); @@ -1888,6 +1898,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_FRAMEPROC: + ProfScope("CV_SymKind_FRAMEPROC") { if (sizeof(CV_SymFrameproc) > cap){ // TODO(allen): error @@ -1898,6 +1909,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_BLOCK32: + ProfScope("CV_SymKind_BLOCK32") { if (sizeof(CV_SymBlock32) > cap){ // TODO(allen): error @@ -1923,6 +1935,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_LDATA32: case CV_SymKind_GDATA32: + ProfScope("CV_SymKind_LDATA32/CV_SymKind_GDATA32") { if (sizeof(CV_SymData32) > cap){ // TODO(allen): error @@ -1984,6 +1997,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_LPROC32: case CV_SymKind_GPROC32: + ProfScope("CV_SymKind_LPROC32/CV_SymKind_GPROC32") { if (sizeof(CV_SymProc32) > cap){ // TODO(allen): error @@ -2061,6 +2075,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_REGREL32: + ProfScope("CV_SymKind_REGREL32") { if (sizeof(CV_SymRegrel32) > cap){ // TODO(allen): error @@ -2159,6 +2174,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_LTHREAD32: case CV_SymKind_GTHREAD32: + ProfScope("CV_SymKind_LTHREAD32/CV_SymKind_GTHREAD32") { if (sizeof(CV_SymThread32) > cap){ // TODO(allen): error @@ -2210,6 +2226,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_LOCAL: + ProfScope("CV_SymKind_LOCAL") { if (sizeof(CV_SymLocal) > cap){ // TODO(allen): error @@ -2264,6 +2281,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_REGISTER: + ProfScope("CV_SymKind_DEFRANGE_REGISTER") { if (sizeof(CV_SymDefrangeRegister) > cap){ // TODO(allen): error @@ -2296,6 +2314,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: + ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL") { if (sizeof(CV_SymDefrangeFramepointerRel) > cap){ // TODO(allen): error @@ -2335,6 +2354,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: + ProfScope("CV_SymKind_DEFRANGE_SUBFIELD_REGISTER") { if (sizeof(CV_SymDefrangeSubfieldRegister) > cap){ // TODO(allen): error @@ -2371,6 +2391,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: + ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE") { if (sizeof(CV_SymDefrangeFramepointerRelFullScope) > cap){ // TODO(allen): error @@ -2406,6 +2427,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_REGISTER_REL: + ProfScope("CV_SymKind_DEFRANGE_REGISTER_REL") { if (sizeof(CV_SymDefrangeRegisterRel) > cap){ // TODO(allen): error @@ -2447,6 +2469,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_FILESTATIC: + ProfScope("CV_SymKind_FILESTATIC") { if (sizeof(CV_SymFileStatic) > cap){ // TODO(allen): error @@ -2541,9 +2564,10 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym){ static void pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,CONS_Symbol *key,PDBCONV_FrameProcData *data){ + ProfBeginFunction(); U64 key_int = IntFromPtr(key); PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; - U32 bucket_idx = key_int%ArrayCount(map->buckets); + U32 bucket_idx = key_int%map->buckets_count; // find match PDBCONV_FrameProcNode *match = 0; @@ -2567,14 +2591,17 @@ pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,CONS_Symbol *key,PDBCONV_FrameP SLLStackPush(map->buckets[bucket_idx], match); match->key = key; MemoryCopyStruct(&match->data, data); + map->pair_count += 1; } + ProfEnd(); } static PDBCONV_FrameProcData* pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, CONS_Symbol *key){ + ProfBeginFunction(); U64 key_int = IntFromPtr(key); PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; - U32 bucket_idx = key_int%ArrayCount(map->buckets); + U32 bucket_idx = key_int%map->buckets_count; // find match PDBCONV_FrameProcData *result = 0; @@ -2587,6 +2614,7 @@ pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, CONS_Symbol *key){ } } + ProfEnd(); return(result); } @@ -2661,8 +2689,9 @@ pdbconv_known_global_hash(String8 name, U64 voff){ static B32 pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff){ + ProfBeginFunction(); U64 hash = pdbconv_known_global_hash(name, voff); - U64 bucket_idx = hash%ArrayCount(set->buckets); + U64 bucket_idx = hash%set->buckets_count; PDBCONV_KnownGlobalNode *match = 0; for (PDBCONV_KnownGlobalNode *node = set->buckets[bucket_idx]; @@ -2677,13 +2706,15 @@ pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff) } B32 result = (match != 0); + ProfEnd(); return(result); } static void pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 name, U64 voff){ + ProfBeginFunction(); U64 hash = pdbconv_known_global_hash(name, voff); - U64 bucket_idx = hash%ArrayCount(set->buckets); + U64 bucket_idx = hash%set->buckets_count; PDBCONV_KnownGlobalNode *match = 0; for (PDBCONV_KnownGlobalNode *node = set->buckets[bucket_idx]; @@ -2703,7 +2734,9 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n node->key_name = push_str8_copy(arena, name); node->key_voff = voff; node->hash = hash; + set->global_count += 1; } + ProfEnd(); } // location info helpers @@ -2843,18 +2876,20 @@ pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, static void pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, U64 voff, String8 name){ U64 hash = (voff >> 3) ^ ((7 & voff) << 6); - U64 bucket_idx = hash%ArrayCount(map->buckets); + U64 bucket_idx = hash%map->buckets_count; PDBCONV_LinkNameNode *node = push_array(arena, PDBCONV_LinkNameNode, 1); SLLStackPush(map->buckets[bucket_idx], node); node->voff = voff; node->name = push_str8_copy(arena, name); + map->link_name_count += 1; } static String8 pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff){ + ProfBeginFunction(); U64 hash = (voff >> 3) ^ ((7 & voff) << 6); - U64 bucket_idx = hash%ArrayCount(map->buckets); + U64 bucket_idx = hash%map->buckets_count; String8 result = {0}; for (PDBCONV_LinkNameNode *node = map->buckets[bucket_idx]; @@ -2866,6 +2901,7 @@ pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff){ } } + ProfEnd(); return(result); } diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.h b/src/raddbg_convert/pdb/raddbg_from_pdb.h index c4e8e9e6..e911afcf 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.h +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.h @@ -53,7 +53,9 @@ typedef struct PDBCONV_FwdNode{ } PDBCONV_FwdNode; typedef struct PDBCONV_FwdMap{ - PDBCONV_FwdNode *buckets[1<<24]; + PDBCONV_FwdNode **buckets; + U64 buckets_count; + U64 pair_count; } PDBCONV_FwdMap; typedef struct PDBCONV_TypeRev{ @@ -74,7 +76,9 @@ typedef struct PDBCONV_FrameProcNode{ } PDBCONV_FrameProcNode; typedef struct PDBCONV_FrameProcMap{ - PDBCONV_FrameProcNode *buckets[1<<24]; + PDBCONV_FrameProcNode **buckets; + U64 buckets_count; + U64 pair_count; } PDBCONV_FrameProcMap; typedef struct PDBCONV_ScopeNode{ @@ -91,7 +95,9 @@ typedef struct PDBCONV_KnownGlobalNode{ } PDBCONV_KnownGlobalNode; typedef struct PDBCONV_KnownGlobalSet{ - PDBCONV_KnownGlobalNode *buckets[1<<24]; + PDBCONV_KnownGlobalNode **buckets; + U64 buckets_count; + U64 global_count; } PDBCONV_KnownGlobalSet; typedef struct PDBCONV_TypesSymbolsParams{ @@ -111,7 +117,9 @@ typedef struct PDBCONV_LinkNameNode{ } PDBCONV_LinkNameNode; typedef struct PDBCONV_LinkNameMap{ - PDBCONV_LinkNameNode *buckets[1<<24]; + PDBCONV_LinkNameNode **buckets; + U64 buckets_count; + U64 link_name_count; } PDBCONV_LinkNameMap; typedef struct PDBCONV_Ctx{ From cdb53ebed0635d379cc4584615d5fc9a911276ab Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 9 Feb 2024 12:54:51 -0800 Subject: [PATCH 018/275] pdb -> raddbg table diagnostic dumping --- src/raddbg_cons/raddbg_cons.c | 8 +- src/raddbg_cons/raddbg_cons.h | 3 +- src/raddbg_convert/pdb/raddbg_from_pdb.c | 377 +++++++++++++---------- src/raddbg_convert/pdb/raddbg_from_pdb.h | 1 + 4 files changed, 214 insertions(+), 175 deletions(-) diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index 5f65074e..c0435738 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -1794,13 +1794,13 @@ static void cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count){ Assert(IsPow2OrZero(bucket_count) && bucket_count > 0); map->buckets = push_array(arena, CONS__U64ToPtrNode*, bucket_count); - map->bucket_count = bucket_count; + map->buckets_count = bucket_count; } static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, CONS__U64ToPtrLookup *lookup_out){ ProfBeginFunction(); - U64 bucket_idx = key&(map->bucket_count - 1); + U64 bucket_idx = key&(map->buckets_count - 1); CONS__U64ToPtrNode *check_node = map->buckets[bucket_idx]; for (;check_node != 0; check_node = check_node->next){ for (U32 k = 0; k < ArrayCount(check_node->key); k += 1){ @@ -1828,7 +1828,7 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, node->ptr[k] = ptr; } else{ - U64 bucket_idx = key&(map->bucket_count - 1); + U64 bucket_idx = key&(map->buckets_count - 1); CONS__U64ToPtrNode *node = push_array(arena, CONS__U64ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); @@ -1837,6 +1837,8 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, lookup->fill_node = node; lookup->fill_k = 0; + + map->pair_count += 1; } } diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index 1e8f91df..0510725a 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -504,7 +504,8 @@ typedef struct CONS__U64ToPtrNode{ typedef struct CONS__U64ToPtrMap{ CONS__U64ToPtrNode **buckets; - U64 bucket_count; + U64 buckets_count; + U64 pair_count; } CONS__U64ToPtrMap; typedef struct CONS__U64ToPtrLookup{ diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 16a7462f..af2f94fc 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -123,6 +123,9 @@ pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ else if (str8_match(node->string, str8_lit("contributions"), 0)){ result->dump_contributions = 1; } + else if (str8_match(node->string, str8_lit("table_diagnostics"), 0)){ + result->dump_table_diagnostics = 1; + } } } } @@ -3128,177 +3131,6 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ exe_hash = raddbg_hash(params->input_exe_data.str, params->input_exe_data.size); } - // dump - if (params->dump) ProfScope("dump"){ - String8List dump = {0}; - - // EXE - if (out->good_parse){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "EXE INFO:\n")); - { - str8_list_pushf(arena, &dump, "HASH: %016llX\n", exe_hash); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // MSF - if (params->dump_msf){ - if (msf != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "MSF:\n")); - - str8_list_pushf(arena, &dump, " block_size=%llu\n", msf->block_size); - str8_list_pushf(arena, &dump, " block_count=%llu\n", msf->block_count); - str8_list_pushf(arena, &dump, " stream_count=%llu\n", msf->stream_count); - - String8 *stream_ptr = msf->streams; - U64 stream_count = msf->stream_count; - for (U64 i = 0; i < stream_count; i += 1, stream_ptr += 1){ - str8_list_pushf(arena, &dump, " stream[%u].size=%llu\n", - i, stream_ptr->size); - } - - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // DBI - if (params->dump_sym){ - if (sym != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DBI SYM:\n")); - cv_stringize_sym_parsed(arena, &dump, sym); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // TPI - if (params->dump_tpi_hash){ - if (tpi_hash != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "TPI HASH:\n")); - pdb_stringize_tpi_hash(arena, &dump, tpi_hash); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - if (ipi_hash != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "IPI HASH:\n")); - pdb_stringize_tpi_hash(arena, &dump, ipi_hash); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // LEAF - if (params->dump_leaf){ - if (tpi_leaf != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "TPI LEAF:\n")); - cv_stringize_leaf_parsed(arena, &dump, tpi_leaf); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - if (ipi_leaf != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "IPI LEAF:\n")); - cv_stringize_leaf_parsed(arena, &dump, ipi_leaf); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // BINARY SECTIONS - if (params->dump_coff_sections){ - if (coff_sections != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "COFF SECTIONS:\n")); - COFF_SectionHeader *section_ptr = coff_sections->sections; - for (U64 i = 0; i < coff_section_count; i += 1, section_ptr += 1){ - // TODO(allen): probably should pull this out into a separate stringize path - // for the coff section type - char *first = (char*)section_ptr->name; - char *opl = first + sizeof(section_ptr->name); - String8 name = str8_cstring_capped(first, opl); - str8_list_pushf(arena, &dump, " %.*s:\n", str8_varg(name)); - str8_list_pushf(arena, &dump, " vsize=%u\n", section_ptr->vsize); - str8_list_pushf(arena, &dump, " voff =0x%x\n", section_ptr->voff); - str8_list_pushf(arena, &dump, " fsize=%u\n", section_ptr->fsize); - str8_list_pushf(arena, &dump, " foff =0x%x\n", section_ptr->foff); - str8_list_pushf(arena, &dump, " relocs_foff=0x%x\n", section_ptr->relocs_foff); - str8_list_pushf(arena, &dump, " lines_foff =0x%x\n", section_ptr->lines_foff); - str8_list_pushf(arena, &dump, " reloc_count=%u\n", section_ptr->reloc_count); - str8_list_pushf(arena, &dump, " line_count =%u\n", section_ptr->line_count); - // TODO(allen): better flags - str8_list_pushf(arena, &dump, " flags=%x\n", section_ptr->flags); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - } - - // UNITS - if (comp_units != 0){ - B32 dump_sym = params->dump_sym; - B32 dump_c13 = params->dump_c13; - - B32 dump_units = (dump_sym || dump_c13); - - if (dump_units){ - PDB_CompUnit **unit_ptr = comp_units->units; - for (U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n")); - String8 name = (*unit_ptr)->obj_name; - String8 group_name = (*unit_ptr)->group_name; - str8_list_pushf(arena, &dump, "[%llu] %.*s\n(%.*s):\n", - i, str8_varg(name), str8_varg(group_name)); - if (dump_sym){ - cv_stringize_sym_parsed(arena, &dump, sym_for_unit[i]); - } - if (dump_c13){ - cv_stringize_c13_parsed(arena, &dump, c13_for_unit[i]); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - } - - // UNIT CONTRIBUTIONS - if (comp_unit_contributions != 0){ - if (params->dump_contributions){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "UNIT CONTRIBUTIONS:\n")); - PDB_CompUnitContribution *contrib_ptr = comp_unit_contributions->contributions; - for (U64 i = 0; i < comp_unit_contribution_count; i += 1, contrib_ptr += 1){ - str8_list_pushf(arena, &dump, - " { mod = %5u; voff_first = %08llx; voff_opl = %08llx; }\n", - contrib_ptr->mod, contrib_ptr->voff_first, contrib_ptr->voff_opl); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - out->dump = dump; - } - // output generation if (params->output_name.size > 0){ @@ -3518,5 +3350,208 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } } + // dump + if (params->dump) ProfScope("dump"){ + String8List dump = {0}; + + // EXE + if (out->good_parse){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "EXE INFO:\n")); + { + str8_list_pushf(arena, &dump, "HASH: %016llX\n", exe_hash); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + // MSF + if (params->dump_msf){ + if (msf != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "MSF:\n")); + + str8_list_pushf(arena, &dump, " block_size=%llu\n", msf->block_size); + str8_list_pushf(arena, &dump, " block_count=%llu\n", msf->block_count); + str8_list_pushf(arena, &dump, " stream_count=%llu\n", msf->stream_count); + + String8 *stream_ptr = msf->streams; + U64 stream_count = msf->stream_count; + for (U64 i = 0; i < stream_count; i += 1, stream_ptr += 1){ + str8_list_pushf(arena, &dump, " stream[%u].size=%llu\n", + i, stream_ptr->size); + } + + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + // DBI + if (params->dump_sym){ + if (sym != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DBI SYM:\n")); + cv_stringize_sym_parsed(arena, &dump, sym); + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + // TPI + if (params->dump_tpi_hash){ + if (tpi_hash != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "TPI HASH:\n")); + pdb_stringize_tpi_hash(arena, &dump, tpi_hash); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + if (ipi_hash != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "IPI HASH:\n")); + pdb_stringize_tpi_hash(arena, &dump, ipi_hash); + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + // LEAF + if (params->dump_leaf){ + if (tpi_leaf != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "TPI LEAF:\n")); + cv_stringize_leaf_parsed(arena, &dump, tpi_leaf); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + if (ipi_leaf != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "IPI LEAF:\n")); + cv_stringize_leaf_parsed(arena, &dump, ipi_leaf); + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + // BINARY SECTIONS + if (params->dump_coff_sections){ + if (coff_sections != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "COFF SECTIONS:\n")); + COFF_SectionHeader *section_ptr = coff_sections->sections; + for (U64 i = 0; i < coff_section_count; i += 1, section_ptr += 1){ + // TODO(allen): probably should pull this out into a separate stringize path + // for the coff section type + char *first = (char*)section_ptr->name; + char *opl = first + sizeof(section_ptr->name); + String8 name = str8_cstring_capped(first, opl); + str8_list_pushf(arena, &dump, " %.*s:\n", str8_varg(name)); + str8_list_pushf(arena, &dump, " vsize=%u\n", section_ptr->vsize); + str8_list_pushf(arena, &dump, " voff =0x%x\n", section_ptr->voff); + str8_list_pushf(arena, &dump, " fsize=%u\n", section_ptr->fsize); + str8_list_pushf(arena, &dump, " foff =0x%x\n", section_ptr->foff); + str8_list_pushf(arena, &dump, " relocs_foff=0x%x\n", section_ptr->relocs_foff); + str8_list_pushf(arena, &dump, " lines_foff =0x%x\n", section_ptr->lines_foff); + str8_list_pushf(arena, &dump, " reloc_count=%u\n", section_ptr->reloc_count); + str8_list_pushf(arena, &dump, " line_count =%u\n", section_ptr->line_count); + // TODO(allen): better flags + str8_list_pushf(arena, &dump, " flags=%x\n", section_ptr->flags); + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + } + + // UNITS + if (comp_units != 0){ + B32 dump_sym = params->dump_sym; + B32 dump_c13 = params->dump_c13; + + B32 dump_units = (dump_sym || dump_c13); + + if (dump_units){ + PDB_CompUnit **unit_ptr = comp_units->units; + for (U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n")); + String8 name = (*unit_ptr)->obj_name; + String8 group_name = (*unit_ptr)->group_name; + str8_list_pushf(arena, &dump, "[%llu] %.*s\n(%.*s):\n", + i, str8_varg(name), str8_varg(group_name)); + if (dump_sym){ + cv_stringize_sym_parsed(arena, &dump, sym_for_unit[i]); + } + if (dump_c13){ + cv_stringize_c13_parsed(arena, &dump, c13_for_unit[i]); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + } + + // UNIT CONTRIBUTIONS + if (comp_unit_contributions != 0){ + if (params->dump_contributions){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "UNIT CONTRIBUTIONS:\n")); + PDB_CompUnitContribution *contrib_ptr = comp_unit_contributions->contributions; + for (U64 i = 0; i < comp_unit_contribution_count; i += 1, contrib_ptr += 1){ + str8_list_pushf(arena, &dump, + " { mod = %5u; voff_first = %08llx; voff_opl = %08llx; }\n", + contrib_ptr->mod, contrib_ptr->voff_first, contrib_ptr->voff_opl); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + // rjf: dump table diagnostics + if(params->dump_table_diagnostics) + { + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "TABLE DIAGNOSTICS:\n")); + struct + { + String8 name; + U64 bucket_count; + U64 value_count; + } + table_info[] = + { + {str8_lit("unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count }, + {str8_lit("symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count }, + {str8_lit("scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count }, + {str8_lit("local_map"), out->root->local_map.buckets_count, out->root->local_map.pair_count }, + {str8_lit("type_from_id_map"), out->root->type_from_id_map.buckets_count, out->root->type_from_id_map.pair_count }, + {str8_lit("construct_map"), out->root->construct_map.buckets_count, out->root->construct_map.pair_count }, + }; + for(U64 idx = 0; idx < ArrayCount(table_info); idx += 1) + { + str8_list_pushf(arena, &dump, "%S: %I64u buckets, %I64u values\n", + table_info[idx].name, + table_info[idx].bucket_count, + table_info[idx].value_count); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + out->dump = dump; + } + return out; } diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.h b/src/raddbg_convert/pdb/raddbg_from_pdb.h index e911afcf..6ecff4b1 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.h +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.h @@ -32,6 +32,7 @@ typedef struct PDBCONV_Params{ B8 dump_leaf; B8 dump_c13; B8 dump_contributions; + B8 dump_table_diagnostics; B8 dump__last; String8List errors; From 44d9b57eb5e9e92aead85caae3c907a7c7923fff Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 9 Feb 2024 14:55:07 -0800 Subject: [PATCH 019/275] track bucket collision counts, include in table diagnostics dump; finish moving pdb->raddbg conversion tables over to dynamic & heuristically chosen table sizes --- project.4coder | 4 +- src/raddbg_cons/raddbg_cons.c | 92 ++++++------ src/raddbg_cons/raddbg_cons.h | 6 + src/raddbg_convert/pdb/raddbg_from_pdb.c | 133 +++++++++++------- src/raddbg_convert/pdb/raddbg_from_pdb.h | 31 +++- src/raddbg_convert/pdb/raddbg_from_pdb_main.c | 2 +- 6 files changed, 166 insertions(+), 102 deletions(-) diff --git a/project.4coder b/project.4coder index d096ed67..4464f716 100644 --- a/project.4coder +++ b/project.4coder @@ -74,7 +74,7 @@ commands = }, .rjf_f4 = { - .win = "build raddbg_from_pdb release telemetry && pushd build && raddbg_from_pdb.exe --exe:mule_main.exe --pdb:mule_main.pdb --out:mule_main.raddbg --capture && popd", + .win = "build raddbg_from_pdb release telemetry && pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --capture && popd", .linux = "", .out = "*compilation*", .footer_panel = true, @@ -83,7 +83,7 @@ commands = }, .rjf_f5 = { - .win = "pushd build && raddbg_from_pdb.exe --exe:mule_main.exe --pdb:mule_main.pdb --out:mule_main.raddbg --capture && popd", + .win = "pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --capture && popd", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index c0435738..10a27d52 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -49,7 +49,7 @@ cons_root_new(CONS_RootParams *params){ cons__u64toptr_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); cons__u64toptr_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); cons__u64toptr_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); - cons__str8toptr_init(arena, &result->construct_map, 4096); + cons__str8toptr_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); #undef BKTCOUNT } @@ -1753,6 +1753,7 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); SLLQueuePush_N(map->first, map->last, match, order_next); map->name_count += 1; + map->bucket_collision_count += (match->bucket_next != 0); } // find existing idx @@ -1839,6 +1840,7 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, lookup->fill_k = 0; map->pair_count += 1; + map->bucket_collision_count += (node->next != 0); } } @@ -1879,6 +1881,7 @@ cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 h node->key = push_str8_copy(arena, key); node->hash = hash; node->ptr = ptr; + map->bucket_collision_count += (node->next != 0); map->pair_count += 1; ProfEnd(); } @@ -1965,6 +1968,7 @@ cons__string(CONS__BakeCtx *bctx, String8 str){ SLLStackPush_N(strs->buckets[bucket_idx], node, bucket_next); match = node; + strs->bucket_collision_count += (node->bucket_next != 0); } // extract idx to return @@ -2033,6 +2037,7 @@ cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count){ SLLStackPush_N(idxs->buckets[bucket_idx], node, bucket_next); match = node; + idxs->bucket_collision_count += (node->bucket_next != 0); } // extract idx to return @@ -2430,57 +2435,60 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ // gather line number map CONS__SrcLineMapBucket *first_bucket = 0; CONS__SrcLineMapBucket *last_bucket = 0; - U64 line_count = 0; U64 voff_count = 0; U64 max_line_num = 0; - for (CONS__LineMapFragment *map_fragment = first; - map_fragment != 0; - map_fragment = map_fragment->next){ - CONS_LineSequence *sequence = &map_fragment->sequence->line_seq; - - U64 *seq_voffs = sequence->voffs; - U32 *seq_line_nums = sequence->line_nums; - U64 seq_line_count = sequence->line_count; - for (U64 i = 0; i < seq_line_count; i += 1){ - U32 line_num = seq_line_nums[i]; - U64 voff = seq_voffs[i]; + ProfScope("gather line number map") + { + for (CONS__LineMapFragment *map_fragment = first; + map_fragment != 0; + map_fragment = map_fragment->next){ + CONS_LineSequence *sequence = &map_fragment->sequence->line_seq; - // update unique voff counter & max line number - voff_count += 1; - max_line_num = Max(max_line_num, line_num); - - // find match - CONS__SrcLineMapBucket *match = 0; - for (CONS__SrcLineMapBucket *node = first_bucket; - node != 0; - node = node->next){ - if (node->line_num == line_num){ - match = node; - break; + U64 *seq_voffs = sequence->voffs; + U32 *seq_line_nums = sequence->line_nums; + U64 seq_line_count = sequence->line_count; + for (U64 i = 0; i < seq_line_count; i += 1){ + U32 line_num = seq_line_nums[i]; + U64 voff = seq_voffs[i]; + + // update unique voff counter & max line number + voff_count += 1; + max_line_num = Max(max_line_num, line_num); + + // find match + CONS__SrcLineMapBucket *match = 0; + for (CONS__SrcLineMapBucket *node = first_bucket; + node != 0; + node = node->next){ + if (node->line_num == line_num){ + match = node; + break; + } + } + + // introduce new line if no match + if (match == 0){ + match = push_array(scratch.arena, CONS__SrcLineMapBucket, 1); + SLLQueuePush(first_bucket, last_bucket, match); + match->line_num = line_num; + line_count += 1; + } + + // insert new voff + { + CONS__SrcLineMapVoffBlock *block = push_array(scratch.arena, CONS__SrcLineMapVoffBlock, 1); + SLLQueuePush(match->first_voff_block, match->last_voff_block, block); + match->voff_count += 1; + block->voff = voff; } - } - - // introduce new line if no match - if (match == 0){ - match = push_array(scratch.arena, CONS__SrcLineMapBucket, 1); - SLLQueuePush(first_bucket, last_bucket, match); - match->line_num = line_num; - line_count += 1; - } - - // insert new voff - { - CONS__SrcLineMapVoffBlock *block = push_array(scratch.arena, CONS__SrcLineMapVoffBlock, 1); - SLLQueuePush(match->first_voff_block, match->last_voff_block, block); - match->voff_count += 1; - block->voff = voff; } } } // bake sortable keys array CONS__SortKey *keys = push_array_no_zero(scratch.arena, CONS__SortKey, line_count); + ProfScope("bake sortable keys array") { CONS__SortKey *key_ptr = keys; for (CONS__SrcLineMapBucket *node = first_bucket; @@ -2498,7 +2506,7 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ U32 *line_nums = push_array_no_zero(arena, U32, line_count); U32 *line_ranges = push_array_no_zero(arena, U32, line_count + 1); U64 *voffs = push_array_no_zero(arena, U64, voff_count); - + ProfScope("bake result") { U64 *voff_ptr = voffs; for (U32 i = 0; i < line_count; i += 1){ diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index 0510725a..d51c5c7b 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -57,6 +57,7 @@ typedef struct CONS_RootParams{ U32 bucket_count_scopes; U32 bucket_count_locals; U32 bucket_count_types; + U64 bucket_count_type_constructs; } CONS_RootParams; static CONS_Root* cons_root_new(CONS_RootParams *params); @@ -485,6 +486,7 @@ typedef struct CONS__NameMapNode{ typedef struct CONS__NameMap{ CONS__NameMapNode **buckets; U64 buckets_count; + U64 bucket_collision_count; CONS__NameMapNode *first; CONS__NameMapNode *last; U64 name_count; @@ -505,6 +507,7 @@ typedef struct CONS__U64ToPtrNode{ typedef struct CONS__U64ToPtrMap{ CONS__U64ToPtrNode **buckets; U64 buckets_count; + U64 bucket_collision_count; U64 pair_count; } CONS__U64ToPtrMap; @@ -533,6 +536,7 @@ typedef struct CONS__Str8ToPtrNode{ typedef struct CONS__Str8ToPtrMap{ CONS__Str8ToPtrNode **buckets; U64 buckets_count; + U64 bucket_collision_count; U64 pair_count; } CONS__Str8ToPtrMap; @@ -647,6 +651,7 @@ typedef struct CONS__Strings{ CONS__StringNode *order_last; CONS__StringNode **buckets; U64 buckets_count; + U64 bucket_collision_count; U32 count; } CONS__Strings; @@ -665,6 +670,7 @@ typedef struct CONS__IdxRuns{ CONS__IdxRunNode *order_last; CONS__IdxRunNode **buckets; U64 buckets_count; + U64 bucket_collision_count; U32 count; U32 idx_count; } CONS__IdxRuns; diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index af2f94fc..0e2afe47 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -136,32 +136,40 @@ pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ //////////////////////////////// //~ PDB Type & Symbol Info Translation Helpers -//- pdb types and symbols +//- rjf: pdb conversion context creation -static void -pdbconv_types_and_symbols(PDBCONV_TypesSymbolsParams *params, CONS_Root *out_root){ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - // setup a pdb conversion context - PDBCONV_Ctx *pdb_ctx = push_array(scratch.arena, PDBCONV_Ctx, 1); - pdb_ctx->arch = params->architecture; - // TODO(allen): actually infer addr_size from arch - pdb_ctx->addr_size = 8; +static PDBCONV_Ctx * +pdbconv_ctx_alloc(PDBCONV_CtxParams *params, CONS_Root *out_root) +{ + Arena *arena = arena_alloc(); + PDBCONV_Ctx *pdb_ctx = push_array(arena, PDBCONV_Ctx, 1); + pdb_ctx->arena = arena; + pdb_ctx->arch = params->arch; + pdb_ctx->addr_size = raddbg_addr_size_from_arch(pdb_ctx->arch); pdb_ctx->hash = params->tpi_hash; pdb_ctx->leaf = params->tpi_leaf; pdb_ctx->sections = params->sections->sections; pdb_ctx->section_count = params->sections->count; pdb_ctx->root = out_root; - pdb_ctx->temp_arena = arena_alloc(); - pdb_ctx->fwd_map.buckets_count = 16384; - pdb_ctx->fwd_map.buckets = push_array(pdb_ctx->temp_arena, PDBCONV_FwdNode *, pdb_ctx->fwd_map.buckets_count); - pdb_ctx->frame_proc_map.buckets_count = 16384; - pdb_ctx->frame_proc_map.buckets = push_array(pdb_ctx->temp_arena, PDBCONV_FrameProcNode *, pdb_ctx->frame_proc_map.buckets_count); - pdb_ctx->known_globals.buckets_count = 16384; - pdb_ctx->known_globals.buckets = push_array(pdb_ctx->temp_arena, PDBCONV_KnownGlobalNode *, pdb_ctx->known_globals.buckets_count); - pdb_ctx->link_names.buckets_count = 16384; - pdb_ctx->link_names.buckets = push_array(pdb_ctx->temp_arena, PDBCONV_LinkNameNode *, pdb_ctx->link_names.buckets_count); +#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(4096)) + pdb_ctx->fwd_map.buckets_count = BKTCOUNT(params->fwd_map_bucket_count); + pdb_ctx->frame_proc_map.buckets_count = BKTCOUNT(params->frame_proc_map_bucket_count); + pdb_ctx->known_globals.buckets_count = BKTCOUNT(params->known_global_map_bucket_count); + pdb_ctx->link_names.buckets_count = BKTCOUNT(params->link_name_map_bucket_count); +#undef BKTCOUNT + pdb_ctx->fwd_map.buckets = push_array(pdb_ctx->arena, PDBCONV_FwdNode *, pdb_ctx->fwd_map.buckets_count); + pdb_ctx->frame_proc_map.buckets = push_array(pdb_ctx->arena, PDBCONV_FrameProcNode *, pdb_ctx->frame_proc_map.buckets_count); + pdb_ctx->known_globals.buckets = push_array(pdb_ctx->arena, PDBCONV_KnownGlobalNode *, pdb_ctx->known_globals.buckets_count); + pdb_ctx->link_names.buckets = push_array(pdb_ctx->arena, PDBCONV_LinkNameNode *, pdb_ctx->link_names.buckets_count); + return pdb_ctx; +} + +//- pdb types and symbols + +static void +pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *params) +{ + ProfBeginFunction(); // convert types pdbconv_type_cons_main_passes(pdb_ctx); @@ -175,7 +183,6 @@ pdbconv_types_and_symbols(PDBCONV_TypesSymbolsParams *params, CONS_Root *out_roo pdbconv_symbol_cons(pdb_ctx, unit_sym, 1 + i); } - scratch_end(scratch); ProfEnd(); } @@ -259,6 +266,7 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ static CV_TypeId pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ + ProfBeginFunction(); Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); CV_TypeId result = 0; @@ -399,9 +407,10 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ // save in map if (result != 0){ - pdbconv_type_fwd_map_set(ctx->temp_arena, &ctx->fwd_map, itype, result); + pdbconv_type_fwd_map_set(ctx->arena, &ctx->fwd_map, itype, result); } + ProfEnd(); return(result); } @@ -1394,7 +1403,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // remember to revisit this for members { - PDBCONV_TypeRev *rev = push_array(ctx->temp_arena, PDBCONV_TypeRev, 1); + PDBCONV_TypeRev *rev = push_array(ctx->arena, PDBCONV_TypeRev, 1); rev->owner_type = result; rev->field_itype = lf_struct->field_itype; SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); @@ -1447,7 +1456,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // remember to revisit this for members { - PDBCONV_TypeRev *rev = push_array(ctx->temp_arena, PDBCONV_TypeRev, 1); + PDBCONV_TypeRev *rev = push_array(ctx->arena, PDBCONV_TypeRev, 1); rev->owner_type = result; rev->field_itype = lf_struct->field_itype; SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); @@ -1487,7 +1496,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // remember to revisit this for members { - PDBCONV_TypeRev *rev = push_array(ctx->temp_arena, PDBCONV_TypeRev, 1); + PDBCONV_TypeRev *rev = push_array(ctx->arena, PDBCONV_TypeRev, 1); rev->owner_type = result; rev->field_itype = lf_union->field_itype; SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); @@ -1522,7 +1531,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // remember to revisit this for enumerates { - PDBCONV_TypeRev *rev = push_array(ctx->temp_arena, PDBCONV_TypeRev, 1); + PDBCONV_TypeRev *rev = push_array(ctx->arena, PDBCONV_TypeRev, 1); rev->owner_type = result; rev->field_itype = lf_enum->field_itype; SLLQueuePush(ctx->enum_revisit_first, ctx->enum_revisit_last, rev); @@ -1763,6 +1772,7 @@ pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_Ty SLLStackPush(map->buckets[bucket_idx], match); match->key = key; map->pair_count += 1; + map->bucket_collision_count += (match->next != 0); } // set node's val @@ -1958,7 +1968,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // * different symbol streams so we deduplicate across the // * entire translation context. if (!pdbconv_known_global_lookup(&ctx->known_globals, name, voff)){ - pdbconv_known_global_insert(ctx->temp_arena, &ctx->known_globals, name, voff); + pdbconv_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); // type of variable CONS_Type *type = pdbconv_type_resolve_itype(ctx, data32->itype); @@ -2555,7 +2565,7 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym){ } // save link name - pdbconv_link_name_save(ctx->temp_arena, &ctx->link_names, voff, name); + pdbconv_link_name_save(ctx->arena, &ctx->link_names, voff, name); } }break; } @@ -2590,11 +2600,12 @@ pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,CONS_Symbol *key,PDBCONV_FrameP // insert new association if no match if (match == 0){ - match = push_array(ctx->temp_arena, PDBCONV_FrameProcNode, 1); + match = push_array(ctx->arena, PDBCONV_FrameProcNode, 1); SLLStackPush(map->buckets[bucket_idx], match); match->key = key; MemoryCopyStruct(&match->data, data); map->pair_count += 1; + map->bucket_collision_count += (match->next != 0); } ProfEnd(); } @@ -2626,7 +2637,7 @@ static void pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, CONS_Scope *scope, CONS_Symbol *symbol){ PDBCONV_ScopeNode *node = ctx->scope_node_free; if (node == 0){ - node = push_array(ctx->temp_arena, PDBCONV_ScopeNode, 1); + node = push_array(ctx->arena, PDBCONV_ScopeNode, 1); } else{ SLLStackPop(ctx->scope_node_free); @@ -2738,6 +2749,7 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n node->key_voff = voff; node->hash = hash; set->global_count += 1; + set->bucket_collision_count += (node->next != 0); } ProfEnd(); } @@ -2751,6 +2763,7 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, U32 reg_byte_pos, S64 offset, B32 extra_indirection){ + ProfBeginFunction(); CONS_Location *result = 0; if (0 <= offset && offset <= (S64)max_U16){ if (extra_indirection){ @@ -2761,7 +2774,7 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, } } else{ - Arena *arena = ctx->temp_arena; + Arena *arena = ctx->arena; CONS_EvalBytecode bytecode = {0}; U32 regread_param = RADDBG_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); @@ -2775,6 +2788,7 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, result = cons_location_addr_bytecode_stream(ctx->root, &bytecode); } + ProfEnd(); return(result); } @@ -2886,6 +2900,7 @@ pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, U64 voff, String8 node->voff = voff; node->name = push_str8_copy(arena, name); map->link_name_count += 1; + map->bucket_collision_count += (node->next != 0); } static String8 @@ -3132,6 +3147,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // output generation + PDBCONV_Ctx *pdbconv_ctx = 0; if (params->output_name.size > 0){ // determine arch @@ -3190,6 +3206,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ root_params.bucket_count_scopes = symbol_count_prediction; root_params.bucket_count_locals = symbol_count_prediction; root_params.bucket_count_types = tpi->itype_opl; + root_params.bucket_count_type_constructs = tpi->itype_opl; CONS_Root *root = cons_root_new(&root_params); out->root = root; @@ -3324,22 +3341,31 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } } + // rjf: produce pdb conversion context + { + PDBCONV_CtxParams p = {0}; + { + p.arch = architecture; + p.tpi_hash = tpi_hash; + p.tpi_leaf = tpi_leaf; + p.sections = coff_sections; + p.fwd_map_bucket_count = tpi->itype_opl/10; + p.frame_proc_map_bucket_count = symbol_count_prediction; + p.known_global_map_bucket_count = symbol_count_prediction; + p.link_name_map_bucket_count = symbol_count_prediction; + } + pdbconv_ctx = pdbconv_ctx_alloc(&p, root); + } // types & symbols { - PDBCONV_TypesSymbolsParams pdb_params = {0}; - pdb_params.architecture = architecture; - pdb_params.sym = sym; - pdb_params.sym_for_unit = sym_for_unit; - pdb_params.unit_count = comp_unit_count; - pdb_params.tpi_hash = tpi_hash; - pdb_params.tpi_leaf = tpi_leaf; - pdb_params.sections = coff_sections; - - pdbconv_types_and_symbols(&pdb_params, root); + PDBCONV_TypesSymbolsParams p = {0}; + p.sym = sym; + p.sym_for_unit = sym_for_unit; + p.unit_count = comp_unit_count; + pdbconv_types_and_symbols(pdbconv_ctx, &p); } - // conversion errors if (!params->hide_errors.converting){ for (CONS_Error *error = cons_get_first_error(root); @@ -3530,22 +3556,29 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 name; U64 bucket_count; U64 value_count; + U64 collision_count; } table_info[] = { - {str8_lit("unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count }, - {str8_lit("symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count }, - {str8_lit("scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count }, - {str8_lit("local_map"), out->root->local_map.buckets_count, out->root->local_map.pair_count }, - {str8_lit("type_from_id_map"), out->root->type_from_id_map.buckets_count, out->root->type_from_id_map.pair_count }, - {str8_lit("construct_map"), out->root->construct_map.buckets_count, out->root->construct_map.pair_count }, + {str8_lit("pdbconv_ctx fwd_map"), pdbconv_ctx?pdbconv_ctx->fwd_map.buckets_count:0, pdbconv_ctx?pdbconv_ctx->fwd_map.pair_count:0, pdbconv_ctx?pdbconv_ctx->fwd_map.bucket_collision_count:0}, + {str8_lit("pdbconv_ctx frame_proc_map"), pdbconv_ctx?pdbconv_ctx->frame_proc_map.buckets_count:0, pdbconv_ctx?pdbconv_ctx->frame_proc_map.pair_count:0, pdbconv_ctx?pdbconv_ctx->frame_proc_map.bucket_collision_count:0}, + {str8_lit("pdbconv_ctx known_globals"), pdbconv_ctx?pdbconv_ctx->known_globals.buckets_count:0, pdbconv_ctx?pdbconv_ctx->known_globals.global_count:0, pdbconv_ctx?pdbconv_ctx->known_globals.bucket_collision_count:0}, + {str8_lit("pdbconv_ctx link_names"), pdbconv_ctx?pdbconv_ctx->link_names.buckets_count:0, pdbconv_ctx?pdbconv_ctx->link_names.link_name_count:0, pdbconv_ctx?pdbconv_ctx->link_names.bucket_collision_count:0}, + {str8_lit("cons_root unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count, out->root->unit_map.bucket_collision_count}, + {str8_lit("cons_root symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count, out->root->symbol_map.bucket_collision_count}, + {str8_lit("cons_root scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count, out->root->scope_map.bucket_collision_count}, + {str8_lit("cons_root local_map"), out->root->local_map.buckets_count, out->root->local_map.pair_count, out->root->local_map.bucket_collision_count}, + {str8_lit("cons_root type_from_id_map"), out->root->type_from_id_map.buckets_count, out->root->type_from_id_map.pair_count, out->root->type_from_id_map.bucket_collision_count}, + {str8_lit("cons_root construct_map"), out->root->construct_map.buckets_count, out->root->construct_map.pair_count, out->root->construct_map.bucket_collision_count}, }; for(U64 idx = 0; idx < ArrayCount(table_info); idx += 1) { - str8_list_pushf(arena, &dump, "%S: %I64u buckets, %I64u values\n", + str8_list_pushf(arena, &dump, "%S: %I64u values in %I64u buckets, with %I64u collisions (%f fill)\n", table_info[idx].name, + table_info[idx].value_count, table_info[idx].bucket_count, - table_info[idx].value_count); + table_info[idx].collision_count, + (F64)table_info[idx].value_count / (F64)table_info[idx].bucket_count); } str8_list_push(arena, &dump, str8_lit("\n")); } diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.h b/src/raddbg_convert/pdb/raddbg_from_pdb.h index 6ecff4b1..80aed6a1 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.h +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.h @@ -56,6 +56,7 @@ typedef struct PDBCONV_FwdNode{ typedef struct PDBCONV_FwdMap{ PDBCONV_FwdNode **buckets; U64 buckets_count; + U64 bucket_collision_count; U64 pair_count; } PDBCONV_FwdMap; @@ -79,6 +80,7 @@ typedef struct PDBCONV_FrameProcNode{ typedef struct PDBCONV_FrameProcMap{ PDBCONV_FrameProcNode **buckets; U64 buckets_count; + U64 bucket_collision_count; U64 pair_count; } PDBCONV_FrameProcMap; @@ -98,17 +100,27 @@ typedef struct PDBCONV_KnownGlobalNode{ typedef struct PDBCONV_KnownGlobalSet{ PDBCONV_KnownGlobalNode **buckets; U64 buckets_count; + U64 bucket_collision_count; U64 global_count; } PDBCONV_KnownGlobalSet; -typedef struct PDBCONV_TypesSymbolsParams{ - RADDBG_Arch architecture; - CV_SymParsed *sym; - CV_SymParsed **sym_for_unit; - U64 unit_count; +typedef struct PDBCONV_CtxParams PDBCONV_CtxParams; +struct PDBCONV_CtxParams +{ + RADDBG_Arch arch; PDB_TpiHashParsed *tpi_hash; CV_LeafParsed *tpi_leaf; PDB_CoffSectionArray *sections; + U64 fwd_map_bucket_count; + U64 frame_proc_map_bucket_count; + U64 known_global_map_bucket_count; + U64 link_name_map_bucket_count; +}; + +typedef struct PDBCONV_TypesSymbolsParams{ + CV_SymParsed *sym; + CV_SymParsed **sym_for_unit; + U64 unit_count; } PDBCONV_TypesSymbolsParams; typedef struct PDBCONV_LinkNameNode{ @@ -120,10 +132,13 @@ typedef struct PDBCONV_LinkNameNode{ typedef struct PDBCONV_LinkNameMap{ PDBCONV_LinkNameNode **buckets; U64 buckets_count; + U64 bucket_collision_count; U64 link_name_count; } PDBCONV_LinkNameMap; typedef struct PDBCONV_Ctx{ + Arena *arena; + // INPUT data RADDBG_Arch arch; U64 addr_size; @@ -136,7 +151,6 @@ typedef struct PDBCONV_Ctx{ CONS_Root *root; // TEMPORARY STATE - Arena *temp_arena; PDBCONV_FwdMap fwd_map; PDBCONV_TypeRev *member_revisit_first; PDBCONV_TypeRev *member_revisit_last; @@ -149,8 +163,11 @@ typedef struct PDBCONV_Ctx{ PDBCONV_LinkNameMap link_names; } PDBCONV_Ctx; +//- rjf: pdb conversion context creation +static PDBCONV_Ctx *pdbconv_ctx_alloc(PDBCONV_CtxParams *params, CONS_Root *out_root); + //- pdb types and symbols -static void pdbconv_types_and_symbols(PDBCONV_TypesSymbolsParams *params, CONS_Root *out_root); +static void pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *params); //- decoding helpers static U32 pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num); diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb_main.c b/src/raddbg_convert/pdb/raddbg_from_pdb_main.c index 2ce33e5c..ff1989a5 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb_main.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb_main.c @@ -41,7 +41,7 @@ main(int argc, char **argv){ local_persist TCTX main_thread_tctx = {0}; tctx_init_and_equip(&main_thread_tctx); #if PROFILE_TELEMETRY - U64 tm_data_size = GB(1); + U64 tm_data_size = MB(128); U8 *tm_data = os_reserve(tm_data_size); os_commit(tm_data, tm_data_size); tmLoadLibrary(TM_RELEASE); From 6c872566af3fde3bf6bcf9be4a81984980e280d4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 9 Feb 2024 15:31:24 -0800 Subject: [PATCH 020/275] raddbg_from_pdb: greatly improve speed of line info combining pass; do not linearly scan for line numbers, use line as hash -> slot key and search only slots --- src/raddbg_cons/raddbg_cons.c | 25 ++++++++++++++++--------- src/raddbg_cons/raddbg_cons.h | 3 ++- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index 10a27d52..c752ab0e 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -2435,6 +2435,8 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ // gather line number map CONS__SrcLineMapBucket *first_bucket = 0; CONS__SrcLineMapBucket *last_bucket = 0; + U64 line_hash_slots_count = 1024; + CONS__SrcLineMapBucket **line_hash_slots = push_array(scratch.arena, CONS__SrcLineMapBucket *, line_hash_slots_count); U64 line_count = 0; U64 voff_count = 0; U64 max_line_num = 0; @@ -2442,7 +2444,8 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ { for (CONS__LineMapFragment *map_fragment = first; map_fragment != 0; - map_fragment = map_fragment->next){ + map_fragment = map_fragment->next) + { CONS_LineSequence *sequence = &map_fragment->sequence->line_seq; U64 *seq_voffs = sequence->voffs; @@ -2451,6 +2454,7 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ for (U64 i = 0; i < seq_line_count; i += 1){ U32 line_num = seq_line_nums[i]; U64 voff = seq_voffs[i]; + U64 line_hash_slot_idx = line_num%line_hash_slots_count; // update unique voff counter & max line number voff_count += 1; @@ -2458,19 +2462,22 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ // find match CONS__SrcLineMapBucket *match = 0; - for (CONS__SrcLineMapBucket *node = first_bucket; - node != 0; - node = node->next){ - if (node->line_num == line_num){ - match = node; - break; + { + for (CONS__SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + node != 0; + node = node->hash_next){ + if (node->line_num == line_num){ + match = node; + break; + } } } // introduce new line if no match if (match == 0){ match = push_array(scratch.arena, CONS__SrcLineMapBucket, 1); - SLLQueuePush(first_bucket, last_bucket, match); + SLLQueuePush_N(first_bucket, last_bucket, match, order_next); + SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); match->line_num = line_num; line_count += 1; } @@ -2493,7 +2500,7 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ CONS__SortKey *key_ptr = keys; for (CONS__SrcLineMapBucket *node = first_bucket; node != 0; - node = node->next, key_ptr += 1){ + node = node->order_next, key_ptr += 1){ key_ptr->key = node->line_num; key_ptr->val = node; } diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index d51c5c7b..a84df50c 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -801,7 +801,8 @@ typedef struct CONS__SrcLineMapVoffBlock{ } CONS__SrcLineMapVoffBlock; typedef struct CONS__SrcLineMapBucket{ - struct CONS__SrcLineMapBucket *next; + struct CONS__SrcLineMapBucket *order_next; + struct CONS__SrcLineMapBucket *hash_next; U32 line_num; CONS__SrcLineMapVoffBlock *first_voff_block; CONS__SrcLineMapVoffBlock *last_voff_block; From ebfddabd0b34b3d1c134b9c4c331952960a7e96b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 9 Feb 2024 16:59:42 -0800 Subject: [PATCH 021/275] raddbg cons: extend u64 -> ptr map api with separate channel for hash, which reduces scan space, independently from unique keys which were previously assumed to be a reasonable hash (which they weren't) --- src/raddbg_cons/raddbg_cons.c | 34 +++++++++++++----------- src/raddbg_cons/raddbg_cons.h | 9 ++++--- src/raddbg_convert/pdb/raddbg_from_pdb.c | 9 ++++--- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index c752ab0e..445e1e1e 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -518,7 +518,7 @@ cons_add_binary_section(CONS_Root *root, String8 name, RADDBG_BinarySectionFlags static CONS_Unit* cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id){ CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->unit_map, unit_user_id, &lookup); + cons__u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id, &lookup); CONS_Unit *result = 0; if (lookup.match != 0){ @@ -529,7 +529,7 @@ cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id){ result->idx = root->unit_count; SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); root->unit_count += 1; - cons__u64toptr_insert(root->arena, &root->unit_map, unit_user_id, &lookup, result); + cons__u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); } return(result); @@ -590,7 +590,7 @@ cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl){ static CONS_Type* cons_type_from_id(CONS_Root *root, U64 type_user_id){ CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, &lookup); + cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id, &lookup); CONS_Type *result = (CONS_Type*)lookup.match; return(result); @@ -599,11 +599,11 @@ cons_type_from_id(CONS_Root *root, U64 type_user_id){ static CONS_Reservation* cons_type_reserve_id(CONS_Root *root, U64 type_user_id){ CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, &lookup); + cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id, &lookup); CONS_Reservation *result = 0; if (lookup.match == 0){ - cons__u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, &lookup, root->nil_type); + cons__u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id, &lookup, root->nil_type); void **slot = &lookup.fill_node->ptr[lookup.fill_k]; result = (CONS_Reservation*)slot; } @@ -1319,7 +1319,8 @@ cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type){ static CONS_Symbol* cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id){ CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, &lookup); + U64 symbol_hash = raddbg_hash((U8 *)&symbol_user_id, sizeof(symbol_user_id)); + cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_hash, &lookup); CONS_Symbol *result = 0; if (lookup.match != 0){ @@ -1329,7 +1330,7 @@ cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id){ result = push_array(root->arena, CONS_Symbol, 1); SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); root->symbol_count += 1; - cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, &lookup, result); + cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_hash, &lookup, result); } return(result); @@ -1430,7 +1431,7 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info static CONS_Scope* cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id){ CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->scope_map, scope_user_id, &lookup); + cons__u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id, &lookup); CONS_Scope *result = 0; if (lookup.match != 0){ @@ -1441,7 +1442,7 @@ cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id){ result->idx = root->scope_count; SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); root->scope_count += 1; - cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, &lookup, result); + cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id, &lookup, result); } return(result); @@ -1478,7 +1479,8 @@ cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U6 static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id){ CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->local_map, local_user_id, &lookup); + U64 local_hash = raddbg_hash((U8*)&local_user_id, sizeof(local_user_id)); + cons__u64toptr_lookup(&root->local_map, local_user_id, local_hash, &lookup); CONS_Local *result = 0; if (lookup.match != 0){ @@ -1486,7 +1488,7 @@ cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id){ } else{ result = push_array(root->arena, CONS_Local, 1); - cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, &lookup, result); + cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, local_hash, &lookup, result); } return(result); @@ -1799,9 +1801,9 @@ cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count){ } static void -cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, CONS__U64ToPtrLookup *lookup_out){ +cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out){ ProfBeginFunction(); - U64 bucket_idx = key&(map->buckets_count - 1); + U64 bucket_idx = hash&(map->buckets_count - 1); CONS__U64ToPtrNode *check_node = map->buckets[bucket_idx]; for (;check_node != 0; check_node = check_node->next){ for (U32 k = 0; k < ArrayCount(check_node->key); k += 1){ @@ -1820,8 +1822,9 @@ cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, CONS__U64ToPtrLookup *loo } static void -cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, +cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup, void *ptr){ + ProfBeginFunction(); if (lookup->fill_node != 0){ CONS__U64ToPtrNode *node = lookup->fill_node; U32 k = lookup->fill_k; @@ -1829,7 +1832,7 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, node->ptr[k] = ptr; } else{ - U64 bucket_idx = key&(map->buckets_count - 1); + U64 bucket_idx = hash&(map->buckets_count - 1); CONS__U64ToPtrNode *node = push_array(arena, CONS__U64ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); @@ -1842,6 +1845,7 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, map->pair_count += 1; map->bucket_collision_count += (node->next != 0); } + ProfEnd(); } // str8 to ptr map diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index a84df50c..db9b86ed 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -500,8 +500,9 @@ static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *ma // u64 to ptr map typedef struct CONS__U64ToPtrNode{ struct CONS__U64ToPtrNode *next; - U64 key[3]; - void *ptr[3]; + U64 _padding_; + U64 key[1]; + void *ptr[1]; } CONS__U64ToPtrNode; typedef struct CONS__U64ToPtrMap{ @@ -519,8 +520,8 @@ typedef struct CONS__U64ToPtrLookup{ static void cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count); -static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, CONS__U64ToPtrLookup *lookup_out); -static void cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, +static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out); +static void cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup, void *ptr); diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 0e2afe47..e35df47e 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -1898,8 +1898,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } CV_SymKind kind = rec_range->hdr.kind; - switch (kind){ - default:break; + switch(kind) + { + default:{}break; case CV_SymKind_END: ProfScope("CV_SymKind_END") @@ -2278,13 +2279,15 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // emit local U64 user_id = user_id_base + off; CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, user_id); + local_var->kind = local_kind; + local_var->name = name; + local_var->type = type; CONS_LocalInfo info = {0}; info.kind = local_kind; info.scope = current_scope; info.name = name; info.type = type; - cons_local_set_basic_info(ctx->root, local_var, &info); defrange_target = cons_location_set_from_local(ctx->root, local_var); From 801518ea753968c55930c2611ea0ad9255b8ca70 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 9 Feb 2024 18:02:44 -0800 Subject: [PATCH 022/275] improve local map hash --- src/raddbg_cons/raddbg_cons.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index 445e1e1e..3c92b433 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -1479,7 +1479,7 @@ cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U6 static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id){ CONS__U64ToPtrLookup lookup = {0}; - U64 local_hash = raddbg_hash((U8*)&local_user_id, sizeof(local_user_id)); + U64 local_hash = (local_user_id<<4) ^ (local_user_id>>3) ^ (((local_user_id&0xffffffff00000000ull)>>32)); cons__u64toptr_lookup(&root->local_map, local_user_id, local_hash, &lookup); CONS_Local *result = 0; From c81ee6d9bc7de536236eca52a8384245e26f45de Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 10 Feb 2024 16:21:55 -0800 Subject: [PATCH 023/275] extend id -> handle cons APIs with separate hash channel, so usage code completely controls both unique IDs and how they're hashed; second pass at designing better local variable hashing function --- project.4coder | 2 +- src/raddbg_cons/raddbg_cons.c | 46 +++++----- src/raddbg_cons/raddbg_cons.h | 12 +-- src/raddbg_convert/pdb/raddbg_from_pdb.c | 85 +++++++++++++------ src/raddbg_convert/pdb/raddbg_from_pdb.h | 1 + src/raddbg_convert/pdb/raddbg_from_pdb_main.c | 2 +- 6 files changed, 92 insertions(+), 56 deletions(-) diff --git a/project.4coder b/project.4coder index 4464f716..eaa4440e 100644 --- a/project.4coder +++ b/project.4coder @@ -74,7 +74,7 @@ commands = }, .rjf_f4 = { - .win = "build raddbg_from_pdb release telemetry && pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --capture && popd", + .win = "build raddbg_from_pdb telemetry && pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --capture && popd", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index 3c92b433..4e95f855 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -516,9 +516,10 @@ cons_add_binary_section(CONS_Root *root, String8 name, RADDBG_BinarySectionFlags // units static CONS_Unit* -cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id){ +cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash){ + ProfBeginFunction(); CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id, &lookup); + cons__u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); CONS_Unit *result = 0; if (lookup.match != 0){ @@ -532,6 +533,7 @@ cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id){ cons__u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); } + ProfEnd(); return(result); } @@ -588,26 +590,28 @@ cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl){ // types static CONS_Type* -cons_type_from_id(CONS_Root *root, U64 type_user_id){ +cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash){ CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id, &lookup); + cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); CONS_Type *result = (CONS_Type*)lookup.match; return(result); } static CONS_Reservation* -cons_type_reserve_id(CONS_Root *root, U64 type_user_id){ +cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash){ + ProfBeginFunction(); CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id, &lookup); + cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); CONS_Reservation *result = 0; if (lookup.match == 0){ - cons__u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id, &lookup, root->nil_type); + cons__u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); void **slot = &lookup.fill_node->ptr[lookup.fill_k]; result = (CONS_Reservation*)slot; } + ProfEnd(); return(result); } @@ -1317,10 +1321,10 @@ cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type){ // symbols static CONS_Symbol* -cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id){ +cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash){ + ProfBeginFunction(); CONS__U64ToPtrLookup lookup = {0}; - U64 symbol_hash = raddbg_hash((U8 *)&symbol_user_id, sizeof(symbol_user_id)); - cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_hash, &lookup); + cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); CONS_Symbol *result = 0; if (lookup.match != 0){ @@ -1330,9 +1334,10 @@ cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id){ result = push_array(root->arena, CONS_Symbol, 1); SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); root->symbol_count += 1; - cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_hash, &lookup, result); + cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); } + ProfEnd(); return(result); } @@ -1429,9 +1434,10 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info // scopes static CONS_Scope* -cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id){ +cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash){ + ProfBeginFunction(); CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id, &lookup); + cons__u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); CONS_Scope *result = 0; if (lookup.match != 0){ @@ -1442,9 +1448,10 @@ cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id){ result->idx = root->scope_count; SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); root->scope_count += 1; - cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id, &lookup, result); + cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); } + ProfEnd(); return(result); } @@ -1477,10 +1484,10 @@ cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U6 // locals static CONS_Local* -cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id){ +cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash){ + ProfBeginFunction(); CONS__U64ToPtrLookup lookup = {0}; - U64 local_hash = (local_user_id<<4) ^ (local_user_id>>3) ^ (((local_user_id&0xffffffff00000000ull)>>32)); - cons__u64toptr_lookup(&root->local_map, local_user_id, local_hash, &lookup); + cons__u64toptr_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); CONS_Local *result = 0; if (lookup.match != 0){ @@ -1488,9 +1495,10 @@ cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id){ } else{ result = push_array(root->arena, CONS_Local, 1); - cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, local_hash, &lookup, result); + cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); } + ProfEnd(); return(result); } @@ -1802,7 +1810,6 @@ cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count){ static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out){ - ProfBeginFunction(); U64 bucket_idx = hash&(map->buckets_count - 1); CONS__U64ToPtrNode *check_node = map->buckets[bucket_idx]; for (;check_node != 0; check_node = check_node->next){ @@ -1818,7 +1825,6 @@ cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrL } } } - ProfEnd(); } static void diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index db9b86ed..d3ce0400 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -101,7 +101,7 @@ static void cons_add_binary_section(CONS_Root *root, // units -static CONS_Unit* cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id); +static CONS_Unit* cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash); typedef struct CONS_UnitInfo{ String8 unit_name; @@ -130,8 +130,8 @@ static void cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first // types -static CONS_Type* cons_type_from_id(CONS_Root *root, U64 type_user_id); -static CONS_Reservation* cons_type_reserve_id(CONS_Root *root, U64 type_user_id); +static CONS_Type* cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash); +static CONS_Reservation* cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash); static void cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type); static B32 cons_type_is_unhandled_nil(CONS_Root *root, CONS_Type *type); @@ -190,7 +190,7 @@ static void cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined static void cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type); // symbols -static CONS_Symbol* cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id); +static CONS_Symbol* cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash); typedef enum{ CONS_SymbolKind_NULL, @@ -216,13 +216,13 @@ typedef struct CONS_SymbolInfo{ static void cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info); // scopes -static CONS_Scope *cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id); +static CONS_Scope *cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash); static void cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent); static void cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl); // locals -static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id); +static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash); typedef struct CONS_LocalInfo{ RADDBG_LocalKind kind; diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index e35df47e..12202c4e 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -220,7 +220,7 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ ProfScope("setup variadic itype -> node") { CONS_Type *variadic_type = cons_type_variadic(ctx->root); - CONS_Reservation *res = cons_type_reserve_id(ctx->root, CV_TypeId_Variadic); + CONS_Reservation *res = cons_type_reserve_id(ctx->root, CV_TypeId_Variadic, CV_TypeId_Variadic); cons_type_fill_id(ctx->root, res, variadic_type); } @@ -419,27 +419,35 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ ProfBeginFunction(); // convert fwd references to real types + ProfBegin("fwd map get"); CV_TypeId resolved_itype = pdbconv_type_fwd_map_get(&ctx->fwd_map, itype); if (resolved_itype != 0){ itype = resolved_itype; } + ProfEnd(); // type handle from id - CONS_Type *result = cons_type_from_id(ctx->root, itype); + ProfBegin("id -> handle"); + CONS_Type *result = cons_type_from_id(ctx->root, itype, itype); + ProfEnd(); // basic type + ProfBegin("basic type"); if (result == 0){ if (itype < 0x1000){ result = pdbconv_type_cons_basic(ctx, itype); } } + ProfEnd(); // leaf decode + ProfBegin("leaf decode"); if (result == 0){ if (ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl){ result = pdbconv_type_cons_leaf_record(ctx, itype); } } + ProfEnd(); // never return null, return "nil" instead if (result == 0){ @@ -967,13 +975,12 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId static CONS_Type* pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ - ProfBeginFunction(); Assert(itype < 0x1000); CV_BasicPointerKind basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); CV_BasicType basic_type_code = CV_BasicTypeFromTypeId(itype); - CONS_Reservation *basic_res = cons_type_reserve_id(ctx->root, basic_type_code); + CONS_Reservation *basic_res = cons_type_reserve_id(ctx->root, basic_type_code, basic_type_code); CONS_Type *basic_type = 0; switch (basic_type_code){ @@ -1147,7 +1154,7 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ // wrap in constructed type CONS_Type *constructed_type = 0; if (basic_ptr_kind != 0 && basic_type != 0){ - CONS_Reservation *constructed_res = cons_type_reserve_id(ctx->root, itype); + CONS_Reservation *constructed_res = cons_type_reserve_id(ctx->root, itype, itype); switch (basic_ptr_kind){ case CV_BasicPointerKind_16BIT: @@ -1171,16 +1178,14 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ result = constructed_type; } - ProfEnd(); return(result); } static CONS_Type* pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ - ProfBeginFunction(); Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); - CONS_Reservation *res = cons_type_reserve_id(ctx->root, itype); + CONS_Reservation *res = cons_type_reserve_id(ctx->root, itype, itype); CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[itype - ctx->leaf->itype_first]; String8 data = ctx->leaf->data; @@ -1696,7 +1701,6 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ cons_type_fill_id(ctx->root, res, result); - ProfEnd(); return(result); } @@ -1747,7 +1751,7 @@ static CONS_Type* pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name){ // TODO(rjf): no idea if this is correct CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); - CONS_Type *result = cons_type_from_id(ctx->root, cv_type_id); + CONS_Type *result = cons_type_from_id(ctx->root, cv_type_id, cv_type_id); return(result); } @@ -1807,6 +1811,13 @@ pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key){ //- symbols +static U64 +pdbconv_hash_from_symbol_user_id(U64 user_id) +{ + U64 hash = user_id; + return hash; +} + static void pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ ProfBeginFunction(); @@ -1815,6 +1826,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // extract important values from parameters String8 data = sym->data; U64 user_id_base = (((U64)sym_unique_id) << 32); + U64 sym_unique_id_hash = raddbg_hash((U8*)&sym_unique_id, sizeof(sym_unique_id)); // PASS 1: map out data associations ProfScope("map out data associations") @@ -1825,7 +1837,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // loop CV_RecRange *rec_range = sym->sym_ranges.ranges; CV_RecRange *opl = rec_range + sym->sym_ranges.count; - for (;rec_range < opl; rec_range += 1){ + U64 symbol_num = 1; + for(;rec_range < opl; rec_range += 1) + { // symbol data range U64 opl_off_raw = rec_range->off + rec_range->hdr.size; U64 opl_off = ClampTop(opl_off_raw, data.size); @@ -1863,7 +1877,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_GPROC32: { U64 user_id = user_id_base + off; - current_proc = cons_symbol_handle_from_user_id(ctx->root, user_id); + current_proc = cons_symbol_handle_from_user_id(ctx->root, user_id, user_id); + symbol_num += 1; }break; } } @@ -1879,7 +1894,11 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // loop CV_RecRange *rec_range = sym->sym_ranges.ranges; CV_RecRange *opl = rec_range + sym->sym_ranges.count; - for (;rec_range < opl; rec_range += 1){ + U64 symbol_num = 1; + U64 local_num = 1; + U64 scope_num = 1; + for(;rec_range < opl; rec_range += 1) + { // symbol data range U64 opl_off_raw = rec_range->off + rec_range->hdr.size; U64 opl_off = ClampTop(opl_off_raw, data.size); @@ -1933,7 +1952,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // scope U64 user_id = user_id_base + off; - CONS_Scope *block_scope = cons_scope_handle_from_user_id(ctx->root, user_id); + scope_num += 1; + CONS_Scope *block_scope = cons_scope_handle_from_user_id(ctx->root, user_id, user_id); cons_scope_set_parent(ctx->root, block_scope, current_scope); pdbconv_symbol_push_scope(ctx, block_scope, current_procedure); @@ -1993,7 +2013,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // cons this symbol U64 user_id = user_id_base + off; - CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, user_id); + CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, user_id, user_id); + symbol_num += 1; CONS_SymbolInfo info = zero_struct; info.kind = CONS_SymbolKind_GlobalVariable; @@ -2040,8 +2061,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } // get this symbol handle - U64 user_id = user_id_base + off; - CONS_Symbol *proc_symbol = cons_symbol_handle_from_user_id(ctx->root, user_id); + U64 proc_id = user_id_base + off; + CONS_Symbol *proc_symbol = cons_symbol_handle_from_user_id(ctx->root, proc_id, proc_id); + symbol_num += 1; // scope @@ -2050,8 +2072,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // it here because these scopes refer to the ranges of code that make up a // procedure *not* the namespaces, so a procedure's root scope always has // no parent. - CONS_Scope *root_scope = cons_scope_handle_from_user_id(ctx->root, user_id); + U64 scope_id = user_id_base + off; + CONS_Scope *root_scope = cons_scope_handle_from_user_id(ctx->root, scope_id, scope_id); pdbconv_symbol_push_scope(ctx, root_scope, proc_symbol); + scope_num += 1; // set voff range U64 voff = 0; @@ -2136,15 +2160,16 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } // emit local - U64 user_id = user_id_base + off; - CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, user_id); + U64 local_id = user_id_base + local_num;; + U64 local_id_hash = local_id ^ sym_unique_id_hash<<1 ^ sym_unique_id_hash<<4; + CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, local_id, local_id_hash); + local_num += 1; CONS_LocalInfo info = {0}; info.kind = local_kind; info.scope = current_scope; info.name = name; info.type = type; - cons_local_set_basic_info(ctx->root, local_var, &info); // add location to local @@ -2224,7 +2249,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // setup symbol U64 user_id = user_id_base + off; - CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, user_id); + CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, user_id, user_id); + symbol_num += 1; CONS_SymbolInfo info = zero_struct; info.kind = CONS_SymbolKind_ThreadVariable; @@ -2277,8 +2303,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } // emit local - U64 user_id = user_id_base + off; - CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, user_id); + U64 local_id = user_id_base + local_num; + U64 local_id_hash = local_id ^ sym_unique_id_hash<<1 ^ sym_unique_id_hash<<4; + CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, local_id, local_id_hash); + local_num += 1; local_var->kind = local_kind; local_var->name = name; local_var->type = type; @@ -2512,7 +2540,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // if scope stack isn't empty emit an error { CONS_Scope* scope = pdbconv_symbol_current_scope(ctx); - if (scope != 0){ + if(scope != 0) + { // TODO(allen): emit error } } @@ -3207,7 +3236,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ root_params.bucket_count_units = comp_unit_count; root_params.bucket_count_symbols = symbol_count_prediction; root_params.bucket_count_scopes = symbol_count_prediction; - root_params.bucket_count_locals = symbol_count_prediction; + root_params.bucket_count_locals = symbol_count_prediction*2; root_params.bucket_count_types = tpi->itype_opl; root_params.bucket_count_type_constructs = tpi->itype_opl; @@ -3293,7 +3322,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ RADDBG_Language lang = raddbg_language_from_cv_language(sym->info.language); // basic per unit info - CONS_Unit *unit_handle = cons_unit_handle_from_user_id(root, i); + CONS_Unit *unit_handle = cons_unit_handle_from_user_id(root, i, i); CONS_UnitInfo info = {0}; info.unit_name = unit_name; @@ -3336,7 +3365,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ PDB_CompUnitContribution *contrib_opl = contrib_ptr + comp_unit_contribution_count; for (;contrib_ptr < contrib_opl; contrib_ptr += 1){ if (contrib_ptr->mod < root->unit_count){ - CONS_Unit *unit_handle = cons_unit_handle_from_user_id(root, contrib_ptr->mod); + CONS_Unit *unit_handle = cons_unit_handle_from_user_id(root, contrib_ptr->mod, contrib_ptr->mod); cons_unit_vmap_add_range(root, unit_handle, contrib_ptr->voff_first, contrib_ptr->voff_opl); diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.h b/src/raddbg_convert/pdb/raddbg_from_pdb.h index 80aed6a1..8b33ea20 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.h +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.h @@ -212,6 +212,7 @@ static CV_TypeId pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key); //- symbol info // symbol info construction +static U64 pdbconv_hash_from_symbol_user_id(U64 user_id); static void pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id); static void pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym); diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb_main.c b/src/raddbg_convert/pdb/raddbg_from_pdb_main.c index ff1989a5..4a7921a2 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb_main.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb_main.c @@ -41,7 +41,7 @@ main(int argc, char **argv){ local_persist TCTX main_thread_tctx = {0}; tctx_init_and_equip(&main_thread_tctx); #if PROFILE_TELEMETRY - U64 tm_data_size = MB(128); + U64 tm_data_size = MB(512); U8 *tm_data = os_reserve(tm_data_size); os_commit(tm_data, tm_data_size); tmLoadLibrary(TM_RELEASE); From e7897f302f5fcdb4fed2742b78ebbb8c7d981927 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 10 Feb 2024 18:25:47 -0800 Subject: [PATCH 024/275] do some more fine tuning of symbol id hash functions used in pdb -> raddbg path; also eliminate unnecessary per-type work --- project.4coder | 4 +- src/raddbg_convert/pdb/raddbg_from_pdb.c | 100 +++++++++++++---------- src/raddbg_convert/pdb/raddbg_from_pdb.h | 4 +- 3 files changed, 61 insertions(+), 47 deletions(-) diff --git a/project.4coder b/project.4coder index eaa4440e..6fdeb145 100644 --- a/project.4coder +++ b/project.4coder @@ -56,7 +56,7 @@ commands = }, .rjf_f2 = { - .win = "build raddbg_from_pdb telemetry", + .win = "build raddbg_from_pdb telemetry release", .linux = "", .out = "*compilation*", .footer_panel = true, @@ -74,7 +74,7 @@ commands = }, .rjf_f4 = { - .win = "build raddbg_from_pdb telemetry && pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --capture && popd", + .win = "build raddbg_from_pdb && pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --dump:table_diagnostics && popd", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 12202c4e..421f8a63 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -417,14 +417,17 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ static CONS_Type* pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ ProfBeginFunction(); + B32 is_basic = (itype < 0x1000); // convert fwd references to real types - ProfBegin("fwd map get"); - CV_TypeId resolved_itype = pdbconv_type_fwd_map_get(&ctx->fwd_map, itype); - if (resolved_itype != 0){ - itype = resolved_itype; + if(is_basic) ProfScope("fwd map get") + { + CV_TypeId resolved_itype = pdbconv_type_fwd_map_get(&ctx->fwd_map, itype); + if(resolved_itype != 0) + { + itype = resolved_itype; + } } - ProfEnd(); // type handle from id ProfBegin("id -> handle"); @@ -432,25 +435,21 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ ProfEnd(); // basic type - ProfBegin("basic type"); - if (result == 0){ - if (itype < 0x1000){ - result = pdbconv_type_cons_basic(ctx, itype); - } + if(result == 0 && is_basic) ProfScope("basic type") + { + result = pdbconv_type_cons_basic(ctx, itype); } - ProfEnd(); // leaf decode - ProfBegin("leaf decode"); - if (result == 0){ - if (ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl){ - result = pdbconv_type_cons_leaf_record(ctx, itype); - } + if(result == 0 && (ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl)) + ProfScope("leaf decode") + { + result = pdbconv_type_cons_leaf_record(ctx, itype); } - ProfEnd(); // never return null, return "nil" instead - if (result == 0){ + if(result == 0) + { result = cons_type_nil(ctx->root); } @@ -1785,7 +1784,6 @@ pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_Ty static CV_TypeId pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key){ - ProfBeginFunction(); U64 bucket_idx = key%map->buckets_count; // search for an existing match @@ -1805,16 +1803,29 @@ pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key){ result = match->val; } - ProfEnd(); return(result); } //- symbols static U64 -pdbconv_hash_from_symbol_user_id(U64 user_id) +pdbconv_hash_from_local_user_id(U64 sym_hash, U64 id) { - U64 hash = user_id; + U64 hash = id ^ (sym_hash<<1) ^ (sym_hash<<4); + return hash; +} + +static U64 +pdbconv_hash_from_scope_user_id(U64 sym_hash, U64 id) +{ + U64 hash = id ^ (sym_hash<<1) ^ (sym_hash<<4); + return hash; +} + +static U64 +pdbconv_hash_from_symbol_user_id(U64 sym_hash, U64 id) +{ + U64 hash = id/8 + id ^ (sym_hash<<1) ^ (sym_hash<<4); return hash; } @@ -1837,7 +1848,6 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // loop CV_RecRange *rec_range = sym->sym_ranges.ranges; CV_RecRange *opl = rec_range + sym->sym_ranges.count; - U64 symbol_num = 1; for(;rec_range < opl; rec_range += 1) { // symbol data range @@ -1851,8 +1861,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ U64 cap = (opl_off - off); CV_SymKind kind = rec_range->hdr.kind; - switch (kind){ - default: break; + switch(kind) + { + default:{}break; case CV_SymKind_FRAMEPROC: { @@ -1876,9 +1887,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_LPROC32: case CV_SymKind_GPROC32: { - U64 user_id = user_id_base + off; - current_proc = cons_symbol_handle_from_user_id(ctx->root, user_id, user_id); - symbol_num += 1; + U64 symbol_id = user_id_base + off; + U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + current_proc = cons_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); }break; } } @@ -1894,7 +1905,6 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // loop CV_RecRange *rec_range = sym->sym_ranges.ranges; CV_RecRange *opl = rec_range + sym->sym_ranges.count; - U64 symbol_num = 1; U64 local_num = 1; U64 scope_num = 1; for(;rec_range < opl; rec_range += 1) @@ -1951,9 +1961,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ CV_SymBlock32 *block32 = (CV_SymBlock32*)first; // scope - U64 user_id = user_id_base + off; + U64 scope_id = user_id_base + scope_num; + U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); scope_num += 1; - CONS_Scope *block_scope = cons_scope_handle_from_user_id(ctx->root, user_id, user_id); + CONS_Scope *block_scope = cons_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); cons_scope_set_parent(ctx->root, block_scope, current_scope); pdbconv_symbol_push_scope(ctx, block_scope, current_procedure); @@ -2012,9 +2023,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ B32 is_extern = (kind == CV_SymKind_GDATA32); // cons this symbol - U64 user_id = user_id_base + off; - CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, user_id, user_id); - symbol_num += 1; + U64 symbol_id = user_id_base + off; + U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); CONS_SymbolInfo info = zero_struct; info.kind = CONS_SymbolKind_GlobalVariable; @@ -2061,9 +2072,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } // get this symbol handle - U64 proc_id = user_id_base + off; - CONS_Symbol *proc_symbol = cons_symbol_handle_from_user_id(ctx->root, proc_id, proc_id); - symbol_num += 1; + U64 symbol_id = user_id_base + off; + U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + CONS_Symbol *proc_symbol = cons_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); // scope @@ -2072,8 +2083,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // it here because these scopes refer to the ranges of code that make up a // procedure *not* the namespaces, so a procedure's root scope always has // no parent. - U64 scope_id = user_id_base + off; - CONS_Scope *root_scope = cons_scope_handle_from_user_id(ctx->root, scope_id, scope_id); + U64 scope_id = user_id_base + scope_num; + U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); + CONS_Scope *root_scope = cons_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); pdbconv_symbol_push_scope(ctx, root_scope, proc_symbol); scope_num += 1; @@ -2161,7 +2173,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // emit local U64 local_id = user_id_base + local_num;; - U64 local_id_hash = local_id ^ sym_unique_id_hash<<1 ^ sym_unique_id_hash<<4; + U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; @@ -2248,9 +2260,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ B32 is_extern = (kind == CV_SymKind_GTHREAD32); // setup symbol - U64 user_id = user_id_base + off; - CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, user_id, user_id); - symbol_num += 1; + U64 symbol_id = user_id_base + off; + U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); CONS_SymbolInfo info = zero_struct; info.kind = CONS_SymbolKind_ThreadVariable; @@ -2304,7 +2316,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // emit local U64 local_id = user_id_base + local_num; - U64 local_id_hash = local_id ^ sym_unique_id_hash<<1 ^ sym_unique_id_hash<<4; + U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; local_var->kind = local_kind; diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.h b/src/raddbg_convert/pdb/raddbg_from_pdb.h index 8b33ea20..c2858ddf 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.h +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.h @@ -212,7 +212,9 @@ static CV_TypeId pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key); //- symbol info // symbol info construction -static U64 pdbconv_hash_from_symbol_user_id(U64 user_id); +static U64 pdbconv_hash_from_local_user_id(U64 sym_hash, U64 id); +static U64 pdbconv_hash_from_scope_user_id(U64 sym_hash, U64 id); +static U64 pdbconv_hash_from_symbol_user_id(U64 sym_hash, U64 id); static void pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id); static void pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym); From 2e8afad5f011b217945a0889ad337f14be617d0d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 10 Feb 2024 19:40:19 -0800 Subject: [PATCH 025/275] adjust conversion visualization; strip out old profiling markup --- src/df/core/df_core.c | 1 + src/df/core/df_core.h | 2 + src/df/gfx/df_gfx.c | 21 ++++--- src/raddbg_cons/raddbg_cons.c | 20 +----- src/raddbg_convert/pdb/raddbg_from_pdb.c | 77 ++++++------------------ src/raddbg_convert/pdb/raddbg_pdb.c | 8 --- 6 files changed, 33 insertions(+), 96 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 2ec1dfa8..c9b2970b 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1802,6 +1802,7 @@ df_entity_alloc(DF_StateDeltaHistory *hist, DF_Entity *parent, DF_EntityKind kin df_state->entities_id_gen += 1; entity->id = df_state->entities_id_gen; entity->generation += 1; + entity->alloc_time_us = os_now_microseconds(); // rjf: dirtify caches df_state->kind_alloc_gens[kind] += 1; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 48b0845c..aa66357a 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -430,6 +430,7 @@ struct DF_Entity DF_EntityFlags flags; DF_EntityID id; U64 generation; + U64 alloc_time_us; B32 deleted; F32 alive_t; @@ -1226,6 +1227,7 @@ read_only global DF_Entity df_g_nil_entity = 0, 0, 0, + 0, // rjf: allocationless, simple equipment {0}, diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index bdff10c4..e334b6bf 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -4408,17 +4408,20 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D for(DF_EntityNode *n = tasks.first; n != 0; n = n->next) { DF_Entity *task = n->entity; - String8 raddbg_path = task->name; - String8 raddbg_name = str8_skip_last_slash(raddbg_path); - String8 task_text = push_str8f(scratch.arena, "Creating %S...", raddbg_name); - UI_Key key = ui_key_from_stringf(ui_key_zero(), "task_%p", task); - UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, key); - UI_Signal sig = ui_signal_from_box(box); - if(ui_hovering(sig)) UI_Tooltip + if(task->alloc_time_us + 500000 < os_now_microseconds()) { - ui_label(raddbg_path); + String8 raddbg_path = task->name; + String8 raddbg_name = str8_skip_last_slash(raddbg_path); + String8 task_text = push_str8f(scratch.arena, "Creating %S...", raddbg_name); + UI_Key key = ui_key_from_stringf(ui_key_zero(), "task_%p", task); + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, key); + UI_Signal sig = ui_signal_from_box(box); + if(ui_hovering(sig)) UI_Tooltip + { + ui_label(raddbg_path); + } + ui_box_equip_display_string(box, task_text); } - ui_box_equip_display_string(box, task_text); } scratch_end(scratch); } diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index 4e95f855..c2b3f058 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -1322,7 +1322,6 @@ cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type){ static CONS_Symbol* cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash){ - ProfBeginFunction(); CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); @@ -1337,13 +1336,11 @@ cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_ cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); } - ProfEnd(); return(result); } static void cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info){ - ProfBeginFunction(); CONS_SymbolKind kind = info->kind; if (symbol->kind != CONS_SymbolKind_NULL){ @@ -1416,7 +1413,7 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Procedures); }break; } - if(map != 0) ProfScope("save name map") + if(map != 0) { cons__name_map_add_pair(root, map, symbol->name, symbol->idx); } @@ -1428,14 +1425,12 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info cons__name_map_add_pair(root, map, symbol->link_name, symbol->idx); } } - ProfEnd(); } // scopes static CONS_Scope* cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash){ - ProfBeginFunction(); CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); @@ -1451,7 +1446,6 @@ cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_use cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); } - ProfEnd(); return(result); } @@ -1485,7 +1479,6 @@ cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U6 static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash){ - ProfBeginFunction(); CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); @@ -1498,7 +1491,6 @@ cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_use cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); } - ProfEnd(); return(result); } @@ -1711,14 +1703,12 @@ cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type){ static void cons__scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol){ - ProfBeginFunction(); scope->symbol = symbol; for (CONS_Scope *node = scope->first_child; node != 0; node = node->next_sibling){ cons__scope_recursive_set_symbol(node, symbol); } - ProfEnd(); } // name maps @@ -1739,7 +1729,6 @@ cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind){ static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 idx){ - ProfBeginFunction(); // hash U64 hash = raddbg_hash(string.str, string.size); @@ -1796,7 +1785,6 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 match->idx_count += 1; } - ProfEnd(); } // u64 to ptr map @@ -1830,7 +1818,6 @@ cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrL static void cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup, void *ptr){ - ProfBeginFunction(); if (lookup->fill_node != 0){ CONS__U64ToPtrNode *node = lookup->fill_node; U32 k = lookup->fill_k; @@ -1851,7 +1838,6 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, map->pair_count += 1; map->bucket_collision_count += (node->next != 0); } - ProfEnd(); } // str8 to ptr map @@ -1865,7 +1851,6 @@ cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count) static void* cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash){ - ProfBeginFunction(); void *result = 0; U64 bucket_idx = hash%map->buckets_count; for (CONS__Str8ToPtrNode *node = map->buckets[bucket_idx]; @@ -1876,13 +1861,11 @@ cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash){ break; } } - ProfEnd(); return(result); } static void cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 hash, void *ptr){ - ProfBeginFunction(); U64 bucket_idx = hash%map->buckets_count; CONS__Str8ToPtrNode *node = push_array(arena, CONS__Str8ToPtrNode, 1); @@ -1893,7 +1876,6 @@ cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 h node->ptr = ptr; map->bucket_collision_count += (node->next != 0); map->pair_count += 1; - ProfEnd(); } diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 421f8a63..21432a03 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -416,11 +416,10 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ static CONS_Type* pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ - ProfBeginFunction(); B32 is_basic = (itype < 0x1000); // convert fwd references to real types - if(is_basic) ProfScope("fwd map get") + if(is_basic) { CV_TypeId resolved_itype = pdbconv_type_fwd_map_get(&ctx->fwd_map, itype); if(resolved_itype != 0) @@ -430,19 +429,16 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ } // type handle from id - ProfBegin("id -> handle"); CONS_Type *result = cons_type_from_id(ctx->root, itype, itype); - ProfEnd(); // basic type - if(result == 0 && is_basic) ProfScope("basic type") + if(result == 0 && is_basic) { result = pdbconv_type_cons_basic(ctx, itype); } // leaf decode if(result == 0 && (ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl)) - ProfScope("leaf decode") { result = pdbconv_type_cons_leaf_record(ctx, itype); } @@ -453,7 +449,6 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ result = cons_type_nil(ctx->root); } - ProfEnd(); return(result); } @@ -1197,8 +1192,6 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ switch (range->hdr.kind){ case CV_LeafKind_MODIFIER: { - ProfBegin("CV_LeafKind_MODIFIER"); - // TODO(allen): error if bad range if (sizeof(CV_LeafModifier) <= cap){ CV_LeafModifier *modifier = (CV_LeafModifier*)first; @@ -1219,14 +1212,10 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ result = direct_type; } } - - ProfEnd(); }break; case CV_LeafKind_POINTER: { - ProfBegin("CV_LeafKind_POINTER"); - // TODO(allen): error if bad range if (sizeof(CV_LeafPointer) <= cap){ CV_LeafPointer *pointer = (CV_LeafPointer*)first; @@ -1269,14 +1258,10 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ result = cons_type_modifier(ctx->root, ptr_type, modifier_flags); } } - - ProfEnd(); }break; case CV_LeafKind_PROCEDURE: { - ProfBegin("CV_LeafKind_PROCEDURE"); - // TODO(allen): error if bad range if (sizeof(CV_LeafProcedure) <= cap){ CV_LeafProcedure *procedure = (CV_LeafProcedure*)first; @@ -1294,14 +1279,10 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ scratch_end(scratch); } - - ProfEnd(); }break; case CV_LeafKind_MFUNCTION: { - ProfBegin("CV_LeafKind_MFUNCTION"); - // TODO(allen): error if bad range if (sizeof(CV_LeafMFunction) <= cap){ CV_LeafMFunction *mfunction = (CV_LeafMFunction*)first; @@ -1327,25 +1308,20 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ scratch_end(scratch); } - - ProfEnd(); }break; case CV_LeafKind_BITFIELD: { - ProfBegin("CV_LeafKind_BITFIELD"); // TODO(allen): error if bad range if (sizeof(CV_LeafBitField) <= cap){ CV_LeafBitField *bit_field = (CV_LeafBitField*)first; CONS_Type *direct_type = pdbconv_type_resolve_and_check(ctx, bit_field->itype); result = cons_type_bitfield(ctx->root, direct_type, bit_field->pos, bit_field->len); } - ProfEnd(); }break; case CV_LeafKind_ARRAY: { - ProfBegin("CV_LeafKind_ARRAY"); // TODO(allen): error if bad range if (sizeof(CV_LeafArray) <= cap){ CV_LeafArray *array = (CV_LeafArray*)first; @@ -1365,14 +1341,11 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // build type result = cons_type_array(ctx->root, direct_type, count); } - ProfEnd(); }break; case CV_LeafKind_CLASS: case CV_LeafKind_STRUCTURE: { - ProfBegin("CV_LeafKind_CLASS/CV_LeafKind_STRUCTURE"); - // TODO(allen): error if bad range if (sizeof(CV_LeafStruct) <= cap){ CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; @@ -1414,13 +1387,11 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ } } } - ProfEnd(); }break; case CV_LeafKind_CLASS2: case CV_LeafKind_STRUCT2: { - ProfBegin("CV_LeafKind_CLASS2/CV_LeafKind_STRUCT2"); // TODO(allen): error if bad range if (sizeof(CV_LeafStruct2) <= cap){ CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first; @@ -1467,12 +1438,10 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ } } } - ProfEnd(); }break; case CV_LeafKind_UNION: { - ProfBegin("CV_LeafKind_UNION"); // TODO(allen): error if bad range if (sizeof(CV_LeafUnion) <= cap){ CV_LeafUnion *lf_union = (CV_LeafUnion*)first; @@ -1507,12 +1476,10 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ } } } - ProfEnd(); }break; case CV_LeafKind_ENUM: { - ProfBegin("CV_LeafKind_ENUM"); // TODO(allen): error if bad range if (sizeof(CV_LeafEnum) <= cap){ CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; @@ -1542,7 +1509,6 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ } } } - ProfEnd(); }break; // discard cases - we currently discard these these intentionally @@ -1922,7 +1888,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // current state CONS_Scope *current_scope = pdbconv_symbol_current_scope(ctx); CONS_Symbol *current_procedure = 0; - if (current_scope != 0){ + if(current_scope != 0) + { current_procedure = current_scope->symbol; } @@ -1932,7 +1899,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ default:{}break; case CV_SymKind_END: - ProfScope("CV_SymKind_END") + //ProfScope("CV_SymKind_END") { // pop scope stack pdbconv_symbol_pop_scope(ctx); @@ -1941,7 +1908,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_FRAMEPROC: - ProfScope("CV_SymKind_FRAMEPROC") + //ProfScope("CV_SymKind_FRAMEPROC") { if (sizeof(CV_SymFrameproc) > cap){ // TODO(allen): error @@ -1952,7 +1919,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_BLOCK32: - ProfScope("CV_SymKind_BLOCK32") + //ProfScope("CV_SymKind_BLOCK32") { if (sizeof(CV_SymBlock32) > cap){ // TODO(allen): error @@ -1980,7 +1947,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_LDATA32: case CV_SymKind_GDATA32: - ProfScope("CV_SymKind_LDATA32/CV_SymKind_GDATA32") + //ProfScope("CV_SymKind_LDATA32/CV_SymKind_GDATA32") { if (sizeof(CV_SymData32) > cap){ // TODO(allen): error @@ -2043,7 +2010,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_LPROC32: case CV_SymKind_GPROC32: - ProfScope("CV_SymKind_LPROC32/CV_SymKind_GPROC32") + //ProfScope("CV_SymKind_LPROC32/CV_SymKind_GPROC32") { if (sizeof(CV_SymProc32) > cap){ // TODO(allen): error @@ -2225,7 +2192,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_LTHREAD32: case CV_SymKind_GTHREAD32: - ProfScope("CV_SymKind_LTHREAD32/CV_SymKind_GTHREAD32") + //ProfScope("CV_SymKind_LTHREAD32/CV_SymKind_GTHREAD32") { if (sizeof(CV_SymThread32) > cap){ // TODO(allen): error @@ -2278,7 +2245,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_LOCAL: - ProfScope("CV_SymKind_LOCAL") + //ProfScope("CV_SymKind_LOCAL") { if (sizeof(CV_SymLocal) > cap){ // TODO(allen): error @@ -2337,7 +2304,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_REGISTER: - ProfScope("CV_SymKind_DEFRANGE_REGISTER") + //ProfScope("CV_SymKind_DEFRANGE_REGISTER") { if (sizeof(CV_SymDefrangeRegister) > cap){ // TODO(allen): error @@ -2370,7 +2337,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL") + //ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL") { if (sizeof(CV_SymDefrangeFramepointerRel) > cap){ // TODO(allen): error @@ -2410,7 +2377,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - ProfScope("CV_SymKind_DEFRANGE_SUBFIELD_REGISTER") + //ProfScope("CV_SymKind_DEFRANGE_SUBFIELD_REGISTER") { if (sizeof(CV_SymDefrangeSubfieldRegister) > cap){ // TODO(allen): error @@ -2447,7 +2414,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE") + //ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE") { if (sizeof(CV_SymDefrangeFramepointerRelFullScope) > cap){ // TODO(allen): error @@ -2483,7 +2450,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_DEFRANGE_REGISTER_REL: - ProfScope("CV_SymKind_DEFRANGE_REGISTER_REL") + //ProfScope("CV_SymKind_DEFRANGE_REGISTER_REL") { if (sizeof(CV_SymDefrangeRegisterRel) > cap){ // TODO(allen): error @@ -2525,7 +2492,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ }break; case CV_SymKind_FILESTATIC: - ProfScope("CV_SymKind_FILESTATIC") + //ProfScope("CV_SymKind_FILESTATIC") { if (sizeof(CV_SymFileStatic) > cap){ // TODO(allen): error @@ -2656,7 +2623,6 @@ pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,CONS_Symbol *key,PDBCONV_FrameP static PDBCONV_FrameProcData* pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, CONS_Symbol *key){ - ProfBeginFunction(); U64 key_int = IntFromPtr(key); PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; U32 bucket_idx = key_int%map->buckets_count; @@ -2672,7 +2638,6 @@ pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, CONS_Symbol *key){ } } - ProfEnd(); return(result); } @@ -2747,7 +2712,6 @@ pdbconv_known_global_hash(String8 name, U64 voff){ static B32 pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff){ - ProfBeginFunction(); U64 hash = pdbconv_known_global_hash(name, voff); U64 bucket_idx = hash%set->buckets_count; @@ -2764,13 +2728,11 @@ pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff) } B32 result = (match != 0); - ProfEnd(); return(result); } static void pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 name, U64 voff){ - ProfBeginFunction(); U64 hash = pdbconv_known_global_hash(name, voff); U64 bucket_idx = hash%set->buckets_count; @@ -2795,7 +2757,6 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n set->global_count += 1; set->bucket_collision_count += (node->next != 0); } - ProfEnd(); } // location info helpers @@ -2807,7 +2768,6 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, U32 reg_byte_pos, S64 offset, B32 extra_indirection){ - ProfBeginFunction(); CONS_Location *result = 0; if (0 <= offset && offset <= (S64)max_U16){ if (extra_indirection){ @@ -2832,7 +2792,6 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, result = cons_location_addr_bytecode_stream(ctx->root, &bytecode); } - ProfEnd(); return(result); } @@ -2949,7 +2908,6 @@ pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, U64 voff, String8 static String8 pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff){ - ProfBeginFunction(); U64 hash = (voff >> 3) ^ ((7 & voff) << 6); U64 bucket_idx = hash%map->buckets_count; @@ -2963,7 +2921,6 @@ pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff){ } } - ProfEnd(); return(result); } diff --git a/src/raddbg_convert/pdb/raddbg_pdb.c b/src/raddbg_convert/pdb/raddbg_pdb.c index b2f7867e..cfe90e6a 100644 --- a/src/raddbg_convert/pdb/raddbg_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_pdb.c @@ -777,8 +777,6 @@ pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){ static CV_TypeIdArray pdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *leaf, String8 name, B32 compare_unique_name, U32 output_cap){ - ProfBegin("pdb_tpi_itypes_from_name"); - U32 hash = pdb_string_hash1(name); U32 bucket_idx = ((tpi_hash->bucket_mask != 0) ? hash&tpi_hash->bucket_mask : @@ -964,16 +962,12 @@ pdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParse scratch_end(scratch); - ProfEnd(); - return(result); } static CV_TypeId pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_leaf, String8 name, B32 compare_unique_name){ - ProfBegin("pdb_tpi_first_itype_from_name"); - Temp scratch = scratch_begin(0, 0); CV_TypeIdArray array = pdb_tpi_itypes_from_name(scratch.arena, tpi_hash, tpi_leaf, name, compare_unique_name, 1); @@ -983,8 +977,6 @@ pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_le } scratch_end(scratch); - ProfEnd(); - return(result); } From 47bb3464e1dc56f89e3b6f6bedc137b04115ffcb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 11 Feb 2024 09:23:06 -0800 Subject: [PATCH 026/275] oops! --- src/raddbg_convert/pdb/raddbg_from_pdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 21432a03..fceda14c 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -419,7 +419,7 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ B32 is_basic = (itype < 0x1000); // convert fwd references to real types - if(is_basic) + if(!is_basic) { CV_TypeId resolved_itype = pdbconv_type_fwd_map_get(&ctx->fwd_map, itype); if(resolved_itype != 0) From e5c35a40357728fc797ea919aba6b4ced509b96d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 11 Feb 2024 09:23:06 -0800 Subject: [PATCH 027/275] oops! fix wrong type fwd reference condition --- src/raddbg_convert/pdb/raddbg_from_pdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 21432a03..fceda14c 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -419,7 +419,7 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ B32 is_basic = (itype < 0x1000); // convert fwd references to real types - if(is_basic) + if(!is_basic) { CV_TypeId resolved_itype = pdbconv_type_fwd_map_get(&ctx->fwd_map, itype); if(resolved_itype != 0) From 4fde6addc4cc2541cf52c457675d678c10039d8c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 11 Feb 2024 13:29:06 -0800 Subject: [PATCH 028/275] raddbg_cons: parameterize bake ctx with bucket sizes; make initial prediction based on symbol count --- src/raddbg_cons/raddbg_cons.c | 16 ++++++++++++---- src/raddbg_cons/raddbg_cons.h | 11 +++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index c2b3f058..c4dd67ae 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -72,7 +72,12 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out){ CONS__DSections dss = {0}; cons__dsection(arena, &dss, 0, 0, RADDBG_DataSectionTag_NULL); - CONS__BakeCtx *bctx = cons__bake_ctx_begin(); + CONS__BakeParams bctx_params = {0}; + { + bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); + bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); + } + CONS__BakeCtx *bctx = cons__bake_ctx_begin(&bctx_params); //////////////////////////////// // MAIN PART: allocating and filling out sections of the file @@ -1896,13 +1901,16 @@ cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_ } static CONS__BakeCtx* -cons__bake_ctx_begin(void){ +cons__bake_ctx_begin(CONS__BakeParams *params) +{ Arena *arena = arena_alloc(); CONS__BakeCtx *result = push_array(arena, CONS__BakeCtx, 1); result->arena = arena; - result->strs.buckets_count = 16384; +#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) + result->strs.buckets_count = BKTCOUNT(params->strings_bucket_count); + result->idxs.buckets_count = BKTCOUNT(params->idx_runs_bucket_count); +#undef BKTCOUNT result->strs.buckets = push_array(arena, CONS__StringNode *, result->strs.buckets_count); - result->idxs.buckets_count = 16384; result->idxs.buckets = push_array(arena, CONS__IdxRunNode *, result->idxs.buckets_count); cons__string(result, str8_lit("")); diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index d3ce0400..a2c71726 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -728,11 +728,18 @@ typedef struct CONS__BakeCtx{ CONS__PathTree *tree; } CONS__BakeCtx; +typedef struct CONS__BakeParams CONS__BakeParams; +struct CONS__BakeParams +{ + U64 strings_bucket_count; + U64 idx_runs_bucket_count; +}; + //- cons intermediate functions static U32 cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_DataSectionTag tag); -static CONS__BakeCtx* cons__bake_ctx_begin(void); +static CONS__BakeCtx* cons__bake_ctx_begin(CONS__BakeParams *params); static void cons__bake_ctx_release(CONS__BakeCtx *bake_ctx); static U32 cons__string(CONS__BakeCtx *bctx, String8 str); @@ -908,4 +915,4 @@ typedef struct CONS__NameMapBaked{ static CONS__NameMapBaked* cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__NameMap *map); -#endif //RADDBG_CONS_H +#endif // RADDBG_CONS_H From cc26a22e40893178199855579ba06ee7613c8b18 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 10:33:04 -0800 Subject: [PATCH 029/275] apply cancel/ok ordering note from jeff --- src/df/gfx/df_gfx.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index e334b6bf..f6cad045 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -3825,13 +3825,6 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { UI_CornerRadius00(ui_top_font_size()*0.25f) UI_CornerRadius01(ui_top_font_size()*0.25f) - if(ui_clicked(ui_buttonf("Cancel")) || os_key_press(ui_events(), ui_window(), 0, OS_Key_Esc)) - { - DF_CmdParams p = df_cmd_params_zero(); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmCancel)); - } - UI_CornerRadius10(ui_top_font_size()*0.25f) - UI_CornerRadius11(ui_top_font_size()*0.25f) UI_BackgroundColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBackground)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_ActionText)) UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBorder)) @@ -3840,6 +3833,13 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D DF_CmdParams p = df_cmd_params_zero(); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmAccept)); } + UI_CornerRadius10(ui_top_font_size()*0.25f) + UI_CornerRadius11(ui_top_font_size()*0.25f) + if(ui_clicked(ui_buttonf("Cancel")) || os_key_press(ui_events(), ui_window(), 0, OS_Key_Esc)) + { + DF_CmdParams p = df_cmd_params_zero(); + df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmCancel)); + } } ui_spacer(ui_em(3.f, 1.f)); } From 4b68967fbee82da7f8cc0016895a2bdb3cc8cd0f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 14:29:24 -0800 Subject: [PATCH 030/275] raddbg format stuff -> raddbgi; partial naming/organization over raddbgi_cons --- README.md | 20 +- build.bat | 6 +- project.4coder | 14 +- src/base/base_types.h | 1 + src/raddbg/raddbg_main.cpp | 50 +- .../raddbgi_cons.c} | 3662 +++++++++-------- .../raddbgi_cons.h} | 1213 +++--- .../dwarf/raddbgi_dwarf.c} | 0 .../dwarf/raddbgi_dwarf.h} | 0 .../dwarf/raddbgi_dwarf_stringize.c} | 0 .../dwarf/raddbgi_dwarf_stringize.h} | 0 .../dwarf/raddbgi_elf.c} | 0 .../dwarf/raddbgi_elf.h} | 0 .../dwarf/raddbgi_from_dwarf.c} | 23 +- .../dwarf/raddbgi_from_dwarf.h} | 0 .../pdb/raddbgi_codeview.c} | 0 .../pdb/raddbgi_codeview.h} | 0 .../pdb/raddbgi_codeview_conversion.c} | 0 .../pdb/raddbgi_codeview_conversion.h} | 0 .../pdb/raddbgi_codeview_stringize.c} | 0 .../pdb/raddbgi_codeview_stringize.h} | 0 .../pdb/raddbgi_coff.h} | 0 .../pdb/raddbgi_coff_conversion.c} | 0 .../pdb/raddbgi_coff_conversion.h} | 0 .../pdb/raddbgi_from_pdb.c} | 5 - .../pdb/raddbgi_from_pdb.h} | 0 .../pdb/raddbgi_from_pdb_main.c} | 42 +- .../pdb/raddbgi_msf.c} | 0 .../pdb/raddbgi_msf.h} | 0 .../pdb/raddbgi_pdb.c} | 0 .../pdb/raddbgi_pdb.h} | 0 .../pdb/raddbgi_pdb_stringize.c} | 0 .../pdb/raddbgi_pdb_stringize.h} | 0 .../raddbgi_dump.c} | 14 +- .../raddbgi_dump.h} | 0 .../raddbgi_stringize.c} | 0 .../raddbgi_stringize.h} | 0 .../raddbgi_format.c} | 0 .../raddbgi_format.h} | 0 .../raddbgi_format_parse.c} | 0 .../raddbgi_format_parse.h} | 0 .../generated/regs_raddbgi.meta.c} | 0 .../generated/regs_raddbgi.meta.h} | 0 .../regs_raddbg.c => raddbgi/regs_raddbgi.c} | 2 +- .../regs_raddbg.h => raddbgi/regs_raddbgi.h} | 0 .../regs_raddbgi.mc} | 0 src/scratch/look_at_raddbg.c | 8 +- 47 files changed, 2589 insertions(+), 2471 deletions(-) rename src/{raddbg_cons/raddbg_cons.c => raddbgi_cons/raddbgi_cons.c} (71%) rename src/{raddbg_cons/raddbg_cons.h => raddbgi_cons/raddbgi_cons.h} (58%) rename src/{raddbg_convert/dwarf/raddbg_dwarf.c => raddbgi_convert/dwarf/raddbgi_dwarf.c} (100%) rename src/{raddbg_convert/dwarf/raddbg_dwarf.h => raddbgi_convert/dwarf/raddbgi_dwarf.h} (100%) rename src/{raddbg_convert/dwarf/raddbg_dwarf_stringize.c => raddbgi_convert/dwarf/raddbgi_dwarf_stringize.c} (100%) rename src/{raddbg_convert/dwarf/raddbg_dwarf_stringize.h => raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h} (100%) rename src/{raddbg_convert/dwarf/raddbg_elf.c => raddbgi_convert/dwarf/raddbgi_elf.c} (100%) rename src/{raddbg_convert/dwarf/raddbg_elf.h => raddbgi_convert/dwarf/raddbgi_elf.h} (100%) rename src/{raddbg_convert/dwarf/raddbg_from_dwarf.c => raddbgi_convert/dwarf/raddbgi_from_dwarf.c} (98%) rename src/{raddbg_convert/dwarf/raddbg_from_dwarf.h => raddbgi_convert/dwarf/raddbgi_from_dwarf.h} (100%) rename src/{raddbg_convert/pdb/raddbg_codeview.c => raddbgi_convert/pdb/raddbgi_codeview.c} (100%) rename src/{raddbg_convert/pdb/raddbg_codeview.h => raddbgi_convert/pdb/raddbgi_codeview.h} (100%) rename src/{raddbg_convert/pdb/raddbg_codeview_conversion.c => raddbgi_convert/pdb/raddbgi_codeview_conversion.c} (100%) rename src/{raddbg_convert/pdb/raddbg_codeview_conversion.h => raddbgi_convert/pdb/raddbgi_codeview_conversion.h} (100%) rename src/{raddbg_convert/pdb/raddbg_codeview_stringize.c => raddbgi_convert/pdb/raddbgi_codeview_stringize.c} (100%) rename src/{raddbg_convert/pdb/raddbg_codeview_stringize.h => raddbgi_convert/pdb/raddbgi_codeview_stringize.h} (100%) rename src/{raddbg_convert/pdb/raddbg_coff.h => raddbgi_convert/pdb/raddbgi_coff.h} (100%) rename src/{raddbg_convert/pdb/raddbg_coff_conversion.c => raddbgi_convert/pdb/raddbgi_coff_conversion.c} (100%) rename src/{raddbg_convert/pdb/raddbg_coff_conversion.h => raddbgi_convert/pdb/raddbgi_coff_conversion.h} (100%) rename src/{raddbg_convert/pdb/raddbg_from_pdb.c => raddbgi_convert/pdb/raddbgi_from_pdb.c} (99%) rename src/{raddbg_convert/pdb/raddbg_from_pdb.h => raddbgi_convert/pdb/raddbgi_from_pdb.h} (100%) rename src/{raddbg_convert/pdb/raddbg_from_pdb_main.c => raddbgi_convert/pdb/raddbgi_from_pdb_main.c} (76%) rename src/{raddbg_convert/pdb/raddbg_msf.c => raddbgi_convert/pdb/raddbgi_msf.c} (100%) rename src/{raddbg_convert/pdb/raddbg_msf.h => raddbgi_convert/pdb/raddbgi_msf.h} (100%) rename src/{raddbg_convert/pdb/raddbg_pdb.c => raddbgi_convert/pdb/raddbgi_pdb.c} (100%) rename src/{raddbg_convert/pdb/raddbg_pdb.h => raddbgi_convert/pdb/raddbgi_pdb.h} (100%) rename src/{raddbg_convert/pdb/raddbg_pdb_stringize.c => raddbgi_convert/pdb/raddbgi_pdb_stringize.c} (100%) rename src/{raddbg_convert/pdb/raddbg_pdb_stringize.h => raddbgi_convert/pdb/raddbgi_pdb_stringize.h} (100%) rename src/{raddbg_dump/raddbg_dump.c => raddbgi_dump/raddbgi_dump.c} (98%) rename src/{raddbg_dump/raddbg_dump.h => raddbgi_dump/raddbgi_dump.h} (100%) rename src/{raddbg_dump/raddbg_stringize.c => raddbgi_dump/raddbgi_stringize.c} (100%) rename src/{raddbg_dump/raddbg_stringize.h => raddbgi_dump/raddbgi_stringize.h} (100%) rename src/{raddbg_format/raddbg_format.c => raddbgi_format/raddbgi_format.c} (100%) rename src/{raddbg_format/raddbg_format.h => raddbgi_format/raddbgi_format.h} (100%) rename src/{raddbg_format/raddbg_format_parse.c => raddbgi_format/raddbgi_format_parse.c} (100%) rename src/{raddbg_format/raddbg_format_parse.h => raddbgi_format/raddbgi_format_parse.h} (100%) rename src/regs/{raddbg/generated/regs_raddbg.meta.c => raddbgi/generated/regs_raddbgi.meta.c} (100%) rename src/regs/{raddbg/generated/regs_raddbg.meta.h => raddbgi/generated/regs_raddbgi.meta.h} (100%) rename src/regs/{raddbg/regs_raddbg.c => raddbgi/regs_raddbgi.c} (67%) rename src/regs/{raddbg/regs_raddbg.h => raddbgi/regs_raddbgi.h} (100%) rename src/regs/{raddbg/regs_raddbg.mc => raddbgi/regs_raddbgi.mc} (100%) diff --git a/README.md b/README.md index 1af8fc83..93647aae 100644 --- a/README.md +++ b/README.md @@ -24,13 +24,13 @@ simply deserialize the PDBs). It is much slower for much larger projects at the moment, but we expect this will vastly improve overtime. The RADDBG format is currently specified in code, in the files within the -`src/raddbg_format` folder. The other relevant folders for working with the +`src/raddbgi_format` folder. The other relevant folders for working with the format are: -- `raddbg_cons`: The RADDBG construction layer, for constructing RADDBG files. -- `raddbg_convert`: Our implementation of PDB-to-RADDBG (and an in-progress +- `raddbgi_cons`: The RADDBG construction layer, for making RADDBG debug info. +- `raddbgi_convert`: Our implementation of PDB-to-RADDBG (and an in-progress implementation of a DWARF-to-RADDBG) conversion. -- `raddbg_dump`: Code for textually dumping information from RADDBG files. +- `raddbgi_dump`: Code for textually dumping information from RADDBG files. ## Development Setup Instructions @@ -288,15 +288,15 @@ A list of the layers in the codebase and their associated namespaces is below: - `raddbg` (no namespace): The layer which ties everything together for the main graphical debugger. Not much "meat", just drives `df`, implements command line options, and so on. -- `raddbg_cons` (`CONS_`): Implements an API for constructing files of the - RADDBG debug info file format. -- `raddbg_dump` (`DUMP_`): A dumper utility program for dumping textualizations - of RADDBG debug info files. -- `raddbg_format` (`RADDBG_`): Standalone types and helper functions for the - RADDBG debug info file format. Does not depend on `base`. - `raddbg_markup` (`RADDBG_`): Standalone header file for marking up user programs to work with various features in the `raddbg` debugger. Does not depend on `base`. +- `raddbgi_cons` (`CONS_`): Implements an API for constructing files of the + RADDBG debug info file format. +- `raddbgi_dump` (`DUMP_`): A dumper utility program for dumping + textualizations of RADDBG debug info files. +- `raddbgi_format` (`RADDBG_`): Standalone types and helper functions for the + RADDBG debug info file format. Does not depend on `base`. - `regs` (`REGS_`): Types, helper functions, and metadata for registers on supported architectures. Used in reading/writing registers in `demon`, or in looking up register metadata. diff --git a/build.bat b/build.bat index 8f00468b..79d3fb91 100644 --- a/build.bat +++ b/build.bat @@ -99,9 +99,9 @@ if not "%no_meta%"=="1" ( :: --- Build Everything (@build_targets) -------------------------------------- pushd build if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg_main.cpp %compile_link% %out%raddbg.exe || exit /b 1 -if "%raddbg_from_pdb%"=="1" %compile% ..\src\raddbg_convert\pdb\raddbg_from_pdb_main.c %compile_link% %out%raddbg_from_pdb.exe || exit /b 1 -if "%raddbg_from_dwarf%"=="1" %compile% ..\src\raddbg_convert\dwarf\raddbg_from_dwarf.c %compile_link% %out%raddbg_from_dwarf.exe || exit /b 1 -if "%raddbg_dump%"=="1" %compile% ..\src\raddbg_dump\raddbg_dump.c %compile_link% %out%raddbg_dump.exe || exit /b 1 +if "%raddbgi_from_pdb%"=="1" %compile% ..\src\raddbgi_convert\pdb\raddbgi_from_pdb_main.c %compile_link% %out%raddbgi_from_pdb.exe || exit /b 1 +if "%raddbgi_from_dwarf%"=="1" %compile% ..\src\raddbgi_convert\dwarf\raddbgi_from_dwarf.c %compile_link% %out%raddbgi_from_dwarf.exe || exit /b 1 +if "%raddbgi_dump%"=="1" %compile% ..\src\raddbgi_dump\raddbgi_dump.c %compile_link% %out%raddbgi_dump.exe || exit /b 1 if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe || exit /b 1 if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe || exit /b 1 diff --git a/project.4coder b/project.4coder index 6fdeb145..1a4474d3 100644 --- a/project.4coder +++ b/project.4coder @@ -56,7 +56,7 @@ commands = }, .rjf_f2 = { - .win = "build raddbg_from_pdb telemetry release", + .win = "build raddbgi_from_pdb telemetry release", .linux = "", .out = "*compilation*", .footer_panel = true, @@ -74,7 +74,7 @@ commands = }, .rjf_f4 = { - .win = "build raddbg_from_pdb && pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --dump:table_diagnostics && popd", + .win = "build raddbgi_from_pdb && pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --dump:table_diagnostics && popd", .linux = "", .out = "*compilation*", .footer_panel = true, @@ -83,7 +83,7 @@ commands = }, .rjf_f5 = { - .win = "pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --capture && popd", + .win = "pushd build && raddbgi_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --capture && popd", .linux = "", .out = "*compilation*", .footer_panel = true, @@ -108,18 +108,18 @@ commands = .save_dirty_files = true, .cursor_at_end = false, }, - .build_raddbg_from_pdb = + .build_raddbgi_from_pdb = { - .win = "build raddbg_from_pdb", + .win = "build raddbgi_from_pdb", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .build_raddbg_dump = + .build_raddbgi_dump = { - .win = "build raddbg_dump", + .win = "build raddbgi_dump", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/base/base_types.h b/src/base/base_types.h index bdc6a916..3ed2cba6 100644 --- a/src/base/base_types.h +++ b/src/base/base_types.h @@ -102,6 +102,7 @@ #define AssertIff(a,b) Assert(!!(a) == !!(b)) #define InvalidPath Assert(!"Invalid Path!") #define NotImplemented Assert(!"Not Implemented!") +#define NoOp ((void)0) #define StaticAssert(C,ID) global U8 Glue(ID,__LINE__)[(C)?1:-1] diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 922c3c2f..5334c154 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -15,20 +15,20 @@ #include "txti/txti.h" #include "coff/coff.h" #include "pe/pe.h" -#include "raddbg_format/raddbg_format.h" -#include "raddbg_format/raddbg_format_parse.h" -#include "raddbg_cons/raddbg_cons.h" -#include "raddbg_convert/pdb/raddbg_coff.h" -#include "raddbg_convert/pdb/raddbg_codeview.h" -#include "raddbg_convert/pdb/raddbg_msf.h" -#include "raddbg_convert/pdb/raddbg_pdb.h" -#include "raddbg_convert/pdb/raddbg_coff_conversion.h" -#include "raddbg_convert/pdb/raddbg_codeview_conversion.h" -#include "raddbg_convert/pdb/raddbg_from_pdb.h" -#include "raddbg_convert/pdb/raddbg_codeview_stringize.h" -#include "raddbg_convert/pdb/raddbg_pdb_stringize.h" +#include "raddbgi_format/raddbgi_format.h" +#include "raddbgi_format/raddbgi_format_parse.h" +#include "raddbgi_cons/raddbgi_cons.h" +#include "raddbgi_convert/pdb/raddbgi_coff.h" +#include "raddbgi_convert/pdb/raddbgi_codeview.h" +#include "raddbgi_convert/pdb/raddbgi_msf.h" +#include "raddbgi_convert/pdb/raddbgi_pdb.h" +#include "raddbgi_convert/pdb/raddbgi_coff_conversion.h" +#include "raddbgi_convert/pdb/raddbgi_codeview_conversion.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/raddbg/regs_raddbg.h" +#include "regs/raddbgi/regs_raddbgi.h" #include "type_graph/type_graph.h" #include "dbgi/dbgi.h" #include "demon/demon_inc.h" @@ -57,19 +57,19 @@ #include "txti/txti.c" #include "coff/coff.c" #include "pe/pe.c" -#include "raddbg_format/raddbg_format.c" -#include "raddbg_format/raddbg_format_parse.c" -#include "raddbg_cons/raddbg_cons.c" -#include "raddbg_convert/pdb/raddbg_msf.c" -#include "raddbg_convert/pdb/raddbg_codeview.c" -#include "raddbg_convert/pdb/raddbg_pdb.c" -#include "raddbg_convert/pdb/raddbg_coff_conversion.c" -#include "raddbg_convert/pdb/raddbg_codeview_conversion.c" -#include "raddbg_convert/pdb/raddbg_codeview_stringize.c" -#include "raddbg_convert/pdb/raddbg_pdb_stringize.c" -#include "raddbg_convert/pdb/raddbg_from_pdb.c" +#include "raddbgi_format/raddbgi_format.c" +#include "raddbgi_format/raddbgi_format_parse.c" +#include "raddbgi_cons/raddbgi_cons.c" +#include "raddbgi_convert/pdb/raddbgi_msf.c" +#include "raddbgi_convert/pdb/raddbgi_codeview.c" +#include "raddbgi_convert/pdb/raddbgi_pdb.c" +#include "raddbgi_convert/pdb/raddbgi_coff_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 "regs/regs.c" -#include "regs/raddbg/regs_raddbg.c" +#include "regs/raddbgi/regs_raddbgi.c" #include "type_graph/type_graph.c" #include "dbgi/dbgi.c" #include "demon/demon_inc.c" diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbgi_cons/raddbgi_cons.c similarity index 71% rename from src/raddbg_cons/raddbg_cons.c rename to src/raddbgi_cons/raddbgi_cons.c index c4dd67ae..90266a26 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -2,11 +2,378 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//- "Public Facing" Cons API +//~ rjf: API Implementation Helper Macros + +#define cons_require(root, b32, else_code, error_msg) do { if(!(b32)) {cons_error((root), (error_msg));} else { else_code; } }while(0) +#define cons_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {cons_errorf((root), (fmt), __VA_ARGS__);} else { else_code; } }while(0) + +//////////////////////////////// +//~ rjf: Basic Type Helpers + +//- rjf: type lists + +static void +cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type) +{ + CONS_TypeNode *node = push_array(arena, CONS_TypeNode, 1); + SLLQueuePush(list->first, list->last, node); + list->count += 1; + node->type = type; +} + +//- rjf: bytecode lists + +static void +cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBG_EvalOp op, U64 p) +{ + U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op]; + U32 p_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits); + + CONS_EvalBytecodeOp *node = push_array(arena, CONS_EvalBytecodeOp, 1); + node->op = op; + node->p_size = p_size; + node->p = p; + + SLLQueuePush(bytecode->first_op, bytecode->last_op, node); + bytecode->op_count += 1; + bytecode->encoded_size += 1 + p_size; +} + +static void +cons_bytecode_push_uconst(Arena *arena, CONS_EvalBytecode *bytecode, U64 x) +{ + if(x <= 0xFF) + { + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU8, x); + } + else if(x <= 0xFFFF) + { + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU16, x); + } + else if(x <= 0xFFFFFFFF) + { + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU32, x); + } + else + { + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU64, x); + } +} + +static void +cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, S64 x) +{ + if(-0x80 <= x && x <= 0x7F) + { + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU8, (U64)x); + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 8); + } + else if(-0x8000 <= x && x <= 0x7FFF) + { + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU16, (U64)x); + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 16); + } + else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) + { + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU32, (U64)x); + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 32); + } + else + { + cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU64, (U64)x); + } +} + +static void +cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *right_destroyed) +{ + if(right_destroyed->first_op != 0) + { + if(left_dst->first_op == 0) + { + MemoryCopyStruct(left_dst, right_destroyed); + } + else + { + left_dst->last_op = right_destroyed->last_op; + left_dst->op_count += right_destroyed->op_count; + left_dst->encoded_size += right_destroyed->encoded_size; + } + MemoryZeroStruct(right_destroyed); + } +} + +//- rjf: sortable range sorting + +static CONS__SortKey* +cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) +{ + // This sort is designed to take advantage of lots of pre-existing sorted ranges. + // Most line info is already sorted or close to already sorted. + // Similarly most vmap data has lots of pre-sorted ranges. etc. etc. + // Also - this sort should be a "stable" sort. In the use case of sorting vmap + // ranges, we want to be able to rely on order, so it needs to be preserved here. + + ProfBegin("cons__sort_key_array"); + Temp scratch = scratch_begin(&arena, 1); + CONS__SortKey *result = 0; + + if(count <= 1) + { + result = keys; + } + else + { + CONS__OrderedRange *ranges_first = 0; + CONS__OrderedRange *ranges_last = 0; + U64 range_count = 0; + { + U64 pos = 0; + for(;pos < count;) + { + // identify ordered range + U64 first = pos; + U64 opl = pos + 1; + for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); + + // generate an ordered range node + CONS__OrderedRange *new_range = push_array(scratch.arena, CONS__OrderedRange, 1); + SLLQueuePush(ranges_first, ranges_last, new_range); + range_count += 1; + new_range->first = first; + new_range->opl = opl; + + // update pos + pos = opl; + } + } + + if(range_count == 1) + { + result = keys; + } + else + { + CONS__SortKey *keys_swap = push_array_no_zero(arena, CONS__SortKey, count); + CONS__SortKey *src = keys; + CONS__SortKey *dst = keys_swap; + CONS__OrderedRange *src_ranges = ranges_first; + CONS__OrderedRange *dst_ranges = 0; + CONS__OrderedRange *dst_ranges_last = 0; + + for(;;) + { + // begin a pass + for(;;) + { + // end pass when out of ranges + if(src_ranges == 0) + { + break; + } + + // get first range + CONS__OrderedRange *range1 = src_ranges; + SLLStackPop(src_ranges); + + // if this range is the whole array, we are done + if(range1->first == 0 && range1->opl == count) + { + result = src; + goto sort_done; + } + + // if there is not a second range, save this range for next time and end this pass + if(src_ranges == 0) + { + U64 first = range1->first; + MemoryCopy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); + SLLQueuePush(dst_ranges, dst_ranges_last, range1); + break; + } + + // get second range + CONS__OrderedRange *range2 = src_ranges; + SLLStackPop(src_ranges); + + Assert(range1->opl == range2->first); + + // merge these ranges + U64 jd = range1->first; + U64 j1 = range1->first; + U64 j1_opl = range1->opl; + U64 j2 = range2->first; + U64 j2_opl = range2->opl; + for(;;) + { + if(src[j1].key <= src[j2].key) + { + MemoryCopy(dst + jd, src + j1, sizeof(*src)); + j1 += 1; + jd += 1; + if(j1 >= j1_opl) + { + break; + } + } + else + { + MemoryCopy(dst + jd, src + j2, sizeof(*src)); + j2 += 1; + jd += 1; + if(j2 >= j2_opl) + { + break; + } + } + } + if(j1 < j1_opl) + { + MemoryCopy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1)); + } + else + { + MemoryCopy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2)); + } + + // save this as one range + range1->opl = range2->opl; + SLLQueuePush(dst_ranges, dst_ranges_last, range1); + } + + // end pass by swapping buffers and range nodes + Swap(CONS__SortKey*, src, dst); + src_ranges = dst_ranges; + dst_ranges = 0; + dst_ranges_last = 0; + } + } + } + sort_done:; + +#if 0 + // assert sortedness + for(U64 i = 1; i < count; i += 1){ + Assert(result[i - 1].key <= result[i].key); + } +#endif + + scratch_end(scratch); + ProfEnd(); + + return result; +} + +//////////////////////////////// +//~ rjf: Auxiliary Data Structure Functions + +//- rjf: u64 -> ptr map + +static void +cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count) +{ + Assert(IsPow2OrZero(bucket_count) && bucket_count > 0); + map->buckets = push_array(arena, CONS__U64ToPtrNode*, bucket_count); + map->buckets_count = bucket_count; +} + +static void +cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out) +{ + U64 bucket_idx = hash&(map->buckets_count - 1); + CONS__U64ToPtrNode *check_node = map->buckets[bucket_idx]; + for(;check_node != 0; check_node = check_node->next){ + for(U32 k = 0; k < ArrayCount(check_node->key); k += 1){ + if(check_node->ptr[k] == 0){ + lookup_out->fill_node = check_node; + lookup_out->fill_k = k; + break; + } + else if(check_node->key[k] == key){ + lookup_out->match = check_node->ptr[k]; + break; + } + } + } +} + +static void +cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup, void *ptr) +{ + if(lookup->fill_node != 0) + { + CONS__U64ToPtrNode *node = lookup->fill_node; + U32 k = lookup->fill_k; + node->key[k] = key; + node->ptr[k] = ptr; + } + else + { + U64 bucket_idx = hash&(map->buckets_count - 1); + + CONS__U64ToPtrNode *node = push_array(arena, CONS__U64ToPtrNode, 1); + SLLStackPush(map->buckets[bucket_idx], node); + node->key[0] = key; + node->ptr[0] = ptr; + + lookup->fill_node = node; + lookup->fill_k = 0; + + map->pair_count += 1; + map->bucket_collision_count += (node->next != 0); + } +} + +//- rjf: string8 -> ptr map + +static void +cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count) +{ + map->buckets_count = bucket_count; + map->buckets = push_array(arena, CONS__Str8ToPtrNode*, map->buckets_count); +} + +static void* +cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash) +{ + void *result = 0; + U64 bucket_idx = hash%map->buckets_count; + for(CONS__Str8ToPtrNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->hash == hash && str8_match(node->key, key, 0)) + { + result = node->ptr; + break; + } + } + return result; +} + +static void +cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 hash, void *ptr) +{ + U64 bucket_idx = hash%map->buckets_count; + + CONS__Str8ToPtrNode *node = push_array(arena, CONS__Str8ToPtrNode, 1); + SLLStackPush(map->buckets[bucket_idx], node); + + node->key = push_str8_copy(arena, key); + node->hash = hash; + node->ptr = ptr; + map->bucket_collision_count += (node->next != 0); + map->pair_count += 1; +} + +//////////////////////////////// +//~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions + +//- rjf: root creation -//- init static CONS_Root* -cons_root_new(CONS_RootParams *params){ +cons_root_new(CONS_RootParams *params) +{ Arena *arena = arena_alloc__sized(GB(64), MB(64)); CONS_Root *result = push_array(arena, CONS_Root, 1); result->arena = arena; @@ -54,462 +421,60 @@ cons_root_new(CONS_RootParams *params){ #undef BKTCOUNT } - return(result); + return result; } static void -cons_root_release(CONS_Root *root){ +cons_root_release(CONS_Root *root) +{ arena_release(root->arena); } -//- baking -static void -cons_bake_file(Arena *arena, CONS_Root *root, String8List *out){ - ProfBegin("cons_bake_file"); - str8_serial_begin(arena, out); - - // setup cons helpers - CONS__DSections dss = {0}; - cons__dsection(arena, &dss, 0, 0, RADDBG_DataSectionTag_NULL); - - CONS__BakeParams bctx_params = {0}; - { - bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); - bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); - } - CONS__BakeCtx *bctx = cons__bake_ctx_begin(&bctx_params); - - //////////////////////////////// - // MAIN PART: allocating and filling out sections of the file - - // top level info - RADDBG_TopLevelInfo *tli = push_array(arena, RADDBG_TopLevelInfo, 1); - { - CONS_TopLevelInfo *cons_tli = &root->top_level_info; - tli->architecture = cons_tli->architecture; - tli->exe_name_string_idx = cons__string(bctx, cons_tli->exe_name); - tli->exe_hash = cons_tli->exe_hash; - tli->voff_max = cons_tli->voff_max; - } - cons__dsection(arena, &dss, tli, sizeof(*tli), RADDBG_DataSectionTag_TopLevelInfo); - - // binary sections array - { - U32 count = root->binary_section_count; - RADDBG_BinarySection *sections = push_array(arena, RADDBG_BinarySection, count); - RADDBG_BinarySection *dsec = sections; - for (CONS_BinarySection *ssec = root->binary_section_first; - ssec != 0; - ssec = ssec->next, dsec += 1){ - dsec->name_string_idx = cons__string(bctx, ssec->name); - dsec->flags = ssec->flags; - dsec->voff_first = ssec->voff_first; - dsec->voff_opl = ssec->voff_opl; - dsec->foff_first = ssec->foff_first; - dsec->foff_opl = ssec->foff_opl; - } - cons__dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBG_DataSectionTag_BinarySections); - } - - // units array - // * pass for per-unit information including: - // * top-level unit information - // * combining line info for whole unit - { - U32 count = root->unit_count; - RADDBG_Unit *units = push_array(arena, RADDBG_Unit, count); - RADDBG_Unit *dunit = units; - for (CONS_Unit *sunit = root->unit_first; - sunit != 0; - sunit = sunit->next_order, dunit += 1){ - // strings & paths - U32 unit_name = cons__string(bctx, sunit->unit_name); - U32 cmp_name = cons__string(bctx, sunit->compiler_name); - - U32 src_path = cons__paths_idx_from_path(bctx, sunit->source_file); - U32 obj_path = cons__paths_idx_from_path(bctx, sunit->object_file); - U32 archive_path = cons__paths_idx_from_path(bctx, sunit->archive_file); - U32 build_path = cons__paths_idx_from_path(bctx, sunit->build_path); - - dunit->unit_name_string_idx = unit_name; - dunit->compiler_name_string_idx = cmp_name; - dunit->source_file_path_node = src_path; - dunit->object_file_path_node = obj_path; - dunit->archive_file_path_node = archive_path; - dunit->build_path_node = build_path; - dunit->language = sunit->language; - - // line info (voff -> file*line*col) - CONS_LineSequenceNode *first_seq = sunit->line_seq_first; - CONS__UnitLinesCombined *lines = cons__unit_combine_lines(arena, bctx, first_seq); - - U32 line_count = lines->line_count; - if (line_count > 0){ - dunit->line_info_voffs_data_idx = - cons__dsection(arena, &dss, lines->voffs, sizeof(U64)*(line_count + 1), - RADDBG_DataSectionTag_LineInfoVoffs); - dunit->line_info_data_idx = - cons__dsection(arena, &dss, lines->lines, sizeof(RADDBG_Line)*line_count, - RADDBG_DataSectionTag_LineInfoData); - if (lines->cols != 0){ - dunit->line_info_col_data_idx = - cons__dsection(arena, &dss, lines->cols, sizeof(RADDBG_Column)*line_count, - RADDBG_DataSectionTag_LineInfoColumns); - } - dunit->line_info_count = line_count; - } - } - - cons__dsection(arena, &dss, units, sizeof(*units)*count, RADDBG_DataSectionTag_Units); - } - - // source file line info baking - // * pass for "source_combine_line" for each source file - - // * can only be run after a pass that does "unit_combine_lines" for each unit. - for (CONS__SrcNode *src_node = bctx->tree->src_first; - src_node != 0; - src_node = src_node->next){ - CONS__LineMapFragment *first_fragment = src_node->first_fragment; - CONS__SrcLinesCombined *lines = cons__source_combine_lines(arena, first_fragment); - U32 line_count = lines->line_count; - - if (line_count > 0){ - src_node->line_map_count = line_count; - - src_node->line_map_nums_data_idx = - cons__dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, - RADDBG_DataSectionTag_LineMapNumbers); - - src_node->line_map_range_data_idx = - cons__dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), - RADDBG_DataSectionTag_LineMapRanges); - - src_node->line_map_voff_data_idx = - cons__dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, - RADDBG_DataSectionTag_LineMapVoffs); - } - } - - // source file name mapping - { - CONS__NameMap* map = cons__name_map_for_kind(root, RADDBG_NameMapKind_NormalSourcePaths); - for (CONS__SrcNode *src_node = bctx->tree->src_first; - src_node != 0; - src_node = src_node->next){ - if (src_node->idx != 0){ - cons__name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); - } - } - } - - // unit vmap baking - { - CONS__VMap *vmap = cons__vmap_from_unit_ranges(arena, - root->unit_vmap_range_first, - root->unit_vmap_range_count); - - U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); - cons__dsection(arena, &dss, vmap->vmap, vmap_size, RADDBG_DataSectionTag_UnitVmap); - } - - // type info baking - { - CONS__TypeData *types = cons__type_data_combine(arena, root, bctx); - - U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; - cons__dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBG_DataSectionTag_TypeNodes); - - U64 udt_size = sizeof(*types->udts)*types->udt_count; - cons__dsection(arena, &dss, types->udts, udt_size, RADDBG_DataSectionTag_UDTs); - - U64 member_size = sizeof(*types->members)*types->member_count; - cons__dsection(arena, &dss, types->members, member_size, RADDBG_DataSectionTag_Members); - - U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; - cons__dsection(arena, &dss, types->enum_members, enum_member_size, RADDBG_DataSectionTag_EnumMembers); - } - - // symbol info baking - { - CONS__SymbolData *symbol_data = cons__symbol_data_combine(arena, root, bctx); - - U64 global_variables_size = - sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; - cons__dsection(arena, &dss, symbol_data->global_variables, global_variables_size, - RADDBG_DataSectionTag_GlobalVariables); - - CONS__VMap *global_vmap = symbol_data->global_vmap; - U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); - cons__dsection(arena, &dss, global_vmap->vmap, global_vmap_size, - RADDBG_DataSectionTag_GlobalVmap); - - U64 thread_variables_size = - sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; - cons__dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, - RADDBG_DataSectionTag_ThreadVariables); - - U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; - cons__dsection(arena, &dss, symbol_data->procedures, procedures_size, - RADDBG_DataSectionTag_Procedures); - - U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; - cons__dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBG_DataSectionTag_Scopes); - - U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; - cons__dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, - RADDBG_DataSectionTag_ScopeVoffData); - - CONS__VMap *scope_vmap = symbol_data->scope_vmap; - U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); - cons__dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBG_DataSectionTag_ScopeVmap); - - U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; - cons__dsection(arena, &dss, symbol_data->locals, local_size, RADDBG_DataSectionTag_Locals); - - U64 location_blocks_size = - sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; - cons__dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, - RADDBG_DataSectionTag_LocationBlocks); - - U64 location_data_size = symbol_data->location_data_size; - cons__dsection(arena, &dss, symbol_data->location_data, location_data_size, - RADDBG_DataSectionTag_LocationData); - } - - // name map baking - { - U32 name_map_count = 0; - for (U32 i = 0; i < RADDBG_NameMapKind_COUNT; i += 1){ - if (root->name_maps[i] != 0){ - name_map_count += 1; - } - } - - RADDBG_NameMap *name_maps = push_array(arena, RADDBG_NameMap, name_map_count); - - RADDBG_NameMap *name_map_ptr = name_maps; - for (U32 i = 0; i < RADDBG_NameMapKind_COUNT; i += 1){ - CONS__NameMap *map = root->name_maps[i]; - if (map != 0){ - CONS__NameMapBaked *baked = cons__name_map_bake(arena, root, bctx, map); - - name_map_ptr->kind = i; - name_map_ptr->bucket_data_idx = - cons__dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, - RADDBG_DataSectionTag_NameMapBuckets); - name_map_ptr->node_data_idx = - cons__dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, - RADDBG_DataSectionTag_NameMapNodes); - name_map_ptr += 1; - } - } - - cons__dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, - RADDBG_DataSectionTag_NameMaps); - } - - //////////////////////////////// - // LATE PART: baking loose structures and creating final layout - - // generate data sections for file paths - { - U32 count = bctx->tree->count; - RADDBG_FilePathNode *nodes = push_array(arena, RADDBG_FilePathNode, count); - - RADDBG_FilePathNode *out_node = nodes; - for (CONS__PathNode *node = bctx->tree->first; - node != 0; - node = node->next_order, out_node += 1){ - out_node->name_string_idx = cons__string(bctx, node->name); - if (node->parent != 0){ - out_node->parent_path_node = node->parent->idx; - } - if (node->first_child != 0){ - out_node->first_child = node->first_child->idx; - } - if (node->next_sibling != 0){ - out_node->next_sibling = node->next_sibling->idx; - } - if (node->src_file != 0){ - out_node->source_file_idx = node->src_file->idx; - } - } - - cons__dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBG_DataSectionTag_FilePathNodes); - } - - // generate data sections for files - { - U32 count = bctx->tree->src_count; - RADDBG_SourceFile *src_files = push_array(arena, RADDBG_SourceFile, count); - - RADDBG_SourceFile *out_src_file = src_files; - for (CONS__SrcNode *node = bctx->tree->src_first; - node != 0; - node = node->next, out_src_file += 1){ - out_src_file->file_path_node_idx = node->path_node->idx; - out_src_file->normal_full_path_string_idx = cons__string(bctx, node->normal_full_path); - out_src_file->line_map_nums_data_idx = node->line_map_nums_data_idx; - out_src_file->line_map_range_data_idx = node->line_map_range_data_idx; - out_src_file->line_map_count = node->line_map_count; - out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; - } - - cons__dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBG_DataSectionTag_SourceFiles); - } - - // generate data sections for strings - { - U32 *str_offs = push_array_no_zero(arena, U32, bctx->strs.count + 1); - - U32 off_cursor = 0; - { - U32 *off_ptr = str_offs; - *off_ptr = 0; - off_ptr += 1; - for (CONS__StringNode *node = bctx->strs.order_first; - node != 0; - node = node->order_next){ - off_cursor += node->str.size; - *off_ptr = off_cursor; - off_ptr += 1; - } - } - - U8 *buf = push_array(arena, U8, off_cursor); - { - U8 *ptr = buf; - for (CONS__StringNode *node = bctx->strs.order_first; - node != 0; - node = node->order_next){ - MemoryCopy(ptr, node->str.str, node->str.size); - ptr += node->str.size; - } - } - - cons__dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), - RADDBG_DataSectionTag_StringTable); - cons__dsection(arena, &dss, buf, off_cursor, RADDBG_DataSectionTag_StringData); - } - - // generate data sections for index runs - { - U32 *idx_data = push_array_no_zero(arena, U32, bctx->idxs.idx_count); - - { - U32 *out_ptr = idx_data; - U32 *opl = out_ptr + bctx->idxs.idx_count; - CONS__IdxRunNode *node = bctx->idxs.order_first; - for (;node != 0 && out_ptr < opl; - node = node->order_next){ - MemoryCopy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); - out_ptr += node->count; - } - Assert(out_ptr == opl); - } - - cons__dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, - RADDBG_DataSectionTag_IndexRuns); - } - - // layout - // * the header and data section table have to be initialized "out of order" - // * so that the rest of the system can avoid this tricky order-layout interdependence stuff - RADDBG_Header *header = push_array(arena, RADDBG_Header, 1); - RADDBG_DataSection *dstable = push_array(arena, RADDBG_DataSection, dss.count); - str8_serial_push_align(arena, out, 8); - U64 header_off = out->total_size; - str8_list_push(arena, out, str8_struct(header)); - str8_serial_push_align(arena, out, 8); - U64 data_section_off = out->total_size; - str8_list_push(arena, out, str8((U8 *)dstable, sizeof(*dstable)*dss.count)); - { - header->magic = RADDBG_MAGIC_CONSTANT; - header->encoding_version = RADDBG_ENCODING_VERSION; - header->data_section_off = data_section_off; - header->data_section_count = dss.count; - } - { - U64 test_dss_count = 0; - for (CONS__DSectionNode *node = dss.first; - node != 0; - node = node->next){ - test_dss_count += 1; - } - Assert(test_dss_count == dss.count); - - RADDBG_DataSection *ptr = dstable; - for (CONS__DSectionNode *node = dss.first; - node != 0; - node = node->next, ptr += 1){ - U64 data_section_offset = 0; - if(node->size != 0) - { - str8_serial_push_align(arena, out, 8); - data_section_offset = out->total_size; - str8_list_push(arena, out, str8((U8 *)node->data, node->size)); - } - ptr->tag = node->tag; - ptr->encoding = RADDBG_DataSectionEncoding_Unpacked; - ptr->off = data_section_offset; - ptr->encoded_size = node->size; - ptr->unpacked_size = node->size; - } - Assert(ptr == dstable + dss.count); - } - - cons__bake_ctx_release(bctx); - ProfEnd(); -} +//- rjf: error accumulation - -//- errors static void -cons_errorf(CONS_Root *root, char *fmt, ...){ - ProfBeginFunction(); +cons_error(CONS_Root *root, String8 string) +{ CONS_Error *error = push_array(root->arena, CONS_Error, 1); SLLQueuePush(root->errors.first, root->errors.last, error); root->errors.count += 1; - + error->msg = string; +} + +static void +cons_errorf(CONS_Root *root, char *fmt, ...) +{ va_list args; va_start(args, fmt); String8 str = push_str8fv(root->arena, fmt, args); + cons_error(root, str); va_end(args); - - error->msg = str; - ProfEnd(); } static CONS_Error* -cons_get_first_error(CONS_Root *root){ - return(root->errors.first); +cons_get_first_error(CONS_Root *root) +{ + return root->errors.first; } - -//- information declaration - -// top level info +//- rjf: top-level info specification static void -cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli){ - if (root->top_level_info_is_set){ - // TODO(allen): API error - } - else{ - MemoryCopyStruct(&root->top_level_info, tli); - root->top_level_info_is_set = 1; - } +cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli) +{ + cons_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); + MemoryCopyStruct(&root->top_level_info, tli); + root->top_level_info_is_set = 1; } -// binary sections +//- rjf: binary section building static void -cons_add_binary_section(CONS_Root *root, String8 name, RADDBG_BinarySectionFlags flags, - U64 voff_first, U64 voff_opl, U64 foff_first, U64 foff_opl){ +cons_add_binary_section(CONS_Root *root, String8 name, RADDBG_BinarySectionFlags flags, U64 voff_first, U64 voff_opl, U64 foff_first, U64 foff_opl) +{ CONS_BinarySection *sec = push_array(root->arena, CONS_BinarySection, 1); SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); root->binary_section_count += 1; - sec->name = name; sec->flags = flags; sec->voff_first = voff_first; @@ -518,49 +483,46 @@ cons_add_binary_section(CONS_Root *root, String8 name, RADDBG_BinarySectionFlags sec->foff_opl = foff_opl; } -// units +//- rjf: unit info building static CONS_Unit* -cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash){ - ProfBeginFunction(); +cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash) +{ CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); - CONS_Unit *result = 0; - if (lookup.match != 0){ + if(lookup.match != 0) + { result = (CONS_Unit*)lookup.match; } - else{ + else + { result = push_array(root->arena, CONS_Unit, 1); result->idx = root->unit_count; SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); root->unit_count += 1; cons__u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); } - - ProfEnd(); - return(result); + return result; } static void -cons_unit_set_info(CONS_Root *root, CONS_Unit *unit, CONS_UnitInfo *info){ - if (unit->info_is_set){ - // TODO(allen): API error - } - else{ - unit->info_is_set = 1; - unit->unit_name = push_str8_copy(root->arena, info->unit_name); - unit->compiler_name = push_str8_copy(root->arena, info->compiler_name); - unit->source_file = push_str8_copy(root->arena, info->source_file); - unit->object_file = push_str8_copy(root->arena, info->object_file); - unit->archive_file = push_str8_copy(root->arena, info->archive_file); - unit->build_path = push_str8_copy(root->arena, info->build_path); - unit->language = info->language; - } +cons_unit_set_info(CONS_Root *root, CONS_Unit *unit, CONS_UnitInfo *info) +{ + cons_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); + unit->info_is_set = 1; + unit->unit_name = push_str8_copy(root->arena, info->unit_name); + unit->compiler_name = push_str8_copy(root->arena, info->compiler_name); + unit->source_file = push_str8_copy(root->arena, info->source_file); + unit->object_file = push_str8_copy(root->arena, info->object_file); + unit->archive_file = push_str8_copy(root->arena, info->archive_file); + unit->build_path = push_str8_copy(root->arena, info->build_path); + unit->language = info->language; } static void -cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, CONS_LineSequence *line_sequence){ +cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, CONS_LineSequence *line_sequence) +{ CONS_LineSequenceNode *node = push_array(root->arena, CONS_LineSequenceNode, 1); SLLQueuePush(unit->line_seq_first, unit->line_seq_last, node); unit->line_seq_count += 1; @@ -573,7 +535,8 @@ cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, CONS_LineSequence node->line_seq.line_nums = push_array(root->arena, U32, line_sequence->line_count); MemoryCopy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(U32)*line_sequence->line_count); - if (line_sequence->col_nums != 0){ + if(line_sequence->col_nums != 0) + { node->line_seq.col_nums = push_array(root->arena, U16, line_sequence->line_count); MemoryCopy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(U16)*line_sequence->line_count); } @@ -582,496 +545,166 @@ cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, CONS_LineSequence } static void -cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl){ +cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl) +{ CONS_UnitVMapRange *node = push_array(root->arena, CONS_UnitVMapRange, 1); SLLQueuePush(root->unit_vmap_range_first, root->unit_vmap_range_last, node); root->unit_vmap_range_count += 1; - node->unit = unit; node->first = first; node->opl = opl; } -// types +//- rjf: type info lookups/reservations static CONS_Type* -cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash){ +cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash) +{ CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); - CONS_Type *result = (CONS_Type*)lookup.match; - return(result); + return result; } static CONS_Reservation* -cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash){ - ProfBeginFunction(); +cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash) +{ + CONS_Reservation *result = 0; CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); - - CONS_Reservation *result = 0; - if (lookup.match == 0){ + if(lookup.match == 0) + { cons__u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); void **slot = &lookup.fill_node->ptr[lookup.fill_k]; result = (CONS_Reservation*)slot; } - - ProfEnd(); - return(result); + return result; } static void -cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type){ - if (res != 0 && type != 0){ +cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type) +{ + if(res != 0 && type != 0) + { *(void**)res = type; } } +//- rjf: nil/singleton types + static B32 -cons_type_is_unhandled_nil(CONS_Root *root, CONS_Type *type){ - B32 result = (type->kind == RADDBG_TypeKind_NULL && - type != &root->handled_nil_type); - return(result); +cons_type_is_unhandled_nil(CONS_Root *root, CONS_Type *type) +{ + B32 result = (type->kind == RADDBG_TypeKind_NULL && type != &root->handled_nil_type); + return result; } static CONS_Type* -cons_type_handled_nil(CONS_Root *root){ - return(&root->handled_nil_type); +cons_type_handled_nil(CONS_Root *root) +{ + return &root->handled_nil_type; } static CONS_Type* -cons_type_nil(CONS_Root *root){ - return(root->nil_type); +cons_type_nil(CONS_Root *root) +{ + return root->nil_type; } static CONS_Type* -cons_type_variadic(CONS_Root *root){ - return(root->variadic_type); +cons_type_variadic(CONS_Root *root) +{ + return root->variadic_type; } -static CONS_Type* -cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name){ - CONS_Type *result = root->nil_type; - - if (!(RADDBG_TypeKind_FirstBuiltIn <= type_kind && - type_kind <= RADDBG_TypeKind_LastBuiltIn)){ - // TODO(allen): API error - } - else{ - Temp scratch = scratch_begin(0, 0); - - // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(type_kind) + name.size; - U8 *buf = push_array(scratch.arena, U8, buf_size); - { - U8 *ptr = buf; - // "basic" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Basic; - ptr += sizeof(CONS_TypeConstructKind); - // type_kind - MemoryCopy(ptr, &type_kind, sizeof(type_kind)); - ptr += sizeof(type_kind); - // name - MemoryCopy(ptr, name.str, name.size); - ptr += name.size; - } - - // check for duplicate construct - String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; - if (result == 0){ - // calculate size - U32 byte_size = raddbg_size_from_basic_type_kind(type_kind); - if (byte_size == 0xFFFFFFFF){ - byte_size = root->addr_size; - } - - // setup new node - result = cons__type_new(root); - result->kind = type_kind; - result->name = push_str8_copy(root->arena, name); - result->byte_size = byte_size; - - // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); - - // save in name map - { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); - cons__name_map_add_pair(root, map, result->name, result->idx); - } - } - - scratch_end(scratch); - } - - Assert(result != 0); - return(result); -} +//- rjf: base type info constructors static CONS_Type* -cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeModifierFlags flags){ - ProfBeginFunction(); - CONS_Type *result = root->nil_type; - +cons__type_new(CONS_Root *root) +{ + CONS_Type *result = push_array(root->arena, CONS_Type, 1); + result->idx = root->type_count; + SLLQueuePush_N(root->first_type, root->last_type, result, next_order); + root->type_count += 1; + return result; +} + +static CONS_TypeUDT* +cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *type) +{ + if(type->udt == 0) { - Temp scratch = scratch_begin(0, 0); - - // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); - U8 *buf = push_array(scratch.arena, U8, buf_size); - { - U8 *ptr = buf; - // "modifier" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Modifier; - ptr += sizeof(CONS_TypeConstructKind); - // flags - MemoryCopy(ptr, &flags, sizeof(flags)); - ptr += sizeof(flags); - // direct_type->idx - MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - } - - // check for duplicate construct - String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; - if (result == 0){ - - // setup new node - result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Modifier; - result->flags = flags; - result->byte_size = direct_type->byte_size; - result->direct_type = direct_type; - - // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - scratch_end(scratch); + CONS_TypeUDT *new_udt = push_array(root->arena, CONS_TypeUDT, 1); + new_udt->idx = root->type_udt_count; + SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); + root->type_udt_count += 1; + new_udt->self_type = type; + type->udt = new_udt; } - - Assert(result != 0); - ProfEnd(); - return(result); + CONS_TypeUDT *result = type->udt; + return result; } +static CONS_TypeUDT* +cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type) +{ + cons_requiref(root, (type->kind == RADDBG_TypeKind_Struct || + type->kind == RADDBG_TypeKind_Class || + type->kind == RADDBG_TypeKind_Union), + return 0, + "Tried to use non-user-defined-type-kind to create user-defined-type."); + CONS_TypeUDT *result = 0; + result = cons__type_udt_from_any_type(root, type); + return result; +} + +//- rjf: basic/operator type construction helpers + static CONS_Type* -cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit_count){ +cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name) +{ + cons_requiref(root, (RADDBG_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBG_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); CONS_Type *result = root->nil_type; + Temp scratch = scratch_begin(0, 0); + // setup construct buffer + U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(type_kind) + name.size; + U8 *buf = push_array(scratch.arena, U8, buf_size); { - Temp scratch = scratch_begin(0, 0); - - // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(U32)*2; - U8 *buf = push_array(scratch.arena, U8, buf_size); - { - U8 *ptr = buf; - // "bitfield" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Bitfield; - ptr += sizeof(CONS_TypeConstructKind); - // direct_type->idx - MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - // bit_off - MemoryCopy(ptr, &bit_off, sizeof(bit_off)); - ptr += sizeof(bit_off); - // bit_count - MemoryCopy(ptr, &bit_count, sizeof(bit_count)); - ptr += sizeof(bit_count); - } - - // check for duplicate construct - String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; - if (result == 0){ - - // setup new node - result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Bitfield; - result->byte_size = direct_type->byte_size; - result->off = bit_off; - result->count = bit_count; - result->direct_type = direct_type; - - // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - scratch_end(scratch); + U8 *ptr = buf; + // "basic" + *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Basic; + ptr += sizeof(CONS_TypeConstructKind); + // type_kind + MemoryCopy(ptr, &type_kind, sizeof(type_kind)); + ptr += sizeof(type_kind); + // name + MemoryCopy(ptr, name.str, name.size); + ptr += name.size; } - Assert(result != 0); - return(result); -} - -static CONS_Type* -cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeKind ptr_type_kind){ - ProfBeginFunction(); - CONS_Type *result = root->nil_type; - - if (!(ptr_type_kind == RADDBG_TypeKind_Ptr || - ptr_type_kind == RADDBG_TypeKind_LRef || - ptr_type_kind == RADDBG_TypeKind_RRef)){ - // TODO(allen): API error - } - else{ - Temp scratch = scratch_begin(0, 0); - - // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); - U8 *buf = push_array(scratch.arena, U8, buf_size); - { - U8 *ptr = buf; - // "pointer" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Pointer; - ptr += sizeof(CONS_TypeConstructKind); - // type_kind - MemoryCopy(ptr, &ptr_type_kind, sizeof(ptr_type_kind)); - ptr += sizeof(ptr_type_kind); - // direct_type->idx - MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - } - - // check for duplicate construct - String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; - if (result == 0){ - - // setup new node - result = cons__type_new(root); - result->kind = ptr_type_kind; - result->byte_size = root->addr_size; - result->direct_type = direct_type; - - // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - scratch_end(scratch); - } - - Assert(result != 0); - ProfEnd(); - return(result); -} - -static CONS_Type* -cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count){ - CONS_Type *result = root->nil_type; - + // check for duplicate construct + String8 blob = str8(buf, buf_size); + U64 blob_hash = raddbg_hash(buf, buf_size); + void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (CONS_Type*)lookup_ptr; + if(result == 0) { - Temp scratch = scratch_begin(0, 0); - - // setup construct buffer - U64 buf_size = - sizeof(CONS_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); - U8 *buf = push_array(scratch.arena, U8, buf_size); + // calculate size + U32 byte_size = raddbg_size_from_basic_type_kind(type_kind); + if(byte_size == 0xFFFFFFFF) { - U8 *ptr = buf; - // "array" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Array; - ptr += sizeof(CONS_TypeConstructKind); - // direct_type->idx - MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - // count - MemoryCopy(ptr, &count, sizeof(count)); - ptr += sizeof(count); + byte_size = root->addr_size; } - // check for duplicate construct - String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; - if (result == 0){ - - // setup new node - result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Array; - result->count = count; - result->direct_type = direct_type; - result->byte_size = direct_type->byte_size*count; - - // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - scratch_end(scratch); - } - - Assert(result != 0); - return(result); -} - -static CONS_Type* -cons_type_proc(CONS_Root *root, CONS_Type *return_type, CONS_TypeList *params){ - ProfBeginFunction(); - CONS_Type *result = root->nil_type; - - { - Temp scratch = scratch_begin(0, 0); - - // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); - U8 *buf = push_array(scratch.arena, U8, buf_size); - { - U8 *ptr = buf; - // "procedure" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Procedure; - ptr += sizeof(CONS_TypeConstructKind); - // ret_type->idx - MemoryCopy(ptr, &return_type->idx, sizeof(return_type->idx)); - ptr += sizeof(return_type->idx); - // (params ...)->idx - for (CONS_TypeNode *node = params->first; - node != 0; - node = node->next){ - MemoryCopy(ptr, &node->type->idx, sizeof(node->type->idx)); - ptr += sizeof(node->type->idx); - } - } - - // check for duplicate construct - String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; - if (result == 0){ - - // setup param buffer - CONS_Type **param_types = push_array(root->arena, CONS_Type*, params->count); - { - CONS_Type **ptr = param_types; - for (CONS_TypeNode *node = params->first; - node != 0; - node = node->next){ - *ptr = node->type; - ptr += 1; - } - } - - // setup new node - result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Function; - result->byte_size = root->addr_size; - result->count = params->count; - result->direct_type = return_type; - result->param_types = param_types; - - // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - scratch_end(scratch); - } - - Assert(result != 0); - ProfEnd(); - return(result); -} - -static CONS_Type* -cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, CONS_TypeList *params){ - ProfBeginFunction(0, 0); - CONS_Type *result = root->nil_type; - - { - Temp scratch = scratch_begin(0, 0); - - // setup construct buffer - U64 buf_size = - sizeof(CONS_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); - U8 *buf = push_array(scratch.arena, U8, buf_size); - { - U8 *ptr = buf; - // "method" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Method; - ptr += sizeof(CONS_TypeConstructKind); - // ret_type->idx - MemoryCopy(ptr, &return_type->idx, sizeof(return_type->idx)); - ptr += sizeof(return_type->idx); - // this_type->idx - MemoryCopy(ptr, &this_type->idx, sizeof(this_type->idx)); - ptr += sizeof(this_type->idx); - // (params ...)->idx - for (CONS_TypeNode *node = params->first; - node != 0; - node = node->next){ - MemoryCopy(ptr, &node->type->idx, sizeof(node->type->idx)); - ptr += sizeof(node->type->idx); - } - } - - // check for duplicate construct - String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; - if (result == 0){ - - // setup param buffer - CONS_Type **param_types = push_array(root->arena, CONS_Type*, params->count + 1); - { - CONS_Type **ptr = param_types; - { - *ptr = this_type; - ptr += 1; - } - for (CONS_TypeNode *node = params->first; - node != 0; - node = node->next){ - *ptr = node->type; - ptr += 1; - } - } - - // setup new node - result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Method; - result->byte_size = root->addr_size; - result->count = params->count; - result->direct_type = return_type; - result->param_types = param_types; - - // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - scratch_end(scratch); - } - - Assert(result != 0); - ProfEnd(); - return(result); -} - -static CONS_Type* -cons_type_udt(CONS_Root *root, RADDBG_TypeKind record_type_kind, String8 name, U64 size){ - CONS_Type *result = root->nil_type; - - if (!(record_type_kind == RADDBG_TypeKind_Struct || - record_type_kind == RADDBG_TypeKind_Class || - record_type_kind == RADDBG_TypeKind_Union)){ - // TODO(allen): API error - } - else{ + // setup new node result = cons__type_new(root); - result->kind = record_type_kind; - result->byte_size = size; + result->kind = type_kind; result->name = push_str8_copy(root->arena, name); + result->byte_size = byte_size; + + // save in construct map + cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); // save in name map { @@ -1080,79 +713,436 @@ cons_type_udt(CONS_Root *root, RADDBG_TypeKind record_type_kind, String8 name, U } } - return(result); + scratch_end(scratch); + Assert(result != 0); + return result; } static CONS_Type* -cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name){ +cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeModifierFlags flags) +{ + CONS_Type *result = root->nil_type; + Temp scratch = scratch_begin(0, 0); + + // setup construct buffer + U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); + U8 *buf = push_array(scratch.arena, U8, buf_size); + { + U8 *ptr = buf; + // "modifier" + *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Modifier; + ptr += sizeof(CONS_TypeConstructKind); + // flags + MemoryCopy(ptr, &flags, sizeof(flags)); + ptr += sizeof(flags); + // direct_type->idx + MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + ptr += sizeof(direct_type->idx); + } + + // check for duplicate construct + String8 blob = str8(buf, buf_size); + U64 blob_hash = raddbg_hash(buf, buf_size); + void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (CONS_Type*)lookup_ptr; + if(result == 0){ + + // setup new node + result = cons__type_new(root); + result->kind = RADDBG_TypeKind_Modifier; + result->flags = flags; + result->byte_size = direct_type->byte_size; + result->direct_type = direct_type; + + // save in construct map + cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + scratch_end(scratch); + Assert(result != 0); + return result; +} + +static CONS_Type* +cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit_count) +{ + CONS_Type *result = root->nil_type; + Temp scratch = scratch_begin(0, 0); + + // setup construct buffer + U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(U32)*2; + U8 *buf = push_array(scratch.arena, U8, buf_size); + { + U8 *ptr = buf; + // "bitfield" + *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Bitfield; + ptr += sizeof(CONS_TypeConstructKind); + // direct_type->idx + MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + ptr += sizeof(direct_type->idx); + // bit_off + MemoryCopy(ptr, &bit_off, sizeof(bit_off)); + ptr += sizeof(bit_off); + // bit_count + MemoryCopy(ptr, &bit_count, sizeof(bit_count)); + ptr += sizeof(bit_count); + } + + // check for duplicate construct + String8 blob = str8(buf, buf_size); + U64 blob_hash = raddbg_hash(buf, buf_size); + void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (CONS_Type*)lookup_ptr; + if(result == 0) + { + // setup new node + result = cons__type_new(root); + result->kind = RADDBG_TypeKind_Bitfield; + result->byte_size = direct_type->byte_size; + result->off = bit_off; + result->count = bit_count; + result->direct_type = direct_type; + + // save in construct map + cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + scratch_end(scratch); + Assert(result != 0); + return result; +} + +static CONS_Type* +cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeKind ptr_type_kind) +{ + cons_requiref(root, (ptr_type_kind == RADDBG_TypeKind_Ptr || + ptr_type_kind == RADDBG_TypeKind_LRef || + ptr_type_kind == RADDBG_TypeKind_RRef), + return root->nil_type, + "Non-pointer type kind used to construct pointer type."); + CONS_Type *result = root->nil_type; + Temp scratch = scratch_begin(0, 0); + + // setup construct buffer + U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); + U8 *buf = push_array(scratch.arena, U8, buf_size); + { + U8 *ptr = buf; + // "pointer" + *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Pointer; + ptr += sizeof(CONS_TypeConstructKind); + // type_kind + MemoryCopy(ptr, &ptr_type_kind, sizeof(ptr_type_kind)); + ptr += sizeof(ptr_type_kind); + // direct_type->idx + MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + ptr += sizeof(direct_type->idx); + } + + // check for duplicate construct + String8 blob = str8(buf, buf_size); + U64 blob_hash = raddbg_hash(buf, buf_size); + void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (CONS_Type*)lookup_ptr; + if(result == 0) + { + // setup new node + result = cons__type_new(root); + result->kind = ptr_type_kind; + result->byte_size = root->addr_size; + result->direct_type = direct_type; + + // save in construct map + cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + scratch_end(scratch); + Assert(result != 0); + return result; +} + +static CONS_Type* +cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count) +{ + CONS_Type *result = root->nil_type; + Temp scratch = scratch_begin(0, 0); + + // setup construct buffer + U64 buf_size = + sizeof(CONS_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); + U8 *buf = push_array(scratch.arena, U8, buf_size); + { + U8 *ptr = buf; + // "array" + *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Array; + ptr += sizeof(CONS_TypeConstructKind); + // direct_type->idx + MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + ptr += sizeof(direct_type->idx); + // count + MemoryCopy(ptr, &count, sizeof(count)); + ptr += sizeof(count); + } + + // check for duplicate construct + String8 blob = str8(buf, buf_size); + U64 blob_hash = raddbg_hash(buf, buf_size); + void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (CONS_Type*)lookup_ptr; + if(result == 0) + { + // setup new node + result = cons__type_new(root); + result->kind = RADDBG_TypeKind_Array; + result->count = count; + result->direct_type = direct_type; + result->byte_size = direct_type->byte_size*count; + + // save in construct map + cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + scratch_end(scratch); + Assert(result != 0); + return result; +} + +static CONS_Type* +cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *params) +{ + CONS_Type *result = root->nil_type; + Temp scratch = scratch_begin(0, 0); + + // setup construct buffer + U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); + U8 *buf = push_array(scratch.arena, U8, buf_size); + { + U8 *ptr = buf; + // "procedure" + *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Procedure; + ptr += sizeof(CONS_TypeConstructKind); + // ret_type->idx + MemoryCopy(ptr, &return_type->idx, sizeof(return_type->idx)); + ptr += sizeof(return_type->idx); + // (params ...)->idx + for(CONS_TypeNode *node = params->first; + node != 0; + node = node->next) + { + MemoryCopy(ptr, &node->type->idx, sizeof(node->type->idx)); + ptr += sizeof(node->type->idx); + } + } + + // check for duplicate construct + String8 blob = str8(buf, buf_size); + U64 blob_hash = raddbg_hash(buf, buf_size); + void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (CONS_Type*)lookup_ptr; + if(result == 0) + { + // setup param buffer + CONS_Type **param_types = push_array(root->arena, CONS_Type*, params->count); + { + CONS_Type **ptr = param_types; + for(CONS_TypeNode *node = params->first; + node != 0; + node = node->next) + { + *ptr = node->type; + ptr += 1; + } + } + + // setup new node + result = cons__type_new(root); + result->kind = RADDBG_TypeKind_Function; + result->byte_size = root->addr_size; + result->count = params->count; + result->direct_type = return_type; + result->param_types = param_types; + + // save in construct map + cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + scratch_end(scratch); + Assert(result != 0); + return result; +} + +static CONS_Type* +cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, struct CONS_TypeList *params) +{ + CONS_Type *result = root->nil_type; + Temp scratch = scratch_begin(0, 0); + + // setup construct buffer + U64 buf_size = + sizeof(CONS_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); + U8 *buf = push_array(scratch.arena, U8, buf_size); + { + U8 *ptr = buf; + // "method" + *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Method; + ptr += sizeof(CONS_TypeConstructKind); + // ret_type->idx + MemoryCopy(ptr, &return_type->idx, sizeof(return_type->idx)); + ptr += sizeof(return_type->idx); + // this_type->idx + MemoryCopy(ptr, &this_type->idx, sizeof(this_type->idx)); + ptr += sizeof(this_type->idx); + // (params ...)->idx + for(CONS_TypeNode *node = params->first; + node != 0; + node = node->next) + { + MemoryCopy(ptr, &node->type->idx, sizeof(node->type->idx)); + ptr += sizeof(node->type->idx); + } + } + + // check for duplicate construct + String8 blob = str8(buf, buf_size); + U64 blob_hash = raddbg_hash(buf, buf_size); + void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (CONS_Type*)lookup_ptr; + if(result == 0) + { + // setup param buffer + CONS_Type **param_types = push_array(root->arena, CONS_Type*, params->count + 1); + { + CONS_Type **ptr = param_types; + { + *ptr = this_type; + ptr += 1; + } + for(CONS_TypeNode *node = params->first; + node != 0; + node = node->next) + { + *ptr = node->type; + ptr += 1; + } + } + + // setup new node + result = cons__type_new(root); + result->kind = RADDBG_TypeKind_Method; + result->byte_size = root->addr_size; + result->count = params->count; + result->direct_type = return_type; + result->param_types = param_types; + + // save in construct map + cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + scratch_end(scratch); + Assert(result != 0); + return result; +} + +//- rjf: udt type constructors + +static CONS_Type* +cons_type_udt(CONS_Root *root, RADDBG_TypeKind record_type_kind, String8 name, U64 size) +{ + cons_requiref(root, (record_type_kind == RADDBG_TypeKind_Struct || + record_type_kind == RADDBG_TypeKind_Class || + record_type_kind == RADDBG_TypeKind_Union), + return root->nil_type, + "Non-user-defined-type-kind used to create user-defined type."); + + // rjf: make type + CONS_Type *result = cons__type_new(root); + result->kind = record_type_kind; + result->byte_size = size; + result->name = push_str8_copy(root->arena, name); + + // rjf: save in name map + { + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); + cons__name_map_add_pair(root, map, result->name, result->idx); + } + + return result; +} + +static CONS_Type* +cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name) +{ + // rjf: make type CONS_Type *result = cons__type_new(root); result->kind = RADDBG_TypeKind_Enum; result->byte_size = direct_type->byte_size; result->name = push_str8_copy(root->arena, name); result->direct_type = direct_type; - // save in name map + // rjf: save in name map { CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); cons__name_map_add_pair(root, map, result->name, result->idx); } - return(result); + return result; } static CONS_Type* -cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name){ +cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name) +{ + // rjf: make type CONS_Type *result = cons__type_new(root); result->kind = RADDBG_TypeKind_Alias; result->byte_size = direct_type->byte_size; result->name = push_str8_copy(root->arena, name); result->direct_type = direct_type; + // rjf: save in name map + { + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); + cons__name_map_add_pair(root, map, result->name, result->idx); + } + + return result; +} + +static CONS_Type* +cons_type_incomplete(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name) +{ + cons_requiref(root, (type_kind == RADDBG_TypeKind_IncompleteStruct || + type_kind == RADDBG_TypeKind_IncompleteClass || + type_kind == RADDBG_TypeKind_IncompleteUnion || + type_kind == RADDBG_TypeKind_IncompleteEnum), + return root->nil_type, + "Non-incomplete-type-kind used to create incomplete type."); + + // rjf: make type + CONS_Type *result = cons__type_new(root); + result->kind = type_kind; + result->name = push_str8_copy(root->arena, name); + // save in name map { CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); cons__name_map_add_pair(root, map, result->name, result->idx); } - return(result); + return result; } -static CONS_Type* -cons_type_incomplete(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name){ - CONS_Type *result = root->nil_type; - - if (!(type_kind == RADDBG_TypeKind_IncompleteStruct || - type_kind == RADDBG_TypeKind_IncompleteClass || - type_kind == RADDBG_TypeKind_IncompleteUnion || - type_kind == RADDBG_TypeKind_IncompleteEnum)){ - // TODO(allen): API error - } - else{ - result = cons__type_new(root); - result->kind = type_kind; - result->name = push_str8_copy(root->arena, name); - - // save in name map - { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); - cons__name_map_add_pair(root, map, result->name, result->idx); - } - } - - return(result); -} +//- rjf: type member building static void -cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type, U32 off){ +cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type, U32 off) +{ CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); - if (udt != 0){ + if(udt != 0) + { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBG_MemberKind_DataField; member->name = push_str8_copy(root->arena, name); member->type = mem_type; @@ -1161,16 +1151,15 @@ cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, } static void -cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type){ +cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) +{ CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); - if (udt != 0){ + if(udt != 0) + { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBG_MemberKind_StaticData; member->name = push_str8_copy(root->arena, name); member->type = mem_type; @@ -1178,16 +1167,15 @@ cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, } static void -cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type){ +cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) +{ CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); - if (udt != 0){ + if(udt != 0) + { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBG_MemberKind_Method; member->name = push_str8_copy(root->arena, name); member->type = mem_type; @@ -1195,10 +1183,11 @@ cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, } static void -cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type){ +cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) +{ CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); - if (udt != 0){ + if(udt != 0) + { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; @@ -1212,16 +1201,15 @@ cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, } static void -cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type){ +cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) +{ CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); - if (udt != 0){ + if(udt != 0) + { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBG_MemberKind_VirtualMethod; member->name = push_str8_copy(root->arena, name); member->type = mem_type; @@ -1229,16 +1217,15 @@ cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, } static void -cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, - CONS_Type *base_type, U32 off){ +cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 off) +{ CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); - if (udt != 0){ + if(udt != 0) + { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBG_MemberKind_Base; member->type = base_type; member->off = off; @@ -1246,16 +1233,15 @@ cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, } static void -cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, - CONS_Type *base_type, U32 vptr_off, U32 vtable_off){ +cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 vptr_off, U32 vtable_off) +{ CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); - if (udt != 0){ + if(udt != 0) + { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBG_MemberKind_VirtualBase; member->type = base_type; // TODO(allen): what to do with the two offsets in this case? @@ -1263,214 +1249,185 @@ cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, } static void -cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, - CONS_Type *nested_type){ +cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, CONS_Type *nested_type) +{ CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); - if (udt != 0){ + if(udt != 0) + { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBG_MemberKind_NestedType; member->type = nested_type; } } static void -cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 val){ - if (enum_type->kind != RADDBG_TypeKind_Enum){ - // TODO(allen): API error - } - else{ - CONS_TypeUDT *udt = cons__type_udt_from_any_type(root, enum_type); - +cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 val) +{ + cons_requiref(root, (enum_type->kind == RADDBG_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); + CONS_TypeUDT *udt = cons__type_udt_from_any_type(root, enum_type); + if(udt != 0) + { CONS_TypeEnumVal *enum_val = push_array(root->arena, CONS_TypeEnumVal, 1); SLLQueuePush(udt->first_enum_val, udt->last_enum_val, enum_val); udt->enum_val_count += 1; - root->total_enum_val_count += 1; - enum_val->name = push_str8_copy(root->arena, name); enum_val->val = val; } } +//- rjf: type source coordinate specifications static void -cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, - String8 source_path, U32 line, U32 col){ - if (!(RADDBG_TypeKind_FirstUserDefined <= defined_type->kind && - defined_type->kind <= RADDBG_TypeKind_LastUserDefined)){ - // TODO(allen): API error - } - else{ - CONS_TypeUDT *udt = cons__type_udt_from_any_type(root, defined_type); - +cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, String8 source_path, U32 line, U32 col) +{ + cons_requiref(root, (RADDBG_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBG_TypeKind_LastUserDefined), + return, "Tried to add source coordinates to non-user-defined type."); + CONS_TypeUDT *udt = cons__type_udt_from_any_type(root, defined_type); + if(udt != 0) + { udt->source_path = push_str8_copy(root->arena, source_path); udt->line = line; udt->col = col; } } -// type list - -static void -cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type){ - CONS_TypeNode *node = push_array(arena, CONS_TypeNode, 1); - SLLQueuePush(list->first, list->last, node); - list->count += 1; - node->type = type; -} - -// symbols +//- rjf: symbol info building static CONS_Symbol* -cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash){ +cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash) +{ CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); - CONS_Symbol *result = 0; - if (lookup.match != 0){ + if(lookup.match != 0) + { result = (CONS_Symbol*)lookup.match; } - else{ + else + { result = push_array(root->arena, CONS_Symbol, 1); SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); root->symbol_count += 1; cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); } - - return(result); + return result; } static void -cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info){ +cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info) +{ + // rjf: unpack CONS_SymbolKind kind = info->kind; + CONS_Symbol *container_symbol = info->container_symbol; + CONS_Type *container_type = info->container_type; - if (symbol->kind != CONS_SymbolKind_NULL){ - // TODO(allen): API error + // rjf: requirements + cons_requiref(root, CONS_SymbolKind_NULL == symbol->kind, return, "Symbol information set multiple times."); + cons_requiref(root, CONS_SymbolKind_NULL < info->kind && info->kind < CONS_SymbolKind_COUNT, return, "Invalid symbol kind used to initialize symbol."); + cons_requiref(root, info->type != 0, return, "Invalid type used to initialize symbol."); + cons_requiref(root, info->container_symbol == 0 || info->container_type == 0, container_type = 0, "Symbol initialized with both a containing symbol and containing type, when only one is allowed."); + + // rjf: fill + root->symbol_kind_counts[kind] += 1; + symbol->idx = root->symbol_kind_counts[kind]; + symbol->kind = kind; + symbol->name = push_str8_copy(root->arena, info->name); + symbol->link_name = push_str8_copy(root->arena, info->link_name); + symbol->type = info->type; + symbol->is_extern = info->is_extern; + symbol->offset = info->offset; + symbol->container_symbol = container_symbol; + symbol->container_type = container_type; + + // rjf: set root scope + switch(kind) + { + default:{}break; + case CONS_SymbolKind_GlobalVariable: + case CONS_SymbolKind_ThreadVariable: + { + cons_requiref(root, info->root_scope == 0, NoOp, "Global or thread variable initialized with root scope."); + }break; + case CONS_SymbolKind_Procedure: + { + cons_requiref(root, info->root_scope != 0, NoOp, "Procedure symbol initialized without root scope."); + symbol->root_scope = info->root_scope; + cons__scope_recursive_set_symbol(info->root_scope, symbol); + }break; } - else if (kind == CONS_SymbolKind_NULL || kind >= CONS_SymbolKind_COUNT){ - // TODO(allen): API error - } - else if (info->type == 0){ - // TODO(allen): API error - } - else{ - CONS_Symbol *container_symbol = info->container_symbol; - CONS_Type *container_type = info->container_type; - if (info->container_symbol != 0 && info->container_type != 0){ - // TODO(allen): API error - container_type = 0; - } - - root->symbol_kind_counts[kind] += 1; - symbol->idx = root->symbol_kind_counts[kind]; - - symbol->kind = kind; - symbol->name = push_str8_copy(root->arena, info->name); - symbol->link_name = push_str8_copy(root->arena, info->link_name); - symbol->type = info->type; - symbol->is_extern = info->is_extern; - symbol->offset = info->offset; - symbol->container_symbol = container_symbol; - symbol->container_type = container_type; - - // set root scope - switch (kind){ + + // save name map + { + CONS__NameMap *map = 0; + switch(kind) + { default:{}break; case CONS_SymbolKind_GlobalVariable: + { + map = cons__name_map_for_kind(root, RADDBG_NameMapKind_GlobalVariables); + }break; case CONS_SymbolKind_ThreadVariable: { - if (info->root_scope != 0){ - // TODO(allen): API error - } + map = cons__name_map_for_kind(root, RADDBG_NameMapKind_ThreadVariables); }break; - case CONS_SymbolKind_Procedure: { - if (info->root_scope == 0){ - // TODO(allen): API error - } - else{ - symbol->root_scope = info->root_scope; - cons__scope_recursive_set_symbol(info->root_scope, symbol); - } + map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Procedures); }break; } - - // save name map + if(map != 0) { - CONS__NameMap *map = 0; - switch (kind){ - default:{}break; - case CONS_SymbolKind_GlobalVariable: - { - map = cons__name_map_for_kind(root, RADDBG_NameMapKind_GlobalVariables); - }break; - case CONS_SymbolKind_ThreadVariable: - { - map = cons__name_map_for_kind(root, RADDBG_NameMapKind_ThreadVariables); - }break; - case CONS_SymbolKind_Procedure: - { - map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Procedures); - }break; - } - if(map != 0) - { - cons__name_map_add_pair(root, map, symbol->name, symbol->idx); - } - } - - // save link name map - if (kind == CONS_SymbolKind_Procedure && symbol->link_name.size > 0){ - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_LinkNameProcedures); - cons__name_map_add_pair(root, map, symbol->link_name, symbol->idx); + cons__name_map_add_pair(root, map, symbol->name, symbol->idx); } } + + // save link name map + if(kind == CONS_SymbolKind_Procedure && symbol->link_name.size > 0) + { + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_LinkNameProcedures); + cons__name_map_add_pair(root, map, symbol->link_name, symbol->idx); + } } -// scopes +//- rjf: scope info building -static CONS_Scope* -cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash){ +static CONS_Scope * +cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash) +{ + CONS_Scope *result = 0; CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); - - CONS_Scope *result = 0; - if (lookup.match != 0){ + if(lookup.match != 0) + { result = (CONS_Scope*)lookup.match; } - else{ + else + { result = push_array(root->arena, CONS_Scope, 1); result->idx = root->scope_count; SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); root->scope_count += 1; cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); } - - return(result); + return result; } static void -cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent){ - if (scope->parent_scope != 0){ - // TODO(allen): API error - } - else if (parent == 0){ - // TODO(allen): API error - } - else{ - scope->symbol = parent->symbol; - scope->parent_scope = parent; - SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); - } +cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent) +{ + cons_requiref(root, scope->parent_scope == 0, return, "Scope parent set multiple times."); + cons_requiref(root, parent != 0, return, "Tried to set invalid parent as scope parent."); + scope->symbol = parent->symbol; + scope->parent_scope = parent; + SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); } static void -cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl){ +cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl) +{ CONS__VOffRange *range = push_array(root->arena, CONS__VOffRange, 1); SLLQueuePush(scope->first_range, scope->last_range, range); scope->range_count += 1; @@ -1480,278 +1437,169 @@ cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U6 root->scope_voff_count += 2; } -// locals +static void +cons__scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol) +{ + scope->symbol = symbol; + for(CONS_Scope *node = scope->first_child; + node != 0; + node = node->next_sibling) + { + cons__scope_recursive_set_symbol(node, symbol); + } +} + +//- rjf: local info building static CONS_Local* -cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash){ +cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash) +{ + CONS_Local *result = 0; CONS__U64ToPtrLookup lookup = {0}; cons__u64toptr_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); - - CONS_Local *result = 0; - if (lookup.match != 0){ + if(lookup.match != 0) + { result = (CONS_Local*)lookup.match; } - else{ + else + { result = push_array(root->arena, CONS_Local, 1); cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); } - - return(result); + return result; } static void -cons_local_set_basic_info(CONS_Root *root, CONS_Local *local, CONS_LocalInfo *info){ - if (local->kind != RADDBG_LocalKind_NULL){ - // TODO(allen): API error - } - else if (info->scope == 0){ - // TODO(allen): API error - } - else if (info->kind == RADDBG_LocalKind_NULL || RADDBG_LocalKind_COUNT <= info->kind){ - // TODO(allen): API error - } - else if (info->type == 0){ - // TODO(allen): API error - } - else{ - CONS_Scope *scope = info->scope; - SLLQueuePush(scope->first_local, scope->last_local, local); - scope->local_count += 1; - root->local_count += 1; - local->kind = info->kind; - local->name = push_str8_copy(root->arena, info->name); - local->type = info->type; - } +cons_local_set_basic_info(CONS_Root *root, CONS_Local *local, CONS_LocalInfo *info) +{ + cons_requiref(root, local->kind == RADDBG_LocalKind_NULL, return, "Local information set multiple times."); + cons_requiref(root, info->scope != 0, return, "Tried to set invalid scope as local's containing scope."); + cons_requiref(root, RADDBG_LocalKind_NULL < info->kind && info->kind < RADDBG_LocalKind_COUNT, return, "Invalid local kind."); + cons_requiref(root, info->type != 0, return, "Tried to set invalid type as local's type."); + CONS_Scope *scope = info->scope; + SLLQueuePush(scope->first_local, scope->last_local, local); + scope->local_count += 1; + root->local_count += 1; + local->kind = info->kind; + local->name = push_str8_copy(root->arena, info->name); + local->type = info->type; } static CONS_LocationSet* -cons_location_set_from_local(CONS_Root *root, CONS_Local *local){ +cons_location_set_from_local(CONS_Root *root, CONS_Local *local) +{ CONS_LocationSet *result = local->locset; - if (result == 0){ + if(result == 0) + { local->locset = push_array(root->arena, CONS_LocationSet, 1); result = local->locset; } - return(result); + return result; } +//- rjf: location info building + static void -cons_location_set_add_case(CONS_Root *root, CONS_LocationSet *locset, - U64 voff_first, U64 voff_opl, CONS_Location *location){ +cons_location_set_add_case(CONS_Root *root, CONS_LocationSet *locset, U64 voff_first, U64 voff_opl, CONS_Location *location) +{ CONS__LocationCase *location_case = push_array(root->arena, CONS__LocationCase, 1); SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); locset->location_case_count += 1; root->location_count += 1; - location_case->voff_first = voff_first; location_case->voff_opl = voff_opl; location_case->location = location; } static CONS_Location* -cons_location_addr_bytecode_stream(CONS_Root *root, CONS_EvalBytecode *bytecode){ +cons_location_addr_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode) +{ CONS_Location *result = push_array(root->arena, CONS_Location, 1); result->kind = RADDBG_LocationKind_AddrBytecodeStream; result->bytecode = *bytecode; - return(result); + return result; } static CONS_Location* -cons_location_val_bytecode_stream(CONS_Root *root, CONS_EvalBytecode *bytecode){ +cons_location_val_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode) +{ CONS_Location *result = push_array(root->arena, CONS_Location, 1); result->kind = RADDBG_LocationKind_ValBytecodeStream; result->bytecode = *bytecode; - return(result); + return result; } static CONS_Location* -cons_location_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset){ +cons_location_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset) +{ CONS_Location *result = push_array(root->arena, CONS_Location, 1); result->kind = RADDBG_LocationKind_AddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; - return(result); + return result; } static CONS_Location* -cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset){ +cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset) +{ CONS_Location *result = push_array(root->arena, CONS_Location, 1); result->kind = RADDBG_LocationKind_AddrAddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; - return(result); + return result; } static CONS_Location* -cons_location_val_reg(CONS_Root *root, U8 reg_code){ +cons_location_val_reg(CONS_Root *root, U8 reg_code) +{ CONS_Location *result = push_array(root->arena, CONS_Location, 1); result->kind = RADDBG_LocationKind_ValRegister; result->register_code = reg_code; - return(result); + return result; } -// bytecode - -static void -cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBG_EvalOp op, U64 p){ - U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op]; - U32 p_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits); - - CONS_EvalBytecodeOp *node = push_array(arena, CONS_EvalBytecodeOp, 1); - node->op = op; - node->p_size = p_size; - node->p = p; - - SLLQueuePush(bytecode->first_op, bytecode->last_op, node); - bytecode->op_count += 1; - bytecode->encoded_size += 1 + p_size; -} - -static void -cons_bytecode_push_uconst(Arena *arena, CONS_EvalBytecode *bytecode, U64 x){ - if (x <= 0xFF){ - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU8, x); - } - else if (x <= 0xFFFF){ - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU16, x); - } - else if (x <= 0xFFFFFFFF){ - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU32, x); - } - else{ - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU64, x); - } -} - -static void -cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, S64 x){ - if (-0x80 <= x && x <= 0x7F){ - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU8, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 8); - } - else if (-0x8000 <= x && x <= 0x7FFF){ - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU16, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 16); - } - else if (-0x80000000ll <= x && x <= 0x7FFFFFFFll){ - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU32, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 32); - } - else{ - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU64, (U64)x); - } -} - -static void -cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *right_destroyed){ - if (right_destroyed->first_op != 0){ - if (left_dst->first_op == 0){ - MemoryCopyStruct(left_dst, right_destroyed); - } - else{ - left_dst->last_op = right_destroyed->last_op; - left_dst->op_count += right_destroyed->op_count; - left_dst->encoded_size += right_destroyed->encoded_size; - } - MemoryZeroStruct(right_destroyed); - } -} - - - -//////////////////////////////// -//- Implementation Helpers - -// types - -static CONS_Type* -cons__type_new(CONS_Root *root){ - ProfBeginFunction(); - CONS_Type *result = push_array(root->arena, CONS_Type, 1); - result->idx = root->type_count; - SLLQueuePush_N(root->first_type, root->last_type, result, next_order); - root->type_count += 1; - ProfEnd(); - return(result); -} - -static CONS_TypeUDT* -cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *type){ - if (type->udt == 0){ - CONS_TypeUDT *new_udt = push_array(root->arena, CONS_TypeUDT, 1); - new_udt->idx = root->type_udt_count; - SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); - root->type_udt_count += 1; - new_udt->self_type = type; - type->udt = new_udt; - } - CONS_TypeUDT *result = type->udt; - return(result); -} - -static CONS_TypeUDT* -cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type){ - CONS_TypeUDT *result = 0; - - if (!(type->kind == RADDBG_TypeKind_Struct || - type->kind == RADDBG_TypeKind_Class || - type->kind == RADDBG_TypeKind_Union)){ - // TODO(allen): API error - } - else{ - result = cons__type_udt_from_any_type(root, type); - } - - return(result); -} - -// scopes - -static void -cons__scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol){ - scope->symbol = symbol; - for (CONS_Scope *node = scope->first_child; - node != 0; - node = node->next_sibling){ - cons__scope_recursive_set_symbol(node, symbol); - } -} - -// name maps +//- rjf: name map building static CONS__NameMap* -cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind){ +cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind) +{ CONS__NameMap *result = 0; - if (kind < RADDBG_NameMapKind_COUNT){ - if (root->name_maps[kind] == 0){ + if(kind < RADDBG_NameMapKind_COUNT) + { + if(root->name_maps[kind] == 0) + { root->name_maps[kind] = push_array(root->arena, CONS__NameMap, 1); root->name_maps[kind]->buckets_count = 16384; root->name_maps[kind]->buckets = push_array(root->arena, CONS__NameMapNode *, root->name_maps[kind]->buckets_count); } result = root->name_maps[kind]; } - return(result); + return result; } static void -cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 idx){ - +cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 idx) +{ // hash U64 hash = raddbg_hash(string.str, string.size); U64 bucket_idx = hash%map->buckets_count; // find existing name node CONS__NameMapNode *match = 0; - for (CONS__NameMapNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->bucket_next){ - if (str8_match(string, node->string, 0)){ + for(CONS__NameMapNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->bucket_next) + { + if(str8_match(string, node->string, 0)) + { match = node; break; } } // make name node if necessary - if (match == 0){ + if(match == 0) + { match = push_array(root->arena, CONS__NameMapNode, 1); match->string = push_str8_copy(root->arena, string); SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); @@ -1762,14 +1610,18 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 // find existing idx B32 existing_idx = 0; - for (CONS__NameMapIdxNode *node = match->idx_first; - node != 0; - node = node->next){ - for (U32 i = 0; i < ArrayCount(node->idx); i += 1){ - if (node->idx[i] == 0){ + for(CONS__NameMapIdxNode *node = match->idx_first; + node != 0; + node = node->next) + { + for(U32 i = 0; i < ArrayCount(node->idx); i += 1) + { + if(node->idx[i] == 0) + { break; } - if (node->idx[i] == idx){ + if(node->idx[i] == idx) + { existing_idx = 1; break; } @@ -1777,11 +1629,12 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 } // insert new idx if necessary - if (!existing_idx){ + if(!existing_idx) + { CONS__NameMapIdxNode *idx_node = match->idx_last; - U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); - if (insert_i == 0){ + if(insert_i == 0) + { idx_node = push_array(root->arena, CONS__NameMapIdxNode, 1); SLLQueuePush(match->idx_first, match->idx_last, idx_node); } @@ -1789,116 +1642,12 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 idx_node->idx[insert_i] = idx; match->idx_count += 1; } - } -// u64 to ptr map +//////////////////////////////// +//~ rjf: Debug Info Baking (Loose -> Tight) Functions -static void -cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count){ - Assert(IsPow2OrZero(bucket_count) && bucket_count > 0); - map->buckets = push_array(arena, CONS__U64ToPtrNode*, bucket_count); - map->buckets_count = bucket_count; -} - -static void -cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out){ - U64 bucket_idx = hash&(map->buckets_count - 1); - CONS__U64ToPtrNode *check_node = map->buckets[bucket_idx]; - for (;check_node != 0; check_node = check_node->next){ - for (U32 k = 0; k < ArrayCount(check_node->key); k += 1){ - if (check_node->ptr[k] == 0){ - lookup_out->fill_node = check_node; - lookup_out->fill_k = k; - break; - } - else if (check_node->key[k] == key){ - lookup_out->match = check_node->ptr[k]; - break; - } - } - } -} - -static void -cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, - CONS__U64ToPtrLookup *lookup, void *ptr){ - if (lookup->fill_node != 0){ - CONS__U64ToPtrNode *node = lookup->fill_node; - U32 k = lookup->fill_k; - node->key[k] = key; - node->ptr[k] = ptr; - } - else{ - U64 bucket_idx = hash&(map->buckets_count - 1); - - CONS__U64ToPtrNode *node = push_array(arena, CONS__U64ToPtrNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - node->key[0] = key; - node->ptr[0] = ptr; - - lookup->fill_node = node; - lookup->fill_k = 0; - - map->pair_count += 1; - map->bucket_collision_count += (node->next != 0); - } -} - -// str8 to ptr map - -static void -cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count) -{ - map->buckets_count = bucket_count; - map->buckets = push_array(arena, CONS__Str8ToPtrNode*, map->buckets_count); -} - -static void* -cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash){ - void *result = 0; - U64 bucket_idx = hash%map->buckets_count; - for (CONS__Str8ToPtrNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next){ - if (node->hash == hash && str8_match(node->key, key, 0)){ - result = node->ptr; - break; - } - } - return(result); -} - -static void -cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 hash, void *ptr){ - U64 bucket_idx = hash%map->buckets_count; - - CONS__Str8ToPtrNode *node = push_array(arena, CONS__Str8ToPtrNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - - node->key = push_str8_copy(arena, key); - node->hash = hash; - node->ptr = ptr; - map->bucket_collision_count += (node->next != 0); - map->pair_count += 1; -} - - -//- cons intermediate functions - -static U32 -cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_DataSectionTag tag){ - U32 result = dss->count; - - CONS__DSectionNode *node = push_array(arena, CONS__DSectionNode, 1); - SLLQueuePush(dss->first, dss->last, node); - node->data = data; - node->size = size; - node->tag = tag; - dss->count += 1; - - return(result); -} +//- rjf: bake context construction static CONS__BakeCtx* cons__bake_ctx_begin(CONS__BakeParams *params) @@ -1914,7 +1663,6 @@ cons__bake_ctx_begin(CONS__BakeParams *params) result->idxs.buckets = push_array(arena, CONS__IdxRunNode *, result->idxs.buckets_count); cons__string(result, str8_lit("")); - cons__idx_run(result, 0, 0); result->tree = push_array(arena, CONS__PathTree, 1); @@ -1927,46 +1675,48 @@ cons__bake_ctx_begin(CONS__BakeParams *params) nil_path_node->src_file = nil_src_node; } - return(result); + return result; } static void -cons__bake_ctx_release(CONS__BakeCtx *bake_ctx){ +cons__bake_ctx_release(CONS__BakeCtx *bake_ctx) +{ arena_release(bake_ctx->arena); } +//- rjf: string baking static U32 -cons__string(CONS__BakeCtx *bctx, String8 str){ +cons__string(CONS__BakeCtx *bctx, String8 str) +{ Arena *arena = bctx->arena; CONS__Strings *strs = &bctx->strs; - U64 hash = raddbg_hash(str.str, str.size); U64 bucket_idx = hash%strs->buckets_count; // look for a match CONS__StringNode *match = 0; - for (CONS__StringNode *node = strs->buckets[bucket_idx]; - node != 0; - node = node->bucket_next){ - if (node->hash == hash && - str8_match(node->str, str, 0)){ + for(CONS__StringNode *node = strs->buckets[bucket_idx]; + node != 0; + node = node->bucket_next) + { + if(node->hash == hash && str8_match(node->str, str, 0)) + { match = node; break; } } // insert new node if no match - if (match == 0){ + if(match == 0) + { CONS__StringNode *node = push_array_no_zero(arena, CONS__StringNode, 1); node->str = push_str8_copy(arena, str); node->hash = hash; node->idx = strs->count; strs->count += 1; - SLLQueuePush_N(strs->order_first, strs->order_last, node, order_next); SLLStackPush_N(strs->buckets[bucket_idx], node, bucket_next); - match = node; strs->bucket_collision_count += (node->bucket_next != 0); } @@ -1974,23 +1724,27 @@ cons__string(CONS__BakeCtx *bctx, String8 str){ // extract idx to return Assert(match != 0); U32 result = match->idx; - - return(result); + return result; } +//- rjf: idx run baking + static U64 -cons__idx_run_hash(U32 *idx_run, U32 count){ +cons__idx_run_hash(U32 *idx_run, U32 count) +{ U64 hash = 5381; U32 *ptr = idx_run; U32 *opl = idx_run + count; - for (; ptr < opl; ptr += 1){ + for(;ptr < opl; ptr += 1) + { hash = ((hash << 5) + hash) + (*ptr); } return(hash); } static U32 -cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count){ +cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count) +{ Arena *arena = bctx->arena; CONS__IdxRuns *idxs = &bctx->idxs; @@ -1999,19 +1753,24 @@ cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count){ // look for a match CONS__IdxRunNode *match = 0; - for (CONS__IdxRunNode *node = idxs->buckets[bucket_idx]; - node != 0; - node = node->bucket_next){ - if (node->hash == hash){ + for(CONS__IdxRunNode *node = idxs->buckets[bucket_idx]; + node != 0; + node = node->bucket_next) + { + if(node->hash == hash) + { S32 is_match = 1; U32 *node_idx = node->idx_run; - for (U32 i = 0; i < count; i += 1){ - if (node_idx[i] != idx_run[i]){ + for(U32 i = 0; i < count; i += 1) + { + if(node_idx[i] != idx_run[i]) + { is_match = 0; break; } } - if (is_match){ + if(is_match) + { match = node; break; } @@ -2019,23 +1778,22 @@ cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count){ } // insert new node if no match - if (match == 0){ + if(match == 0) + { CONS__IdxRunNode *node = push_array_no_zero(arena, CONS__IdxRunNode, 1); U32 *idx_run_copy = push_array_no_zero(arena, U32, count); - for (U32 i = 0; i < count; i += 1){ + for(U32 i = 0; i < count; i += 1) + { idx_run_copy[i] = idx_run[i]; } node->idx_run = idx_run_copy; node->hash = hash; node->count = count; node->first_idx = idxs->idx_count; - idxs->count += 1; idxs->idx_count += count; - SLLQueuePush_N(idxs->order_first, idxs->order_last, node, order_next); SLLStackPush_N(idxs->buckets[bucket_idx], node, bucket_next); - match = node; idxs->bucket_collision_count += (node->bucket_next != 0); } @@ -2043,115 +1801,33 @@ cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count){ // extract idx to return Assert(match != 0); U32 result = match->first_idx; - - return(result); + return result; } -static CONS__PathNode* -cons__paths_new_node(CONS__BakeCtx *bctx){ - CONS__PathTree *tree = bctx->tree; - CONS__PathNode *result = push_array(bctx->arena, CONS__PathNode, 1); - SLLQueuePush_N(tree->first, tree->last, result, next_order); - result->idx = tree->count; - tree->count += 1; - return(result); -} - -static CONS__PathNode* -cons__paths_sub_path(CONS__BakeCtx *bctx, CONS__PathNode *dir, String8 sub_dir){ - // look for existing match - CONS__PathNode *match = 0; - for (CONS__PathNode *node = dir->first_child; - node != 0; - node = node->next_sibling){ - if (str8_match(node->name, sub_dir, StringMatchFlag_CaseInsensitive)){ - match = node; - break; - } - } - - // construct new node if no match - CONS__PathNode *new_node = 0; - if (match == 0){ - new_node = cons__paths_new_node(bctx); - new_node->parent = dir; - SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); - new_node->name = push_str8_copy(bctx->arena, sub_dir); - } - - // select result from the two paths - CONS__PathNode *result = match; - if (match == 0){ - result = new_node; - } - - return(result); -} - -static CONS__PathNode* -cons__paths_node_from_path(CONS__BakeCtx *bctx, String8 path){ - CONS__PathNode *node_cursor = &bctx->tree->root; - - U8 *ptr = path.str; - U8 *opl = path.str + path.size; - for (;ptr < opl;){ - // skip past slashes - for (;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); - - // save beginning of non-slash range - U8 *range_first = ptr; - - // skip past non-slashes - for (;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); - - // if range is non-empty advance the node cursor - if (range_first < ptr){ - String8 sub_dir = str8_range(range_first, ptr); - node_cursor = cons__paths_sub_path(bctx, node_cursor, sub_dir); - } - } - - CONS__PathNode *result = node_cursor; - return(result); -} +//- rjf: data section baking static U32 -cons__paths_idx_from_path(CONS__BakeCtx *bctx, String8 path){ - CONS__PathNode *node = cons__paths_node_from_path(bctx, path); - U32 result = node->idx; - return(result); +cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_DataSectionTag tag) +{ + U32 result = dss->count; + CONS__DSectionNode *node = push_array(arena, CONS__DSectionNode, 1); + SLLQueuePush(dss->first, dss->last, node); + node->data = data; + node->size = size; + node->tag = tag; + dss->count += 1; + return result; } -static CONS__SrcNode* -cons__paths_new_src_node(CONS__BakeCtx *bctx){ - CONS__PathTree *tree = bctx->tree; - CONS__SrcNode *result = push_array(bctx->arena, CONS__SrcNode, 1); - SLLQueuePush(tree->src_first, tree->src_last, result); - result->idx = tree->src_count; - tree->src_count += 1; - return(result); -} - -static CONS__SrcNode* -cons__paths_src_node_from_path_node(CONS__BakeCtx *bctx, CONS__PathNode *path_node){ - CONS__SrcNode *result = path_node->src_file; - if (result == 0){ - CONS__SrcNode *new_node = cons__paths_new_src_node(bctx); - new_node->path_node = path_node; - new_node->normal_full_path = cons__normal_string_from_path_node(bctx->arena, path_node); - result = path_node->src_file = new_node; - } - return(result); -} - - -//- cons path helper +//- rjf: paths baking static String8 -cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node){ +cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node) +{ Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; - if (node != 0){ + if(node != 0) + { cons__normal_string_from_path_node_build(scratch.arena, node, &list); } StringJoin join = {0}; @@ -2160,177 +1836,140 @@ cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node){ { U8 *ptr = result.str; U8 *opl = result.str + result.size; - for (; ptr < opl; ptr += 1){ + for(; ptr < opl; ptr += 1) + { U8 c = *ptr; - if ('A' <= c && c <= 'Z') c += 'a' - 'A'; + if('A' <= c && c <= 'Z') { c += 'a' - 'A'; } *ptr = c; } } scratch_end(scratch); - return(result); + return result; } static void -cons__normal_string_from_path_node_build(Arena *arena, CONS__PathNode *node, String8List *out){ - if (node->parent != 0){ +cons__normal_string_from_path_node_build(Arena *arena, CONS__PathNode *node, String8List *out) +{ + // TODO(rjf): why is this recursive... + if(node->parent != 0) + { cons__normal_string_from_path_node_build(arena, node->parent, out); } - if (node->name.size > 0){ + if(node->name.size > 0) + { str8_list_push(arena, out, node->name); } } - -//- cons sort helper - -static CONS__SortKey* -cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count){ - // This sort is designed to take advantage of lots of pre-existing sorted ranges. - // Most line info is already sorted or close to already sorted. - // Similarly most vmap data has lots of pre-sorted ranges. etc. etc. - // Also - this sort should be a "stable" sort. In the use case of sorting vmap - // ranges, we want to be able to rely on order, so it needs to be preserved here. - - ProfBegin("cons__sort_key_array"); - Temp scratch = scratch_begin(&arena, 1); - - CONS__SortKey *result = 0; - - if (count <= 1){ - result = keys; - } - else{ - CONS__OrderedRange *ranges_first = 0; - CONS__OrderedRange *ranges_last = 0; - U64 range_count = 0; - { - U64 pos = 0; - for (;pos < count;){ - // identify ordered range - U64 first = pos; - U64 opl = pos + 1; - for (; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); - - // generate an ordered range node - CONS__OrderedRange *new_range = push_array(scratch.arena, CONS__OrderedRange, 1); - SLLQueuePush(ranges_first, ranges_last, new_range); - range_count += 1; - new_range->first = first; - new_range->opl = opl; - - // update pos - pos = opl; - } - } - - if (range_count == 1){ - result = keys; - } - else{ - CONS__SortKey *keys_swap = push_array_no_zero(arena, CONS__SortKey, count); - - CONS__SortKey *src = keys; - CONS__SortKey *dst = keys_swap; - - CONS__OrderedRange *src_ranges = ranges_first; - CONS__OrderedRange *dst_ranges = 0; - CONS__OrderedRange *dst_ranges_last = 0; - - for (;;){ - // begin a pass - for (;;){ - // end pass when out of ranges - if (src_ranges == 0){ - break; - } - - // get first range - CONS__OrderedRange *range1 = src_ranges; - SLLStackPop(src_ranges); - - // if this range is the whole array, we are done - if (range1->first == 0 && range1->opl == count){ - result = src; - goto sort_done; - } - - // if there is not a second range, save this range for next time and end this pass - if (src_ranges == 0){ - U64 first = range1->first; - MemoryCopy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); - SLLQueuePush(dst_ranges, dst_ranges_last, range1); - break; - } - - // get second range - CONS__OrderedRange *range2 = src_ranges; - SLLStackPop(src_ranges); - - Assert(range1->opl == range2->first); - - // merge these ranges - U64 jd = range1->first; - U64 j1 = range1->first; - U64 j1_opl = range1->opl; - U64 j2 = range2->first; - U64 j2_opl = range2->opl; - for (;;){ - if (src[j1].key <= src[j2].key){ - MemoryCopy(dst + jd, src + j1, sizeof(*src)); - j1 += 1; - jd += 1; - if (j1 >= j1_opl){ - break; - } - } - else{ - MemoryCopy(dst + jd, src + j2, sizeof(*src)); - j2 += 1; - jd += 1; - if (j2 >= j2_opl){ - break; - } - } - } - if (j1 < j1_opl){ - MemoryCopy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1)); - } - else{ - MemoryCopy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2)); - } - - // save this as one range - range1->opl = range2->opl; - SLLQueuePush(dst_ranges, dst_ranges_last, range1); - } - - // end pass by swapping buffers and range nodes - Swap(CONS__SortKey*, src, dst); - src_ranges = dst_ranges; - dst_ranges = 0; - dst_ranges_last = 0; - } - } - } - sort_done:; - -#if 0 - // assert sortedness - for (U64 i = 1; i < count; i += 1){ - Assert(result[i - 1].key <= result[i].key); - } -#endif - - scratch_end(scratch); - ProfEnd(); - - return(result); +static CONS__PathNode* +cons__paths_new_node(CONS__BakeCtx *bctx) +{ + CONS__PathTree *tree = bctx->tree; + CONS__PathNode *result = push_array(bctx->arena, CONS__PathNode, 1); + SLLQueuePush_N(tree->first, tree->last, result, next_order); + result->idx = tree->count; + tree->count += 1; + return result; } +static CONS__PathNode* +cons__paths_sub_path(CONS__BakeCtx *bctx, CONS__PathNode *dir, String8 sub_dir) +{ + // look for existing match + CONS__PathNode *match = 0; + for(CONS__PathNode *node = dir->first_child; + node != 0; + node = node->next_sibling){ + if(str8_match(node->name, sub_dir, StringMatchFlag_CaseInsensitive)){ + match = node; + break; + } + } + + // construct new node if no match + CONS__PathNode *new_node = 0; + if(match == 0){ + new_node = cons__paths_new_node(bctx); + new_node->parent = dir; + SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); + new_node->name = push_str8_copy(bctx->arena, sub_dir); + } + + // select result from the two paths + CONS__PathNode *result = match; + if(match == 0){ + result = new_node; + } + + return result; +} + +static CONS__PathNode* +cons__paths_node_from_path(CONS__BakeCtx *bctx, String8 path) +{ + CONS__PathNode *node_cursor = &bctx->tree->root; + + U8 *ptr = path.str; + U8 *opl = path.str + path.size; + for(;ptr < opl;){ + // skip past slashes + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + + // save beginning of non-slash range + U8 *range_first = ptr; + + // skip past non-slashes + for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); + + // if range is non-empty advance the node cursor + if(range_first < ptr){ + String8 sub_dir = str8_range(range_first, ptr); + node_cursor = cons__paths_sub_path(bctx, node_cursor, sub_dir); + } + } + + CONS__PathNode *result = node_cursor; + return result; +} + +static U32 +cons__paths_idx_from_path(CONS__BakeCtx *bctx, String8 path) +{ + CONS__PathNode *node = cons__paths_node_from_path(bctx, path); + U32 result = node->idx; + return result; +} + +static CONS__SrcNode* +cons__paths_new_src_node(CONS__BakeCtx *bctx) +{ + CONS__PathTree *tree = bctx->tree; + CONS__SrcNode *result = push_array(bctx->arena, CONS__SrcNode, 1); + SLLQueuePush(tree->src_first, tree->src_last, result); + result->idx = tree->src_count; + tree->src_count += 1; + return result; +} + +static CONS__SrcNode* +cons__paths_src_node_from_path_node(CONS__BakeCtx *bctx, CONS__PathNode *path_node) +{ + CONS__SrcNode *result = path_node->src_file; + if(result == 0) + { + CONS__SrcNode *new_node = cons__paths_new_src_node(bctx); + new_node->path_node = path_node; + new_node->normal_full_path = cons__normal_string_from_path_node(bctx->arena, path_node); + result = path_node->src_file = new_node; + } + return result; +} + +//- rjf: per-unit line info baking -//- cons intermediate unit line info static CONS__UnitLinesCombined* -cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNode *first_seq){ +cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNode *first_seq) +{ ProfBegin("cons__unit_combine_lines"); Temp scratch = scratch_begin(&arena, 1); @@ -2339,9 +1978,9 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod // recs: contains all the source coordinates for a range of voffs U64 line_count = 0; U64 seq_count = 0; - for (CONS_LineSequenceNode *node = first_seq; - node != 0; - node = node->next){ + for(CONS_LineSequenceNode *node = first_seq; + node != 0; + node = node->next){ seq_count += 1; line_count += node->line_seq.line_count; } @@ -2354,23 +1993,23 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod CONS__SortKey *key_ptr = line_keys; CONS__LineRec *rec_ptr = line_recs; - for (CONS_LineSequenceNode *node = first_seq; - node != 0; - node = node->next){ + for(CONS_LineSequenceNode *node = first_seq; + node != 0; + node = node->next){ CONS__PathNode *src_path = cons__paths_node_from_path(bctx, node->line_seq.file_name); CONS__SrcNode *src_file = cons__paths_src_node_from_path_node(bctx, src_path); U32 file_id = src_file->idx; U64 node_line_count = node->line_seq.line_count; - for (U64 i = 0; i < node_line_count; i += 1){ + for(U64 i = 0; i < node_line_count; i += 1){ key_ptr->key = node->line_seq.voffs[i]; key_ptr->val = rec_ptr; key_ptr += 1; rec_ptr->file_id = file_id; rec_ptr->line_num = node->line_seq.line_nums[i]; - if (node->line_seq.col_nums != 0){ + if(node->line_seq.col_nums != 0){ rec_ptr->col_first = node->line_seq.col_nums[i*2]; rec_ptr->col_opl = node->line_seq.col_nums[i*2 + 1]; } @@ -2397,13 +2036,13 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod U64 *arranged_voffs = push_array_no_zero(arena, U64, key_count + 1); RADDBG_Line *arranged_lines = push_array_no_zero(arena, RADDBG_Line, key_count); - for (U64 i = 0; i < key_count; i += 1){ + for(U64 i = 0; i < key_count; i += 1){ arranged_voffs[i] = sorted_line_keys[i].key; } arranged_voffs[key_count] = ~0ull; - for (U64 i = 0; i < key_count; i += 1){ + for(U64 i = 0; i < key_count; i += 1){ CONS__LineRec *rec = (CONS__LineRec*)sorted_line_keys[i].val; - if (rec != 0){ + if(rec != 0){ arranged_lines[i].file_idx = rec->file_id; arranged_lines[i].line_num = rec->line_num; } @@ -2422,13 +2061,14 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod scratch_end(scratch); ProfEnd(); - return(result); + return result; } +//- rjf: per-src line info baking -//- cons intermediate source line info static CONS__SrcLinesCombined* -cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ +cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) +{ ProfBegin("cons__source_combine_lines"); Temp scratch = scratch_begin(&arena, 1); @@ -2442,16 +2082,16 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ U64 max_line_num = 0; ProfScope("gather line number map") { - for (CONS__LineMapFragment *map_fragment = first; - map_fragment != 0; - map_fragment = map_fragment->next) + for(CONS__LineMapFragment *map_fragment = first; + map_fragment != 0; + map_fragment = map_fragment->next) { CONS_LineSequence *sequence = &map_fragment->sequence->line_seq; U64 *seq_voffs = sequence->voffs; U32 *seq_line_nums = sequence->line_nums; U64 seq_line_count = sequence->line_count; - for (U64 i = 0; i < seq_line_count; i += 1){ + for(U64 i = 0; i < seq_line_count; i += 1){ U32 line_num = seq_line_nums[i]; U64 voff = seq_voffs[i]; U64 line_hash_slot_idx = line_num%line_hash_slots_count; @@ -2463,10 +2103,10 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ // find match CONS__SrcLineMapBucket *match = 0; { - for (CONS__SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; - node != 0; - node = node->hash_next){ - if (node->line_num == line_num){ + for(CONS__SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + node != 0; + node = node->hash_next){ + if(node->line_num == line_num){ match = node; break; } @@ -2474,7 +2114,7 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ } // introduce new line if no match - if (match == 0){ + if(match == 0){ match = push_array(scratch.arena, CONS__SrcLineMapBucket, 1); SLLQueuePush_N(first_bucket, last_bucket, match, order_next); SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); @@ -2498,9 +2138,9 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ ProfScope("bake sortable keys array") { CONS__SortKey *key_ptr = keys; - for (CONS__SrcLineMapBucket *node = first_bucket; - node != 0; - node = node->order_next, key_ptr += 1){ + for(CONS__SrcLineMapBucket *node = first_bucket; + node != 0; + node = node->order_next, key_ptr += 1){ key_ptr->key = node->line_num; key_ptr->val = node; } @@ -2516,13 +2156,13 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ ProfScope("bake result") { U64 *voff_ptr = voffs; - for (U32 i = 0; i < line_count; i += 1){ + for(U32 i = 0; i < line_count; i += 1){ line_nums[i] = sorted_keys[i].key; line_ranges[i] = (U32)(voff_ptr - voffs); CONS__SrcLineMapBucket *bucket = (CONS__SrcLineMapBucket*)sorted_keys[i].val; - for (CONS__SrcLineMapVoffBlock *node = bucket->first_voff_block; - node != 0; - node = node->next){ + for(CONS__SrcLineMapVoffBlock *node = bucket->first_voff_block; + node != 0; + node = node->next){ *voff_ptr = node->voff; voff_ptr += 1; } @@ -2540,13 +2180,13 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first){ scratch_end(scratch); ProfEnd(); - return(result); + return result; } - -//- cons intermediate vmap type +//- rjf: vmap baking static CONS__VMap* -cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey *keys, U64 marker_count){ +cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey *keys, U64 marker_count) +{ Temp scratch = scratch_begin(&arena, 1); // sort markers @@ -2554,7 +2194,7 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * // determine if an extra vmap entry for zero is needed U32 extra_vmap_entry = 0; - if (marker_count > 0 && sorted_keys[0].key != 0){ + if(marker_count > 0 && sorted_keys[0].key != 0){ extra_vmap_entry = 1; } @@ -2566,7 +2206,7 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * { RADDBG_VMapEntry *vmap_ptr = vmap; - if (extra_vmap_entry){ + if(extra_vmap_entry){ vmap_ptr->voff = 0; vmap_ptr->idx = 0; vmap_ptr += 1; @@ -2577,10 +2217,10 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * CONS__SortKey *key_ptr = sorted_keys; CONS__SortKey *key_opl = sorted_keys + marker_count; - for (;key_ptr < key_opl;){ + for(;key_ptr < key_opl;){ // get initial map state from tracker stack U32 initial_idx = max_U32; - if (tracker_stack != 0){ + if(tracker_stack != 0){ initial_idx = tracker_stack->idx; } @@ -2588,14 +2228,14 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * // * we must process _all_ of the changes that apply at this voff before moving on U64 voff = key_ptr->key; - for (;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ + for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ CONS__VMapMarker *marker = (CONS__VMapMarker*)key_ptr->val; U32 idx = marker->idx; // push to stack - if (marker->begin_range){ + if(marker->begin_range){ CONS__VMapRangeTracker *new_tracker = tracker_free; - if (new_tracker != 0){ + if(new_tracker != 0){ SLLStackPop(tracker_free); } else{ @@ -2609,16 +2249,16 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * else{ CONS__VMapRangeTracker **ptr_in = &tracker_stack; CONS__VMapRangeTracker *match = 0; - for (CONS__VMapRangeTracker *node = tracker_stack; - node != 0;){ - if (node->idx == idx){ + for(CONS__VMapRangeTracker *node = tracker_stack; + node != 0;){ + if(node->idx == idx){ match = node; break; } ptr_in = &node->next; node = node->next; } - if (match != 0){ + if(match != 0){ *ptr_in = match->next; SLLStackPush(tracker_free, match); } @@ -2627,12 +2267,12 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * // get final map state from tracker stack U32 final_idx = 0; - if (tracker_stack != 0){ + if(tracker_stack != 0){ final_idx = tracker_stack->idx; } // if final is different from initial - emit new vmap entry - if (final_idx != initial_idx){ + if(final_idx != initial_idx){ vmap_ptr->voff = voff; vmap_ptr->idx = final_idx; vmap_ptr += 1; @@ -2652,9 +2292,9 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * RADDBG_VMapEntry *vmap_ptr = vmap; U64 real_idx = 0; - for (U32 i = 0; i < last; i += 1, vmap_ptr += 1){ + for(U32 i = 0; i < last; i += 1, vmap_ptr += 1){ // is this a zero after a real index? - if (vmap_ptr->idx == 0){ + if(vmap_ptr->idx == 0){ vmap_ptr->idx = real_idx; } @@ -2672,11 +2312,11 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * RADDBG_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; RADDBG_VMapEntry *vmap_out = vmap; - for (;vmap_ptr < vmap_opl;){ + for(;vmap_ptr < vmap_opl;){ RADDBG_VMapEntry *vmap_range_first = vmap_ptr; U64 idx = vmap_ptr->idx; vmap_ptr += 1; - for (;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; + for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; MemoryCopyStruct(vmap_out, vmap_range_first); vmap_out += 1; } @@ -2691,13 +2331,12 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * scratch_end(scratch); - return(result); + return result; } - -//- cons intermediate unit vmap static CONS__VMap* -cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count){ +cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) +{ Temp scratch = scratch_begin(&arena, 1); // count necessary markers @@ -2710,10 +2349,10 @@ cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count){ { CONS__SortKey *key_ptr = keys; CONS__VMapMarker *marker_ptr = markers; - for (CONS_UnitVMapRange *range = first; - range != 0; - range = range->next){ - if (range->first < range->opl){ + for(CONS_UnitVMapRange *range = first; + range != 0; + range = range->next){ + if(range->first < range->opl){ U32 unit_idx = range->unit->idx; key_ptr->key = range->first; @@ -2735,15 +2374,25 @@ cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count){ // construct vmap CONS__VMap *result = cons__vmap_from_markers(arena, markers, keys, marker_count); - scratch_end(scratch); - - return(result); + return result; +} + +//- rjf: type info baking + +static U32* +cons__idx_run_from_types(Arena *arena, CONS_Type **types, U32 count) +{ + U32 *result = push_array(arena, U32, count); + for(U32 i = 0; i < count; i += 1){ + result[i] = types[i]->idx; + } + return result; } -//- cons intermediate types static CONS__TypeData* -cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ +cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) +{ ProfBegin("cons__type_data_combine"); Temp scratch = scratch_begin(&arena, 1); @@ -2755,8 +2404,8 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ RADDBG_TypeNode *ptr = type_nodes; RADDBG_TypeNode *opl = ptr + type_count; CONS_Type *loose_type = root->first_type; - for (;loose_type != 0 && ptr < opl; - loose_type = loose_type->next_order, ptr += 1){ + for(;loose_type != 0 && ptr < opl; + loose_type = loose_type->next_order, ptr += 1){ RADDBG_TypeKind kind = loose_type->kind; @@ -2766,12 +2415,12 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ ptr->byte_size = loose_type->byte_size; // built-in - if (RADDBG_TypeKind_FirstBuiltIn <= kind && kind <= RADDBG_TypeKind_LastBuiltIn){ + if(RADDBG_TypeKind_FirstBuiltIn <= kind && kind <= RADDBG_TypeKind_LastBuiltIn){ ptr->built_in.name_string_idx = cons__string(bctx, loose_type->name); } // constructed - else if (RADDBG_TypeKind_FirstConstructed <= kind && kind <= RADDBG_TypeKind_LastConstructed){ + else if(RADDBG_TypeKind_FirstConstructed <= kind && kind <= RADDBG_TypeKind_LastConstructed){ ptr->constructed.direct_type_idx = loose_type->direct_type->idx; switch (kind){ @@ -2801,18 +2450,18 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ } // user-defined - else if (RADDBG_TypeKind_FirstUserDefined <= kind && kind <= RADDBG_TypeKind_LastUserDefined){ + else if(RADDBG_TypeKind_FirstUserDefined <= kind && kind <= RADDBG_TypeKind_LastUserDefined){ ptr->user_defined.name_string_idx = cons__string(bctx, loose_type->name); - if (loose_type->udt != 0){ + if(loose_type->udt != 0){ ptr->user_defined.udt_idx = loose_type->udt->idx; } - if (loose_type->direct_type != 0){ + if(loose_type->direct_type != 0){ ptr->user_defined.direct_type_idx = loose_type->direct_type->idx; } } // bitfield - else if (kind == RADDBG_TypeKind_Bitfield){ + else if(kind == RADDBG_TypeKind_Bitfield){ ptr->bitfield.off = loose_type->off; ptr->bitfield.size = loose_type->count; } @@ -2847,15 +2496,15 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ RADDBG_EnumMember *enum_member_opl = enum_members + enum_member_count; CONS_TypeUDT *loose_udt = root->first_udt; - for (;loose_udt != 0 && ptr < opl; - loose_udt = loose_udt->next_order, ptr += 1){ + for(;loose_udt != 0 && ptr < opl; + loose_udt = loose_udt->next_order, ptr += 1){ ptr->self_type_idx = loose_udt->self_type->idx; Assert(loose_udt->member_count == 0 || loose_udt->enum_val_count == 0); // enum members - if (loose_udt->enum_val_count != 0){ + if(loose_udt->enum_val_count != 0){ ptr->flags |= RADDBG_UserDefinedTypeFlag_EnumMembers; ptr->member_first = (U32)(enum_member_ptr - enum_members); @@ -2863,9 +2512,9 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ U32 local_enum_val_count = loose_udt->enum_val_count; CONS_TypeEnumVal *loose_enum_val = loose_udt->first_enum_val; - for (U32 i = 0; - i < local_enum_val_count; - i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ + for(U32 i = 0; + i < local_enum_val_count; + i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ enum_member_ptr->name_string_idx = cons__string(bctx, loose_enum_val->name); enum_member_ptr->val = loose_enum_val->val; } @@ -2878,9 +2527,9 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ U32 local_member_count = loose_udt->member_count; CONS_TypeMember *loose_member = loose_udt->first_member; - for (U32 i = 0; - i < local_member_count; - i += 1, member_ptr += 1, loose_member = loose_member->next){ + for(U32 i = 0; + i < local_member_count; + i += 1, member_ptr += 1, loose_member = loose_member->next){ member_ptr->kind = loose_member->kind; // TODO(allen): member_ptr->visibility = ; member_ptr->name_string_idx = cons__string(bctx, loose_member->name); @@ -2888,7 +2537,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ member_ptr->type_idx = loose_member->type->idx; // TODO(allen): - if (loose_member->kind == RADDBG_MemberKind_Method){ + if(loose_member->kind == RADDBG_MemberKind_Method){ //loose_member_ptr->unit_idx = ; //loose_member_ptr->proc_symbol_idx = ; } @@ -2897,7 +2546,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ } U32 file_idx = 0; - if (loose_udt->source_path.size > 0){ + if(loose_udt->source_path.size > 0){ CONS__PathNode *path_node = cons__paths_node_from_path(bctx, loose_udt->source_path); CONS__SrcNode *src_node = cons__paths_src_node_from_path_node(bctx, path_node); file_idx = src_node->idx; @@ -2929,22 +2578,14 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ scratch_end(scratch); ProfEnd(); - - return(result); + return result; } -static U32* -cons__idx_run_from_types(Arena *arena, CONS_Type **types, U32 count){ - U32 *result = push_array(arena, U32, count); - for (U32 i = 0; i < count; i += 1){ - result[i] = types[i]->idx; - } - return(result); -} +//- rjf: symbol data baking -//- cons serializer for symbols static CONS__SymbolData* -cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ +cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) +{ ProfBegin("cons__symbol_data_combine"); Temp scratch = scratch_begin(&arena, 1); @@ -2974,9 +2615,9 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ procedure_ptr += 1; // symbol nodes - for (CONS_Symbol *node = root->first_symbol; - node != 0; - node = node->next_order){ + for(CONS_Symbol *node = root->first_symbol; + node != 0; + node = node->next_order){ U32 name_string_idx = cons__string(bctx, node->name); U32 link_name_string_idx = cons__string(bctx, node->link_name); U32 type_idx = node->type->idx; @@ -2984,14 +2625,14 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ RADDBG_LinkFlags link_flags = 0; U32 container_idx = 0; { - if (node->is_extern){ + if(node->is_extern){ link_flags |= RADDBG_LinkFlag_External; } - if (node->container_symbol != 0){ + if(node->container_symbol != 0){ container_idx = node->container_symbol->idx; link_flags |= RADDBG_LinkFlag_ProcScoped; } - else if (node->container_type != 0 && node->container_type->udt != 0){ + else if(node->container_type != 0 && node->container_type->udt != 0){ container_idx = node->container_type->udt->idx; link_flags |= RADDBG_LinkFlag_TypeScoped; } @@ -3052,10 +2693,10 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ CONS__VMapMarker *marker_ptr = markers; // real globals - for (CONS_Symbol *node = root->first_symbol; - node != 0; - node = node->next_order){ - if (node->kind == CONS_SymbolKind_GlobalVariable){ + for(CONS_Symbol *node = root->first_symbol; + node != 0; + node = node->next_order){ + if(node->kind == CONS_SymbolKind_GlobalVariable){ U32 global_idx = node->idx; U64 first = node->offset; @@ -3139,15 +2780,15 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ RADDBG_Local *local_ptr = locals; RADDBG_LocationBlock *location_block_ptr = location_blocks; - for (CONS_Scope *node = root->first_scope; - node != 0; - node = node->next_order, scope_ptr += 1){ + for(CONS_Scope *node = root->first_scope; + node != 0; + node = node->next_order, scope_ptr += 1){ // emit voffs U32 voff_first = (U32)(scope_voff_ptr - scope_voffs); - for (CONS__VOffRange *range = node->first_range; - range != 0; - range = range->next){ + for(CONS__VOffRange *range = node->first_range; + range != 0; + range = range->next){ *scope_voff_ptr = range->voff_first; scope_voff_ptr += 1; *scope_voff_ptr = range->voff_opl; @@ -3158,30 +2799,30 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ // emit locals U32 scope_local_count = node->local_count; U32 scope_local_first = (U32)(local_ptr - locals); - for (CONS_Local *slocal = node->first_local; - slocal != 0; - slocal = slocal->next, local_ptr += 1){ + for(CONS_Local *slocal = node->first_local; + slocal != 0; + slocal = slocal->next, local_ptr += 1){ local_ptr->kind = slocal->kind; local_ptr->name_string_idx = cons__string(bctx, slocal->name); local_ptr->type_idx = slocal->type->idx; CONS_LocationSet *locset = slocal->locset; - if (locset != 0){ + if(locset != 0){ U32 location_first = (U32)(location_block_ptr - location_blocks); U32 location_opl = location_first + locset->location_case_count; local_ptr->location_first = location_first; local_ptr->location_opl = location_opl; - for (CONS__LocationCase *location_case = locset->first_location_case; - location_case != 0; - location_case = location_case->next){ + for(CONS__LocationCase *location_case = locset->first_location_case; + location_case != 0; + location_case = location_case->next){ location_block_ptr->scope_off_first = location_case->voff_first; location_block_ptr->scope_off_opl = location_case->voff_opl; location_block_ptr->location_data_off = location_data.total_size; location_block_ptr += 1; CONS_Location *location = location_case->location; - if (location == 0){ + if(location == 0){ U64 data = 0; str8_serial_push_align(scratch.arena, &location_data, 8); str8_serial_push_data(scratch.arena, &location_data, &data, 1); @@ -3199,9 +2840,9 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ case RADDBG_LocationKind_ValBytecodeStream: { str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, str8_struct(&location->kind))); - for (CONS_EvalBytecodeOp *op_node = location->bytecode.first_op; - op_node != 0; - op_node = op_node->next){ + for(CONS_EvalBytecodeOp *op_node = location->bytecode.first_op; + op_node != 0; + op_node = op_node->next){ U8 op_data[9]; op_data[0] = op_node->op; MemoryCopy(op_data + 1, &op_node->p, op_node->p_size); @@ -3277,14 +2918,14 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ CONS__SortKey *key_ptr = keys; CONS__VMapMarker *marker_ptr = markers; - for (CONS_Scope *node = root->first_scope; - node != 0; - node = node->next_order){ + for(CONS_Scope *node = root->first_scope; + node != 0; + node = node->next_order){ U32 scope_idx = node->idx; - for (CONS__VOffRange *range = node->first_range; - range != 0; - range = range->next){ + for(CONS__VOffRange *range = node->first_range; + range != 0; + range = range->next){ key_ptr->key = range->voff_first; key_ptr->val = marker_ptr; marker_ptr->idx = scope_idx; @@ -3328,13 +2969,14 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx){ scratch_end(scratch); ProfEnd(); - return(result); + return result; } -//- cons serializer for name maps +//- rjf: name map baking static CONS__NameMapBaked* -cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__NameMap *map){ +cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__NameMap *map) +{ Temp scratch = scratch_begin(&arena, 1); U32 bucket_count = map->name_count; @@ -3342,9 +2984,9 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na // setup the final bucket layouts CONS__NameMapSemiBucket *sbuckets = push_array(scratch.arena, CONS__NameMapSemiBucket, bucket_count); - for (CONS__NameMapNode *node = map->first; - node != 0; - node = node->order_next){ + for(CONS__NameMapNode *node = map->first; + node != 0; + node = node->order_next){ U64 hash = raddbg_hash(node->string.str, node->string.size); U64 bi = hash%bucket_count; CONS__NameMapSemiNode *snode = push_array(scratch.arena, CONS__NameMapSemiNode, 1); @@ -3361,31 +3003,31 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na { RADDBG_NameMapBucket *bucket_ptr = buckets; RADDBG_NameMapNode *node_ptr = nodes; - for (U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ + for(U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ bucket_ptr->first_node = (U32)(node_ptr - nodes); bucket_ptr->node_count = sbuckets[i].count; - for (CONS__NameMapSemiNode *snode = sbuckets[i].first; - snode != 0; - snode = snode->next){ + for(CONS__NameMapSemiNode *snode = sbuckets[i].first; + snode != 0; + snode = snode->next){ CONS__NameMapNode *node = snode->node; // cons name and index(es) U32 string_idx = cons__string(bctx, node->string); U32 match_count = node->idx_count; U32 idx = 0; - if (match_count == 1){ + if(match_count == 1){ idx = node->idx_first->idx[0]; } else{ Temp temp = temp_begin(scratch.arena); U32 *idx_run = push_array_no_zero(temp.arena, U32, match_count); U32 *idx_ptr = idx_run; - for (CONS__NameMapIdxNode *idxnode = node->idx_first; - idxnode != 0; - idxnode = idxnode->next){ - for (U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ - if (idxnode->idx[i] == 0){ + for(CONS__NameMapIdxNode *idxnode = node->idx_first; + idxnode != 0; + idxnode = idxnode->next){ + for(U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ + if(idxnode->idx[i] == 0){ goto dblbreak; } *idx_ptr = idxnode->idx[i]; @@ -3415,5 +3057,407 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na result->nodes = nodes; result->bucket_count = bucket_count; result->node_count = node_count; - return(result); + return result; +} + +//- rjf: top-level baking entry point + +static void +cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) +{ + ProfBeginFunction(); + str8_serial_begin(arena, out); + + // setup cons helpers + CONS__DSections dss = {0}; + cons__dsection(arena, &dss, 0, 0, RADDBG_DataSectionTag_NULL); + + CONS__BakeParams bctx_params = {0}; + { + bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); + bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); + } + CONS__BakeCtx *bctx = cons__bake_ctx_begin(&bctx_params); + + //////////////////////////////// + // MAIN PART: allocating and filling out sections of the file + + // top level info + RADDBG_TopLevelInfo *tli = push_array(arena, RADDBG_TopLevelInfo, 1); + { + CONS_TopLevelInfo *cons_tli = &root->top_level_info; + tli->architecture = cons_tli->architecture; + tli->exe_name_string_idx = cons__string(bctx, cons_tli->exe_name); + tli->exe_hash = cons_tli->exe_hash; + tli->voff_max = cons_tli->voff_max; + } + cons__dsection(arena, &dss, tli, sizeof(*tli), RADDBG_DataSectionTag_TopLevelInfo); + + // binary sections array + { + U32 count = root->binary_section_count; + RADDBG_BinarySection *sections = push_array(arena, RADDBG_BinarySection, count); + RADDBG_BinarySection *dsec = sections; + for(CONS_BinarySection *ssec = root->binary_section_first; + ssec != 0; + ssec = ssec->next, dsec += 1){ + dsec->name_string_idx = cons__string(bctx, ssec->name); + dsec->flags = ssec->flags; + dsec->voff_first = ssec->voff_first; + dsec->voff_opl = ssec->voff_opl; + dsec->foff_first = ssec->foff_first; + dsec->foff_opl = ssec->foff_opl; + } + cons__dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBG_DataSectionTag_BinarySections); + } + + // units array + // * pass for per-unit information including: + // * top-level unit information + // * combining line info for whole unit + { + U32 count = root->unit_count; + RADDBG_Unit *units = push_array(arena, RADDBG_Unit, count); + RADDBG_Unit *dunit = units; + for(CONS_Unit *sunit = root->unit_first; + sunit != 0; + sunit = sunit->next_order, dunit += 1){ + // strings & paths + U32 unit_name = cons__string(bctx, sunit->unit_name); + U32 cmp_name = cons__string(bctx, sunit->compiler_name); + + U32 src_path = cons__paths_idx_from_path(bctx, sunit->source_file); + U32 obj_path = cons__paths_idx_from_path(bctx, sunit->object_file); + U32 archive_path = cons__paths_idx_from_path(bctx, sunit->archive_file); + U32 build_path = cons__paths_idx_from_path(bctx, sunit->build_path); + + dunit->unit_name_string_idx = unit_name; + dunit->compiler_name_string_idx = cmp_name; + dunit->source_file_path_node = src_path; + dunit->object_file_path_node = obj_path; + dunit->archive_file_path_node = archive_path; + dunit->build_path_node = build_path; + dunit->language = sunit->language; + + // line info (voff -> file*line*col) + CONS_LineSequenceNode *first_seq = sunit->line_seq_first; + CONS__UnitLinesCombined *lines = cons__unit_combine_lines(arena, bctx, first_seq); + + U32 line_count = lines->line_count; + if(line_count > 0){ + dunit->line_info_voffs_data_idx = + cons__dsection(arena, &dss, lines->voffs, sizeof(U64)*(line_count + 1), + RADDBG_DataSectionTag_LineInfoVoffs); + dunit->line_info_data_idx = + cons__dsection(arena, &dss, lines->lines, sizeof(RADDBG_Line)*line_count, + RADDBG_DataSectionTag_LineInfoData); + if(lines->cols != 0){ + dunit->line_info_col_data_idx = + cons__dsection(arena, &dss, lines->cols, sizeof(RADDBG_Column)*line_count, + RADDBG_DataSectionTag_LineInfoColumns); + } + dunit->line_info_count = line_count; + } + } + + cons__dsection(arena, &dss, units, sizeof(*units)*count, RADDBG_DataSectionTag_Units); + } + + // source file line info baking + // * pass for "source_combine_line" for each source file - + // * can only be run after a pass that does "unit_combine_lines" for each unit. + for(CONS__SrcNode *src_node = bctx->tree->src_first; + src_node != 0; + src_node = src_node->next){ + CONS__LineMapFragment *first_fragment = src_node->first_fragment; + CONS__SrcLinesCombined *lines = cons__source_combine_lines(arena, first_fragment); + U32 line_count = lines->line_count; + + if(line_count > 0){ + src_node->line_map_count = line_count; + + src_node->line_map_nums_data_idx = + cons__dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, + RADDBG_DataSectionTag_LineMapNumbers); + + src_node->line_map_range_data_idx = + cons__dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), + RADDBG_DataSectionTag_LineMapRanges); + + src_node->line_map_voff_data_idx = + cons__dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, + RADDBG_DataSectionTag_LineMapVoffs); + } + } + + // source file name mapping + { + CONS__NameMap* map = cons__name_map_for_kind(root, RADDBG_NameMapKind_NormalSourcePaths); + for(CONS__SrcNode *src_node = bctx->tree->src_first; + src_node != 0; + src_node = src_node->next){ + if(src_node->idx != 0){ + cons__name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); + } + } + } + + // unit vmap baking + { + CONS__VMap *vmap = cons__vmap_from_unit_ranges(arena, + root->unit_vmap_range_first, + root->unit_vmap_range_count); + + U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); + cons__dsection(arena, &dss, vmap->vmap, vmap_size, RADDBG_DataSectionTag_UnitVmap); + } + + // type info baking + { + CONS__TypeData *types = cons__type_data_combine(arena, root, bctx); + + U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; + cons__dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBG_DataSectionTag_TypeNodes); + + U64 udt_size = sizeof(*types->udts)*types->udt_count; + cons__dsection(arena, &dss, types->udts, udt_size, RADDBG_DataSectionTag_UDTs); + + U64 member_size = sizeof(*types->members)*types->member_count; + cons__dsection(arena, &dss, types->members, member_size, RADDBG_DataSectionTag_Members); + + U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; + cons__dsection(arena, &dss, types->enum_members, enum_member_size, RADDBG_DataSectionTag_EnumMembers); + } + + // symbol info baking + { + CONS__SymbolData *symbol_data = cons__symbol_data_combine(arena, root, bctx); + + U64 global_variables_size = + sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; + cons__dsection(arena, &dss, symbol_data->global_variables, global_variables_size, + RADDBG_DataSectionTag_GlobalVariables); + + CONS__VMap *global_vmap = symbol_data->global_vmap; + U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); + cons__dsection(arena, &dss, global_vmap->vmap, global_vmap_size, + RADDBG_DataSectionTag_GlobalVmap); + + U64 thread_variables_size = + sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; + cons__dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, + RADDBG_DataSectionTag_ThreadVariables); + + U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; + cons__dsection(arena, &dss, symbol_data->procedures, procedures_size, + RADDBG_DataSectionTag_Procedures); + + U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; + cons__dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBG_DataSectionTag_Scopes); + + U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; + cons__dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, + RADDBG_DataSectionTag_ScopeVoffData); + + CONS__VMap *scope_vmap = symbol_data->scope_vmap; + U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); + cons__dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBG_DataSectionTag_ScopeVmap); + + U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; + cons__dsection(arena, &dss, symbol_data->locals, local_size, RADDBG_DataSectionTag_Locals); + + U64 location_blocks_size = + sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; + cons__dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, + RADDBG_DataSectionTag_LocationBlocks); + + U64 location_data_size = symbol_data->location_data_size; + cons__dsection(arena, &dss, symbol_data->location_data, location_data_size, + RADDBG_DataSectionTag_LocationData); + } + + // name map baking + { + U32 name_map_count = 0; + for(U32 i = 0; i < RADDBG_NameMapKind_COUNT; i += 1){ + if(root->name_maps[i] != 0){ + name_map_count += 1; + } + } + + RADDBG_NameMap *name_maps = push_array(arena, RADDBG_NameMap, name_map_count); + + RADDBG_NameMap *name_map_ptr = name_maps; + for(U32 i = 0; i < RADDBG_NameMapKind_COUNT; i += 1){ + CONS__NameMap *map = root->name_maps[i]; + if(map != 0){ + CONS__NameMapBaked *baked = cons__name_map_bake(arena, root, bctx, map); + + name_map_ptr->kind = i; + name_map_ptr->bucket_data_idx = + cons__dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, + RADDBG_DataSectionTag_NameMapBuckets); + name_map_ptr->node_data_idx = + cons__dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, + RADDBG_DataSectionTag_NameMapNodes); + name_map_ptr += 1; + } + } + + cons__dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, + RADDBG_DataSectionTag_NameMaps); + } + + //////////////////////////////// + // LATE PART: baking loose structures and creating final layout + + // generate data sections for file paths + { + U32 count = bctx->tree->count; + RADDBG_FilePathNode *nodes = push_array(arena, RADDBG_FilePathNode, count); + + RADDBG_FilePathNode *out_node = nodes; + for(CONS__PathNode *node = bctx->tree->first; + node != 0; + node = node->next_order, out_node += 1){ + out_node->name_string_idx = cons__string(bctx, node->name); + if(node->parent != 0){ + out_node->parent_path_node = node->parent->idx; + } + if(node->first_child != 0){ + out_node->first_child = node->first_child->idx; + } + if(node->next_sibling != 0){ + out_node->next_sibling = node->next_sibling->idx; + } + if(node->src_file != 0){ + out_node->source_file_idx = node->src_file->idx; + } + } + + cons__dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBG_DataSectionTag_FilePathNodes); + } + + // generate data sections for files + { + U32 count = bctx->tree->src_count; + RADDBG_SourceFile *src_files = push_array(arena, RADDBG_SourceFile, count); + + RADDBG_SourceFile *out_src_file = src_files; + for(CONS__SrcNode *node = bctx->tree->src_first; + node != 0; + node = node->next, out_src_file += 1){ + out_src_file->file_path_node_idx = node->path_node->idx; + out_src_file->normal_full_path_string_idx = cons__string(bctx, node->normal_full_path); + out_src_file->line_map_nums_data_idx = node->line_map_nums_data_idx; + out_src_file->line_map_range_data_idx = node->line_map_range_data_idx; + out_src_file->line_map_count = node->line_map_count; + out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; + } + + cons__dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBG_DataSectionTag_SourceFiles); + } + + // generate data sections for strings + { + U32 *str_offs = push_array_no_zero(arena, U32, bctx->strs.count + 1); + + U32 off_cursor = 0; + { + U32 *off_ptr = str_offs; + *off_ptr = 0; + off_ptr += 1; + for(CONS__StringNode *node = bctx->strs.order_first; + node != 0; + node = node->order_next){ + off_cursor += node->str.size; + *off_ptr = off_cursor; + off_ptr += 1; + } + } + + U8 *buf = push_array(arena, U8, off_cursor); + { + U8 *ptr = buf; + for(CONS__StringNode *node = bctx->strs.order_first; + node != 0; + node = node->order_next){ + MemoryCopy(ptr, node->str.str, node->str.size); + ptr += node->str.size; + } + } + + cons__dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), + RADDBG_DataSectionTag_StringTable); + cons__dsection(arena, &dss, buf, off_cursor, RADDBG_DataSectionTag_StringData); + } + + // generate data sections for index runs + { + U32 *idx_data = push_array_no_zero(arena, U32, bctx->idxs.idx_count); + + { + U32 *out_ptr = idx_data; + U32 *opl = out_ptr + bctx->idxs.idx_count; + CONS__IdxRunNode *node = bctx->idxs.order_first; + for(;node != 0 && out_ptr < opl; + node = node->order_next){ + MemoryCopy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); + out_ptr += node->count; + } + Assert(out_ptr == opl); + } + + cons__dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, + RADDBG_DataSectionTag_IndexRuns); + } + + // layout + // * the header and data section table have to be initialized "out of order" + // * so that the rest of the system can avoid this tricky order-layout interdependence stuff + RADDBG_Header *header = push_array(arena, RADDBG_Header, 1); + RADDBG_DataSection *dstable = push_array(arena, RADDBG_DataSection, dss.count); + str8_serial_push_align(arena, out, 8); + U64 header_off = out->total_size; + str8_list_push(arena, out, str8_struct(header)); + str8_serial_push_align(arena, out, 8); + U64 data_section_off = out->total_size; + str8_list_push(arena, out, str8((U8 *)dstable, sizeof(*dstable)*dss.count)); + { + header->magic = RADDBG_MAGIC_CONSTANT; + header->encoding_version = RADDBG_ENCODING_VERSION; + header->data_section_off = data_section_off; + header->data_section_count = dss.count; + } + { + U64 test_dss_count = 0; + for(CONS__DSectionNode *node = dss.first; + node != 0; + node = node->next){ + test_dss_count += 1; + } + Assert(test_dss_count == dss.count); + + RADDBG_DataSection *ptr = dstable; + for(CONS__DSectionNode *node = dss.first; + node != 0; + node = node->next, ptr += 1){ + U64 data_section_offset = 0; + if(node->size != 0) + { + str8_serial_push_align(arena, out, 8); + data_section_offset = out->total_size; + str8_list_push(arena, out, str8((U8 *)node->data, node->size)); + } + ptr->tag = node->tag; + ptr->encoding = RADDBG_DataSectionEncoding_Unpacked; + ptr->off = data_section_offset; + ptr->encoded_size = node->size; + ptr->unpacked_size = node->size; + } + Assert(ptr == dstable + dss.count); + } + + cons__bake_ctx_release(bctx); + ProfEnd(); } diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbgi_cons/raddbgi_cons.h similarity index 58% rename from src/raddbg_cons/raddbg_cons.h rename to src/raddbgi_cons/raddbgi_cons.h index a2c71726..0d024bf4 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -1,109 +1,133 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_CONS_H -#define RADDBG_CONS_H +#ifndef RADDBGI_CONS_H +#define RADDBGI_CONS_H //////////////////////////////// -//- "Public Facing" Cons API +//~ rjf: Error Types -// frequently used opaque types -typedef struct CONS_Root CONS_Root; -typedef struct CONS_Unit CONS_Unit; -typedef struct CONS_Type CONS_Type; -typedef struct CONS_Reservation CONS_Reservation; -typedef struct CONS_Symbol CONS_Symbol; -typedef struct CONS_Scope CONS_Scope; -typedef struct CONS_Local CONS_Local; -typedef struct CONS_LocationSet CONS_LocationSet; -typedef struct CONS_Location CONS_Location; - -typedef struct CONS_TypeNode{ - struct CONS_TypeNode *next; - CONS_Type *type; -} CONS_TypeNode; - -typedef struct CONS_TypeList{ - CONS_TypeNode *first; - CONS_TypeNode *last; - U64 count; -} CONS_TypeList; - -typedef struct CONS_EvalBytecodeOp{ - struct CONS_EvalBytecodeOp *next; - RADDBG_EvalOp op; - U32 p_size; - U64 p; -} CONS_EvalBytecodeOp; - -typedef struct CONS_EvalBytecode{ - CONS_EvalBytecodeOp *first_op; - CONS_EvalBytecodeOp *last_op; - U32 op_count; - U32 encoded_size; -} CONS_EvalBytecode; - -//- init - -typedef struct CONS_RootParams{ - // important to set this correctly so pointer - // types get the correct sizes - U64 addr_size; - - // options to optimize map bucket counts - // * if these are left as zeros a modest default is used instead - U32 bucket_count_units; - U32 bucket_count_symbols; - U32 bucket_count_scopes; - U32 bucket_count_locals; - U32 bucket_count_types; - U64 bucket_count_type_constructs; -} CONS_RootParams; - -static CONS_Root* cons_root_new(CONS_RootParams *params); -static void cons_root_release(CONS_Root *root); - - -//- baking -static void cons_bake_file(Arena *arena, CONS_Root *root, String8List *out); - - -//- errors -typedef struct CONS_Error{ - struct CONS_Error *next; +typedef struct CONS_Error CONS_Error; +struct CONS_Error +{ + CONS_Error *next; String8 msg; -} CONS_Error; +}; -static void cons_errorf(CONS_Root *root, char *fmt, ...); +typedef struct CONS_ErrorList CONS_ErrorList; +struct CONS_ErrorList +{ + CONS_Error *first; + CONS_Error *last; + U64 count; +}; -static CONS_Error* cons_get_first_error(CONS_Root *root); +//////////////////////////////// +//~ rjf: Auxiliary Data Structure Types +//- rjf: u64 -> pointer map +typedef struct CONS__U64ToPtrNode CONS__U64ToPtrNode; +struct CONS__U64ToPtrNode +{ + CONS__U64ToPtrNode *next; + U64 _padding_; + U64 key[1]; + void *ptr[1]; +}; -//- information declaration +typedef struct CONS__U64ToPtrMap CONS__U64ToPtrMap; +struct CONS__U64ToPtrMap +{ + CONS__U64ToPtrNode **buckets; + U64 buckets_count; + U64 bucket_collision_count; + U64 pair_count; +}; -// top level info -typedef struct CONS_TopLevelInfo{ - RADDBG_Arch architecture; - String8 exe_name; - U64 exe_hash; - U64 voff_max; -} CONS_TopLevelInfo; +typedef struct CONS__U64ToPtrLookup CONS__U64ToPtrLookup; +struct CONS__U64ToPtrLookup +{ + void *match; + CONS__U64ToPtrNode *fill_node; + U32 fill_k; +}; -static void cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli); +//- rjf: string8 -> pointer map +typedef struct CONS__Str8ToPtrNode CONS__Str8ToPtrNode; +struct CONS__Str8ToPtrNode +{ + struct CONS__Str8ToPtrNode *next; + String8 key; + U64 hash; + void *ptr; +}; -// binary sections -static void cons_add_binary_section(CONS_Root *root, - String8 name, RADDBG_BinarySectionFlags flags, - U64 voff_first, U64 voff_opl, U64 foff_first, - U64 foff_opl); +typedef struct CONS__Str8ToPtrMap CONS__Str8ToPtrMap; +struct CONS__Str8ToPtrMap +{ + CONS__Str8ToPtrNode **buckets; + U64 buckets_count; + U64 bucket_collision_count; + U64 pair_count; +}; +//- rjf: sortable range data structure -// units -static CONS_Unit* cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash); +typedef struct CONS__SortKey CONS__SortKey; +struct CONS__SortKey +{ + U64 key; + void *val; +}; -typedef struct CONS_UnitInfo{ +typedef struct CONS__OrderedRange CONS__OrderedRange; +struct CONS__OrderedRange +{ + CONS__OrderedRange *next; + U64 first; + U64 opl; +}; + +//////////////////////////////// +//~ rjf: Binary Section Types + +typedef struct CONS_BinarySection CONS_BinarySection; +struct CONS_BinarySection +{ + CONS_BinarySection *next; + String8 name; + RADDBG_BinarySectionFlags flags; + U64 voff_first; + U64 voff_opl; + U64 foff_first; + U64 foff_opl; +}; + +//////////////////////////////// +//~ rjf: Per-Compilation-Unit Info Types + +typedef struct CONS_LineSequence CONS_LineSequence; +struct CONS_LineSequence +{ + String8 file_name; + U64 *voffs; // [line_count + 1] (sorted) + U32 *line_nums; // [line_count] + U16 *col_nums; // [2*line_count] + U64 line_count; +}; + +typedef struct CONS_LineSequenceNode CONS_LineSequenceNode; +struct CONS_LineSequenceNode +{ + CONS_LineSequenceNode *next; + CONS_LineSequence line_seq; +}; + +typedef struct CONS_UnitInfo CONS_UnitInfo; +struct CONS_UnitInfo +{ String8 unit_name; String8 compiler_name; String8 source_file; @@ -111,187 +135,13 @@ typedef struct CONS_UnitInfo{ String8 archive_file; String8 build_path; RADDBG_Language language; -} CONS_UnitInfo; +}; -static void cons_unit_set_info(CONS_Root *root, CONS_Unit *unit, CONS_UnitInfo *info); - -typedef struct CONS_LineSequence{ - String8 file_name; - U64 *voffs; // [line_count + 1] (sorted) - U32 *line_nums; // [line_count] - U16 *col_nums; // [2*line_count] - U64 line_count; -} CONS_LineSequence; - -static void cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, - CONS_LineSequence *line_sequence); - -static void cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl); - - -// types -static CONS_Type* cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash); -static CONS_Reservation* cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash); -static void cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type); - -static B32 cons_type_is_unhandled_nil(CONS_Root *root, CONS_Type *type); - -static CONS_Type* cons_type_handled_nil(CONS_Root *root); -static CONS_Type* cons_type_nil(CONS_Root *root); -static CONS_Type* cons_type_variadic(CONS_Root *root); - -static CONS_Type* cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name); -static CONS_Type* cons_type_modifier(CONS_Root *root, - CONS_Type *direct_type, RADDBG_TypeModifierFlags flags); -static CONS_Type* cons_type_bitfield(CONS_Root *root, - CONS_Type *direct_type, U32 bit_off, U32 bit_count); -static CONS_Type* cons_type_pointer(CONS_Root *root, - CONS_Type *direct_type, RADDBG_TypeKind ptr_type_kind); -static CONS_Type* cons_type_array(CONS_Root *root, - CONS_Type *direct_type, U64 count); -static CONS_Type* cons_type_proc(CONS_Root *root, - CONS_Type *return_type, struct CONS_TypeList *params); -static CONS_Type* cons_type_method(CONS_Root *root, - CONS_Type *this_type, CONS_Type *return_type, - struct CONS_TypeList *params); - -static CONS_Type* cons_type_udt(CONS_Root *root, - RADDBG_TypeKind record_type_kind, String8 name, U64 size); -static CONS_Type* cons_type_enum(CONS_Root *root, - CONS_Type *direct_type, String8 name); -static CONS_Type* cons_type_alias(CONS_Root *root, - CONS_Type *direct_type, String8 name); -static CONS_Type* cons_type_incomplete(CONS_Root *root, - RADDBG_TypeKind type_kind, String8 name); - -static void cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type, U32 off); -static void cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type); -static void cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type); -static void cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type); -static void cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, - String8 name, CONS_Type *mem_type); -static void cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, - CONS_Type *base_type, U32 off); -static void cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, - CONS_Type *base_type, U32 vptr_off, U32 vtable_off); -static void cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, - CONS_Type *nested_type); - -static void cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 val); - -static void cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, - String8 source_path, U32 line, U32 col); - -// type list -static void cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type); - -// symbols -static CONS_Symbol* cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash); - -typedef enum{ - CONS_SymbolKind_NULL, - CONS_SymbolKind_GlobalVariable, - CONS_SymbolKind_ThreadVariable, - CONS_SymbolKind_Procedure, - CONS_SymbolKind_COUNT -} CONS_SymbolKind; - -typedef struct CONS_SymbolInfo{ - CONS_SymbolKind kind; - String8 name; - String8 link_name; - CONS_Type *type; - B32 is_extern; - U64 offset; - // TODO(allen): should this actually be "container scope"? - CONS_Symbol *container_symbol; - CONS_Type *container_type; - CONS_Scope *root_scope; -} CONS_SymbolInfo; - -static void cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info); - -// scopes -static CONS_Scope *cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash); - -static void cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent); -static void cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl); - -// locals -static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash); - -typedef struct CONS_LocalInfo{ - RADDBG_LocalKind kind; - CONS_Scope *scope; - String8 name; - CONS_Type *type; -} CONS_LocalInfo; - -static void cons_local_set_basic_info(CONS_Root *root, CONS_Local *local, - CONS_LocalInfo *info); - -static CONS_LocationSet* cons_location_set_from_local(CONS_Root *root, CONS_Local *local); - -// locations -static void cons_location_set_add_case(CONS_Root *root, CONS_LocationSet *locset, - U64 voff_min, U64 voff_max, - CONS_Location *location); - -static CONS_Location* cons_location_addr_bytecode_stream(CONS_Root *root, - struct CONS_EvalBytecode *bytecode); -static CONS_Location* cons_location_val_bytecode_stream(CONS_Root *root, - struct CONS_EvalBytecode *bytecode); -static CONS_Location* cons_location_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset); -static CONS_Location* cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset); -static CONS_Location* cons_location_val_reg(CONS_Root *root, U8 reg_code); - -// bytecode -static void cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBG_EvalOp op, U64 p); -static void cons_bytecode_push_uconst(Arena *arena, CONS_EvalBytecode *bytecode, U64 x); -static void cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, S64 x); -static void cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, - CONS_EvalBytecode *right_destroyed); - -//////////////////////////////// -//- Concrete Types & Implementation Helpers - -// NOTE: the user should generally treat these as opaque - -// errors -typedef struct CONS_ErrorList{ - CONS_Error *first; - CONS_Error *last; - U64 count; -} CONS_ErrorList; - - -// binary sections -typedef struct CONS_BinarySection{ - struct CONS_BinarySection *next; - String8 name; - RADDBG_BinarySectionFlags flags; - U64 voff_first; - U64 voff_opl; - U64 foff_first; - U64 foff_opl; -} CONS_BinarySection; - - -// units -typedef struct CONS_LineSequenceNode{ - struct CONS_LineSequenceNode *next; - CONS_LineSequence line_seq; -} CONS_LineSequenceNode; - -typedef struct CONS_Unit{ - struct CONS_Unit *next_order; - +typedef struct CONS_Unit CONS_Unit; +struct CONS_Unit +{ + CONS_Unit *next_order; U32 idx; - B32 info_is_set; String8 unit_name; String8 compiler_name; @@ -300,77 +150,26 @@ typedef struct CONS_Unit{ String8 archive_file; String8 build_path; RADDBG_Language language; - CONS_LineSequenceNode *line_seq_first; CONS_LineSequenceNode *line_seq_last; U64 line_seq_count; - -} CONS_Unit; +}; -typedef struct CONS_UnitVMapRange{ - struct CONS_UnitVMapRange *next; +typedef struct CONS_UnitVMapRange CONS_UnitVMapRange; +struct CONS_UnitVMapRange +{ + CONS_UnitVMapRange *next; CONS_Unit *unit; U64 first; U64 opl; -} CONS_UnitVMapRange; +}; - -// types -typedef struct CONS_Type{ - struct CONS_Type *next_order; - - RADDBG_TypeKind kind; - U32 idx; - U32 byte_size; - U32 flags; - U32 off; - U32 count; - - String8 name; - - struct CONS_Type *direct_type; - struct CONS_Type **param_types; - - struct CONS_TypeUDT *udt; -} CONS_Type; - -typedef struct CONS_TypeMember{ - struct CONS_TypeMember *next; - - RADDBG_MemberKind kind; - String8 name; - CONS_Type *type; - U32 off; -} CONS_TypeMember; - -typedef struct CONS_TypeEnumVal{ - struct CONS_TypeEnumVal *next; - - String8 name; - U64 val; -} CONS_TypeEnumVal; - -typedef struct CONS_TypeUDT{ - struct CONS_TypeUDT *next_order; - - U32 idx; - struct CONS_Type *self_type; - - CONS_TypeMember *first_member; - CONS_TypeMember *last_member; - U64 member_count; - - CONS_TypeEnumVal *first_enum_val; - CONS_TypeEnumVal *last_enum_val; - U64 enum_val_count; - - String8 source_path; - U32 line; - U32 col; -} CONS_TypeUDT; +//////////////////////////////// +//~ rjf: Type Info Types typedef U8 CONS_TypeConstructKind; -enum{ +enum +{ CONS_TypeConstructKind_Basic, CONS_TypeConstructKind_Modifier, CONS_TypeConstructKind_Bitfield, @@ -380,17 +179,107 @@ enum{ CONS_TypeConstructKind_Method, }; -static CONS_Type* cons__type_new(CONS_Root *root); -static CONS_TypeUDT* cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *type); -static CONS_TypeUDT* cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type); +typedef struct CONS_Reservation CONS_Reservation; +typedef struct CONS_TypeMember CONS_TypeMember; +struct CONS_TypeMember +{ + CONS_TypeMember *next; + RADDBG_MemberKind kind; + String8 name; + struct CONS_Type *type; + U32 off; +}; -// symbols -typedef struct CONS_Symbol{ - struct CONS_Symbol *next_order; - +typedef struct CONS_TypeEnumVal CONS_TypeEnumVal; +struct CONS_TypeEnumVal +{ + CONS_TypeEnumVal *next; + String8 name; + U64 val; +}; + +typedef struct CONS_Type CONS_Type; +struct CONS_Type +{ + CONS_Type *next_order; + RADDBG_TypeKind kind; + U32 idx; + U32 byte_size; + U32 flags; + U32 off; + U32 count; + String8 name; + CONS_Type *direct_type; + CONS_Type **param_types; + struct CONS_TypeUDT *udt; +}; + +typedef struct CONS_TypeUDT CONS_TypeUDT; +struct CONS_TypeUDT +{ + CONS_TypeUDT *next_order; + U32 idx; + CONS_Type *self_type; + CONS_TypeMember *first_member; + CONS_TypeMember *last_member; + U64 member_count; + CONS_TypeEnumVal *first_enum_val; + CONS_TypeEnumVal *last_enum_val; + U64 enum_val_count; + String8 source_path; + U32 line; + U32 col; +}; + +typedef struct CONS_TypeNode CONS_TypeNode; +struct CONS_TypeNode +{ + CONS_TypeNode *next; + CONS_Type *type; +}; + +typedef struct CONS_TypeList CONS_TypeList; +struct CONS_TypeList +{ + CONS_TypeNode *first; + CONS_TypeNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Symbol Info Types + +typedef enum CONS_SymbolKind +{ + CONS_SymbolKind_NULL, + CONS_SymbolKind_GlobalVariable, + CONS_SymbolKind_ThreadVariable, + CONS_SymbolKind_Procedure, + CONS_SymbolKind_COUNT +} +CONS_SymbolKind; + +typedef struct CONS_SymbolInfo CONS_SymbolInfo; +struct CONS_SymbolInfo +{ + CONS_SymbolKind kind; + String8 name; + String8 link_name; + CONS_Type *type; + B32 is_extern; + U64 offset; + // TODO(allen): should this actually be "container scope"? + struct CONS_Symbol *container_symbol; + CONS_Type *container_type; + struct CONS_Scope *root_scope; +}; + +typedef struct CONS_Symbol CONS_Symbol; +struct CONS_Symbol +{ + CONS_Symbol *next_order; U32 idx; - CONS_SymbolKind kind; String8 name; String8 link_name; @@ -398,156 +287,169 @@ typedef struct CONS_Symbol{ B32 is_extern; B8 offset_is_set; U64 offset; - CONS_Symbol *container_symbol; CONS_Type *container_type; - - CONS_Scope *root_scope; -} CONS_Symbol; + struct CONS_Scope *root_scope; +}; +//////////////////////////////// +//~ rjf: Scope Info Types -// scopes -typedef struct CONS_Local{ - struct CONS_Local *next; +typedef struct CONS_LocalInfo CONS_LocalInfo; +struct CONS_LocalInfo +{ + RADDBG_LocalKind kind; + struct CONS_Scope *scope; + String8 name; + CONS_Type *type; +}; + +typedef struct CONS_Local CONS_Local; +struct CONS_Local +{ + CONS_Local *next; RADDBG_LocalKind kind; String8 name; CONS_Type *type; - CONS_LocationSet *locset; -} CONS_Local; + struct CONS_LocationSet *locset; +}; -typedef struct CONS__VOffRange{ - struct CONS__VOffRange *next; +typedef struct CONS__VOffRange CONS__VOffRange; +struct CONS__VOffRange +{ + CONS__VOffRange *next; U64 voff_first; U64 voff_opl; -} CONS__VOffRange; +}; -typedef struct CONS_Scope{ - struct CONS_Scope *next_order; - +typedef struct CONS_Scope CONS_Scope; +struct CONS_Scope +{ + CONS_Scope *next_order; CONS_Symbol *symbol; CONS_Scope *parent_scope; CONS_Scope *first_child; CONS_Scope *last_child; CONS_Scope *next_sibling; - U64 voff_base; CONS__VOffRange *first_range; CONS__VOffRange *last_range; U32 range_count; - U32 idx; - CONS_Local *first_local; CONS_Local *last_local; U32 local_count; - -} CONS_Scope; +}; -static void cons__scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol); +//////////////////////////////// +//~ rjf: Location Info Types +typedef struct CONS_EvalBytecodeOp CONS_EvalBytecodeOp; +struct CONS_EvalBytecodeOp +{ + CONS_EvalBytecodeOp *next; + RADDBG_EvalOp op; + U32 p_size; + U64 p; +}; -// locations -typedef struct CONS_Location{ +typedef struct CONS_EvalBytecode CONS_EvalBytecode; +struct CONS_EvalBytecode +{ + CONS_EvalBytecodeOp *first_op; + CONS_EvalBytecodeOp *last_op; + U32 op_count; + U32 encoded_size; +}; + +typedef struct CONS_Location CONS_Location; +struct CONS_Location +{ RADDBG_LocationKind kind; U8 register_code; U16 offset; CONS_EvalBytecode bytecode; -} CONS_Location; +}; -typedef struct CONS__LocationCase{ - struct CONS__LocationCase *next; +typedef struct CONS__LocationCase CONS__LocationCase; +struct CONS__LocationCase +{ + CONS__LocationCase *next; U64 voff_first; U64 voff_opl; CONS_Location *location; -} CONS__LocationCase; +}; -typedef struct CONS_LocationSet{ +typedef struct CONS_LocationSet CONS_LocationSet; +struct CONS_LocationSet +{ CONS__LocationCase *first_location_case; CONS__LocationCase *last_location_case; U64 location_case_count; -} CONS_LocationSet; +}; +//////////////////////////////// +//~ rjf: Name Map Types -// name maps -typedef struct CONS__NameMapIdxNode{ - struct CONS__NameMapIdxNode *next; +typedef struct CONS__NameMapIdxNode CONS__NameMapIdxNode; +struct CONS__NameMapIdxNode +{ + CONS__NameMapIdxNode *next; U32 idx[8]; -} CONS__NameMapIdxNode; +}; -typedef struct CONS__NameMapNode{ - struct CONS__NameMapNode *bucket_next; - struct CONS__NameMapNode *order_next; +typedef struct CONS__NameMapNode CONS__NameMapNode; +struct CONS__NameMapNode +{ + CONS__NameMapNode *bucket_next; + CONS__NameMapNode *order_next; String8 string; CONS__NameMapIdxNode *idx_first; CONS__NameMapIdxNode *idx_last; U64 idx_count; -} CONS__NameMapNode; +}; -typedef struct CONS__NameMap{ +typedef struct CONS__NameMap CONS__NameMap; +struct CONS__NameMap +{ CONS__NameMapNode **buckets; U64 buckets_count; U64 bucket_collision_count; CONS__NameMapNode *first; CONS__NameMapNode *last; U64 name_count; -} CONS__NameMap; +}; -static CONS__NameMap* cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind); -static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, - String8 name, U32 idx); +//////////////////////////////// +//~ rjf: Top-Level Debug Info Types +typedef struct CONS_TopLevelInfo CONS_TopLevelInfo; +struct CONS_TopLevelInfo +{ + RADDBG_Arch architecture; + String8 exe_name; + U64 exe_hash; + U64 voff_max; +}; -// u64 to ptr map -typedef struct CONS__U64ToPtrNode{ - struct CONS__U64ToPtrNode *next; - U64 _padding_; - U64 key[1]; - void *ptr[1]; -} CONS__U64ToPtrNode; +//////////////////////////////// +//~ rjf: Root Construction Bundle Types -typedef struct CONS__U64ToPtrMap{ - CONS__U64ToPtrNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 pair_count; -} CONS__U64ToPtrMap; +typedef struct CONS_RootParams CONS_RootParams; +struct CONS_RootParams +{ + U64 addr_size; + U32 bucket_count_units; // optional; default chosen if 0 + U32 bucket_count_symbols; // optional; default chosen if 0 + U32 bucket_count_scopes; // optional; default chosen if 0 + U32 bucket_count_locals; // optional; default chosen if 0 + U32 bucket_count_types; // optional; default chosen if 0 + U64 bucket_count_type_constructs; // optional; default chosen if 0 +}; -typedef struct CONS__U64ToPtrLookup{ - void *match; - CONS__U64ToPtrNode *fill_node; - U32 fill_k; -} CONS__U64ToPtrLookup; - -static void cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count); - -static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out); -static void cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, - CONS__U64ToPtrLookup *lookup, void *ptr); - - - -// str8 to ptr map -typedef struct CONS__Str8ToPtrNode{ - struct CONS__Str8ToPtrNode *next; - String8 key; - U64 hash; - void *ptr; -} CONS__Str8ToPtrNode; - -typedef struct CONS__Str8ToPtrMap{ - CONS__Str8ToPtrNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 pair_count; -} CONS__Str8ToPtrMap; - -static void cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count); -static void*cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash); -static void cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, - String8 key, U64 hash, void *ptr); - -// root -struct CONS_Root{ +typedef struct CONS_Root CONS_Root; +struct CONS_Root +{ Arena *arena; CONS_ErrorList errors; @@ -623,50 +525,67 @@ struct CONS_Root{ CONS__Str8ToPtrMap construct_map; }; +//////////////////////////////// +//~ rjf: Baking Phase Types -//- cons intermediate data sections -typedef struct CONS__DSectionNode{ - struct CONS__DSectionNode *next; +//- rjf: bake data section data structure + +typedef struct CONS__DSectionNode CONS__DSectionNode; +struct CONS__DSectionNode +{ + CONS__DSectionNode *next; void *data; U64 size; RADDBG_DataSectionTag tag; -} CONS__DSectionNode; +}; -typedef struct CONS__DSections{ +typedef struct CONS__DSections CONS__DSections; +struct CONS__DSections +{ CONS__DSectionNode *first; CONS__DSectionNode *last; U32 count; -} CONS__DSections; +}; -//- cons intermediate strings -typedef struct CONS__StringNode{ - struct CONS__StringNode *order_next; - struct CONS__StringNode *bucket_next; +//- rjf: bake string data structure + +typedef struct CONS__StringNode CONS__StringNode; +struct CONS__StringNode +{ + CONS__StringNode *order_next; + CONS__StringNode *bucket_next; String8 str; U64 hash; U32 idx; -} CONS__StringNode; +}; -typedef struct CONS__Strings{ +typedef struct CONS__Strings CONS__Strings; +struct CONS__Strings +{ CONS__StringNode *order_first; CONS__StringNode *order_last; CONS__StringNode **buckets; U64 buckets_count; U64 bucket_collision_count; U32 count; -} CONS__Strings; +}; -//- cons intermediate index runs -typedef struct CONS__IdxRunNode{ - struct CONS__IdxRunNode *order_next; - struct CONS__IdxRunNode *bucket_next; +//- rjf: index run baking data structure + +typedef struct CONS__IdxRunNode CONS__IdxRunNode; +struct CONS__IdxRunNode +{ + CONS__IdxRunNode *order_next; + CONS__IdxRunNode *bucket_next; U32 *idx_run; U64 hash; U32 count; U32 first_idx; -} CONS__IdxRunNode; +}; -typedef struct CONS__IdxRuns{ +typedef struct CONS__IdxRuns CONS__IdxRuns; +struct CONS__IdxRuns +{ CONS__IdxRunNode *order_first; CONS__IdxRunNode *order_last; CONS__IdxRunNode **buckets; @@ -674,27 +593,34 @@ typedef struct CONS__IdxRuns{ U64 bucket_collision_count; U32 count; U32 idx_count; -} CONS__IdxRuns; +}; -//- cons intermediate file path tree -typedef struct CONS__PathNode{ - struct CONS__PathNode *next_order; - struct CONS__PathNode *parent; - struct CONS__PathNode *first_child; - struct CONS__PathNode *last_child; - struct CONS__PathNode *next_sibling; +//- rjf: source file & file path baking data structures + +typedef struct CONS__PathNode CONS__PathNode; +struct CONS__PathNode +{ + CONS__PathNode *next_order; + CONS__PathNode *parent; + CONS__PathNode *first_child; + CONS__PathNode *last_child; + CONS__PathNode *next_sibling; String8 name; struct CONS__SrcNode *src_file; U32 idx; -} CONS__PathNode; +}; -typedef struct CONS__LineMapFragment{ - struct CONS__LineMapFragment *next; +typedef struct CONS__LineMapFragment CONS__LineMapFragment; +struct CONS__LineMapFragment +{ + CONS__LineMapFragment *next; CONS_LineSequenceNode *sequence; -} CONS__LineMapFragment; +}; -typedef struct CONS__SrcNode{ - struct CONS__SrcNode *next; +typedef struct CONS__SrcNode CONS__SrcNode; +struct CONS__SrcNode +{ + CONS__SrcNode *next; CONS__PathNode *path_node; U32 idx; @@ -709,9 +635,11 @@ typedef struct CONS__SrcNode{ U32 line_map_range_data_idx; U32 line_map_count; U32 line_map_voff_data_idx; -} CONS__SrcNode; +}; -typedef struct CONS__PathTree{ +typedef struct CONS__PathTree CONS__PathTree; +struct CONS__PathTree +{ CONS__PathNode *first; CONS__PathNode *last; U32 count; @@ -719,130 +647,84 @@ typedef struct CONS__PathTree{ CONS__SrcNode *src_first; CONS__SrcNode *src_last; U32 src_count; -} CONS__PathTree; - -typedef struct CONS__BakeCtx{ - Arena *arena; - CONS__Strings strs; - CONS__IdxRuns idxs; - CONS__PathTree *tree; -} CONS__BakeCtx; - -typedef struct CONS__BakeParams CONS__BakeParams; -struct CONS__BakeParams -{ - U64 strings_bucket_count; - U64 idx_runs_bucket_count; }; -//- cons intermediate functions -static U32 cons__dsection(Arena *arena, CONS__DSections *dss, - void *data, U64 size, RADDBG_DataSectionTag tag); +//- rjf: line info baking data structures -static CONS__BakeCtx* cons__bake_ctx_begin(CONS__BakeParams *params); -static void cons__bake_ctx_release(CONS__BakeCtx *bake_ctx); - -static U32 cons__string(CONS__BakeCtx *bctx, String8 str); - -static U64 cons__idx_run_hash(U32 *idx_run, U32 count); -static U32 cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count); - -static CONS__PathNode* cons__paths_new_node(CONS__BakeCtx *bctx); -static CONS__PathNode* cons__paths_sub_path(CONS__BakeCtx *bctx, CONS__PathNode *dir, String8 sub_dir); -static CONS__PathNode* cons__paths_node_from_path(CONS__BakeCtx *bctx, String8 path); -static U32 cons__paths_idx_from_path(CONS__BakeCtx *bctx, String8 path); - -static CONS__SrcNode* cons__paths_new_src_node(CONS__BakeCtx *bctx); -static CONS__SrcNode* cons__paths_src_node_from_path_node(CONS__BakeCtx *bctx, CONS__PathNode *path); - -//- cons path helper -static String8 cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node); -static void cons__normal_string_from_path_node_build(Arena *arena, CONS__PathNode *node, - String8List *out); - - -//- cons sort helper -typedef struct CONS__SortKey{ - U64 key; - void *val; -} CONS__SortKey; - -typedef struct CONS__OrderedRange{ - struct CONS__OrderedRange *next; - U64 first; - U64 opl; -} CONS__OrderedRange; - -static CONS__SortKey* cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count); - - -//- cons serializer for unit line info -typedef struct CONS__LineRec{ +typedef struct CONS__LineRec CONS__LineRec; +struct CONS__LineRec +{ U32 file_id; U32 line_num; U16 col_first; U16 col_opl; -} CONS__LineRec; +}; -typedef struct CONS__UnitLinesCombined{ +typedef struct CONS__UnitLinesCombined CONS__UnitLinesCombined; +struct CONS__UnitLinesCombined +{ U64 *voffs; RADDBG_Line *lines; U16 *cols; U32 line_count; -} CONS__UnitLinesCombined; +}; -static CONS__UnitLinesCombined* cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, - CONS_LineSequenceNode *first); - -//- cons serializer for source line info -typedef struct CONS__SrcLinesCombined{ +typedef struct CONS__SrcLinesCombined CONS__SrcLinesCombined; +struct CONS__SrcLinesCombined +{ U32 *line_nums; U32 *line_ranges; U64 *voffs; U32 line_count; U32 voff_count; -} CONS__SrcLinesCombined; +}; -typedef struct CONS__SrcLineMapVoffBlock{ - struct CONS__SrcLineMapVoffBlock *next; +typedef struct CONS__SrcLineMapVoffBlock CONS__SrcLineMapVoffBlock; +struct CONS__SrcLineMapVoffBlock +{ + CONS__SrcLineMapVoffBlock *next; U64 voff; -} CONS__SrcLineMapVoffBlock; +}; -typedef struct CONS__SrcLineMapBucket{ - struct CONS__SrcLineMapBucket *order_next; - struct CONS__SrcLineMapBucket *hash_next; +typedef struct CONS__SrcLineMapBucket CONS__SrcLineMapBucket; +struct CONS__SrcLineMapBucket +{ + CONS__SrcLineMapBucket *order_next; + CONS__SrcLineMapBucket *hash_next; U32 line_num; CONS__SrcLineMapVoffBlock *first_voff_block; CONS__SrcLineMapVoffBlock *last_voff_block; U64 voff_count; -} CONS__SrcLineMapBucket; +}; -static CONS__SrcLinesCombined* cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first); +//- rjf: vmap baking data structure -//- cons serializer for vmap type -typedef struct CONS__VMap{ +typedef struct CONS__VMap CONS__VMap; +struct CONS__VMap +{ RADDBG_VMapEntry *vmap; // [count + 1] U32 count; -} CONS__VMap; +}; -typedef struct CONS__VMapMarker{ +typedef struct CONS__VMapMarker CONS__VMapMarker; +struct CONS__VMapMarker +{ U32 idx; U32 begin_range; -} CONS__VMapMarker; +}; -typedef struct CONS__VMapRangeTracker{ - struct CONS__VMapRangeTracker *next; +typedef struct CONS__VMapRangeTracker CONS__VMapRangeTracker; +struct CONS__VMapRangeTracker +{ + CONS__VMapRangeTracker *next; U32 idx; -} CONS__VMapRangeTracker; +}; -static CONS__VMap* cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey *keys, - U64 marker_count); +//- rjf: type data baking types -//- cons serializer for unit vmap -static CONS__VMap* cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count); - -//- cons serializer for types -typedef struct CONS__TypeData{ +typedef struct CONS__TypeData CONS__TypeData; +struct CONS__TypeData +{ RADDBG_TypeNode *type_nodes; U32 type_node_count; @@ -854,14 +736,13 @@ typedef struct CONS__TypeData{ RADDBG_EnumMember *enum_members; U32 enum_member_count; -} CONS__TypeData; +}; -static CONS__TypeData* cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx); +//- rjf: symbol data baking types -static U32* cons__idx_run_from_types(Arena *arena, CONS_Type **types, U32 count); - -//- cons serializer for symbols -typedef struct CONS__SymbolData{ +typedef struct CONS__SymbolData CONS__SymbolData; +struct CONS__SymbolData +{ RADDBG_GlobalVariable *global_variables; U32 global_variable_count; @@ -889,30 +770,228 @@ typedef struct CONS__SymbolData{ void *location_data; U32 location_data_size; - -} CONS__SymbolData; +}; -static CONS__SymbolData* cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx); +//- rjf: name map baking types -//- cons serializer for name maps -typedef struct CONS__NameMapSemiNode{ - struct CONS__NameMapSemiNode *next; +typedef struct CONS__NameMapSemiNode CONS__NameMapSemiNode; +struct CONS__NameMapSemiNode +{ + CONS__NameMapSemiNode *next; CONS__NameMapNode *node; -} CONS__NameMapSemiNode; +}; -typedef struct CONS__NameMapSemiBucket{ +typedef struct CONS__NameMapSemiBucket CONS__NameMapSemiBucket; +struct CONS__NameMapSemiBucket +{ CONS__NameMapSemiNode *first; CONS__NameMapSemiNode *last; U64 count; -} CONS__NameMapSemiBucket; +}; -typedef struct CONS__NameMapBaked{ +typedef struct CONS__NameMapBaked CONS__NameMapBaked; +struct CONS__NameMapBaked +{ RADDBG_NameMapBucket *buckets; RADDBG_NameMapNode *nodes; U32 bucket_count; U32 node_count; -} CONS__NameMapBaked; +}; +//- rjf: bundle baking context type + +typedef struct CONS__BakeParams CONS__BakeParams; +struct CONS__BakeParams +{ + U64 strings_bucket_count; + U64 idx_runs_bucket_count; +}; + +typedef struct CONS__BakeCtx CONS__BakeCtx; +struct CONS__BakeCtx +{ + Arena *arena; + CONS__Strings strs; + CONS__IdxRuns idxs; + CONS__PathTree *tree; +}; + +//////////////////////////////// +//~ rjf: Basic Type Helpers + +//- rjf: type lists +static void cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type); + +//- rjf: bytecode lists +static void cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBG_EvalOp op, U64 p); +static void cons_bytecode_push_uconst(Arena *arena, CONS_EvalBytecode *bytecode, U64 x); +static void cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, S64 x); +static void cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *right_destroyed); + +//- rjf: sortable range sorting +static CONS__SortKey* cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count); + +//////////////////////////////// +//~ rjf: Auxiliary Data Structure Functions + +//- rjf: u64 -> ptr map +static void cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count); +static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out); +static void cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup, void *ptr); + +//- rjf: string8 -> ptr map +static void cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count); +static void*cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash); +static void cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 hash, void *ptr); + +//////////////////////////////// +//~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions + +//- rjf: root creation +static CONS_Root* cons_root_new(CONS_RootParams *params); +static void cons_root_release(CONS_Root *root); + +//- rjf: error accumulation +static void cons_error(CONS_Root *root, String8 string); +static void cons_errorf(CONS_Root *root, char *fmt, ...); +static CONS_Error* cons_get_first_error(CONS_Root *root); + +//- rjf: top-level info specification +static void cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli); + +//- rjf: binary section building +static void cons_add_binary_section(CONS_Root *root, + String8 name, RADDBG_BinarySectionFlags flags, + U64 voff_first, U64 voff_opl, U64 foff_first, + U64 foff_opl); + +//- rjf: unit info building +static CONS_Unit* cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash); +static void cons_unit_set_info(CONS_Root *root, CONS_Unit *unit, CONS_UnitInfo *info); +static void cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, + CONS_LineSequence *line_sequence); +static void cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl); + +//- rjf: type info lookups/reservations +static CONS_Type* cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash); +static CONS_Reservation* cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash); +static void cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type); + +//- rjf: nil/singleton types +static B32 cons_type_is_unhandled_nil(CONS_Root *root, CONS_Type *type); +static CONS_Type* cons_type_handled_nil(CONS_Root *root); +static CONS_Type* cons_type_nil(CONS_Root *root); +static CONS_Type* cons_type_variadic(CONS_Root *root); + +//- rjf: base type info constructors +static CONS_Type* cons__type_new(CONS_Root *root); +static CONS_TypeUDT* cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *type); +static CONS_TypeUDT* cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type); + +//- rjf: basic/operator type construction helpers +static CONS_Type* cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name); +static CONS_Type* cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeModifierFlags flags); +static CONS_Type* cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit_count); +static CONS_Type* cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeKind ptr_type_kind); +static CONS_Type* cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count); +static CONS_Type* cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *params); +static CONS_Type* cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, struct CONS_TypeList *params); + +//- rjf: udt type constructors +static CONS_Type* cons_type_udt(CONS_Root *root, RADDBG_TypeKind record_type_kind, String8 name, U64 size); +static CONS_Type* cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name); +static CONS_Type* cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name); +static CONS_Type* cons_type_incomplete(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name); + +//- rjf: type member building +static void cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type, U32 off); +static void cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type); +static void cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type); +static void cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type); +static void cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type); +static void cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 off); +static void cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 vptr_off, U32 vtable_off); +static void cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, CONS_Type *nested_type); +static void cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 val); + +//- rjf: type source coordinate specifications +static void cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, String8 source_path, U32 line, U32 col); + +//- rjf: symbol info building +static CONS_Symbol* cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash); +static void cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info); + +//- rjf: scope info building +static CONS_Scope *cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash); +static void cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent); +static void cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl); +static void cons__scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol); + +//- rjf: local info building +static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash); +static void cons_local_set_basic_info(CONS_Root *root, CONS_Local *local, CONS_LocalInfo *info); +static CONS_LocationSet* cons_location_set_from_local(CONS_Root *root, CONS_Local *local); + +//- rjf: location info building +static void cons_location_set_add_case(CONS_Root *root, CONS_LocationSet *locset, U64 voff_first, U64 voff_opl, CONS_Location *location); +static CONS_Location* cons_location_addr_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode); +static CONS_Location* cons_location_val_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode); +static CONS_Location* cons_location_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset); +static CONS_Location* cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset); +static CONS_Location* cons_location_val_reg(CONS_Root *root, U8 reg_code); + +//- rjf: name map building +static CONS__NameMap* cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind); +static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 name, U32 idx); + +//////////////////////////////// +//~ rjf: Debug Info Baking (Loose -> Tight) Functions + +//- rjf: bake context construction +static CONS__BakeCtx* cons__bake_ctx_begin(CONS__BakeParams *params); +static void cons__bake_ctx_release(CONS__BakeCtx *bake_ctx); + +//- rjf: string baking +static U32 cons__string(CONS__BakeCtx *bctx, String8 str); + +//- rjf: idx run baking +static U64 cons__idx_run_hash(U32 *idx_run, U32 count); +static U32 cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count); + +//- rjf: data section baking +static U32 cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_DataSectionTag tag); + +//- rjf: paths baking +static String8 cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node); +static void cons__normal_string_from_path_node_build(Arena *arena, CONS__PathNode *node, String8List *out); +static CONS__PathNode* cons__paths_new_node(CONS__BakeCtx *bctx); +static CONS__PathNode* cons__paths_sub_path(CONS__BakeCtx *bctx, CONS__PathNode *dir, String8 sub_dir); +static CONS__PathNode* cons__paths_node_from_path(CONS__BakeCtx *bctx, String8 path); +static U32 cons__paths_idx_from_path(CONS__BakeCtx *bctx, String8 path); +static CONS__SrcNode* cons__paths_new_src_node(CONS__BakeCtx *bctx); +static CONS__SrcNode* cons__paths_src_node_from_path_node(CONS__BakeCtx *bctx, CONS__PathNode *path_node); + +//- rjf: per-unit line info baking +static CONS__UnitLinesCombined* cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNode *first_seq); + +//- rjf: per-src line info baking +static CONS__SrcLinesCombined* cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first); + +//- rjf: vmap baking +static CONS__VMap* cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey *keys, U64 marker_count); +static CONS__VMap* cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count); + +//- rjf: type info baking +static U32* cons__idx_run_from_types(Arena *arena, CONS_Type **types, U32 count); +static CONS__TypeData* cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx); + +//- rjf: symbol data baking +static CONS__SymbolData* cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx); + +//- rjf: name map baking static CONS__NameMapBaked* cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__NameMap *map); -#endif // RADDBG_CONS_H +//- rjf: top-level baking entry point +static void cons_bake_file(Arena *arena, CONS_Root *root, String8List *out); + +#endif // RADDBGI_CONS_H diff --git a/src/raddbg_convert/dwarf/raddbg_dwarf.c b/src/raddbgi_convert/dwarf/raddbgi_dwarf.c similarity index 100% rename from src/raddbg_convert/dwarf/raddbg_dwarf.c rename to src/raddbgi_convert/dwarf/raddbgi_dwarf.c diff --git a/src/raddbg_convert/dwarf/raddbg_dwarf.h b/src/raddbgi_convert/dwarf/raddbgi_dwarf.h similarity index 100% rename from src/raddbg_convert/dwarf/raddbg_dwarf.h rename to src/raddbgi_convert/dwarf/raddbgi_dwarf.h diff --git a/src/raddbg_convert/dwarf/raddbg_dwarf_stringize.c b/src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.c similarity index 100% rename from src/raddbg_convert/dwarf/raddbg_dwarf_stringize.c rename to src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.c diff --git a/src/raddbg_convert/dwarf/raddbg_dwarf_stringize.h b/src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h similarity index 100% rename from src/raddbg_convert/dwarf/raddbg_dwarf_stringize.h rename to src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h diff --git a/src/raddbg_convert/dwarf/raddbg_elf.c b/src/raddbgi_convert/dwarf/raddbgi_elf.c similarity index 100% rename from src/raddbg_convert/dwarf/raddbg_elf.c rename to src/raddbgi_convert/dwarf/raddbgi_elf.c diff --git a/src/raddbg_convert/dwarf/raddbg_elf.h b/src/raddbgi_convert/dwarf/raddbgi_elf.h similarity index 100% rename from src/raddbg_convert/dwarf/raddbg_elf.h rename to src/raddbgi_convert/dwarf/raddbgi_elf.h diff --git a/src/raddbg_convert/dwarf/raddbg_from_dwarf.c b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c similarity index 98% rename from src/raddbg_convert/dwarf/raddbg_from_dwarf.c rename to src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c index 76c013bc..2e4aa10f 100644 --- a/src/raddbg_convert/dwarf/raddbg_from_dwarf.c +++ b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c @@ -3,30 +3,29 @@ #include "base/base_inc.h" #include "os/os_inc.h" -#include "raddbg_format/raddbg_format.h" -#include "raddbg_cons/raddbg_cons.h" +#include "raddbgi_format/raddbgi_format.h" +#include "raddbgi_cons/raddbgi_cons.h" -#include "raddbg_elf.h" -#include "raddbg_dwarf.h" +#include "raddbgi_elf.h" +#include "raddbgi_dwarf.h" -#include "raddbg_dwarf_stringize.h" +#include "raddbgi_dwarf_stringize.h" -#include "raddbg_from_dwarf.h" +#include "raddbgi_from_dwarf.h" #include "base/base_inc.c" #include "os/os_inc.c" -#include "raddbg_format/raddbg_format.c" -#include "raddbg_cons/raddbg_cons.c" +#include "raddbgi_format/raddbgi_format.c" +#include "raddbgi_cons/raddbgi_cons.c" -#include "raddbg_elf.c" -#include "raddbg_dwarf.c" +#include "raddbgi_elf.c" +#include "raddbgi_dwarf.c" -#include "raddbg_dwarf_stringize.c" +#include "raddbgi_dwarf_stringize.c" // TODO(allen): // [ ] need sample data for .debug_names - //////////////////////////////// //~ Program Parameters Parser diff --git a/src/raddbg_convert/dwarf/raddbg_from_dwarf.h b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.h similarity index 100% rename from src/raddbg_convert/dwarf/raddbg_from_dwarf.h rename to src/raddbgi_convert/dwarf/raddbgi_from_dwarf.h diff --git a/src/raddbg_convert/pdb/raddbg_codeview.c b/src/raddbgi_convert/pdb/raddbgi_codeview.c similarity index 100% rename from src/raddbg_convert/pdb/raddbg_codeview.c rename to src/raddbgi_convert/pdb/raddbgi_codeview.c diff --git a/src/raddbg_convert/pdb/raddbg_codeview.h b/src/raddbgi_convert/pdb/raddbgi_codeview.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_codeview.h rename to src/raddbgi_convert/pdb/raddbgi_codeview.h diff --git a/src/raddbg_convert/pdb/raddbg_codeview_conversion.c b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c similarity index 100% rename from src/raddbg_convert/pdb/raddbg_codeview_conversion.c rename to src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c diff --git a/src/raddbg_convert/pdb/raddbg_codeview_conversion.h b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_codeview_conversion.h rename to src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h diff --git a/src/raddbg_convert/pdb/raddbg_codeview_stringize.c b/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.c similarity index 100% rename from src/raddbg_convert/pdb/raddbg_codeview_stringize.c rename to src/raddbgi_convert/pdb/raddbgi_codeview_stringize.c diff --git a/src/raddbg_convert/pdb/raddbg_codeview_stringize.h b/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_codeview_stringize.h rename to src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h diff --git a/src/raddbg_convert/pdb/raddbg_coff.h b/src/raddbgi_convert/pdb/raddbgi_coff.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_coff.h rename to src/raddbgi_convert/pdb/raddbgi_coff.h diff --git a/src/raddbg_convert/pdb/raddbg_coff_conversion.c b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c similarity index 100% rename from src/raddbg_convert/pdb/raddbg_coff_conversion.c rename to src/raddbgi_convert/pdb/raddbgi_coff_conversion.c diff --git a/src/raddbg_convert/pdb/raddbg_coff_conversion.h b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_coff_conversion.h rename to src/raddbgi_convert/pdb/raddbgi_coff_conversion.h diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c similarity index 99% rename from src/raddbg_convert/pdb/raddbg_from_pdb.c rename to src/raddbgi_convert/pdb/raddbgi_from_pdb.c index fceda14c..18c4be2e 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c @@ -1407,11 +1407,6 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ U8 *name_ptr = numeric_ptr + size.encoded_size; String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - if(str8_match(name, str8_lit("Foo"), 0)) - { - int x = 0; - } - // incomplete type if (lf_struct->props & CV_TypeProp_FwdRef){ RADDBG_TypeKind type_kind = RADDBG_TypeKind_IncompleteStruct; diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.h b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_from_pdb.h rename to src/raddbgi_convert/pdb/raddbgi_from_pdb.h diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb_main.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c similarity index 76% rename from src/raddbg_convert/pdb/raddbg_from_pdb_main.c rename to src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c index 4a7921a2..be1a992a 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb_main.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c @@ -4,37 +4,37 @@ #include "base/base_inc.h" #include "os/os_inc.h" #include "coff/coff.h" -#include "raddbg_format/raddbg_format.h" -#include "raddbg_cons/raddbg_cons.h" +#include "raddbgi_format/raddbgi_format.h" +#include "raddbgi_cons/raddbgi_cons.h" -#include "raddbg_coff.h" -#include "raddbg_codeview.h" -#include "raddbg_msf.h" -#include "raddbg_pdb.h" -#include "raddbg_coff_conversion.h" -#include "raddbg_codeview_conversion.h" +#include "raddbgi_coff.h" +#include "raddbgi_codeview.h" +#include "raddbgi_msf.h" +#include "raddbgi_pdb.h" +#include "raddbgi_coff_conversion.h" +#include "raddbgi_codeview_conversion.h" -#include "raddbg_codeview_stringize.h" -#include "raddbg_pdb_stringize.h" +#include "raddbgi_codeview_stringize.h" +#include "raddbgi_pdb_stringize.h" -#include "raddbg_from_pdb.h" +#include "raddbgi_from_pdb.h" #include "base/base_inc.c" #include "coff/coff.c" #include "os/os_inc.c" -#include "raddbg_format/raddbg_format.c" -#include "raddbg_cons/raddbg_cons.c" +#include "raddbgi_format/raddbgi_format.c" +#include "raddbgi_cons/raddbgi_cons.c" -#include "raddbg_msf.c" -#include "raddbg_codeview.c" -#include "raddbg_pdb.c" -#include "raddbg_coff_conversion.c" -#include "raddbg_codeview_conversion.c" +#include "raddbgi_msf.c" +#include "raddbgi_codeview.c" +#include "raddbgi_pdb.c" +#include "raddbgi_coff_conversion.c" +#include "raddbgi_codeview_conversion.c" -#include "raddbg_codeview_stringize.c" -#include "raddbg_pdb_stringize.c" +#include "raddbgi_codeview_stringize.c" +#include "raddbgi_pdb_stringize.c" -#include "raddbg_from_pdb.c" +#include "raddbgi_from_pdb.c" int main(int argc, char **argv){ diff --git a/src/raddbg_convert/pdb/raddbg_msf.c b/src/raddbgi_convert/pdb/raddbgi_msf.c similarity index 100% rename from src/raddbg_convert/pdb/raddbg_msf.c rename to src/raddbgi_convert/pdb/raddbgi_msf.c diff --git a/src/raddbg_convert/pdb/raddbg_msf.h b/src/raddbgi_convert/pdb/raddbgi_msf.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_msf.h rename to src/raddbgi_convert/pdb/raddbgi_msf.h diff --git a/src/raddbg_convert/pdb/raddbg_pdb.c b/src/raddbgi_convert/pdb/raddbgi_pdb.c similarity index 100% rename from src/raddbg_convert/pdb/raddbg_pdb.c rename to src/raddbgi_convert/pdb/raddbgi_pdb.c diff --git a/src/raddbg_convert/pdb/raddbg_pdb.h b/src/raddbgi_convert/pdb/raddbgi_pdb.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_pdb.h rename to src/raddbgi_convert/pdb/raddbgi_pdb.h diff --git a/src/raddbg_convert/pdb/raddbg_pdb_stringize.c b/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.c similarity index 100% rename from src/raddbg_convert/pdb/raddbg_pdb_stringize.c rename to src/raddbgi_convert/pdb/raddbgi_pdb_stringize.c diff --git a/src/raddbg_convert/pdb/raddbg_pdb_stringize.h b/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h similarity index 100% rename from src/raddbg_convert/pdb/raddbg_pdb_stringize.h rename to src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h diff --git a/src/raddbg_dump/raddbg_dump.c b/src/raddbgi_dump/raddbgi_dump.c similarity index 98% rename from src/raddbg_dump/raddbg_dump.c rename to src/raddbgi_dump/raddbgi_dump.c index 2fa2dc50..1bcd7209 100644 --- a/src/raddbg_dump/raddbg_dump.c +++ b/src/raddbgi_dump/raddbgi_dump.c @@ -3,17 +3,17 @@ #include "base/base_inc.h" #include "os/os_inc.h" -#include "raddbg_format/raddbg_format.h" -#include "raddbg_format/raddbg_format_parse.h" -#include "raddbg_stringize.h" +#include "raddbgi_format/raddbgi_format.h" +#include "raddbgi_format/raddbgi_format_parse.h" +#include "raddbgi_stringize.h" -#include "raddbg_dump.h" +#include "raddbgi_dump.h" #include "base/base_inc.c" #include "os/os_inc.c" -#include "raddbg_format/raddbg_format.c" -#include "raddbg_format/raddbg_format_parse.c" -#include "raddbg_stringize.c" +#include "raddbgi_format/raddbgi_format.c" +#include "raddbgi_format/raddbgi_format_parse.c" +#include "raddbgi_stringize.c" //////////////////////////////// //~ Program Parameters Parser diff --git a/src/raddbg_dump/raddbg_dump.h b/src/raddbgi_dump/raddbgi_dump.h similarity index 100% rename from src/raddbg_dump/raddbg_dump.h rename to src/raddbgi_dump/raddbgi_dump.h diff --git a/src/raddbg_dump/raddbg_stringize.c b/src/raddbgi_dump/raddbgi_stringize.c similarity index 100% rename from src/raddbg_dump/raddbg_stringize.c rename to src/raddbgi_dump/raddbgi_stringize.c diff --git a/src/raddbg_dump/raddbg_stringize.h b/src/raddbgi_dump/raddbgi_stringize.h similarity index 100% rename from src/raddbg_dump/raddbg_stringize.h rename to src/raddbgi_dump/raddbgi_stringize.h diff --git a/src/raddbg_format/raddbg_format.c b/src/raddbgi_format/raddbgi_format.c similarity index 100% rename from src/raddbg_format/raddbg_format.c rename to src/raddbgi_format/raddbgi_format.c diff --git a/src/raddbg_format/raddbg_format.h b/src/raddbgi_format/raddbgi_format.h similarity index 100% rename from src/raddbg_format/raddbg_format.h rename to src/raddbgi_format/raddbgi_format.h diff --git a/src/raddbg_format/raddbg_format_parse.c b/src/raddbgi_format/raddbgi_format_parse.c similarity index 100% rename from src/raddbg_format/raddbg_format_parse.c rename to src/raddbgi_format/raddbgi_format_parse.c diff --git a/src/raddbg_format/raddbg_format_parse.h b/src/raddbgi_format/raddbgi_format_parse.h similarity index 100% rename from src/raddbg_format/raddbg_format_parse.h rename to src/raddbgi_format/raddbgi_format_parse.h diff --git a/src/regs/raddbg/generated/regs_raddbg.meta.c b/src/regs/raddbgi/generated/regs_raddbgi.meta.c similarity index 100% rename from src/regs/raddbg/generated/regs_raddbg.meta.c rename to src/regs/raddbgi/generated/regs_raddbgi.meta.c diff --git a/src/regs/raddbg/generated/regs_raddbg.meta.h b/src/regs/raddbgi/generated/regs_raddbgi.meta.h similarity index 100% rename from src/regs/raddbg/generated/regs_raddbg.meta.h rename to src/regs/raddbgi/generated/regs_raddbgi.meta.h diff --git a/src/regs/raddbg/regs_raddbg.c b/src/regs/raddbgi/regs_raddbgi.c similarity index 67% rename from src/regs/raddbg/regs_raddbg.c rename to src/regs/raddbgi/regs_raddbgi.c index 399ec8d3..b72739f4 100644 --- a/src/regs/raddbg/regs_raddbg.c +++ b/src/regs/raddbgi/regs_raddbgi.c @@ -1,4 +1,4 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#include "regs/raddbg/generated/regs_raddbg.meta.c" +#include "regs/raddbgi/generated/regs_raddbgi.meta.c" diff --git a/src/regs/raddbg/regs_raddbg.h b/src/regs/raddbgi/regs_raddbgi.h similarity index 100% rename from src/regs/raddbg/regs_raddbg.h rename to src/regs/raddbgi/regs_raddbgi.h diff --git a/src/regs/raddbg/regs_raddbg.mc b/src/regs/raddbgi/regs_raddbgi.mc similarity index 100% rename from src/regs/raddbg/regs_raddbg.mc rename to src/regs/raddbgi/regs_raddbgi.mc diff --git a/src/scratch/look_at_raddbg.c b/src/scratch/look_at_raddbg.c index 9e3c7313..ce6d9129 100644 --- a/src/scratch/look_at_raddbg.c +++ b/src/scratch/look_at_raddbg.c @@ -6,10 +6,10 @@ #include #include -#include "raddbg_format/raddbg_format.h" -#include "raddbg_format/raddbg_format_parse.h" -#include "raddbg_format/raddbg_format.c" -#include "raddbg_format/raddbg_format_parse.c" +#include "raddbgi_format/raddbgi_format.h" +#include "raddbgi_format/raddbgi_format_parse.h" +#include "raddbgi_format/raddbgi_format.c" +#include "raddbgi_format/raddbgi_format_parse.c" int main(int argument_count, char **arguments) { From aa2a0948baf64d2de3fa5c7cb97b91df8f2babb8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 14:56:10 -0800 Subject: [PATCH 031/275] raddbg -> raddbgi --- build.bat | 4 +- project.4coder | 2 +- src/ctrl/ctrl_core.c | 84 +-- src/dbgi/dbgi.c | 142 ++-- src/dbgi/dbgi.h | 40 +- src/df/core/df_core.c | 208 +++--- src/df/core/df_core.h | 10 +- src/df/gfx/df_gfx.c | 34 +- src/df/gfx/df_gfx.h | 2 +- src/df/gfx/df_view_rule_hooks.c | 28 +- src/df/gfx/df_view_rule_hooks.h | 4 +- src/df/gfx/df_views.c | 24 +- src/eval/eval_compiler.c | 298 ++++---- src/eval/eval_compiler.h | 36 +- src/eval/eval_core.h | 6 +- src/eval/eval_machine.c | 226 +++--- src/eval/eval_parser.c | 208 +++--- src/eval/eval_parser.h | 8 +- src/raddbg_markup/raddbg_markup.h | 6 +- src/raddbgi_cons/raddbgi_cons.c | 400 +++++------ src/raddbgi_cons/raddbgi_cons.h | 70 +- src/raddbgi_convert/dwarf/raddbgi_dwarf.h | 6 +- .../dwarf/raddbgi_dwarf_stringize.h | 6 +- src/raddbgi_convert/dwarf/raddbgi_elf.h | 6 +- .../dwarf/raddbgi_from_dwarf.c | 2 +- .../dwarf/raddbgi_from_dwarf.h | 6 +- src/raddbgi_convert/pdb/raddbgi_codeview.h | 10 +- .../pdb/raddbgi_codeview_conversion.c | 34 +- .../pdb/raddbgi_codeview_conversion.h | 12 +- .../pdb/raddbgi_codeview_stringize.h | 6 +- src/raddbgi_convert/pdb/raddbgi_coff.h | 4 +- .../pdb/raddbgi_coff_conversion.c | 12 +- .../pdb/raddbgi_coff_conversion.h | 10 +- src/raddbgi_convert/pdb/raddbgi_from_pdb.c | 197 ++--- src/raddbgi_convert/pdb/raddbgi_from_pdb.h | 16 +- .../pdb/raddbgi_from_pdb_main.c | 2 +- src/raddbgi_convert/pdb/raddbgi_msf.h | 6 +- src/raddbgi_convert/pdb/raddbgi_pdb.h | 6 +- .../pdb/raddbgi_pdb_stringize.h | 6 +- src/raddbgi_dump/raddbgi_dump.c | 90 +-- src/raddbgi_dump/raddbgi_dump.h | 6 +- src/raddbgi_dump/raddbgi_stringize.c | 428 +++++------ src/raddbgi_dump/raddbgi_stringize.h | 112 +-- src/raddbgi_format/raddbgi_format.c | 74 +- src/raddbgi_format/raddbgi_format.h | 674 +++++++++--------- src/raddbgi_format/raddbgi_format_parse.c | 468 ++++++------ src/raddbgi_format/raddbgi_format_parse.h | 278 ++++---- src/regs/generated/regs_raddbg.meta.c | 322 --------- .../raddbgi/generated/regs_raddbgi.meta.c | 550 +++++++------- .../raddbgi/generated/regs_raddbgi.meta.h | 6 +- src/regs/raddbgi/regs_raddbgi.h | 10 +- .../{regs_raddbgi.mc => regs_raddbgi.mdesk} | 14 +- src/scratch/look_at_raddbg.c | 16 +- src/type_graph/type_graph.c | 302 ++++---- src/type_graph/type_graph.h | 28 +- 55 files changed, 2620 insertions(+), 2945 deletions(-) delete mode 100644 src/regs/generated/regs_raddbg.meta.c rename src/regs/raddbgi/{regs_raddbgi.mc => regs_raddbgi.mdesk} (65%) diff --git a/build.bat b/build.bat index 79d3fb91..7fdf96ad 100644 --- a/build.bat +++ b/build.bat @@ -15,7 +15,7 @@ cd /D "%~dp0" :: `build raddbg clang` :: `build raddbg release` :: `build raddbg asan telemetry` -:: `build raddbg_from_pdb` +:: `build raddbgi_from_pdb` :: :: For a full list of possible build targets and their build command lines, :: search for @build_targets in this file. @@ -85,7 +85,7 @@ pushd build popd :: --- Get Current Git Commit Id ---------------------------------------------- -for /f %%i in ('call git describe --always --dirty') do set compile=%compile% -DRADDBG_GIT=\"%%i\" +for /f %%i in ('call git describe --always --dirty') do set compile=%compile% -DRADDBGI_GIT=\"%%i\" :: --- Build & Run Metaprogram ------------------------------------------------ if "%no_meta%"=="1" echo [skipping metagen] diff --git a/project.4coder b/project.4coder index 1a4474d3..30ba820b 100644 --- a/project.4coder +++ b/project.4coder @@ -74,7 +74,7 @@ commands = }, .rjf_f4 = { - .win = "build raddbgi_from_pdb && pushd build && raddbg_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --dump:table_diagnostics && popd", + .win = "build raddbgi_from_pdb && pushd build && raddbgi_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --dump:table_diagnostics && popd", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 416ab856..62e303ab 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -199,7 +199,7 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE DBGI_Scope *scope = dbgi_scope_open(); String8 exe_path = demon_full_path_from_module(scratch.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; U64 base_vaddr = demon_base_vaddr_from_module(module); for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) { @@ -224,16 +224,16 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE // rjf: filename -> src_id U32 src_id = 0; { - RADDBG_NameMap *mapptr = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_NormalSourcePaths); + RADDBGI_NameMap *mapptr = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { - RADDBG_ParsedNameMap map = {0}; - raddbg_name_map_parse(rdbg, mapptr, &map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, filename_normalized.str, filename_normalized.size); + RADDBGI_ParsedNameMap map = {0}; + raddbgi_name_map_parse(rdbg, mapptr, &map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, filename_normalized.str, filename_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { src_id = ids[0]; @@ -244,11 +244,11 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE // rjf: src_id * pt -> push { - RADDBG_SourceFile *src = raddbg_element_from_idx(rdbg, source_files, src_id); - RADDBG_ParsedLineMap line_map = {0}; - raddbg_line_map_from_source_file(rdbg, src, &line_map); + RADDBGI_SourceFile *src = raddbgi_element_from_idx(rdbg, source_files, src_id); + RADDBGI_ParsedLineMap line_map = {0}; + raddbgi_line_map_from_source_file(rdbg, src, &line_map); U32 voff_count = 0; - U64 *voffs = raddbg_line_voffs_from_num(&line_map, pt.line, &voff_count); + U64 *voffs = raddbgi_line_voffs_from_num(&line_map, pt.line, &voff_count); for(U32 i = 0; i < voff_count; i += 1) { U64 vaddr = voffs[i] + base_vaddr; @@ -265,19 +265,19 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE U64 voff = bp->u64; if(rdbg != 0 && rdbg->procedures != 0) { - RADDBG_NameMap *mapptr = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_Procedures); + RADDBGI_NameMap *mapptr = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_Procedures); if(mapptr != 0) { - RADDBG_ParsedNameMap map = {0}; - raddbg_name_map_parse(rdbg, mapptr, &map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, symbol_name.str, symbol_name.size); + RADDBGI_ParsedNameMap map = {0}; + raddbgi_name_map_parse(rdbg, mapptr, &map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, symbol_name.str, symbol_name.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); for(U32 match_i = 0; match_i < id_count; match_i += 1) { - U64 proc_voff = raddbg_first_voff_from_proc(rdbg, ids[match_i]); + U64 proc_voff = raddbgi_first_voff_from_proc(rdbg, ids[match_i]); U64 proc_vaddr = proc_voff + base_vaddr; DEMON_Trap trap = {process, proc_vaddr + voff, (U64)bp}; demon_trap_chunk_list_push(arena, traps_out, 256, &trap); @@ -1638,21 +1638,21 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c CTRL_Handle module = ctrl_handle_from_demon(modules.handles[0]); String8 module_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module)); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64); - RADDBG_Parsed *rdbg = &dbgi->rdbg; - RADDBG_NameMap *unparsed_map = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_GlobalVariables); + RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_NameMap *unparsed_map = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_GlobalVariables); if(rdbg->global_variables != 0 && unparsed_map != 0) { - RADDBG_ParsedNameMap map = {0}; - raddbg_name_map_parse(rdbg, unparsed_map, &map); + RADDBGI_ParsedNameMap map = {0}; + raddbgi_name_map_parse(rdbg, unparsed_map, &map); String8 name = str8_lit("__asan_shadow_memory_dynamic_address"); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, name.str, name.size); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { - RADDBG_GlobalVariable *global_var = raddbg_element_from_idx(rdbg, global_variables, ids[0]); + RADDBGI_GlobalVariable *global_var = raddbgi_element_from_idx(rdbg, global_variables, ids[0]); U64 global_var_voff = global_var->voff; U64 global_var_vaddr = global_var->voff + demon_base_vaddr_from_module(ctrl_demon_handle_from_ctrl(module)); Architecture arch = demon_arch_from_object(ev->thread); @@ -2143,10 +2143,10 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U64 module_base_vaddr = demon_base_vaddr_from_module(module); String8 exe_path = demon_full_path_from_module(scratch.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RADDBG_Parsed *rdbg = &dbgi->rdbg; - RADDBG_NameMap *unparsed_map = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_Procedures); - RADDBG_ParsedNameMap map = {0}; - raddbg_name_map_parse(rdbg, unparsed_map, &map); + RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_NameMap *unparsed_map = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_Procedures); + RADDBGI_ParsedNameMap map = {0}; + raddbgi_name_map_parse(rdbg, unparsed_map, &map); //- rjf: add trap for user-specified entry point, if specified B32 entries_found = 0; @@ -2157,15 +2157,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = n->string; - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, name.str, name.size); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = raddbg_first_voff_from_proc(rdbg, procedure_id); + U64 voff = raddbgi_first_voff_from_proc(rdbg, procedure_id); if(voff != 0) { entries_found = 1; @@ -2183,15 +2183,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = n->string; - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, name.str, name.size); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = raddbg_first_voff_from_proc(rdbg, procedure_id); + U64 voff = raddbgi_first_voff_from_proc(rdbg, procedure_id); if(voff != 0) { DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; @@ -2216,15 +2216,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = hi_entry_points[idx]; - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, name.str, name.size); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = raddbg_first_voff_from_proc(rdbg, procedure_id); + U64 voff = raddbgi_first_voff_from_proc(rdbg, procedure_id); if(voff != 0) { entries_found = 1; @@ -2260,15 +2260,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = lo_entry_points[idx]; - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, name.str, name.size); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = raddbg_first_voff_from_proc(rdbg, procedure_id); + U64 voff = raddbgi_first_voff_from_proc(rdbg, procedure_id); if(voff != 0) { entries_found = 1; @@ -2866,7 +2866,7 @@ ctrl_thread__run(CTRL_Msg *msg) { String8 exe_path = demon_full_path_from_module(temp.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) { String8 string = condition_n->string; @@ -2878,8 +2878,8 @@ ctrl_thread__run(CTRL_Msg *msg) parse_ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256); parse_ctx.regs_map = ctrl_string2reg_from_arch(arch); parse_ctx.reg_alias_map = ctrl_string2alias_from_arch(arch); - parse_ctx.locals_map = eval_push_locals_map_from_raddbg_voff(temp.arena, rdbg, thread_rip_voff); - parse_ctx.member_map = eval_push_member_map_from_raddbg_voff(temp.arena, rdbg, thread_rip_voff); + parse_ctx.locals_map = eval_push_locals_map_from_raddbgi_voff(temp.arena, rdbg, thread_rip_voff); + parse_ctx.member_map = eval_push_member_map_from_raddbgi_voff(temp.arena, rdbg, thread_rip_voff); } EVAL_TokenArray tokens = eval_token_array_from_text(temp.arena, string); EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(temp.arena, &parse_ctx, string, &tokens); diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index 0198fe16..fc03ea0f 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -111,7 +111,7 @@ dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemAr } internal String8 -dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBG_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx) +dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBGI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx) { String8 result = {0}; switch(target) @@ -119,31 +119,31 @@ dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBG_Parsed *rdbg, DBGI_Fu // NOTE(rjf): no default - warn if we miss a case case DBGI_FuzzySearchTarget_Procedures: { - RADDBG_Procedure *proc = raddbg_element_from_idx(rdbg, procedures, element_idx); + RADDBGI_Procedure *proc = raddbgi_element_from_idx(rdbg, procedures, element_idx); U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(rdbg, proc->name_string_idx, &name_size); + U8 *name_base = raddbgi_string_from_idx(rdbg, proc->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_GlobalVariables: { - RADDBG_GlobalVariable *gvar = raddbg_element_from_idx(rdbg, global_variables, element_idx); + RADDBGI_GlobalVariable *gvar = raddbgi_element_from_idx(rdbg, global_variables, element_idx); U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(rdbg, gvar->name_string_idx, &name_size); + U8 *name_base = raddbgi_string_from_idx(rdbg, gvar->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_ThreadVariables: { - RADDBG_ThreadVariable *tvar = raddbg_element_from_idx(rdbg, thread_variables, element_idx); + RADDBGI_ThreadVariable *tvar = raddbgi_element_from_idx(rdbg, thread_variables, element_idx); U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(rdbg, tvar->name_string_idx, &name_size); + U8 *name_base = raddbgi_string_from_idx(rdbg, tvar->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_UDTs: { - RADDBG_UDT *udt = raddbg_element_from_idx(rdbg, udts, element_idx); - RADDBG_TypeNode *type_node = raddbg_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + RADDBGI_UDT *udt = raddbgi_element_from_idx(rdbg, udts, element_idx); + RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(rdbg, type_node->user_defined.name_string_idx, &name_size); + U8 *name_base = raddbgi_string_from_idx(rdbg, type_node->user_defined.name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_COUNT:{}break; @@ -769,7 +769,7 @@ dbgi_parse_thread_entry_point(void *p) } if(!og_dbg_format_is_known) { - if(data.size >= 8 && *(U64 *)data.str == RADDBG_MAGIC_CONSTANT) + if(data.size >= 8 && *(U64 *)data.str == RADDBGI_MAGIC_CONSTANT) { og_dbg_format_is_known = 1; og_dbg_is_raddbg = 1; @@ -801,54 +801,54 @@ dbgi_parse_thread_entry_point(void *p) } //- rjf: given O.G. path & analysis, determine RADDBG file path - String8 raddbg_path = {0}; + String8 raddbgi_path = {0}; if(do_task) { if(og_dbg_is_raddbg) { - raddbg_path = og_dbg_path; + raddbgi_path = og_dbg_path; } else if(og_dbg_format_is_known && og_dbg_is_pdb) { - raddbg_path = push_str8f(scratch.arena, "%S.raddbg", str8_chop_last_dot(og_dbg_path)); + raddbgi_path = push_str8f(scratch.arena, "%S.raddbgi", str8_chop_last_dot(og_dbg_path)); } } //- rjf: check if raddbg file is up-to-date - B32 raddbg_file_is_up_to_date = 0; + B32 raddbgi_file_is_up_to_date = 0; if(do_task) { - if(raddbg_path.size != 0) + if(raddbgi_path.size != 0) { - FileProperties props = os_properties_from_file_path(raddbg_path); - raddbg_file_is_up_to_date = (props.modified > og_dbg_props.modified); + FileProperties props = os_properties_from_file_path(raddbgi_path); + raddbgi_file_is_up_to_date = (props.modified > og_dbg_props.modified); } } //- rjf: if raddbg file is up to date based on timestamp, check the // encoding generation number, to see if we need to regenerate it // regardless - if(do_task && raddbg_file_is_up_to_date) + if(do_task && raddbgi_file_is_up_to_date) { OS_Handle file = {0}; OS_Handle file_map = {0}; FileProperties file_props = {0}; void *file_base = 0; - file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, raddbg_path); + file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, raddbgi_path); file_map = os_file_map_open(OS_AccessFlag_Read, file); file_props = os_properties_from_file(file); file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size)); - if(sizeof(RADDBG_Header) <= file_props.size) + if(sizeof(RADDBGI_Header) <= file_props.size) { - RADDBG_Header *header = (RADDBG_Header*)file_base; - if(header->encoding_version != RADDBG_ENCODING_VERSION) + RADDBGI_Header *header = (RADDBGI_Header*)file_base; + if(header->encoding_version != RADDBGI_ENCODING_VERSION) { - raddbg_file_is_up_to_date = 0; + raddbgi_file_is_up_to_date = 0; } } else { - raddbg_file_is_up_to_date = 0; + raddbgi_file_is_up_to_date = 0; } os_file_map_view_close(file_map, file_base); os_file_map_close(file_map); @@ -858,14 +858,14 @@ dbgi_parse_thread_entry_point(void *p) //- rjf: raddbg file not up-to-date? we need to generate it if(do_task) { - if(!raddbg_file_is_up_to_date) ProfScope("generate raddbg file") + if(!raddbgi_file_is_up_to_date) ProfScope("generate raddbg file") { if(og_dbg_is_pdb) { // rjf: push conversion task begin event { DBGI_Event event = {DBGI_EventKind_ConversionStarted}; - event.string = raddbg_path; + event.string = raddbgi_path; dbgi_p2u_push_event(&event); } @@ -882,7 +882,7 @@ dbgi_parse_thread_entry_point(void *p) //str8_list_pushf(scratch.arena, &opts.cmd_line, "--capture"); str8_list_pushf(scratch.arena, &opts.cmd_line, "--exe:%S", exe_path); str8_list_pushf(scratch.arena, &opts.cmd_line, "--pdb:%S", og_dbg_path); - str8_list_pushf(scratch.arena, &opts.cmd_line, "--out:%S", raddbg_path); + str8_list_pushf(scratch.arena, &opts.cmd_line, "--out:%S", raddbgi_path); os_launch_process(&opts, &process); } @@ -894,7 +894,7 @@ dbgi_parse_thread_entry_point(void *p) B32 wait_done = os_process_wait(process, os_now_microseconds()+1000); if(wait_done) { - raddbg_file_is_up_to_date = 1; + raddbgi_file_is_up_to_date = 1; break; } if(os_now_microseconds()-start_wait_t > 10000000 && og_dbg_props.size < MB(64)) @@ -907,7 +907,7 @@ dbgi_parse_thread_entry_point(void *p) // rjf: push conversion task end event { DBGI_Event event = {DBGI_EventKind_ConversionEnded}; - event.string = raddbg_path; + event.string = raddbgi_path; dbgi_p2u_push_event(&event); } } @@ -917,7 +917,7 @@ dbgi_parse_thread_entry_point(void *p) // rjf: push conversion task failure event { DBGI_Event event = {DBGI_EventKind_ConversionFailureUnsupportedFormat}; - event.string = raddbg_path; + event.string = raddbgi_path; dbgi_p2u_push_event(&event); } } @@ -925,16 +925,16 @@ dbgi_parse_thread_entry_point(void *p) } //- rjf: open raddbg file & gather info - OS_Handle raddbg_file = {0}; - OS_Handle raddbg_file_map = {0}; - FileProperties raddbg_file_props = {0}; - void *raddbg_file_base = 0; - if(do_task && raddbg_file_is_up_to_date) + OS_Handle raddbgi_file = {0}; + OS_Handle raddbgi_file_map = {0}; + FileProperties raddbgi_file_props = {0}; + void *raddbgi_file_base = 0; + if(do_task && raddbgi_file_is_up_to_date) { - raddbg_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, raddbg_path); - raddbg_file_map = os_file_map_open(OS_AccessFlag_Read, raddbg_file); - raddbg_file_props = os_properties_from_file(raddbg_file); - raddbg_file_base = os_file_map_view_open(raddbg_file_map, OS_AccessFlag_Read, r1u64(0, raddbg_file_props.size)); + raddbgi_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, raddbgi_path); + raddbgi_file_map = os_file_map_open(OS_AccessFlag_Read, raddbgi_file); + raddbgi_file_props = os_properties_from_file(raddbgi_file); + raddbgi_file_base = os_file_map_view_open(raddbgi_file_map, OS_AccessFlag_Read, r1u64(0, raddbgi_file_props.size)); } //- rjf: cache write, step 0: busy-loop-wait for all scope touches to be done @@ -958,7 +958,7 @@ dbgi_parse_thread_entry_point(void *p) // either EXE or raddbg file is new. if so, clear all old results & // store new top-level info B32 binary_refcount_is_zero = 0; - B32 raddbg_or_exe_file_is_updated = 0; + B32 raddbgi_or_exe_file_is_updated = 0; if(do_task) ProfScope("cache write, step 1: check if raddbg is new & clear") { OS_MutexScopeW(stripe->rw_mutex) for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) @@ -970,10 +970,10 @@ dbgi_parse_thread_entry_point(void *p) binary_refcount_is_zero = 1; break; } - if(bin->parse.dbg_props.modified != raddbg_file_props.modified || + if(bin->parse.dbg_props.modified != raddbgi_file_props.modified || bin->parse.exe_props.modified != exe_file_props.modified) { - raddbg_or_exe_file_is_updated = 1; + raddbgi_or_exe_file_is_updated = 1; // rjf: clean up old stuff if(bin->parse.arena != 0) { arena_release(bin->parse.arena); } @@ -991,10 +991,10 @@ dbgi_parse_thread_entry_point(void *p) bin->exe_file_map = exe_file_map; bin->parse.exe_base = exe_file_base; bin->parse.exe_props = exe_file_props; - bin->dbg_file = raddbg_file; - bin->dbg_file_map = raddbg_file_map; - bin->parse.dbg_base = raddbg_file_base; - bin->parse.dbg_props = raddbg_file_props; + bin->dbg_file = raddbgi_file; + bin->dbg_file_map = raddbgi_file_map; + bin->parse.dbg_base = raddbgi_file_base; + bin->parse.dbg_props = raddbgi_file_props; bin->gen += 1; } break; @@ -1004,11 +1004,11 @@ dbgi_parse_thread_entry_point(void *p) //- rjf: raddbg file or exe is not new? cache can stay unmodified, close // handles & skip to end. - if(do_task) if((!raddbg_or_exe_file_is_updated && raddbg_file_is_up_to_date) || binary_refcount_is_zero) + if(do_task) if((!raddbgi_or_exe_file_is_updated && raddbgi_file_is_up_to_date) || binary_refcount_is_zero) { - os_file_map_view_close(raddbg_file_map, raddbg_file_base); - os_file_map_close(raddbg_file_map); - os_file_close(raddbg_file); + os_file_map_view_close(raddbgi_file_map, raddbgi_file_base); + os_file_map_close(raddbgi_file_map); + os_file_close(raddbgi_file); os_file_map_view_close(exe_file_map, exe_file_base); os_file_map_close(exe_file_map); os_file_close(exe_file); @@ -1017,14 +1017,14 @@ dbgi_parse_thread_entry_point(void *p) } //- rjf: parse raddbg info - RADDBG_Parsed raddbg_parsed = dbgi_parse_nil.rdbg; + RADDBGI_Parsed raddbgi_parsed = dbgi_parse_nil.rdbg; U64 arch_addr_size = 8; if(do_task) { - RADDBG_ParseStatus parse_status = raddbg_parse((U8 *)raddbg_file_base, raddbg_file_props.size, &raddbg_parsed); - if(raddbg_parsed.top_level_info != 0) + RADDBGI_ParseStatus parse_status = raddbgi_parse((U8 *)raddbgi_file_base, raddbgi_file_props.size, &raddbgi_parsed); + if(raddbgi_parsed.top_level_info != 0) { - arch_addr_size = raddbg_addr_size_from_arch(raddbg_parsed.top_level_info->architecture); + arch_addr_size = raddbgi_addr_size_from_arch(raddbgi_parsed.top_level_info->architecture); } } @@ -1053,7 +1053,7 @@ dbgi_parse_thread_entry_point(void *p) bin->parse.arena = parse_arena; bin->parse.dbg_path = push_str8_copy(parse_arena, dbg_path); MemoryCopyStruct(&bin->parse.pe, &exe_pe_info); - MemoryCopyStruct(&bin->parse.rdbg, &raddbg_parsed); + MemoryCopyStruct(&bin->parse.rdbg, &raddbgi_parsed); bin->parse.gen = bin->gen; break; } @@ -1197,7 +1197,7 @@ dbgi_fuzzy_thread__entry_point(void *p) //- rjf: exe_path -> dbgi_parse, raddbg DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; //- rjf: rdbg * query -> item list U64 table_ptr_off = 0; @@ -1210,30 +1210,30 @@ dbgi_fuzzy_thread__entry_point(void *p) case DBGI_FuzzySearchTarget_COUNT:{}break; case DBGI_FuzzySearchTarget_Procedures: { - table_ptr_off = OffsetOf(RADDBG_Parsed, procedures); - element_name_idx_off = OffsetOf(RADDBG_Procedure, name_string_idx); + table_ptr_off = OffsetOf(RADDBGI_Parsed, procedures); + element_name_idx_off = OffsetOf(RADDBGI_Procedure, name_string_idx); element_count = rdbg->procedures_count; - element_size = sizeof(RADDBG_Procedure); + element_size = sizeof(RADDBGI_Procedure); }break; case DBGI_FuzzySearchTarget_GlobalVariables: { - table_ptr_off = OffsetOf(RADDBG_Parsed, global_variables); - element_name_idx_off = OffsetOf(RADDBG_GlobalVariable, name_string_idx); + table_ptr_off = OffsetOf(RADDBGI_Parsed, global_variables); + element_name_idx_off = OffsetOf(RADDBGI_GlobalVariable, name_string_idx); element_count = rdbg->global_variables_count; - element_size = sizeof(RADDBG_GlobalVariable); + element_size = sizeof(RADDBGI_GlobalVariable); }break; case DBGI_FuzzySearchTarget_ThreadVariables: { - table_ptr_off = OffsetOf(RADDBG_Parsed, thread_variables); - element_name_idx_off = OffsetOf(RADDBG_ThreadVariable, name_string_idx); + table_ptr_off = OffsetOf(RADDBGI_Parsed, thread_variables); + element_name_idx_off = OffsetOf(RADDBGI_ThreadVariable, name_string_idx); element_count = rdbg->thread_variables_count; - element_size = sizeof(RADDBG_ThreadVariable); + element_size = sizeof(RADDBGI_ThreadVariable); }break; case DBGI_FuzzySearchTarget_UDTs: { - table_ptr_off = OffsetOf(RADDBG_Parsed, udts); + table_ptr_off = OffsetOf(RADDBGI_Parsed, udts); element_count = rdbg->udts_count; - element_size = sizeof(RADDBG_UDT); + element_size = sizeof(RADDBGI_UDT); }break; } DBGI_FuzzySearchItemChunkList items_list = {0}; @@ -1246,13 +1246,13 @@ dbgi_fuzzy_thread__entry_point(void *p) U32 *name_idx_ptr = (U32 *)((U8 *)element + element_name_idx_off); if(target == DBGI_FuzzySearchTarget_UDTs) { - RADDBG_UDT *udt = (RADDBG_UDT *)element; - RADDBG_TypeNode *type_node = raddbg_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + RADDBGI_UDT *udt = (RADDBGI_UDT *)element; + RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); name_idx_ptr = &type_node->user_defined.name_string_idx; } U32 name_idx = *name_idx_ptr; U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(rdbg, name_idx, &name_size); + U8 *name_base = raddbgi_string_from_idx(rdbg, name_idx, &name_size); String8 name = str8(name_base, name_size); if(name.size == 0) { continue; } FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query, name); diff --git a/src/dbgi/dbgi.h b/src/dbgi/dbgi.h index 50511f79..94906ce2 100644 --- a/src/dbgi/dbgi.h +++ b/src/dbgi/dbgi.h @@ -18,7 +18,7 @@ struct DBGI_Parse void *dbg_base; FileProperties dbg_props; PE_BinInfo pe; - RADDBG_Parsed rdbg; + RADDBGI_Parsed rdbg; }; //////////////////////////////// @@ -341,24 +341,24 @@ global DBGI_Parse dbgi_parse_nil = 0, 0, 0, - &raddbg_binary_section_nil, 1, - &raddbg_file_path_node_nil, 1, - &raddbg_source_file_nil, 1, - &raddbg_unit_nil, 1, - &raddbg_vmap_entry_nil, 1, - &raddbg_type_node_nil, 1, - &raddbg_udt_nil, 1, - &raddbg_member_nil, 1, - &raddbg_enum_member_nil, 1, - &raddbg_global_variable_nil, 1, - &raddbg_vmap_entry_nil, 1, - &raddbg_thread_variable_nil, 1, - &raddbg_procedure_nil, 1, - &raddbg_scope_nil, 1, - &raddbg_voff_nil, 1, - &raddbg_vmap_entry_nil, 1, - &raddbg_local_nil, 1, - &raddbg_location_block_nil, 1, + &raddbgi_binary_section_nil, 1, + &raddbgi_file_path_node_nil, 1, + &raddbgi_source_file_nil, 1, + &raddbgi_unit_nil, 1, + &raddbgi_vmap_entry_nil, 1, + &raddbgi_type_node_nil, 1, + &raddbgi_udt_nil, 1, + &raddbgi_member_nil, 1, + &raddbgi_enum_member_nil, 1, + &raddbgi_global_variable_nil, 1, + &raddbgi_vmap_entry_nil, 1, + &raddbgi_thread_variable_nil, 1, + &raddbgi_procedure_nil, 1, + &raddbgi_scope_nil, 1, + &raddbgi_voff_nil, 1, + &raddbgi_vmap_entry_nil, 1, + &raddbgi_local_nil, 1, + &raddbgi_location_block_nil, 1, 0, 0, 0, 0, }, @@ -379,7 +379,7 @@ internal void dbgi_ensure_tctx_inited(void); internal U64 dbgi_hash_from_string(String8 string); internal U64 dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemArray *array, U64 element_idx); -internal String8 dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBG_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx); +internal String8 dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBGI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx); //////////////////////////////// //~ rjf: Forced Override Cache Functions diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index c9b2970b..c296d905 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1085,7 +1085,7 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, query); if(eval.errors.count == 0) { - TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_raddbg_key(parse_ctx.type_graph, parse_ctx.rdbg, eval.type_key)); + TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_raddbgi_key(parse_ctx.type_graph, parse_ctx.rdbg, eval.type_key)); if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) { eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdbg, ctrl_ctx, eval); @@ -3196,23 +3196,23 @@ df_symbol_name_from_binary_voff(Arena *arena, DF_Entity *binary, U64 voff) DBGI_Scope *scope = dbgi_scope_open(); String8 path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; if(result.size == 0 && rdbg->scope_vmap != 0) { - U64 scope_idx = raddbg_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); - RADDBG_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = raddbgi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); + RADDBGI_Scope *scope = &rdbg->scopes[scope_idx]; U64 proc_idx = scope->proc_idx; - RADDBG_Procedure *procedure = &rdbg->procedures[proc_idx]; + RADDBGI_Procedure *procedure = &rdbg->procedures[proc_idx]; U64 name_size = 0; - U8 *name_ptr = raddbg_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_ptr = raddbgi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); result = push_str8_copy(arena, str8(name_ptr, name_size)); } if(result.size == 0 && rdbg->global_vmap != 0) { - U64 global_idx = raddbg_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, voff); - RADDBG_GlobalVariable *global_var = &rdbg->global_variables[global_idx]; + U64 global_idx = raddbgi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, voff); + RADDBGI_GlobalVariable *global_var = &rdbg->global_variables[global_idx]; U64 name_size = 0; - U8 *name_ptr = raddbg_string_from_idx(rdbg, global_var->name_string_idx, &name_size); + U8 *name_ptr = raddbgi_string_from_idx(rdbg, global_var->name_string_idx, &name_size); result = push_str8_copy(arena, str8(name_ptr, name_size)); } dbgi_scope_close(scope); @@ -3263,23 +3263,23 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit DF_Entity *binary = binary_n->entity; String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; // rjf: file_path_normalized * rdbg -> src_id B32 good_src_id = 0; U32 src_id = 0; if(dbgi != &dbgi_parse_nil) { - RADDBG_NameMap *mapptr = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_NormalSourcePaths); + RADDBGI_NameMap *mapptr = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { - RADDBG_ParsedNameMap map = {0}; - raddbg_name_map_parse(rdbg, mapptr, &map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); + RADDBGI_ParsedNameMap map = {0}; + raddbgi_name_map_parse(rdbg, mapptr, &map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { good_src_id = 1; @@ -3292,9 +3292,9 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit // rjf: good src-id -> look up line info for visible range if(good_src_id) { - RADDBG_SourceFile *src = rdbg->source_files+src_id; - RADDBG_ParsedLineMap line_map = {0}; - raddbg_line_map_from_source_file(rdbg, src, &line_map); + RADDBGI_SourceFile *src = rdbg->source_files+src_id; + RADDBGI_ParsedLineMap line_map = {0}; + raddbgi_line_map_from_source_file(rdbg, src, &line_map); U64 line_idx = 0; for(S64 line_num = line_num_range.min; line_num <= line_num_range.max; @@ -3302,15 +3302,15 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit { DF_TextLineSrc2DasmInfoList *src2dasm_list = &src2dasm_array.v[line_idx]; U32 voff_count = 0; - U64 *voffs = raddbg_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); + U64 *voffs = raddbgi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); for(U64 idx = 0; idx < voff_count; idx += 1) { U64 base_voff = voffs[idx]; - U64 unit_idx = raddbg_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); - RADDBG_Unit *unit = &rdbg->units[unit_idx]; - RADDBG_ParsedLineInfo unit_line_info = {0}; - raddbg_line_info_from_unit(rdbg, unit, &unit_line_info); - U64 line_info_idx = raddbg_line_info_idx_from_voff(&unit_line_info, base_voff); + U64 unit_idx = raddbgi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); + RADDBGI_Unit *unit = &rdbg->units[unit_idx]; + RADDBGI_ParsedLineInfo unit_line_info = {0}; + raddbgi_line_info_from_unit(rdbg, unit, &unit_line_info); + U64 line_info_idx = raddbgi_line_info_idx_from_voff(&unit_line_info, base_voff); if(unit_line_info.voffs != 0) { Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); @@ -3347,23 +3347,23 @@ df_text_line_dasm2src_info_from_binary_voff(DF_Entity *binary, U64 voff) DBGI_Scope *scope = dbgi_scope_open(); String8 path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; DF_TextLineDasm2SrcInfo result = {0}; result.file = result.binary = &df_g_nil_entity; if(rdbg->unit_vmap != 0 && rdbg->units != 0 && rdbg->source_files != 0) { - U64 unit_idx = raddbg_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, voff); - RADDBG_Unit *unit = &rdbg->units[unit_idx]; - RADDBG_ParsedLineInfo unit_line_info = {0}; - raddbg_line_info_from_unit(rdbg, unit, &unit_line_info); - U64 line_info_idx = raddbg_line_info_idx_from_voff(&unit_line_info, voff); + U64 unit_idx = raddbgi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, voff); + RADDBGI_Unit *unit = &rdbg->units[unit_idx]; + RADDBGI_ParsedLineInfo unit_line_info = {0}; + raddbgi_line_info_from_unit(rdbg, unit, &unit_line_info); + U64 line_info_idx = raddbgi_line_info_idx_from_voff(&unit_line_info, voff); if(line_info_idx < unit_line_info.count) { - RADDBG_Line *line = &unit_line_info.lines[line_info_idx]; - RADDBG_Column *column = (line_info_idx < unit_line_info.col_count) ? &unit_line_info.cols[line_info_idx] : 0; - RADDBG_SourceFile *file = &rdbg->source_files[line->file_idx]; + RADDBGI_Line *line = &unit_line_info.lines[line_info_idx]; + RADDBGI_Column *column = (line_info_idx < unit_line_info.col_count) ? &unit_line_info.cols[line_info_idx] : 0; + RADDBGI_SourceFile *file = &rdbg->source_files[line->file_idx]; String8 file_normalized_full_path = {0}; - file_normalized_full_path.str = raddbg_string_from_idx(rdbg, file->normal_full_path_string_idx, &file_normalized_full_path.size); + file_normalized_full_path.str = raddbgi_string_from_idx(rdbg, file->normal_full_path_string_idx, &file_normalized_full_path.size); result.binary = binary; if(line->file_idx != 0 && file_normalized_full_path.size != 0) { @@ -3412,11 +3412,11 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) { String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; - RADDBG_NameMapKind name_map_kinds[] = + RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_NameMapKind name_map_kinds[] = { - RADDBG_NameMapKind_GlobalVariables, - RADDBG_NameMapKind_Procedures, + RADDBGI_NameMapKind_GlobalVariables, + RADDBGI_NameMapKind_Procedures, }; if(dbgi != &dbgi_parse_nil) { @@ -3424,11 +3424,11 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) name_map_kind_idx < ArrayCount(name_map_kinds); name_map_kind_idx += 1) { - RADDBG_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx]; - RADDBG_NameMap *name_map = raddbg_name_map_from_kind(rdbg, name_map_kind); - RADDBG_ParsedNameMap parsed_name_map = {0}; - raddbg_name_map_parse(rdbg, name_map, &parsed_name_map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &parsed_name_map, symbol_name.str, symbol_name.size); + RADDBGI_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx]; + RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(rdbg, name_map_kind); + RADDBGI_ParsedNameMap parsed_name_map = {0}; + raddbgi_name_map_parse(rdbg, name_map, &parsed_name_map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &parsed_name_map, symbol_name.str, symbol_name.size); // rjf: node -> num U64 entity_num = 0; @@ -3443,7 +3443,7 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) default: { U32 num = 0; - U32 *run = raddbg_matches_from_map_node(rdbg, node, &num); + U32 *run = raddbgi_matches_from_map_node(rdbg, node, &num); if(num != 0) { entity_num = run[0]+1; @@ -3457,15 +3457,15 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) if(entity_num != 0) switch(name_map_kind) { default:{}break; - case RADDBG_NameMapKind_GlobalVariables: + case RADDBGI_NameMapKind_GlobalVariables: { - RADDBG_GlobalVariable *global_var = raddbg_element_from_idx(rdbg, global_variables, entity_num-1); + RADDBGI_GlobalVariable *global_var = raddbgi_element_from_idx(rdbg, global_variables, entity_num-1); voff = global_var->voff; }break; - case RADDBG_NameMapKind_Procedures: + case RADDBGI_NameMapKind_Procedures: { - RADDBG_Procedure *procedure = raddbg_element_from_idx(rdbg, procedures, entity_num-1); - RADDBG_Scope *scope = raddbg_element_from_idx(rdbg, scopes, procedure->root_scope_idx); + RADDBGI_Procedure *procedure = raddbgi_element_from_idx(rdbg, procedures, entity_num-1); + RADDBGI_Scope *scope = raddbgi_element_from_idx(rdbg, scopes, procedure->root_scope_idx); voff = rdbg->scope_voffs[scope->voff_range_first]; }break; } @@ -3495,11 +3495,11 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name) { String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; - RADDBG_NameMap *name_map = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_Types); - RADDBG_ParsedNameMap parsed_name_map = {0}; - raddbg_name_map_parse(rdbg, name_map, &parsed_name_map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); + RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_Types); + RADDBGI_ParsedNameMap parsed_name_map = {0}; + raddbgi_name_map_parse(rdbg, name_map, &parsed_name_map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); U64 entity_num = 0; if(node != 0) { @@ -3512,7 +3512,7 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name) default: { U32 num = 0; - U32 *run = raddbg_matches_from_map_node(rdbg, node, &num); + U32 *run = raddbgi_matches_from_map_node(rdbg, node, &num); if(num != 0) { entity_num = run[0]+1; @@ -3697,8 +3697,8 @@ df_push_locals_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity * Temp scratch = scratch_begin(&arena, 1); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; - EVAL_String2NumMap *result = eval_push_locals_map_from_raddbg_voff(arena, rdbg, voff); + RADDBGI_Parsed *rdbg = &dbgi->rdbg; + EVAL_String2NumMap *result = eval_push_locals_map_from_raddbgi_voff(arena, rdbg, voff); scratch_end(scratch); return result; } @@ -3709,8 +3709,8 @@ df_push_member_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity * Temp scratch = scratch_begin(&arena, 1); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; - EVAL_String2NumMap *result = eval_push_member_map_from_raddbg_voff(arena, rdbg, voff); + RADDBGI_Parsed *rdbg = &dbgi->rdbg; + EVAL_String2NumMap *result = eval_push_member_map_from_raddbgi_voff(arena, rdbg, voff); scratch_end(scratch); return result; } @@ -3987,7 +3987,7 @@ df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 DF_Entity *binary = df_binary_file_from_module(module); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; Architecture arch = df_architecture_from_entity(process); EVAL_String2NumMap *reg_map = ctrl_string2reg_from_arch(arch); EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch); @@ -4035,22 +4035,22 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt) DF_Entity *binary = binary_n->entity; String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; // rjf: file_path_normalized * rdbg -> src_id B32 good_src_id = 0; U32 src_id = 0; { - RADDBG_NameMap *mapptr = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_NormalSourcePaths); + RADDBGI_NameMap *mapptr = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { - RADDBG_ParsedNameMap map = {0}; - raddbg_name_map_parse(rdbg, mapptr, &map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); + RADDBGI_ParsedNameMap map = {0}; + raddbgi_name_map_parse(rdbg, mapptr, &map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbg_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { good_src_id = 1; @@ -4063,19 +4063,19 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt) // rjf: good src-id -> look up line info for visible range if(good_src_id) { - RADDBG_SourceFile *src = rdbg->source_files+src_id; - RADDBG_ParsedLineMap line_map = {0}; - raddbg_line_map_from_source_file(rdbg, src, &line_map); + RADDBGI_SourceFile *src = rdbg->source_files+src_id; + RADDBGI_ParsedLineMap line_map = {0}; + raddbgi_line_map_from_source_file(rdbg, src, &line_map); U32 voff_count = 0; - U64 *voffs = raddbg_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count); + U64 *voffs = raddbgi_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count); for(U64 idx = 0; idx < voff_count; idx += 1) { U64 base_voff = voffs[idx]; - U64 unit_idx = raddbg_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); - RADDBG_Unit *unit = &rdbg->units[unit_idx]; - RADDBG_ParsedLineInfo unit_line_info = {0}; - raddbg_line_info_from_unit(rdbg, unit, &unit_line_info); - U64 line_info_idx = raddbg_line_info_idx_from_voff(&unit_line_info, base_voff); + U64 unit_idx = raddbgi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); + RADDBGI_Unit *unit = &rdbg->units[unit_idx]; + RADDBGI_ParsedLineInfo unit_line_info = {0}; + raddbgi_line_info_from_unit(rdbg, unit, &unit_line_info); + U64 line_info_idx = raddbgi_line_info_idx_from_voff(&unit_line_info, base_voff); Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; DF_TextLineSrc2DasmInfoNode *src2dasm_n = push_array(scratch.arena, DF_TextLineSrc2DasmInfoNode, 1); @@ -4246,7 +4246,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ } internal DF_Eval -df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) +df_value_mode_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) { ProfBeginFunction(); DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); @@ -4262,7 +4262,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c { TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= 8) { Temp scratch = scratch_begin(0, 0); @@ -4292,7 +4292,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c case EVAL_EvalMode_Reg: { TG_Key type_key = eval.type_key; - U64 type_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); U64 reg_off = eval.offset; CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); if(unwind.first != 0) @@ -4316,7 +4316,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c } internal DF_Eval -df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) +df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -4330,11 +4330,11 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_Ctr TG_Kind type_kind = tg_kind_from_key(type_key); if(type_kind == TG_Kind_Ptr) { - TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, type_key); + TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, type_key); TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key); if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class) { - TG_Type *ptee_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, ptee_type_key); + TG_Type *ptee_type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, ptee_type_key); B32 has_vtable = 0; for(U64 idx = 0; idx < ptee_type->count; idx += 1) { @@ -4363,13 +4363,13 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_Ctr U64 vtable_vaddr = 0; MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size); U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr); - U64 global_idx = raddbg_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff); - RADDBG_GlobalVariable *global_var = raddbg_element_from_idx(rdbg, global_variables, global_idx); - if(global_var->link_flags & RADDBG_LinkFlag_TypeScoped) + U64 global_idx = raddbgi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff); + RADDBGI_GlobalVariable *global_var = raddbgi_element_from_idx(rdbg, global_variables, global_idx); + if(global_var->link_flags & RADDBGI_LinkFlag_TypeScoped) { - RADDBG_UDT *udt = raddbg_element_from_idx(rdbg, udts, global_var->container_idx); - RADDBG_TypeNode *type = raddbg_element_from_idx(rdbg, type_nodes, udt->self_type_idx); - TG_Key derived_type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type->kind), (U64)udt->self_type_idx); + RADDBGI_UDT *udt = raddbgi_element_from_idx(rdbg, udts, global_var->container_idx); + RADDBGI_TypeNode *type = raddbgi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + TG_Key derived_type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type->kind), (U64)udt->self_type_idx); TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0); eval.type_key = ptr_to_derived_type_key; } @@ -4579,13 +4579,13 @@ df_string_from_ascii_value(Arena *arena, U8 val) } internal String8 -df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) +df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) { ProfBeginFunction(); String8 result = {0}; - TG_Key type_key = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, eval.type_key); + TG_Key type_key = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, eval.type_key); TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); U8 digit_group_separator = 0; if(!(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) { @@ -4653,7 +4653,7 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBG_Parsed *r case TG_Kind_Enum: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, type_key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, type_key); String8 constant_name = {0}; for(U64 val_idx = 0; val_idx < type->count; val_idx += 1) { @@ -4693,7 +4693,7 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBG_Parsed *r //- rjf: writing values back to child processes internal B32 -df_commit_eval_value(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) +df_commit_eval_value(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) { B32 result = 0; Temp scratch = scratch_begin(0, 0); @@ -4705,8 +4705,8 @@ df_commit_eval_value(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, TG_Key src_type_key = src_eval.type_key; TG_Kind dst_type_kind = tg_kind_from_key(dst_type_key); TG_Kind src_type_kind = tg_kind_from_key(src_type_key); - U64 dst_type_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, dst_type_key); - U64 src_type_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, src_type_key); + U64 dst_type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, dst_type_key); + U64 src_type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, src_type_key); //- rjf: get commit data based on destination type String8 commit_data = {0}; @@ -4914,7 +4914,7 @@ df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray mem } internal DF_EvalLinkBaseChunkList -df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap) +df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap) { DF_EvalLinkBaseChunkList list = {0}; for(DF_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;) @@ -5053,7 +5053,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ////////////////////////////// //- rjf: unpack eval // - TG_Key eval_type_key = tg_unwrapped_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, eval.type_key); + TG_Key eval_type_key = tg_unwrapped_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval.type_key); TG_Kind eval_type_kind = tg_kind_from_key(eval_type_key); ////////////////////////////// @@ -5084,7 +5084,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie TG_Kind ptr_type_kind = TG_Kind_Null; if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) { - TG_Key direct_type_key = tg_ptee_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, eval_type_key); + TG_Key direct_type_key = tg_ptee_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval_type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); DF_Eval ptr_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); @@ -5199,7 +5199,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("build viz blocks for UDT members") { //- rjf: type -> filtered data members - TG_MemberArray data_members = tg_data_members_from_graph_raddbg_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); //- rjf: build blocks for all members, split by sub-expansions @@ -5255,7 +5255,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("build viz blocks for UDT type-eval enums") { //- rjf: type -> full type info - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); //- rjf: build block for all members (cannot be expanded) DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_EnumMembers, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); @@ -5277,7 +5277,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("(structs, unions, classes) descend to members & make block(s), with linked list view") { //- rjf: type -> data members - TG_MemberArray data_members = tg_data_members_from_graph_raddbg_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); //- rjf: find link member TG_Member *link_member = 0; @@ -5290,7 +5290,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie { link_member = mem; link_member_type_kind = tg_kind_from_key(link_member->type_key); - link_member_ptee_type_key = tg_ptee_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, link_member->type_key); + link_member_ptee_type_key = tg_ptee_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, link_member->type_key); break; } } @@ -5371,10 +5371,10 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("(arrays) descend to elements & make block(s)") { //- rjf: unpack array type info - TG_Type *array_type = tg_type_from_graph_raddbg_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, arr_eval.type_key); + TG_Type *array_type = tg_type_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, arr_eval.type_key); U64 array_count = array_type->count; TG_Key element_type_key = array_type->direct_type_key; - U64 element_type_byte_size = tg_byte_size_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, element_type_key); + U64 element_type_byte_size = tg_byte_size_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, element_type_key); //- rjf: build blocks for all elements, split by sub-expansions DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Elements, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); @@ -5612,7 +5612,7 @@ df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalViz // rjf: determine exandability, editability if(tg_kind_from_key(eval.type_key) != TG_Kind_Null) { - for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, t)) + for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, t)) { TG_Kind kind = tg_kind_from_key(t); if(kind == TG_Kind_Null) diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index aa66357a..85d27da0 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1579,8 +1579,8 @@ internal B32 df_eval_memory_read(void *u, void *out, U64 addr, U64 size); internal EVAL_ParseCtx df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 vaddr); internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt); internal DF_Eval df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, String8 string); -internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); -internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); +internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); +internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg); //////////////////////////////// @@ -1604,14 +1604,14 @@ internal String8 df_eval_view_rule_from_key(DF_EvalView *eval_view, DF_ExpandKey //- rjf: evaluation value string builder helpers internal String8 df_string_from_ascii_value(Arena *arena, U8 val); -internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); +internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); //- rjf: writing values back to child processes -internal B32 df_commit_eval_value(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); +internal B32 df_commit_eval_value(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); //- rjf: type helpers internal TG_MemberArray df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray members, DF_CfgTable *cfg); -internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); +internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); internal DF_EvalLinkBase df_eval_link_base_from_chunk_list_index(DF_EvalLinkBaseChunkList *list, U64 idx); internal DF_EvalLinkBaseArray df_eval_link_base_array_from_chunk_list(Arena *arena, DF_EvalLinkBaseChunkList *chunks); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index f6cad045..b59ddc60 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -4410,15 +4410,15 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D DF_Entity *task = n->entity; if(task->alloc_time_us + 500000 < os_now_microseconds()) { - String8 raddbg_path = task->name; - String8 raddbg_name = str8_skip_last_slash(raddbg_path); - String8 task_text = push_str8f(scratch.arena, "Creating %S...", raddbg_name); + String8 raddbgi_path = task->name; + String8 raddbgi_name = str8_skip_last_slash(raddbgi_path); + String8 task_text = push_str8f(scratch.arena, "Creating %S...", raddbgi_name); UI_Key key = ui_key_from_stringf(ui_key_zero(), "task_%p", task); UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, key); UI_Signal sig = ui_signal_from_box(box); if(ui_hovering(sig)) UI_Tooltip { - ui_label(raddbg_path); + ui_label(raddbgi_path); } ui_box_equip_display_string(box, task_text); } @@ -5232,7 +5232,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D default:{}break; case EVAL_EvalMode_Addr: { - U64 size = tg_byte_size_from_graph_raddbg_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); + U64 size = tg_byte_size_from_graph_raddbgi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); size = Min(size, 64); Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); @@ -6858,7 +6858,7 @@ df_eval_escaped_from_raw_string(Arena *arena, String8 raw) } internal String8List -df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table) +df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table) { ProfBeginFunction(); String8List list = {0}; @@ -6869,13 +6869,13 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags { if(opt_member != 0) { - U64 member_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, opt_member->type_key); + U64 member_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, opt_member->type_key); str8_list_pushf(arena, &list, "member (%I64u offset, %I64u byte%s)", opt_member->off, member_byte_size, member_byte_size > 1 ? "s" : ""); } else { String8 basic_type_kind_string = tg_kind_basic_string_table[tg_kind_from_key(eval.type_key)]; - U64 byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, eval.type_key); + U64 byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, eval.type_key); str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size > 1 ? "s" : ""); } } @@ -6883,7 +6883,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags //- rjf: non-type path: descend recursively & produce single-line value strings else if(max_size > 0) { - TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_raddbg_key(graph, rdbg, eval.type_key)); + TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, eval.type_key)); U32 radix = default_radix; DF_CfgVal *dec_cfg = df_cfg_val_from_string(cfg_table, str8_lit("dec")); DF_CfgVal *hex_cfg = df_cfg_val_from_string(cfg_table, str8_lit("hex")); @@ -6924,7 +6924,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags // rjf: get pointed-at info TG_Kind type_kind = tg_kind_from_key(eval.type_key); - TG_Key direct_type_key = tg_ptee_from_graph_raddbg_key(graph, rdbg, eval.type_key); + TG_Key direct_type_key = tg_ptee_from_graph_raddbgi_key(graph, rdbg, eval.type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); B32 direct_type_has_content = (direct_type_kind != TG_Kind_Null && direct_type_kind != TG_Kind_Void && value_eval.imm_u64 != 0); B32 direct_type_is_string = (direct_type_kind != TG_Kind_Null && value_eval.imm_u64 != 0 && @@ -7011,7 +7011,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags case TG_Kind_Array: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *eval_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, eval.type_key); + TG_Type *eval_type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, eval.type_key); TG_Key direct_type_key = eval_type->direct_type_key; TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); U64 array_count = eval_type->count; @@ -7055,7 +7055,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags { if(depth < 3) { - U64 direct_type_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, direct_type_key); + U64 direct_type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, direct_type_key); for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) { DF_Eval element_eval = zero_struct; @@ -7111,7 +7111,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(depth < 4) { Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray data_members = tg_data_members_from_graph_raddbg_key(scratch.arena, graph, rdbg, eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, graph, rdbg, eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); for(U64 member_idx = 0; member_idx < filtered_data_members.count && max_size > space_taken; member_idx += 1) { @@ -7312,7 +7312,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop case DF_EvalVizBlockKind_Members: if(block_type_kind != TG_Kind_Null) { - TG_MemberArray data_members = tg_data_members_from_graph_raddbg_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, &block->cfg_table); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < filtered_data_members.count; idx += 1) { @@ -7370,7 +7370,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop case DF_EvalVizBlockKind_EnumMembers: if(block_type_kind == TG_Kind_Enum) { - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < type->count; idx += 1) { TG_EnumVal *enum_val = &type->enum_vals[idx]; @@ -7414,9 +7414,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop // case DF_EvalVizBlockKind_Elements: { - TG_Key direct_type_key = tg_unwrapped_direct_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_Key direct_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); - U64 direct_type_key_byte_size = tg_byte_size_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, direct_type_key); + U64 direct_type_key_byte_size = tg_byte_size_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, direct_type_key); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) { // rjf: get keys for this row diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index c55cf7d2..36d5b226 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -961,7 +961,7 @@ internal void df_window_update_and_render(Arena *arena, OS_EventList *events, DF //~ rjf: Eval Viz internal String8 df_eval_escaped_from_raw_string(Arena *arena, String8 raw); -internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table); +internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table); internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); //////////////////////////////// diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 87826f35..0a6ddbf4 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -5,7 +5,7 @@ //~ rjf: Helpers internal Vec4F32 -df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed *raddbg, DF_Entity *process) +df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed *raddbg, DF_Entity *process) { Vec4F32 rgba = {0}; Temp scratch = scratch_begin(0, 0); @@ -27,14 +27,14 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed case TG_Kind_Array: if(eval.mode == EVAL_EvalMode_Addr) { - U64 array_total_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, type_key); + U64 array_total_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, type_key); U64 array_total_size_capped = ClampTop(array_total_size, 64); Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); CTRL_ProcessMemorySlice array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng, 0); String8 array_memory = array_slice.data; - TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, raddbg, type_key); + TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(graph, raddbg, type_key); TG_Kind element_type_kind = tg_kind_from_key(element_type_key); - U64 element_type_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, element_type_key); + U64 element_type_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, element_type_key); for(U64 element_idx = 0; element_idx < 4; element_idx += 1) { U64 offset = element_idx*element_type_size; @@ -64,12 +64,12 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed case TG_Kind_Union: if(eval.mode == EVAL_EvalMode_Addr) { - U64 struct_total_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, type_key); + U64 struct_total_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, type_key); U64 struct_total_size_capped = ClampTop(struct_total_size, 64); Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); CTRL_ProcessMemorySlice struct_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng, 0); String8 struct_memory = struct_slice.data; - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, raddbg, type_key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, raddbg, type_key); for(U64 element_idx = 0, member_idx = 0; element_idx < 4 && member_idx < type->count; member_idx += 1) @@ -102,7 +102,7 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed } internal void -df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba) +df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba) { TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); @@ -126,13 +126,13 @@ df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBG_Parse case TG_Kind_Array: if(eval.mode == EVAL_EvalMode_Addr) { - U64 array_total_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, type_key); + U64 array_total_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, type_key); U64 array_total_size_capped = ClampTop(array_total_size, 64); Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); String8 array_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng); - TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, raddbg, type_key); + TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(graph, raddbg, type_key); TG_Kind element_type_kind = tg_kind_from_key(element_type_key); - U64 element_type_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, element_type_key); + U64 element_type_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, element_type_key); for(U64 element_idx = 0; element_idx < 4; element_idx += 1) { U64 offset = element_idx*element_type_size; @@ -162,11 +162,11 @@ df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBG_Parse case TG_Kind_Union: if(eval.mode == EVAL_EvalMode_Addr) { - U64 struct_total_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, type_key); + U64 struct_total_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, type_key); U64 struct_total_size_capped = ClampTop(struct_total_size, 64); Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); String8 struct_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, raddbg, type_key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, raddbg, type_key); for(U64 element_idx = 0, member_idx = 0; element_idx < 4 && member_idx < type->count; member_idx += 1) @@ -343,7 +343,7 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) } // rjf: apply array size to type - TG_Key pointee = tg_ptee_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); + TG_Key pointee = tg_ptee_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, array_size); eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); } @@ -373,7 +373,7 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap) Temp scratch = scratch_begin(&arena, 1); TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_size_bytes = tg_byte_size_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); + U64 type_size_bytes = tg_byte_size_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); if(TG_Kind_Char8 <= type_kind && type_kind <= TG_Kind_S256 && (type_size_bytes == 2 || type_size_bytes == 4 || diff --git a/src/df/gfx/df_view_rule_hooks.h b/src/df/gfx/df_view_rule_hooks.h index 2d7ea22d..9b2f578b 100644 --- a/src/df/gfx/df_view_rule_hooks.h +++ b/src/df/gfx/df_view_rule_hooks.h @@ -32,8 +32,8 @@ struct DF_TxtTopologyInfo //////////////////////////////// //~ rjf: Helpers -internal Vec4F32 df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed *raddbg, DF_Entity *process); -internal void df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba); +internal Vec4F32 df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed *raddbg, DF_Entity *process); +internal void df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba); internal DF_BitmapTopologyInfo df_view_rule_hooks__bitmap_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); internal DF_GeoTopologyInfo df_view_rule_hooks__geo_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); internal DF_TxtTopologyInfo df_view_rule_hooks__txt_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 12778ccd..c32fe086 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -751,7 +751,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF DF_Entity *binary = df_binary_file_from_module(module); String8 exe_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; //- rjf: calculate top-level keys, expand root-level, grab root expansion node DF_ExpandKey parent_key = df_expand_key_make(5381, 0); @@ -1180,7 +1180,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW default:{}break; case EVAL_EvalMode_Addr: { - U64 size = tg_byte_size_from_graph_raddbg_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); + U64 size = tg_byte_size_from_graph_raddbgi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); size = Min(size, 64); Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); @@ -1270,7 +1270,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW row->depth > 0 && !row_expanded) { - U64 next_off = (row->eval.offset + tg_byte_size_from_graph_raddbg_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key)); + U64 next_off = (row->eval.offset + tg_byte_size_from_graph_raddbgi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key)); if(next_off%64 != 0 && row->eval.offset/64 < next_off/64) { ui_set_next_fixed_x(0); @@ -2918,7 +2918,7 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) //- rjf: query -> raddbg, filtered items U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100); - RADDBG_Parsed *rdbg = &dbgi->rdbg; + RADDBGI_Parsed *rdbg = &dbgi->rdbg; B32 items_stale = 0; DBGI_FuzzySearchItemArray items = dbgi_fuzzy_search_items_from_key_exe_query(scope, fuzzy_search_key, exe_path, query, DBGI_FuzzySearchTarget_Procedures, os_now_microseconds()+100, &items_stale); if(items_stale) @@ -2929,9 +2929,9 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) //- rjf: submit best match when hitting enter w/ no selection if(slv->cursor.y == 0 && items.count != 0 && os_key_press(ui_events(), ui_window(), 0, OS_Key_Return)) { - RADDBG_Procedure *procedure = raddbg_element_from_idx(rdbg, procedures, items.v[0].idx); + RADDBGI_Procedure *procedure = raddbgi_element_from_idx(rdbg, procedures, items.v[0].idx); U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_base = raddbgi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); String8 name = str8(name_base, name_size); if(name.size != 0) { @@ -2967,12 +2967,12 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) UI_Focus((slv->cursor.y == idx+1) ? UI_FocusKind_On : UI_FocusKind_Off) { DBGI_FuzzySearchItem *item = &items.v[idx]; - RADDBG_Procedure *procedure = raddbg_element_from_idx(rdbg, procedures, item->idx); + RADDBGI_Procedure *procedure = raddbgi_element_from_idx(rdbg, procedures, item->idx); U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_base = raddbgi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); String8 name = str8(name_base, name_size); - RADDBG_TypeNode *type_node = raddbg_element_from_idx(rdbg, type_nodes, procedure->type_idx); - TG_Key type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type_node->kind), procedure->type_idx); + RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(rdbg, type_nodes, procedure->type_idx); + TG_Key type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), procedure->type_idx); ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| UI_BoxFlag_DrawBackground| @@ -7902,7 +7902,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) DBGI_Scope *scope = dbgi_scope_open(); U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, thread_rip_vaddr); - RADDBG_Parsed *rdbg = parse_ctx.rdbg; + RADDBGI_Parsed *rdbg = parse_ctx.rdbg; for(EVAL_String2NumMapNode *n = parse_ctx.locals_map->first; n != 0; n = n->order_next) { String8 local_name = n->string; @@ -7910,7 +7910,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) if(local_eval.mode == EVAL_EvalMode_Addr) { TG_Kind local_eval_type_kind = tg_kind_from_key(local_eval.type_key); - U64 local_eval_type_size = tg_byte_size_from_graph_raddbg_key(parse_ctx.type_graph, rdbg, local_eval.type_key); + U64 local_eval_type_size = tg_byte_size_from_graph_raddbgi_key(parse_ctx.type_graph, rdbg, local_eval.type_key); Rng1U64 vaddr_rng = r1u64(local_eval.offset, local_eval.offset+local_eval_type_size); Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng); if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min) diff --git a/src/eval/eval_compiler.c b/src/eval/eval_compiler.c index e303f29d..b1fd0409 100644 --- a/src/eval/eval_compiler.c +++ b/src/eval/eval_compiler.c @@ -23,8 +23,8 @@ eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list){ default: { // compute bytecode advance - U8 ctrlbits = raddbg_eval_opcode_ctrlbits[opcode]; - U64 extra_byte_count = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits); + U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[opcode]; + U64 extra_byte_count = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); U8 *next_ptr = ptr + 1 + extra_byte_count; Assert(next_ptr <= opl); @@ -62,9 +62,9 @@ eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list){ } internal void -eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RADDBG_EvalOp opcode, U64 p){ - U8 ctrlbits = raddbg_eval_opcode_ctrlbits[opcode]; - U32 p_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits); +eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RADDBGI_EvalOp opcode, U64 p){ + U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[opcode]; + U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); EVAL_Op *node = push_array_no_zero(arena, EVAL_Op, 1); node->opcode = opcode; @@ -78,35 +78,35 @@ eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RADDBG_EvalOp opcode, U64 p internal void eval_oplist_push_uconst(Arena *arena, EVAL_OpList *list, U64 x){ if (x <= 0xFF){ - eval_oplist_push_op(arena, list, RADDBG_EvalOp_ConstU8, x); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU8, x); } else if (x <= 0xFFFF){ - eval_oplist_push_op(arena, list, RADDBG_EvalOp_ConstU16, x); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU16, x); } else if (x <= 0xFFFFFFFF){ - eval_oplist_push_op(arena, list, RADDBG_EvalOp_ConstU32, x); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU32, x); } else{ - eval_oplist_push_op(arena, list, RADDBG_EvalOp_ConstU64, x); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU64, x); } } internal void eval_oplist_push_sconst(Arena *arena, EVAL_OpList *list, S64 x){ if (-0x80 <= x && x <= 0x7F){ - eval_oplist_push_op(arena, list, RADDBG_EvalOp_ConstU8, (U64)x); - eval_oplist_push_op(arena, list, RADDBG_EvalOp_TruncSigned, 8); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU8, (U64)x); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_TruncSigned, 8); } else if (-0x8000 <= x && x <= 0x7FFF){ - eval_oplist_push_op(arena, list, RADDBG_EvalOp_ConstU16, (U64)x); - eval_oplist_push_op(arena, list, RADDBG_EvalOp_TruncSigned, 16); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU16, (U64)x); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_TruncSigned, 16); } else if (-0x80000000ll <= x && x <= 0x7FFFFFFFll){ - eval_oplist_push_op(arena, list, RADDBG_EvalOp_ConstU32, (U64)x); - eval_oplist_push_op(arena, list, RADDBG_EvalOp_TruncSigned, 32); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU32, (U64)x); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_TruncSigned, 32); } else{ - eval_oplist_push_op(arena, list, RADDBG_EvalOp_ConstU64, (U64)x); + eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU64, (U64)x); } } @@ -138,31 +138,31 @@ eval_oplist_concat_in_place(EVAL_OpList *left_dst, EVAL_OpList *right_destroyed) //////////////////////////////// //~ allen: EVAL Expression Info Functions -internal RADDBG_EvalOp +internal RADDBGI_EvalOp eval_opcode_from_expr_kind(EVAL_ExprKind kind){ - RADDBG_EvalOp result = RADDBG_EvalOp_Stop; + RADDBGI_EvalOp result = RADDBGI_EvalOp_Stop; switch (kind){ - case EVAL_ExprKind_Neg: result = RADDBG_EvalOp_Neg; break; - case EVAL_ExprKind_LogNot: result = RADDBG_EvalOp_LogNot; break; - case EVAL_ExprKind_BitNot: result = RADDBG_EvalOp_BitNot; break; - case EVAL_ExprKind_Mul: result = RADDBG_EvalOp_Mul; break; - case EVAL_ExprKind_Div: result = RADDBG_EvalOp_Div; break; - case EVAL_ExprKind_Mod: result = RADDBG_EvalOp_Mod; break; - case EVAL_ExprKind_Add: result = RADDBG_EvalOp_Add; break; - case EVAL_ExprKind_Sub: result = RADDBG_EvalOp_Sub; break; - case EVAL_ExprKind_LShift: result = RADDBG_EvalOp_LShift; break; - case EVAL_ExprKind_RShift: result = RADDBG_EvalOp_RShift; break; - case EVAL_ExprKind_Less: result = RADDBG_EvalOp_Less; break; - case EVAL_ExprKind_LsEq: result = RADDBG_EvalOp_LsEq; break; - case EVAL_ExprKind_Grtr: result = RADDBG_EvalOp_Grtr; break; - case EVAL_ExprKind_GrEq: result = RADDBG_EvalOp_GrEq; break; - case EVAL_ExprKind_EqEq: result = RADDBG_EvalOp_EqEq; break; - case EVAL_ExprKind_NtEq: result = RADDBG_EvalOp_NtEq; break; - case EVAL_ExprKind_BitAnd: result = RADDBG_EvalOp_BitAnd; break; - case EVAL_ExprKind_BitXor: result = RADDBG_EvalOp_BitXor; break; - case EVAL_ExprKind_BitOr: result = RADDBG_EvalOp_BitOr; break; - case EVAL_ExprKind_LogAnd: result = RADDBG_EvalOp_LogAnd; break; - case EVAL_ExprKind_LogOr: result = RADDBG_EvalOp_LogOr; break; + case EVAL_ExprKind_Neg: result = RADDBGI_EvalOp_Neg; break; + case EVAL_ExprKind_LogNot: result = RADDBGI_EvalOp_LogNot; break; + case EVAL_ExprKind_BitNot: result = RADDBGI_EvalOp_BitNot; break; + case EVAL_ExprKind_Mul: result = RADDBGI_EvalOp_Mul; break; + case EVAL_ExprKind_Div: result = RADDBGI_EvalOp_Div; break; + case EVAL_ExprKind_Mod: result = RADDBGI_EvalOp_Mod; break; + case EVAL_ExprKind_Add: result = RADDBGI_EvalOp_Add; break; + case EVAL_ExprKind_Sub: result = RADDBGI_EvalOp_Sub; break; + case EVAL_ExprKind_LShift: result = RADDBGI_EvalOp_LShift; break; + case EVAL_ExprKind_RShift: result = RADDBGI_EvalOp_RShift; break; + case EVAL_ExprKind_Less: result = RADDBGI_EvalOp_Less; break; + case EVAL_ExprKind_LsEq: result = RADDBGI_EvalOp_LsEq; break; + case EVAL_ExprKind_Grtr: result = RADDBGI_EvalOp_Grtr; break; + case EVAL_ExprKind_GrEq: result = RADDBGI_EvalOp_GrEq; break; + case EVAL_ExprKind_EqEq: result = RADDBGI_EvalOp_EqEq; break; + case EVAL_ExprKind_NtEq: result = RADDBGI_EvalOp_NtEq; break; + case EVAL_ExprKind_BitAnd: result = RADDBGI_EvalOp_BitAnd; break; + case EVAL_ExprKind_BitXor: result = RADDBGI_EvalOp_BitXor; break; + case EVAL_ExprKind_BitOr: result = RADDBGI_EvalOp_BitOr; break; + case EVAL_ExprKind_LogAnd: result = RADDBGI_EvalOp_LogAnd; break; + case EVAL_ExprKind_LogOr: result = RADDBGI_EvalOp_LogOr; break; } return(result); } @@ -286,9 +286,9 @@ eval_expr_leaf_type(Arena *arena, void *location, TG_Key type_key){ //////////////////////////////// //~ allen: EVAL Type Information Transformers -internal RADDBG_EvalTypeGroup +internal RADDBGI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind){ - RADDBG_EvalTypeGroup result = 0; + RADDBGI_EvalTypeGroup result = 0; switch (kind){ default:{}break; @@ -303,7 +303,7 @@ eval_type_group_from_kind(TG_Kind kind){ case TG_Kind_IncompleteStruct: case TG_Kind_IncompleteClass: case TG_Kind_IncompleteUnion: case TG_Kind_IncompleteEnum: case TG_Kind_Bitfield: case TG_Kind_Variadic: - result = RADDBG_EvalTypeGroup_Other; break; + result = RADDBGI_EvalTypeGroup_Other; break; case TG_Kind_Handle: case TG_Kind_UChar8: case TG_Kind_UChar16: case TG_Kind_UChar32: @@ -312,26 +312,26 @@ eval_type_group_from_kind(TG_Kind kind){ case TG_Kind_U512: case TG_Kind_Ptr: case TG_Kind_LRef: case TG_Kind_RRef: case TG_Kind_Function: case TG_Kind_Method: case TG_Kind_MemberPtr: - result = RADDBG_EvalTypeGroup_U; break; + result = RADDBGI_EvalTypeGroup_U; break; case TG_Kind_Char8: case TG_Kind_Char16: case TG_Kind_Char32: case TG_Kind_S8: case TG_Kind_S16: case TG_Kind_S32: case TG_Kind_S64: case TG_Kind_S128: case TG_Kind_S256: case TG_Kind_S512: case TG_Kind_Bool: - result = RADDBG_EvalTypeGroup_S; break; + result = RADDBGI_EvalTypeGroup_S; break; case TG_Kind_F32: - result = RADDBG_EvalTypeGroup_F32; break; + result = RADDBGI_EvalTypeGroup_F32; break; case TG_Kind_F64: - result = RADDBG_EvalTypeGroup_F64; break; + result = RADDBGI_EvalTypeGroup_F64; break; } return(result); } internal TG_Key -eval_type_unwrap_enum(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +eval_type_unwrap_enum(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { TG_Key result = key; for(B32 good = 1; good;) @@ -339,7 +339,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) TG_Kind kind = tg_kind_from_key(key); if(kind == TG_Kind_Enum) { - result = tg_direct_from_graph_raddbg_key(graph, rdbg, result); + result = tg_direct_from_graph_raddbgi_key(graph, rdbg, result); } else { @@ -350,7 +350,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) } internal TG_Key -eval_type_promote(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key){ +eval_type_promote(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key){ TG_Key result = key; TG_Kind kind = tg_kind_from_key(key); if(kind == TG_Kind_Bool || @@ -365,7 +365,7 @@ eval_type_promote(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key){ } internal TG_Key -eval_type_coerce(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){ +eval_type_coerce(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ Assert(eval_kind_is_basic_or_enum(tg_kind_from_key(l)) && eval_kind_is_basic_or_enum(tg_kind_from_key(r))); @@ -384,12 +384,12 @@ eval_type_coerce(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){ } internal B32 -eval_type_match(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){ +eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ B32 result = 0; // unwrap - TG_Key lu = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l); - TG_Key ru = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, r); + TG_Key lu = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l); + TG_Key ru = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, r); if (tg_key_match(lu, ru)){ result = 1; @@ -408,8 +408,8 @@ eval_type_match(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_LRef: case TG_Kind_RRef: { - TG_Key lud = tg_direct_from_graph_raddbg_key(graph, rdbg, lu); - TG_Key rud = tg_direct_from_graph_raddbg_key(graph, rdbg, ru); + TG_Key lud = tg_direct_from_graph_raddbgi_key(graph, rdbg, lu); + TG_Key rud = tg_direct_from_graph_raddbgi_key(graph, rdbg, ru); if (eval_type_match(graph, rdbg, lud, rud)){ result = 1; } @@ -417,10 +417,10 @@ eval_type_match(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_MemberPtr: { - TG_Key lud = tg_direct_from_graph_raddbg_key(graph, rdbg, lu); - TG_Key rud = tg_direct_from_graph_raddbg_key(graph, rdbg, ru); - TG_Key luo = tg_owner_from_graph_raddbg_key(graph, rdbg, lu); - TG_Key ruo = tg_owner_from_graph_raddbg_key(graph, rdbg, ru); + TG_Key lud = tg_direct_from_graph_raddbgi_key(graph, rdbg, lu); + TG_Key rud = tg_direct_from_graph_raddbgi_key(graph, rdbg, ru); + TG_Key luo = tg_owner_from_graph_raddbgi_key(graph, rdbg, lu); + TG_Key ruo = tg_owner_from_graph_raddbgi_key(graph, rdbg, ru); if (eval_type_match(graph, rdbg, lud, rud) && eval_type_match(graph, rdbg, luo, ruo)){ result = 1; @@ -430,8 +430,8 @@ eval_type_match(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Array: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, r); + TG_Type *lt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, l); + TG_Type *rt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, r); if(lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key)) { result = 1; @@ -442,8 +442,8 @@ eval_type_match(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Function: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, r); + TG_Type *lt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, l); + TG_Type *rt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, r); if (lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key)) { B32 params_match = 1; @@ -466,8 +466,8 @@ eval_type_match(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Method: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, r); + TG_Type *lt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, l); + TG_Type *rt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, r); if (lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key) && eval_type_match(graph, rdbg, lt->owner_type_key, rt->owner_type_key)) @@ -522,15 +522,15 @@ eval_kind_is_basic_or_enum(TG_Kind kind){ internal EVAL_IRTree* eval_irtree_const_u(Arena *arena, U64 v){ // choose encoding op - RADDBG_EvalOp op = RADDBG_EvalOp_ConstU64; + RADDBGI_EvalOp op = RADDBGI_EvalOp_ConstU64; if (v < 0x100){ - op = RADDBG_EvalOp_ConstU8; + op = RADDBGI_EvalOp_ConstU8; } else if (v < 0x10000){ - op = RADDBG_EvalOp_ConstU16; + op = RADDBGI_EvalOp_ConstU16; } else if (v < 0x100000000){ - op = RADDBG_EvalOp_ConstU32; + op = RADDBGI_EvalOp_ConstU32; } // make the tree node @@ -541,8 +541,8 @@ eval_irtree_const_u(Arena *arena, U64 v){ } internal EVAL_IRTree* -eval_irtree_unary_op(Arena *arena, RADDBG_EvalOp op, - RADDBG_EvalTypeGroup group, EVAL_IRTree *c){ +eval_irtree_unary_op(Arena *arena, RADDBGI_EvalOp op, + RADDBGI_EvalTypeGroup group, EVAL_IRTree *c){ EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); result->op = op; result->p = group; @@ -551,7 +551,7 @@ eval_irtree_unary_op(Arena *arena, RADDBG_EvalOp op, } internal EVAL_IRTree* -eval_irtree_binary_op(Arena *arena, RADDBG_EvalOp op, RADDBG_EvalTypeGroup group, +eval_irtree_binary_op(Arena *arena, RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group, EVAL_IRTree *l, EVAL_IRTree *r){ EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); result->op = op; @@ -562,15 +562,15 @@ eval_irtree_binary_op(Arena *arena, RADDBG_EvalOp op, RADDBG_EvalTypeGroup group } internal EVAL_IRTree* -eval_irtree_binary_op_u(Arena *arena, RADDBG_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r){ - EVAL_IRTree *result = eval_irtree_binary_op(arena, op, RADDBG_EvalTypeGroup_U, l, r); +eval_irtree_binary_op_u(Arena *arena, RADDBGI_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r){ + EVAL_IRTree *result = eval_irtree_binary_op(arena, op, RADDBGI_EvalTypeGroup_U, l, r); return(result); } internal EVAL_IRTree* eval_irtree_conditional(Arena *arena, EVAL_IRTree *c, EVAL_IRTree *l, EVAL_IRTree *r){ EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = RADDBG_EvalOp_Cond; + result->op = RADDBGI_EvalOp_Cond; result->children[0] = c; result->children[1] = l; result->children[2] = r; @@ -589,13 +589,13 @@ eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode){ //~ allen: EVAL IR-Tree High Level Helpers internal EVAL_IRTree* -eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ - U64 byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, type_key); +eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ + U64 byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); EVAL_IRTree *result = &eval_irtree_nil; if (0 < byte_size && byte_size <= 8){ // build the read node EVAL_IRTree *read_node = push_array(arena, EVAL_IRTree, 1); - read_node->op = RADDBG_EvalOp_MemRead; + read_node->op = RADDBGI_EvalOp_MemRead; read_node->p = byte_size; read_node->children[0] = c; @@ -605,7 +605,7 @@ eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EV TG_Kind kind = tg_kind_from_key(type_key); if (bit_size < 64 && eval_kind_is_signed(kind)){ with_trunc = push_array(arena, EVAL_IRTree, 1); - with_trunc->op = RADDBG_EvalOp_TruncSigned; + with_trunc->op = RADDBGI_EvalOp_TruncSigned; with_trunc->p = bit_size; with_trunc->children[0] = read_node; } @@ -620,23 +620,23 @@ eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EV } internal EVAL_IRTree* -eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RADDBG_EvalTypeGroup out, RADDBG_EvalTypeGroup in){ +eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RADDBGI_EvalTypeGroup out, RADDBGI_EvalTypeGroup in){ EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = RADDBG_EvalOp_Convert; + result->op = RADDBGI_EvalOp_Convert; result->p = in | (out << 8); result->children[0] = c; return(result); } internal EVAL_IRTree* -eval_irtree_trunc(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ +eval_irtree_trunc(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ EVAL_IRTree *result = c; - U64 byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, type_key); + U64 byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); if (byte_size < 64){ - RADDBG_EvalOp op = RADDBG_EvalOp_Trunc; + RADDBGI_EvalOp op = RADDBGI_EvalOp_Trunc; TG_Kind kind = tg_kind_from_key(type_key); if (eval_kind_is_signed(kind)){ - op = RADDBG_EvalOp_TruncSigned; + op = RADDBGI_EvalOp_TruncSigned; } U64 bit_size = byte_size << 3; result = push_array(arena, EVAL_IRTree, 1); @@ -648,19 +648,19 @@ eval_irtree_trunc(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_IRTre } internal EVAL_IRTree* -eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in){ +eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in){ EVAL_IRTree *result = c; TG_Kind in_kind = tg_kind_from_key(in); TG_Kind out_kind = tg_kind_from_key(out); U8 in_group = eval_type_group_from_kind(in_kind); U8 out_group = eval_type_group_from_kind(out_kind); - U32 conversion_rule = raddbg_eval_conversion_rule(in_group, out_group); - if(conversion_rule == RADDBG_EvalConversionKind_Legal) + U32 conversion_rule = raddbgi_eval_conversion_rule(in_group, out_group); + if(conversion_rule == RADDBGI_EvalConversionKind_Legal) { result = eval_irtree_convert_lo(arena, result, out_group, in_group); } - U64 in_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, in); - U64 out_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, out); + U64 in_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, in); + U64 out_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, out); if(out_byte_size < in_byte_size && eval_kind_is_integer(out_kind)) { result = eval_irtree_trunc(arena, graph, rdbg, result, out); @@ -669,7 +669,7 @@ eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_ } internal EVAL_IRTree* -eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_EvalMode from_mode, +eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key){ EVAL_IRTree *result = tree; switch (from_mode){ @@ -680,7 +680,7 @@ eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, }break; case EVAL_EvalMode_Reg: { - result = eval_irtree_unary_op(arena, RADDBG_EvalOp_RegReadDyn, RADDBG_EvalTypeGroup_U, tree); + result = eval_irtree_unary_op(arena, RADDBGI_EvalOp_RegReadDyn, RADDBGI_EvalTypeGroup_U, tree); }break; } return(result); @@ -715,7 +715,7 @@ eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap } internal TG_Key -eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout){ +eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout){ TG_Key result = zero_struct; EVAL_ExprKind kind = expr->kind; @@ -758,7 +758,7 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVA } internal EVAL_IRTreeAndType -eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout) +eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout) { ProfBeginFunction(); EVAL_IRTreeAndType result = {0}; @@ -781,8 +781,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); if (l.tree->op != 0 && r.tree->op != 0){ - TG_Key l_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, r.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, r.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -795,8 +795,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index with this type."); } else{ - direct_type = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, l_restype); - direct_type_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, direct_type); + direct_type = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, l_restype); + direct_type_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, direct_type); if (l_restype_kind == TG_Kind_Ptr){ if (direct_type_size == 0){ eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); @@ -832,7 +832,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); if (direct_type_size > 1){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - index_tree = eval_irtree_binary_op_u(arena, RADDBG_EvalOp_Mul, index_tree, const_tree); + index_tree = eval_irtree_binary_op_u(arena, RADDBGI_EvalOp_Mul, index_tree, const_tree); } // how to compute the base address @@ -842,7 +842,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb } // how to compute the final address - EVAL_IRTree *new_tree = eval_irtree_binary_op_u(arena, RADDBG_EvalOp_Add, index_tree, base_tree); + EVAL_IRTree *new_tree = eval_irtree_binary_op_u(arena, RADDBGI_EvalOp_Add, index_tree, base_tree); // fill result result.tree = new_tree; @@ -860,14 +860,14 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); if (l.tree->op != 0 && !tg_key_match(tg_key_zero(), l.type_key)){ - TG_Key l_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); // determine which type to use TG_Key check_type_key = l_restype; TG_Kind check_type_kind = l_restype_kind; if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){ - check_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, l_restype); + check_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, l_restype); check_type_kind = tg_kind_from_key(check_type_key); } @@ -921,7 +921,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb if (l_good && r_good){ Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray check_type_members = tg_data_members_from_graph_raddbg_key(scratch.arena, graph, rdbg, check_type_key); + TG_MemberArray check_type_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, graph, rdbg, check_type_key); // lookup member String8 member_name = exprr->name; @@ -957,7 +957,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb } if (r_off != 0){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, r_off); - new_tree = eval_irtree_binary_op_u(arena, RADDBG_EvalOp_Add, new_tree, const_tree); + new_tree = eval_irtree_binary_op_u(arena, RADDBGI_EvalOp_Add, new_tree, const_tree); } // fill result @@ -978,10 +978,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); if (c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, c_restype); - U64 c_restype_direct_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, c_restype_direct); + TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, c_restype); + U64 c_restype_direct_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, c_restype_direct); // analyze situation B32 can_generate = 0; @@ -1035,7 +1035,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); if(c.tree->op != 0 && !tg_key_match(c.type_key, tg_key_zero())) { - TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); // analyze situation @@ -1070,26 +1070,26 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb if(cast_type_kind != TG_Kind_Null && c.tree->op != 0) { - TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - U64 c_restype_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, c_restype); - U64 cast_type_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, cast_type_key); + U64 c_restype_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, c_restype); + U64 cast_type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, cast_type_key); // analyze situation U8 in_group = eval_type_group_from_kind(c_restype_kind); U8 out_group = eval_type_group_from_kind(cast_type_kind); - RADDBG_EvalConversionKind conversion_rule = raddbg_eval_conversion_rule(in_group, out_group); + RADDBGI_EvalConversionKind conversion_rule = raddbgi_eval_conversion_rule(in_group, out_group); // generate tree switch(conversion_rule) { - case RADDBG_EvalConversionKind_Noop: - case RADDBG_EvalConversionKind_Legal: + case RADDBGI_EvalConversionKind_Noop: + case RADDBGI_EvalConversionKind_Legal: { EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); EVAL_IRTree *new_tree = in_tree; - if (conversion_rule == RADDBG_EvalConversionKind_Legal){ + if (conversion_rule == RADDBGI_EvalConversionKind_Legal){ new_tree = eval_irtree_convert_lo(arena, in_tree, out_group, in_group); } if (cast_type_byte_size < c_restype_byte_size && eval_kind_is_integer(cast_type_kind)){ @@ -1104,8 +1104,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb default: { String8 text = str8_lit("(internal) unknown conversion rule"); - if (conversion_rule < RADDBG_EvalConversionKind_COUNT){ - text.str = raddbg_eval_conversion_message(conversion_rule, &text.size); + if (conversion_rule < RADDBGI_EvalConversionKind_COUNT){ + text.str = raddbgi_eval_conversion_message(conversion_rule, &text.size); } eval_error(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, text); }break; @@ -1141,7 +1141,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb TG_Kind type_kind = tg_kind_from_key(type_key); if (type_kind != TG_Kind_Null){ can_generate = 1; - size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, type_key); + size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); } // generate ir tree @@ -1162,15 +1162,15 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); if (c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); TG_Key p_type = eval_type_promote(graph, rdbg, c_restype); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); // analyze situation B32 can_generate = 0; - RADDBG_EvalOp op = eval_opcode_from_expr_kind(kind); + RADDBGI_EvalOp op = eval_opcode_from_expr_kind(kind); U8 c_group = eval_type_group_from_kind(c_restype_kind); - if (!raddbg_eval_opcode_type_compatible(op, c_group)){ + if (!raddbgi_eval_opcode_type_compatible(op, c_group)){ eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Cannot use this operator on this type."); } else{ @@ -1218,8 +1218,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); if (l.tree->op != 0 && r.tree->op != 0){ - TG_Key l_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, r.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, r.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -1235,7 +1235,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb r_restype_kind = tg_kind_from_key(r_restype); } - RADDBG_EvalOp op = eval_opcode_from_expr_kind(kind); + RADDBGI_EvalOp op = eval_opcode_from_expr_kind(kind); //- pointer decay B32 l_is_pointer = (l_restype_kind == TG_Kind_Ptr); @@ -1267,10 +1267,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb arith_path = EVAL_ArithPath_PtrAdd; } if (l_is_pointer_like && r_is_pointer_like){ - TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, l_restype); - TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, r_restype); - U64 l_restype_direct_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, l_restype_direct); - U64 r_restype_direct_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, r_restype_direct); + TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, l_restype); + TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, r_restype); + U64 l_restype_direct_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, l_restype_direct); + U64 r_restype_direct_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, r_restype_direct); if (l_restype_direct_byte_size == r_restype_direct_byte_size){ arith_path = EVAL_ArithPath_PtrSub; } @@ -1299,7 +1299,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb U8 cv_group = eval_type_group_from_kind(cv_type_kind); B32 can_generate = 0; - if (raddbg_eval_opcode_type_compatible(op, cv_group)){ + if (raddbgi_eval_opcode_type_compatible(op, cv_group)){ can_generate = 1; } else{ @@ -1339,8 +1339,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb ptr_is_decay = r_is_decay; } - TG_Key direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, ptr->type_key); - U64 direct_type_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, direct); + TG_Key direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, ptr->type_key); + U64 direct_type_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, direct); // generate ir tree EVAL_IRTree *ptr_tree = ptr->tree; @@ -1351,7 +1351,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, integer->mode, integer->tree, integer->type_key); if (direct_type_size > 1){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - integer_tree = eval_irtree_binary_op_u(arena, RADDBG_EvalOp_Mul, integer_tree, const_tree); + integer_tree = eval_irtree_binary_op_u(arena, RADDBGI_EvalOp_Mul, integer_tree, const_tree); } TG_Key ptr_type = ptr->type_key; @@ -1359,7 +1359,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb ptr_type = tg_cons_type_make(graph, TG_Kind_Ptr, direct, 0); } - EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, RADDBG_EvalTypeGroup_U, ptr_tree, integer_tree); + EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, RADDBGI_EvalTypeGroup_U, ptr_tree, integer_tree); result.tree = new_tree; result.type_key = ptr_type; @@ -1368,8 +1368,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb case EVAL_ArithPath_PtrSub: { - TG_Key direct = tg_unwrapped_direct_from_graph_raddbg_key(graph, rdbg, l_restype); - U64 direct_type_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, direct); + TG_Key direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, l_restype); + U64 direct_type_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, direct); // generate ir tree EVAL_IRTree *l_tree = l.tree; @@ -1382,12 +1382,12 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); } - EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RADDBG_EvalTypeGroup_U, l_tree, r_tree); + EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RADDBGI_EvalTypeGroup_U, l_tree, r_tree); EVAL_IRTree *new_tree = op_tree; if (direct_type_size > 1){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - new_tree = eval_irtree_binary_op(arena, RADDBG_EvalOp_Div, RADDBG_EvalTypeGroup_U, new_tree, const_tree); + new_tree = eval_irtree_binary_op(arena, RADDBGI_EvalOp_Div, RADDBGI_EvalTypeGroup_U, new_tree, const_tree); } result.tree = new_tree; @@ -1410,9 +1410,9 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb if (l.tree->op != 0 && r.tree->op != 0 && c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, c.type_key); - TG_Key l_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, r.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, r.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -1568,8 +1568,8 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ ProfBeginFunction(); U32 op = tree->op; switch (op){ - case RADDBG_EvalOp_Stop: - case RADDBG_EvalOp_Skip: + case RADDBGI_EvalOp_Stop: + case RADDBGI_EvalOp_Skip: { // TODO: error - invalid ir-tree op }break; @@ -1579,7 +1579,7 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ eval_oplist_push_bytecode(arena, out, tree->bytecode); }break; - case RADDBG_EvalOp_Cond: + case RADDBGI_EvalOp_Cond: { // split out each of the children EVAL_OpList prt_cond = {0}; @@ -1598,11 +1598,11 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ // 4. // modify prt_right in place to create step 2 - eval_oplist_push_op(arena, &prt_right, RADDBG_EvalOp_Skip, prt_left.encoded_size); + eval_oplist_push_op(arena, &prt_right, RADDBGI_EvalOp_Skip, prt_left.encoded_size); // merge 1 into out eval_oplist_concat_in_place(out, &prt_cond); - eval_oplist_push_op(arena, out, RADDBG_EvalOp_Cond, prt_right.encoded_size); + eval_oplist_push_op(arena, out, RADDBGI_EvalOp_Cond, prt_right.encoded_size); // merge 2 into out eval_oplist_concat_in_place(out, &prt_right); @@ -1613,20 +1613,20 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ default: { - if (op >= RADDBG_EvalOp_COUNT){ + if (op >= RADDBGI_EvalOp_COUNT){ // TODO: error - invalid ir-tree op } else{ // handle all children - U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op]; - U64 child_count = RADDBG_POPN_FROM_CTRLBITS(ctrlbits); + U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; + U64 child_count = RADDBGI_POPN_FROM_CTRLBITS(ctrlbits); EVAL_IRTree**child = tree->children; for (U64 i = 0; i < child_count; i += 1, child += 1){ eval_oplist_from_irtree(arena, *child, out); } // emit op to compute this node - eval_oplist_push_op(arena, out, (RADDBG_EvalOp)tree->op, tree->p); + eval_oplist_push_op(arena, out, (RADDBGI_EvalOp)tree->op, tree->p); } }break; } diff --git a/src/eval/eval_compiler.h b/src/eval/eval_compiler.h index ab2ec297..57066ce9 100644 --- a/src/eval/eval_compiler.h +++ b/src/eval/eval_compiler.h @@ -9,7 +9,7 @@ internal String8 eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list); -internal void eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RADDBG_EvalOp op, U64 p); +internal void eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RADDBGI_EvalOp op, U64 p); internal void eval_oplist_push_uconst(Arena *arena, EVAL_OpList *list, U64 x); internal void eval_oplist_push_sconst(Arena *arena, EVAL_OpList *list, S64 x); @@ -20,8 +20,8 @@ internal void eval_oplist_concat_in_place(EVAL_OpList *left_dst, EVAL_OpList *ri //////////////////////////////// //~ allen: EVAL Expression Info Functions -internal RADDBG_EvalOp eval_opcode_from_expr_kind(EVAL_ExprKind kind); -internal B32 eval_expr_kind_is_comparison(EVAL_ExprKind kind); +internal RADDBGI_EvalOp eval_opcode_from_expr_kind(EVAL_ExprKind kind); +internal B32 eval_expr_kind_is_comparison(EVAL_ExprKind kind); //////////////////////////////// //~ allen: EVAL Expression Constructors @@ -40,13 +40,13 @@ internal EVAL_Expr* eval_expr_leaf_type(Arena *arena, void *location, TG_Key typ //////////////////////////////// //~ allen: EVAL Type Information Transformers -internal RADDBG_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind); +internal RADDBGI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind); -internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal TG_Key eval_type_promote(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal TG_Key eval_type_coerce(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r); +internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_Key eval_type_promote(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_Key eval_type_coerce(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r); -internal B32 eval_type_match(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key l, TG_Key r); +internal B32 eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r); internal B32 eval_kind_is_integer(TG_Kind kind); internal B32 eval_kind_is_signed(TG_Kind kind); @@ -56,27 +56,27 @@ internal B32 eval_kind_is_basic_or_enum(TG_Kind kind); //~ allen: EVAL IR-Tree Constructors internal EVAL_IRTree* eval_irtree_const_u(Arena *arena, U64 v); -internal EVAL_IRTree* eval_irtree_unary_op(Arena *arena, RADDBG_EvalOp op, RADDBG_EvalTypeGroup group, EVAL_IRTree *c); -internal EVAL_IRTree* eval_irtree_binary_op(Arena *arena, RADDBG_EvalOp op, RADDBG_EvalTypeGroup group, EVAL_IRTree *l, EVAL_IRTree *r); -internal EVAL_IRTree* eval_irtree_binary_op_u(Arena *arena, RADDBG_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r); +internal EVAL_IRTree* eval_irtree_unary_op(Arena *arena, RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group, EVAL_IRTree *c); +internal EVAL_IRTree* eval_irtree_binary_op(Arena *arena, RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group, EVAL_IRTree *l, EVAL_IRTree *r); +internal EVAL_IRTree* eval_irtree_binary_op_u(Arena *arena, RADDBGI_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r); internal EVAL_IRTree* eval_irtree_conditional(Arena *arena, EVAL_IRTree *c, EVAL_IRTree *l, EVAL_IRTree *r); internal EVAL_IRTree* eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode); //////////////////////////////// //~ allen: EVAL IR-Tree High Level Helpers -internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); -internal EVAL_IRTree* eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RADDBG_EvalTypeGroup out, RADDBG_EvalTypeGroup in); -internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); -internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in); -internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RADDBGI_EvalTypeGroup out, RADDBGI_EvalTypeGroup in); +internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in); +internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key); //////////////////////////////// //~ allen: EVAL Compiler Phases internal void eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap *map, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout); +internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout); +internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout); internal void eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out); #endif //EVAL_COMPILER_H diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index b2031631..26d54c4a 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -41,7 +41,7 @@ struct EVAL_ErrorList enum { - EVAL_IRExtKind_Bytecode = RADDBG_EvalOp_COUNT, + EVAL_IRExtKind_Bytecode = RADDBGI_EvalOp_COUNT, EVAL_IRExtKind_COUNT }; @@ -49,7 +49,7 @@ typedef struct EVAL_Op EVAL_Op; struct EVAL_Op { EVAL_Op *next; - RADDBG_EvalOp opcode; + RADDBGI_EvalOp opcode; union { U64 p; @@ -115,7 +115,7 @@ struct EVAL_Expr typedef struct EVAL_IRTree EVAL_IRTree; struct EVAL_IRTree{ - RADDBG_EvalOp op; + RADDBGI_EvalOp op; EVAL_IRTree *children[3]; union{ U64 p; diff --git a/src/eval/eval_machine.c b/src/eval/eval_machine.c index 9e1dae77..1649b54d 100644 --- a/src/eval/eval_machine.c +++ b/src/eval/eval_machine.c @@ -22,18 +22,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) for (;ptr < opl;){ // consume opcode - RADDBG_EvalOp op = (RADDBG_EvalOp)*ptr; - if (op >= RADDBG_EvalOp_COUNT){ + RADDBGI_EvalOp op = (RADDBGI_EvalOp)*ptr; + if (op >= RADDBGI_EvalOp_COUNT){ result.code = EVAL_ResultCode_BadOp; goto done; } - U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op]; + U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; ptr += 1; // decode U64 imm = 0; { - U32 decode_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits); + U32 decode_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); U8 *next_ptr = ptr + decode_size; if (next_ptr > opl){ result.code = EVAL_ResultCode_BadOp; @@ -54,7 +54,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) // pop EVAL_Slot *svals = 0; { - U32 pop_count = RADDBG_POPN_FROM_CTRLBITS(ctrlbits); + U32 pop_count = RADDBGI_POPN_FROM_CTRLBITS(ctrlbits); if (pop_count > stack_count){ result.code = EVAL_ResultCode_BadOp; goto done; @@ -68,29 +68,29 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) // interpret EVAL_Slot nval = {0}; switch (op){ - case RADDBG_EvalOp_Stop: + case RADDBGI_EvalOp_Stop: { goto done; }break; - case RADDBG_EvalOp_Noop: + case RADDBGI_EvalOp_Noop: { // do nothing }break; - case RADDBG_EvalOp_Cond: + case RADDBGI_EvalOp_Cond: { if (svals[0].u64){ ptr += imm; } }break; - case RADDBG_EvalOp_Skip: + case RADDBGI_EvalOp_Skip: { ptr += imm; }break; - case RADDBG_EvalOp_MemRead: + case RADDBGI_EvalOp_MemRead: { U64 addr = svals[0].u64; U64 size = imm; @@ -105,12 +105,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_RegRead: + case RADDBGI_EvalOp_RegRead: { - U8 raddbg_reg_code = (imm&0x0000FF)>>0; - U8 byte_size = (imm&0x00FF00)>>8; - U8 byte_off = (imm&0xFF0000)>>16; - REGS_RegCode base_reg_code = regs_reg_code_from_arch_raddbg_code(machine->arch, raddbg_reg_code); + U8 raddbgi_reg_code = (imm&0x0000FF)>>0; + U8 byte_size = (imm&0x00FF00)>>8; + U8 byte_off = (imm&0xFF0000)>>16; + REGS_RegCode base_reg_code = regs_reg_code_from_arch_raddbgi_code(machine->arch, raddbgi_reg_code); REGS_Rng rng = regs_reg_code_rng_table_from_architecture(machine->arch)[base_reg_code]; U64 off = (U64)rng.byte_off + byte_off; U64 size = (U64)byte_size; @@ -123,7 +123,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_RegReadDyn: + case RADDBGI_EvalOp_RegReadDyn: { U64 off = svals[0].u64; U64 size = bit_size_from_arch(machine->arch)/8; @@ -136,7 +136,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_FrameOff: + case RADDBGI_EvalOp_FrameOff: { if (machine->frame_base != 0){ nval.u64 = *machine->frame_base + imm; @@ -147,7 +147,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_ModuleOff: + case RADDBGI_EvalOp_ModuleOff: { if (machine->module_base != 0){ nval.u64 = *machine->module_base + imm; @@ -158,7 +158,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_TLSOff: + case RADDBGI_EvalOp_TLSOff: { if (machine->tls_base != 0){ nval.u64 = *machine->tls_base + imm; @@ -169,23 +169,23 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_ConstU8: - case RADDBG_EvalOp_ConstU16: - case RADDBG_EvalOp_ConstU32: - case RADDBG_EvalOp_ConstU64: + case RADDBGI_EvalOp_ConstU8: + case RADDBGI_EvalOp_ConstU16: + case RADDBGI_EvalOp_ConstU32: + case RADDBGI_EvalOp_ConstU64: { nval.u64 = imm; }break; - case RADDBG_EvalOp_Abs: + case RADDBGI_EvalOp_Abs: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.f32 = svals[0].f32; if (svals[0].f32 < 0){ nval.f32 = -svals[0].f32; } } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.f64 = svals[0].f64; if (svals[0].f64 < 0){ nval.f64 = -svals[0].f64; @@ -199,12 +199,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Neg: + case RADDBGI_EvalOp_Neg: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.f32 = -svals[0].f32; } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.f64 = -svals[0].f64; } else{ @@ -212,12 +212,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Add: + case RADDBGI_EvalOp_Add: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.f32 = svals[0].f32 + svals[1].f32; } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.f64 = svals[0].f64 + svals[1].f64; } else{ @@ -225,12 +225,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Sub: + case RADDBGI_EvalOp_Sub: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.f32 = svals[0].f32 - svals[1].f32; } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.f64 = svals[0].f64 - svals[1].f64; } else{ @@ -238,12 +238,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Mul: + case RADDBGI_EvalOp_Mul: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.f32 = svals[0].f32*svals[1].f32; } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.f64 = svals[0].f64*svals[1].f64; } else{ @@ -251,9 +251,9 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Div: + case RADDBGI_EvalOp_Div: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ if (svals[1].f32 != 0.f){ nval.f32 = svals[0].f32/svals[1].f32; } @@ -263,7 +263,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) goto done; } } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ if (svals[1].f64 != 0.){ nval.f64 = svals[0].f64/svals[1].f64; } @@ -273,8 +273,8 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) goto done; } } - else if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + else if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ if (svals[1].u64 != 0){ nval.u64 = svals[0].u64/svals[1].u64; } @@ -290,10 +290,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Mod: + case RADDBGI_EvalOp_Mod: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ if (svals[1].u64 != 0){ nval.u64 = svals[0].u64%svals[1].u64; } @@ -304,10 +304,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_LShift: + case RADDBGI_EvalOp_LShift: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = svals[0].u64 << svals[1].u64; } else{ @@ -316,12 +316,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_RShift: + case RADDBGI_EvalOp_RShift: { - if (imm == RADDBG_EvalTypeGroup_U){ + if (imm == RADDBGI_EvalTypeGroup_U){ nval.u64 = svals[0].u64 >> svals[1].u64; } - else if (imm == RADDBG_EvalTypeGroup_S){ + else if (imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = svals[0].s64 >> svals[1].u64; } else{ @@ -330,10 +330,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_BitAnd: + case RADDBGI_EvalOp_BitAnd: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = svals[0].u64&svals[1].u64; } else{ @@ -342,10 +342,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_BitOr: + case RADDBGI_EvalOp_BitOr: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = svals[0].u64|svals[1].u64; } else{ @@ -354,10 +354,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_BitXor: + case RADDBGI_EvalOp_BitXor: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = svals[0].u64^svals[1].u64; } else{ @@ -366,10 +366,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_BitNot: + case RADDBGI_EvalOp_BitNot: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = ~svals[0].u64; } else{ @@ -378,10 +378,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_LogAnd: + case RADDBGI_EvalOp_LogAnd: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = (svals[0].u64 && svals[1].u64); } else{ @@ -390,10 +390,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_LogOr: + case RADDBGI_EvalOp_LogOr: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = (svals[0].u64 || svals[1].u64); } else{ @@ -402,10 +402,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_LogNot: + case RADDBGI_EvalOp_LogNot: { - if (imm == RADDBG_EvalTypeGroup_U || - imm == RADDBG_EvalTypeGroup_S){ + if (imm == RADDBGI_EvalTypeGroup_U || + imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = (!svals[0].u64); } else{ @@ -414,28 +414,28 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_EqEq: + case RADDBGI_EvalOp_EqEq: { nval.u64 = (svals[0].u64 == svals[1].u64); }break; - case RADDBG_EvalOp_NtEq: + case RADDBGI_EvalOp_NtEq: { nval.u64 = (svals[0].u64 != svals[1].u64); }break; - case RADDBG_EvalOp_LsEq: + case RADDBGI_EvalOp_LsEq: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.u64 = (svals[0].f32 <= svals[1].f32); } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.u64 = (svals[0].f64 <= svals[1].f64); } - else if (imm == RADDBG_EvalTypeGroup_U){ + else if (imm == RADDBGI_EvalTypeGroup_U){ nval.u64 = (svals[0].u64 <= svals[1].u64); } - else if (imm == RADDBG_EvalTypeGroup_S){ + else if (imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = (svals[0].s64 <= svals[1].s64); } else{ @@ -444,18 +444,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_GrEq: + case RADDBGI_EvalOp_GrEq: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.u64 = (svals[0].f32 >= svals[1].f32); } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.u64 = (svals[0].f64 >= svals[1].f64); } - else if (imm == RADDBG_EvalTypeGroup_U){ + else if (imm == RADDBGI_EvalTypeGroup_U){ nval.u64 = (svals[0].u64 >= svals[1].u64); } - else if (imm == RADDBG_EvalTypeGroup_S){ + else if (imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = (svals[0].s64 >= svals[1].s64); } else{ @@ -464,18 +464,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Less: + case RADDBGI_EvalOp_Less: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.u64 = (svals[0].f32 < svals[1].f32); } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.u64 = (svals[0].f64 < svals[1].f64); } - else if (imm == RADDBG_EvalTypeGroup_U){ + else if (imm == RADDBGI_EvalTypeGroup_U){ nval.u64 = (svals[0].u64 < svals[1].u64); } - else if (imm == RADDBG_EvalTypeGroup_S){ + else if (imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = (svals[0].s64 < svals[1].s64); } else{ @@ -484,18 +484,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Grtr: + case RADDBGI_EvalOp_Grtr: { - if (imm == RADDBG_EvalTypeGroup_F32){ + if (imm == RADDBGI_EvalTypeGroup_F32){ nval.u64 = (svals[0].f32 > svals[1].f32); } - else if (imm == RADDBG_EvalTypeGroup_F64){ + else if (imm == RADDBGI_EvalTypeGroup_F64){ nval.u64 = (svals[0].f64 > svals[1].f64); } - else if (imm == RADDBG_EvalTypeGroup_U){ + else if (imm == RADDBGI_EvalTypeGroup_U){ nval.u64 = (svals[0].u64 > svals[1].u64); } - else if (imm == RADDBG_EvalTypeGroup_S){ + else if (imm == RADDBGI_EvalTypeGroup_S){ nval.u64 = (svals[0].s64 > svals[1].s64); } else{ @@ -504,7 +504,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Trunc: + case RADDBGI_EvalOp_Trunc: { if (0 < imm){ U64 mask = 0; @@ -515,7 +515,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_TruncSigned: + case RADDBGI_EvalOp_TruncSigned: { if (0 < imm){ U64 mask = 0; @@ -530,52 +530,52 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Convert: + case RADDBGI_EvalOp_Convert: { U32 in = imm&0xFF; U32 out = (imm >> 8)&0xFF; if (in != out){ - switch (in + out*RADDBG_EvalTypeGroup_COUNT){ - case RADDBG_EvalTypeGroup_F32 + RADDBG_EvalTypeGroup_U*RADDBG_EvalTypeGroup_COUNT: + switch (in + out*RADDBGI_EvalTypeGroup_COUNT){ + case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_U*RADDBGI_EvalTypeGroup_COUNT: { nval.u64 = (U64)svals[0].f32; }break; - case RADDBG_EvalTypeGroup_F64 + RADDBG_EvalTypeGroup_U*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_U*RADDBGI_EvalTypeGroup_COUNT: { nval.u64 = (U64)svals[0].f64; }break; - case RADDBG_EvalTypeGroup_F32 + RADDBG_EvalTypeGroup_S*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_S*RADDBGI_EvalTypeGroup_COUNT: { nval.s64 = (S64)svals[0].f32; }break; - case RADDBG_EvalTypeGroup_F64 + RADDBG_EvalTypeGroup_S*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_S*RADDBGI_EvalTypeGroup_COUNT: { nval.s64 = (S64)svals[0].f64; }break; - case RADDBG_EvalTypeGroup_U + RADDBG_EvalTypeGroup_F32*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_U + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].u64; }break; - case RADDBG_EvalTypeGroup_S + RADDBG_EvalTypeGroup_F32*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_S + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].s64; }break; - case RADDBG_EvalTypeGroup_F64 + RADDBG_EvalTypeGroup_F32*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].f64; }break; - case RADDBG_EvalTypeGroup_U + RADDBG_EvalTypeGroup_F64*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_U + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].u64; }break; - case RADDBG_EvalTypeGroup_S + RADDBG_EvalTypeGroup_F64*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_S + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].s64; }break; - case RADDBG_EvalTypeGroup_F32 + RADDBG_EvalTypeGroup_F64*RADDBG_EvalTypeGroup_COUNT: + case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].f32; }break; @@ -583,7 +583,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Pick: + case RADDBGI_EvalOp_Pick: { if (stack_count > imm){ nval = stack[stack_count - imm - 1]; @@ -594,12 +594,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBG_EvalOp_Pop: + case RADDBGI_EvalOp_Pop: { // do nothing - the pop is handled by the control bits }break; - case RADDBG_EvalOp_Insert: + case RADDBGI_EvalOp_Insert: { if (stack_count > imm){ if (imm > 0){ @@ -619,7 +619,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) // push { - U64 push_count = RADDBG_PUSHN_FROM_CTRLBITS(ctrlbits); + U64 push_count = RADDBGI_PUSHN_FROM_CTRLBITS(ctrlbits); if (push_count == 1){ if (stack_count < stack_cap){ stack[stack_count] = nval; diff --git a/src/eval/eval_parser.c b/src/eval/eval_parser.c index 1d134bb7..dbbd3a6b 100644 --- a/src/eval/eval_parser.c +++ b/src/eval/eval_parser.c @@ -57,7 +57,7 @@ global read_only S64 eval_g_max_precedence = 15; //~ rjf: Map Building Fast Paths internal EVAL_String2NumMap * -eval_push_locals_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 voff) +eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff) { Temp scratch = scratch_begin(&arena, 1); @@ -66,17 +66,17 @@ eval_push_locals_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 vof struct Task { Task *next; - RADDBG_Scope *scope; + RADDBGI_Scope *scope; }; Task *first_task = 0; Task *last_task = 0; //- rjf: voff -> tightest scope - RADDBG_Scope *tightest_scope = 0; + RADDBGI_Scope *tightest_scope = 0; if(rdbg->scope_vmap != 0 && rdbg->scopes != 0) { - U64 scope_idx = raddbg_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); - RADDBG_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = raddbgi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); + RADDBGI_Scope *scope = &rdbg->scopes[scope_idx]; Task *task = push_array(scratch.arena, Task, 1); task->scope = scope; SLLQueuePush(first_task, last_task, task); @@ -86,8 +86,8 @@ eval_push_locals_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 vof //- rjf: voff-1 -> scope if(voff > 0 && rdbg->scope_vmap != 0 && rdbg->scopes != 0) { - U64 scope_idx = raddbg_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff-1); - RADDBG_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = raddbgi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff-1); + RADDBGI_Scope *scope = &rdbg->scopes[scope_idx]; if(scope != tightest_scope) { Task *task = push_array(scratch.arena, Task, 1); @@ -99,7 +99,7 @@ eval_push_locals_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 vof //- rjf: tightest scope -> walk up the tree & build tasks for each parent scope if(tightest_scope != 0) { - for(RADDBG_Scope *scope = &rdbg->scopes[tightest_scope->parent_scope_idx]; + for(RADDBGI_Scope *scope = &rdbg->scopes[tightest_scope->parent_scope_idx]; scope != 0 && scope != &rdbg->scopes[0]; scope = &rdbg->scopes[scope->parent_scope_idx]) { @@ -116,15 +116,15 @@ eval_push_locals_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 vof //- rjf: accumulate locals for all tasks for(Task *task = first_task; task != 0; task = task->next) { - RADDBG_Scope *scope = task->scope; + RADDBGI_Scope *scope = task->scope; if(scope != 0) { U32 local_opl_idx = scope->local_first + scope->local_count; for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1) { - RADDBG_Local *local_var = &rdbg->locals[local_idx]; + RADDBGI_Local *local_var = &rdbg->locals[local_idx]; U64 local_name_size = 0; - U8 *local_name_str = raddbg_string_from_idx(rdbg, local_var->name_string_idx, &local_name_size); + U8 *local_name_str = raddbgi_string_from_idx(rdbg, local_var->name_string_idx, &local_name_size); String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size)); eval_string2num_map_insert(arena, map, name, (U64)local_idx+1); } @@ -136,18 +136,18 @@ eval_push_locals_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 vof } internal EVAL_String2NumMap * -eval_push_member_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 voff) +eval_push_member_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff) { //- rjf: voff -> tightest scope - RADDBG_Scope *tightest_scope = 0; + RADDBGI_Scope *tightest_scope = 0; if(rdbg->scope_vmap != 0 && rdbg->scopes != 0) { - U64 scope_idx = raddbg_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); + U64 scope_idx = raddbgi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); tightest_scope = &rdbg->scopes[scope_idx]; } //- rjf: tightest scope -> procedure - RADDBG_Procedure *procedure = 0; + RADDBGI_Procedure *procedure = 0; if(tightest_scope != 0 && rdbg->procedures != 0) { U32 proc_idx = tightest_scope->proc_idx; @@ -158,8 +158,8 @@ eval_push_member_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 vof } //- rjf: procedure -> udt - RADDBG_UDT *udt = 0; - if(procedure != 0 && rdbg->udts != 0 && procedure->link_flags & RADDBG_LinkFlag_TypeScoped) + RADDBGI_UDT *udt = 0; + if(procedure != 0 && rdbg->udts != 0 && procedure->link_flags & RADDBGI_LinkFlag_TypeScoped) { U32 udt_idx = procedure->container_idx; if(0 < udt_idx && udt_idx < rdbg->udts_count) @@ -173,7 +173,7 @@ eval_push_member_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 vof *map = eval_string2num_map_make(arena, 64); //- rjf: udt -> fill member map - if(udt != 0 && !(udt->flags & RADDBG_UserDefinedTypeFlag_EnumMembers) && rdbg->members != 0) + if(udt != 0 && !(udt->flags & RADDBGI_UserDefinedTypeFlag_EnumMembers) && rdbg->members != 0) { U64 data_member_num = 1; for(U32 member_idx = udt->member_first; @@ -184,11 +184,11 @@ eval_push_member_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 vof { break; } - RADDBG_Member *m = &rdbg->members[member_idx]; - if(m->kind == RADDBG_MemberKind_DataField) + RADDBGI_Member *m = &rdbg->members[member_idx]; + if(m->kind == RADDBGI_MemberKind_DataField) { String8 name = {0}; - name.str = raddbg_string_from_idx(rdbg, m->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(rdbg, m->name_string_idx, &name.size); eval_string2num_map_insert(arena, map, name, data_member_num); data_member_num += 1; } @@ -464,25 +464,25 @@ eval_token_array_make_first_opl(EVAL_Token *first, EVAL_Token *opl) //~ rjf: Parser Functions internal TG_Key -eval_leaf_type_from_name(RADDBG_Parsed *rdbg, String8 name) +eval_leaf_type_from_name(RADDBGI_Parsed *rdbg, String8 name) { TG_Key key = zero_struct; B32 found = 0; if(rdbg->type_nodes != 0) { - RADDBG_NameMap *name_map = raddbg_name_map_from_kind(rdbg, RADDBG_NameMapKind_Types); - RADDBG_ParsedNameMap parsed_name_map = {0}; - raddbg_name_map_parse(rdbg, name_map, &parsed_name_map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); + RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_Types); + RADDBGI_ParsedNameMap parsed_name_map = {0}; + raddbgi_name_map_parse(rdbg, name_map, &parsed_name_map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); if(node != 0) { U32 match_count = 0; - U32 *matches = raddbg_matches_from_map_node(rdbg, node, &match_count); + U32 *matches = raddbgi_matches_from_map_node(rdbg, node, &match_count); if(match_count != 0) { - RADDBG_TypeNode *type_node = raddbg_element_from_idx(rdbg, type_nodes, matches[0]); - found = type_node->kind != RADDBG_TypeKind_NULL; - key = tg_key_ext(tg_kind_from_raddbg_type_kind(type_node->kind), (U64)matches[0]); + RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(rdbg, type_nodes, matches[0]); + found = type_node->kind != RADDBGI_TypeKind_NULL; + key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)matches[0]); } } } @@ -787,9 +787,9 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 B32 mapped_identifier = 0; B32 identifier_type_is_possibly_dynamically_overridden = 0; B32 identifier_looks_like_type_expr = 0; - RADDBG_LocationKind loc_kind = RADDBG_LocationKind_NULL; - RADDBG_LocationRegister loc_reg = {0}; - RADDBG_LocationRegisterPlusU16 loc_reg_u16 = {0}; + RADDBGI_LocationKind loc_kind = RADDBGI_LocationKind_NULL; + RADDBGI_LocationRegister loc_reg = {0}; + RADDBGI_LocationRegisterPlusU16 loc_reg_u16 = {0}; String8 loc_bytecode = {0}; REGS_RegCode reg_code = 0; REGS_AliasCode alias_code = 0; @@ -800,12 +800,12 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 String8List namespaceified_token_strings = {0}; if(ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_vmap != 0) { - U64 scope_idx = raddbg_vmap_idx_from_voff(ctx->rdbg->scope_vmap, ctx->rdbg->scope_vmap_count, ctx->ip_voff); - RADDBG_Scope *scope = &ctx->rdbg->scopes[scope_idx]; + U64 scope_idx = raddbgi_vmap_idx_from_voff(ctx->rdbg->scope_vmap, ctx->rdbg->scope_vmap_count, ctx->ip_voff); + RADDBGI_Scope *scope = &ctx->rdbg->scopes[scope_idx]; U64 proc_idx = scope->proc_idx; - RADDBG_Procedure *procedure = &ctx->rdbg->procedures[proc_idx]; + RADDBGI_Procedure *procedure = &ctx->rdbg->procedures[proc_idx]; U64 name_size = 0; - U8 *name_ptr = raddbg_string_from_idx(ctx->rdbg, procedure->name_string_idx, &name_size); + U8 *name_ptr = raddbgi_string_from_idx(ctx->rdbg, procedure->name_string_idx, &name_size); String8 containing_procedure_name = str8(name_ptr, name_size); U64 last_past_scope_resolution_pos = 0; for(;;) @@ -843,26 +843,26 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 { mapped_identifier = 1; identifier_type_is_possibly_dynamically_overridden = 1; - RADDBG_Local *local_var = raddbg_element_from_idx(ctx->rdbg, locals, local_num-1); - RADDBG_TypeNode *type_node = raddbg_element_from_idx(ctx->rdbg, type_nodes, local_var->type_idx); - type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type_node->kind), (U64)local_var->type_idx); + RADDBGI_Local *local_var = raddbgi_element_from_idx(ctx->rdbg, locals, local_num-1); + RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(ctx->rdbg, type_nodes, local_var->type_idx); + type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)local_var->type_idx); // rjf: grab location info for(U32 loc_block_idx = local_var->location_first; loc_block_idx < local_var->location_opl; loc_block_idx += 1) { - RADDBG_LocationBlock *block = &ctx->rdbg->location_blocks[loc_block_idx]; + RADDBGI_LocationBlock *block = &ctx->rdbg->location_blocks[loc_block_idx]; if(block->scope_off_first <= ctx->ip_voff && ctx->ip_voff < block->scope_off_opl) { - loc_kind = *((RADDBG_LocationKind *)(ctx->rdbg->location_data + block->location_data_off)); + loc_kind = *((RADDBGI_LocationKind *)(ctx->rdbg->location_data + block->location_data_off)); switch(loc_kind) { default:{mapped_identifier = 0;}break; - case RADDBG_LocationKind_AddrBytecodeStream: - case RADDBG_LocationKind_ValBytecodeStream: + case RADDBGI_LocationKind_AddrBytecodeStream: + case RADDBGI_LocationKind_ValBytecodeStream: { - U8 *bytecode_base = ctx->rdbg->location_data + block->location_data_off + sizeof(RADDBG_LocationKind); + U8 *bytecode_base = ctx->rdbg->location_data + block->location_data_off + sizeof(RADDBGI_LocationKind); U64 bytecode_size = 0; for(U64 idx = 0; idx < ctx->rdbg->location_data_size; idx += 1) { @@ -871,18 +871,18 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 { break; } - U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op]; - U32 p_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits); + U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; + U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); bytecode_size += 1+p_size; } loc_bytecode = str8(bytecode_base, bytecode_size); }break; - case RADDBG_LocationKind_AddrRegisterPlusU16: - case RADDBG_LocationKind_AddrAddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: { MemoryCopy(&loc_reg_u16, (ctx->rdbg->location_data + block->location_data_off), sizeof(loc_reg_u16)); }break; - case RADDBG_LocationKind_ValRegister: + case RADDBGI_LocationKind_ValRegister: { MemoryCopy(&loc_reg, (ctx->rdbg->location_data + block->location_data_off), sizeof(loc_reg)); }break; @@ -919,21 +919,21 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try global variables if(mapped_identifier == 0) { - RADDBG_NameMap *name_map = raddbg_name_map_from_kind(ctx->rdbg, RADDBG_NameMapKind_GlobalVariables); + RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(ctx->rdbg, RADDBGI_NameMapKind_GlobalVariables); if(name_map != 0 && ctx->rdbg->global_variables != 0) { - RADDBG_ParsedNameMap parsed_name_map = {0}; - raddbg_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + RADDBGI_ParsedNameMap parsed_name_map = {0}; + raddbgi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); } if(matches_count != 0) { @@ -942,16 +942,16 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 // don't know of a magic hash table fixup path in PDBs, so // in this case, I'm going to prefer the latest-added global. U32 match_idx = matches[matches_count-1]; - RADDBG_GlobalVariable *global_var = &ctx->rdbg->global_variables[match_idx]; + RADDBGI_GlobalVariable *global_var = &ctx->rdbg->global_variables[match_idx]; EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_ModuleOff, global_var->voff); - loc_kind = RADDBG_LocationKind_AddrBytecodeStream; + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_ModuleOff, global_var->voff); + loc_kind = RADDBGI_LocationKind_AddrBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = global_var->type_idx; if(type_idx < ctx->rdbg->type_nodes_count) { - RADDBG_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; - type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type_node->kind), (U64)type_idx); + RADDBGI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; } @@ -961,35 +961,35 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try thread variables if(mapped_identifier == 0) { - RADDBG_NameMap *name_map = raddbg_name_map_from_kind(ctx->rdbg, RADDBG_NameMapKind_ThreadVariables); + RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(ctx->rdbg, RADDBGI_NameMapKind_ThreadVariables); if(name_map != 0 && ctx->rdbg->global_variables != 0) { - RADDBG_ParsedNameMap parsed_name_map = {0}; - raddbg_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + RADDBGI_ParsedNameMap parsed_name_map = {0}; + raddbgi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); } if(matches_count != 0) { U32 match_idx = matches[0]; - RADDBG_ThreadVariable *thread_var = &ctx->rdbg->thread_variables[match_idx]; + RADDBGI_ThreadVariable *thread_var = &ctx->rdbg->thread_variables[match_idx]; EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_TLSOff, thread_var->tls_off); - loc_kind = RADDBG_LocationKind_AddrBytecodeStream; + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_TLSOff, thread_var->tls_off); + loc_kind = RADDBGI_LocationKind_AddrBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = thread_var->type_idx; if(type_idx < ctx->rdbg->type_nodes_count) { - RADDBG_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; - type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type_node->kind), (U64)type_idx); + RADDBGI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; } @@ -999,37 +999,37 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try procedures if(mapped_identifier == 0) { - RADDBG_NameMap *name_map = raddbg_name_map_from_kind(ctx->rdbg, RADDBG_NameMapKind_Procedures); + RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(ctx->rdbg, RADDBGI_NameMapKind_Procedures); if(name_map != 0 && ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_voffs) { - RADDBG_ParsedNameMap parsed_name_map = {0}; - raddbg_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + RADDBGI_ParsedNameMap parsed_name_map = {0}; + raddbgi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); + RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); } if(matches_count != 0) { U32 match_idx = matches[0]; - RADDBG_Procedure *procedure = &ctx->rdbg->procedures[match_idx]; - RADDBG_Scope *scope = &ctx->rdbg->scopes[procedure->root_scope_idx]; + RADDBGI_Procedure *procedure = &ctx->rdbg->procedures[match_idx]; + RADDBGI_Scope *scope = &ctx->rdbg->scopes[procedure->root_scope_idx]; U64 voff = ctx->rdbg->scope_voffs[scope->voff_range_first]; EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_ModuleOff, voff); - loc_kind = RADDBG_LocationKind_ValBytecodeStream; + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_ModuleOff, voff); + loc_kind = RADDBGI_LocationKind_ValBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = procedure->type_idx; if(type_idx < ctx->rdbg->type_nodes_count) { - RADDBG_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; - type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type_node->kind), (U64)type_idx); + RADDBGI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; } @@ -1086,44 +1086,44 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 eval_errorf(arena, &result.errors, EVAL_ErrorKind_MissingInfo, token_string.str, "Missing location information for \"%S\".", token_string); } }break; - case RADDBG_LocationKind_AddrBytecodeStream: + case RADDBGI_LocationKind_AddrBytecodeStream: { atom = eval_expr_leaf_bytecode(arena, token_string.str, type_key, loc_bytecode, EVAL_EvalMode_Addr); }break; - case RADDBG_LocationKind_ValBytecodeStream: + case RADDBGI_LocationKind_ValBytecodeStream: { atom = eval_expr_leaf_bytecode(arena, token_string.str, type_key, loc_bytecode, EVAL_EvalMode_Value); }break; - case RADDBG_LocationKind_AddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrRegisterPlusU16: { EVAL_OpList oplist = {0}; U64 byte_size = bit_size_from_arch(ctx->arch)/8; - U64 regread_param = RADDBG_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0); - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_RegRead, regread_param); - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_ConstU16, loc_reg_u16.offset); - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_Add, 0); + U64 regread_param = RADDBGI_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0); + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_RegRead, regread_param); + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_ConstU16, loc_reg_u16.offset); + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_Add, 0); atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Addr); }break; - case RADDBG_LocationKind_AddrAddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: { EVAL_OpList oplist = {0}; U64 byte_size = bit_size_from_arch(ctx->arch)/8; - U64 regread_param = RADDBG_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0); - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_RegRead, regread_param); - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_ConstU16, loc_reg_u16.offset); - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_Add, 0); - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_MemRead, bit_size_from_arch(ctx->arch)/8); + U64 regread_param = RADDBGI_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0); + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_RegRead, regread_param); + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_ConstU16, loc_reg_u16.offset); + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_Add, 0); + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_MemRead, bit_size_from_arch(ctx->arch)/8); atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Addr); }break; - case RADDBG_LocationKind_ValRegister: + case RADDBGI_LocationKind_ValRegister: { - REGS_RegCode regs_reg_code = regs_reg_code_from_arch_raddbg_code(ctx->arch, loc_reg.register_code); + REGS_RegCode regs_reg_code = regs_reg_code_from_arch_raddbgi_code(ctx->arch, loc_reg.register_code); REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(ctx->arch)[regs_reg_code]; EVAL_OpList oplist = {0}; U64 byte_size = (U64)reg_rng.byte_size; U64 byte_pos = 0; - U64 regread_param = RADDBG_EncodeRegReadParam(loc_reg.register_code, byte_size, byte_pos); - eval_oplist_push_op(arena, &oplist, RADDBG_EvalOp_RegRead, regread_param); + U64 regread_param = RADDBGI_EncodeRegReadParam(loc_reg.register_code, byte_size, byte_pos); + eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_RegRead, regread_param); atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Value); }break; } diff --git a/src/eval/eval_parser.h b/src/eval/eval_parser.h index b711da0b..2b1c6fe8 100644 --- a/src/eval/eval_parser.h +++ b/src/eval/eval_parser.h @@ -67,7 +67,7 @@ struct EVAL_ParseCtx { Architecture arch; U64 ip_voff; - RADDBG_Parsed *rdbg; + RADDBGI_Parsed *rdbg; TG_Graph *type_graph; EVAL_String2NumMap *regs_map; EVAL_String2NumMap *reg_alias_map; @@ -85,8 +85,8 @@ global read_only EVAL_ParseResult eval_parse_result_nil = {0, &eval_expr_nil}; //////////////////////////////// //~ rjf: Debug-Info-Driven Map Building Fast Paths -internal EVAL_String2NumMap *eval_push_locals_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 voff); -internal EVAL_String2NumMap *eval_push_member_map_from_raddbg_voff(Arena *arena, RADDBG_Parsed *rdbg, U64 voff); +internal EVAL_String2NumMap *eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff); +internal EVAL_String2NumMap *eval_push_member_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff); //////////////////////////////// //~ rjf: Tokenization Functions @@ -101,7 +101,7 @@ internal EVAL_TokenArray eval_token_array_make_first_opl(EVAL_Token *first, EVAL //////////////////////////////// //~ rjf: Parser Functions -internal TG_Key eval_leaf_type_from_name(RADDBG_Parsed *rdbg, String8 name); +internal TG_Key eval_leaf_type_from_name(RADDBGI_Parsed *rdbg, String8 name); internal EVAL_ParseResult eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); internal EVAL_ParseResult eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens, S64 max_precedence); internal EVAL_ParseResult eval_parse_expr_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); diff --git a/src/raddbg_markup/raddbg_markup.h b/src/raddbg_markup/raddbg_markup.h index 66b0fa31..696143b2 100644 --- a/src/raddbg_markup/raddbg_markup.h +++ b/src/raddbg_markup/raddbg_markup.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_MARKUP_H -#define RADDBG_MARKUP_H +#ifndef RADDBGI_MARKUP_H +#define RADDBGI_MARKUP_H //////////////////////////////// //~ Usage Macros @@ -75,4 +75,4 @@ raddbg_log__impl(char *fmt, ...) #endif // defined(_WIN32) -#endif // RADDBG_MARKUP_H +#endif // RADDBGI_MARKUP_H diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/raddbgi_cons/raddbgi_cons.c index 90266a26..a6fa9e37 100644 --- a/src/raddbgi_cons/raddbgi_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -4,8 +4,8 @@ //////////////////////////////// //~ rjf: API Implementation Helper Macros -#define cons_require(root, b32, else_code, error_msg) do { if(!(b32)) {cons_error((root), (error_msg));} else { else_code; } }while(0) -#define cons_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {cons_errorf((root), (fmt), __VA_ARGS__);} else { else_code; } }while(0) +#define cons_require(root, b32, else_code, error_msg) do { if(!(b32)) {cons_error((root), (error_msg)); else_code;} }while(0) +#define cons_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {cons_errorf((root), (fmt), __VA_ARGS__); else_code;} }while(0) //////////////////////////////// //~ rjf: Basic Type Helpers @@ -24,10 +24,10 @@ cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type) //- rjf: bytecode lists static void -cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBG_EvalOp op, U64 p) +cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBGI_EvalOp op, U64 p) { - U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op]; - U32 p_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits); + U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; + U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); CONS_EvalBytecodeOp *node = push_array(arena, CONS_EvalBytecodeOp, 1); node->op = op; @@ -44,19 +44,19 @@ cons_bytecode_push_uconst(Arena *arena, CONS_EvalBytecode *bytecode, U64 x) { if(x <= 0xFF) { - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU8, x); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, x); } else if(x <= 0xFFFF) { - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU16, x); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, x); } else if(x <= 0xFFFFFFFF) { - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU32, x); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, x); } else { - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU64, x); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, x); } } @@ -65,22 +65,22 @@ cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, S64 x) { if(-0x80 <= x && x <= 0x7F) { - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU8, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 8); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, (U64)x); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 8); } else if(-0x8000 <= x && x <= 0x7FFF) { - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU16, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 16); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, (U64)x); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 16); } else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) { - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU32, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_TruncSigned, 32); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, (U64)x); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 32); } else { - cons_bytecode_push_op(arena, bytecode, RADDBG_EvalOp_ConstU64, (U64)x); + cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, (U64)x); } } @@ -387,7 +387,7 @@ cons_root_new(CONS_RootParams *params) { result->nil_type = cons__type_new(result); result->variadic_type = cons__type_new(result); - result->variadic_type->kind = RADDBG_TypeKind_Variadic; + result->variadic_type->kind = RADDBGI_TypeKind_Variadic; // references to "handled nil type" should be emitted as // references to nil - but should not generate error @@ -470,7 +470,7 @@ cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli) //- rjf: binary section building static void -cons_add_binary_section(CONS_Root *root, String8 name, RADDBG_BinarySectionFlags flags, U64 voff_first, U64 voff_opl, U64 foff_first, U64 foff_opl) +cons_add_binary_section(CONS_Root *root, String8 name, RADDBGI_BinarySectionFlags flags, U64 voff_first, U64 voff_opl, U64 foff_first, U64 foff_opl) { CONS_BinarySection *sec = push_array(root->arena, CONS_BinarySection, 1); SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); @@ -595,7 +595,7 @@ cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type) static B32 cons_type_is_unhandled_nil(CONS_Root *root, CONS_Type *type) { - B32 result = (type->kind == RADDBG_TypeKind_NULL && type != &root->handled_nil_type); + B32 result = (type->kind == RADDBGI_TypeKind_NULL && type != &root->handled_nil_type); return result; } @@ -648,9 +648,9 @@ cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *type) static CONS_TypeUDT* cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type) { - cons_requiref(root, (type->kind == RADDBG_TypeKind_Struct || - type->kind == RADDBG_TypeKind_Class || - type->kind == RADDBG_TypeKind_Union), + cons_requiref(root, (type->kind == RADDBGI_TypeKind_Struct || + type->kind == RADDBGI_TypeKind_Class || + type->kind == RADDBGI_TypeKind_Union), return 0, "Tried to use non-user-defined-type-kind to create user-defined-type."); CONS_TypeUDT *result = 0; @@ -661,9 +661,9 @@ cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type) //- rjf: basic/operator type construction helpers static CONS_Type* -cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name) +cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) { - cons_requiref(root, (RADDBG_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBG_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); + cons_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); CONS_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); @@ -685,13 +685,13 @@ cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name) // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); + U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { // calculate size - U32 byte_size = raddbg_size_from_basic_type_kind(type_kind); + U32 byte_size = raddbgi_size_from_basic_type_kind(type_kind); if(byte_size == 0xFFFFFFFF) { byte_size = root->addr_size; @@ -708,7 +708,7 @@ cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name) // save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); cons__name_map_add_pair(root, map, result->name, result->idx); } } @@ -719,7 +719,7 @@ cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name) } static CONS_Type* -cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeModifierFlags flags) +cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeModifierFlags flags) { CONS_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); @@ -742,14 +742,14 @@ cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeModifierF // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); + U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0){ // setup new node result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Modifier; + result->kind = RADDBGI_TypeKind_Modifier; result->flags = flags; result->byte_size = direct_type->byte_size; result->direct_type = direct_type; @@ -790,14 +790,14 @@ cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); + U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { // setup new node result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Bitfield; + result->kind = RADDBGI_TypeKind_Bitfield; result->byte_size = direct_type->byte_size; result->off = bit_off; result->count = bit_count; @@ -813,11 +813,11 @@ cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit } static CONS_Type* -cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeKind ptr_type_kind) +cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeKind ptr_type_kind) { - cons_requiref(root, (ptr_type_kind == RADDBG_TypeKind_Ptr || - ptr_type_kind == RADDBG_TypeKind_LRef || - ptr_type_kind == RADDBG_TypeKind_RRef), + cons_requiref(root, (ptr_type_kind == RADDBGI_TypeKind_Ptr || + ptr_type_kind == RADDBGI_TypeKind_LRef || + ptr_type_kind == RADDBGI_TypeKind_RRef), return root->nil_type, "Non-pointer type kind used to construct pointer type."); CONS_Type *result = root->nil_type; @@ -841,7 +841,7 @@ cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeKind ptr_t // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); + U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) @@ -886,14 +886,14 @@ cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count) // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); + U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { // setup new node result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Array; + result->kind = RADDBGI_TypeKind_Array; result->count = count; result->direct_type = direct_type; result->byte_size = direct_type->byte_size*count; @@ -936,7 +936,7 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); + U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) @@ -956,7 +956,7 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa // setup new node result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Function; + result->kind = RADDBGI_TypeKind_Function; result->byte_size = root->addr_size; result->count = params->count; result->direct_type = return_type; @@ -1004,7 +1004,7 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbg_hash(buf, buf_size); + U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) @@ -1028,7 +1028,7 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, // setup new node result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Method; + result->kind = RADDBGI_TypeKind_Method; result->byte_size = root->addr_size; result->count = params->count; result->direct_type = return_type; @@ -1046,11 +1046,11 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, //- rjf: udt type constructors static CONS_Type* -cons_type_udt(CONS_Root *root, RADDBG_TypeKind record_type_kind, String8 name, U64 size) +cons_type_udt(CONS_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, U64 size) { - cons_requiref(root, (record_type_kind == RADDBG_TypeKind_Struct || - record_type_kind == RADDBG_TypeKind_Class || - record_type_kind == RADDBG_TypeKind_Union), + cons_requiref(root, (record_type_kind == RADDBGI_TypeKind_Struct || + record_type_kind == RADDBGI_TypeKind_Class || + record_type_kind == RADDBGI_TypeKind_Union), return root->nil_type, "Non-user-defined-type-kind used to create user-defined type."); @@ -1062,7 +1062,7 @@ cons_type_udt(CONS_Root *root, RADDBG_TypeKind record_type_kind, String8 name, U // rjf: save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); cons__name_map_add_pair(root, map, result->name, result->idx); } @@ -1074,14 +1074,14 @@ cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name) { // rjf: make type CONS_Type *result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Enum; + result->kind = RADDBGI_TypeKind_Enum; result->byte_size = direct_type->byte_size; result->name = push_str8_copy(root->arena, name); result->direct_type = direct_type; // rjf: save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); cons__name_map_add_pair(root, map, result->name, result->idx); } @@ -1093,14 +1093,14 @@ cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name) { // rjf: make type CONS_Type *result = cons__type_new(root); - result->kind = RADDBG_TypeKind_Alias; + result->kind = RADDBGI_TypeKind_Alias; result->byte_size = direct_type->byte_size; result->name = push_str8_copy(root->arena, name); result->direct_type = direct_type; // rjf: save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); cons__name_map_add_pair(root, map, result->name, result->idx); } @@ -1108,12 +1108,12 @@ cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name) } static CONS_Type* -cons_type_incomplete(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name) +cons_type_incomplete(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) { - cons_requiref(root, (type_kind == RADDBG_TypeKind_IncompleteStruct || - type_kind == RADDBG_TypeKind_IncompleteClass || - type_kind == RADDBG_TypeKind_IncompleteUnion || - type_kind == RADDBG_TypeKind_IncompleteEnum), + cons_requiref(root, (type_kind == RADDBGI_TypeKind_IncompleteStruct || + type_kind == RADDBGI_TypeKind_IncompleteClass || + type_kind == RADDBGI_TypeKind_IncompleteUnion || + type_kind == RADDBGI_TypeKind_IncompleteEnum), return root->nil_type, "Non-incomplete-type-kind used to create incomplete type."); @@ -1124,7 +1124,7 @@ cons_type_incomplete(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name) // save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Types); + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); cons__name_map_add_pair(root, map, result->name, result->idx); } @@ -1143,7 +1143,7 @@ cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBG_MemberKind_DataField; + member->kind = RADDBGI_MemberKind_DataField; member->name = push_str8_copy(root->arena, name); member->type = mem_type; member->off = off; @@ -1160,7 +1160,7 @@ cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, String SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBG_MemberKind_StaticData; + member->kind = RADDBGI_MemberKind_StaticData; member->name = push_str8_copy(root->arena, name); member->type = mem_type; } @@ -1176,7 +1176,7 @@ cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, String8 nam SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBG_MemberKind_Method; + member->kind = RADDBGI_MemberKind_Method; member->name = push_str8_copy(root->arena, name); member->type = mem_type; } @@ -1194,7 +1194,7 @@ cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, Stri root->total_member_count += 1; - member->kind = RADDBG_MemberKind_StaticMethod; + member->kind = RADDBGI_MemberKind_StaticMethod; member->name = push_str8_copy(root->arena, name); member->type = mem_type; } @@ -1210,7 +1210,7 @@ cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, Str SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBG_MemberKind_VirtualMethod; + member->kind = RADDBGI_MemberKind_VirtualMethod; member->name = push_str8_copy(root->arena, name); member->type = mem_type; } @@ -1226,7 +1226,7 @@ cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *ba SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBG_MemberKind_Base; + member->kind = RADDBGI_MemberKind_Base; member->type = base_type; member->off = off; } @@ -1242,7 +1242,7 @@ cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, CONS_ SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBG_MemberKind_VirtualBase; + member->kind = RADDBGI_MemberKind_VirtualBase; member->type = base_type; // TODO(allen): what to do with the two offsets in this case? } @@ -1258,7 +1258,7 @@ cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, CONS_T SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBG_MemberKind_NestedType; + member->kind = RADDBGI_MemberKind_NestedType; member->type = nested_type; } } @@ -1266,7 +1266,7 @@ cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, CONS_T static void cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 val) { - cons_requiref(root, (enum_type->kind == RADDBG_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); + cons_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); CONS_TypeUDT *udt = cons__type_udt_from_any_type(root, enum_type); if(udt != 0) { @@ -1283,7 +1283,7 @@ cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 static void cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, String8 source_path, U32 line, U32 col) { - cons_requiref(root, (RADDBG_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBG_TypeKind_LastUserDefined), + cons_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), return, "Tried to add source coordinates to non-user-defined type."); CONS_TypeUDT *udt = cons__type_udt_from_any_type(root, defined_type); if(udt != 0) @@ -1367,15 +1367,15 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info default:{}break; case CONS_SymbolKind_GlobalVariable: { - map = cons__name_map_for_kind(root, RADDBG_NameMapKind_GlobalVariables); + map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_GlobalVariables); }break; case CONS_SymbolKind_ThreadVariable: { - map = cons__name_map_for_kind(root, RADDBG_NameMapKind_ThreadVariables); + map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_ThreadVariables); }break; case CONS_SymbolKind_Procedure: { - map = cons__name_map_for_kind(root, RADDBG_NameMapKind_Procedures); + map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Procedures); }break; } if(map != 0) @@ -1387,7 +1387,7 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info // save link name map if(kind == CONS_SymbolKind_Procedure && symbol->link_name.size > 0) { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBG_NameMapKind_LinkNameProcedures); + CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_LinkNameProcedures); cons__name_map_add_pair(root, map, symbol->link_name, symbol->idx); } } @@ -1472,9 +1472,9 @@ cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_use static void cons_local_set_basic_info(CONS_Root *root, CONS_Local *local, CONS_LocalInfo *info) { - cons_requiref(root, local->kind == RADDBG_LocalKind_NULL, return, "Local information set multiple times."); + cons_requiref(root, local->kind == RADDBGI_LocalKind_NULL, return, "Local information set multiple times."); cons_requiref(root, info->scope != 0, return, "Tried to set invalid scope as local's containing scope."); - cons_requiref(root, RADDBG_LocalKind_NULL < info->kind && info->kind < RADDBG_LocalKind_COUNT, return, "Invalid local kind."); + cons_requiref(root, RADDBGI_LocalKind_NULL < info->kind && info->kind < RADDBGI_LocalKind_COUNT, return, "Invalid local kind."); cons_requiref(root, info->type != 0, return, "Tried to set invalid type as local's type."); CONS_Scope *scope = info->scope; SLLQueuePush(scope->first_local, scope->last_local, local); @@ -1515,7 +1515,7 @@ static CONS_Location* cons_location_addr_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode) { CONS_Location *result = push_array(root->arena, CONS_Location, 1); - result->kind = RADDBG_LocationKind_AddrBytecodeStream; + result->kind = RADDBGI_LocationKind_AddrBytecodeStream; result->bytecode = *bytecode; return result; } @@ -1524,7 +1524,7 @@ static CONS_Location* cons_location_val_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode) { CONS_Location *result = push_array(root->arena, CONS_Location, 1); - result->kind = RADDBG_LocationKind_ValBytecodeStream; + result->kind = RADDBGI_LocationKind_ValBytecodeStream; result->bytecode = *bytecode; return result; } @@ -1533,7 +1533,7 @@ static CONS_Location* cons_location_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset) { CONS_Location *result = push_array(root->arena, CONS_Location, 1); - result->kind = RADDBG_LocationKind_AddrRegisterPlusU16; + result->kind = RADDBGI_LocationKind_AddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; return result; @@ -1543,7 +1543,7 @@ static CONS_Location* cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset) { CONS_Location *result = push_array(root->arena, CONS_Location, 1); - result->kind = RADDBG_LocationKind_AddrAddrRegisterPlusU16; + result->kind = RADDBGI_LocationKind_AddrAddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; return result; @@ -1553,7 +1553,7 @@ static CONS_Location* cons_location_val_reg(CONS_Root *root, U8 reg_code) { CONS_Location *result = push_array(root->arena, CONS_Location, 1); - result->kind = RADDBG_LocationKind_ValRegister; + result->kind = RADDBGI_LocationKind_ValRegister; result->register_code = reg_code; return result; } @@ -1561,10 +1561,10 @@ cons_location_val_reg(CONS_Root *root, U8 reg_code) //- rjf: name map building static CONS__NameMap* -cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind) +cons__name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind) { CONS__NameMap *result = 0; - if(kind < RADDBG_NameMapKind_COUNT) + if(kind < RADDBGI_NameMapKind_COUNT) { if(root->name_maps[kind] == 0) { @@ -1581,7 +1581,7 @@ static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 idx) { // hash - U64 hash = raddbg_hash(string.str, string.size); + U64 hash = raddbgi_hash(string.str, string.size); U64 bucket_idx = hash%map->buckets_count; // find existing name node @@ -1691,7 +1691,7 @@ cons__string(CONS__BakeCtx *bctx, String8 str) { Arena *arena = bctx->arena; CONS__Strings *strs = &bctx->strs; - U64 hash = raddbg_hash(str.str, str.size); + U64 hash = raddbgi_hash(str.str, str.size); U64 bucket_idx = hash%strs->buckets_count; // look for a match @@ -1807,7 +1807,7 @@ cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count) //- rjf: data section baking static U32 -cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_DataSectionTag tag) +cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag) { U32 result = dss->count; CONS__DSectionNode *node = push_array(arena, CONS__DSectionNode, 1); @@ -2034,7 +2034,7 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod // arrange output U64 *arranged_voffs = push_array_no_zero(arena, U64, key_count + 1); - RADDBG_Line *arranged_lines = push_array_no_zero(arena, RADDBG_Line, key_count); + RADDBGI_Line *arranged_lines = push_array_no_zero(arena, RADDBGI_Line, key_count); for(U64 i = 0; i < key_count; i += 1){ arranged_voffs[i] = sorted_line_keys[i].key; @@ -2200,11 +2200,11 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * // fill output vmap entries U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; - RADDBG_VMapEntry *vmap = push_array_no_zero(arena, RADDBG_VMapEntry, vmap_count_raw + 1); + RADDBGI_VMapEntry *vmap = push_array_no_zero(arena, RADDBGI_VMapEntry, vmap_count_raw + 1); U32 vmap_entry_count_pass_1 = 0; { - RADDBG_VMapEntry *vmap_ptr = vmap; + RADDBGI_VMapEntry *vmap_ptr = vmap; if(extra_vmap_entry){ vmap_ptr->voff = 0; @@ -2289,7 +2289,7 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * // (the last entry is not replaced because it acts as a terminator) U32 last = vmap_entry_count_pass_1 - 1; - RADDBG_VMapEntry *vmap_ptr = vmap; + RADDBGI_VMapEntry *vmap_ptr = vmap; U64 real_idx = 0; for(U32 i = 0; i < last; i += 1, vmap_ptr += 1){ @@ -2308,12 +2308,12 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * // combine duplicate neighbors U32 vmap_entry_count = 0; { - RADDBG_VMapEntry *vmap_ptr = vmap; - RADDBG_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; - RADDBG_VMapEntry *vmap_out = vmap; + RADDBGI_VMapEntry *vmap_ptr = vmap; + RADDBGI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; + RADDBGI_VMapEntry *vmap_out = vmap; for(;vmap_ptr < vmap_opl;){ - RADDBG_VMapEntry *vmap_range_first = vmap_ptr; + RADDBGI_VMapEntry *vmap_range_first = vmap_ptr; U64 idx = vmap_ptr->idx; vmap_ptr += 1; for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; @@ -2398,16 +2398,16 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) // fill type nodes U32 type_count = root->type_count; - RADDBG_TypeNode *type_nodes = push_array_no_zero(arena, RADDBG_TypeNode, type_count); + RADDBGI_TypeNode *type_nodes = push_array_no_zero(arena, RADDBGI_TypeNode, type_count); { - RADDBG_TypeNode *ptr = type_nodes; - RADDBG_TypeNode *opl = ptr + type_count; + RADDBGI_TypeNode *ptr = type_nodes; + RADDBGI_TypeNode *opl = ptr + type_count; CONS_Type *loose_type = root->first_type; for(;loose_type != 0 && ptr < opl; loose_type = loose_type->next_order, ptr += 1){ - RADDBG_TypeKind kind = loose_type->kind; + RADDBGI_TypeKind kind = loose_type->kind; // shared ptr->kind = kind; @@ -2415,21 +2415,21 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) ptr->byte_size = loose_type->byte_size; // built-in - if(RADDBG_TypeKind_FirstBuiltIn <= kind && kind <= RADDBG_TypeKind_LastBuiltIn){ + if(RADDBGI_TypeKind_FirstBuiltIn <= kind && kind <= RADDBGI_TypeKind_LastBuiltIn){ ptr->built_in.name_string_idx = cons__string(bctx, loose_type->name); } // constructed - else if(RADDBG_TypeKind_FirstConstructed <= kind && kind <= RADDBG_TypeKind_LastConstructed){ + else if(RADDBGI_TypeKind_FirstConstructed <= kind && kind <= RADDBGI_TypeKind_LastConstructed){ ptr->constructed.direct_type_idx = loose_type->direct_type->idx; switch (kind){ - case RADDBG_TypeKind_Array: + case RADDBGI_TypeKind_Array: { ptr->constructed.count = loose_type->count; }break; - case RADDBG_TypeKind_Function: + case RADDBGI_TypeKind_Function: { // parameters U32 count = loose_type->count; @@ -2438,7 +2438,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) ptr->constructed.count = count; }break; - case RADDBG_TypeKind_Method: + case RADDBGI_TypeKind_Method: { // parameters U32 count = loose_type->count; @@ -2450,7 +2450,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) } // user-defined - else if(RADDBG_TypeKind_FirstUserDefined <= kind && kind <= RADDBG_TypeKind_LastUserDefined){ + else if(RADDBGI_TypeKind_FirstUserDefined <= kind && kind <= RADDBGI_TypeKind_LastUserDefined){ ptr->user_defined.name_string_idx = cons__string(bctx, loose_type->name); if(loose_type->udt != 0){ ptr->user_defined.udt_idx = loose_type->udt->idx; @@ -2461,7 +2461,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) } // bitfield - else if(kind == RADDBG_TypeKind_Bitfield){ + else if(kind == RADDBGI_TypeKind_Bitfield){ ptr->bitfield.off = loose_type->off; ptr->bitfield.size = loose_type->count; } @@ -2477,23 +2477,23 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) // fill udts U32 udt_count = root->type_udt_count; - RADDBG_UDT *udts = push_array_no_zero(arena, RADDBG_UDT, udt_count); + RADDBGI_UDT *udts = push_array_no_zero(arena, RADDBGI_UDT, udt_count); U32 member_count = root->total_member_count; - RADDBG_Member *members = push_array_no_zero(arena, RADDBG_Member, member_count); + RADDBGI_Member *members = push_array_no_zero(arena, RADDBGI_Member, member_count); U32 enum_member_count = root->total_enum_val_count; - RADDBG_EnumMember *enum_members = push_array_no_zero(arena, RADDBG_EnumMember, enum_member_count); + RADDBGI_EnumMember *enum_members = push_array_no_zero(arena, RADDBGI_EnumMember, enum_member_count); { - RADDBG_UDT *ptr = udts; - RADDBG_UDT *opl = ptr + udt_count; + RADDBGI_UDT *ptr = udts; + RADDBGI_UDT *opl = ptr + udt_count; - RADDBG_Member *member_ptr = members; - RADDBG_Member *member_opl = members + member_count; + RADDBGI_Member *member_ptr = members; + RADDBGI_Member *member_opl = members + member_count; - RADDBG_EnumMember *enum_member_ptr = enum_members; - RADDBG_EnumMember *enum_member_opl = enum_members + enum_member_count; + RADDBGI_EnumMember *enum_member_ptr = enum_members; + RADDBGI_EnumMember *enum_member_opl = enum_members + enum_member_count; CONS_TypeUDT *loose_udt = root->first_udt; for(;loose_udt != 0 && ptr < opl; @@ -2505,7 +2505,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) // enum members if(loose_udt->enum_val_count != 0){ - ptr->flags |= RADDBG_UserDefinedTypeFlag_EnumMembers; + ptr->flags |= RADDBGI_UserDefinedTypeFlag_EnumMembers; ptr->member_first = (U32)(enum_member_ptr - enum_members); ptr->member_count = loose_udt->enum_val_count; @@ -2537,7 +2537,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) member_ptr->type_idx = loose_member->type->idx; // TODO(allen): - if(loose_member->kind == RADDBG_MemberKind_Method){ + if(loose_member->kind == RADDBGI_MemberKind_Method){ //loose_member_ptr->unit_idx = ; //loose_member_ptr->proc_symbol_idx = ; } @@ -2595,19 +2595,19 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) U32 procedure_count = 1 + root->symbol_kind_counts[CONS_SymbolKind_Procedure]; // allocate symbol arrays - RADDBG_GlobalVariable *global_variables = - push_array(arena, RADDBG_GlobalVariable, globalvar_count); + RADDBGI_GlobalVariable *global_variables = + push_array(arena, RADDBGI_GlobalVariable, globalvar_count); - RADDBG_ThreadVariable *thread_variables = - push_array(arena, RADDBG_ThreadVariable, threadvar_count); + RADDBGI_ThreadVariable *thread_variables = + push_array(arena, RADDBGI_ThreadVariable, threadvar_count); - RADDBG_Procedure *procedures = push_array(arena, RADDBG_Procedure, procedure_count); + RADDBGI_Procedure *procedures = push_array(arena, RADDBGI_Procedure, procedure_count); // fill symbol arrays { - RADDBG_GlobalVariable *global_ptr = global_variables; - RADDBG_ThreadVariable *thread_local_ptr = thread_variables; - RADDBG_Procedure *procedure_ptr = procedures; + RADDBGI_GlobalVariable *global_ptr = global_variables; + RADDBGI_ThreadVariable *thread_local_ptr = thread_variables; + RADDBGI_Procedure *procedure_ptr = procedures; // nils global_ptr += 1; @@ -2622,19 +2622,19 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) U32 link_name_string_idx = cons__string(bctx, node->link_name); U32 type_idx = node->type->idx; - RADDBG_LinkFlags link_flags = 0; + RADDBGI_LinkFlags link_flags = 0; U32 container_idx = 0; { if(node->is_extern){ - link_flags |= RADDBG_LinkFlag_External; + link_flags |= RADDBGI_LinkFlag_External; } if(node->container_symbol != 0){ container_idx = node->container_symbol->idx; - link_flags |= RADDBG_LinkFlag_ProcScoped; + link_flags |= RADDBGI_LinkFlag_ProcScoped; } else if(node->container_type != 0 && node->container_type->udt != 0){ container_idx = node->container_type->udt->idx; - link_flags |= RADDBG_LinkFlag_TypeScoped; + link_flags |= RADDBGI_LinkFlag_TypeScoped; } } @@ -2758,27 +2758,27 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) root->first_scope->range_count == 0); U32 scope_count = root->scope_count; - RADDBG_Scope *scopes = push_array(arena, RADDBG_Scope, scope_count); + RADDBGI_Scope *scopes = push_array(arena, RADDBGI_Scope, scope_count); U32 scope_voff_count = root->scope_voff_count; U64 *scope_voffs = push_array(arena, U64, scope_voff_count); U32 local_count = root->local_count; - RADDBG_Local *locals = push_array(arena, RADDBG_Local, local_count); + RADDBGI_Local *locals = push_array(arena, RADDBGI_Local, local_count); U32 location_block_count = root->location_count; - RADDBG_LocationBlock *location_blocks = - push_array(arena, RADDBG_LocationBlock, location_block_count); + RADDBGI_LocationBlock *location_blocks = + push_array(arena, RADDBGI_LocationBlock, location_block_count); String8List location_data = {0}; // iterate scopes, locals, and locations // fill scope voffs, locals, and location information { - RADDBG_Scope *scope_ptr = scopes; + RADDBGI_Scope *scope_ptr = scopes; U64 *scope_voff_ptr = scope_voffs; - RADDBG_Local *local_ptr = locals; - RADDBG_LocationBlock *location_block_ptr = location_blocks; + RADDBGI_Local *local_ptr = locals; + RADDBGI_LocationBlock *location_block_ptr = location_blocks; for(CONS_Scope *node = root->first_scope; node != 0; @@ -2836,8 +2836,8 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) str8_serial_push_data(scratch.arena, &location_data, &data, 1); }break; - case RADDBG_LocationKind_AddrBytecodeStream: - case RADDBG_LocationKind_ValBytecodeStream: + case RADDBGI_LocationKind_AddrBytecodeStream: + case RADDBGI_LocationKind_ValBytecodeStream: { str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, str8_struct(&location->kind))); for(CONS_EvalBytecodeOp *op_node = location->bytecode.first_op; @@ -2856,19 +2856,19 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) } }break; - case RADDBG_LocationKind_AddrRegisterPlusU16: - case RADDBG_LocationKind_AddrAddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: { - RADDBG_LocationRegisterPlusU16 loc = {0}; + RADDBGI_LocationRegisterPlusU16 loc = {0}; loc.kind = location->kind; loc.register_code = location->register_code; loc.offset = location->offset; str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, str8_struct(&loc))); }break; - case RADDBG_LocationKind_ValRegister: + case RADDBGI_LocationKind_ValRegister: { - RADDBG_LocationRegister loc = {0}; + RADDBGI_LocationRegister loc = {0}; loc.kind = location->kind; loc.register_code = location->register_code; str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, str8_struct(&loc))); @@ -2987,7 +2987,7 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na for(CONS__NameMapNode *node = map->first; node != 0; node = node->order_next){ - U64 hash = raddbg_hash(node->string.str, node->string.size); + U64 hash = raddbgi_hash(node->string.str, node->string.size); U64 bi = hash%bucket_count; CONS__NameMapSemiNode *snode = push_array(scratch.arena, CONS__NameMapSemiNode, 1); SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); @@ -2996,13 +2996,13 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na } // allocate tables - RADDBG_NameMapBucket *buckets = push_array(arena, RADDBG_NameMapBucket, bucket_count); - RADDBG_NameMapNode *nodes = push_array_no_zero(arena, RADDBG_NameMapNode, node_count); + RADDBGI_NameMapBucket *buckets = push_array(arena, RADDBGI_NameMapBucket, bucket_count); + RADDBGI_NameMapNode *nodes = push_array_no_zero(arena, RADDBGI_NameMapNode, node_count); // convert to serialized buckets & nodes { - RADDBG_NameMapBucket *bucket_ptr = buckets; - RADDBG_NameMapNode *node_ptr = nodes; + RADDBGI_NameMapBucket *bucket_ptr = buckets; + RADDBGI_NameMapNode *node_ptr = nodes; for(U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ bucket_ptr->first_node = (U32)(node_ptr - nodes); bucket_ptr->node_count = sbuckets[i].count; @@ -3070,7 +3070,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) // setup cons helpers CONS__DSections dss = {0}; - cons__dsection(arena, &dss, 0, 0, RADDBG_DataSectionTag_NULL); + cons__dsection(arena, &dss, 0, 0, RADDBGI_DataSectionTag_NULL); CONS__BakeParams bctx_params = {0}; { @@ -3083,7 +3083,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) // MAIN PART: allocating and filling out sections of the file // top level info - RADDBG_TopLevelInfo *tli = push_array(arena, RADDBG_TopLevelInfo, 1); + RADDBGI_TopLevelInfo *tli = push_array(arena, RADDBGI_TopLevelInfo, 1); { CONS_TopLevelInfo *cons_tli = &root->top_level_info; tli->architecture = cons_tli->architecture; @@ -3091,13 +3091,13 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) tli->exe_hash = cons_tli->exe_hash; tli->voff_max = cons_tli->voff_max; } - cons__dsection(arena, &dss, tli, sizeof(*tli), RADDBG_DataSectionTag_TopLevelInfo); + cons__dsection(arena, &dss, tli, sizeof(*tli), RADDBGI_DataSectionTag_TopLevelInfo); // binary sections array { U32 count = root->binary_section_count; - RADDBG_BinarySection *sections = push_array(arena, RADDBG_BinarySection, count); - RADDBG_BinarySection *dsec = sections; + RADDBGI_BinarySection *sections = push_array(arena, RADDBGI_BinarySection, count); + RADDBGI_BinarySection *dsec = sections; for(CONS_BinarySection *ssec = root->binary_section_first; ssec != 0; ssec = ssec->next, dsec += 1){ @@ -3108,7 +3108,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) dsec->foff_first = ssec->foff_first; dsec->foff_opl = ssec->foff_opl; } - cons__dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBG_DataSectionTag_BinarySections); + cons__dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBGI_DataSectionTag_BinarySections); } // units array @@ -3117,8 +3117,8 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) // * combining line info for whole unit { U32 count = root->unit_count; - RADDBG_Unit *units = push_array(arena, RADDBG_Unit, count); - RADDBG_Unit *dunit = units; + RADDBGI_Unit *units = push_array(arena, RADDBGI_Unit, count); + RADDBGI_Unit *dunit = units; for(CONS_Unit *sunit = root->unit_first; sunit != 0; sunit = sunit->next_order, dunit += 1){ @@ -3147,20 +3147,20 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) if(line_count > 0){ dunit->line_info_voffs_data_idx = cons__dsection(arena, &dss, lines->voffs, sizeof(U64)*(line_count + 1), - RADDBG_DataSectionTag_LineInfoVoffs); + RADDBGI_DataSectionTag_LineInfoVoffs); dunit->line_info_data_idx = - cons__dsection(arena, &dss, lines->lines, sizeof(RADDBG_Line)*line_count, - RADDBG_DataSectionTag_LineInfoData); + cons__dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, + RADDBGI_DataSectionTag_LineInfoData); if(lines->cols != 0){ dunit->line_info_col_data_idx = - cons__dsection(arena, &dss, lines->cols, sizeof(RADDBG_Column)*line_count, - RADDBG_DataSectionTag_LineInfoColumns); + cons__dsection(arena, &dss, lines->cols, sizeof(RADDBGI_Column)*line_count, + RADDBGI_DataSectionTag_LineInfoColumns); } dunit->line_info_count = line_count; } } - cons__dsection(arena, &dss, units, sizeof(*units)*count, RADDBG_DataSectionTag_Units); + cons__dsection(arena, &dss, units, sizeof(*units)*count, RADDBGI_DataSectionTag_Units); } // source file line info baking @@ -3178,21 +3178,21 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) src_node->line_map_nums_data_idx = cons__dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, - RADDBG_DataSectionTag_LineMapNumbers); + RADDBGI_DataSectionTag_LineMapNumbers); src_node->line_map_range_data_idx = cons__dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), - RADDBG_DataSectionTag_LineMapRanges); + RADDBGI_DataSectionTag_LineMapRanges); src_node->line_map_voff_data_idx = cons__dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, - RADDBG_DataSectionTag_LineMapVoffs); + RADDBGI_DataSectionTag_LineMapVoffs); } } // source file name mapping { - CONS__NameMap* map = cons__name_map_for_kind(root, RADDBG_NameMapKind_NormalSourcePaths); + CONS__NameMap* map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_NormalSourcePaths); for(CONS__SrcNode *src_node = bctx->tree->src_first; src_node != 0; src_node = src_node->next){ @@ -3209,7 +3209,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) root->unit_vmap_range_count); U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); - cons__dsection(arena, &dss, vmap->vmap, vmap_size, RADDBG_DataSectionTag_UnitVmap); + cons__dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); } // type info baking @@ -3217,16 +3217,16 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) CONS__TypeData *types = cons__type_data_combine(arena, root, bctx); U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; - cons__dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBG_DataSectionTag_TypeNodes); + cons__dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); U64 udt_size = sizeof(*types->udts)*types->udt_count; - cons__dsection(arena, &dss, types->udts, udt_size, RADDBG_DataSectionTag_UDTs); + cons__dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); U64 member_size = sizeof(*types->members)*types->member_count; - cons__dsection(arena, &dss, types->members, member_size, RADDBG_DataSectionTag_Members); + cons__dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; - cons__dsection(arena, &dss, types->enum_members, enum_member_size, RADDBG_DataSectionTag_EnumMembers); + cons__dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); } // symbol info baking @@ -3236,59 +3236,59 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) U64 global_variables_size = sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; cons__dsection(arena, &dss, symbol_data->global_variables, global_variables_size, - RADDBG_DataSectionTag_GlobalVariables); + RADDBGI_DataSectionTag_GlobalVariables); CONS__VMap *global_vmap = symbol_data->global_vmap; U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); cons__dsection(arena, &dss, global_vmap->vmap, global_vmap_size, - RADDBG_DataSectionTag_GlobalVmap); + RADDBGI_DataSectionTag_GlobalVmap); U64 thread_variables_size = sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; cons__dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, - RADDBG_DataSectionTag_ThreadVariables); + RADDBGI_DataSectionTag_ThreadVariables); U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; cons__dsection(arena, &dss, symbol_data->procedures, procedures_size, - RADDBG_DataSectionTag_Procedures); + RADDBGI_DataSectionTag_Procedures); U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; - cons__dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBG_DataSectionTag_Scopes); + cons__dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; cons__dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, - RADDBG_DataSectionTag_ScopeVoffData); + RADDBGI_DataSectionTag_ScopeVoffData); CONS__VMap *scope_vmap = symbol_data->scope_vmap; U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); - cons__dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBG_DataSectionTag_ScopeVmap); + cons__dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; - cons__dsection(arena, &dss, symbol_data->locals, local_size, RADDBG_DataSectionTag_Locals); + cons__dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); U64 location_blocks_size = sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; cons__dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, - RADDBG_DataSectionTag_LocationBlocks); + RADDBGI_DataSectionTag_LocationBlocks); U64 location_data_size = symbol_data->location_data_size; cons__dsection(arena, &dss, symbol_data->location_data, location_data_size, - RADDBG_DataSectionTag_LocationData); + RADDBGI_DataSectionTag_LocationData); } // name map baking { U32 name_map_count = 0; - for(U32 i = 0; i < RADDBG_NameMapKind_COUNT; i += 1){ + for(U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ if(root->name_maps[i] != 0){ name_map_count += 1; } } - RADDBG_NameMap *name_maps = push_array(arena, RADDBG_NameMap, name_map_count); + RADDBGI_NameMap *name_maps = push_array(arena, RADDBGI_NameMap, name_map_count); - RADDBG_NameMap *name_map_ptr = name_maps; - for(U32 i = 0; i < RADDBG_NameMapKind_COUNT; i += 1){ + RADDBGI_NameMap *name_map_ptr = name_maps; + for(U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ CONS__NameMap *map = root->name_maps[i]; if(map != 0){ CONS__NameMapBaked *baked = cons__name_map_bake(arena, root, bctx, map); @@ -3296,16 +3296,16 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) name_map_ptr->kind = i; name_map_ptr->bucket_data_idx = cons__dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, - RADDBG_DataSectionTag_NameMapBuckets); + RADDBGI_DataSectionTag_NameMapBuckets); name_map_ptr->node_data_idx = cons__dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, - RADDBG_DataSectionTag_NameMapNodes); + RADDBGI_DataSectionTag_NameMapNodes); name_map_ptr += 1; } } cons__dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, - RADDBG_DataSectionTag_NameMaps); + RADDBGI_DataSectionTag_NameMaps); } //////////////////////////////// @@ -3314,9 +3314,9 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) // generate data sections for file paths { U32 count = bctx->tree->count; - RADDBG_FilePathNode *nodes = push_array(arena, RADDBG_FilePathNode, count); + RADDBGI_FilePathNode *nodes = push_array(arena, RADDBGI_FilePathNode, count); - RADDBG_FilePathNode *out_node = nodes; + RADDBGI_FilePathNode *out_node = nodes; for(CONS__PathNode *node = bctx->tree->first; node != 0; node = node->next_order, out_node += 1){ @@ -3335,15 +3335,15 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } } - cons__dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBG_DataSectionTag_FilePathNodes); + cons__dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBGI_DataSectionTag_FilePathNodes); } // generate data sections for files { U32 count = bctx->tree->src_count; - RADDBG_SourceFile *src_files = push_array(arena, RADDBG_SourceFile, count); + RADDBGI_SourceFile *src_files = push_array(arena, RADDBGI_SourceFile, count); - RADDBG_SourceFile *out_src_file = src_files; + RADDBGI_SourceFile *out_src_file = src_files; for(CONS__SrcNode *node = bctx->tree->src_first; node != 0; node = node->next, out_src_file += 1){ @@ -3355,7 +3355,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; } - cons__dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBG_DataSectionTag_SourceFiles); + cons__dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBGI_DataSectionTag_SourceFiles); } // generate data sections for strings @@ -3388,8 +3388,8 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } cons__dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), - RADDBG_DataSectionTag_StringTable); - cons__dsection(arena, &dss, buf, off_cursor, RADDBG_DataSectionTag_StringData); + RADDBGI_DataSectionTag_StringTable); + cons__dsection(arena, &dss, buf, off_cursor, RADDBGI_DataSectionTag_StringData); } // generate data sections for index runs @@ -3409,14 +3409,14 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } cons__dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, - RADDBG_DataSectionTag_IndexRuns); + RADDBGI_DataSectionTag_IndexRuns); } // layout // * the header and data section table have to be initialized "out of order" // * so that the rest of the system can avoid this tricky order-layout interdependence stuff - RADDBG_Header *header = push_array(arena, RADDBG_Header, 1); - RADDBG_DataSection *dstable = push_array(arena, RADDBG_DataSection, dss.count); + RADDBGI_Header *header = push_array(arena, RADDBGI_Header, 1); + RADDBGI_DataSection *dstable = push_array(arena, RADDBGI_DataSection, dss.count); str8_serial_push_align(arena, out, 8); U64 header_off = out->total_size; str8_list_push(arena, out, str8_struct(header)); @@ -3424,8 +3424,8 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) U64 data_section_off = out->total_size; str8_list_push(arena, out, str8((U8 *)dstable, sizeof(*dstable)*dss.count)); { - header->magic = RADDBG_MAGIC_CONSTANT; - header->encoding_version = RADDBG_ENCODING_VERSION; + header->magic = RADDBGI_MAGIC_CONSTANT; + header->encoding_version = RADDBGI_ENCODING_VERSION; header->data_section_off = data_section_off; header->data_section_count = dss.count; } @@ -3438,7 +3438,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } Assert(test_dss_count == dss.count); - RADDBG_DataSection *ptr = dstable; + RADDBGI_DataSection *ptr = dstable; for(CONS__DSectionNode *node = dss.first; node != 0; node = node->next, ptr += 1){ @@ -3450,7 +3450,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) str8_list_push(arena, out, str8((U8 *)node->data, node->size)); } ptr->tag = node->tag; - ptr->encoding = RADDBG_DataSectionEncoding_Unpacked; + ptr->encoding = RADDBGI_DataSectionEncoding_Unpacked; ptr->off = data_section_offset; ptr->encoded_size = node->size; ptr->unpacked_size = node->size; diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/raddbgi_cons/raddbgi_cons.h index 0d024bf4..f1c7e573 100644 --- a/src/raddbgi_cons/raddbgi_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -98,7 +98,7 @@ struct CONS_BinarySection { CONS_BinarySection *next; String8 name; - RADDBG_BinarySectionFlags flags; + RADDBGI_BinarySectionFlags flags; U64 voff_first; U64 voff_opl; U64 foff_first; @@ -134,7 +134,7 @@ struct CONS_UnitInfo String8 object_file; String8 archive_file; String8 build_path; - RADDBG_Language language; + RADDBGI_Language language; }; typedef struct CONS_Unit CONS_Unit; @@ -149,7 +149,7 @@ struct CONS_Unit String8 object_file; String8 archive_file; String8 build_path; - RADDBG_Language language; + RADDBGI_Language language; CONS_LineSequenceNode *line_seq_first; CONS_LineSequenceNode *line_seq_last; U64 line_seq_count; @@ -185,7 +185,7 @@ typedef struct CONS_TypeMember CONS_TypeMember; struct CONS_TypeMember { CONS_TypeMember *next; - RADDBG_MemberKind kind; + RADDBGI_MemberKind kind; String8 name; struct CONS_Type *type; U32 off; @@ -203,7 +203,7 @@ typedef struct CONS_Type CONS_Type; struct CONS_Type { CONS_Type *next_order; - RADDBG_TypeKind kind; + RADDBGI_TypeKind kind; U32 idx; U32 byte_size; U32 flags; @@ -298,7 +298,7 @@ struct CONS_Symbol typedef struct CONS_LocalInfo CONS_LocalInfo; struct CONS_LocalInfo { - RADDBG_LocalKind kind; + RADDBGI_LocalKind kind; struct CONS_Scope *scope; String8 name; CONS_Type *type; @@ -308,7 +308,7 @@ typedef struct CONS_Local CONS_Local; struct CONS_Local { CONS_Local *next; - RADDBG_LocalKind kind; + RADDBGI_LocalKind kind; String8 name; CONS_Type *type; struct CONS_LocationSet *locset; @@ -348,7 +348,7 @@ typedef struct CONS_EvalBytecodeOp CONS_EvalBytecodeOp; struct CONS_EvalBytecodeOp { CONS_EvalBytecodeOp *next; - RADDBG_EvalOp op; + RADDBGI_EvalOp op; U32 p_size; U64 p; }; @@ -365,7 +365,7 @@ struct CONS_EvalBytecode typedef struct CONS_Location CONS_Location; struct CONS_Location { - RADDBG_LocationKind kind; + RADDBGI_LocationKind kind; U8 register_code; U16 offset; CONS_EvalBytecode bytecode; @@ -426,7 +426,7 @@ struct CONS__NameMap typedef struct CONS_TopLevelInfo CONS_TopLevelInfo; struct CONS_TopLevelInfo { - RADDBG_Arch architecture; + RADDBGI_Arch architecture; String8 exe_name; U64 exe_hash; U64 voff_max; @@ -513,7 +513,7 @@ struct CONS_Root U64 location_count; // name maps - CONS__NameMap *name_maps[RADDBG_NameMapKind_COUNT]; + CONS__NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; //////// Handle Relationship Maps @@ -536,7 +536,7 @@ struct CONS__DSectionNode CONS__DSectionNode *next; void *data; U64 size; - RADDBG_DataSectionTag tag; + RADDBGI_DataSectionTag tag; }; typedef struct CONS__DSections CONS__DSections; @@ -664,7 +664,7 @@ typedef struct CONS__UnitLinesCombined CONS__UnitLinesCombined; struct CONS__UnitLinesCombined { U64 *voffs; - RADDBG_Line *lines; + RADDBGI_Line *lines; U16 *cols; U32 line_count; }; @@ -702,7 +702,7 @@ struct CONS__SrcLineMapBucket typedef struct CONS__VMap CONS__VMap; struct CONS__VMap { - RADDBG_VMapEntry *vmap; // [count + 1] + RADDBGI_VMapEntry *vmap; // [count + 1] U32 count; }; @@ -725,16 +725,16 @@ struct CONS__VMapRangeTracker typedef struct CONS__TypeData CONS__TypeData; struct CONS__TypeData { - RADDBG_TypeNode *type_nodes; + RADDBGI_TypeNode *type_nodes; U32 type_node_count; - RADDBG_UDT *udts; + RADDBGI_UDT *udts; U32 udt_count; - RADDBG_Member *members; + RADDBGI_Member *members; U32 member_count; - RADDBG_EnumMember *enum_members; + RADDBGI_EnumMember *enum_members; U32 enum_member_count; }; @@ -743,18 +743,18 @@ struct CONS__TypeData typedef struct CONS__SymbolData CONS__SymbolData; struct CONS__SymbolData { - RADDBG_GlobalVariable *global_variables; + RADDBGI_GlobalVariable *global_variables; U32 global_variable_count; CONS__VMap *global_vmap; - RADDBG_ThreadVariable *thread_variables; + RADDBGI_ThreadVariable *thread_variables; U32 thread_variable_count; - RADDBG_Procedure *procedures; + RADDBGI_Procedure *procedures; U32 procedure_count; - RADDBG_Scope *scopes; + RADDBGI_Scope *scopes; U32 scope_count; U64 *scope_voffs; @@ -762,10 +762,10 @@ struct CONS__SymbolData CONS__VMap *scope_vmap; - RADDBG_Local *locals; + RADDBGI_Local *locals; U32 local_count; - RADDBG_LocationBlock *location_blocks; + RADDBGI_LocationBlock *location_blocks; U32 location_block_count; void *location_data; @@ -792,8 +792,8 @@ struct CONS__NameMapSemiBucket typedef struct CONS__NameMapBaked CONS__NameMapBaked; struct CONS__NameMapBaked { - RADDBG_NameMapBucket *buckets; - RADDBG_NameMapNode *nodes; + RADDBGI_NameMapBucket *buckets; + RADDBGI_NameMapNode *nodes; U32 bucket_count; U32 node_count; }; @@ -823,7 +823,7 @@ struct CONS__BakeCtx static void cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type); //- rjf: bytecode lists -static void cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBG_EvalOp op, U64 p); +static void cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBGI_EvalOp op, U64 p); static void cons_bytecode_push_uconst(Arena *arena, CONS_EvalBytecode *bytecode, U64 x); static void cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, S64 x); static void cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *right_destroyed); @@ -861,7 +861,7 @@ static void cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli); //- rjf: binary section building static void cons_add_binary_section(CONS_Root *root, - String8 name, RADDBG_BinarySectionFlags flags, + String8 name, RADDBGI_BinarySectionFlags flags, U64 voff_first, U64 voff_opl, U64 foff_first, U64 foff_opl); @@ -889,19 +889,19 @@ static CONS_TypeUDT* cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *ty static CONS_TypeUDT* cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type); //- rjf: basic/operator type construction helpers -static CONS_Type* cons_type_basic(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name); -static CONS_Type* cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeModifierFlags flags); +static CONS_Type* cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name); +static CONS_Type* cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeModifierFlags flags); static CONS_Type* cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit_count); -static CONS_Type* cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBG_TypeKind ptr_type_kind); +static CONS_Type* cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeKind ptr_type_kind); static CONS_Type* cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count); static CONS_Type* cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *params); static CONS_Type* cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, struct CONS_TypeList *params); //- rjf: udt type constructors -static CONS_Type* cons_type_udt(CONS_Root *root, RADDBG_TypeKind record_type_kind, String8 name, U64 size); +static CONS_Type* cons_type_udt(CONS_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, U64 size); static CONS_Type* cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name); static CONS_Type* cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name); -static CONS_Type* cons_type_incomplete(CONS_Root *root, RADDBG_TypeKind type_kind, String8 name); +static CONS_Type* cons_type_incomplete(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name); //- rjf: type member building static void cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type, U32 off); @@ -941,7 +941,7 @@ static CONS_Location* cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 r static CONS_Location* cons_location_val_reg(CONS_Root *root, U8 reg_code); //- rjf: name map building -static CONS__NameMap* cons__name_map_for_kind(CONS_Root *root, RADDBG_NameMapKind kind); +static CONS__NameMap* cons__name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind); static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 name, U32 idx); //////////////////////////////// @@ -959,7 +959,7 @@ static U64 cons__idx_run_hash(U32 *idx_run, U32 count); static U32 cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count); //- rjf: data section baking -static U32 cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_DataSectionTag tag); +static U32 cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag); //- rjf: paths baking static String8 cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node); diff --git a/src/raddbgi_convert/dwarf/raddbgi_dwarf.h b/src/raddbgi_convert/dwarf/raddbgi_dwarf.h index f9927685..ca868988 100644 --- a/src/raddbgi_convert/dwarf/raddbgi_dwarf.h +++ b/src/raddbgi_convert/dwarf/raddbgi_dwarf.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_DWARF_H -#define RADDBG_DWARF_H +#ifndef RADDBGI_DWARF_H +#define RADDBGI_DWARF_H // https://dwarfstd.org/doc/DWARF4.pdf // https://dwarfstd.org/doc/DWARF5.pdf @@ -1328,5 +1328,5 @@ static String8 dwarf_string_from_line_ext_op(DWARF_LineExtOp op); static String8 dwarf_string_from_line_entry_format(DWARF_LineEntryFormat format); static String8 dwarf_string_from_section_code(DWARF_SectionCode sec_code); -#endif //RADDBG_DWARF_H +#endif //RADDBGI_DWARF_H diff --git a/src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h b/src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h index dc322ad1..d8cd9e87 100644 --- a/src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h +++ b/src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_DWARF_STRINGIZE_H -#define RADDBG_DWARF_STRINGIZE_H +#ifndef RADDBGI_DWARF_STRINGIZE_H +#define RADDBGI_DWARF_STRINGIZE_H //////////////////////////////// //~ DWARF Stringize Functions @@ -25,4 +25,4 @@ dwarf_stringize_addr(Arena *arena, String8List *out, DWARF_AddrUnit *unit, U32 i -#endif //RADDBG_DWARF_STRINGIZE_H +#endif //RADDBGI_DWARF_STRINGIZE_H diff --git a/src/raddbgi_convert/dwarf/raddbgi_elf.h b/src/raddbgi_convert/dwarf/raddbgi_elf.h index 5b04c11e..99882ec4 100644 --- a/src/raddbgi_convert/dwarf/raddbgi_elf.h +++ b/src/raddbgi_convert/dwarf/raddbgi_elf.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_ELF_H -#define RADDBG_ELF_H +#ifndef RADDBGI_ELF_H +#define RADDBGI_ELF_H // https://refspecs.linuxfoundation.org/elf/elf.pdf @@ -514,4 +514,4 @@ static String8 elf_string_from_symbol_binding(ELF_SymbolBinding binding); static String8 elf_string_from_symbol_type(ELF_SymbolType type); static String8 elf_string_from_symbol_visibility(ELF_SymbolVisibility visibility); -#endif //RADDBG_ELF_H +#endif //RADDBGI_ELF_H diff --git a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c index 2e4aa10f..04f55c7b 100644 --- a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c +++ b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c @@ -416,7 +416,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); - ProfBeginCapture("raddbg_from_dwarf"); + ProfBeginCapture("raddbgi_from_dwarf"); // parse arguments DWARFCONV_Params *params = dwarf_convert_params_from_cmd_line(arena, &cmdline); diff --git a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.h b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.h index 46ed6616..82052c44 100644 --- a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.h +++ b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_FROM_DWARF_H -#define RADDBG_FROM_DWARF_H +#ifndef RADDBGI_FROM_DWARF_H +#define RADDBGI_FROM_DWARF_H //////////////////////////////// //~ Program Parameters Type @@ -47,4 +47,4 @@ static DWARFCONV_Params *dwarf_convert_params_from_cmd_line(Arena *arena, CmdLin -#endif //RADDBG_FROM_DWARF_H +#endif //RADDBGI_FROM_DWARF_H diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview.h b/src/raddbgi_convert/pdb/raddbgi_codeview.h index 3f1c5d4a..35f989f9 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview.h +++ b/src/raddbgi_convert/pdb/raddbgi_codeview.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_CODEVIEW_H -#define RADDBG_CODEVIEW_H +#ifndef RADDBGI_CODEVIEW_H +#define RADDBGI_CODEVIEW_H #pragma pack(push, 1) @@ -155,7 +155,7 @@ typedef enum{ } CV_AllRegEnum; -// X(NAME, CODE, (RADDBG_RegsiterCode_X86) NAME, BYTE_POS, BYTE_SIZE) +// X(NAME, CODE, (RADDBGI_RegsiterCode_X86) NAME, BYTE_POS, BYTE_SIZE) #define CV_Reg_X86_XList(X) \ X(NONE, 0, nil, 0, 0)\ X(AL, 1, eax, 0, 1)\ @@ -408,7 +408,7 @@ typedef enum{ #undef X } CV_Regx86Enum; -// X(NAME, CODE, (RADDBG_RegsiterCode_X64) NAME, BYTE_POS, BYTE_SIZE) +// X(NAME, CODE, (RADDBGI_RegsiterCode_X64) NAME, BYTE_POS, BYTE_SIZE) #define CV_Reg_X64_XList(X) \ X(NONE, 0, nil, 0, 0)\ X(AL, 1, rax, 0, 1)\ @@ -3057,4 +3057,4 @@ typedef struct PDB_CoffSectionArray PDB_CoffSectionArray; static CV_C13Parsed* cv_c13_from_data(Arena *arena, String8 c13_data, struct PDB_Strtbl *strtbl, struct PDB_CoffSectionArray *sections); -#endif //RADDBG_CODEVIEW_H +#endif //RADDBGI_CODEVIEW_H diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c index 9930b4ed..ef1fe216 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c +++ b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c @@ -4,12 +4,12 @@ //////////////////////////////// //~ CodeView Conversion Functions -static RADDBG_Arch -raddbg_arch_from_cv_arch(CV_Arch cv_arch){ - RADDBG_Arch result = 0; +static RADDBGI_Arch +raddbgi_arch_from_cv_arch(CV_Arch cv_arch){ + RADDBGI_Arch result = 0; switch (cv_arch){ - case CV_Arch_8086: result = RADDBG_Arch_X86; break; - case CV_Arch_X64: result = RADDBG_Arch_X64; break; + case CV_Arch_8086: result = RADDBGI_Arch_X86; break; + case CV_Arch_X64: result = RADDBGI_Arch_X64; break; //case CV_Arch_8080: break; //case CV_Arch_80286: break; @@ -73,23 +73,23 @@ raddbg_arch_from_cv_arch(CV_Arch cv_arch){ return(result); } -static RADDBG_RegisterCode -raddbg_reg_code_from_cv_reg_code(RADDBG_Arch arch, CV_Reg reg_code){ - RADDBG_RegisterCode result = 0; +static RADDBGI_RegisterCode +raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code){ + RADDBGI_RegisterCode result = 0; switch (arch){ - case RADDBG_Arch_X86: + case RADDBGI_Arch_X86: { switch (reg_code){ -#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBG_RegisterCode_X86_##RDN; break; +#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBGI_RegisterCode_X86_##RDN; break; CV_Reg_X86_XList(X) #undef X } }break; - case RADDBG_Arch_X64: + case RADDBGI_Arch_X64: { switch (reg_code){ -#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBG_RegisterCode_X64_##RDN; break; +#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBGI_RegisterCode_X64_##RDN; break; CV_Reg_X64_XList(X) #undef X } @@ -98,12 +98,12 @@ raddbg_reg_code_from_cv_reg_code(RADDBG_Arch arch, CV_Reg reg_code){ return(result); } -static RADDBG_Language -raddbg_language_from_cv_language(CV_Language cv_language){ - RADDBG_Language result = 0; +static RADDBGI_Language +raddbgi_language_from_cv_language(CV_Language cv_language){ + RADDBGI_Language result = 0; switch (cv_language){ - case CV_Language_C: result = RADDBG_Language_C; break; - case CV_Language_CXX: result = RADDBG_Language_CPlusPlus; break; + case CV_Language_C: result = RADDBGI_Language_C; break; + case CV_Language_CXX: result = RADDBGI_Language_CPlusPlus; break; //case CV_Language_FORTRAN: result = ; break; //case CV_Language_MASM: result = ; break; //case CV_Language_PASCAL: result = ; break; diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h index 369e0949..92e4cb07 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h +++ b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h @@ -1,14 +1,14 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_CODEVIEW_CONVERSION_H -#define RADDBG_CODEVIEW_CONVERSION_H +#ifndef RADDBGI_CODEVIEW_CONVERSION_H +#define RADDBGI_CODEVIEW_CONVERSION_H //////////////////////////////// //~ CodeView Conversion Functions -static RADDBG_Arch raddbg_arch_from_cv_arch(CV_Arch arch); -static RADDBG_RegisterCode raddbg_reg_code_from_cv_reg_code(RADDBG_Arch arch, CV_Reg reg_code); -static RADDBG_Language raddbg_language_from_cv_language(CV_Language language); +static RADDBGI_Arch raddbgi_arch_from_cv_arch(CV_Arch arch); +static RADDBGI_RegisterCode raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code); +static RADDBGI_Language raddbgi_language_from_cv_language(CV_Language language); -#endif //RADDBG_CODEVIEW_CONVERSION_H +#endif //RADDBGI_CODEVIEW_CONVERSION_H diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h b/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h index 6b59ec1f..c7d04840 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h +++ b/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_CODEVIEW_STRINGIZE_H -#define RADDBG_CODEVIEW_STRINGIZE_H +#ifndef RADDBGI_CODEVIEW_STRINGIZE_H +#define RADDBGI_CODEVIEW_STRINGIZE_H //////////////////////////////// //~ CodeView Stringize Helper Types @@ -83,4 +83,4 @@ static void cv_stringize_leaf_array(Arena *arena, String8List *out, static void cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13); -#endif //RADDBG_CODEVIEW_STRINGIZE_H +#endif //RADDBGI_CODEVIEW_STRINGIZE_H diff --git a/src/raddbgi_convert/pdb/raddbgi_coff.h b/src/raddbgi_convert/pdb/raddbgi_coff.h index 6078654e..ae04b185 100644 --- a/src/raddbgi_convert/pdb/raddbgi_coff.h +++ b/src/raddbgi_convert/pdb/raddbgi_coff.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_COFF_H -#define RADDBG_COFF_H +#ifndef RADDBGI_COFF_H +#define RADDBGI_COFF_H //////////////////////////////// //~ COFF Format Types diff --git a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c index f5c25c8b..a07f4597 100644 --- a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c +++ b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c @@ -4,18 +4,18 @@ //////////////////////////////// //~ COFF Conversion Functions -static RADDBG_BinarySectionFlags -raddbg_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags){ - RADDBG_BinarySectionFlags result = 0; +static RADDBGI_BinarySectionFlags +raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags){ + RADDBGI_BinarySectionFlags result = 0; if (flags & COFF_SectionFlag_MEM_READ){ - result |= RADDBG_BinarySectionFlag_Read; + result |= RADDBGI_BinarySectionFlag_Read; } if (flags & COFF_SectionFlag_MEM_WRITE){ - result |= RADDBG_BinarySectionFlag_Write; + result |= RADDBGI_BinarySectionFlag_Write; } if (flags & COFF_SectionFlag_MEM_EXECUTE){ - result |= RADDBG_BinarySectionFlag_Execute; + result |= RADDBGI_BinarySectionFlag_Execute; } return(result); diff --git a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h index 3036768c..2cd7aad9 100644 --- a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h +++ b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h @@ -1,13 +1,13 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_COFF_CONVERSION_H -#define RADDBG_COFF_CONVERSION_H +#ifndef RADDBGI_COFF_CONVERSION_H +#define RADDBGI_COFF_CONVERSION_H //////////////////////////////// //~ COFF Conversion Functions -static RADDBG_BinarySectionFlags -raddbg_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); +static RADDBGI_BinarySectionFlags +raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); -#endif //RADDBG_COFF_CONVERSION_H +#endif //RADDBGI_COFF_CONVERSION_H diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c index 18c4be2e..84347d2a 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c @@ -145,7 +145,7 @@ pdbconv_ctx_alloc(PDBCONV_CtxParams *params, CONS_Root *out_root) PDBCONV_Ctx *pdb_ctx = push_array(arena, PDBCONV_Ctx, 1); pdb_ctx->arena = arena; pdb_ctx->arch = params->arch; - pdb_ctx->addr_size = raddbg_addr_size_from_arch(pdb_ctx->arch); + pdb_ctx->addr_size = raddbgi_addr_size_from_arch(pdb_ctx->arch); pdb_ctx->hash = params->tpi_hash; pdb_ctx->leaf = params->tpi_leaf; pdb_ctx->sections = params->sections->sections; @@ -980,165 +980,165 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ switch (basic_type_code){ case CV_BasicType_VOID: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_Void, str8_lit("void")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Void, str8_lit("void")); }break; case CV_BasicType_HRESULT: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_Handle, str8_lit("HRESULT")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("HRESULT")); }break; case CV_BasicType_RCHAR: case CV_BasicType_CHAR: case CV_BasicType_CHAR8: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_Char8, str8_lit("char")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Char8, str8_lit("char")); }break; case CV_BasicType_UCHAR: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_UChar8, str8_lit("UCHAR")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_UChar8, str8_lit("UCHAR")); }break; case CV_BasicType_WCHAR: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_UChar16, str8_lit("WCHAR")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_UChar16, str8_lit("WCHAR")); }break; case CV_BasicType_CHAR16: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_Char16, str8_lit("CHAR16")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Char16, str8_lit("CHAR16")); }break; case CV_BasicType_CHAR32: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_Char32, str8_lit("CHAR32")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Char32, str8_lit("CHAR32")); }break; case CV_BasicType_BOOL8: case CV_BasicType_INT8: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_S8, str8_lit("S8")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S8, str8_lit("S8")); }break; case CV_BasicType_BOOL16: case CV_BasicType_INT16: case CV_BasicType_SHORT: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_S16, str8_lit("S16")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S16, str8_lit("S16")); }break; case CV_BasicType_BOOL32: case CV_BasicType_INT32: case CV_BasicType_LONG: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_S32, str8_lit("S32")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S32, str8_lit("S32")); }break; case CV_BasicType_BOOL64: case CV_BasicType_INT64: case CV_BasicType_QUAD: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_S64, str8_lit("S64")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S64, str8_lit("S64")); }break; case CV_BasicType_INT128: case CV_BasicType_OCT: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_S128, str8_lit("S128")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S128, str8_lit("S128")); }break; case CV_BasicType_UINT8: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_U8, str8_lit("U8")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U8, str8_lit("U8")); }break; case CV_BasicType_UINT16: case CV_BasicType_USHORT: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_U16, str8_lit("U16")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U16, str8_lit("U16")); }break; case CV_BasicType_UINT32: case CV_BasicType_ULONG: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_U32, str8_lit("U32")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U32, str8_lit("U32")); }break; case CV_BasicType_UINT64: case CV_BasicType_UQUAD: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_U64, str8_lit("U64")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U64, str8_lit("U64")); }break; case CV_BasicType_UINT128: case CV_BasicType_UOCT: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_U128, str8_lit("U128")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U128, str8_lit("U128")); }break; case CV_BasicType_FLOAT16: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_F16, str8_lit("F16")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F16, str8_lit("F16")); }break; case CV_BasicType_FLOAT32: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_F32, str8_lit("F32")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F32, str8_lit("F32")); }break; case CV_BasicType_FLOAT32PP: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_F32PP, str8_lit("F32PP")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F32PP, str8_lit("F32PP")); }break; case CV_BasicType_FLOAT48: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_F48, str8_lit("F48")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F48, str8_lit("F48")); }break; case CV_BasicType_FLOAT64: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_F64, str8_lit("F64")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F64, str8_lit("F64")); }break; case CV_BasicType_FLOAT80: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_F80, str8_lit("F80")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F80, str8_lit("F80")); }break; case CV_BasicType_FLOAT128: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_F128, str8_lit("F128")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F128, str8_lit("F128")); }break; case CV_BasicType_COMPLEX32: { basic_type = - cons_type_basic(ctx->root, RADDBG_TypeKind_ComplexF32, str8_lit("ComplexF32")); + cons_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF32, str8_lit("ComplexF32")); }break; case CV_BasicType_COMPLEX64: { basic_type = - cons_type_basic(ctx->root, RADDBG_TypeKind_ComplexF64, str8_lit("ComplexF64")); + cons_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF64, str8_lit("ComplexF64")); }break; case CV_BasicType_COMPLEX80: { basic_type = - cons_type_basic(ctx->root, RADDBG_TypeKind_ComplexF80, str8_lit("ComplexF80")); + cons_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF80, str8_lit("ComplexF80")); }break; case CV_BasicType_COMPLEX128: { basic_type = - cons_type_basic(ctx->root, RADDBG_TypeKind_ComplexF128, str8_lit("ComplexF128")); + cons_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF128, str8_lit("ComplexF128")); }break; case CV_BasicType_PTR: { - basic_type = cons_type_basic(ctx->root, RADDBG_TypeKind_Handle, str8_lit("PTR")); + basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("PTR")); }break; } @@ -1158,7 +1158,7 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_BasicPointerKind_16_32BIT: case CV_BasicPointerKind_64BIT: { - constructed_type = cons_type_pointer(ctx->root, basic_type, RADDBG_TypeKind_Ptr); + constructed_type = cons_type_pointer(ctx->root, basic_type, RADDBGI_TypeKind_Ptr); }break; } @@ -1196,12 +1196,12 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ if (sizeof(CV_LeafModifier) <= cap){ CV_LeafModifier *modifier = (CV_LeafModifier*)first; - RADDBG_TypeModifierFlags flags = 0; + RADDBGI_TypeModifierFlags flags = 0; if (modifier->flags & CV_ModifierFlag_Const){ - flags |= RADDBG_TypeModifierFlag_Const; + flags |= RADDBGI_TypeModifierFlag_Const; } if (modifier->flags & CV_ModifierFlag_Volatile){ - flags |= RADDBG_TypeModifierFlag_Volatile; + flags |= RADDBGI_TypeModifierFlag_Volatile; } CONS_Type *direct_type = pdbconv_type_resolve_and_check(ctx, modifier->itype); @@ -1227,27 +1227,27 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // TODO(allen): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead // extract modifier flags - RADDBG_TypeModifierFlags modifier_flags = 0; + RADDBGI_TypeModifierFlags modifier_flags = 0; if (pointer->attribs & CV_PointerAttrib_Const){ - modifier_flags |= RADDBG_TypeModifierFlag_Const; + modifier_flags |= RADDBGI_TypeModifierFlag_Const; } if (pointer->attribs & CV_PointerAttrib_Volatile){ - modifier_flags |= RADDBG_TypeModifierFlag_Volatile; + modifier_flags |= RADDBGI_TypeModifierFlag_Volatile; } // determine type kind - RADDBG_TypeKind type_kind = RADDBG_TypeKind_Ptr; + RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Ptr; if (pointer->attribs & CV_PointerAttrib_LRef){ - type_kind = RADDBG_TypeKind_LRef; + type_kind = RADDBGI_TypeKind_LRef; } else if (pointer->attribs & CV_PointerAttrib_RRef){ - type_kind = RADDBG_TypeKind_RRef; + type_kind = RADDBGI_TypeKind_RRef; } if (ptr_mode == CV_PointerMode_LRef){ - type_kind = RADDBG_TypeKind_LRef; + type_kind = RADDBGI_TypeKind_LRef; } else if (ptr_mode == CV_PointerMode_RRef){ - type_kind = RADDBG_TypeKind_RRef; + type_kind = RADDBGI_TypeKind_RRef; } CONS_Type *direct_type = pdbconv_type_resolve_and_check(ctx, pointer->itype); @@ -1363,18 +1363,18 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // incomplete type if (lf_struct->props & CV_TypeProp_FwdRef){ - RADDBG_TypeKind type_kind = RADDBG_TypeKind_IncompleteStruct; + RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_IncompleteStruct; if (range->hdr.kind == CV_LeafKind_CLASS){ - type_kind = RADDBG_TypeKind_IncompleteClass; + type_kind = RADDBGI_TypeKind_IncompleteClass; } result = cons_type_incomplete(ctx->root, type_kind, name); } // complete type else{ - RADDBG_TypeKind type_kind = RADDBG_TypeKind_Struct; + RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Struct; if (range->hdr.kind == CV_LeafKind_CLASS){ - type_kind = RADDBG_TypeKind_Class; + type_kind = RADDBGI_TypeKind_Class; } result = cons_type_udt(ctx->root, type_kind, name, size_u64); @@ -1409,18 +1409,18 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // incomplete type if (lf_struct->props & CV_TypeProp_FwdRef){ - RADDBG_TypeKind type_kind = RADDBG_TypeKind_IncompleteStruct; + RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_IncompleteStruct; if (range->hdr.kind == CV_LeafKind_CLASS2){ - type_kind = RADDBG_TypeKind_IncompleteClass; + type_kind = RADDBGI_TypeKind_IncompleteClass; } result = cons_type_incomplete(ctx->root, type_kind, name); } // complete type else{ - RADDBG_TypeKind type_kind = RADDBG_TypeKind_Struct; + RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Struct; if (range->hdr.kind == CV_LeafKind_CLASS2){ - type_kind = RADDBG_TypeKind_Class; + type_kind = RADDBGI_TypeKind_Class; } result = cons_type_udt(ctx->root, type_kind, name, size_u64); @@ -1455,12 +1455,12 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // incomplete type if (lf_union->props & CV_TypeProp_FwdRef){ result = - cons_type_incomplete(ctx->root, RADDBG_TypeKind_IncompleteUnion, name); + cons_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteUnion, name); } // complete type else{ - result = cons_type_udt(ctx->root, RADDBG_TypeKind_Union, name, size_u64); + result = cons_type_udt(ctx->root, RADDBGI_TypeKind_Union, name, size_u64); // remember to revisit this for members { @@ -1487,7 +1487,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // incomplete type if (lf_enum->props & CV_TypeProp_FwdRef){ - result = cons_type_incomplete(ctx->root, RADDBG_TypeKind_IncompleteEnum, name); + result = cons_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteEnum, name); } // complete type @@ -1667,7 +1667,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ static CONS_Type* pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype){ CONS_Type *result = pdbconv_type_resolve_itype(ctx, itype); - if (cons_type_is_unhandled_nil(ctx->root, result)){ + if(cons_type_is_unhandled_nil(ctx->root, result)) + { cons_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); } return(result); @@ -1798,7 +1799,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // extract important values from parameters String8 data = sym->data; U64 user_id_base = (((U64)sym_unique_id) << 32); - U64 sym_unique_id_hash = raddbg_hash((U8*)&sym_unique_id, sizeof(sym_unique_id)); + U64 sym_unique_id_hash = raddbgi_hash((U8*)&sym_unique_id, sizeof(sym_unique_id)); // PASS 1: map out data associations ProfScope("map out data associations") @@ -2109,16 +2110,16 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ U32 var_off = regrel32->reg_off; // need arch for analyzing register stuff - RADDBG_Arch arch = ctx->arch; + RADDBGI_Arch arch = ctx->arch; U64 addr_size = ctx->addr_size; // determine if this is a parameter - RADDBG_LocalKind local_kind = RADDBG_LocalKind_Variable; + RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; { B32 is_stack_reg = 0; switch (arch){ - case RADDBG_Arch_X86: is_stack_reg = (cv_reg == CV_Regx86_ESP); break; - case RADDBG_Arch_X64: is_stack_reg = (cv_reg == CV_Regx64_RSP); break; + case RADDBGI_Arch_X86: is_stack_reg = (cv_reg == CV_Regx86_ESP); break; + case RADDBGI_Arch_X64: is_stack_reg = (cv_reg == CV_Regx64_RSP); break; } if (is_stack_reg){ U32 frame_size = 0xFFFFFFFF; @@ -2128,7 +2129,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ frame_size = frameproc->frame_size; } if (var_off > frame_size){ - local_kind = RADDBG_LocalKind_Parameter; + local_kind = RADDBGI_LocalKind_Parameter; } } } @@ -2151,17 +2152,17 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // will there be an extra indirection to the value B32 extra_indirection_to_value = 0; switch (arch){ - case RADDBG_Arch_X86: + case RADDBGI_Arch_X86: { - if (local_kind == RADDBG_LocalKind_Parameter && + if (local_kind == RADDBGI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))){ extra_indirection_to_value = 1; } }break; - case RADDBG_Arch_X64: + case RADDBGI_Arch_X64: { - if (local_kind == RADDBG_LocalKind_Parameter && + if (local_kind == RADDBGI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))){ extra_indirection_to_value = 1; } @@ -2169,7 +2170,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } // get raddbg register code - RADDBG_RegisterCode register_code = raddbg_reg_code_from_cv_reg_code(arch, cv_reg); + RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); // TODO(allen): real byte_size & byte_pos from cv_reg goes here U32 byte_size = 8; U32 byte_pos = 0; @@ -2271,9 +2272,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // emit a local variable else{ // local kind - RADDBG_LocalKind local_kind = RADDBG_LocalKind_Variable; + RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; if (slocal->flags & CV_LocalFlag_Param){ - local_kind = RADDBG_LocalKind_Parameter; + local_kind = RADDBGI_LocalKind_Parameter; } // emit local @@ -2293,7 +2294,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ cons_local_set_basic_info(ctx->root, local_var, &info); defrange_target = cons_location_set_from_local(ctx->root, local_var); - defrange_target_is_param = (local_kind == RADDBG_LocalKind_Parameter); + defrange_target_is_param = (local_kind == RADDBGI_LocalKind_Parameter); } } }break; @@ -2312,9 +2313,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)first; // TODO(allen): offset & size from cv_reg code - RADDBG_Arch arch = ctx->arch; + RADDBGI_Arch arch = ctx->arch; CV_Reg cv_reg = defrange_register->reg; - RADDBG_RegisterCode register_code = raddbg_reg_code_from_cv_reg_code(arch, cv_reg); + RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); // setup location CONS_Location *location = cons_location_val_reg(ctx->root, register_code); @@ -2347,7 +2348,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // select frame pointer register CV_EncodedFramePtrReg encoded_fp_reg = pdbconv_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); - RADDBG_RegisterCode fp_register_code = + RADDBGI_RegisterCode fp_register_code = pdbconv_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); // setup location @@ -2388,9 +2389,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ if (defrange_subfield_register->field_offset == 0){ // TODO(allen): offset & size from cv_reg code - RADDBG_Arch arch = ctx->arch; + RADDBGI_Arch arch = ctx->arch; CV_Reg cv_reg = defrange_subfield_register->reg; - RADDBG_RegisterCode register_code = raddbg_reg_code_from_cv_reg_code(arch, cv_reg); + RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); // setup location CONS_Location *location = cons_location_val_reg(ctx->root, register_code); @@ -2425,7 +2426,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // select frame pointer register CV_EncodedFramePtrReg encoded_fp_reg = pdbconv_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); - RADDBG_RegisterCode fp_register_code = + RADDBGI_RegisterCode fp_register_code = pdbconv_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); // setup location @@ -2459,9 +2460,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ else { // TODO(allen): offset & size from cv_reg code - RADDBG_Arch arch = ctx->arch; + RADDBGI_Arch arch = ctx->arch; CV_Reg cv_reg = defrange_register_rel->reg; - RADDBG_RegisterCode register_code = raddbg_reg_code_from_cv_reg_code(arch, cv_reg); + RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); U32 byte_size = ctx->addr_size; U32 byte_pos = 0; @@ -2758,7 +2759,7 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n static CONS_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, - RADDBG_RegisterCode reg_code, + RADDBGI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, @@ -2776,12 +2777,12 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, Arena *arena = ctx->arena; CONS_EvalBytecode bytecode = {0}; - U32 regread_param = RADDBG_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); - cons_bytecode_push_op(arena, &bytecode, RADDBG_EvalOp_RegRead, regread_param); + U32 regread_param = RADDBGI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); + cons_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_RegRead, regread_param); cons_bytecode_push_sconst(arena, &bytecode, offset); - cons_bytecode_push_op(arena, &bytecode, RADDBG_EvalOp_Add, 0); + cons_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_Add, 0); if (extra_indirection){ - cons_bytecode_push_op(arena, &bytecode, RADDBG_EvalOp_MemRead, ctx->addr_size); + cons_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_MemRead, ctx->addr_size); } result = cons_location_addr_bytecode_stream(ctx->root, &bytecode); @@ -2806,12 +2807,12 @@ pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, CONS_Symbol *proc, B32 par return(result); } -static RADDBG_RegisterCode -pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBG_Arch arch, CV_EncodedFramePtrReg encoded_reg){ - RADDBG_RegisterCode result = 0; +static RADDBGI_RegisterCode +pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg encoded_reg){ + RADDBGI_RegisterCode result = 0; switch (arch){ - case RADDBG_Arch_X86: + case RADDBGI_Arch_X86: { switch (encoded_reg){ case CV_EncodedFramePtrReg_StackPtr: @@ -2821,29 +2822,29 @@ pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBG_Arch arch, CV_EncodedFramePtrRe }break; case CV_EncodedFramePtrReg_FramePtr: { - result = RADDBG_RegisterCode_X86_ebp; + result = RADDBGI_RegisterCode_X86_ebp; }break; case CV_EncodedFramePtrReg_BasePtr: { - result = RADDBG_RegisterCode_X86_ebx; + result = RADDBGI_RegisterCode_X86_ebx; }break; } }break; - case RADDBG_Arch_X64: + case RADDBGI_Arch_X64: { switch (encoded_reg){ case CV_EncodedFramePtrReg_StackPtr: { - result = RADDBG_RegisterCode_X64_rsp; + result = RADDBGI_RegisterCode_X64_rsp; }break; case CV_EncodedFramePtrReg_FramePtr: { - result = RADDBG_RegisterCode_X64_rbp; + result = RADDBGI_RegisterCode_X64_rbp; }break; case CV_EncodedFramePtrReg_BasePtr: { - result = RADDBG_RegisterCode_X64_r13; + result = RADDBGI_RegisterCode_X64_r13; }break; } }break; @@ -3139,7 +3140,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // exe hash U64 exe_hash = 0; if (out->good_parse && params->input_exe_data.size > 0) ProfScope("hash exe"){ - exe_hash = raddbg_hash(params->input_exe_data.str, params->input_exe_data.size); + exe_hash = raddbgi_hash(params->input_exe_data.str, params->input_exe_data.size); } // output generation @@ -3147,7 +3148,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ if (params->output_name.size > 0){ // determine arch - RADDBG_Arch architecture = RADDBG_Arch_NULL; + RADDBGI_Arch architecture = RADDBGI_Arch_NULL; // TODO(rjf): in some cases, the first compilation unit has a zero // architecture, as it's sometimes used as a "nil" unit. this causes bugs // in later stages of conversion - particularly, this was detected via @@ -3165,14 +3166,14 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ { if(sym_for_unit[comp_unit_idx] != 0) { - architecture = raddbg_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); + architecture = raddbgi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); if(architecture != 0) { break; } } } - U64 addr_size = raddbg_addr_size_from_arch(architecture); + U64 addr_size = raddbgi_addr_size_from_arch(architecture); // predict symbol counts @@ -3239,8 +3240,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ char *name_first = (char*)coff_ptr->name; char *name_opl = name_first + sizeof(coff_ptr->name); String8 name = str8_cstring_capped(name_first, name_opl); - RADDBG_BinarySectionFlags flags = - raddbg_binary_section_flags_from_coff_section_flags(coff_ptr->flags); + RADDBGI_BinarySectionFlags flags = + raddbgi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); cons_add_binary_section(root, name, flags, coff_ptr->voff, coff_ptr->voff + coff_ptr->vsize, coff_ptr->foff, coff_ptr->foff + coff_ptr->fsize); @@ -3283,7 +3284,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 archive_file = unit->group_name; // extract langauge - RADDBG_Language lang = raddbg_language_from_cv_language(sym->info.language); + RADDBGI_Language lang = raddbgi_language_from_cv_language(sym->info.language); // basic per unit info CONS_Unit *unit_handle = cons_unit_handle_from_user_id(root, i, i); diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h index c2858ddf..ff1c1513 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_FROM_PDB_H -#define RADDBG_FROM_PDB_H +#ifndef RADDBGI_FROM_PDB_H +#define RADDBGI_FROM_PDB_H //////////////////////////////// //~ Program Parameters Type @@ -107,7 +107,7 @@ typedef struct PDBCONV_KnownGlobalSet{ typedef struct PDBCONV_CtxParams PDBCONV_CtxParams; struct PDBCONV_CtxParams { - RADDBG_Arch arch; + RADDBGI_Arch arch; PDB_TpiHashParsed *tpi_hash; CV_LeafParsed *tpi_leaf; PDB_CoffSectionArray *sections; @@ -140,7 +140,7 @@ typedef struct PDBCONV_Ctx{ Arena *arena; // INPUT data - RADDBG_Arch arch; + RADDBGI_Arch arch; U64 addr_size; PDB_TpiHashParsed *hash; CV_LeafParsed *leaf; @@ -247,7 +247,7 @@ static void pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *se // location info helpers static CONS_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, - RADDBG_RegisterCode reg_code, + RADDBGI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, @@ -257,8 +257,8 @@ static CV_EncodedFramePtrReg pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ct CONS_Symbol *proc, B32 param_base); -static RADDBG_RegisterCode pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBG_Arch arch, - CV_EncodedFramePtrReg encoded_reg); +static RADDBGI_RegisterCode pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, + CV_EncodedFramePtrReg encoded_reg); static void pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, CONS_LocationSet *locset, @@ -288,4 +288,4 @@ struct PDBCONV_Out static PDBCONV_Out *pdbconv_convert(Arena *arena, PDBCONV_Params *params); -#endif //RADDBG_FROM_PDB_H +#endif // RADDBGI_FROM_PDB_H diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c index be1a992a..44a591a4 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c @@ -55,7 +55,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); - ProfBeginCapture("raddbg_from_pdb"); + ProfBeginCapture("raddbgi_from_pdb"); //- rjf: parse arguments PDBCONV_Params *params = pdb_convert_params_from_cmd_line(arena, &cmdline); diff --git a/src/raddbgi_convert/pdb/raddbgi_msf.h b/src/raddbgi_convert/pdb/raddbgi_msf.h index 62f671fd..4b55f4a6 100644 --- a/src/raddbgi_convert/pdb/raddbgi_msf.h +++ b/src/raddbgi_convert/pdb/raddbgi_msf.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_MSF_H -#define RADDBG_MSF_H +#ifndef RADDBGI_MSF_H +#define RADDBGI_MSF_H //////////////////////////////// //~ MSF Format Types @@ -57,4 +57,4 @@ typedef struct MSF_Parsed{ static MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data); static String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn); -#endif //RADDBG_MSF_H +#endif //RADDBGI_MSF_H diff --git a/src/raddbgi_convert/pdb/raddbgi_pdb.h b/src/raddbgi_convert/pdb/raddbgi_pdb.h index 1c60789c..0a8e8d16 100644 --- a/src/raddbgi_convert/pdb/raddbgi_pdb.h +++ b/src/raddbgi_convert/pdb/raddbgi_pdb.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_PDB_H -#define RADDBG_PDB_H +#ifndef RADDBGI_PDB_H +#define RADDBGI_PDB_H // https://github.com/microsoft/microsoft-pdb/tree/master/PDB @@ -459,4 +459,4 @@ static String8 pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 o static String8 pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, PDB_StringIndex idx); -#endif //RADDBG_PDB_H +#endif //RADDBGI_PDB_H diff --git a/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h b/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h index 6b222afa..9225735b 100644 --- a/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h +++ b/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h @@ -1,12 +1,12 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_PDB_STRINGIZE_H -#define RADDBG_PDB_STRINGIZE_H +#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 //RADDBG_PDB_STRINGIZE_H +#endif //RADDBGI_PDB_STRINGIZE_H diff --git a/src/raddbgi_dump/raddbgi_dump.c b/src/raddbgi_dump/raddbgi_dump.c index 1bcd7209..d5862b86 100644 --- a/src/raddbgi_dump/raddbgi_dump.c +++ b/src/raddbgi_dump/raddbgi_dump.c @@ -159,12 +159,12 @@ main(int argc, char **argv){ // will we try to parse an input file B32 try_parse_input = (params->errors.node_count == 0); - RADDBG_ParseStatus parse_status = RADDBG_ParseStatus_Good; - RADDBG_Parsed raddbg__ = {0}; - RADDBG_Parsed *raddbg = 0; + RADDBGI_ParseStatus parse_status = RADDBGI_ParseStatus_Good; + RADDBGI_Parsed raddbg__ = {0}; + RADDBGI_Parsed *raddbg = 0; if (try_parse_input){ - parse_status = raddbg_parse(params->input_data.str, params->input_data.size, &raddbg__); - if (parse_status == RADDBG_ParseStatus_Good){ + parse_status = raddbgi_parse(params->input_data.str, params->input_data.size, &raddbg__); + if (parse_status == RADDBGI_ParseStatus_Good){ raddbg = &raddbg__; } } @@ -181,24 +181,24 @@ main(int argc, char **argv){ // DATA SECTIONS if (raddbg->dsecs != 0 && params->dump_data_sections){ str8_list_pushf(arena, &dump, "# DATA SECTIONS:\n"); - raddbg_stringize_data_sections(arena, &dump, raddbg, 1); + raddbgi_stringize_data_sections(arena, &dump, raddbg, 1); str8_list_push(arena, &dump, str8_lit("\n")); } // TOP LEVEL INFO if (raddbg->top_level_info != 0 && params->dump_top_level_info){ str8_list_pushf(arena, &dump, "# TOP LEVEL INFO:\n"); - raddbg_stringize_top_level_info(arena, &dump, raddbg, raddbg->top_level_info, 1); + raddbgi_stringize_top_level_info(arena, &dump, raddbg, raddbg->top_level_info, 1); str8_list_push(arena, &dump, str8_lit("\n")); } // BINARY SECTIONS if (raddbg->binary_sections != 0 && params->dump_binary_sections){ str8_list_pushf(arena, &dump, "# BINARY SECTIONS:\n"); - RADDBG_BinarySection *ptr = raddbg->binary_sections; + RADDBGI_BinarySection *ptr = raddbg->binary_sections; for (U32 i = 0; i < raddbg->binary_sections_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " section[%u]:\n", i); - raddbg_stringize_binary_section(arena, &dump, raddbg, ptr, 2); + raddbgi_stringize_binary_section(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -206,17 +206,17 @@ main(int argc, char **argv){ // FILE PATHS if (raddbg->file_paths != 0 && params->dump_file_paths){ - RADDBG_FilePathBundle file_path_bundle = {0}; + RADDBGI_FilePathBundle file_path_bundle = {0}; { file_path_bundle.file_paths = raddbg->file_paths; file_path_bundle.file_path_count = raddbg->file_paths_count; } str8_list_pushf(arena, &dump, "# FILE PATHS\n"); - RADDBG_FilePathNode *ptr = raddbg->file_paths; + RADDBGI_FilePathNode *ptr = raddbg->file_paths; for (U32 i = 0; i < raddbg->file_paths_count; i += 1, ptr += 1){ if (ptr->parent_path_node == 0){ - raddbg_stringize_file_path(arena, &dump, raddbg, &file_path_bundle, ptr, 1); + raddbgi_stringize_file_path(arena, &dump, raddbg, &file_path_bundle, ptr, 1); } } str8_list_push(arena, &dump, str8_lit("\n")); @@ -225,10 +225,10 @@ main(int argc, char **argv){ // SOURCE FILES if (raddbg->source_files != 0 && params->dump_source_files){ str8_list_pushf(arena, &dump, "# SOURCE FILES\n"); - RADDBG_SourceFile *ptr = raddbg->source_files; + RADDBGI_SourceFile *ptr = raddbg->source_files; for (U32 i = 0; i < raddbg->source_files_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " source_file[%u]:\n", i); - raddbg_stringize_source_file(arena, &dump, raddbg, ptr, 2); + raddbgi_stringize_source_file(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -237,10 +237,10 @@ main(int argc, char **argv){ // UNITS if (raddbg->units != 0 && params->dump_units){ str8_list_pushf(arena, &dump, "# UNITS\n"); - RADDBG_Unit *ptr = raddbg->units; + RADDBGI_Unit *ptr = raddbg->units; for (U32 i = 0; i < raddbg->units_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - raddbg_stringize_unit(arena, &dump, raddbg, ptr, 2); + raddbgi_stringize_unit(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -249,7 +249,7 @@ main(int argc, char **argv){ // UNIT VMAP if (raddbg->unit_vmap != 0 && params->dump_unit_vmap){ str8_list_pushf(arena, &dump, "# UNIT VMAP\n"); - RADDBG_VMapEntry *ptr = raddbg->unit_vmap; + RADDBGI_VMapEntry *ptr = raddbg->unit_vmap; for (U32 i = 0; i < raddbg->unit_vmap_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); } @@ -259,10 +259,10 @@ main(int argc, char **argv){ // TYPE NODES if (raddbg->type_nodes != 0 && params->dump_type_nodes){ str8_list_pushf(arena, &dump, "# TYPE NODES:\n"); - RADDBG_TypeNode *ptr = raddbg->type_nodes; + RADDBGI_TypeNode *ptr = raddbg->type_nodes; for (U32 i = 0; i < raddbg->type_nodes_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " type[%u]:\n", i); - raddbg_stringize_type_node(arena, &dump, raddbg, ptr, 2); + raddbgi_stringize_type_node(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -270,7 +270,7 @@ main(int argc, char **argv){ // UDT DATA if (raddbg->udts != 0 && params->dump_udt_data){ - RADDBG_UDTMemberBundle member_bundle = {0}; + RADDBGI_UDTMemberBundle member_bundle = {0}; { member_bundle.members = raddbg->members; member_bundle.enum_members = raddbg->enum_members; @@ -279,10 +279,10 @@ main(int argc, char **argv){ } str8_list_pushf(arena, &dump, "# UDTS:\n"); - RADDBG_UDT *ptr = raddbg->udts; + RADDBGI_UDT *ptr = raddbg->udts; for (U32 i = 0; i < raddbg->udts_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " udt[%u]:\n", i); - raddbg_stringize_udt(arena, &dump, raddbg, &member_bundle, ptr, 2); + raddbgi_stringize_udt(arena, &dump, raddbg, &member_bundle, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -291,10 +291,10 @@ main(int argc, char **argv){ // GLOBAL VARIABLES if (raddbg->global_variables != 0 && params->dump_global_variables){ str8_list_pushf(arena, &dump, "# GLOBAL VARIABLES:\n"); - RADDBG_GlobalVariable *ptr = raddbg->global_variables; + RADDBGI_GlobalVariable *ptr = raddbg->global_variables; for (U32 i = 0; i < raddbg->global_variables_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " global_variable[%u]:\n", i); - raddbg_stringize_global_variable(arena, &dump, raddbg, ptr, 2); + raddbgi_stringize_global_variable(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -303,7 +303,7 @@ main(int argc, char **argv){ // GLOBAL VMAP if (raddbg->global_vmap != 0 && params->dump_global_vmap){ str8_list_pushf(arena, &dump, "# GLOBAL VMAP:\n"); - RADDBG_VMapEntry *ptr = raddbg->global_vmap; + RADDBGI_VMapEntry *ptr = raddbg->global_vmap; for (U32 i = 0; i < raddbg->global_vmap_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); } @@ -313,10 +313,10 @@ main(int argc, char **argv){ // THREAD LOCAL VARIABLES if (raddbg->thread_variables != 0 && params->dump_thread_variables){ str8_list_pushf(arena, &dump, "# THREAD VARIABLES:\n"); - RADDBG_ThreadVariable *ptr = raddbg->thread_variables; + RADDBGI_ThreadVariable *ptr = raddbg->thread_variables; for (U32 i = 0; i < raddbg->thread_variables_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " thread_variable[%u]:\n", i); - raddbg_stringize_thread_variable(arena, &dump, raddbg, ptr, 2); + raddbgi_stringize_thread_variable(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -325,10 +325,10 @@ main(int argc, char **argv){ // PROCEDURES if (raddbg->procedures != 0 && params->dump_procedures){ str8_list_pushf(arena, &dump, "# PROCEDURES:\n"); - RADDBG_Procedure *ptr = raddbg->procedures; + RADDBGI_Procedure *ptr = raddbg->procedures; for (U32 i = 0; i < raddbg->procedures_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " procedure[%u]:\n", i); - raddbg_stringize_procedure(arena, &dump, raddbg, ptr, 2); + raddbgi_stringize_procedure(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -336,7 +336,7 @@ main(int argc, char **argv){ // SCOPES if (raddbg->scopes != 0 && params->dump_scopes){ - RADDBG_ScopeBundle scope_bundle = {0}; + RADDBGI_ScopeBundle scope_bundle = {0}; { scope_bundle.scopes = raddbg->scopes; scope_bundle.scope_count = raddbg->scopes_count; @@ -351,10 +351,10 @@ main(int argc, char **argv){ } str8_list_pushf(arena, &dump, "# SCOPES:\n"); - RADDBG_Scope *ptr = raddbg->scopes; + RADDBGI_Scope *ptr = raddbg->scopes; for (U32 i = 0; i < raddbg->scopes_count; i += 1, ptr += 1){ if (ptr->parent_scope_idx == 0){ - raddbg_stringize_scope(arena, &dump, raddbg, &scope_bundle, ptr, 1); + raddbgi_stringize_scope(arena, &dump, raddbg, &scope_bundle, ptr, 1); str8_list_push(arena, &dump, str8_lit("\n")); } } @@ -364,7 +364,7 @@ main(int argc, char **argv){ // SCOPE VMAP if (raddbg->scope_vmap != 0 && params->dump_scope_vmap){ str8_list_pushf(arena, &dump, "# SCOPE VMAP:\n"); - RADDBG_VMapEntry *ptr = raddbg->scope_vmap; + RADDBGI_VMapEntry *ptr = raddbg->scope_vmap; for (U32 i = 0; i < raddbg->scope_vmap_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); } @@ -374,33 +374,33 @@ main(int argc, char **argv){ // NAME MAPS if (raddbg->name_maps != 0 && params->dump_name_map){ str8_list_pushf(arena, &dump, "# NAME MAP:\n"); - RADDBG_NameMap *ptr = raddbg->name_maps; + RADDBGI_NameMap *ptr = raddbg->name_maps; for (U32 i = 0; i < raddbg->name_maps_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " name_map[%u]:\n", i); - RADDBG_ParsedNameMap name_map = {0}; - raddbg_name_map_parse(raddbg, ptr, &name_map); + RADDBGI_ParsedNameMap name_map = {0}; + raddbgi_name_map_parse(raddbg, ptr, &name_map); - RADDBG_NameMapBucket *bucket = name_map.buckets; + RADDBGI_NameMapBucket *bucket = name_map.buckets; for (U32 j = 0; j < name_map.bucket_count; j += 1, bucket += 1){ if (bucket->node_count > 0){ str8_list_pushf(arena, &dump, " bucket[%u]:\n", j); - RADDBG_NameMapNode *node = name_map.nodes + bucket->first_node; - RADDBG_NameMapNode *node_opl = node + bucket->node_count; + RADDBGI_NameMapNode *node = name_map.nodes + bucket->first_node; + RADDBGI_NameMapNode *node_opl = node + bucket->node_count; for (; node < node_opl; node += 1){ String8 string = {0}; - string.str = raddbg_string_from_idx(raddbg, node->string_idx, &string.size); + string.str = raddbgi_string_from_idx(raddbg, node->string_idx, &string.size); str8_list_pushf(arena, &dump, " match \"%.*s\": ", str8_varg(string)); if (node->match_count == 1){ str8_list_pushf(arena, &dump, "%u", node->match_idx_or_idx_run_first); } else{ - RADDBG_U32 idx_count = 0; - RADDBG_U32 *idx_run = - raddbg_idx_run_from_first_count(raddbg, node->match_idx_or_idx_run_first, - node->match_count, &idx_count); + RADDBGI_U32 idx_count = 0; + RADDBGI_U32 *idx_run = + raddbgi_idx_run_from_first_count(raddbg, node->match_idx_or_idx_run_first, + node->match_count, &idx_count); if (idx_count > 0){ - RADDBG_U32 last = idx_count - 1; + RADDBGI_U32 last = idx_count - 1; for (U32 k = 0; k < last; k += 1){ str8_list_pushf(arena, &dump, "%u, ", idx_run[k]); } diff --git a/src/raddbgi_dump/raddbgi_dump.h b/src/raddbgi_dump/raddbgi_dump.h index 62ca2ce4..e791ff40 100644 --- a/src/raddbgi_dump/raddbgi_dump.h +++ b/src/raddbgi_dump/raddbgi_dump.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_DUMP_H -#define RADDBG_DUMP_H +#ifndef RADDBGI_DUMP_H +#define RADDBGI_DUMP_H //////////////////////////////// //~ Program Parameters Type @@ -42,4 +42,4 @@ typedef struct DUMP_Params{ static DUMP_Params *dump_params_from_cmd_line(Arena *arena, CmdLine *cmdline); -#endif //RADDBG_DUMP_H +#endif //RADDBGI_DUMP_H diff --git a/src/raddbgi_dump/raddbgi_stringize.c b/src/raddbgi_dump/raddbgi_stringize.c index 6bc06597..a2ef8976 100644 --- a/src/raddbgi_dump/raddbgi_stringize.c +++ b/src/raddbgi_dump/raddbgi_stringize.c @@ -5,12 +5,12 @@ //~ RADDBG Common Stringize Functions static String8 -raddbg_string_from_data_section_tag(RADDBG_DataSectionTag tag){ +raddbgi_string_from_data_section_tag(RADDBGI_DataSectionTag tag){ String8 result = {0}; switch (tag){ #define X(N,C) case C: result = str8_lit(#N); break; #define Y(N) - RADDBG_DataSectionTagXList(X,Y) + RADDBGI_DataSectionTagXList(X,Y) #undef X #undef Y } @@ -18,36 +18,36 @@ raddbg_string_from_data_section_tag(RADDBG_DataSectionTag tag){ } static String8 -raddbg_string_from_arch(RADDBG_Arch arch){ +raddbgi_string_from_arch(RADDBGI_Arch arch){ String8 result = {0}; switch (arch){ default: result = str8_lit(""); break; - case RADDBG_Arch_X86: result = str8_lit("x86"); break; - case RADDBG_Arch_X64: result = str8_lit("x64"); break; + case RADDBGI_Arch_X86: result = str8_lit("x86"); break; + case RADDBGI_Arch_X64: result = str8_lit("x64"); break; } return(result); } static String8 -raddbg_string_from_language(RADDBG_Language language){ +raddbgi_string_from_language(RADDBGI_Language language){ String8 result = {0}; switch (language){ #define X(name,code) case code: result = str8_lit(#name); break; - RADDBG_LanguageXList(X) + RADDBGI_LanguageXList(X) #undef X } return(result); } static String8 -raddbg_string_from_type_kind(RADDBG_TypeKind type_kind){ +raddbgi_string_from_type_kind(RADDBGI_TypeKind type_kind){ String8 result = {0}; switch (type_kind){ default: result = str8_lit(""); break; #define X(name,code) case code: result = str8_lit(#name); break; #define XZ(name,code,size) X(name,code) #define Y(a,n) - RADDBG_TypeKindXList(X,XZ,Y) + RADDBGI_TypeKindXList(X,XZ,Y) #undef X #undef XZ #undef Y @@ -56,24 +56,24 @@ raddbg_string_from_type_kind(RADDBG_TypeKind type_kind){ } static String8 -raddbg_string_from_member_kind(RADDBG_MemberKind member_kind){ +raddbgi_string_from_member_kind(RADDBGI_MemberKind member_kind){ String8 result = {0}; switch (member_kind){ default: result = str8_lit(""); break; #define X(N,C) case C: result = str8_lit(#N); break; - RADDBG_MemberKindXList(X) + RADDBGI_MemberKindXList(X) #undef X } return(result); } static String8 -raddbg_string_from_local_kind(RADDBG_LocalKind local_kind){ +raddbgi_string_from_local_kind(RADDBGI_LocalKind local_kind){ String8 result = {0}; switch (local_kind){ default: result = str8_lit(""); break; - case RADDBG_LocalKind_Parameter: result = str8_lit("Parameter"); break; - case RADDBG_LocalKind_Variable: result = str8_lit("Variable"); break; + case RADDBGI_LocalKind_Parameter: result = str8_lit("Parameter"); break; + case RADDBGI_LocalKind_Variable: result = str8_lit("Variable"); break; } return(result); } @@ -83,59 +83,59 @@ raddbg_string_from_local_kind(RADDBG_LocalKind local_kind){ //~ RADDBG Flags Stringize Functions static void -raddbg_stringize_binary_section_flags(Arena *arena, String8List *out, - RADDBG_BinarySectionFlags flags){ +raddbgi_stringize_binary_section_flags(Arena *arena, String8List *out, + RADDBGI_BinarySectionFlags flags){ if (flags == 0){ str8_list_push(arena, out, str8_lit("0")); } - if (flags & RADDBG_BinarySectionFlag_Read){ + if (flags & RADDBGI_BinarySectionFlag_Read){ str8_list_push(arena, out, str8_lit("Read ")); } - if (flags & RADDBG_BinarySectionFlag_Write){ + if (flags & RADDBGI_BinarySectionFlag_Write){ str8_list_push(arena, out, str8_lit("Write ")); } - if (flags & RADDBG_BinarySectionFlag_Execute){ + if (flags & RADDBGI_BinarySectionFlag_Execute){ str8_list_push(arena, out, str8_lit("Execute ")); } } static void -raddbg_stringize_type_modifier_flags(Arena *arena, String8List *out, - RADDBG_TypeModifierFlags flags){ +raddbgi_stringize_type_modifier_flags(Arena *arena, String8List *out, + RADDBGI_TypeModifierFlags flags){ if (flags == 0){ str8_list_push(arena, out, str8_lit("0")); } - if (flags & RADDBG_TypeModifierFlag_Const){ + if (flags & RADDBGI_TypeModifierFlag_Const){ str8_list_push(arena, out, str8_lit("Const ")); } - if (flags & RADDBG_TypeModifierFlag_Volatile){ + if (flags & RADDBGI_TypeModifierFlag_Volatile){ str8_list_push(arena, out, str8_lit("Volatile ")); } } static void -raddbg_stringize_user_defined_type_flags(Arena *arena, String8List *out, - RADDBG_UserDefinedTypeFlags flags){ +raddbgi_stringize_user_defined_type_flags(Arena *arena, String8List *out, + RADDBGI_UserDefinedTypeFlags flags){ if (flags == 0){ str8_list_push(arena, out, str8_lit("0")); } - if (flags & RADDBG_UserDefinedTypeFlag_EnumMembers){ + if (flags & RADDBGI_UserDefinedTypeFlag_EnumMembers){ str8_list_push(arena, out, str8_lit("EnumMembers ")); } } static void -raddbg_stringize_link_flags(Arena *arena, String8List *out, RADDBG_LinkFlags flags){ +raddbgi_stringize_link_flags(Arena *arena, String8List *out, RADDBGI_LinkFlags flags){ if (flags == 0){ str8_list_push(arena, out, str8_lit("0")); } - if (flags & RADDBG_LinkFlag_External){ + if (flags & RADDBGI_LinkFlag_External){ str8_list_push(arena, out, str8_lit("External ")); } - if (flags & RADDBG_LinkFlag_TypeScoped){ + if (flags & RADDBGI_LinkFlag_TypeScoped){ str8_list_push(arena, out, str8_lit("TypeScoped ")); } - if (flags & RADDBG_LinkFlag_ProcScoped){ + if (flags & RADDBGI_LinkFlag_ProcScoped){ str8_list_push(arena, out, str8_lit("ProcScoped ")); } } @@ -144,82 +144,82 @@ raddbg_stringize_link_flags(Arena *arena, String8List *out, RADDBG_LinkFlags fla //////////////////////////////// //~ RADDBG Compound Stringize Functions -static char raddbg_stringize_spaces[] = " "; +static char raddbgi_stringize_spaces[] = " "; static void -raddbg_stringize_data_sections(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - U32 indent_level){ +raddbgi_stringize_data_sections(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + U32 indent_level){ U64 data_section_count = parsed->dsec_count; - RADDBG_DataSection *ptr = parsed->dsecs; + RADDBGI_DataSection *ptr = parsed->dsecs; for (U64 i = 0; i < data_section_count; i += 1, ptr += 1){ - String8 tag_str = raddbg_string_from_data_section_tag(ptr->tag); + String8 tag_str = raddbgi_string_from_data_section_tag(ptr->tag); str8_list_pushf(arena, out, "%.*sdata_section[%5u] = {0x%08llx, %7u, %7u} %.*s\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, i, ptr->off, ptr->encoded_size, ptr->unpacked_size, str8_varg(tag_str)); } } static void -raddbg_stringize_top_level_info(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_TopLevelInfo *tli, U32 indent_level){ - String8 arch_str = raddbg_string_from_arch(tli->architecture); +raddbgi_stringize_top_level_info(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_TopLevelInfo *tli, U32 indent_level){ + String8 arch_str = raddbgi_string_from_arch(tli->architecture); String8 exe_name = {0}; - exe_name.str = raddbg_string_from_idx(parsed, tli->exe_name_string_idx, &exe_name.size); + exe_name.str = raddbgi_string_from_idx(parsed, tli->exe_name_string_idx, &exe_name.size); str8_list_pushf(arena, out, "%.*sarchitecture=%.*s\n", - indent_level, raddbg_stringize_spaces, str8_varg(arch_str)); + indent_level, raddbgi_stringize_spaces, str8_varg(arch_str)); str8_list_pushf(arena, out, "%.*sexe_name='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(exe_name)); + indent_level, raddbgi_stringize_spaces, str8_varg(exe_name)); str8_list_pushf(arena, out, "%.*svoff_max=0x%08llx\n", - indent_level, raddbg_stringize_spaces, tli->voff_max); + indent_level, raddbgi_stringize_spaces, tli->voff_max); } static void -raddbg_stringize_binary_section(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_BinarySection *bin_section, U32 indent_level){ +raddbgi_stringize_binary_section(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_BinarySection *bin_section, U32 indent_level){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, bin_section->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, bin_section->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(name)); + indent_level, raddbgi_stringize_spaces, str8_varg(name)); - str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbg_stringize_spaces); - raddbg_stringize_binary_section_flags(arena, out, bin_section->flags); + str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbgi_stringize_spaces); + raddbgi_stringize_binary_section_flags(arena, out, bin_section->flags); str8_list_pushf(arena, out, "\n"); str8_list_pushf(arena, out, "%.*svoff_first=0x%08x\n", - indent_level, raddbg_stringize_spaces, bin_section->voff_first); + indent_level, raddbgi_stringize_spaces, bin_section->voff_first); str8_list_pushf(arena, out, "%.*svoff_opl =0x%08x\n", - indent_level, raddbg_stringize_spaces, bin_section->voff_opl); + indent_level, raddbgi_stringize_spaces, bin_section->voff_opl); str8_list_pushf(arena, out, "%.*sfoff_first=0x%08x\n", - indent_level, raddbg_stringize_spaces, bin_section->foff_first); + indent_level, raddbgi_stringize_spaces, bin_section->foff_first); str8_list_pushf(arena, out, "%.*sfoff_opl =0x%08x\n", - indent_level, raddbg_stringize_spaces, bin_section->foff_opl); + indent_level, raddbgi_stringize_spaces, bin_section->foff_opl); } static void -raddbg_stringize_file_path(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_FilePathBundle *bundle, RADDBG_FilePathNode *file_path, - U32 indent_level){ +raddbgi_stringize_file_path(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_FilePathBundle *bundle, RADDBGI_FilePathNode *file_path, + U32 indent_level){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, file_path->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, file_path->name_string_idx, &name.size); U32 this_idx = (U32)(file_path - bundle->file_paths); if (file_path->source_file_idx == 0){ str8_list_pushf(arena, out, "%.*s[%u] '%.*s'\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, this_idx, str8_varg(name)); } else{ str8_list_pushf(arena, out, "%.*s[%u] '%.*s'; source_file=%u\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, this_idx, str8_varg(name), file_path->source_file_idx); } for (U32 child = file_path->first_child; child != 0;){ // get node for child - RADDBG_FilePathNode *child_node = 0; + RADDBGI_FilePathNode *child_node = 0; if (child < bundle->file_path_count){ child_node = bundle->file_paths + child; } @@ -228,7 +228,7 @@ raddbg_stringize_file_path(Arena *arena, String8List *out, RADDBG_Parsed *parsed } // stringize child - raddbg_stringize_file_path(arena, out, parsed, bundle, child_node, indent_level + 1); + raddbgi_stringize_file_path(arena, out, parsed, bundle, child_node, indent_level + 1); // increment iterator child = child_node->next_sibling; @@ -236,14 +236,14 @@ raddbg_stringize_file_path(Arena *arena, String8List *out, RADDBG_Parsed *parsed } static void -raddbg_stringize_source_file(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_SourceFile *source_file, U32 indent_level){ +raddbgi_stringize_source_file(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_SourceFile *source_file, U32 indent_level){ // extract line map data - RADDBG_ParsedLineMap line_map = {0}; - raddbg_line_map_from_source_file(parsed, source_file, &line_map); + RADDBGI_ParsedLineMap line_map = {0}; + raddbgi_line_map_from_source_file(parsed, source_file, &line_map); // stringize line map data - str8_list_pushf(arena, out, "%.*slines:\n", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*slines:\n", indent_level, raddbgi_stringize_spaces); for (U32 i = 0; i < line_map.count; i += 1){ U32 line_num = line_map.nums[i]; @@ -261,7 +261,7 @@ raddbg_stringize_source_file(Arena *arena, String8List *out, RADDBG_Parsed *pars } str8_list_pushf(arena, out, "%.*s %u: ", - indent_level, raddbg_stringize_spaces, line_num); + indent_level, raddbgi_stringize_spaces, line_num); U32 first = line_map.ranges[i]; U32 opl_raw = line_map.ranges[i + 1]; @@ -272,7 +272,7 @@ raddbg_stringize_source_file(Arena *arena, String8List *out, RADDBG_Parsed *pars } else{ str8_list_pushf(arena, out, "%.*s0x%08x\n", - indent_level + digit_count + 3, raddbg_stringize_spaces, + indent_level + digit_count + 3, raddbgi_stringize_spaces, line_map.voffs[j]); } } @@ -280,57 +280,57 @@ raddbg_stringize_source_file(Arena *arena, String8List *out, RADDBG_Parsed *pars } static void -raddbg_stringize_unit(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_Unit *unit, U32 indent_level){ +raddbgi_stringize_unit(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_Unit *unit, U32 indent_level){ String8 unit_name = {0}; - unit_name.str = raddbg_string_from_idx(parsed, unit->unit_name_string_idx, &unit_name.size); + unit_name.str = raddbgi_string_from_idx(parsed, unit->unit_name_string_idx, &unit_name.size); String8 compiler_name = {0}; - compiler_name.str = raddbg_string_from_idx(parsed, unit->compiler_name_string_idx, - &compiler_name.size); + compiler_name.str = raddbgi_string_from_idx(parsed, unit->compiler_name_string_idx, + &compiler_name.size); str8_list_pushf(arena, out, "%.*sunit_name='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(unit_name)); + indent_level, raddbgi_stringize_spaces, str8_varg(unit_name)); str8_list_pushf(arena, out, "%.*scompiler_name='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(compiler_name)); + indent_level, raddbgi_stringize_spaces, str8_varg(compiler_name)); str8_list_pushf(arena, out, "%.*ssource_file_path=%u\n", - indent_level, raddbg_stringize_spaces, unit->source_file_path_node); + indent_level, raddbgi_stringize_spaces, unit->source_file_path_node); str8_list_pushf(arena, out, "%.*sobject_file_path=%u\n", - indent_level, raddbg_stringize_spaces, unit->object_file_path_node); + indent_level, raddbgi_stringize_spaces, unit->object_file_path_node); str8_list_pushf(arena, out, "%.*sarchive_file_path=%u\n", - indent_level, raddbg_stringize_spaces, unit->archive_file_path_node); + indent_level, raddbgi_stringize_spaces, unit->archive_file_path_node); str8_list_pushf(arena, out, "%.*sbuild_path=%u\n", - indent_level, raddbg_stringize_spaces, unit->build_path_node); + indent_level, raddbgi_stringize_spaces, unit->build_path_node); - String8 language_str = raddbg_string_from_language(unit->language); + String8 language_str = raddbgi_string_from_language(unit->language); str8_list_pushf(arena, out, "%.*slanguage=%.*s\n", - indent_level, raddbg_stringize_spaces, str8_varg(language_str)); + indent_level, raddbgi_stringize_spaces, str8_varg(language_str)); // extract line info data - RADDBG_ParsedLineInfo line_info = {0}; - raddbg_line_info_from_unit(parsed, unit, &line_info); + RADDBGI_ParsedLineInfo line_info = {0}; + raddbgi_line_info_from_unit(parsed, unit, &line_info); // stringize line info - str8_list_pushf(arena, out, "%.*slines:\n", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*slines:\n", indent_level, raddbgi_stringize_spaces); for (U32 i = 0; i < line_info.count; i += 1){ U64 first = line_info.voffs[i]; U64 opl = line_info.voffs[i + 1]; - RADDBG_Line *line = line_info.lines + i; - RADDBG_Column *col = 0; + RADDBGI_Line *line = line_info.lines + i; + RADDBGI_Column *col = 0; if (i < line_info.col_count){ col = line_info.cols + i; } if (col == 0){ str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, first, opl, line->file_idx, line->line_num); } else{ str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u; columns=[%u,%u)\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, first, opl, line->file_idx, line->line_num, col->col_first, col->col_opl); } @@ -338,19 +338,19 @@ raddbg_stringize_unit(Arena *arena, String8List *out, RADDBG_Parsed *parsed, } static void -raddbg_stringize_type_node(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_TypeNode *type, U32 indent_level){ - RADDBG_TypeKind kind = type->kind; - String8 type_kind_str = raddbg_string_from_type_kind(kind); +raddbgi_stringize_type_node(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_TypeNode *type, U32 indent_level){ + RADDBGI_TypeKind kind = type->kind; + String8 type_kind_str = raddbgi_string_from_type_kind(kind); str8_list_pushf(arena, out, "%.*skind=%.*s\n", - indent_level, raddbg_stringize_spaces, str8_varg(type_kind_str)); + indent_level, raddbgi_stringize_spaces, str8_varg(type_kind_str)); switch (type->kind){ - case RADDBG_TypeKind_Modifier: + case RADDBGI_TypeKind_Modifier: { - str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbg_stringize_spaces); - raddbg_stringize_type_modifier_flags(arena, out, type->flags); + str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbgi_stringize_spaces); + raddbgi_stringize_type_modifier_flags(arena, out, type->flags); str8_list_push(arena, out, str8_lit("\n")); }break; @@ -358,42 +358,42 @@ raddbg_stringize_type_node(Arena *arena, String8List *out, RADDBG_Parsed *parsed { if (type->flags != 0){ str8_list_pushf(arena, out, "%.*sflags=%x (missing stringizer path)", - indent_level, raddbg_stringize_spaces, type->flags); + indent_level, raddbgi_stringize_spaces, type->flags); } }break; } str8_list_pushf(arena, out, "%.*sbyte_size=%u\n", - indent_level, raddbg_stringize_spaces, type->byte_size); + indent_level, raddbgi_stringize_spaces, type->byte_size); - if (RADDBG_TypeKind_FirstBuiltIn <= kind && - kind <= RADDBG_TypeKind_LastBuiltIn){ + if (RADDBGI_TypeKind_FirstBuiltIn <= kind && + kind <= RADDBGI_TypeKind_LastBuiltIn){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, type->built_in.name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, type->built_in.name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sbuilt_in.name='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(name)); + indent_level, raddbgi_stringize_spaces, str8_varg(name)); } - else if (RADDBG_TypeKind_FirstConstructed <= kind && - kind <= RADDBG_TypeKind_LastConstructed){ + else if (RADDBGI_TypeKind_FirstConstructed <= kind && + kind <= RADDBGI_TypeKind_LastConstructed){ str8_list_pushf(arena, out, "%.*sconstructed.direct_type=%u\n", - indent_level, raddbg_stringize_spaces, type->constructed.direct_type_idx); + indent_level, raddbgi_stringize_spaces, type->constructed.direct_type_idx); - if (type->kind == RADDBG_TypeKind_Array){ + if (type->kind == RADDBGI_TypeKind_Array){ str8_list_pushf(arena, out, "%.*sconstructed.array_count=%u\n", - indent_level, raddbg_stringize_spaces, type->constructed.count); + indent_level, raddbgi_stringize_spaces, type->constructed.count); } - if (type->kind == RADDBG_TypeKind_Function || - type->kind == RADDBG_TypeKind_Method){ + if (type->kind == RADDBGI_TypeKind_Function || + type->kind == RADDBGI_TypeKind_Method){ U32 run_first = type->constructed.param_idx_run_first; U32 run_count_raw = type->constructed.count; U32 run_count = 0; - U32 *run = raddbg_idx_run_from_first_count(parsed, run_first, run_count_raw, &run_count); + U32 *run = raddbgi_idx_run_from_first_count(parsed, run_first, run_count_raw, &run_count); U32 this_type_idx = 0; - if (run_count > 0 && type->kind == RADDBG_TypeKind_Method){ + if (run_count > 0 && type->kind == RADDBGI_TypeKind_Method){ this_type_idx = run[0]; run += 1; run_count -= 1; @@ -401,11 +401,11 @@ raddbg_stringize_type_node(Arena *arena, String8List *out, RADDBG_Parsed *parsed if (this_type_idx != 0){ str8_list_pushf(arena, out, "%.*sconstructed.this_type=%u\n", - indent_level, raddbg_stringize_spaces, this_type_idx); + indent_level, raddbgi_stringize_spaces, this_type_idx); } str8_list_pushf(arena, out, "%.*sconstructed.params={", - indent_level, raddbg_stringize_spaces); + indent_level, raddbgi_stringize_spaces); if (run_count > 0){ U32 last = run_count - 1; @@ -419,63 +419,63 @@ raddbg_stringize_type_node(Arena *arena, String8List *out, RADDBG_Parsed *parsed } } - else if (RADDBG_TypeKind_FirstUserDefined <= kind && - kind <= RADDBG_TypeKind_LastUserDefined){ + else if (RADDBGI_TypeKind_FirstUserDefined <= kind && + kind <= RADDBGI_TypeKind_LastUserDefined){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, type->user_defined.name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, type->user_defined.name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*suser_defined.name='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(name)); + indent_level, raddbgi_stringize_spaces, str8_varg(name)); str8_list_pushf(arena, out, "%.*suser_defined.direct_type=%u\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, type->user_defined.direct_type_idx); str8_list_pushf(arena, out, "%.*suser_defined.udt=%u\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, type->user_defined.udt_idx); } - else if (kind == RADDBG_TypeKind_Bitfield){ + else if (kind == RADDBGI_TypeKind_Bitfield){ str8_list_pushf(arena, out, "%.*sbitfield.off=%u\n", - indent_level, raddbg_stringize_spaces, type->bitfield.off); + indent_level, raddbgi_stringize_spaces, type->bitfield.off); str8_list_pushf(arena, out, "%.*sbitfield.size=%u\n", - indent_level, raddbg_stringize_spaces, type->bitfield.size); + indent_level, raddbgi_stringize_spaces, type->bitfield.size); } } static void -raddbg_stringize_udt(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_UDTMemberBundle *member_bundle, RADDBG_UDT *udt, - U32 indent_level){ +raddbgi_stringize_udt(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_UDTMemberBundle *member_bundle, RADDBGI_UDT *udt, + U32 indent_level){ str8_list_pushf(arena, out, "%.*sself_type=%u\n", - indent_level, raddbg_stringize_spaces, udt->self_type_idx); + indent_level, raddbgi_stringize_spaces, udt->self_type_idx); - str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbg_stringize_spaces); - raddbg_stringize_user_defined_type_flags(arena, out, udt->flags); + str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbgi_stringize_spaces); + raddbgi_stringize_user_defined_type_flags(arena, out, udt->flags); str8_list_push(arena, out, str8_lit("\n")); if (udt->file_idx != 0){ str8_list_pushf(arena, out, "%.*sloc={file=%u; line=%u; col=%u}\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, udt->file_idx, udt->line, udt->col); } // enum members - if (udt->flags & RADDBG_UserDefinedTypeFlag_EnumMembers){ + if (udt->flags & RADDBGI_UserDefinedTypeFlag_EnumMembers){ U32 first_raw = udt->member_first; U32 opl_raw = first_raw + udt->member_count; U32 opl = ClampTop(opl_raw, member_bundle->enum_member_count); U32 first = ClampTop(first_raw, opl); if (first < opl){ - str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, raddbg_stringize_spaces); - RADDBG_EnumMember *enum_member = member_bundle->enum_members + first; + str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, raddbgi_stringize_spaces); + RADDBGI_EnumMember *enum_member = member_bundle->enum_members + first; for (U32 i = first; i < opl; i += 1, enum_member += 1){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, enum_member->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, enum_member->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*s '%.*s' %llu\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, str8_varg(name), enum_member->val); } - str8_list_pushf(arena, out, "%.*s}\n", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*s}\n", indent_level, raddbgi_stringize_spaces); } } @@ -487,117 +487,117 @@ raddbg_stringize_udt(Arena *arena, String8List *out, RADDBG_Parsed *parsed, U32 first = ClampTop(first_raw, opl); if (first < opl){ - str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, raddbg_stringize_spaces); - RADDBG_Member *member = member_bundle->members + first; + str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, raddbgi_stringize_spaces); + RADDBGI_Member *member = member_bundle->members + first; for (U32 i = first; i < opl; i += 1, member += 1){ - str8_list_pushf(arena, out, "%.*s {\n", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*s {\n", indent_level, raddbgi_stringize_spaces); - String8 kind_str = raddbg_string_from_member_kind(member->kind); + String8 kind_str = raddbgi_string_from_member_kind(member->kind); str8_list_pushf(arena, out, "%.*s kind=%.*s\n", - indent_level, raddbg_stringize_spaces, str8_varg(kind_str)); + indent_level, raddbgi_stringize_spaces, str8_varg(kind_str)); if (member->name_string_idx != 0){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, member->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, member->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*s name='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(name)); + indent_level, raddbgi_stringize_spaces, str8_varg(name)); } str8_list_pushf(arena, out, "%.*s type=%u\n", - indent_level, raddbg_stringize_spaces, member->type_idx); + indent_level, raddbgi_stringize_spaces, member->type_idx); str8_list_pushf(arena, out, "%.*s off=%u\n", - indent_level, raddbg_stringize_spaces, member->off); + indent_level, raddbgi_stringize_spaces, member->off); - str8_list_pushf(arena, out, "%.*s }\n", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*s }\n", indent_level, raddbgi_stringize_spaces); } - str8_list_pushf(arena, out, "%.*s}\n", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*s}\n", indent_level, raddbgi_stringize_spaces); } } } static void -raddbg_stringize_global_variable(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_GlobalVariable *global_variable, U32 indent_level){ +raddbgi_stringize_global_variable(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_GlobalVariable *global_variable, U32 indent_level){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, global_variable->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, global_variable->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(name)); + indent_level, raddbgi_stringize_spaces, str8_varg(name)); - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbg_stringize_spaces); - raddbg_stringize_link_flags(arena, out, global_variable->link_flags); + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbgi_stringize_spaces); + raddbgi_stringize_link_flags(arena, out, global_variable->link_flags); str8_list_push(arena, out, str8_lit("\n")); str8_list_pushf(arena, out, "%.*svoff=0x%08llx\n", - indent_level, raddbg_stringize_spaces, global_variable->voff); + indent_level, raddbgi_stringize_spaces, global_variable->voff); str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, raddbg_stringize_spaces, global_variable->type_idx); + indent_level, raddbgi_stringize_spaces, global_variable->type_idx); str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, raddbg_stringize_spaces, global_variable->container_idx); + indent_level, raddbgi_stringize_spaces, global_variable->container_idx); } static void -raddbg_stringize_thread_variable(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_ThreadVariable *thread_var, - U32 indent_level){ +raddbgi_stringize_thread_variable(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_ThreadVariable *thread_var, + U32 indent_level){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, thread_var->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, thread_var->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(name)); + indent_level, raddbgi_stringize_spaces, str8_varg(name)); - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbg_stringize_spaces); - raddbg_stringize_link_flags(arena, out, thread_var->link_flags); + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbgi_stringize_spaces); + raddbgi_stringize_link_flags(arena, out, thread_var->link_flags); str8_list_push(arena, out, str8_lit("\n")); str8_list_pushf(arena, out, "%.*stls_off=0x%08x\n", - indent_level, raddbg_stringize_spaces, thread_var->tls_off); + indent_level, raddbgi_stringize_spaces, thread_var->tls_off); str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, raddbg_stringize_spaces, thread_var->type_idx); + indent_level, raddbgi_stringize_spaces, thread_var->type_idx); str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, raddbg_stringize_spaces, thread_var->container_idx); + indent_level, raddbgi_stringize_spaces, thread_var->container_idx); } static void -raddbg_stringize_procedure(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_Procedure *proc, U32 indent_level){ +raddbgi_stringize_procedure(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_Procedure *proc, U32 indent_level){ String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, proc->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, proc->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(name)); + indent_level, raddbgi_stringize_spaces, str8_varg(name)); String8 link_name = {0}; - link_name.str = raddbg_string_from_idx(parsed, proc->link_name_string_idx, &link_name.size); + link_name.str = raddbgi_string_from_idx(parsed, proc->link_name_string_idx, &link_name.size); str8_list_pushf(arena, out, "%.*slink_name='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(link_name)); + indent_level, raddbgi_stringize_spaces, str8_varg(link_name)); - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbg_stringize_spaces); - raddbg_stringize_link_flags(arena, out, proc->link_flags); + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbgi_stringize_spaces); + raddbgi_stringize_link_flags(arena, out, proc->link_flags); str8_list_push(arena, out, str8_lit("\n")); str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, raddbg_stringize_spaces, proc->type_idx); + indent_level, raddbgi_stringize_spaces, proc->type_idx); str8_list_pushf(arena, out, "%.*sroot_scope_idx=%u\n", - indent_level, raddbg_stringize_spaces, proc->root_scope_idx); + indent_level, raddbgi_stringize_spaces, proc->root_scope_idx); str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, raddbg_stringize_spaces, proc->container_idx); + indent_level, raddbgi_stringize_spaces, proc->container_idx); } static void -raddbg_stringize_scope(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_ScopeBundle *bundle, RADDBG_Scope *scope, U32 indent_level){ +raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_ScopeBundle *bundle, RADDBGI_Scope *scope, U32 indent_level){ U32 this_idx = (U32)(scope - bundle->scopes); str8_list_pushf(arena, out, "%.*s[%u]\n", - indent_level, raddbg_stringize_spaces, this_idx); + indent_level, raddbgi_stringize_spaces, this_idx); str8_list_pushf(arena, out, "%.*s proc_idx=%u\n", - indent_level, raddbg_stringize_spaces, scope->proc_idx); + indent_level, raddbgi_stringize_spaces, scope->proc_idx); // voff ranges { @@ -614,18 +614,18 @@ raddbg_stringize_scope(Arena *arena, String8List *out, RADDBG_Parsed *parsed, if (voff_range_opl - voff_range_first > 2){ str8_list_pushf(arena, out, "%.*s voff_ranges={\n", - indent_level, raddbg_stringize_spaces); + indent_level, raddbgi_stringize_spaces); for (U32 i = voff_range_first; i < voff_range_opl; i += 2, voff_ptr += 2){ str8_list_pushf(arena, out, "%.*s [0x%08llx, 0x%08llx)\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, voff_ptr[0], voff_ptr[1]); } str8_list_pushf(arena, out, "%.*s }\n", - indent_level, raddbg_stringize_spaces); + indent_level, raddbgi_stringize_spaces); } else if (voff_range_opl - voff_range_first == 2){ str8_list_pushf(arena, out, "%.*s voff_range=[0x%08llx, 0x%08llx)\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, voff_ptr[0], voff_ptr[1]); } } @@ -637,60 +637,60 @@ raddbg_stringize_scope(Arena *arena, String8List *out, RADDBG_Parsed *parsed, U32 local_opl = ClampTop(local_opl_raw, bundle->local_count); if (local_first < local_opl){ - RADDBG_Local *local_ptr = bundle->locals + local_first; + RADDBGI_Local *local_ptr = bundle->locals + local_first; for (U32 i = local_first; i < local_opl; i += 1, local_ptr += 1){ str8_list_pushf(arena, out, "%.*s local[%u]\n", - indent_level, raddbg_stringize_spaces, i); + indent_level, raddbgi_stringize_spaces, i); - String8 local_kind_str = raddbg_string_from_local_kind(local_ptr->kind); + String8 local_kind_str = raddbgi_string_from_local_kind(local_ptr->kind); str8_list_pushf(arena, out, "%.*s kind=%.*s\n", - indent_level, raddbg_stringize_spaces, str8_varg(local_kind_str)); + indent_level, raddbgi_stringize_spaces, str8_varg(local_kind_str)); String8 name = {0}; - name.str = raddbg_string_from_idx(parsed, local_ptr->name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(parsed, local_ptr->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*s name='%.*s'\n", - indent_level, raddbg_stringize_spaces, str8_varg(name)); + indent_level, raddbgi_stringize_spaces, str8_varg(name)); str8_list_pushf(arena, out, "%.*s type_idx=%u\n", - indent_level, raddbg_stringize_spaces, local_ptr->type_idx); + indent_level, raddbgi_stringize_spaces, local_ptr->type_idx); U32 location_first = local_ptr->location_first; U32 location_opl_raw = local_ptr->location_opl; U32 location_opl = ClampTop(location_opl_raw, bundle->location_block_count); if (location_first < location_opl){ - str8_list_pushf(arena, out, "%.*s locations:\n", indent_level, raddbg_stringize_spaces); - RADDBG_LocationBlock *block_ptr = bundle->location_blocks + location_first; + str8_list_pushf(arena, out, "%.*s locations:\n", indent_level, raddbgi_stringize_spaces); + RADDBGI_LocationBlock *block_ptr = bundle->location_blocks + location_first; for (U32 j = location_first; j < location_opl; j += 1, block_ptr += 1){ if (block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32){ - str8_list_pushf(arena, out, "%.*s case *always*:\n", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*s case *always*:\n", indent_level, raddbgi_stringize_spaces); } else{ str8_list_pushf(arena, out, "%.*s case [0x%08x, 0x%08x):\n", - indent_level, raddbg_stringize_spaces, + indent_level, raddbgi_stringize_spaces, block_ptr->scope_off_first, block_ptr->scope_off_opl); } if (block_ptr->location_data_off >= bundle->location_data_size){ str8_list_pushf(arena, out, "%.*s \n", - indent_level, raddbg_stringize_spaces); + indent_level, raddbgi_stringize_spaces); } else{ - str8_list_pushf(arena, out, "%.*s ", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*s ", indent_level, raddbgi_stringize_spaces); U8 *loc_data_opl = bundle->location_data + bundle->location_data_size; U8 *loc_base_ptr = bundle->location_data + block_ptr->location_data_off; - RADDBG_LocationKind kind = (RADDBG_LocationKind)*loc_base_ptr; + RADDBGI_LocationKind kind = (RADDBGI_LocationKind)*loc_base_ptr; switch (kind){ default: { str8_list_pushf(arena, out, "\n"); }break; - case RADDBG_LocationKind_AddrBytecodeStream: + case RADDBGI_LocationKind_AddrBytecodeStream: { str8_list_pushf(arena, out, "AddrBytecodeStream\n"); - str8_list_pushf(arena, out, "%.*s ", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*s ", indent_level, raddbgi_stringize_spaces); U8 *bytecode_ptr = loc_base_ptr + 1; for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); @@ -698,10 +698,10 @@ raddbg_stringize_scope(Arena *arena, String8List *out, RADDBG_Parsed *parsed, str8_list_pushf(arena, out, "\n"); }break; - case RADDBG_LocationKind_ValBytecodeStream: + case RADDBGI_LocationKind_ValBytecodeStream: { str8_list_pushf(arena, out, "ValBytecodeStream\n"); - str8_list_pushf(arena, out, "%.*s ", indent_level, raddbg_stringize_spaces); + str8_list_pushf(arena, out, "%.*s ", indent_level, raddbgi_stringize_spaces); U8 *bytecode_ptr = loc_base_ptr + 1; for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); @@ -709,37 +709,37 @@ raddbg_stringize_scope(Arena *arena, String8List *out, RADDBG_Parsed *parsed, str8_list_pushf(arena, out, "\n"); }break; - case RADDBG_LocationKind_AddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrRegisterPlusU16: { - if (loc_base_ptr + sizeof(RADDBG_LocationRegisterPlusU16) > loc_data_opl){ + if (loc_base_ptr + sizeof(RADDBGI_LocationRegisterPlusU16) > loc_data_opl){ str8_list_pushf(arena, out, "AddrRegisterPlusU16( )\n"); } else{ - RADDBG_LocationRegisterPlusU16 *loc = (RADDBG_LocationRegisterPlusU16*)loc_base_ptr; + RADDBGI_LocationRegisterPlusU16 *loc = (RADDBGI_LocationRegisterPlusU16*)loc_base_ptr; str8_list_pushf(arena, out, "AddrRegisterPlusU16(reg: %u, off: %u)\n", loc->register_code, loc->offset); } }break; - case RADDBG_LocationKind_AddrAddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: { - if (loc_base_ptr + sizeof(RADDBG_LocationRegisterPlusU16) > loc_data_opl){ + if (loc_base_ptr + sizeof(RADDBGI_LocationRegisterPlusU16) > loc_data_opl){ str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16( )\n"); } else{ - RADDBG_LocationRegisterPlusU16 *loc = (RADDBG_LocationRegisterPlusU16*)loc_base_ptr; + RADDBGI_LocationRegisterPlusU16 *loc = (RADDBGI_LocationRegisterPlusU16*)loc_base_ptr; str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16(reg: %u, off: %u)\n", loc->register_code, loc->offset); } }break; - case RADDBG_LocationKind_ValRegister: + case RADDBGI_LocationKind_ValRegister: { - if (loc_base_ptr + sizeof(RADDBG_LocationRegister) > loc_data_opl){ + if (loc_base_ptr + sizeof(RADDBGI_LocationRegister) > loc_data_opl){ str8_list_pushf(arena, out, "ValRegister( )\n"); } else{ - RADDBG_LocationRegister *loc = (RADDBG_LocationRegister*)loc_base_ptr; + RADDBGI_LocationRegister *loc = (RADDBGI_LocationRegister*)loc_base_ptr; str8_list_pushf(arena, out, "ValRegister(reg: %u)\n", loc->register_code); } }break; @@ -756,7 +756,7 @@ raddbg_stringize_scope(Arena *arena, String8List *out, RADDBG_Parsed *parsed, for (U32 child = scope->first_child_scope_idx; child != 0;){ // get scope for child - RADDBG_Scope *child_scope = 0; + RADDBGI_Scope *child_scope = 0; if (child < bundle->scope_count){ child_scope = bundle->scopes + child; } @@ -765,12 +765,12 @@ raddbg_stringize_scope(Arena *arena, String8List *out, RADDBG_Parsed *parsed, } // stringize child - raddbg_stringize_scope(arena, out, parsed, bundle, child_scope, indent_level + 1); + raddbgi_stringize_scope(arena, out, parsed, bundle, child_scope, indent_level + 1); // increment iterator child = child_scope->next_sibling_scope_idx; } str8_list_pushf(arena, out, "%.*s[/%u]\n", - indent_level, raddbg_stringize_spaces, this_idx); + indent_level, raddbgi_stringize_spaces, this_idx); } diff --git a/src/raddbgi_dump/raddbgi_stringize.h b/src/raddbgi_dump/raddbgi_stringize.h index 6385b156..f1064c6e 100644 --- a/src/raddbgi_dump/raddbgi_stringize.h +++ b/src/raddbgi_dump/raddbgi_stringize.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_STRINGIZE_H -#define RADDBG_STRINGIZE_H +#ifndef RADDBGI_STRINGIZE_H +#define RADDBGI_STRINGIZE_H // TODO(allen): this depends on types from our base layer. // we need to decide if we want this to be included in the "format" layer @@ -13,108 +13,108 @@ //////////////////////////////// //~ RADDBG Stringize Helper Types -typedef struct RADDBG_FilePathBundle{ - RADDBG_FilePathNode *file_paths; +typedef struct RADDBGI_FilePathBundle{ + RADDBGI_FilePathNode *file_paths; U32 file_path_count; -} RADDBG_FilePathBundle; +} RADDBGI_FilePathBundle; -typedef struct RADDBG_UDTMemberBundle{ - RADDBG_Member *members; - RADDBG_EnumMember *enum_members; +typedef struct RADDBGI_UDTMemberBundle{ + RADDBGI_Member *members; + RADDBGI_EnumMember *enum_members; U32 member_count; U32 enum_member_count; -} RADDBG_UDTMemberBundle; +} RADDBGI_UDTMemberBundle; -typedef struct RADDBG_ScopeBundle{ - RADDBG_Scope *scopes; +typedef struct RADDBGI_ScopeBundle{ + RADDBGI_Scope *scopes; U64 *scope_voffs; - RADDBG_Local *locals; - RADDBG_LocationBlock *location_blocks; + RADDBGI_Local *locals; + RADDBGI_LocationBlock *location_blocks; U8 *location_data; U32 scope_count; U32 scope_voff_count; U32 local_count; U32 location_block_count; U32 location_data_size; -} RADDBG_ScopeBundle; +} RADDBGI_ScopeBundle; //////////////////////////////// //~ RADDBG Common Stringize Functions -static String8 raddbg_string_from_data_section_tag(RADDBG_DataSectionTag tag); -static String8 raddbg_string_from_arch(RADDBG_Arch arch); -static String8 raddbg_string_from_language(RADDBG_Language language); -static String8 raddbg_string_from_type_kind(RADDBG_TypeKind type_kind); -static String8 raddbg_string_from_member_kind(RADDBG_MemberKind member_kind); -static String8 raddbg_string_from_local_kind(RADDBG_LocalKind local_kind); +static String8 raddbgi_string_from_data_section_tag(RADDBGI_DataSectionTag tag); +static String8 raddbgi_string_from_arch(RADDBGI_Arch arch); +static String8 raddbgi_string_from_language(RADDBGI_Language language); +static String8 raddbgi_string_from_type_kind(RADDBGI_TypeKind type_kind); +static String8 raddbgi_string_from_member_kind(RADDBGI_MemberKind member_kind); +static String8 raddbgi_string_from_local_kind(RADDBGI_LocalKind local_kind); //////////////////////////////// //~ RADDBG Flags Stringize Functions -static void raddbg_stringize_binary_section_flags(Arena *arena, String8List *out, - RADDBG_BinarySectionFlags flags); +static void raddbgi_stringize_binary_section_flags(Arena *arena, String8List *out, + RADDBGI_BinarySectionFlags flags); -static void raddbg_stringize_type_modifier_flags(Arena *arena, String8List *out, - RADDBG_TypeModifierFlags flags); +static void raddbgi_stringize_type_modifier_flags(Arena *arena, String8List *out, + RADDBGI_TypeModifierFlags flags); -static void raddbg_stringize_user_defined_type_flags(Arena *arena, String8List *out, - RADDBG_UserDefinedTypeFlags flags); +static void raddbgi_stringize_user_defined_type_flags(Arena *arena, String8List *out, + RADDBGI_UserDefinedTypeFlags flags); -static void raddbg_stringize_link_flags(Arena *arena, String8List *out, - RADDBG_LinkFlags flags); +static void raddbgi_stringize_link_flags(Arena *arena, String8List *out, + RADDBGI_LinkFlags flags); //////////////////////////////// //~ RADDBG Compound Stringize Functions static void -raddbg_stringize_data_sections(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - U32 indent_level); +raddbgi_stringize_data_sections(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + U32 indent_level); static void -raddbg_stringize_top_level_info(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_TopLevelInfo *tli, U32 indent_level); +raddbgi_stringize_top_level_info(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_TopLevelInfo *tli, U32 indent_level); static void -raddbg_stringize_binary_section(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_BinarySection *bin_section, U32 indent_level); +raddbgi_stringize_binary_section(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_BinarySection *bin_section, U32 indent_level); static void -raddbg_stringize_file_path(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_FilePathBundle *bundle, RADDBG_FilePathNode *file_path, - U32 indent_level); +raddbgi_stringize_file_path(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_FilePathBundle *bundle, RADDBGI_FilePathNode *file_path, + U32 indent_level); static void -raddbg_stringize_source_file(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_SourceFile *source_file, U32 indent_level); +raddbgi_stringize_source_file(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_SourceFile *source_file, U32 indent_level); static void -raddbg_stringize_unit(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_Unit *unit, U32 indent_level); +raddbgi_stringize_unit(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_Unit *unit, U32 indent_level); static void -raddbg_stringize_type_node(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_TypeNode *type, U32 indent_level); +raddbgi_stringize_type_node(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_TypeNode *type, U32 indent_level); static void -raddbg_stringize_udt(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_UDTMemberBundle *bundle, RADDBG_UDT *udt, - U32 indent_level); +raddbgi_stringize_udt(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_UDTMemberBundle *bundle, RADDBGI_UDT *udt, + U32 indent_level); static void -raddbg_stringize_global_variable(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_GlobalVariable *global_variable, U32 indent_level); +raddbgi_stringize_global_variable(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_GlobalVariable *global_variable, U32 indent_level); static void -raddbg_stringize_thread_variable(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_ThreadVariable *thread_var, - U32 indent_level); +raddbgi_stringize_thread_variable(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_ThreadVariable *thread_var, + U32 indent_level); static void -raddbg_stringize_procedure(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_Procedure *proc, U32 indent_level); +raddbgi_stringize_procedure(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_Procedure *proc, U32 indent_level); static void -raddbg_stringize_scope(Arena *arena, String8List *out, RADDBG_Parsed *parsed, - RADDBG_ScopeBundle *bundle, RADDBG_Scope *scope, U32 indent_level); +raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, + RADDBGI_ScopeBundle *bundle, RADDBGI_Scope *scope, U32 indent_level); -#endif //RADDBG_STRINGIZE_H +#endif //RADDBGI_STRINGIZE_H diff --git a/src/raddbgi_format/raddbgi_format.c b/src/raddbgi_format/raddbgi_format.c index 10382bc4..50aa193d 100644 --- a/src/raddbgi_format/raddbgi_format.c +++ b/src/raddbgi_format/raddbgi_format.c @@ -4,24 +4,24 @@ //////////////////////////////// // Functions -RADDBG_PROC RADDBG_U64 -raddbg_hash(RADDBG_U8 *ptr, RADDBG_U64 size){ - RADDBG_U64 result = 5381; - RADDBG_U8 *opl = ptr + size; +RADDBGI_PROC RADDBGI_U64 +raddbgi_hash(RADDBGI_U8 *ptr, RADDBGI_U64 size){ + RADDBGI_U64 result = 5381; + RADDBGI_U8 *opl = ptr + size; for (; ptr < opl; ptr += 1){ result = ((result << 5) + result) + *ptr; } return(result); } -RADDBG_PROC RADDBG_U32 -raddbg_size_from_basic_type_kind(RADDBG_TypeKind kind){ - RADDBG_U32 result = 0; +RADDBGI_PROC RADDBGI_U32 +raddbgi_size_from_basic_type_kind(RADDBGI_TypeKind kind){ + RADDBGI_U32 result = 0; switch (kind){ #define X(N,C) #define XZ(N,C,Z) case C: result = Z; break; #define Y(A,N) - RADDBG_TypeKindXList(X,XZ,Y) + RADDBGI_TypeKindXList(X,XZ,Y) #undef X #undef XZ #undef Y @@ -29,12 +29,12 @@ raddbg_size_from_basic_type_kind(RADDBG_TypeKind kind){ return(result); } -RADDBG_PROC RADDBG_U32 -raddbg_addr_size_from_arch(RADDBG_Arch arch){ - RADDBG_U32 result = 0; +RADDBGI_PROC RADDBGI_U32 +raddbgi_addr_size_from_arch(RADDBGI_Arch arch){ + RADDBGI_U32 result = 0; switch (arch){ #define X(N,C,Z) case C: result = Z; break; - RADDBG_ArchXList(X) + RADDBGI_ArchXList(X) #undef X } return(result); @@ -42,14 +42,14 @@ raddbg_addr_size_from_arch(RADDBG_Arch arch){ //- eval helpers -RADDBG_PROC RADDBG_EvalConversionKind -raddbg_eval_conversion_rule(RADDBG_EvalTypeGroup in, RADDBG_EvalTypeGroup out){ - RADDBG_EvalConversionKind result = 0; +RADDBGI_PROC RADDBGI_EvalConversionKind +raddbgi_eval_conversion_rule(RADDBGI_EvalTypeGroup in, RADDBGI_EvalTypeGroup out){ + RADDBGI_EvalConversionKind result = 0; switch (in + (out << 8)){ -#define Y(i,o) case ((RADDBG_EvalTypeGroup_##i) + ((RADDBG_EvalTypeGroup_##o) << 8)): +#define Y(i,o) case ((RADDBGI_EvalTypeGroup_##i) + ((RADDBGI_EvalTypeGroup_##o) << 8)): #define Xb(c) -#define Xe(c) result = RADDBG_EvalConversionKind_##c; break; - RADDBG_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe) +#define Xe(c) result = RADDBGI_EvalConversionKind_##c; break; + RADDBGI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe) #undef Xe #undef Xb #undef Y @@ -57,38 +57,38 @@ raddbg_eval_conversion_rule(RADDBG_EvalTypeGroup in, RADDBG_EvalTypeGroup out){ return(result); } -RADDBG_PROC RADDBG_U8* -raddbg_eval_conversion_message(RADDBG_EvalConversionKind conversion_kind, RADDBG_U64 *lenout){ - RADDBG_U8 *result = 0; +RADDBGI_PROC RADDBGI_U8* +raddbgi_eval_conversion_message(RADDBGI_EvalConversionKind conversion_kind, RADDBGI_U64 *lenout){ + RADDBGI_U8 *result = 0; switch (conversion_kind){ #define X(N,msg) \ -case RADDBG_EvalConversionKind_##N: result = (RADDBG_U8*)msg; *lenout = sizeof(msg) - 1; break; - RADDBG_EvalConversionKindXList(X) +case RADDBGI_EvalConversionKind_##N: result = (RADDBGI_U8*)msg; *lenout = sizeof(msg) - 1; break; + RADDBGI_EvalConversionKindXList(X) #undef X } return(result); } -RADDBG_PROC RADDBG_S32 -raddbg_eval_opcode_type_compatible(RADDBG_EvalOp op, RADDBG_EvalTypeGroup group){ - RADDBG_S32 result = 0; +RADDBGI_PROC RADDBGI_S32 +raddbgi_eval_opcode_type_compatible(RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group){ + RADDBGI_S32 result = 0; switch (op){ - case RADDBG_EvalOp_Neg: case RADDBG_EvalOp_Add: case RADDBG_EvalOp_Sub: - case RADDBG_EvalOp_Mul: case RADDBG_EvalOp_Div: - case RADDBG_EvalOp_EqEq:case RADDBG_EvalOp_NtEq: - case RADDBG_EvalOp_LsEq:case RADDBG_EvalOp_GrEq: - case RADDBG_EvalOp_Less:case RADDBG_EvalOp_Grtr: + case RADDBGI_EvalOp_Neg: case RADDBGI_EvalOp_Add: case RADDBGI_EvalOp_Sub: + case RADDBGI_EvalOp_Mul: case RADDBGI_EvalOp_Div: + case RADDBGI_EvalOp_EqEq:case RADDBGI_EvalOp_NtEq: + case RADDBGI_EvalOp_LsEq:case RADDBGI_EvalOp_GrEq: + case RADDBGI_EvalOp_Less:case RADDBGI_EvalOp_Grtr: { - if (group != RADDBG_EvalTypeGroup_Other){ + if (group != RADDBGI_EvalTypeGroup_Other){ result = 1; } }break; - case RADDBG_EvalOp_Mod:case RADDBG_EvalOp_LShift:case RADDBG_EvalOp_RShift: - case RADDBG_EvalOp_BitNot:case RADDBG_EvalOp_BitAnd:case RADDBG_EvalOp_BitXor: - case RADDBG_EvalOp_BitOr:case RADDBG_EvalOp_LogNot:case RADDBG_EvalOp_LogAnd: - case RADDBG_EvalOp_LogOr: + case RADDBGI_EvalOp_Mod:case RADDBGI_EvalOp_LShift:case RADDBGI_EvalOp_RShift: + case RADDBGI_EvalOp_BitNot:case RADDBGI_EvalOp_BitAnd:case RADDBGI_EvalOp_BitXor: + case RADDBGI_EvalOp_BitOr:case RADDBGI_EvalOp_LogNot:case RADDBGI_EvalOp_LogAnd: + case RADDBGI_EvalOp_LogOr: { - if (group == RADDBG_EvalTypeGroup_S || group == RADDBG_EvalTypeGroup_U){ + if (group == RADDBGI_EvalTypeGroup_S || group == RADDBGI_EvalTypeGroup_U){ result = 1; } }break; diff --git a/src/raddbgi_format/raddbgi_format.h b/src/raddbgi_format/raddbgi_format.h index 0dd4fa0d..a237173f 100644 --- a/src/raddbgi_format/raddbgi_format.h +++ b/src/raddbgi_format/raddbgi_format.h @@ -1,60 +1,60 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_FORMAT_H -#define RADDBG_FORMAT_H +#ifndef RADDBGI_FORMAT_H +#define RADDBGI_FORMAT_H //////////////////////////////////////////////////////////////// // Overridable procedure decoration -#if !defined(RADDBG_PROC) -# define RADDBG_PROC static +#if !defined(RADDBGI_PROC) +# define RADDBGI_PROC static #endif //////////////////////////////////////////////////////////////// // Overridable integer types -#if !defined(RADDBG_U8) -# define RADDBG_U8 RADDBG_U8 -# define RADDBG_U16 RADDBG_U16 -# define RADDBG_U32 RADDBG_U32 -# define RADDBG_U64 RADDBG_U64 -# define RADDBG_S8 RADDBG_S8 -# define RADDBG_S16 RADDBG_S16 -# define RADDBG_S32 RADDBG_S32 -# define RADDBG_S64 RADDBG_S64 +#if !defined(RADDBGI_U8) +# define RADDBGI_U8 RADDBGI_U8 +# define RADDBGI_U16 RADDBGI_U16 +# define RADDBGI_U32 RADDBGI_U32 +# define RADDBGI_U64 RADDBGI_U64 +# define RADDBGI_S8 RADDBGI_S8 +# define RADDBGI_S16 RADDBGI_S16 +# define RADDBGI_S32 RADDBGI_S32 +# define RADDBGI_S64 RADDBGI_S64 #include -typedef uint8_t RADDBG_U8; -typedef uint16_t RADDBG_U16; -typedef uint32_t RADDBG_U32; -typedef uint64_t RADDBG_U64; -typedef int8_t RADDBG_S8; -typedef int16_t RADDBG_S16; -typedef int32_t RADDBG_S32; -typedef int64_t RADDBG_S64; +typedef uint8_t RADDBGI_U8; +typedef uint16_t RADDBGI_U16; +typedef uint32_t RADDBGI_U32; +typedef uint64_t RADDBGI_U64; +typedef int8_t RADDBGI_S8; +typedef int16_t RADDBGI_S16; +typedef int32_t RADDBGI_S32; +typedef int64_t RADDBGI_S64; #endif //////////////////////////////////////////////////////////////// // Architecture Constants -#define RADDBG_ArchXList(X)\ +#define RADDBGI_ArchXList(X)\ X(NULL, 0, 0)\ X(X86, 1, 4)\ X(X64, 2, 8) -typedef RADDBG_U32 RADDBG_Arch; -typedef enum RADDBG_ArchEnum{ -#define X(N,C,Z) RADDBG_Arch_##N = C, - RADDBG_ArchXList(X) +typedef RADDBGI_U32 RADDBGI_Arch; +typedef enum RADDBGI_ArchEnum{ +#define X(N,C,Z) RADDBGI_Arch_##N = C, + RADDBGI_ArchXList(X) #undef X -} RADDBG_ArchEnum; +} RADDBGI_ArchEnum; -typedef RADDBG_U8 RADDBG_RegisterCode; +typedef RADDBGI_U8 RADDBGI_RegisterCode; // x86 registers -#define RADDBG_RegisterCode_X86_XList(X) \ +#define RADDBGI_RegisterCode_X86_XList(X) \ X(nil, 0) \ X(eax, 1) \ X(ecx, 2) \ @@ -118,14 +118,14 @@ X(ymm6, 59) \ X(ymm7, 60) \ X(COUNT, 61) -typedef enum RADDBG_RegisterCode_X86_Enum{ -#define X(N,C) RADDBG_RegisterCode_X86_##N = C, - RADDBG_RegisterCode_X86_XList(X) +typedef enum RADDBGI_RegisterCode_X86_Enum{ +#define X(N,C) RADDBGI_RegisterCode_X86_##N = C, + RADDBGI_RegisterCode_X86_XList(X) #undef X -} RADDBG_RegisterCode_X86_Enum; +} RADDBGI_RegisterCode_X86_Enum; // x64 registers -#define RADDBG_RegisterCode_X64_XList(X) \ +#define RADDBGI_RegisterCode_X64_XList(X) \ X(nil, 0) \ X(rax, 1) \ X(rcx, 2) \ @@ -205,48 +205,48 @@ X(fdp, 75) \ X(mxcsr_mask, 76) \ X(COUNT, 77) -typedef enum RADDBG_RegisterCode_X64_Enum{ -#define X(N,C) RADDBG_RegisterCode_X64_##N = C, - RADDBG_RegisterCode_X64_XList(X) +typedef enum RADDBGI_RegisterCode_X64_Enum{ +#define X(N,C) RADDBGI_RegisterCode_X64_##N = C, + RADDBGI_RegisterCode_X64_XList(X) #undef X -} RADDBG_RegisterCode_X64_Enum; +} RADDBGI_RegisterCode_X64_Enum; //////////////////////////////////////////////////////////////// // Format types // "raddbg\0\0" -#define RADDBG_MAGIC_CONSTANT 0x0000676264646172 -#define RADDBG_ENCODING_VERSION 1 +#define RADDBGI_MAGIC_CONSTANT 0x0000676264646172 +#define RADDBGI_ENCODING_VERSION 1 -#define RADDBG_LanguageXList(X) \ +#define RADDBGI_LanguageXList(X) \ X(NULL, 0) \ X(C, 1) \ X(CPlusPlus, 2) -typedef RADDBG_U32 RADDBG_Language; -typedef enum RADDBG_LanguageEnum{ -#define X(N,C) RADDBG_Language_##N = C, - RADDBG_LanguageXList(X) +typedef RADDBGI_U32 RADDBGI_Language; +typedef enum RADDBGI_LanguageEnum{ +#define X(N,C) RADDBGI_Language_##N = C, + RADDBGI_LanguageXList(X) #undef X -} RADDBG_LanguageEnum; +} RADDBGI_LanguageEnum; -typedef struct RADDBG_Header{ +typedef struct RADDBGI_Header{ // identification - RADDBG_U64 magic; - RADDBG_U32 encoding_version; + RADDBGI_U64 magic; + RADDBGI_U32 encoding_version; // data sections - RADDBG_U32 data_section_off; - RADDBG_U32 data_section_count; -} RADDBG_Header; + RADDBGI_U32 data_section_off; + RADDBGI_U32 data_section_count; +} RADDBGI_Header; //- data sections -#define RADDBG_DataSectionTag_SECONDARY 0x80000000 +#define RADDBGI_DataSectionTag_SECONDARY 0x80000000 -#define RADDBG_DataSectionTagXList(X,Y) \ +#define RADDBGI_DataSectionTagXList(X,Y) \ X(NULL, 0x0000)\ X(TopLevelInfo, 0x0001)\ X(StringData, 0x0002)\ @@ -273,131 +273,131 @@ X(LocationBlocks, 0x0016)\ X(LocationData, 0x0017)\ X(NameMaps, 0x0018)\ Y(PRIMARY_COUNT)\ -X(SKIP, RADDBG_DataSectionTag_SECONDARY|0x0000)\ -X(LineInfoVoffs, RADDBG_DataSectionTag_SECONDARY|0x0001)\ -X(LineInfoData, RADDBG_DataSectionTag_SECONDARY|0x0002)\ -X(LineInfoColumns, RADDBG_DataSectionTag_SECONDARY|0x0003)\ -X(LineMapNumbers, RADDBG_DataSectionTag_SECONDARY|0x0004)\ -X(LineMapRanges, RADDBG_DataSectionTag_SECONDARY|0x0005)\ -X(LineMapVoffs, RADDBG_DataSectionTag_SECONDARY|0x0006)\ -X(NameMapBuckets, RADDBG_DataSectionTag_SECONDARY|0x0007)\ -X(NameMapNodes, RADDBG_DataSectionTag_SECONDARY|0x0008) +X(SKIP, RADDBGI_DataSectionTag_SECONDARY|0x0000)\ +X(LineInfoVoffs, RADDBGI_DataSectionTag_SECONDARY|0x0001)\ +X(LineInfoData, RADDBGI_DataSectionTag_SECONDARY|0x0002)\ +X(LineInfoColumns, RADDBGI_DataSectionTag_SECONDARY|0x0003)\ +X(LineMapNumbers, RADDBGI_DataSectionTag_SECONDARY|0x0004)\ +X(LineMapRanges, RADDBGI_DataSectionTag_SECONDARY|0x0005)\ +X(LineMapVoffs, RADDBGI_DataSectionTag_SECONDARY|0x0006)\ +X(NameMapBuckets, RADDBGI_DataSectionTag_SECONDARY|0x0007)\ +X(NameMapNodes, RADDBGI_DataSectionTag_SECONDARY|0x0008) -typedef RADDBG_U32 RADDBG_DataSectionTag; -typedef enum RADDBG_DataSectionTagEnum{ -#define X(N,C) RADDBG_DataSectionTag_##N = C, -#define Y(N) RADDBG_DataSectionTag_##N, - RADDBG_DataSectionTagXList(X,Y) +typedef RADDBGI_U32 RADDBGI_DataSectionTag; +typedef enum RADDBGI_DataSectionTagEnum{ +#define X(N,C) RADDBGI_DataSectionTag_##N = C, +#define Y(N) RADDBGI_DataSectionTag_##N, + RADDBGI_DataSectionTagXList(X,Y) #undef X #undef Y -} RADDBG_DataSectionTagEnum; +} RADDBGI_DataSectionTagEnum; -#define RADDBG_DataSectionEncodingXList(X) \ +#define RADDBGI_DataSectionEncodingXList(X) \ X(Unpacked, 0) -typedef RADDBG_U32 RADDBG_DataSectionEncoding; -typedef enum RADDBG_DataSectionEncodingEnum{ -#define X(N,C) RADDBG_DataSectionEncoding_##N = C, - RADDBG_DataSectionEncodingXList(X) +typedef RADDBGI_U32 RADDBGI_DataSectionEncoding; +typedef enum RADDBGI_DataSectionEncodingEnum{ +#define X(N,C) RADDBGI_DataSectionEncoding_##N = C, + RADDBGI_DataSectionEncodingXList(X) #undef X -} RADDBG_DataSectionEncodingEnum; +} RADDBGI_DataSectionEncodingEnum; -typedef struct RADDBG_DataSection{ - RADDBG_DataSectionTag tag; - RADDBG_DataSectionEncoding encoding; - RADDBG_U64 off; - RADDBG_U64 encoded_size; - RADDBG_U64 unpacked_size; -} RADDBG_DataSection; +typedef struct RADDBGI_DataSection{ + RADDBGI_DataSectionTag tag; + RADDBGI_DataSectionEncoding encoding; + RADDBGI_U64 off; + RADDBGI_U64 encoded_size; + RADDBGI_U64 unpacked_size; +} RADDBGI_DataSection; //- common types -typedef struct RADDBG_VMapEntry{ - RADDBG_U64 voff; - RADDBG_U64 idx; -} RADDBG_VMapEntry; +typedef struct RADDBGI_VMapEntry{ + RADDBGI_U64 voff; + RADDBGI_U64 idx; +} RADDBGI_VMapEntry; //- top level info -typedef struct RADDBG_TopLevelInfo{ - RADDBG_Arch architecture; - RADDBG_U32 exe_name_string_idx; - RADDBG_U64 exe_hash; - RADDBG_U64 voff_max; -} RADDBG_TopLevelInfo; +typedef struct RADDBGI_TopLevelInfo{ + RADDBGI_Arch architecture; + RADDBGI_U32 exe_name_string_idx; + RADDBGI_U64 exe_hash; + RADDBGI_U64 voff_max; +} RADDBGI_TopLevelInfo; //- binary sections -typedef RADDBG_U32 RADDBG_BinarySectionFlags; -typedef enum RADDBG_BinarySectionFlagsEnum{ - RADDBG_BinarySectionFlag_Read = (1 << 0), - RADDBG_BinarySectionFlag_Write = (1 << 1), - RADDBG_BinarySectionFlag_Execute = (1 << 2) -} RADDBG_BinarySectionFlagsEnum; +typedef RADDBGI_U32 RADDBGI_BinarySectionFlags; +typedef enum RADDBGI_BinarySectionFlagsEnum{ + RADDBGI_BinarySectionFlag_Read = (1 << 0), + RADDBGI_BinarySectionFlag_Write = (1 << 1), + RADDBGI_BinarySectionFlag_Execute = (1 << 2) +} RADDBGI_BinarySectionFlagsEnum; -typedef struct RADDBG_BinarySection{ - RADDBG_U32 name_string_idx; - RADDBG_BinarySectionFlags flags; - RADDBG_U64 voff_first; - RADDBG_U64 voff_opl; - RADDBG_U64 foff_first; - RADDBG_U64 foff_opl; -} RADDBG_BinarySection; +typedef struct RADDBGI_BinarySection{ + RADDBGI_U32 name_string_idx; + RADDBGI_BinarySectionFlags flags; + RADDBGI_U64 voff_first; + RADDBGI_U64 voff_opl; + RADDBGI_U64 foff_first; + RADDBGI_U64 foff_opl; +} RADDBGI_BinarySection; //- file & file system info -typedef struct RADDBG_FilePathNode{ - RADDBG_U32 name_string_idx; - RADDBG_U32 parent_path_node; - RADDBG_U32 first_child; - RADDBG_U32 next_sibling; - RADDBG_U32 source_file_idx; -} RADDBG_FilePathNode; +typedef struct RADDBGI_FilePathNode{ + RADDBGI_U32 name_string_idx; + RADDBGI_U32 parent_path_node; + RADDBGI_U32 first_child; + RADDBGI_U32 next_sibling; + RADDBGI_U32 source_file_idx; +} RADDBGI_FilePathNode; -typedef struct RADDBG_SourceFile{ - RADDBG_U32 file_path_node_idx; +typedef struct RADDBGI_SourceFile{ + RADDBGI_U32 file_path_node_idx; - RADDBG_U32 normal_full_path_string_idx; + RADDBGI_U32 normal_full_path_string_idx; // usage of line map to go from a line number to an array of voffs // (line_map_nums * line_number) -> (nil | index) // (line_map_data * index) -> (range) // (line_map_voff_data * range) -> (array(voff)) - RADDBG_U32 line_map_count; - RADDBG_U32 line_map_nums_data_idx; // U32[line_map_count] (sorted - not closed ranges) - RADDBG_U32 line_map_range_data_idx; // U32[line_map_count + 1] (pairs form ranges) - RADDBG_U32 line_map_voff_data_idx; // U64[...] (idx by line_map_range_data) -} RADDBG_SourceFile; + RADDBGI_U32 line_map_count; + RADDBGI_U32 line_map_nums_data_idx; // U32[line_map_count] (sorted - not closed ranges) + RADDBGI_U32 line_map_range_data_idx; // U32[line_map_count + 1] (pairs form ranges) + RADDBGI_U32 line_map_voff_data_idx; // U64[...] (idx by line_map_range_data) +} RADDBGI_SourceFile; //- units & line info -typedef struct RADDBG_Unit{ - RADDBG_U32 unit_name_string_idx; - RADDBG_U32 compiler_name_string_idx; - RADDBG_U32 source_file_path_node; - RADDBG_U32 object_file_path_node; - RADDBG_U32 archive_file_path_node; - RADDBG_U32 build_path_node; - RADDBG_Language language; +typedef struct RADDBGI_Unit{ + RADDBGI_U32 unit_name_string_idx; + RADDBGI_U32 compiler_name_string_idx; + RADDBGI_U32 source_file_path_node; + RADDBGI_U32 object_file_path_node; + RADDBGI_U32 archive_file_path_node; + RADDBGI_U32 build_path_node; + RADDBGI_Language language; // usage of line info to go from voff to file & line number: // (line_info_voffs * voff) -> (nil + index) - // (line_info_data * index) -> (RADDBG_Line = (file_idx * line_number)) + // (line_info_data * index) -> (RADDBGI_Line = (file_idx * line_number)) - RADDBG_U32 line_info_voffs_data_idx; // U64[line_info_count + 1] (sorted ranges) - RADDBG_U32 line_info_data_idx; // RADDBG_Line[line_info_count] - RADDBG_U32 line_info_col_data_idx; // RADDBG_Col[line_info_count] - RADDBG_U32 line_info_count; -} RADDBG_Unit; + RADDBGI_U32 line_info_voffs_data_idx; // U64[line_info_count + 1] (sorted ranges) + RADDBGI_U32 line_info_data_idx; // RADDBGI_Line[line_info_count] + RADDBGI_U32 line_info_col_data_idx; // RADDBGI_Col[line_info_count] + RADDBGI_U32 line_info_count; +} RADDBGI_Unit; -typedef struct RADDBG_Line{ - RADDBG_U32 file_idx; - RADDBG_U32 line_num; -} RADDBG_Line; +typedef struct RADDBGI_Line{ + RADDBGI_U32 file_idx; + RADDBGI_U32 line_num; +} RADDBGI_Line; -typedef struct RADDBG_Column{ - RADDBG_U16 col_first; - RADDBG_U16 col_opl; -} RADDBG_Column; +typedef struct RADDBGI_Column{ + RADDBGI_U16 col_first; + RADDBGI_U16 col_opl; +} RADDBGI_Column; //- type info @@ -405,7 +405,7 @@ typedef struct RADDBG_Column{ // X(name,code) - defines a primary code // XZ(name,code size) - defines a primary code & associates a size // Y(alias_name,name) - defines an alias for bookends -#define RADDBG_TypeKindXList(X,XZ,Y)\ +#define RADDBGI_TypeKindXList(X,XZ,Y)\ X(NULL, 0x0000) \ \ XZ(Void, 0x0001, 0) Y(FirstBuiltIn, Void) \ @@ -466,23 +466,23 @@ Y(LastUserDefined, IncompleteEnum) \ X(Bitfield, 0xF000) \ X(Variadic, 0xF001) -typedef RADDBG_U16 RADDBG_TypeKind; -typedef enum RADDBG_TypeKindEnum{ +typedef RADDBGI_U16 RADDBGI_TypeKind; +typedef enum RADDBGI_TypeKindEnum{ -#define X(name,code) RADDBG_TypeKind_##name = code, +#define X(name,code) RADDBGI_TypeKind_##name = code, #define XZ(name,code,size) X(name,code) -#define Y(alias_name,name) RADDBG_TypeKind_##alias_name = RADDBG_TypeKind_##name, - RADDBG_TypeKindXList(X,XZ,Y) +#define Y(alias_name,name) RADDBGI_TypeKind_##alias_name = RADDBGI_TypeKind_##name, + RADDBGI_TypeKindXList(X,XZ,Y) #undef X #undef XZ #undef Y -} RADDBG_TypeKindEnum; +} RADDBGI_TypeKindEnum; -typedef RADDBG_U16 RADDBG_TypeModifierFlags; +typedef RADDBGI_U16 RADDBGI_TypeModifierFlags; enum{ - RADDBG_TypeModifierFlag_Const = (1 << 0), - RADDBG_TypeModifierFlag_Volatile = (1 << 1), + RADDBGI_TypeModifierFlag_Const = (1 << 0), + RADDBGI_TypeModifierFlag_Volatile = (1 << 1), }; // IMPORTANT NOTE: All type nodes in a valid raddbg are *topologically sorted*. @@ -493,65 +493,65 @@ enum{ // This restriction does not apply to the members of a type that are // attached through a "UDT" though. -typedef struct RADDBG_TypeNode{ - RADDBG_TypeKind kind; - // when kind is 'Modifier' -> RADDBG_TypeModifierFlags - RADDBG_U16 flags; +typedef struct RADDBGI_TypeNode{ + RADDBGI_TypeKind kind; + // when kind is 'Modifier' -> RADDBGI_TypeModifierFlags + RADDBGI_U16 flags; - RADDBG_U32 byte_size; + RADDBGI_U32 byte_size; union{ // kind is 'built-in' struct{ - RADDBG_U32 name_string_idx; + RADDBGI_U32 name_string_idx; } built_in; // kind is 'constructed' struct{ - RADDBG_U32 direct_type_idx; - RADDBG_U32 count; + RADDBGI_U32 direct_type_idx; + RADDBGI_U32 count; union{ // when kind is 'Function' or 'Method' - RADDBG_U32 param_idx_run_first; + RADDBGI_U32 param_idx_run_first; // when kind is 'MemberPtr' - RADDBG_U32 owner_type_idx; + RADDBGI_U32 owner_type_idx; }; } constructed; // kind is 'user defined' struct{ - RADDBG_U32 name_string_idx; - RADDBG_U32 direct_type_idx; - RADDBG_U32 udt_idx; + RADDBGI_U32 name_string_idx; + RADDBGI_U32 direct_type_idx; + RADDBGI_U32 udt_idx; } user_defined; // (kind = Bitfield) struct{ - RADDBG_U32 off; - RADDBG_U32 size; + RADDBGI_U32 off; + RADDBGI_U32 size; } bitfield; }; -} RADDBG_TypeNode; +} RADDBGI_TypeNode; -typedef RADDBG_U32 RADDBG_UserDefinedTypeFlags; +typedef RADDBGI_U32 RADDBGI_UserDefinedTypeFlags; enum{ - RADDBG_UserDefinedTypeFlag_EnumMembers = (1 << 0), + RADDBGI_UserDefinedTypeFlag_EnumMembers = (1 << 0), }; -typedef struct RADDBG_UDT{ - RADDBG_U32 self_type_idx; - RADDBG_UserDefinedTypeFlags flags; +typedef struct RADDBGI_UDT{ + RADDBGI_U32 self_type_idx; + RADDBGI_UserDefinedTypeFlags flags; // when EnumMembers flag is set, indexes into enum "enum_members" instead of "members" - RADDBG_U32 member_first; - RADDBG_U32 member_count; + RADDBGI_U32 member_first; + RADDBGI_U32 member_count; - RADDBG_U32 file_idx; - RADDBG_U32 line; - RADDBG_U32 col; -} RADDBG_UDT; + RADDBGI_U32 file_idx; + RADDBGI_U32 line; + RADDBGI_U32 col; +} RADDBGI_UDT; -#define RADDBG_MemberKindXList(X) \ +#define RADDBGI_MemberKindXList(X) \ X(NULL, 0x0000) \ X(DataField, 0x0001) \ X(StaticData, 0x0002) \ @@ -563,12 +563,12 @@ X(Base, 0x0201) \ X(VirtualBase, 0x0202) \ X(NestedType, 0x0300) -typedef RADDBG_U16 RADDBG_MemberKind; -typedef enum RADDBG_MemberKindEnum{ -#define X(N,C) RADDBG_MemberKind_##N = C, - RADDBG_MemberKindXList(X) +typedef RADDBGI_U16 RADDBGI_MemberKind; +typedef enum RADDBGI_MemberKindEnum{ +#define X(N,C) RADDBGI_MemberKind_##N = C, + RADDBGI_MemberKindXList(X) #undef X -} RADDBG_MemberKindEnum; +} RADDBGI_MemberKindEnum; // TODO(allen): need a way to equip methods and some virtual methods // with procedure symbol information. I'm thinking a seperate data @@ -578,141 +578,141 @@ typedef enum RADDBG_MemberKindEnum{ // like 'associate_method_to_proc' that can be used *after* both the // method and proc are known, rather than one that forces us to know // the association when constructing the member data. -typedef struct RADDBG_Member{ - RADDBG_MemberKind kind; - RADDBG_U16 __unused__; +typedef struct RADDBGI_Member{ + RADDBGI_MemberKind kind; + RADDBGI_U16 __unused__; - RADDBG_U32 name_string_idx; - RADDBG_U32 type_idx; - RADDBG_U32 off; -} RADDBG_Member; + RADDBGI_U32 name_string_idx; + RADDBGI_U32 type_idx; + RADDBGI_U32 off; +} RADDBGI_Member; -typedef struct RADDBG_EnumMember{ - RADDBG_U32 name_string_idx; - RADDBG_U32 __unused__; - RADDBG_U64 val; -} RADDBG_EnumMember; +typedef struct RADDBGI_EnumMember{ + RADDBGI_U32 name_string_idx; + RADDBGI_U32 __unused__; + RADDBGI_U64 val; +} RADDBGI_EnumMember; //- symbol info -typedef RADDBG_U32 RADDBG_LinkFlags; +typedef RADDBGI_U32 RADDBGI_LinkFlags; enum{ - RADDBG_LinkFlag_External = (1 << 0), + RADDBGI_LinkFlag_External = (1 << 0), // NOTE: Scope flags are mutually exclusive. // A symbol is either global scoped, type scoped, or procedure scoped. - RADDBG_LinkFlag_TypeScoped = (1 << 1), - RADDBG_LinkFlag_ProcScoped = (1 << 2), + RADDBGI_LinkFlag_TypeScoped = (1 << 1), + RADDBGI_LinkFlag_ProcScoped = (1 << 2), }; -typedef struct RADDBG_GlobalVariable{ - RADDBG_U32 name_string_idx; +typedef struct RADDBGI_GlobalVariable{ + RADDBGI_U32 name_string_idx; // NOTE: "global variables" can be scoped in *any* way. The scope flags here refer to // *namespace* scoping. "global variables" are all in the data section of the // final exe/dll type file, so they are "global" in the life-time sense of the // word. In the namespace sense of the word, they can be scoped globally, by type, // or by procedure. - RADDBG_LinkFlags link_flags; - RADDBG_U64 voff; - RADDBG_U32 type_idx; + RADDBGI_LinkFlags link_flags; + RADDBGI_U64 voff; + RADDBGI_U32 type_idx; // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RADDBG_U32 container_idx; -} RADDBG_GlobalVariable; + RADDBGI_U32 container_idx; +} RADDBGI_GlobalVariable; -typedef struct RADDBG_ThreadVariable{ - RADDBG_U32 name_string_idx; +typedef struct RADDBGI_ThreadVariable{ + RADDBGI_U32 name_string_idx; // NOTE: See the note in GlobalVariable regarding scoping. The same concept applies here. - RADDBG_LinkFlags link_flags; - RADDBG_U32 tls_off; - RADDBG_U32 type_idx; + RADDBGI_LinkFlags link_flags; + RADDBGI_U32 tls_off; + RADDBGI_U32 type_idx; // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RADDBG_U32 container_idx; -} RADDBG_ThreadVariable; + RADDBGI_U32 container_idx; +} RADDBGI_ThreadVariable; -typedef struct RADDBG_Procedure{ - RADDBG_U32 name_string_idx; - RADDBG_U32 link_name_string_idx; +typedef struct RADDBGI_Procedure{ + RADDBGI_U32 name_string_idx; + RADDBGI_U32 link_name_string_idx; // NOTE: See the note in GlobalVariable regarding scoping. The same concept applies here. - RADDBG_LinkFlags link_flags; - RADDBG_U32 type_idx; - RADDBG_U32 root_scope_idx; + RADDBGI_LinkFlags link_flags; + RADDBGI_U32 type_idx; + RADDBGI_U32 root_scope_idx; // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RADDBG_U32 container_idx; -} RADDBG_Procedure; + RADDBGI_U32 container_idx; +} RADDBGI_Procedure; -typedef struct RADDBG_Scope{ - RADDBG_U32 proc_idx; - RADDBG_U32 parent_scope_idx; - RADDBG_U32 first_child_scope_idx; - RADDBG_U32 next_sibling_scope_idx; +typedef struct RADDBGI_Scope{ + RADDBGI_U32 proc_idx; + RADDBGI_U32 parent_scope_idx; + RADDBGI_U32 first_child_scope_idx; + RADDBGI_U32 next_sibling_scope_idx; - RADDBG_U32 voff_range_first; - RADDBG_U32 voff_range_opl; + RADDBGI_U32 voff_range_first; + RADDBGI_U32 voff_range_opl; // indexes into "locals" - RADDBG_U32 local_first; - RADDBG_U32 local_count; + RADDBGI_U32 local_first; + RADDBGI_U32 local_count; - RADDBG_U32 static_local_idx_run_first; - RADDBG_U32 static_local_count; + RADDBGI_U32 static_local_idx_run_first; + RADDBGI_U32 static_local_count; // TODO(allen): attach less common scope-relevant info -} RADDBG_Scope; +} RADDBGI_Scope; -typedef RADDBG_U32 RADDBG_LocalKind; +typedef RADDBGI_U32 RADDBGI_LocalKind; typedef enum{ - RADDBG_LocalKind_NULL, - RADDBG_LocalKind_Parameter, - RADDBG_LocalKind_Variable, - RADDBG_LocalKind_COUNT -} RADDBG_LocalKindEnum; + RADDBGI_LocalKind_NULL, + RADDBGI_LocalKind_Parameter, + RADDBGI_LocalKind_Variable, + RADDBGI_LocalKind_COUNT +} RADDBGI_LocalKindEnum; -typedef struct RADDBG_Local{ - RADDBG_LocalKind kind; - RADDBG_U32 name_string_idx; - RADDBG_U64 type_idx; +typedef struct RADDBGI_Local{ + RADDBGI_LocalKind kind; + RADDBGI_U32 name_string_idx; + RADDBGI_U64 type_idx; // indexes into "location_blocks" - RADDBG_U32 location_first; - RADDBG_U32 location_opl; -} RADDBG_Local; + RADDBGI_U32 location_first; + RADDBGI_U32 location_opl; +} RADDBGI_Local; -typedef struct RADDBG_LocationBlock{ - RADDBG_U32 scope_off_first; - RADDBG_U32 scope_off_opl; - RADDBG_U32 location_data_off; -} RADDBG_LocationBlock; +typedef struct RADDBGI_LocationBlock{ + RADDBGI_U32 scope_off_first; + RADDBGI_U32 scope_off_opl; + RADDBGI_U32 location_data_off; +} RADDBGI_LocationBlock; -typedef RADDBG_U8 RADDBG_LocationKind; +typedef RADDBGI_U8 RADDBGI_LocationKind; typedef enum{ - RADDBG_LocationKind_NULL, - RADDBG_LocationKind_AddrBytecodeStream, - RADDBG_LocationKind_ValBytecodeStream, - RADDBG_LocationKind_AddrRegisterPlusU16, - RADDBG_LocationKind_AddrAddrRegisterPlusU16, - RADDBG_LocationKind_ValRegister, - RADDBG_LocationKind_COUNT -} RADDBG_LocationKindEnum; + RADDBGI_LocationKind_NULL, + RADDBGI_LocationKind_AddrBytecodeStream, + RADDBGI_LocationKind_ValBytecodeStream, + RADDBGI_LocationKind_AddrRegisterPlusU16, + RADDBGI_LocationKind_AddrAddrRegisterPlusU16, + RADDBGI_LocationKind_ValRegister, + RADDBGI_LocationKind_COUNT +} RADDBGI_LocationKindEnum; -typedef struct RADDBG_LocationBytecodeStream{ - RADDBG_LocationKind kind; - // [... 0] null terminated byte sequence RADDBG_EvalBytecodeStream -} RADDBG_LocationBytecodeStream; +typedef struct RADDBGI_LocationBytecodeStream{ + RADDBGI_LocationKind kind; + // [... 0] null terminated byte sequence RADDBGI_EvalBytecodeStream +} RADDBGI_LocationBytecodeStream; -typedef struct RADDBG_LocationRegisterPlusU16{ - RADDBG_LocationKind kind; - RADDBG_RegisterCode register_code; - RADDBG_U16 offset; -} RADDBG_LocationRegisterPlusU16; +typedef struct RADDBGI_LocationRegisterPlusU16{ + RADDBGI_LocationKind kind; + RADDBGI_RegisterCode register_code; + RADDBGI_U16 offset; +} RADDBGI_LocationRegisterPlusU16; -typedef struct RADDBG_LocationRegister{ - RADDBG_LocationKind kind; - RADDBG_RegisterCode register_code; -} RADDBG_LocationRegister; +typedef struct RADDBGI_LocationRegister{ + RADDBGI_LocationKind kind; + RADDBGI_RegisterCode register_code; +} RADDBGI_LocationRegister; //- name map types -#define RADDBG_NameMapXList(X)\ +#define RADDBGI_NameMapXList(X)\ X(NULL, 0)\ X(GlobalVariables, 1)\ X(ThreadVariables, 2)\ @@ -721,42 +721,42 @@ X(Types, 4)\ X(LinkNameProcedures, 5)\ X(NormalSourcePaths, 6) -typedef RADDBG_U32 RADDBG_NameMapKind; -typedef enum RADDBG_NameMapKindEnum{ -#define X(N,C) RADDBG_NameMapKind_##N = C, - RADDBG_NameMapXList(X) +typedef RADDBGI_U32 RADDBGI_NameMapKind; +typedef enum RADDBGI_NameMapKindEnum{ +#define X(N,C) RADDBGI_NameMapKind_##N = C, + RADDBGI_NameMapXList(X) #undef X - RADDBG_NameMapKind_COUNT -} RADDBG_NameMapKindEnum; + RADDBGI_NameMapKind_COUNT +} RADDBGI_NameMapKindEnum; // TODO(allen): documentation here for the hashing and probing strategy for this table -typedef struct RADDBG_NameMap{ - RADDBG_NameMapKind kind; - RADDBG_U32 bucket_data_idx; - RADDBG_U32 node_data_idx; -} RADDBG_NameMap; +typedef struct RADDBGI_NameMap{ + RADDBGI_NameMapKind kind; + RADDBGI_U32 bucket_data_idx; + RADDBGI_U32 node_data_idx; +} RADDBGI_NameMap; -typedef struct RADDBG_NameMapBucket{ - RADDBG_U32 first_node; - RADDBG_U32 node_count; -} RADDBG_NameMapBucket; +typedef struct RADDBGI_NameMapBucket{ + RADDBGI_U32 first_node; + RADDBGI_U32 node_count; +} RADDBGI_NameMapBucket; -typedef struct RADDBG_NameMapNode{ - RADDBG_U32 string_idx; - RADDBG_U32 match_count; +typedef struct RADDBGI_NameMapNode{ + RADDBGI_U32 string_idx; + RADDBGI_U32 match_count; // NOTE: if (match_count == 1) then this is the index of the matching item // if (match_count > 1) then this is the first for an index run of all the matches - RADDBG_U32 match_idx_or_idx_run_first; -} RADDBG_NameMapNode; + RADDBGI_U32 match_idx_or_idx_run_first; +} RADDBGI_NameMapNode; //////////////////////////////// // Eval Bytecode // (Name, decodeN, popN, pushN) -#define RADDBG_EvalOpXList(X)\ +#define RADDBGI_EvalOpXList(X)\ X(Stop, 0, 0, 0)\ X(Noop, 0, 0, 0)\ X(Cond, 1, 1, 0)\ @@ -803,7 +803,7 @@ X(Pop, 0, 1, 0)\ X(Insert, 1, 0, 0) // (Name) -#define RADDBG_EvalTypeGroupXList(X)\ +#define RADDBGI_EvalTypeGroupXList(X)\ X(Other)\ X(U)\ X(S)\ @@ -811,7 +811,7 @@ X(F32)\ X(F64) // (Name, error-message) -#define RADDBG_EvalConversionKindXList(X)\ +#define RADDBGI_EvalConversionKindXList(X)\ X(Noop, "")\ X(Legal, "")\ X(OtherToOther, "cannot convert between these types")\ @@ -819,7 +819,7 @@ X(ToOther, "cannot convert to this type")\ X(FromOther, "cannot convert this type") // Xb(EvalTypeGroup) Y(TypeKind) Xe(EvalTypeGroup) -#define RADDBG_EvalTypeGroupFromKindMap(Y,Xb,Xe)\ +#define RADDBGI_EvalTypeGroupFromKindMap(Y,Xb,Xe)\ \ Xb(U) Y(U8) Y(U16) Y(U32) Y(U64) Y(Bool) Y(Ptr) Y(Enum)\ Xe(U)\ @@ -834,7 +834,7 @@ Xb(F64) Y(F64)\ Xe(F64) // Xb(EvalConversionKind) Y(EvalTypeGroup, EvalTypeGroup) Xe(EvalConversionKind) -#define RADDBG_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe)\ +#define RADDBGI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe)\ \ Xb(Noop) Y(U, U) Y(S, S) Y(F32, F32) Y(F64, F64) Y(U, S) Y(S, U)\ Xe(Noop)\ @@ -855,69 +855,65 @@ Xb(FromOther) Y(Other, U) Y(Other, S) Y(Other, F32) Y(Other, F64)\ Xe(FromOther) // eval interpretation macros -#define RADDBG_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) +#define RADDBGI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) // eval enums -typedef RADDBG_U8 RADDBG_EvalOp; +typedef RADDBGI_U8 RADDBGI_EvalOp; -typedef enum RADDBG_EvalOpEnum{ -#define X(N,dec,pop,push) RADDBG_EvalOp_##N, - RADDBG_EvalOpXList(X) +typedef enum RADDBGI_EvalOpEnum{ +#define X(N,dec,pop,push) RADDBGI_EvalOp_##N, + RADDBGI_EvalOpXList(X) #undef X - RADDBG_EvalOp_COUNT -} RADDBG_EvalOpEnum; + RADDBGI_EvalOp_COUNT +} RADDBGI_EvalOpEnum; -typedef RADDBG_U8 RADDBG_EvalTypeGroup; +typedef RADDBGI_U8 RADDBGI_EvalTypeGroup; -typedef enum RADDBG_EvalTypeGroupEnum{ -#define X(N) RADDBG_EvalTypeGroup_##N, - RADDBG_EvalTypeGroupXList(X) +typedef enum RADDBGI_EvalTypeGroupEnum{ +#define X(N) RADDBGI_EvalTypeGroup_##N, + RADDBGI_EvalTypeGroupXList(X) #undef X - RADDBG_EvalTypeGroup_COUNT, -} RADDBG_EvalTypeGroupEnum; + RADDBGI_EvalTypeGroup_COUNT, +} RADDBGI_EvalTypeGroupEnum; -typedef RADDBG_U8 RADDBG_EvalConversionKind; +typedef RADDBGI_U8 RADDBGI_EvalConversionKind; -typedef enum RADDBG_EvalConversionKindEnum{ -#define X(N,msg) RADDBG_EvalConversionKind_##N, - RADDBG_EvalConversionKindXList(X) +typedef enum RADDBGI_EvalConversionKindEnum{ +#define X(N,msg) RADDBGI_EvalConversionKind_##N, + RADDBGI_EvalConversionKindXList(X) #undef X - RADDBG_EvalConversionKind_COUNT, -} RADDBG_EvalConversionKindEnum; + RADDBGI_EvalConversionKind_COUNT, +} RADDBGI_EvalConversionKindEnum; //- eval data tables -#define RADDBG_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) -#define RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) -#define RADDBG_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) -#define RADDBG_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) +#define RADDBGI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) +#define RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) +#define RADDBGI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) +#define RADDBGI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) -static RADDBG_U8 raddbg_eval_opcode_ctrlbits[] = { -#define X(Name, decodeN, popN, pushN) RADDBG_EVAL_CTRLBITS(decodeN,popN,pushN), - RADDBG_EvalOpXList(X) +static RADDBGI_U8 raddbgi_eval_opcode_ctrlbits[] = { +#define X(Name, decodeN, popN, pushN) RADDBGI_EVAL_CTRLBITS(decodeN,popN,pushN), + RADDBGI_EvalOpXList(X) #undef X }; //////////////////////////////// // Functions -RADDBG_PROC RADDBG_U64 raddbg_hash(RADDBG_U8 *ptr, RADDBG_U64 size); -RADDBG_PROC RADDBG_U32 raddbg_size_from_basic_type_kind(RADDBG_TypeKind kind); -RADDBG_PROC RADDBG_U32 raddbg_addr_size_from_arch(RADDBG_Arch arch); +RADDBGI_PROC RADDBGI_U64 raddbgi_hash(RADDBGI_U8 *ptr, RADDBGI_U64 size); +RADDBGI_PROC RADDBGI_U32 raddbgi_size_from_basic_type_kind(RADDBGI_TypeKind kind); +RADDBGI_PROC RADDBGI_U32 raddbgi_addr_size_from_arch(RADDBGI_Arch arch); //- eval helpers -RADDBG_PROC RADDBG_EvalConversionKind -raddbg_eval_conversion_rule(RADDBG_EvalTypeGroup in, RADDBG_EvalTypeGroup out); -RADDBG_PROC RADDBG_U8* -raddbg_eval_conversion_message(RADDBG_EvalConversionKind conversion_kind, RADDBG_U64 *lennout); +RADDBGI_PROC RADDBGI_EvalConversionKind raddbgi_eval_conversion_rule(RADDBGI_EvalTypeGroup in, RADDBGI_EvalTypeGroup out); +RADDBGI_PROC RADDBGI_U8* raddbgi_eval_conversion_message(RADDBGI_EvalConversionKind conversion_kind, RADDBGI_U64 *lennout); +RADDBGI_PROC RADDBGI_S32 raddbgi_eval_opcode_type_compatible(RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group); -RADDBG_PROC RADDBG_S32 -raddbg_eval_opcode_type_compatible(RADDBG_EvalOp op, RADDBG_EvalTypeGroup group); - -#endif // RADDBG_FORMAT_H +#endif // RADDBGI_FORMAT_H diff --git a/src/raddbgi_format/raddbgi_format_parse.c b/src/raddbgi_format/raddbgi_format_parse.c index b29e9776..9e294146 100644 --- a/src/raddbgi_format/raddbgi_format_parse.c +++ b/src/raddbgi_format/raddbgi_format_parse.c @@ -4,105 +4,105 @@ //////////////////////////////// //~ RADDBG Parse API -RADDBG_PROC RADDBG_ParseStatus -raddbg_parse(RADDBG_U8 *data, RADDBG_U64 size, RADDBG_Parsed *out){ - RADDBG_ParseStatus result = RADDBG_ParseStatus_Good; +RADDBGI_PROC RADDBGI_ParseStatus +raddbgi_parse(RADDBGI_U8 *data, RADDBGI_U64 size, RADDBGI_Parsed *out){ + RADDBGI_ParseStatus result = RADDBGI_ParseStatus_Good; // out header - RADDBG_Header *hdr = 0; + RADDBGI_Header *hdr = 0; { if (sizeof(*hdr) <= size){ - hdr = (RADDBG_Header*)data; + hdr = (RADDBGI_Header*)data; } // (errors) - if (hdr == 0 || hdr->magic != RADDBG_MAGIC_CONSTANT){ + if (hdr == 0 || hdr->magic != RADDBGI_MAGIC_CONSTANT){ hdr = 0; - result = RADDBG_ParseStatus_HeaderDoesNotMatch; + result = RADDBGI_ParseStatus_HeaderDoesNotMatch; } if (hdr != 0 && hdr->encoding_version != 1){ hdr = 0; - result = RADDBG_ParseStatus_UnsupportedVersionNumber; + result = RADDBGI_ParseStatus_UnsupportedVersionNumber; } } // out data sections - RADDBG_DataSection *dsecs = 0; - RADDBG_U32 dsec_count = 0; + RADDBGI_DataSection *dsecs = 0; + RADDBGI_U32 dsec_count = 0; if (hdr != 0){ - RADDBG_U64 opl = (RADDBG_U64)hdr->data_section_off + (RADDBG_U64)hdr->data_section_count*sizeof(*dsecs); + RADDBGI_U64 opl = (RADDBGI_U64)hdr->data_section_off + (RADDBGI_U64)hdr->data_section_count*sizeof(*dsecs); if (opl <= size){ - dsecs = (RADDBG_DataSection*)(data + hdr->data_section_off); + dsecs = (RADDBGI_DataSection*)(data + hdr->data_section_off); dsec_count = hdr->data_section_count; } // (errors) if (dsecs == 0){ - result = RADDBG_ParseStatus_InvalidDataSecionLayout; + result = RADDBGI_ParseStatus_InvalidDataSecionLayout; } } // extract primary data section indexes - RADDBG_U32 dsec_idx[RADDBG_DataSectionTag_PRIMARY_COUNT] = {0}; - if (result == RADDBG_ParseStatus_Good){ - RADDBG_DataSection *sec_ptr = dsecs; - for (RADDBG_U32 i = 0; i < dsec_count; i += 1, sec_ptr += 1){ - if (sec_ptr->tag < RADDBG_DataSectionTag_PRIMARY_COUNT){ + RADDBGI_U32 dsec_idx[RADDBGI_DataSectionTag_PRIMARY_COUNT] = {0}; + if (result == RADDBGI_ParseStatus_Good){ + RADDBGI_DataSection *sec_ptr = dsecs; + for (RADDBGI_U32 i = 0; i < dsec_count; i += 1, sec_ptr += 1){ + if (sec_ptr->tag < RADDBGI_DataSectionTag_PRIMARY_COUNT){ dsec_idx[sec_ptr->tag] = i; } } } // fill out data block (part 1) - if (result == RADDBG_ParseStatus_Good){ + if (result == RADDBGI_ParseStatus_Good){ out->raw_data = data; out->raw_data_size = size; out->dsecs = dsecs; out->dsec_count = dsec_count; - for (RADDBG_U32 i = 0; i < RADDBG_DataSectionTag_PRIMARY_COUNT; i += 1){ + for (RADDBGI_U32 i = 0; i < RADDBGI_DataSectionTag_PRIMARY_COUNT; i += 1){ out->dsec_idx[i] = dsec_idx[i]; } } // out string table - RADDBG_U8 *string_data = 0; - RADDBG_U64 string_opl = 0; - RADDBG_U32 *string_offs = 0; - RADDBG_U64 string_count = 0; - if (result == RADDBG_ParseStatus_Good){ - raddbg_parse__extract_primary(out, string_data, &string_opl, - RADDBG_DataSectionTag_StringData); + RADDBGI_U8 *string_data = 0; + RADDBGI_U64 string_opl = 0; + RADDBGI_U32 *string_offs = 0; + RADDBGI_U64 string_count = 0; + if (result == RADDBGI_ParseStatus_Good){ + raddbgi_parse__extract_primary(out, string_data, &string_opl, + RADDBGI_DataSectionTag_StringData); - RADDBG_U64 table_entry_count = 0; - raddbg_parse__extract_primary(out, string_offs, &table_entry_count, - RADDBG_DataSectionTag_StringTable); + RADDBGI_U64 table_entry_count = 0; + raddbgi_parse__extract_primary(out, string_offs, &table_entry_count, + RADDBGI_DataSectionTag_StringTable); if (table_entry_count > 0){ string_count = table_entry_count - 1; } // (errors) if (string_data == 0){ - result = RADDBG_ParseStatus_MissingStringDataSection; + result = RADDBGI_ParseStatus_MissingStringDataSection; } else if (string_offs == 0){ - result = RADDBG_ParseStatus_MissingStringTableSection; + result = RADDBGI_ParseStatus_MissingStringTableSection; } } // out index runs - RADDBG_U32 *idx_run_data = 0; - RADDBG_U64 idx_run_count = 0; - if (result == RADDBG_ParseStatus_Good){ - raddbg_parse__extract_primary(out, idx_run_data, &idx_run_count, - RADDBG_DataSectionTag_IndexRuns); + RADDBGI_U32 *idx_run_data = 0; + RADDBGI_U64 idx_run_count = 0; + if (result == RADDBGI_ParseStatus_Good){ + raddbgi_parse__extract_primary(out, idx_run_data, &idx_run_count, + RADDBGI_DataSectionTag_IndexRuns); // (errors) if (idx_run_data == 0){ - result = RADDBG_ParseStatus_MissingIndexRunSection; + result = RADDBGI_ParseStatus_MissingIndexRunSection; } } - if (result == RADDBG_ParseStatus_Good){ + if (result == RADDBGI_ParseStatus_Good){ // fill out primary data structures (part 2) out->string_data = string_data; out->string_offs = string_offs; @@ -112,81 +112,81 @@ raddbg_parse(RADDBG_U8 *data, RADDBG_U64 size, RADDBG_Parsed *out){ out->idx_run_count = idx_run_count; { - RADDBG_TopLevelInfo *tli = 0; - RADDBG_U64 dummy = 0; - raddbg_parse__extract_primary(out, tli, &dummy, RADDBG_DataSectionTag_TopLevelInfo); + RADDBGI_TopLevelInfo *tli = 0; + RADDBGI_U64 dummy = 0; + raddbgi_parse__extract_primary(out, tli, &dummy, RADDBGI_DataSectionTag_TopLevelInfo); if (dummy != 1){ tli = 0; } out->top_level_info = tli; } - raddbg_parse__extract_primary(out, out->binary_sections, &out->binary_sections_count, - RADDBG_DataSectionTag_BinarySections); + raddbgi_parse__extract_primary(out, out->binary_sections, &out->binary_sections_count, + RADDBGI_DataSectionTag_BinarySections); - raddbg_parse__extract_primary(out, out->file_paths, &out->file_paths_count, - RADDBG_DataSectionTag_FilePathNodes); + raddbgi_parse__extract_primary(out, out->file_paths, &out->file_paths_count, + RADDBGI_DataSectionTag_FilePathNodes); - raddbg_parse__extract_primary(out, out->source_files, &out->source_files_count, - RADDBG_DataSectionTag_SourceFiles); + raddbgi_parse__extract_primary(out, out->source_files, &out->source_files_count, + RADDBGI_DataSectionTag_SourceFiles); - raddbg_parse__extract_primary(out, out->units, &out->units_count, - RADDBG_DataSectionTag_Units); + raddbgi_parse__extract_primary(out, out->units, &out->units_count, + RADDBGI_DataSectionTag_Units); - raddbg_parse__extract_primary(out, out->unit_vmap, &out->unit_vmap_count, - RADDBG_DataSectionTag_UnitVmap); + raddbgi_parse__extract_primary(out, out->unit_vmap, &out->unit_vmap_count, + RADDBGI_DataSectionTag_UnitVmap); - raddbg_parse__extract_primary(out, out->unit_vmap, &out->unit_vmap_count, - RADDBG_DataSectionTag_UnitVmap); + raddbgi_parse__extract_primary(out, out->unit_vmap, &out->unit_vmap_count, + RADDBGI_DataSectionTag_UnitVmap); - raddbg_parse__extract_primary(out, out->type_nodes, &out->type_nodes_count, - RADDBG_DataSectionTag_TypeNodes); + raddbgi_parse__extract_primary(out, out->type_nodes, &out->type_nodes_count, + RADDBGI_DataSectionTag_TypeNodes); - raddbg_parse__extract_primary(out, out->udts, &out->udts_count, - RADDBG_DataSectionTag_UDTs); + raddbgi_parse__extract_primary(out, out->udts, &out->udts_count, + RADDBGI_DataSectionTag_UDTs); - raddbg_parse__extract_primary(out, out->members, &out->members_count, - RADDBG_DataSectionTag_Members); + raddbgi_parse__extract_primary(out, out->members, &out->members_count, + RADDBGI_DataSectionTag_Members); - raddbg_parse__extract_primary(out, out->enum_members, &out->enum_members_count, - RADDBG_DataSectionTag_EnumMembers); + raddbgi_parse__extract_primary(out, out->enum_members, &out->enum_members_count, + RADDBGI_DataSectionTag_EnumMembers); - raddbg_parse__extract_primary(out, out->global_variables, &out->global_variables_count, - RADDBG_DataSectionTag_GlobalVariables); + raddbgi_parse__extract_primary(out, out->global_variables, &out->global_variables_count, + RADDBGI_DataSectionTag_GlobalVariables); - raddbg_parse__extract_primary(out, out->global_vmap, &out->global_vmap_count, - RADDBG_DataSectionTag_GlobalVmap); + raddbgi_parse__extract_primary(out, out->global_vmap, &out->global_vmap_count, + RADDBGI_DataSectionTag_GlobalVmap); - raddbg_parse__extract_primary(out, out->thread_variables, &out->thread_variables_count, - RADDBG_DataSectionTag_ThreadVariables); + raddbgi_parse__extract_primary(out, out->thread_variables, &out->thread_variables_count, + RADDBGI_DataSectionTag_ThreadVariables); - raddbg_parse__extract_primary(out, out->procedures, &out->procedures_count, - RADDBG_DataSectionTag_Procedures); + raddbgi_parse__extract_primary(out, out->procedures, &out->procedures_count, + RADDBGI_DataSectionTag_Procedures); - raddbg_parse__extract_primary(out, out->scopes, &out->scopes_count, - RADDBG_DataSectionTag_Scopes); + raddbgi_parse__extract_primary(out, out->scopes, &out->scopes_count, + RADDBGI_DataSectionTag_Scopes); - raddbg_parse__extract_primary(out, out->scope_voffs, &out->scope_voffs_count, - RADDBG_DataSectionTag_ScopeVoffData); + raddbgi_parse__extract_primary(out, out->scope_voffs, &out->scope_voffs_count, + RADDBGI_DataSectionTag_ScopeVoffData); - raddbg_parse__extract_primary(out, out->scope_vmap, &out->scope_vmap_count, - RADDBG_DataSectionTag_ScopeVmap); + raddbgi_parse__extract_primary(out, out->scope_vmap, &out->scope_vmap_count, + RADDBGI_DataSectionTag_ScopeVmap); - raddbg_parse__extract_primary(out, out->locals, &out->locals_count, - RADDBG_DataSectionTag_Locals); + raddbgi_parse__extract_primary(out, out->locals, &out->locals_count, + RADDBGI_DataSectionTag_Locals); - raddbg_parse__extract_primary(out, out->location_blocks, &out->location_blocks_count, - RADDBG_DataSectionTag_LocationBlocks); + raddbgi_parse__extract_primary(out, out->location_blocks, &out->location_blocks_count, + RADDBGI_DataSectionTag_LocationBlocks); - raddbg_parse__extract_primary(out, out->location_data, &out->location_data_size, - RADDBG_DataSectionTag_LocationData); + raddbgi_parse__extract_primary(out, out->location_data, &out->location_data_size, + RADDBGI_DataSectionTag_LocationData); { - raddbg_parse__extract_primary(out, out->name_maps, &out->name_maps_count, - RADDBG_DataSectionTag_NameMaps); + raddbgi_parse__extract_primary(out, out->name_maps, &out->name_maps_count, + RADDBGI_DataSectionTag_NameMaps); - RADDBG_NameMap *name_map_ptr = out->name_maps; - RADDBG_NameMap *name_map_opl = out->name_maps + out->name_maps_count; + RADDBGI_NameMap *name_map_ptr = out->name_maps; + RADDBGI_NameMap *name_map_opl = out->name_maps + out->name_maps_count; for (; name_map_ptr < name_map_opl; name_map_ptr += 1){ if (out->name_maps_by_kind[name_map_ptr->kind] == 0){ out->name_maps_by_kind[name_map_ptr->kind] = name_map_ptr; @@ -194,25 +194,25 @@ raddbg_parse(RADDBG_U8 *data, RADDBG_U64 size, RADDBG_Parsed *out){ } } -#if !defined(RADDBG_DISABLE_NILS) - if(out->binary_sections == 0) { out->binary_sections = &raddbg_binary_section_nil; out->binary_sections_count = 1; } - if(out->file_paths == 0) { out->file_paths = &raddbg_file_path_node_nil; out->file_paths_count = 1; } - if(out->source_files == 0) { out->source_files = &raddbg_source_file_nil; out->source_files_count = 1; } - if(out->units == 0) { out->units = &raddbg_unit_nil; out->units_count = 1; } - if(out->unit_vmap == 0) { out->unit_vmap = &raddbg_vmap_entry_nil; out->unit_vmap_count = 1; } - if(out->type_nodes == 0) { out->type_nodes = &raddbg_type_node_nil; out->type_nodes_count = 1; } - if(out->udts == 0) { out->udts = &raddbg_udt_nil; out->udts_count = 1; } - if(out->members == 0) { out->members = &raddbg_member_nil; out->members_count = 1; } - if(out->enum_members == 0) { out->enum_members = &raddbg_enum_member_nil; out->enum_members_count = 1; } - if(out->global_variables == 0) { out->global_variables = &raddbg_global_variable_nil; out->global_variables_count = 1; } - if(out->global_vmap == 0) { out->global_vmap = &raddbg_vmap_entry_nil; out->global_vmap_count = 1; } - if(out->thread_variables == 0) { out->thread_variables = &raddbg_thread_variable_nil; out->thread_variables_count = 1; } - if(out->procedures == 0) { out->procedures = &raddbg_procedure_nil; out->procedures_count = 1; } - if(out->scopes == 0) { out->scopes = &raddbg_scope_nil; out->scopes_count = 1; } - if(out->scope_voffs == 0) { out->scope_voffs = &raddbg_voff_nil; out->scope_voffs_count = 1; } - if(out->scope_vmap == 0) { out->scope_vmap = &raddbg_vmap_entry_nil; out->scope_vmap_count = 1; } - if(out->locals == 0) { out->locals = &raddbg_local_nil; out->locals_count = 1; } - if(out->location_blocks == 0) { out->location_blocks = &raddbg_location_block_nil; out->location_blocks_count = 1; } +#if !defined(RADDBGI_DISABLE_NILS) + if(out->binary_sections == 0) { out->binary_sections = &raddbgi_binary_section_nil; out->binary_sections_count = 1; } + if(out->file_paths == 0) { out->file_paths = &raddbgi_file_path_node_nil; out->file_paths_count = 1; } + if(out->source_files == 0) { out->source_files = &raddbgi_source_file_nil; out->source_files_count = 1; } + if(out->units == 0) { out->units = &raddbgi_unit_nil; out->units_count = 1; } + if(out->unit_vmap == 0) { out->unit_vmap = &raddbgi_vmap_entry_nil; out->unit_vmap_count = 1; } + if(out->type_nodes == 0) { out->type_nodes = &raddbgi_type_node_nil; out->type_nodes_count = 1; } + if(out->udts == 0) { out->udts = &raddbgi_udt_nil; out->udts_count = 1; } + if(out->members == 0) { out->members = &raddbgi_member_nil; out->members_count = 1; } + if(out->enum_members == 0) { out->enum_members = &raddbgi_enum_member_nil; out->enum_members_count = 1; } + if(out->global_variables == 0) { out->global_variables = &raddbgi_global_variable_nil; out->global_variables_count = 1; } + if(out->global_vmap == 0) { out->global_vmap = &raddbgi_vmap_entry_nil; out->global_vmap_count = 1; } + if(out->thread_variables == 0) { out->thread_variables = &raddbgi_thread_variable_nil; out->thread_variables_count = 1; } + if(out->procedures == 0) { out->procedures = &raddbgi_procedure_nil; out->procedures_count = 1; } + if(out->scopes == 0) { out->scopes = &raddbgi_scope_nil; out->scopes_count = 1; } + if(out->scope_voffs == 0) { out->scope_voffs = &raddbgi_voff_nil; out->scope_voffs_count = 1; } + if(out->scope_vmap == 0) { out->scope_vmap = &raddbgi_vmap_entry_nil; out->scope_vmap_count = 1; } + if(out->locals == 0) { out->locals = &raddbgi_local_nil; out->locals_count = 1; } + if(out->location_blocks == 0) { out->location_blocks = &raddbgi_location_block_nil; out->location_blocks_count = 1; } #endif } @@ -220,15 +220,15 @@ raddbg_parse(RADDBG_U8 *data, RADDBG_U64 size, RADDBG_Parsed *out){ return(result); } -RADDBG_PROC RADDBG_U8* -raddbg_string_from_idx(RADDBG_Parsed *parsed, RADDBG_U32 idx, RADDBG_U64 *len_out){ - RADDBG_U8 *result = 0; - RADDBG_U64 len_result = 0; +RADDBGI_PROC RADDBGI_U8* +raddbgi_string_from_idx(RADDBGI_Parsed *parsed, RADDBGI_U32 idx, RADDBGI_U64 *len_out){ + RADDBGI_U8 *result = 0; + RADDBGI_U64 len_result = 0; if (idx < parsed->string_count){ - RADDBG_U32 off_raw = parsed->string_offs[idx]; - RADDBG_U32 opl_raw = parsed->string_offs[idx + 1]; - RADDBG_U32 opl = raddbg_parse__min(opl_raw, parsed->string_data_size); - RADDBG_U32 off = raddbg_parse__min(off_raw, opl); + RADDBGI_U32 off_raw = parsed->string_offs[idx]; + RADDBGI_U32 opl_raw = parsed->string_offs[idx + 1]; + RADDBGI_U32 opl = raddbgi_parse__min(opl_raw, parsed->string_data_size); + RADDBGI_U32 off = raddbgi_parse__min(off_raw, opl); result = parsed->string_data + off; len_result = opl - off; } @@ -236,15 +236,15 @@ raddbg_string_from_idx(RADDBG_Parsed *parsed, RADDBG_U32 idx, RADDBG_U64 *len_ou return(result); } -RADDBG_PROC RADDBG_U32* -raddbg_idx_run_from_first_count(RADDBG_Parsed *parsed, - RADDBG_U32 raw_first, RADDBG_U32 raw_count, - RADDBG_U32 *n_out){ - RADDBG_U32 raw_opl = raw_first + raw_count; - RADDBG_U32 opl = raddbg_parse__min(raw_opl, parsed->idx_run_count); - RADDBG_U32 first = raddbg_parse__min(raw_first, opl); +RADDBGI_PROC RADDBGI_U32* +raddbgi_idx_run_from_first_count(RADDBGI_Parsed *parsed, + RADDBGI_U32 raw_first, RADDBGI_U32 raw_count, + RADDBGI_U32 *n_out){ + RADDBGI_U32 raw_opl = raw_first + raw_count; + RADDBGI_U32 opl = raddbgi_parse__min(raw_opl, parsed->idx_run_count); + RADDBGI_U32 first = raddbgi_parse__min(raw_first, opl); - RADDBG_U32 *result = 0; + RADDBGI_U32 *result = 0; if (first < parsed->idx_run_count){ result = parsed->idx_run_data + first; } @@ -254,29 +254,29 @@ raddbg_idx_run_from_first_count(RADDBG_Parsed *parsed, //- line info -RADDBG_PROC void -raddbg_line_info_from_unit(RADDBG_Parsed *p, RADDBG_Unit *unit, RADDBG_ParsedLineInfo *out){ - RADDBG_U64 line_info_voff_count = 0; - RADDBG_U64 *voffs = (RADDBG_U64*) - raddbg_data_from_dsec(p, unit->line_info_voffs_data_idx, sizeof(RADDBG_U64), - RADDBG_DataSectionTag_LineInfoVoffs, - &line_info_voff_count); +RADDBGI_PROC void +raddbgi_line_info_from_unit(RADDBGI_Parsed *p, RADDBGI_Unit *unit, RADDBGI_ParsedLineInfo *out){ + RADDBGI_U64 line_info_voff_count = 0; + RADDBGI_U64 *voffs = (RADDBGI_U64*) + raddbgi_data_from_dsec(p, unit->line_info_voffs_data_idx, sizeof(RADDBGI_U64), + RADDBGI_DataSectionTag_LineInfoVoffs, + &line_info_voff_count); - RADDBG_U64 line_info_count_raw = 0; - RADDBG_Line *lines = (RADDBG_Line*) - raddbg_data_from_dsec(p, unit->line_info_data_idx, sizeof(RADDBG_Line), - RADDBG_DataSectionTag_LineInfoData, - &line_info_count_raw); + RADDBGI_U64 line_info_count_raw = 0; + RADDBGI_Line *lines = (RADDBGI_Line*) + raddbgi_data_from_dsec(p, unit->line_info_data_idx, sizeof(RADDBGI_Line), + RADDBGI_DataSectionTag_LineInfoData, + &line_info_count_raw); - RADDBG_U64 column_info_count_raw = 0; - RADDBG_Column *cols = (RADDBG_Column*) - raddbg_data_from_dsec(p, unit->line_info_col_data_idx, sizeof(RADDBG_Column), - RADDBG_DataSectionTag_LineInfoColumns, - &column_info_count_raw); + RADDBGI_U64 column_info_count_raw = 0; + RADDBGI_Column *cols = (RADDBGI_Column*) + raddbgi_data_from_dsec(p, unit->line_info_col_data_idx, sizeof(RADDBGI_Column), + RADDBGI_DataSectionTag_LineInfoColumns, + &column_info_count_raw); - RADDBG_U32 line_info_count_a = (line_info_voff_count > 0)?line_info_voff_count - 1:0; - RADDBG_U32 line_info_count = raddbg_parse__min(line_info_count_a, line_info_count_raw); - RADDBG_U32 column_info_count = raddbg_parse__min(column_info_count_raw, line_info_count); + RADDBGI_U32 line_info_count_a = (line_info_voff_count > 0)?line_info_voff_count - 1:0; + RADDBGI_U32 line_info_count = raddbgi_parse__min(line_info_count_a, line_info_count_raw); + RADDBGI_U32 column_info_count = raddbgi_parse__min(column_info_count_raw, line_info_count); out->voffs = voffs; out->lines = lines; @@ -285,17 +285,17 @@ raddbg_line_info_from_unit(RADDBG_Parsed *p, RADDBG_Unit *unit, RADDBG_ParsedLin out->col_count = column_info_count; } -RADDBG_PROC RADDBG_U64 -raddbg_line_info_idx_from_voff(RADDBG_ParsedLineInfo *line_info, RADDBG_U64 voff) +RADDBGI_PROC RADDBGI_U64 +raddbgi_line_info_idx_from_voff(RADDBGI_ParsedLineInfo *line_info, RADDBGI_U64 voff) { - RADDBG_U64 result = 0; + RADDBGI_U64 result = 0; if (line_info->count > 0 && line_info->voffs[0] <= voff && voff < line_info->voffs[line_info->count - 1]){ // assuming: (i < j) -> (vmap[i].voff < vmap[j].voff) // find i such that: (vmap[i].voff <= voff) && (voff < vmap[i + 1].voff) - RADDBG_U32 first = 0; - RADDBG_U32 opl = line_info->count; + RADDBGI_U32 first = 0; + RADDBGI_U32 opl = line_info->count; for (;;){ - RADDBG_U32 mid = (first + opl)/2; + RADDBGI_U32 mid = (first + opl)/2; if (line_info->voffs[mid] < voff){ first = mid; } @@ -310,35 +310,35 @@ raddbg_line_info_idx_from_voff(RADDBG_ParsedLineInfo *line_info, RADDBG_U64 voff break; } } - result = (RADDBG_U64)first; + result = (RADDBGI_U64)first; } return(result); } -RADDBG_PROC void -raddbg_line_map_from_source_file(RADDBG_Parsed *p, RADDBG_SourceFile *srcfile, - RADDBG_ParsedLineMap *out){ - RADDBG_U64 num_count = 0; - RADDBG_U32 *nums = (RADDBG_U32*) - raddbg_data_from_dsec(p, srcfile->line_map_nums_data_idx, sizeof(RADDBG_U32), - RADDBG_DataSectionTag_LineMapNumbers, - &num_count); +RADDBGI_PROC void +raddbgi_line_map_from_source_file(RADDBGI_Parsed *p, RADDBGI_SourceFile *srcfile, + RADDBGI_ParsedLineMap *out){ + RADDBGI_U64 num_count = 0; + RADDBGI_U32 *nums = (RADDBGI_U32*) + raddbgi_data_from_dsec(p, srcfile->line_map_nums_data_idx, sizeof(RADDBGI_U32), + RADDBGI_DataSectionTag_LineMapNumbers, + &num_count); - RADDBG_U64 range_count = 0; - RADDBG_U32 *ranges = (RADDBG_U32*) - raddbg_data_from_dsec(p, srcfile->line_map_range_data_idx, sizeof(RADDBG_U32), - RADDBG_DataSectionTag_LineMapRanges, - &range_count); + RADDBGI_U64 range_count = 0; + RADDBGI_U32 *ranges = (RADDBGI_U32*) + raddbgi_data_from_dsec(p, srcfile->line_map_range_data_idx, sizeof(RADDBGI_U32), + RADDBGI_DataSectionTag_LineMapRanges, + &range_count); - RADDBG_U64 voff_count = 0; - RADDBG_U64 *voffs = (RADDBG_U64*) - raddbg_data_from_dsec(p, srcfile->line_map_voff_data_idx, sizeof(RADDBG_U64), - RADDBG_DataSectionTag_LineMapVoffs, - &voff_count); + RADDBGI_U64 voff_count = 0; + RADDBGI_U64 *voffs = (RADDBGI_U64*) + raddbgi_data_from_dsec(p, srcfile->line_map_voff_data_idx, sizeof(RADDBGI_U64), + RADDBGI_DataSectionTag_LineMapVoffs, + &voff_count); - RADDBG_U32 count_a = (range_count > 0)?(range_count - 1):0; - RADDBG_U32 count_b = raddbg_parse__min(count_a, num_count); - RADDBG_U32 count = raddbg_parse__min(count_b, srcfile->line_map_count); + RADDBGI_U32 count_a = (range_count > 0)?(range_count - 1):0; + RADDBGI_U32 count_b = raddbgi_parse__min(count_a, num_count); + RADDBGI_U32 count = raddbgi_parse__min(count_b, srcfile->line_map_count); out->nums = nums; out->ranges = ranges; @@ -347,20 +347,20 @@ raddbg_line_map_from_source_file(RADDBG_Parsed *p, RADDBG_SourceFile *srcfile, out->voff_count = voff_count; } -RADDBG_PROC RADDBG_U64* -raddbg_line_voffs_from_num(RADDBG_ParsedLineMap *map, RADDBG_U32 linenum, RADDBG_U32 *n_out){ - RADDBG_U64 *result = 0; +RADDBGI_PROC RADDBGI_U64* +raddbgi_line_voffs_from_num(RADDBGI_ParsedLineMap *map, RADDBGI_U32 linenum, RADDBGI_U32 *n_out){ + RADDBGI_U64 *result = 0; *n_out = 0; - RADDBG_U32 closest_i = 0; + RADDBGI_U32 closest_i = 0; if (map->count > 0 && map->nums[0] <= linenum){ // assuming: (i < j) -> (nums[i] < nums[j]) // find i such that: (nums[i] <= linenum) && (linenum < nums[i + 1]) - RADDBG_U32 *nums = map->nums; - RADDBG_U32 first = 0; - RADDBG_U32 opl = map->count; + RADDBGI_U32 *nums = map->nums; + RADDBGI_U32 first = 0; + RADDBGI_U32 opl = map->count; for (;;){ - RADDBG_U32 mid = (first + opl)/2; + RADDBGI_U32 mid = (first + opl)/2; if (nums[mid] < linenum){ first = mid; } @@ -386,8 +386,8 @@ raddbg_line_voffs_from_num(RADDBG_ParsedLineMap *map, RADDBG_U32 linenum, RADDBG // set result if possible if (closest_i < map->count){ - RADDBG_U32 first = map->ranges[closest_i]; - RADDBG_U32 opl = map->ranges[closest_i + 1]; + RADDBGI_U32 first = map->ranges[closest_i]; + RADDBGI_U32 opl = map->ranges[closest_i + 1]; if (opl < map->voff_count){ result = map->voffs + first; *n_out = opl - first; @@ -400,16 +400,16 @@ raddbg_line_voffs_from_num(RADDBG_ParsedLineMap *map, RADDBG_U32 linenum, RADDBG //- vmaps -RADDBG_PROC RADDBG_U64 -raddbg_vmap_idx_from_voff(RADDBG_VMapEntry *vmap, RADDBG_U32 vmap_count, RADDBG_U64 voff){ - RADDBG_U64 result = 0; +RADDBGI_PROC RADDBGI_U64 +raddbgi_vmap_idx_from_voff(RADDBGI_VMapEntry *vmap, RADDBGI_U32 vmap_count, RADDBGI_U64 voff){ + RADDBGI_U64 result = 0; if (vmap_count > 0 && vmap[0].voff <= voff && voff < vmap[vmap_count - 1].voff){ // assuming: (i < j) -> (vmap[i].voff < vmap[j].voff) // find i such that: (vmap[i].voff <= voff) && (voff < vmap[i + 1].voff) - RADDBG_U32 first = 0; - RADDBG_U32 opl = vmap_count; + RADDBGI_U32 first = 0; + RADDBGI_U32 opl = vmap_count; for (;;){ - RADDBG_U32 mid = (first + opl)/2; + RADDBGI_U32 mid = (first + opl)/2; if (vmap[mid].voff < voff){ first = mid; } @@ -424,60 +424,60 @@ raddbg_vmap_idx_from_voff(RADDBG_VMapEntry *vmap, RADDBG_U32 vmap_count, RADDBG_ break; } } - result = (RADDBG_U64)vmap[first].idx; + result = (RADDBGI_U64)vmap[first].idx; } return(result); } //- name maps -RADDBG_PROC RADDBG_NameMap* -raddbg_name_map_from_kind(RADDBG_Parsed *p, RADDBG_NameMapKind kind){ - RADDBG_NameMap *result = 0; - if (0 < kind && kind < RADDBG_NameMapKind_COUNT){ +RADDBGI_PROC RADDBGI_NameMap* +raddbgi_name_map_from_kind(RADDBGI_Parsed *p, RADDBGI_NameMapKind kind){ + RADDBGI_NameMap *result = 0; + if (0 < kind && kind < RADDBGI_NameMapKind_COUNT){ result = p->name_maps_by_kind[kind]; } return(result); } -RADDBG_PROC void -raddbg_name_map_parse(RADDBG_Parsed *p, RADDBG_NameMap *mapptr, RADDBG_ParsedNameMap *out){ +RADDBGI_PROC void +raddbgi_name_map_parse(RADDBGI_Parsed *p, RADDBGI_NameMap *mapptr, RADDBGI_ParsedNameMap *out){ out->buckets = 0; out->bucket_count = 0; if (mapptr != 0){ - out->buckets = (RADDBG_NameMapBucket*) - raddbg_data_from_dsec(p, mapptr->bucket_data_idx, sizeof(RADDBG_NameMapBucket), - RADDBG_DataSectionTag_NameMapBuckets, &out->bucket_count); - out->nodes = (RADDBG_NameMapNode*) - raddbg_data_from_dsec(p, mapptr->node_data_idx, sizeof(RADDBG_NameMapNode), - RADDBG_DataSectionTag_NameMapNodes, &out->node_count); + out->buckets = (RADDBGI_NameMapBucket*) + raddbgi_data_from_dsec(p, mapptr->bucket_data_idx, sizeof(RADDBGI_NameMapBucket), + RADDBGI_DataSectionTag_NameMapBuckets, &out->bucket_count); + out->nodes = (RADDBGI_NameMapNode*) + raddbgi_data_from_dsec(p, mapptr->node_data_idx, sizeof(RADDBGI_NameMapNode), + RADDBGI_DataSectionTag_NameMapNodes, &out->node_count); } } -RADDBG_PROC RADDBG_NameMapNode* -raddbg_name_map_lookup(RADDBG_Parsed *p, RADDBG_ParsedNameMap *map, - RADDBG_U8 *str, RADDBG_U64 len){ - RADDBG_NameMapNode *result = 0; +RADDBGI_PROC RADDBGI_NameMapNode* +raddbgi_name_map_lookup(RADDBGI_Parsed *p, RADDBGI_ParsedNameMap *map, + RADDBGI_U8 *str, RADDBGI_U64 len){ + RADDBGI_NameMapNode *result = 0; if (map->bucket_count > 0){ - RADDBG_NameMapBucket *buckets = map->buckets; - RADDBG_U64 bucket_count = map->bucket_count; - RADDBG_U64 hash = raddbg_hash(str, len); - RADDBG_U64 bucket_index = hash%bucket_count; - RADDBG_NameMapBucket *bucket = map->buckets + bucket_index; + RADDBGI_NameMapBucket *buckets = map->buckets; + RADDBGI_U64 bucket_count = map->bucket_count; + RADDBGI_U64 hash = raddbgi_hash(str, len); + RADDBGI_U64 bucket_index = hash%bucket_count; + RADDBGI_NameMapBucket *bucket = map->buckets + bucket_index; - RADDBG_NameMapNode *node = map->nodes + bucket->first_node; - RADDBG_NameMapNode *node_opl = node + bucket->node_count; + RADDBGI_NameMapNode *node = map->nodes + bucket->first_node; + RADDBGI_NameMapNode *node_opl = node + bucket->node_count; for (;node < node_opl; node += 1){ // extract a string from this node - RADDBG_U64 nlen = 0; - RADDBG_U8 *nstr = raddbg_string_from_idx(p, node->string_idx, &nlen); + RADDBGI_U64 nlen = 0; + RADDBGI_U8 *nstr = raddbgi_string_from_idx(p, node->string_idx, &nlen); // compare this to the needle string - RADDBG_S32 match = 0; + RADDBGI_S32 match = 0; if (nlen == len){ - RADDBG_U8 *a = str; - RADDBG_U8 *aopl = str + len; - RADDBG_U8 *b = nstr; + RADDBGI_U8 *a = str; + RADDBGI_U8 *aopl = str + len; + RADDBGI_U8 *b = nstr; for (;a < aopl && *a == *b; a += 1, b += 1); match = (a == aopl); } @@ -493,10 +493,10 @@ raddbg_name_map_lookup(RADDBG_Parsed *p, RADDBG_ParsedNameMap *map, return(result); } -RADDBG_PROC RADDBG_U32* -raddbg_matches_from_map_node(RADDBG_Parsed *p, RADDBG_NameMapNode *node, - RADDBG_U32 *n_out){ - RADDBG_U32 *result = 0; +RADDBGI_PROC RADDBGI_U32* +raddbgi_matches_from_map_node(RADDBGI_Parsed *p, RADDBGI_NameMapNode *node, + RADDBGI_U32 *n_out){ + RADDBGI_U32 *result = 0; *n_out = 0; if (node != 0){ if (node->match_count == 1){ @@ -504,8 +504,8 @@ raddbg_matches_from_map_node(RADDBG_Parsed *p, RADDBG_NameMapNode *node, *n_out = 1; } else{ - result = raddbg_idx_run_from_first_count(p, node->match_idx_or_idx_run_first, - node->match_count, n_out); + result = raddbgi_idx_run_from_first_count(p, node->match_idx_or_idx_run_first, + node->match_count, n_out); } } return(result); @@ -513,14 +513,14 @@ raddbg_matches_from_map_node(RADDBG_Parsed *p, RADDBG_NameMapNode *node, //- common helpers -RADDBG_PROC RADDBG_U64 -raddbg_first_voff_from_proc(RADDBG_Parsed *p, RADDBG_U32 proc_id){ - RADDBG_U64 result = 0; +RADDBGI_PROC RADDBGI_U64 +raddbgi_first_voff_from_proc(RADDBGI_Parsed *p, RADDBGI_U32 proc_id){ + RADDBGI_U64 result = 0; if (0 < proc_id && proc_id < p->procedures_count){ - RADDBG_Procedure *proc = p->procedures + proc_id; - RADDBG_U32 scope_id = proc->root_scope_idx; + RADDBGI_Procedure *proc = p->procedures + proc_id; + RADDBGI_U32 scope_id = proc->root_scope_idx; if (0 < scope_id && scope_id < p->scopes_count){ - RADDBG_Scope *scope = p->scopes + scope_id; + RADDBGI_Scope *scope = p->scopes + scope_id; if (scope->voff_range_first < scope->voff_range_opl && scope->voff_range_first < p->scope_voffs_count){ result = p->scope_voffs[scope->voff_range_first]; @@ -533,19 +533,19 @@ raddbg_first_voff_from_proc(RADDBG_Parsed *p, RADDBG_U32 proc_id){ //////////////////////////////// //~ RADDBG Parsing Helpers -RADDBG_PROC void* -raddbg_data_from_dsec(RADDBG_Parsed *parsed, RADDBG_U32 idx, RADDBG_U32 item_size, - RADDBG_DataSectionTag expected_tag, - RADDBG_U64 *count_out){ +RADDBGI_PROC void* +raddbgi_data_from_dsec(RADDBGI_Parsed *parsed, RADDBGI_U32 idx, RADDBGI_U32 item_size, + RADDBGI_DataSectionTag expected_tag, + RADDBGI_U64 *count_out){ void *result = 0; - RADDBG_U32 count_result = 0; + RADDBGI_U32 count_result = 0; // TODO(allen): need a version of this that works with encodings other than "Unpacked" if (0 < idx && idx < parsed->dsec_count){ - RADDBG_DataSection *ds = parsed->dsecs + idx; + RADDBGI_DataSection *ds = parsed->dsecs + idx; if (ds->tag == expected_tag){ - RADDBG_U64 opl = ds->off + ds->encoded_size; + RADDBGI_U64 opl = ds->off + ds->encoded_size; if (opl <= parsed->raw_data_size){ count_result = ds->encoded_size/item_size; result = (parsed->raw_data + ds->off); diff --git a/src/raddbgi_format/raddbgi_format_parse.h b/src/raddbgi_format/raddbgi_format_parse.h index 5f8e0d14..6d167aa6 100644 --- a/src/raddbgi_format/raddbgi_format_parse.h +++ b/src/raddbgi_format/raddbgi_format_parse.h @@ -1,105 +1,105 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBG_PARSE_H -#define RADDBG_PARSE_H +#ifndef RADDBGI_PARSE_H +#define RADDBGI_PARSE_H //////////////////////////////// //~ RADDBG Parsing Helpers -typedef struct RADDBG_Parsed{ +typedef struct RADDBGI_Parsed{ // raw data & data sections (part 1) - RADDBG_U8 *raw_data; - RADDBG_U64 raw_data_size; - RADDBG_DataSection *dsecs; - RADDBG_U64 dsec_count; - RADDBG_U32 dsec_idx[RADDBG_DataSectionTag_PRIMARY_COUNT]; + RADDBGI_U8 *raw_data; + RADDBGI_U64 raw_data_size; + RADDBGI_DataSection *dsecs; + RADDBGI_U64 dsec_count; + RADDBGI_U32 dsec_idx[RADDBGI_DataSectionTag_PRIMARY_COUNT]; // primary data structures (part 2) // handled by helper APIs - RADDBG_U8* string_data; - RADDBG_U64 string_data_size; - RADDBG_U32* string_offs; - RADDBG_U64 string_count; - RADDBG_U32* idx_run_data; - RADDBG_U32 idx_run_count; + RADDBGI_U8* string_data; + RADDBGI_U64 string_data_size; + RADDBGI_U32* string_offs; + RADDBGI_U64 string_count; + RADDBGI_U32* idx_run_data; + RADDBGI_U32 idx_run_count; // directly readable by users // (any of these may be empty and null even in a successful parse) - RADDBG_TopLevelInfo* top_level_info; + RADDBGI_TopLevelInfo* top_level_info; - RADDBG_BinarySection* binary_sections; - RADDBG_U64 binary_sections_count; - RADDBG_FilePathNode* file_paths; - RADDBG_U64 file_paths_count; - RADDBG_SourceFile* source_files; - RADDBG_U64 source_files_count; - RADDBG_Unit* units; - RADDBG_U64 units_count; - RADDBG_VMapEntry* unit_vmap; - RADDBG_U64 unit_vmap_count; - RADDBG_TypeNode* type_nodes; - RADDBG_U64 type_nodes_count; - RADDBG_UDT* udts; - RADDBG_U64 udts_count; - RADDBG_Member* members; - RADDBG_U64 members_count; - RADDBG_EnumMember* enum_members; - RADDBG_U64 enum_members_count; - RADDBG_GlobalVariable* global_variables; - RADDBG_U64 global_variables_count; - RADDBG_VMapEntry* global_vmap; - RADDBG_U64 global_vmap_count; - RADDBG_ThreadVariable* thread_variables; - RADDBG_U64 thread_variables_count; - RADDBG_Procedure* procedures; - RADDBG_U64 procedures_count; - RADDBG_Scope* scopes; - RADDBG_U64 scopes_count; - RADDBG_U64* scope_voffs; - RADDBG_U64 scope_voffs_count; - RADDBG_VMapEntry* scope_vmap; - RADDBG_U64 scope_vmap_count; - RADDBG_Local* locals; - RADDBG_U64 locals_count; - RADDBG_LocationBlock* location_blocks; - RADDBG_U64 location_blocks_count; - RADDBG_U8* location_data; - RADDBG_U64 location_data_size; - RADDBG_NameMap* name_maps; - RADDBG_U64 name_maps_count; + RADDBGI_BinarySection* binary_sections; + RADDBGI_U64 binary_sections_count; + RADDBGI_FilePathNode* file_paths; + RADDBGI_U64 file_paths_count; + RADDBGI_SourceFile* source_files; + RADDBGI_U64 source_files_count; + RADDBGI_Unit* units; + RADDBGI_U64 units_count; + RADDBGI_VMapEntry* unit_vmap; + RADDBGI_U64 unit_vmap_count; + RADDBGI_TypeNode* type_nodes; + RADDBGI_U64 type_nodes_count; + RADDBGI_UDT* udts; + RADDBGI_U64 udts_count; + RADDBGI_Member* members; + RADDBGI_U64 members_count; + RADDBGI_EnumMember* enum_members; + RADDBGI_U64 enum_members_count; + RADDBGI_GlobalVariable* global_variables; + RADDBGI_U64 global_variables_count; + RADDBGI_VMapEntry* global_vmap; + RADDBGI_U64 global_vmap_count; + RADDBGI_ThreadVariable* thread_variables; + RADDBGI_U64 thread_variables_count; + RADDBGI_Procedure* procedures; + RADDBGI_U64 procedures_count; + RADDBGI_Scope* scopes; + RADDBGI_U64 scopes_count; + RADDBGI_U64* scope_voffs; + RADDBGI_U64 scope_voffs_count; + RADDBGI_VMapEntry* scope_vmap; + RADDBGI_U64 scope_vmap_count; + RADDBGI_Local* locals; + RADDBGI_U64 locals_count; + RADDBGI_LocationBlock* location_blocks; + RADDBGI_U64 location_blocks_count; + RADDBGI_U8* location_data; + RADDBGI_U64 location_data_size; + RADDBGI_NameMap* name_maps; + RADDBGI_U64 name_maps_count; // other helpers - RADDBG_NameMap* name_maps_by_kind[RADDBG_NameMapKind_COUNT]; + RADDBGI_NameMap* name_maps_by_kind[RADDBGI_NameMapKind_COUNT]; -} RADDBG_Parsed; +} RADDBGI_Parsed; typedef enum{ - RADDBG_ParseStatus_Good = 0, - RADDBG_ParseStatus_HeaderDoesNotMatch = 1, - RADDBG_ParseStatus_UnsupportedVersionNumber = 2, - RADDBG_ParseStatus_InvalidDataSecionLayout = 3, - RADDBG_ParseStatus_MissingStringDataSection = 4, - RADDBG_ParseStatus_MissingStringTableSection = 5, - RADDBG_ParseStatus_MissingIndexRunSection = 6, -} RADDBG_ParseStatus; + RADDBGI_ParseStatus_Good = 0, + RADDBGI_ParseStatus_HeaderDoesNotMatch = 1, + RADDBGI_ParseStatus_UnsupportedVersionNumber = 2, + RADDBGI_ParseStatus_InvalidDataSecionLayout = 3, + RADDBGI_ParseStatus_MissingStringDataSection = 4, + RADDBGI_ParseStatus_MissingStringTableSection = 5, + RADDBGI_ParseStatus_MissingIndexRunSection = 6, +} RADDBGI_ParseStatus; -typedef struct RADDBG_ParsedLineInfo{ +typedef struct RADDBGI_ParsedLineInfo{ // NOTE: Mapping VOFF -> LINE_INFO // // * [ voff[i], voff[i + 1] ) forms the voff range // * for the line info at lines[i] (and cols[i] if i < col_count) - RADDBG_U64* voffs; // [count + 1] sorted - RADDBG_Line* lines; // [count] - RADDBG_Column* cols; // [col_count] - RADDBG_U64 count; - RADDBG_U64 col_count; -} RADDBG_ParsedLineInfo; + RADDBGI_U64* voffs; // [count + 1] sorted + RADDBGI_Line* lines; // [count] + RADDBGI_Column* cols; // [col_count] + RADDBGI_U64 count; + RADDBGI_U64 col_count; +} RADDBGI_ParsedLineInfo; -typedef struct RADDBG_ParsedLineMap{ +typedef struct RADDBGI_ParsedLineMap{ // NOTE: Mapping LINE_NUMBER -> VOFFs // // * nums[i] gives a line number @@ -109,111 +109,111 @@ typedef struct RADDBG_ParsedLineMap{ // * let k span over the range [ ranges[i], ranges[i + 1] ) // * voffs[k] gives the associated voffs - RADDBG_U32* nums; // [count] sorted - RADDBG_U32* ranges; // [count + 1] - RADDBG_U64* voffs; // [voff_count] - RADDBG_U64 count; - RADDBG_U64 voff_count; -} RADDBG_ParsedLineMap; + RADDBGI_U32* nums; // [count] sorted + RADDBGI_U32* ranges; // [count + 1] + RADDBGI_U64* voffs; // [voff_count] + RADDBGI_U64 count; + RADDBGI_U64 voff_count; +} RADDBGI_ParsedLineMap; -typedef struct RADDBG_ParsedNameMap{ - RADDBG_NameMapBucket *buckets; - RADDBG_NameMapNode *nodes; - RADDBG_U64 bucket_count; - RADDBG_U64 node_count; -} RADDBG_ParsedNameMap; +typedef struct RADDBGI_ParsedNameMap{ + RADDBGI_NameMapBucket *buckets; + RADDBGI_NameMapNode *nodes; + RADDBGI_U64 bucket_count; + RADDBGI_U64 node_count; +} RADDBGI_ParsedNameMap; //////////////////////////////// //~ Global Nils -#if !defined(RADDBG_DISABLE_NILS) -static RADDBG_BinarySection raddbg_binary_section_nil = {0}; -static RADDBG_FilePathNode raddbg_file_path_node_nil = {0}; -static RADDBG_SourceFile raddbg_source_file_nil = {0}; -static RADDBG_Unit raddbg_unit_nil = {0}; -static RADDBG_VMapEntry raddbg_vmap_entry_nil = {0}; -static RADDBG_TypeNode raddbg_type_node_nil = {0}; -static RADDBG_UDT raddbg_udt_nil = {0}; -static RADDBG_Member raddbg_member_nil = {0}; -static RADDBG_EnumMember raddbg_enum_member_nil = {0}; -static RADDBG_GlobalVariable raddbg_global_variable_nil = {0}; -static RADDBG_ThreadVariable raddbg_thread_variable_nil = {0}; -static RADDBG_Procedure raddbg_procedure_nil = {0}; -static RADDBG_Scope raddbg_scope_nil = {0}; -static U64 raddbg_voff_nil = 0; -static RADDBG_LocationBlock raddbg_location_block_nil = {0}; -static RADDBG_Local raddbg_local_nil = {0}; +#if !defined(RADDBGI_DISABLE_NILS) +static RADDBGI_BinarySection raddbgi_binary_section_nil = {0}; +static RADDBGI_FilePathNode raddbgi_file_path_node_nil = {0}; +static RADDBGI_SourceFile raddbgi_source_file_nil = {0}; +static RADDBGI_Unit raddbgi_unit_nil = {0}; +static RADDBGI_VMapEntry raddbgi_vmap_entry_nil = {0}; +static RADDBGI_TypeNode raddbgi_type_node_nil = {0}; +static RADDBGI_UDT raddbgi_udt_nil = {0}; +static RADDBGI_Member raddbgi_member_nil = {0}; +static RADDBGI_EnumMember raddbgi_enum_member_nil = {0}; +static RADDBGI_GlobalVariable raddbgi_global_variable_nil = {0}; +static RADDBGI_ThreadVariable raddbgi_thread_variable_nil = {0}; +static RADDBGI_Procedure raddbgi_procedure_nil = {0}; +static RADDBGI_Scope raddbgi_scope_nil = {0}; +static U64 raddbgi_voff_nil = 0; +static RADDBGI_LocationBlock raddbgi_location_block_nil = {0}; +static RADDBGI_Local raddbgi_local_nil = {0}; #endif //////////////////////////////// //~ RADDBG Parse API -RADDBG_PROC RADDBG_ParseStatus -raddbg_parse(RADDBG_U8 *data, RADDBG_U64 size, RADDBG_Parsed *out); +RADDBGI_PROC RADDBGI_ParseStatus +raddbgi_parse(RADDBGI_U8 *data, RADDBGI_U64 size, RADDBGI_Parsed *out); -RADDBG_PROC RADDBG_U8* -raddbg_string_from_idx(RADDBG_Parsed *parsed, RADDBG_U32 idx, RADDBG_U64 *len_out); +RADDBGI_PROC RADDBGI_U8* +raddbgi_string_from_idx(RADDBGI_Parsed *parsed, RADDBGI_U32 idx, RADDBGI_U64 *len_out); -RADDBG_PROC RADDBG_U32* -raddbg_idx_run_from_first_count(RADDBG_Parsed *parsed, RADDBG_U32 first, RADDBG_U32 raw_count, - RADDBG_U32 *n_out); +RADDBGI_PROC RADDBGI_U32* +raddbgi_idx_run_from_first_count(RADDBGI_Parsed *parsed, RADDBGI_U32 first, RADDBGI_U32 raw_count, + RADDBGI_U32 *n_out); //- table lookups -#define raddbg_element_from_idx(parsed, name, idx) ((0 <= (idx) && (idx) < (parsed)->name##_count) ? &(parsed)->name[idx] : (parsed)->name ? &(parsed)->name[0] : 0) +#define raddbgi_element_from_idx(parsed, name, idx) ((0 <= (idx) && (idx) < (parsed)->name##_count) ? &(parsed)->name[idx] : (parsed)->name ? &(parsed)->name[0] : 0) //- line info -RADDBG_PROC void -raddbg_line_info_from_unit(RADDBG_Parsed *p, RADDBG_Unit *unit, RADDBG_ParsedLineInfo *out); +RADDBGI_PROC void +raddbgi_line_info_from_unit(RADDBGI_Parsed *p, RADDBGI_Unit *unit, RADDBGI_ParsedLineInfo *out); -RADDBG_PROC RADDBG_U64 -raddbg_line_info_idx_from_voff(RADDBG_ParsedLineInfo *line_info, RADDBG_U64 voff); +RADDBGI_PROC RADDBGI_U64 +raddbgi_line_info_idx_from_voff(RADDBGI_ParsedLineInfo *line_info, RADDBGI_U64 voff); -RADDBG_PROC void -raddbg_line_map_from_source_file(RADDBG_Parsed *p, RADDBG_SourceFile *srcfile, - RADDBG_ParsedLineMap *out); +RADDBGI_PROC void +raddbgi_line_map_from_source_file(RADDBGI_Parsed *p, RADDBGI_SourceFile *srcfile, + RADDBGI_ParsedLineMap *out); -RADDBG_PROC RADDBG_U64* -raddbg_line_voffs_from_num(RADDBG_ParsedLineMap *map, RADDBG_U32 linenum, RADDBG_U32 *n_out); +RADDBGI_PROC RADDBGI_U64* +raddbgi_line_voffs_from_num(RADDBGI_ParsedLineMap *map, RADDBGI_U32 linenum, RADDBGI_U32 *n_out); //- vmaps -RADDBG_PROC RADDBG_U64 -raddbg_vmap_idx_from_voff(RADDBG_VMapEntry *vmap, RADDBG_U32 vmap_count, RADDBG_U64 voff); +RADDBGI_PROC RADDBGI_U64 +raddbgi_vmap_idx_from_voff(RADDBGI_VMapEntry *vmap, RADDBGI_U32 vmap_count, RADDBGI_U64 voff); //- name maps -RADDBG_PROC RADDBG_NameMap* -raddbg_name_map_from_kind(RADDBG_Parsed *p, RADDBG_NameMapKind kind); +RADDBGI_PROC RADDBGI_NameMap* +raddbgi_name_map_from_kind(RADDBGI_Parsed *p, RADDBGI_NameMapKind kind); -RADDBG_PROC void -raddbg_name_map_parse(RADDBG_Parsed* p, RADDBG_NameMap *mapptr, RADDBG_ParsedNameMap *out); +RADDBGI_PROC void +raddbgi_name_map_parse(RADDBGI_Parsed* p, RADDBGI_NameMap *mapptr, RADDBGI_ParsedNameMap *out); -RADDBG_PROC RADDBG_NameMapNode* -raddbg_name_map_lookup(RADDBG_Parsed *p, RADDBG_ParsedNameMap *map, - RADDBG_U8 *str, RADDBG_U64 len); +RADDBGI_PROC RADDBGI_NameMapNode* +raddbgi_name_map_lookup(RADDBGI_Parsed *p, RADDBGI_ParsedNameMap *map, + RADDBGI_U8 *str, RADDBGI_U64 len); -RADDBG_PROC RADDBG_U32* -raddbg_matches_from_map_node(RADDBG_Parsed *p, RADDBG_NameMapNode *node, RADDBG_U32 *n_out); +RADDBGI_PROC RADDBGI_U32* +raddbgi_matches_from_map_node(RADDBGI_Parsed *p, RADDBGI_NameMapNode *node, RADDBGI_U32 *n_out); //- common helpers -RADDBG_PROC RADDBG_U64 -raddbg_first_voff_from_proc(RADDBG_Parsed *p, RADDBG_U32 proc_id); +RADDBGI_PROC RADDBGI_U64 +raddbgi_first_voff_from_proc(RADDBGI_Parsed *p, RADDBGI_U32 proc_id); //////////////////////////////// //~ RADDBG Parsing Helpers -#define raddbg_parse__extract_primary(p,outptr,outn,pritag) \ +#define raddbgi_parse__extract_primary(p,outptr,outn,pritag) \ ( (*(void**)&(outptr)) = \ -raddbg_data_from_dsec((p),(p)->dsec_idx[pritag],sizeof(*(outptr)),(pritag),(outn)) ) +raddbgi_data_from_dsec((p),(p)->dsec_idx[pritag],sizeof(*(outptr)),(pritag),(outn)) ) -RADDBG_PROC void* -raddbg_data_from_dsec(RADDBG_Parsed *p, RADDBG_U32 idx, RADDBG_U32 item_size, - RADDBG_DataSectionTag expected_tag, RADDBG_U64 *n_out); +RADDBGI_PROC void* +raddbgi_data_from_dsec(RADDBGI_Parsed *p, RADDBGI_U32 idx, RADDBGI_U32 item_size, + RADDBGI_DataSectionTag expected_tag, RADDBGI_U64 *n_out); -#define raddbg_parse__min(a,b) (((a)<(b))?(a):(b)) +#define raddbgi_parse__min(a,b) (((a)<(b))?(a):(b)) -#endif //RADDBG_PARSE_H +#endif // RADDBGI_PARSE_H diff --git a/src/regs/generated/regs_raddbg.meta.c b/src/regs/generated/regs_raddbg.meta.c deleted file mode 100644 index 8b322f55..00000000 --- a/src/regs/generated/regs_raddbg.meta.c +++ /dev/null @@ -1,322 +0,0 @@ -// generated -#ifndef _REGS_RADDBG_META_C -#define _REGS_RADDBG_META_C - -internal RADDBG_RegisterCode regs_raddbg_code_from_arch_reg_code(Architecture arch, REGS_RegCode code) -{ -RADDBG_RegisterCode result = 0; -switch(arch) -{ -case Architecture_x64: -{ -switch(code) -{ -default:{}break; -case REGS_RegCodeX64_rax:{result = RADDBG_RegisterCode_X64_rax;}break; -case REGS_RegCodeX64_rcx:{result = RADDBG_RegisterCode_X64_rcx;}break; -case REGS_RegCodeX64_rdx:{result = RADDBG_RegisterCode_X64_rdx;}break; -case REGS_RegCodeX64_rbx:{result = RADDBG_RegisterCode_X64_rbx;}break; -case REGS_RegCodeX64_rsp:{result = RADDBG_RegisterCode_X64_rsp;}break; -case REGS_RegCodeX64_rbp:{result = RADDBG_RegisterCode_X64_rbp;}break; -case REGS_RegCodeX64_rsi:{result = RADDBG_RegisterCode_X64_rsi;}break; -case REGS_RegCodeX64_rdi:{result = RADDBG_RegisterCode_X64_rdi;}break; -case REGS_RegCodeX64_r8:{result = RADDBG_RegisterCode_X64_r8;}break; -case REGS_RegCodeX64_r9:{result = RADDBG_RegisterCode_X64_r9;}break; -case REGS_RegCodeX64_r10:{result = RADDBG_RegisterCode_X64_r10;}break; -case REGS_RegCodeX64_r11:{result = RADDBG_RegisterCode_X64_r11;}break; -case REGS_RegCodeX64_r12:{result = RADDBG_RegisterCode_X64_r12;}break; -case REGS_RegCodeX64_r13:{result = RADDBG_RegisterCode_X64_r13;}break; -case REGS_RegCodeX64_r14:{result = RADDBG_RegisterCode_X64_r14;}break; -case REGS_RegCodeX64_r15:{result = RADDBG_RegisterCode_X64_r15;}break; -case REGS_RegCodeX64_fsbase:{result = RADDBG_RegisterCode_X64_fsbase;}break; -case REGS_RegCodeX64_gsbase:{result = RADDBG_RegisterCode_X64_gsbase;}break; -case REGS_RegCodeX64_rip:{result = RADDBG_RegisterCode_X64_rip;}break; -case REGS_RegCodeX64_rflags:{result = RADDBG_RegisterCode_X64_rflags;}break; -case REGS_RegCodeX64_dr0:{result = RADDBG_RegisterCode_X64_dr0;}break; -case REGS_RegCodeX64_dr1:{result = RADDBG_RegisterCode_X64_dr1;}break; -case REGS_RegCodeX64_dr2:{result = RADDBG_RegisterCode_X64_dr2;}break; -case REGS_RegCodeX64_dr3:{result = RADDBG_RegisterCode_X64_dr3;}break; -case REGS_RegCodeX64_dr4:{result = RADDBG_RegisterCode_X64_dr4;}break; -case REGS_RegCodeX64_dr5:{result = RADDBG_RegisterCode_X64_dr5;}break; -case REGS_RegCodeX64_dr6:{result = RADDBG_RegisterCode_X64_dr6;}break; -case REGS_RegCodeX64_dr7:{result = RADDBG_RegisterCode_X64_dr7;}break; -case REGS_RegCodeX64_fpr0:{result = RADDBG_RegisterCode_X64_fpr0;}break; -case REGS_RegCodeX64_fpr1:{result = RADDBG_RegisterCode_X64_fpr1;}break; -case REGS_RegCodeX64_fpr2:{result = RADDBG_RegisterCode_X64_fpr2;}break; -case REGS_RegCodeX64_fpr3:{result = RADDBG_RegisterCode_X64_fpr3;}break; -case REGS_RegCodeX64_fpr4:{result = RADDBG_RegisterCode_X64_fpr4;}break; -case REGS_RegCodeX64_fpr5:{result = RADDBG_RegisterCode_X64_fpr5;}break; -case REGS_RegCodeX64_fpr6:{result = RADDBG_RegisterCode_X64_fpr6;}break; -case REGS_RegCodeX64_fpr7:{result = RADDBG_RegisterCode_X64_fpr7;}break; -case REGS_RegCodeX64_st0:{result = RADDBG_RegisterCode_X64_st0;}break; -case REGS_RegCodeX64_st1:{result = RADDBG_RegisterCode_X64_st1;}break; -case REGS_RegCodeX64_st2:{result = RADDBG_RegisterCode_X64_st2;}break; -case REGS_RegCodeX64_st3:{result = RADDBG_RegisterCode_X64_st3;}break; -case REGS_RegCodeX64_st4:{result = RADDBG_RegisterCode_X64_st4;}break; -case REGS_RegCodeX64_st5:{result = RADDBG_RegisterCode_X64_st5;}break; -case REGS_RegCodeX64_st6:{result = RADDBG_RegisterCode_X64_st6;}break; -case REGS_RegCodeX64_st7:{result = RADDBG_RegisterCode_X64_st7;}break; -case REGS_RegCodeX64_fcw:{result = RADDBG_RegisterCode_X64_fcw;}break; -case REGS_RegCodeX64_fsw:{result = RADDBG_RegisterCode_X64_fsw;}break; -case REGS_RegCodeX64_ftw:{result = RADDBG_RegisterCode_X64_ftw;}break; -case REGS_RegCodeX64_fop:{result = RADDBG_RegisterCode_X64_fop;}break; -case REGS_RegCodeX64_fcs:{result = RADDBG_RegisterCode_X64_fcs;}break; -case REGS_RegCodeX64_fds:{result = RADDBG_RegisterCode_X64_fds;}break; -case REGS_RegCodeX64_fip:{result = RADDBG_RegisterCode_X64_fip;}break; -case REGS_RegCodeX64_fdp:{result = RADDBG_RegisterCode_X64_fdp;}break; -case REGS_RegCodeX64_mxcsr:{result = RADDBG_RegisterCode_X64_mxcsr;}break; -case REGS_RegCodeX64_mxcsr_mask:{result = RADDBG_RegisterCode_X64_mxcsr_mask;}break; -case REGS_RegCodeX64_ss:{result = RADDBG_RegisterCode_X64_ss;}break; -case REGS_RegCodeX64_cs:{result = RADDBG_RegisterCode_X64_cs;}break; -case REGS_RegCodeX64_ds:{result = RADDBG_RegisterCode_X64_ds;}break; -case REGS_RegCodeX64_es:{result = RADDBG_RegisterCode_X64_es;}break; -case REGS_RegCodeX64_fs:{result = RADDBG_RegisterCode_X64_fs;}break; -case REGS_RegCodeX64_gs:{result = RADDBG_RegisterCode_X64_gs;}break; -case REGS_RegCodeX64_ymm0:{result = RADDBG_RegisterCode_X64_ymm0;}break; -case REGS_RegCodeX64_ymm1:{result = RADDBG_RegisterCode_X64_ymm1;}break; -case REGS_RegCodeX64_ymm2:{result = RADDBG_RegisterCode_X64_ymm2;}break; -case REGS_RegCodeX64_ymm3:{result = RADDBG_RegisterCode_X64_ymm3;}break; -case REGS_RegCodeX64_ymm4:{result = RADDBG_RegisterCode_X64_ymm4;}break; -case REGS_RegCodeX64_ymm5:{result = RADDBG_RegisterCode_X64_ymm5;}break; -case REGS_RegCodeX64_ymm6:{result = RADDBG_RegisterCode_X64_ymm6;}break; -case REGS_RegCodeX64_ymm7:{result = RADDBG_RegisterCode_X64_ymm7;}break; -case REGS_RegCodeX64_ymm8:{result = RADDBG_RegisterCode_X64_ymm8;}break; -case REGS_RegCodeX64_ymm9:{result = RADDBG_RegisterCode_X64_ymm9;}break; -case REGS_RegCodeX64_ymm10:{result = RADDBG_RegisterCode_X64_ymm10;}break; -case REGS_RegCodeX64_ymm11:{result = RADDBG_RegisterCode_X64_ymm11;}break; -case REGS_RegCodeX64_ymm12:{result = RADDBG_RegisterCode_X64_ymm12;}break; -case REGS_RegCodeX64_ymm13:{result = RADDBG_RegisterCode_X64_ymm13;}break; -case REGS_RegCodeX64_ymm14:{result = RADDBG_RegisterCode_X64_ymm14;}break; -case REGS_RegCodeX64_ymm15:{result = RADDBG_RegisterCode_X64_ymm15;}break; -} -}break; -case Architecture_x86: -{ -switch(code) -{ -default:{}break; -case REGS_RegCodeX86_eax:{result = RADDBG_RegisterCode_X86_eax;}break; -case REGS_RegCodeX86_ecx:{result = RADDBG_RegisterCode_X86_ecx;}break; -case REGS_RegCodeX86_edx:{result = RADDBG_RegisterCode_X86_edx;}break; -case REGS_RegCodeX86_ebx:{result = RADDBG_RegisterCode_X86_ebx;}break; -case REGS_RegCodeX86_esp:{result = RADDBG_RegisterCode_X86_esp;}break; -case REGS_RegCodeX86_ebp:{result = RADDBG_RegisterCode_X86_ebp;}break; -case REGS_RegCodeX86_esi:{result = RADDBG_RegisterCode_X86_esi;}break; -case REGS_RegCodeX86_edi:{result = RADDBG_RegisterCode_X86_edi;}break; -case REGS_RegCodeX86_fsbase:{result = RADDBG_RegisterCode_X86_fsbase;}break; -case REGS_RegCodeX86_gsbase:{result = RADDBG_RegisterCode_X86_gsbase;}break; -case REGS_RegCodeX86_eflags:{result = RADDBG_RegisterCode_X86_eflags;}break; -case REGS_RegCodeX86_eip:{result = RADDBG_RegisterCode_X86_eip;}break; -case REGS_RegCodeX86_dr0:{result = RADDBG_RegisterCode_X86_dr0;}break; -case REGS_RegCodeX86_dr1:{result = RADDBG_RegisterCode_X86_dr1;}break; -case REGS_RegCodeX86_dr2:{result = RADDBG_RegisterCode_X86_dr2;}break; -case REGS_RegCodeX86_dr3:{result = RADDBG_RegisterCode_X86_dr3;}break; -case REGS_RegCodeX86_dr4:{result = RADDBG_RegisterCode_X86_dr4;}break; -case REGS_RegCodeX86_dr5:{result = RADDBG_RegisterCode_X86_dr5;}break; -case REGS_RegCodeX86_dr6:{result = RADDBG_RegisterCode_X86_dr6;}break; -case REGS_RegCodeX86_dr7:{result = RADDBG_RegisterCode_X86_dr7;}break; -case REGS_RegCodeX86_fpr0:{result = RADDBG_RegisterCode_X86_fpr0;}break; -case REGS_RegCodeX86_fpr1:{result = RADDBG_RegisterCode_X86_fpr1;}break; -case REGS_RegCodeX86_fpr2:{result = RADDBG_RegisterCode_X86_fpr2;}break; -case REGS_RegCodeX86_fpr3:{result = RADDBG_RegisterCode_X86_fpr3;}break; -case REGS_RegCodeX86_fpr4:{result = RADDBG_RegisterCode_X86_fpr4;}break; -case REGS_RegCodeX86_fpr5:{result = RADDBG_RegisterCode_X86_fpr5;}break; -case REGS_RegCodeX86_fpr6:{result = RADDBG_RegisterCode_X86_fpr6;}break; -case REGS_RegCodeX86_fpr7:{result = RADDBG_RegisterCode_X86_fpr7;}break; -case REGS_RegCodeX86_st0:{result = RADDBG_RegisterCode_X86_st0;}break; -case REGS_RegCodeX86_st1:{result = RADDBG_RegisterCode_X86_st1;}break; -case REGS_RegCodeX86_st2:{result = RADDBG_RegisterCode_X86_st2;}break; -case REGS_RegCodeX86_st3:{result = RADDBG_RegisterCode_X86_st3;}break; -case REGS_RegCodeX86_st4:{result = RADDBG_RegisterCode_X86_st4;}break; -case REGS_RegCodeX86_st5:{result = RADDBG_RegisterCode_X86_st5;}break; -case REGS_RegCodeX86_st6:{result = RADDBG_RegisterCode_X86_st6;}break; -case REGS_RegCodeX86_st7:{result = RADDBG_RegisterCode_X86_st7;}break; -case REGS_RegCodeX86_fcw:{result = RADDBG_RegisterCode_X86_fcw;}break; -case REGS_RegCodeX86_fsw:{result = RADDBG_RegisterCode_X86_fsw;}break; -case REGS_RegCodeX86_ftw:{result = RADDBG_RegisterCode_X86_ftw;}break; -case REGS_RegCodeX86_fop:{result = RADDBG_RegisterCode_X86_fop;}break; -case REGS_RegCodeX86_fcs:{result = RADDBG_RegisterCode_X86_fcs;}break; -case REGS_RegCodeX86_fds:{result = RADDBG_RegisterCode_X86_fds;}break; -case REGS_RegCodeX86_fip:{result = RADDBG_RegisterCode_X86_fip;}break; -case REGS_RegCodeX86_fdp:{result = RADDBG_RegisterCode_X86_fdp;}break; -case REGS_RegCodeX86_mxcsr:{result = RADDBG_RegisterCode_X86_mxcsr;}break; -case REGS_RegCodeX86_mxcsr_mask:{result = RADDBG_RegisterCode_X86_mxcsr_mask;}break; -case REGS_RegCodeX86_ss:{result = RADDBG_RegisterCode_X86_ss;}break; -case REGS_RegCodeX86_cs:{result = RADDBG_RegisterCode_X86_cs;}break; -case REGS_RegCodeX86_ds:{result = RADDBG_RegisterCode_X86_ds;}break; -case REGS_RegCodeX86_es:{result = RADDBG_RegisterCode_X86_es;}break; -case REGS_RegCodeX86_fs:{result = RADDBG_RegisterCode_X86_fs;}break; -case REGS_RegCodeX86_gs:{result = RADDBG_RegisterCode_X86_gs;}break; -case REGS_RegCodeX86_ymm0:{result = RADDBG_RegisterCode_X86_ymm0;}break; -case REGS_RegCodeX86_ymm1:{result = RADDBG_RegisterCode_X86_ymm1;}break; -case REGS_RegCodeX86_ymm2:{result = RADDBG_RegisterCode_X86_ymm2;}break; -case REGS_RegCodeX86_ymm3:{result = RADDBG_RegisterCode_X86_ymm3;}break; -case REGS_RegCodeX86_ymm4:{result = RADDBG_RegisterCode_X86_ymm4;}break; -case REGS_RegCodeX86_ymm5:{result = RADDBG_RegisterCode_X86_ymm5;}break; -case REGS_RegCodeX86_ymm6:{result = RADDBG_RegisterCode_X86_ymm6;}break; -case REGS_RegCodeX86_ymm7:{result = RADDBG_RegisterCode_X86_ymm7;}break; -} -}break; -} -return result; -} -internal REGS_RegCode regs_reg_code_from_arch_raddbg_code(Architecture arch, RADDBG_RegisterCode code) -{ -REGS_RegCode result = 0; -switch(arch) -{ -case Architecture_x64: -{ -switch(code) -{ -default:{}break; -case RADDBG_RegisterCode_X64_rax:{result = REGS_RegCodeX64_rax;}break; -case RADDBG_RegisterCode_X64_rcx:{result = REGS_RegCodeX64_rcx;}break; -case RADDBG_RegisterCode_X64_rdx:{result = REGS_RegCodeX64_rdx;}break; -case RADDBG_RegisterCode_X64_rbx:{result = REGS_RegCodeX64_rbx;}break; -case RADDBG_RegisterCode_X64_rsp:{result = REGS_RegCodeX64_rsp;}break; -case RADDBG_RegisterCode_X64_rbp:{result = REGS_RegCodeX64_rbp;}break; -case RADDBG_RegisterCode_X64_rsi:{result = REGS_RegCodeX64_rsi;}break; -case RADDBG_RegisterCode_X64_rdi:{result = REGS_RegCodeX64_rdi;}break; -case RADDBG_RegisterCode_X64_r8:{result = REGS_RegCodeX64_r8;}break; -case RADDBG_RegisterCode_X64_r9:{result = REGS_RegCodeX64_r9;}break; -case RADDBG_RegisterCode_X64_r10:{result = REGS_RegCodeX64_r10;}break; -case RADDBG_RegisterCode_X64_r11:{result = REGS_RegCodeX64_r11;}break; -case RADDBG_RegisterCode_X64_r12:{result = REGS_RegCodeX64_r12;}break; -case RADDBG_RegisterCode_X64_r13:{result = REGS_RegCodeX64_r13;}break; -case RADDBG_RegisterCode_X64_r14:{result = REGS_RegCodeX64_r14;}break; -case RADDBG_RegisterCode_X64_r15:{result = REGS_RegCodeX64_r15;}break; -case RADDBG_RegisterCode_X64_fsbase:{result = REGS_RegCodeX64_fsbase;}break; -case RADDBG_RegisterCode_X64_gsbase:{result = REGS_RegCodeX64_gsbase;}break; -case RADDBG_RegisterCode_X64_rip:{result = REGS_RegCodeX64_rip;}break; -case RADDBG_RegisterCode_X64_rflags:{result = REGS_RegCodeX64_rflags;}break; -case RADDBG_RegisterCode_X64_dr0:{result = REGS_RegCodeX64_dr0;}break; -case RADDBG_RegisterCode_X64_dr1:{result = REGS_RegCodeX64_dr1;}break; -case RADDBG_RegisterCode_X64_dr2:{result = REGS_RegCodeX64_dr2;}break; -case RADDBG_RegisterCode_X64_dr3:{result = REGS_RegCodeX64_dr3;}break; -case RADDBG_RegisterCode_X64_dr4:{result = REGS_RegCodeX64_dr4;}break; -case RADDBG_RegisterCode_X64_dr5:{result = REGS_RegCodeX64_dr5;}break; -case RADDBG_RegisterCode_X64_dr6:{result = REGS_RegCodeX64_dr6;}break; -case RADDBG_RegisterCode_X64_dr7:{result = REGS_RegCodeX64_dr7;}break; -case RADDBG_RegisterCode_X64_fpr0:{result = REGS_RegCodeX64_fpr0;}break; -case RADDBG_RegisterCode_X64_fpr1:{result = REGS_RegCodeX64_fpr1;}break; -case RADDBG_RegisterCode_X64_fpr2:{result = REGS_RegCodeX64_fpr2;}break; -case RADDBG_RegisterCode_X64_fpr3:{result = REGS_RegCodeX64_fpr3;}break; -case RADDBG_RegisterCode_X64_fpr4:{result = REGS_RegCodeX64_fpr4;}break; -case RADDBG_RegisterCode_X64_fpr5:{result = REGS_RegCodeX64_fpr5;}break; -case RADDBG_RegisterCode_X64_fpr6:{result = REGS_RegCodeX64_fpr6;}break; -case RADDBG_RegisterCode_X64_fpr7:{result = REGS_RegCodeX64_fpr7;}break; -case RADDBG_RegisterCode_X64_st0:{result = REGS_RegCodeX64_st0;}break; -case RADDBG_RegisterCode_X64_st1:{result = REGS_RegCodeX64_st1;}break; -case RADDBG_RegisterCode_X64_st2:{result = REGS_RegCodeX64_st2;}break; -case RADDBG_RegisterCode_X64_st3:{result = REGS_RegCodeX64_st3;}break; -case RADDBG_RegisterCode_X64_st4:{result = REGS_RegCodeX64_st4;}break; -case RADDBG_RegisterCode_X64_st5:{result = REGS_RegCodeX64_st5;}break; -case RADDBG_RegisterCode_X64_st6:{result = REGS_RegCodeX64_st6;}break; -case RADDBG_RegisterCode_X64_st7:{result = REGS_RegCodeX64_st7;}break; -case RADDBG_RegisterCode_X64_fcw:{result = REGS_RegCodeX64_fcw;}break; -case RADDBG_RegisterCode_X64_fsw:{result = REGS_RegCodeX64_fsw;}break; -case RADDBG_RegisterCode_X64_ftw:{result = REGS_RegCodeX64_ftw;}break; -case RADDBG_RegisterCode_X64_fop:{result = REGS_RegCodeX64_fop;}break; -case RADDBG_RegisterCode_X64_fcs:{result = REGS_RegCodeX64_fcs;}break; -case RADDBG_RegisterCode_X64_fds:{result = REGS_RegCodeX64_fds;}break; -case RADDBG_RegisterCode_X64_fip:{result = REGS_RegCodeX64_fip;}break; -case RADDBG_RegisterCode_X64_fdp:{result = REGS_RegCodeX64_fdp;}break; -case RADDBG_RegisterCode_X64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; -case RADDBG_RegisterCode_X64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break; -case RADDBG_RegisterCode_X64_ss:{result = REGS_RegCodeX64_ss;}break; -case RADDBG_RegisterCode_X64_cs:{result = REGS_RegCodeX64_cs;}break; -case RADDBG_RegisterCode_X64_ds:{result = REGS_RegCodeX64_ds;}break; -case RADDBG_RegisterCode_X64_es:{result = REGS_RegCodeX64_es;}break; -case RADDBG_RegisterCode_X64_fs:{result = REGS_RegCodeX64_fs;}break; -case RADDBG_RegisterCode_X64_gs:{result = REGS_RegCodeX64_gs;}break; -case RADDBG_RegisterCode_X64_ymm0:{result = REGS_RegCodeX64_ymm0;}break; -case RADDBG_RegisterCode_X64_ymm1:{result = REGS_RegCodeX64_ymm1;}break; -case RADDBG_RegisterCode_X64_ymm2:{result = REGS_RegCodeX64_ymm2;}break; -case RADDBG_RegisterCode_X64_ymm3:{result = REGS_RegCodeX64_ymm3;}break; -case RADDBG_RegisterCode_X64_ymm4:{result = REGS_RegCodeX64_ymm4;}break; -case RADDBG_RegisterCode_X64_ymm5:{result = REGS_RegCodeX64_ymm5;}break; -case RADDBG_RegisterCode_X64_ymm6:{result = REGS_RegCodeX64_ymm6;}break; -case RADDBG_RegisterCode_X64_ymm7:{result = REGS_RegCodeX64_ymm7;}break; -case RADDBG_RegisterCode_X64_ymm8:{result = REGS_RegCodeX64_ymm8;}break; -case RADDBG_RegisterCode_X64_ymm9:{result = REGS_RegCodeX64_ymm9;}break; -case RADDBG_RegisterCode_X64_ymm10:{result = REGS_RegCodeX64_ymm10;}break; -case RADDBG_RegisterCode_X64_ymm11:{result = REGS_RegCodeX64_ymm11;}break; -case RADDBG_RegisterCode_X64_ymm12:{result = REGS_RegCodeX64_ymm12;}break; -case RADDBG_RegisterCode_X64_ymm13:{result = REGS_RegCodeX64_ymm13;}break; -case RADDBG_RegisterCode_X64_ymm14:{result = REGS_RegCodeX64_ymm14;}break; -case RADDBG_RegisterCode_X64_ymm15:{result = REGS_RegCodeX64_ymm15;}break; -} -}break; -case Architecture_x86: -{ -switch(code) -{ -default:{}break; -case RADDBG_RegisterCode_X86_eax:{result = REGS_RegCodeX86_eax;}break; -case RADDBG_RegisterCode_X86_ecx:{result = REGS_RegCodeX86_ecx;}break; -case RADDBG_RegisterCode_X86_edx:{result = REGS_RegCodeX86_edx;}break; -case RADDBG_RegisterCode_X86_ebx:{result = REGS_RegCodeX86_ebx;}break; -case RADDBG_RegisterCode_X86_esp:{result = REGS_RegCodeX86_esp;}break; -case RADDBG_RegisterCode_X86_ebp:{result = REGS_RegCodeX86_ebp;}break; -case RADDBG_RegisterCode_X86_esi:{result = REGS_RegCodeX86_esi;}break; -case RADDBG_RegisterCode_X86_edi:{result = REGS_RegCodeX86_edi;}break; -case RADDBG_RegisterCode_X86_fsbase:{result = REGS_RegCodeX86_fsbase;}break; -case RADDBG_RegisterCode_X86_gsbase:{result = REGS_RegCodeX86_gsbase;}break; -case RADDBG_RegisterCode_X86_eflags:{result = REGS_RegCodeX86_eflags;}break; -case RADDBG_RegisterCode_X86_eip:{result = REGS_RegCodeX86_eip;}break; -case RADDBG_RegisterCode_X86_dr0:{result = REGS_RegCodeX86_dr0;}break; -case RADDBG_RegisterCode_X86_dr1:{result = REGS_RegCodeX86_dr1;}break; -case RADDBG_RegisterCode_X86_dr2:{result = REGS_RegCodeX86_dr2;}break; -case RADDBG_RegisterCode_X86_dr3:{result = REGS_RegCodeX86_dr3;}break; -case RADDBG_RegisterCode_X86_dr4:{result = REGS_RegCodeX86_dr4;}break; -case RADDBG_RegisterCode_X86_dr5:{result = REGS_RegCodeX86_dr5;}break; -case RADDBG_RegisterCode_X86_dr6:{result = REGS_RegCodeX86_dr6;}break; -case RADDBG_RegisterCode_X86_dr7:{result = REGS_RegCodeX86_dr7;}break; -case RADDBG_RegisterCode_X86_fpr0:{result = REGS_RegCodeX86_fpr0;}break; -case RADDBG_RegisterCode_X86_fpr1:{result = REGS_RegCodeX86_fpr1;}break; -case RADDBG_RegisterCode_X86_fpr2:{result = REGS_RegCodeX86_fpr2;}break; -case RADDBG_RegisterCode_X86_fpr3:{result = REGS_RegCodeX86_fpr3;}break; -case RADDBG_RegisterCode_X86_fpr4:{result = REGS_RegCodeX86_fpr4;}break; -case RADDBG_RegisterCode_X86_fpr5:{result = REGS_RegCodeX86_fpr5;}break; -case RADDBG_RegisterCode_X86_fpr6:{result = REGS_RegCodeX86_fpr6;}break; -case RADDBG_RegisterCode_X86_fpr7:{result = REGS_RegCodeX86_fpr7;}break; -case RADDBG_RegisterCode_X86_st0:{result = REGS_RegCodeX86_st0;}break; -case RADDBG_RegisterCode_X86_st1:{result = REGS_RegCodeX86_st1;}break; -case RADDBG_RegisterCode_X86_st2:{result = REGS_RegCodeX86_st2;}break; -case RADDBG_RegisterCode_X86_st3:{result = REGS_RegCodeX86_st3;}break; -case RADDBG_RegisterCode_X86_st4:{result = REGS_RegCodeX86_st4;}break; -case RADDBG_RegisterCode_X86_st5:{result = REGS_RegCodeX86_st5;}break; -case RADDBG_RegisterCode_X86_st6:{result = REGS_RegCodeX86_st6;}break; -case RADDBG_RegisterCode_X86_st7:{result = REGS_RegCodeX86_st7;}break; -case RADDBG_RegisterCode_X86_fcw:{result = REGS_RegCodeX86_fcw;}break; -case RADDBG_RegisterCode_X86_fsw:{result = REGS_RegCodeX86_fsw;}break; -case RADDBG_RegisterCode_X86_ftw:{result = REGS_RegCodeX86_ftw;}break; -case RADDBG_RegisterCode_X86_fop:{result = REGS_RegCodeX86_fop;}break; -case RADDBG_RegisterCode_X86_fcs:{result = REGS_RegCodeX86_fcs;}break; -case RADDBG_RegisterCode_X86_fds:{result = REGS_RegCodeX86_fds;}break; -case RADDBG_RegisterCode_X86_fip:{result = REGS_RegCodeX86_fip;}break; -case RADDBG_RegisterCode_X86_fdp:{result = REGS_RegCodeX86_fdp;}break; -case RADDBG_RegisterCode_X86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break; -case RADDBG_RegisterCode_X86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break; -case RADDBG_RegisterCode_X86_ss:{result = REGS_RegCodeX86_ss;}break; -case RADDBG_RegisterCode_X86_cs:{result = REGS_RegCodeX86_cs;}break; -case RADDBG_RegisterCode_X86_ds:{result = REGS_RegCodeX86_ds;}break; -case RADDBG_RegisterCode_X86_es:{result = REGS_RegCodeX86_es;}break; -case RADDBG_RegisterCode_X86_fs:{result = REGS_RegCodeX86_fs;}break; -case RADDBG_RegisterCode_X86_gs:{result = REGS_RegCodeX86_gs;}break; -case RADDBG_RegisterCode_X86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; -case RADDBG_RegisterCode_X86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; -case RADDBG_RegisterCode_X86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; -case RADDBG_RegisterCode_X86_ymm3:{result = REGS_RegCodeX86_ymm3;}break; -case RADDBG_RegisterCode_X86_ymm4:{result = REGS_RegCodeX86_ymm4;}break; -case RADDBG_RegisterCode_X86_ymm5:{result = REGS_RegCodeX86_ymm5;}break; -case RADDBG_RegisterCode_X86_ymm6:{result = REGS_RegCodeX86_ymm6;}break; -case RADDBG_RegisterCode_X86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; -} -}break; -} -return result; -} - -#endif diff --git a/src/regs/raddbgi/generated/regs_raddbgi.meta.c b/src/regs/raddbgi/generated/regs_raddbgi.meta.c index c52e08b2..19d272d1 100644 --- a/src/regs/raddbgi/generated/regs_raddbgi.meta.c +++ b/src/regs/raddbgi/generated/regs_raddbgi.meta.c @@ -3,9 +3,9 @@ //- GENERATED CODE -internal RADDBG_RegisterCode regs_raddbg_code_from_arch_reg_code(Architecture arch, REGS_RegCode code) +internal RADDBGI_RegisterCode regs_raddbgi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code) { -RADDBG_RegisterCode result = 0; +RADDBGI_RegisterCode result = 0; switch(arch) { default:{}break; @@ -14,82 +14,82 @@ case Architecture_x64: switch(code) { default:{}break; -case REGS_RegCodeX64_rax:{result = RADDBG_RegisterCode_X64_rax;}break; -case REGS_RegCodeX64_rcx:{result = RADDBG_RegisterCode_X64_rcx;}break; -case REGS_RegCodeX64_rdx:{result = RADDBG_RegisterCode_X64_rdx;}break; -case REGS_RegCodeX64_rbx:{result = RADDBG_RegisterCode_X64_rbx;}break; -case REGS_RegCodeX64_rsp:{result = RADDBG_RegisterCode_X64_rsp;}break; -case REGS_RegCodeX64_rbp:{result = RADDBG_RegisterCode_X64_rbp;}break; -case REGS_RegCodeX64_rsi:{result = RADDBG_RegisterCode_X64_rsi;}break; -case REGS_RegCodeX64_rdi:{result = RADDBG_RegisterCode_X64_rdi;}break; -case REGS_RegCodeX64_r8:{result = RADDBG_RegisterCode_X64_r8;}break; -case REGS_RegCodeX64_r9:{result = RADDBG_RegisterCode_X64_r9;}break; -case REGS_RegCodeX64_r10:{result = RADDBG_RegisterCode_X64_r10;}break; -case REGS_RegCodeX64_r11:{result = RADDBG_RegisterCode_X64_r11;}break; -case REGS_RegCodeX64_r12:{result = RADDBG_RegisterCode_X64_r12;}break; -case REGS_RegCodeX64_r13:{result = RADDBG_RegisterCode_X64_r13;}break; -case REGS_RegCodeX64_r14:{result = RADDBG_RegisterCode_X64_r14;}break; -case REGS_RegCodeX64_r15:{result = RADDBG_RegisterCode_X64_r15;}break; -case REGS_RegCodeX64_fsbase:{result = RADDBG_RegisterCode_X64_fsbase;}break; -case REGS_RegCodeX64_gsbase:{result = RADDBG_RegisterCode_X64_gsbase;}break; -case REGS_RegCodeX64_rip:{result = RADDBG_RegisterCode_X64_rip;}break; -case REGS_RegCodeX64_rflags:{result = RADDBG_RegisterCode_X64_rflags;}break; -case REGS_RegCodeX64_dr0:{result = RADDBG_RegisterCode_X64_dr0;}break; -case REGS_RegCodeX64_dr1:{result = RADDBG_RegisterCode_X64_dr1;}break; -case REGS_RegCodeX64_dr2:{result = RADDBG_RegisterCode_X64_dr2;}break; -case REGS_RegCodeX64_dr3:{result = RADDBG_RegisterCode_X64_dr3;}break; -case REGS_RegCodeX64_dr4:{result = RADDBG_RegisterCode_X64_dr4;}break; -case REGS_RegCodeX64_dr5:{result = RADDBG_RegisterCode_X64_dr5;}break; -case REGS_RegCodeX64_dr6:{result = RADDBG_RegisterCode_X64_dr6;}break; -case REGS_RegCodeX64_dr7:{result = RADDBG_RegisterCode_X64_dr7;}break; -case REGS_RegCodeX64_fpr0:{result = RADDBG_RegisterCode_X64_fpr0;}break; -case REGS_RegCodeX64_fpr1:{result = RADDBG_RegisterCode_X64_fpr1;}break; -case REGS_RegCodeX64_fpr2:{result = RADDBG_RegisterCode_X64_fpr2;}break; -case REGS_RegCodeX64_fpr3:{result = RADDBG_RegisterCode_X64_fpr3;}break; -case REGS_RegCodeX64_fpr4:{result = RADDBG_RegisterCode_X64_fpr4;}break; -case REGS_RegCodeX64_fpr5:{result = RADDBG_RegisterCode_X64_fpr5;}break; -case REGS_RegCodeX64_fpr6:{result = RADDBG_RegisterCode_X64_fpr6;}break; -case REGS_RegCodeX64_fpr7:{result = RADDBG_RegisterCode_X64_fpr7;}break; -case REGS_RegCodeX64_st0:{result = RADDBG_RegisterCode_X64_st0;}break; -case REGS_RegCodeX64_st1:{result = RADDBG_RegisterCode_X64_st1;}break; -case REGS_RegCodeX64_st2:{result = RADDBG_RegisterCode_X64_st2;}break; -case REGS_RegCodeX64_st3:{result = RADDBG_RegisterCode_X64_st3;}break; -case REGS_RegCodeX64_st4:{result = RADDBG_RegisterCode_X64_st4;}break; -case REGS_RegCodeX64_st5:{result = RADDBG_RegisterCode_X64_st5;}break; -case REGS_RegCodeX64_st6:{result = RADDBG_RegisterCode_X64_st6;}break; -case REGS_RegCodeX64_st7:{result = RADDBG_RegisterCode_X64_st7;}break; -case REGS_RegCodeX64_fcw:{result = RADDBG_RegisterCode_X64_fcw;}break; -case REGS_RegCodeX64_fsw:{result = RADDBG_RegisterCode_X64_fsw;}break; -case REGS_RegCodeX64_ftw:{result = RADDBG_RegisterCode_X64_ftw;}break; -case REGS_RegCodeX64_fop:{result = RADDBG_RegisterCode_X64_fop;}break; -case REGS_RegCodeX64_fcs:{result = RADDBG_RegisterCode_X64_fcs;}break; -case REGS_RegCodeX64_fds:{result = RADDBG_RegisterCode_X64_fds;}break; -case REGS_RegCodeX64_fip:{result = RADDBG_RegisterCode_X64_fip;}break; -case REGS_RegCodeX64_fdp:{result = RADDBG_RegisterCode_X64_fdp;}break; -case REGS_RegCodeX64_mxcsr:{result = RADDBG_RegisterCode_X64_mxcsr;}break; -case REGS_RegCodeX64_mxcsr_mask:{result = RADDBG_RegisterCode_X64_mxcsr_mask;}break; -case REGS_RegCodeX64_ss:{result = RADDBG_RegisterCode_X64_ss;}break; -case REGS_RegCodeX64_cs:{result = RADDBG_RegisterCode_X64_cs;}break; -case REGS_RegCodeX64_ds:{result = RADDBG_RegisterCode_X64_ds;}break; -case REGS_RegCodeX64_es:{result = RADDBG_RegisterCode_X64_es;}break; -case REGS_RegCodeX64_fs:{result = RADDBG_RegisterCode_X64_fs;}break; -case REGS_RegCodeX64_gs:{result = RADDBG_RegisterCode_X64_gs;}break; -case REGS_RegCodeX64_ymm0:{result = RADDBG_RegisterCode_X64_ymm0;}break; -case REGS_RegCodeX64_ymm1:{result = RADDBG_RegisterCode_X64_ymm1;}break; -case REGS_RegCodeX64_ymm2:{result = RADDBG_RegisterCode_X64_ymm2;}break; -case REGS_RegCodeX64_ymm3:{result = RADDBG_RegisterCode_X64_ymm3;}break; -case REGS_RegCodeX64_ymm4:{result = RADDBG_RegisterCode_X64_ymm4;}break; -case REGS_RegCodeX64_ymm5:{result = RADDBG_RegisterCode_X64_ymm5;}break; -case REGS_RegCodeX64_ymm6:{result = RADDBG_RegisterCode_X64_ymm6;}break; -case REGS_RegCodeX64_ymm7:{result = RADDBG_RegisterCode_X64_ymm7;}break; -case REGS_RegCodeX64_ymm8:{result = RADDBG_RegisterCode_X64_ymm8;}break; -case REGS_RegCodeX64_ymm9:{result = RADDBG_RegisterCode_X64_ymm9;}break; -case REGS_RegCodeX64_ymm10:{result = RADDBG_RegisterCode_X64_ymm10;}break; -case REGS_RegCodeX64_ymm11:{result = RADDBG_RegisterCode_X64_ymm11;}break; -case REGS_RegCodeX64_ymm12:{result = RADDBG_RegisterCode_X64_ymm12;}break; -case REGS_RegCodeX64_ymm13:{result = RADDBG_RegisterCode_X64_ymm13;}break; -case REGS_RegCodeX64_ymm14:{result = RADDBG_RegisterCode_X64_ymm14;}break; -case REGS_RegCodeX64_ymm15:{result = RADDBG_RegisterCode_X64_ymm15;}break; +case REGS_RegCodeX64_rax:{result = RADDBGI_RegisterCode_X64_rax;}break; +case REGS_RegCodeX64_rcx:{result = RADDBGI_RegisterCode_X64_rcx;}break; +case REGS_RegCodeX64_rdx:{result = RADDBGI_RegisterCode_X64_rdx;}break; +case REGS_RegCodeX64_rbx:{result = RADDBGI_RegisterCode_X64_rbx;}break; +case REGS_RegCodeX64_rsp:{result = RADDBGI_RegisterCode_X64_rsp;}break; +case REGS_RegCodeX64_rbp:{result = RADDBGI_RegisterCode_X64_rbp;}break; +case REGS_RegCodeX64_rsi:{result = RADDBGI_RegisterCode_X64_rsi;}break; +case REGS_RegCodeX64_rdi:{result = RADDBGI_RegisterCode_X64_rdi;}break; +case REGS_RegCodeX64_r8:{result = RADDBGI_RegisterCode_X64_r8;}break; +case REGS_RegCodeX64_r9:{result = RADDBGI_RegisterCode_X64_r9;}break; +case REGS_RegCodeX64_r10:{result = RADDBGI_RegisterCode_X64_r10;}break; +case REGS_RegCodeX64_r11:{result = RADDBGI_RegisterCode_X64_r11;}break; +case REGS_RegCodeX64_r12:{result = RADDBGI_RegisterCode_X64_r12;}break; +case REGS_RegCodeX64_r13:{result = RADDBGI_RegisterCode_X64_r13;}break; +case REGS_RegCodeX64_r14:{result = RADDBGI_RegisterCode_X64_r14;}break; +case REGS_RegCodeX64_r15:{result = RADDBGI_RegisterCode_X64_r15;}break; +case REGS_RegCodeX64_fsbase:{result = RADDBGI_RegisterCode_X64_fsbase;}break; +case REGS_RegCodeX64_gsbase:{result = RADDBGI_RegisterCode_X64_gsbase;}break; +case REGS_RegCodeX64_rip:{result = RADDBGI_RegisterCode_X64_rip;}break; +case REGS_RegCodeX64_rflags:{result = RADDBGI_RegisterCode_X64_rflags;}break; +case REGS_RegCodeX64_dr0:{result = RADDBGI_RegisterCode_X64_dr0;}break; +case REGS_RegCodeX64_dr1:{result = RADDBGI_RegisterCode_X64_dr1;}break; +case REGS_RegCodeX64_dr2:{result = RADDBGI_RegisterCode_X64_dr2;}break; +case REGS_RegCodeX64_dr3:{result = RADDBGI_RegisterCode_X64_dr3;}break; +case REGS_RegCodeX64_dr4:{result = RADDBGI_RegisterCode_X64_dr4;}break; +case REGS_RegCodeX64_dr5:{result = RADDBGI_RegisterCode_X64_dr5;}break; +case REGS_RegCodeX64_dr6:{result = RADDBGI_RegisterCode_X64_dr6;}break; +case REGS_RegCodeX64_dr7:{result = RADDBGI_RegisterCode_X64_dr7;}break; +case REGS_RegCodeX64_fpr0:{result = RADDBGI_RegisterCode_X64_fpr0;}break; +case REGS_RegCodeX64_fpr1:{result = RADDBGI_RegisterCode_X64_fpr1;}break; +case REGS_RegCodeX64_fpr2:{result = RADDBGI_RegisterCode_X64_fpr2;}break; +case REGS_RegCodeX64_fpr3:{result = RADDBGI_RegisterCode_X64_fpr3;}break; +case REGS_RegCodeX64_fpr4:{result = RADDBGI_RegisterCode_X64_fpr4;}break; +case REGS_RegCodeX64_fpr5:{result = RADDBGI_RegisterCode_X64_fpr5;}break; +case REGS_RegCodeX64_fpr6:{result = RADDBGI_RegisterCode_X64_fpr6;}break; +case REGS_RegCodeX64_fpr7:{result = RADDBGI_RegisterCode_X64_fpr7;}break; +case REGS_RegCodeX64_st0:{result = RADDBGI_RegisterCode_X64_st0;}break; +case REGS_RegCodeX64_st1:{result = RADDBGI_RegisterCode_X64_st1;}break; +case REGS_RegCodeX64_st2:{result = RADDBGI_RegisterCode_X64_st2;}break; +case REGS_RegCodeX64_st3:{result = RADDBGI_RegisterCode_X64_st3;}break; +case REGS_RegCodeX64_st4:{result = RADDBGI_RegisterCode_X64_st4;}break; +case REGS_RegCodeX64_st5:{result = RADDBGI_RegisterCode_X64_st5;}break; +case REGS_RegCodeX64_st6:{result = RADDBGI_RegisterCode_X64_st6;}break; +case REGS_RegCodeX64_st7:{result = RADDBGI_RegisterCode_X64_st7;}break; +case REGS_RegCodeX64_fcw:{result = RADDBGI_RegisterCode_X64_fcw;}break; +case REGS_RegCodeX64_fsw:{result = RADDBGI_RegisterCode_X64_fsw;}break; +case REGS_RegCodeX64_ftw:{result = RADDBGI_RegisterCode_X64_ftw;}break; +case REGS_RegCodeX64_fop:{result = RADDBGI_RegisterCode_X64_fop;}break; +case REGS_RegCodeX64_fcs:{result = RADDBGI_RegisterCode_X64_fcs;}break; +case REGS_RegCodeX64_fds:{result = RADDBGI_RegisterCode_X64_fds;}break; +case REGS_RegCodeX64_fip:{result = RADDBGI_RegisterCode_X64_fip;}break; +case REGS_RegCodeX64_fdp:{result = RADDBGI_RegisterCode_X64_fdp;}break; +case REGS_RegCodeX64_mxcsr:{result = RADDBGI_RegisterCode_X64_mxcsr;}break; +case REGS_RegCodeX64_mxcsr_mask:{result = RADDBGI_RegisterCode_X64_mxcsr_mask;}break; +case REGS_RegCodeX64_ss:{result = RADDBGI_RegisterCode_X64_ss;}break; +case REGS_RegCodeX64_cs:{result = RADDBGI_RegisterCode_X64_cs;}break; +case REGS_RegCodeX64_ds:{result = RADDBGI_RegisterCode_X64_ds;}break; +case REGS_RegCodeX64_es:{result = RADDBGI_RegisterCode_X64_es;}break; +case REGS_RegCodeX64_fs:{result = RADDBGI_RegisterCode_X64_fs;}break; +case REGS_RegCodeX64_gs:{result = RADDBGI_RegisterCode_X64_gs;}break; +case REGS_RegCodeX64_ymm0:{result = RADDBGI_RegisterCode_X64_ymm0;}break; +case REGS_RegCodeX64_ymm1:{result = RADDBGI_RegisterCode_X64_ymm1;}break; +case REGS_RegCodeX64_ymm2:{result = RADDBGI_RegisterCode_X64_ymm2;}break; +case REGS_RegCodeX64_ymm3:{result = RADDBGI_RegisterCode_X64_ymm3;}break; +case REGS_RegCodeX64_ymm4:{result = RADDBGI_RegisterCode_X64_ymm4;}break; +case REGS_RegCodeX64_ymm5:{result = RADDBGI_RegisterCode_X64_ymm5;}break; +case REGS_RegCodeX64_ymm6:{result = RADDBGI_RegisterCode_X64_ymm6;}break; +case REGS_RegCodeX64_ymm7:{result = RADDBGI_RegisterCode_X64_ymm7;}break; +case REGS_RegCodeX64_ymm8:{result = RADDBGI_RegisterCode_X64_ymm8;}break; +case REGS_RegCodeX64_ymm9:{result = RADDBGI_RegisterCode_X64_ymm9;}break; +case REGS_RegCodeX64_ymm10:{result = RADDBGI_RegisterCode_X64_ymm10;}break; +case REGS_RegCodeX64_ymm11:{result = RADDBGI_RegisterCode_X64_ymm11;}break; +case REGS_RegCodeX64_ymm12:{result = RADDBGI_RegisterCode_X64_ymm12;}break; +case REGS_RegCodeX64_ymm13:{result = RADDBGI_RegisterCode_X64_ymm13;}break; +case REGS_RegCodeX64_ymm14:{result = RADDBGI_RegisterCode_X64_ymm14;}break; +case REGS_RegCodeX64_ymm15:{result = RADDBGI_RegisterCode_X64_ymm15;}break; } }break; case Architecture_x86: @@ -97,72 +97,72 @@ case Architecture_x86: switch(code) { default:{}break; -case REGS_RegCodeX86_eax:{result = RADDBG_RegisterCode_X86_eax;}break; -case REGS_RegCodeX86_ecx:{result = RADDBG_RegisterCode_X86_ecx;}break; -case REGS_RegCodeX86_edx:{result = RADDBG_RegisterCode_X86_edx;}break; -case REGS_RegCodeX86_ebx:{result = RADDBG_RegisterCode_X86_ebx;}break; -case REGS_RegCodeX86_esp:{result = RADDBG_RegisterCode_X86_esp;}break; -case REGS_RegCodeX86_ebp:{result = RADDBG_RegisterCode_X86_ebp;}break; -case REGS_RegCodeX86_esi:{result = RADDBG_RegisterCode_X86_esi;}break; -case REGS_RegCodeX86_edi:{result = RADDBG_RegisterCode_X86_edi;}break; -case REGS_RegCodeX86_fsbase:{result = RADDBG_RegisterCode_X86_fsbase;}break; -case REGS_RegCodeX86_gsbase:{result = RADDBG_RegisterCode_X86_gsbase;}break; -case REGS_RegCodeX86_eflags:{result = RADDBG_RegisterCode_X86_eflags;}break; -case REGS_RegCodeX86_eip:{result = RADDBG_RegisterCode_X86_eip;}break; -case REGS_RegCodeX86_dr0:{result = RADDBG_RegisterCode_X86_dr0;}break; -case REGS_RegCodeX86_dr1:{result = RADDBG_RegisterCode_X86_dr1;}break; -case REGS_RegCodeX86_dr2:{result = RADDBG_RegisterCode_X86_dr2;}break; -case REGS_RegCodeX86_dr3:{result = RADDBG_RegisterCode_X86_dr3;}break; -case REGS_RegCodeX86_dr4:{result = RADDBG_RegisterCode_X86_dr4;}break; -case REGS_RegCodeX86_dr5:{result = RADDBG_RegisterCode_X86_dr5;}break; -case REGS_RegCodeX86_dr6:{result = RADDBG_RegisterCode_X86_dr6;}break; -case REGS_RegCodeX86_dr7:{result = RADDBG_RegisterCode_X86_dr7;}break; -case REGS_RegCodeX86_fpr0:{result = RADDBG_RegisterCode_X86_fpr0;}break; -case REGS_RegCodeX86_fpr1:{result = RADDBG_RegisterCode_X86_fpr1;}break; -case REGS_RegCodeX86_fpr2:{result = RADDBG_RegisterCode_X86_fpr2;}break; -case REGS_RegCodeX86_fpr3:{result = RADDBG_RegisterCode_X86_fpr3;}break; -case REGS_RegCodeX86_fpr4:{result = RADDBG_RegisterCode_X86_fpr4;}break; -case REGS_RegCodeX86_fpr5:{result = RADDBG_RegisterCode_X86_fpr5;}break; -case REGS_RegCodeX86_fpr6:{result = RADDBG_RegisterCode_X86_fpr6;}break; -case REGS_RegCodeX86_fpr7:{result = RADDBG_RegisterCode_X86_fpr7;}break; -case REGS_RegCodeX86_st0:{result = RADDBG_RegisterCode_X86_st0;}break; -case REGS_RegCodeX86_st1:{result = RADDBG_RegisterCode_X86_st1;}break; -case REGS_RegCodeX86_st2:{result = RADDBG_RegisterCode_X86_st2;}break; -case REGS_RegCodeX86_st3:{result = RADDBG_RegisterCode_X86_st3;}break; -case REGS_RegCodeX86_st4:{result = RADDBG_RegisterCode_X86_st4;}break; -case REGS_RegCodeX86_st5:{result = RADDBG_RegisterCode_X86_st5;}break; -case REGS_RegCodeX86_st6:{result = RADDBG_RegisterCode_X86_st6;}break; -case REGS_RegCodeX86_st7:{result = RADDBG_RegisterCode_X86_st7;}break; -case REGS_RegCodeX86_fcw:{result = RADDBG_RegisterCode_X86_fcw;}break; -case REGS_RegCodeX86_fsw:{result = RADDBG_RegisterCode_X86_fsw;}break; -case REGS_RegCodeX86_ftw:{result = RADDBG_RegisterCode_X86_ftw;}break; -case REGS_RegCodeX86_fop:{result = RADDBG_RegisterCode_X86_fop;}break; -case REGS_RegCodeX86_fcs:{result = RADDBG_RegisterCode_X86_fcs;}break; -case REGS_RegCodeX86_fds:{result = RADDBG_RegisterCode_X86_fds;}break; -case REGS_RegCodeX86_fip:{result = RADDBG_RegisterCode_X86_fip;}break; -case REGS_RegCodeX86_fdp:{result = RADDBG_RegisterCode_X86_fdp;}break; -case REGS_RegCodeX86_mxcsr:{result = RADDBG_RegisterCode_X86_mxcsr;}break; -case REGS_RegCodeX86_mxcsr_mask:{result = RADDBG_RegisterCode_X86_mxcsr_mask;}break; -case REGS_RegCodeX86_ss:{result = RADDBG_RegisterCode_X86_ss;}break; -case REGS_RegCodeX86_cs:{result = RADDBG_RegisterCode_X86_cs;}break; -case REGS_RegCodeX86_ds:{result = RADDBG_RegisterCode_X86_ds;}break; -case REGS_RegCodeX86_es:{result = RADDBG_RegisterCode_X86_es;}break; -case REGS_RegCodeX86_fs:{result = RADDBG_RegisterCode_X86_fs;}break; -case REGS_RegCodeX86_gs:{result = RADDBG_RegisterCode_X86_gs;}break; -case REGS_RegCodeX86_ymm0:{result = RADDBG_RegisterCode_X86_ymm0;}break; -case REGS_RegCodeX86_ymm1:{result = RADDBG_RegisterCode_X86_ymm1;}break; -case REGS_RegCodeX86_ymm2:{result = RADDBG_RegisterCode_X86_ymm2;}break; -case REGS_RegCodeX86_ymm3:{result = RADDBG_RegisterCode_X86_ymm3;}break; -case REGS_RegCodeX86_ymm4:{result = RADDBG_RegisterCode_X86_ymm4;}break; -case REGS_RegCodeX86_ymm5:{result = RADDBG_RegisterCode_X86_ymm5;}break; -case REGS_RegCodeX86_ymm6:{result = RADDBG_RegisterCode_X86_ymm6;}break; -case REGS_RegCodeX86_ymm7:{result = RADDBG_RegisterCode_X86_ymm7;}break; +case REGS_RegCodeX86_eax:{result = RADDBGI_RegisterCode_X86_eax;}break; +case REGS_RegCodeX86_ecx:{result = RADDBGI_RegisterCode_X86_ecx;}break; +case REGS_RegCodeX86_edx:{result = RADDBGI_RegisterCode_X86_edx;}break; +case REGS_RegCodeX86_ebx:{result = RADDBGI_RegisterCode_X86_ebx;}break; +case REGS_RegCodeX86_esp:{result = RADDBGI_RegisterCode_X86_esp;}break; +case REGS_RegCodeX86_ebp:{result = RADDBGI_RegisterCode_X86_ebp;}break; +case REGS_RegCodeX86_esi:{result = RADDBGI_RegisterCode_X86_esi;}break; +case REGS_RegCodeX86_edi:{result = RADDBGI_RegisterCode_X86_edi;}break; +case REGS_RegCodeX86_fsbase:{result = RADDBGI_RegisterCode_X86_fsbase;}break; +case REGS_RegCodeX86_gsbase:{result = RADDBGI_RegisterCode_X86_gsbase;}break; +case REGS_RegCodeX86_eflags:{result = RADDBGI_RegisterCode_X86_eflags;}break; +case REGS_RegCodeX86_eip:{result = RADDBGI_RegisterCode_X86_eip;}break; +case REGS_RegCodeX86_dr0:{result = RADDBGI_RegisterCode_X86_dr0;}break; +case REGS_RegCodeX86_dr1:{result = RADDBGI_RegisterCode_X86_dr1;}break; +case REGS_RegCodeX86_dr2:{result = RADDBGI_RegisterCode_X86_dr2;}break; +case REGS_RegCodeX86_dr3:{result = RADDBGI_RegisterCode_X86_dr3;}break; +case REGS_RegCodeX86_dr4:{result = RADDBGI_RegisterCode_X86_dr4;}break; +case REGS_RegCodeX86_dr5:{result = RADDBGI_RegisterCode_X86_dr5;}break; +case REGS_RegCodeX86_dr6:{result = RADDBGI_RegisterCode_X86_dr6;}break; +case REGS_RegCodeX86_dr7:{result = RADDBGI_RegisterCode_X86_dr7;}break; +case REGS_RegCodeX86_fpr0:{result = RADDBGI_RegisterCode_X86_fpr0;}break; +case REGS_RegCodeX86_fpr1:{result = RADDBGI_RegisterCode_X86_fpr1;}break; +case REGS_RegCodeX86_fpr2:{result = RADDBGI_RegisterCode_X86_fpr2;}break; +case REGS_RegCodeX86_fpr3:{result = RADDBGI_RegisterCode_X86_fpr3;}break; +case REGS_RegCodeX86_fpr4:{result = RADDBGI_RegisterCode_X86_fpr4;}break; +case REGS_RegCodeX86_fpr5:{result = RADDBGI_RegisterCode_X86_fpr5;}break; +case REGS_RegCodeX86_fpr6:{result = RADDBGI_RegisterCode_X86_fpr6;}break; +case REGS_RegCodeX86_fpr7:{result = RADDBGI_RegisterCode_X86_fpr7;}break; +case REGS_RegCodeX86_st0:{result = RADDBGI_RegisterCode_X86_st0;}break; +case REGS_RegCodeX86_st1:{result = RADDBGI_RegisterCode_X86_st1;}break; +case REGS_RegCodeX86_st2:{result = RADDBGI_RegisterCode_X86_st2;}break; +case REGS_RegCodeX86_st3:{result = RADDBGI_RegisterCode_X86_st3;}break; +case REGS_RegCodeX86_st4:{result = RADDBGI_RegisterCode_X86_st4;}break; +case REGS_RegCodeX86_st5:{result = RADDBGI_RegisterCode_X86_st5;}break; +case REGS_RegCodeX86_st6:{result = RADDBGI_RegisterCode_X86_st6;}break; +case REGS_RegCodeX86_st7:{result = RADDBGI_RegisterCode_X86_st7;}break; +case REGS_RegCodeX86_fcw:{result = RADDBGI_RegisterCode_X86_fcw;}break; +case REGS_RegCodeX86_fsw:{result = RADDBGI_RegisterCode_X86_fsw;}break; +case REGS_RegCodeX86_ftw:{result = RADDBGI_RegisterCode_X86_ftw;}break; +case REGS_RegCodeX86_fop:{result = RADDBGI_RegisterCode_X86_fop;}break; +case REGS_RegCodeX86_fcs:{result = RADDBGI_RegisterCode_X86_fcs;}break; +case REGS_RegCodeX86_fds:{result = RADDBGI_RegisterCode_X86_fds;}break; +case REGS_RegCodeX86_fip:{result = RADDBGI_RegisterCode_X86_fip;}break; +case REGS_RegCodeX86_fdp:{result = RADDBGI_RegisterCode_X86_fdp;}break; +case REGS_RegCodeX86_mxcsr:{result = RADDBGI_RegisterCode_X86_mxcsr;}break; +case REGS_RegCodeX86_mxcsr_mask:{result = RADDBGI_RegisterCode_X86_mxcsr_mask;}break; +case REGS_RegCodeX86_ss:{result = RADDBGI_RegisterCode_X86_ss;}break; +case REGS_RegCodeX86_cs:{result = RADDBGI_RegisterCode_X86_cs;}break; +case REGS_RegCodeX86_ds:{result = RADDBGI_RegisterCode_X86_ds;}break; +case REGS_RegCodeX86_es:{result = RADDBGI_RegisterCode_X86_es;}break; +case REGS_RegCodeX86_fs:{result = RADDBGI_RegisterCode_X86_fs;}break; +case REGS_RegCodeX86_gs:{result = RADDBGI_RegisterCode_X86_gs;}break; +case REGS_RegCodeX86_ymm0:{result = RADDBGI_RegisterCode_X86_ymm0;}break; +case REGS_RegCodeX86_ymm1:{result = RADDBGI_RegisterCode_X86_ymm1;}break; +case REGS_RegCodeX86_ymm2:{result = RADDBGI_RegisterCode_X86_ymm2;}break; +case REGS_RegCodeX86_ymm3:{result = RADDBGI_RegisterCode_X86_ymm3;}break; +case REGS_RegCodeX86_ymm4:{result = RADDBGI_RegisterCode_X86_ymm4;}break; +case REGS_RegCodeX86_ymm5:{result = RADDBGI_RegisterCode_X86_ymm5;}break; +case REGS_RegCodeX86_ymm6:{result = RADDBGI_RegisterCode_X86_ymm6;}break; +case REGS_RegCodeX86_ymm7:{result = RADDBGI_RegisterCode_X86_ymm7;}break; } }break; } return result; } -internal REGS_RegCode regs_reg_code_from_arch_raddbg_code(Architecture arch, RADDBG_RegisterCode code) +internal REGS_RegCode regs_reg_code_from_arch_raddbgi_code(Architecture arch, RADDBGI_RegisterCode code) { REGS_RegCode result = 0; switch(arch) @@ -173,82 +173,82 @@ case Architecture_x64: switch(code) { default:{}break; -case RADDBG_RegisterCode_X64_rax:{result = REGS_RegCodeX64_rax;}break; -case RADDBG_RegisterCode_X64_rcx:{result = REGS_RegCodeX64_rcx;}break; -case RADDBG_RegisterCode_X64_rdx:{result = REGS_RegCodeX64_rdx;}break; -case RADDBG_RegisterCode_X64_rbx:{result = REGS_RegCodeX64_rbx;}break; -case RADDBG_RegisterCode_X64_rsp:{result = REGS_RegCodeX64_rsp;}break; -case RADDBG_RegisterCode_X64_rbp:{result = REGS_RegCodeX64_rbp;}break; -case RADDBG_RegisterCode_X64_rsi:{result = REGS_RegCodeX64_rsi;}break; -case RADDBG_RegisterCode_X64_rdi:{result = REGS_RegCodeX64_rdi;}break; -case RADDBG_RegisterCode_X64_r8:{result = REGS_RegCodeX64_r8;}break; -case RADDBG_RegisterCode_X64_r9:{result = REGS_RegCodeX64_r9;}break; -case RADDBG_RegisterCode_X64_r10:{result = REGS_RegCodeX64_r10;}break; -case RADDBG_RegisterCode_X64_r11:{result = REGS_RegCodeX64_r11;}break; -case RADDBG_RegisterCode_X64_r12:{result = REGS_RegCodeX64_r12;}break; -case RADDBG_RegisterCode_X64_r13:{result = REGS_RegCodeX64_r13;}break; -case RADDBG_RegisterCode_X64_r14:{result = REGS_RegCodeX64_r14;}break; -case RADDBG_RegisterCode_X64_r15:{result = REGS_RegCodeX64_r15;}break; -case RADDBG_RegisterCode_X64_fsbase:{result = REGS_RegCodeX64_fsbase;}break; -case RADDBG_RegisterCode_X64_gsbase:{result = REGS_RegCodeX64_gsbase;}break; -case RADDBG_RegisterCode_X64_rip:{result = REGS_RegCodeX64_rip;}break; -case RADDBG_RegisterCode_X64_rflags:{result = REGS_RegCodeX64_rflags;}break; -case RADDBG_RegisterCode_X64_dr0:{result = REGS_RegCodeX64_dr0;}break; -case RADDBG_RegisterCode_X64_dr1:{result = REGS_RegCodeX64_dr1;}break; -case RADDBG_RegisterCode_X64_dr2:{result = REGS_RegCodeX64_dr2;}break; -case RADDBG_RegisterCode_X64_dr3:{result = REGS_RegCodeX64_dr3;}break; -case RADDBG_RegisterCode_X64_dr4:{result = REGS_RegCodeX64_dr4;}break; -case RADDBG_RegisterCode_X64_dr5:{result = REGS_RegCodeX64_dr5;}break; -case RADDBG_RegisterCode_X64_dr6:{result = REGS_RegCodeX64_dr6;}break; -case RADDBG_RegisterCode_X64_dr7:{result = REGS_RegCodeX64_dr7;}break; -case RADDBG_RegisterCode_X64_fpr0:{result = REGS_RegCodeX64_fpr0;}break; -case RADDBG_RegisterCode_X64_fpr1:{result = REGS_RegCodeX64_fpr1;}break; -case RADDBG_RegisterCode_X64_fpr2:{result = REGS_RegCodeX64_fpr2;}break; -case RADDBG_RegisterCode_X64_fpr3:{result = REGS_RegCodeX64_fpr3;}break; -case RADDBG_RegisterCode_X64_fpr4:{result = REGS_RegCodeX64_fpr4;}break; -case RADDBG_RegisterCode_X64_fpr5:{result = REGS_RegCodeX64_fpr5;}break; -case RADDBG_RegisterCode_X64_fpr6:{result = REGS_RegCodeX64_fpr6;}break; -case RADDBG_RegisterCode_X64_fpr7:{result = REGS_RegCodeX64_fpr7;}break; -case RADDBG_RegisterCode_X64_st0:{result = REGS_RegCodeX64_st0;}break; -case RADDBG_RegisterCode_X64_st1:{result = REGS_RegCodeX64_st1;}break; -case RADDBG_RegisterCode_X64_st2:{result = REGS_RegCodeX64_st2;}break; -case RADDBG_RegisterCode_X64_st3:{result = REGS_RegCodeX64_st3;}break; -case RADDBG_RegisterCode_X64_st4:{result = REGS_RegCodeX64_st4;}break; -case RADDBG_RegisterCode_X64_st5:{result = REGS_RegCodeX64_st5;}break; -case RADDBG_RegisterCode_X64_st6:{result = REGS_RegCodeX64_st6;}break; -case RADDBG_RegisterCode_X64_st7:{result = REGS_RegCodeX64_st7;}break; -case RADDBG_RegisterCode_X64_fcw:{result = REGS_RegCodeX64_fcw;}break; -case RADDBG_RegisterCode_X64_fsw:{result = REGS_RegCodeX64_fsw;}break; -case RADDBG_RegisterCode_X64_ftw:{result = REGS_RegCodeX64_ftw;}break; -case RADDBG_RegisterCode_X64_fop:{result = REGS_RegCodeX64_fop;}break; -case RADDBG_RegisterCode_X64_fcs:{result = REGS_RegCodeX64_fcs;}break; -case RADDBG_RegisterCode_X64_fds:{result = REGS_RegCodeX64_fds;}break; -case RADDBG_RegisterCode_X64_fip:{result = REGS_RegCodeX64_fip;}break; -case RADDBG_RegisterCode_X64_fdp:{result = REGS_RegCodeX64_fdp;}break; -case RADDBG_RegisterCode_X64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; -case RADDBG_RegisterCode_X64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break; -case RADDBG_RegisterCode_X64_ss:{result = REGS_RegCodeX64_ss;}break; -case RADDBG_RegisterCode_X64_cs:{result = REGS_RegCodeX64_cs;}break; -case RADDBG_RegisterCode_X64_ds:{result = REGS_RegCodeX64_ds;}break; -case RADDBG_RegisterCode_X64_es:{result = REGS_RegCodeX64_es;}break; -case RADDBG_RegisterCode_X64_fs:{result = REGS_RegCodeX64_fs;}break; -case RADDBG_RegisterCode_X64_gs:{result = REGS_RegCodeX64_gs;}break; -case RADDBG_RegisterCode_X64_ymm0:{result = REGS_RegCodeX64_ymm0;}break; -case RADDBG_RegisterCode_X64_ymm1:{result = REGS_RegCodeX64_ymm1;}break; -case RADDBG_RegisterCode_X64_ymm2:{result = REGS_RegCodeX64_ymm2;}break; -case RADDBG_RegisterCode_X64_ymm3:{result = REGS_RegCodeX64_ymm3;}break; -case RADDBG_RegisterCode_X64_ymm4:{result = REGS_RegCodeX64_ymm4;}break; -case RADDBG_RegisterCode_X64_ymm5:{result = REGS_RegCodeX64_ymm5;}break; -case RADDBG_RegisterCode_X64_ymm6:{result = REGS_RegCodeX64_ymm6;}break; -case RADDBG_RegisterCode_X64_ymm7:{result = REGS_RegCodeX64_ymm7;}break; -case RADDBG_RegisterCode_X64_ymm8:{result = REGS_RegCodeX64_ymm8;}break; -case RADDBG_RegisterCode_X64_ymm9:{result = REGS_RegCodeX64_ymm9;}break; -case RADDBG_RegisterCode_X64_ymm10:{result = REGS_RegCodeX64_ymm10;}break; -case RADDBG_RegisterCode_X64_ymm11:{result = REGS_RegCodeX64_ymm11;}break; -case RADDBG_RegisterCode_X64_ymm12:{result = REGS_RegCodeX64_ymm12;}break; -case RADDBG_RegisterCode_X64_ymm13:{result = REGS_RegCodeX64_ymm13;}break; -case RADDBG_RegisterCode_X64_ymm14:{result = REGS_RegCodeX64_ymm14;}break; -case RADDBG_RegisterCode_X64_ymm15:{result = REGS_RegCodeX64_ymm15;}break; +case RADDBGI_RegisterCode_X64_rax:{result = REGS_RegCodeX64_rax;}break; +case RADDBGI_RegisterCode_X64_rcx:{result = REGS_RegCodeX64_rcx;}break; +case RADDBGI_RegisterCode_X64_rdx:{result = REGS_RegCodeX64_rdx;}break; +case RADDBGI_RegisterCode_X64_rbx:{result = REGS_RegCodeX64_rbx;}break; +case RADDBGI_RegisterCode_X64_rsp:{result = REGS_RegCodeX64_rsp;}break; +case RADDBGI_RegisterCode_X64_rbp:{result = REGS_RegCodeX64_rbp;}break; +case RADDBGI_RegisterCode_X64_rsi:{result = REGS_RegCodeX64_rsi;}break; +case RADDBGI_RegisterCode_X64_rdi:{result = REGS_RegCodeX64_rdi;}break; +case RADDBGI_RegisterCode_X64_r8:{result = REGS_RegCodeX64_r8;}break; +case RADDBGI_RegisterCode_X64_r9:{result = REGS_RegCodeX64_r9;}break; +case RADDBGI_RegisterCode_X64_r10:{result = REGS_RegCodeX64_r10;}break; +case RADDBGI_RegisterCode_X64_r11:{result = REGS_RegCodeX64_r11;}break; +case RADDBGI_RegisterCode_X64_r12:{result = REGS_RegCodeX64_r12;}break; +case RADDBGI_RegisterCode_X64_r13:{result = REGS_RegCodeX64_r13;}break; +case RADDBGI_RegisterCode_X64_r14:{result = REGS_RegCodeX64_r14;}break; +case RADDBGI_RegisterCode_X64_r15:{result = REGS_RegCodeX64_r15;}break; +case RADDBGI_RegisterCode_X64_fsbase:{result = REGS_RegCodeX64_fsbase;}break; +case RADDBGI_RegisterCode_X64_gsbase:{result = REGS_RegCodeX64_gsbase;}break; +case RADDBGI_RegisterCode_X64_rip:{result = REGS_RegCodeX64_rip;}break; +case RADDBGI_RegisterCode_X64_rflags:{result = REGS_RegCodeX64_rflags;}break; +case RADDBGI_RegisterCode_X64_dr0:{result = REGS_RegCodeX64_dr0;}break; +case RADDBGI_RegisterCode_X64_dr1:{result = REGS_RegCodeX64_dr1;}break; +case RADDBGI_RegisterCode_X64_dr2:{result = REGS_RegCodeX64_dr2;}break; +case RADDBGI_RegisterCode_X64_dr3:{result = REGS_RegCodeX64_dr3;}break; +case RADDBGI_RegisterCode_X64_dr4:{result = REGS_RegCodeX64_dr4;}break; +case RADDBGI_RegisterCode_X64_dr5:{result = REGS_RegCodeX64_dr5;}break; +case RADDBGI_RegisterCode_X64_dr6:{result = REGS_RegCodeX64_dr6;}break; +case RADDBGI_RegisterCode_X64_dr7:{result = REGS_RegCodeX64_dr7;}break; +case RADDBGI_RegisterCode_X64_fpr0:{result = REGS_RegCodeX64_fpr0;}break; +case RADDBGI_RegisterCode_X64_fpr1:{result = REGS_RegCodeX64_fpr1;}break; +case RADDBGI_RegisterCode_X64_fpr2:{result = REGS_RegCodeX64_fpr2;}break; +case RADDBGI_RegisterCode_X64_fpr3:{result = REGS_RegCodeX64_fpr3;}break; +case RADDBGI_RegisterCode_X64_fpr4:{result = REGS_RegCodeX64_fpr4;}break; +case RADDBGI_RegisterCode_X64_fpr5:{result = REGS_RegCodeX64_fpr5;}break; +case RADDBGI_RegisterCode_X64_fpr6:{result = REGS_RegCodeX64_fpr6;}break; +case RADDBGI_RegisterCode_X64_fpr7:{result = REGS_RegCodeX64_fpr7;}break; +case RADDBGI_RegisterCode_X64_st0:{result = REGS_RegCodeX64_st0;}break; +case RADDBGI_RegisterCode_X64_st1:{result = REGS_RegCodeX64_st1;}break; +case RADDBGI_RegisterCode_X64_st2:{result = REGS_RegCodeX64_st2;}break; +case RADDBGI_RegisterCode_X64_st3:{result = REGS_RegCodeX64_st3;}break; +case RADDBGI_RegisterCode_X64_st4:{result = REGS_RegCodeX64_st4;}break; +case RADDBGI_RegisterCode_X64_st5:{result = REGS_RegCodeX64_st5;}break; +case RADDBGI_RegisterCode_X64_st6:{result = REGS_RegCodeX64_st6;}break; +case RADDBGI_RegisterCode_X64_st7:{result = REGS_RegCodeX64_st7;}break; +case RADDBGI_RegisterCode_X64_fcw:{result = REGS_RegCodeX64_fcw;}break; +case RADDBGI_RegisterCode_X64_fsw:{result = REGS_RegCodeX64_fsw;}break; +case RADDBGI_RegisterCode_X64_ftw:{result = REGS_RegCodeX64_ftw;}break; +case RADDBGI_RegisterCode_X64_fop:{result = REGS_RegCodeX64_fop;}break; +case RADDBGI_RegisterCode_X64_fcs:{result = REGS_RegCodeX64_fcs;}break; +case RADDBGI_RegisterCode_X64_fds:{result = REGS_RegCodeX64_fds;}break; +case RADDBGI_RegisterCode_X64_fip:{result = REGS_RegCodeX64_fip;}break; +case RADDBGI_RegisterCode_X64_fdp:{result = REGS_RegCodeX64_fdp;}break; +case RADDBGI_RegisterCode_X64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; +case RADDBGI_RegisterCode_X64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break; +case RADDBGI_RegisterCode_X64_ss:{result = REGS_RegCodeX64_ss;}break; +case RADDBGI_RegisterCode_X64_cs:{result = REGS_RegCodeX64_cs;}break; +case RADDBGI_RegisterCode_X64_ds:{result = REGS_RegCodeX64_ds;}break; +case RADDBGI_RegisterCode_X64_es:{result = REGS_RegCodeX64_es;}break; +case RADDBGI_RegisterCode_X64_fs:{result = REGS_RegCodeX64_fs;}break; +case RADDBGI_RegisterCode_X64_gs:{result = REGS_RegCodeX64_gs;}break; +case RADDBGI_RegisterCode_X64_ymm0:{result = REGS_RegCodeX64_ymm0;}break; +case RADDBGI_RegisterCode_X64_ymm1:{result = REGS_RegCodeX64_ymm1;}break; +case RADDBGI_RegisterCode_X64_ymm2:{result = REGS_RegCodeX64_ymm2;}break; +case RADDBGI_RegisterCode_X64_ymm3:{result = REGS_RegCodeX64_ymm3;}break; +case RADDBGI_RegisterCode_X64_ymm4:{result = REGS_RegCodeX64_ymm4;}break; +case RADDBGI_RegisterCode_X64_ymm5:{result = REGS_RegCodeX64_ymm5;}break; +case RADDBGI_RegisterCode_X64_ymm6:{result = REGS_RegCodeX64_ymm6;}break; +case RADDBGI_RegisterCode_X64_ymm7:{result = REGS_RegCodeX64_ymm7;}break; +case RADDBGI_RegisterCode_X64_ymm8:{result = REGS_RegCodeX64_ymm8;}break; +case RADDBGI_RegisterCode_X64_ymm9:{result = REGS_RegCodeX64_ymm9;}break; +case RADDBGI_RegisterCode_X64_ymm10:{result = REGS_RegCodeX64_ymm10;}break; +case RADDBGI_RegisterCode_X64_ymm11:{result = REGS_RegCodeX64_ymm11;}break; +case RADDBGI_RegisterCode_X64_ymm12:{result = REGS_RegCodeX64_ymm12;}break; +case RADDBGI_RegisterCode_X64_ymm13:{result = REGS_RegCodeX64_ymm13;}break; +case RADDBGI_RegisterCode_X64_ymm14:{result = REGS_RegCodeX64_ymm14;}break; +case RADDBGI_RegisterCode_X64_ymm15:{result = REGS_RegCodeX64_ymm15;}break; } }break; case Architecture_x86: @@ -256,66 +256,66 @@ case Architecture_x86: switch(code) { default:{}break; -case RADDBG_RegisterCode_X86_eax:{result = REGS_RegCodeX86_eax;}break; -case RADDBG_RegisterCode_X86_ecx:{result = REGS_RegCodeX86_ecx;}break; -case RADDBG_RegisterCode_X86_edx:{result = REGS_RegCodeX86_edx;}break; -case RADDBG_RegisterCode_X86_ebx:{result = REGS_RegCodeX86_ebx;}break; -case RADDBG_RegisterCode_X86_esp:{result = REGS_RegCodeX86_esp;}break; -case RADDBG_RegisterCode_X86_ebp:{result = REGS_RegCodeX86_ebp;}break; -case RADDBG_RegisterCode_X86_esi:{result = REGS_RegCodeX86_esi;}break; -case RADDBG_RegisterCode_X86_edi:{result = REGS_RegCodeX86_edi;}break; -case RADDBG_RegisterCode_X86_fsbase:{result = REGS_RegCodeX86_fsbase;}break; -case RADDBG_RegisterCode_X86_gsbase:{result = REGS_RegCodeX86_gsbase;}break; -case RADDBG_RegisterCode_X86_eflags:{result = REGS_RegCodeX86_eflags;}break; -case RADDBG_RegisterCode_X86_eip:{result = REGS_RegCodeX86_eip;}break; -case RADDBG_RegisterCode_X86_dr0:{result = REGS_RegCodeX86_dr0;}break; -case RADDBG_RegisterCode_X86_dr1:{result = REGS_RegCodeX86_dr1;}break; -case RADDBG_RegisterCode_X86_dr2:{result = REGS_RegCodeX86_dr2;}break; -case RADDBG_RegisterCode_X86_dr3:{result = REGS_RegCodeX86_dr3;}break; -case RADDBG_RegisterCode_X86_dr4:{result = REGS_RegCodeX86_dr4;}break; -case RADDBG_RegisterCode_X86_dr5:{result = REGS_RegCodeX86_dr5;}break; -case RADDBG_RegisterCode_X86_dr6:{result = REGS_RegCodeX86_dr6;}break; -case RADDBG_RegisterCode_X86_dr7:{result = REGS_RegCodeX86_dr7;}break; -case RADDBG_RegisterCode_X86_fpr0:{result = REGS_RegCodeX86_fpr0;}break; -case RADDBG_RegisterCode_X86_fpr1:{result = REGS_RegCodeX86_fpr1;}break; -case RADDBG_RegisterCode_X86_fpr2:{result = REGS_RegCodeX86_fpr2;}break; -case RADDBG_RegisterCode_X86_fpr3:{result = REGS_RegCodeX86_fpr3;}break; -case RADDBG_RegisterCode_X86_fpr4:{result = REGS_RegCodeX86_fpr4;}break; -case RADDBG_RegisterCode_X86_fpr5:{result = REGS_RegCodeX86_fpr5;}break; -case RADDBG_RegisterCode_X86_fpr6:{result = REGS_RegCodeX86_fpr6;}break; -case RADDBG_RegisterCode_X86_fpr7:{result = REGS_RegCodeX86_fpr7;}break; -case RADDBG_RegisterCode_X86_st0:{result = REGS_RegCodeX86_st0;}break; -case RADDBG_RegisterCode_X86_st1:{result = REGS_RegCodeX86_st1;}break; -case RADDBG_RegisterCode_X86_st2:{result = REGS_RegCodeX86_st2;}break; -case RADDBG_RegisterCode_X86_st3:{result = REGS_RegCodeX86_st3;}break; -case RADDBG_RegisterCode_X86_st4:{result = REGS_RegCodeX86_st4;}break; -case RADDBG_RegisterCode_X86_st5:{result = REGS_RegCodeX86_st5;}break; -case RADDBG_RegisterCode_X86_st6:{result = REGS_RegCodeX86_st6;}break; -case RADDBG_RegisterCode_X86_st7:{result = REGS_RegCodeX86_st7;}break; -case RADDBG_RegisterCode_X86_fcw:{result = REGS_RegCodeX86_fcw;}break; -case RADDBG_RegisterCode_X86_fsw:{result = REGS_RegCodeX86_fsw;}break; -case RADDBG_RegisterCode_X86_ftw:{result = REGS_RegCodeX86_ftw;}break; -case RADDBG_RegisterCode_X86_fop:{result = REGS_RegCodeX86_fop;}break; -case RADDBG_RegisterCode_X86_fcs:{result = REGS_RegCodeX86_fcs;}break; -case RADDBG_RegisterCode_X86_fds:{result = REGS_RegCodeX86_fds;}break; -case RADDBG_RegisterCode_X86_fip:{result = REGS_RegCodeX86_fip;}break; -case RADDBG_RegisterCode_X86_fdp:{result = REGS_RegCodeX86_fdp;}break; -case RADDBG_RegisterCode_X86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break; -case RADDBG_RegisterCode_X86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break; -case RADDBG_RegisterCode_X86_ss:{result = REGS_RegCodeX86_ss;}break; -case RADDBG_RegisterCode_X86_cs:{result = REGS_RegCodeX86_cs;}break; -case RADDBG_RegisterCode_X86_ds:{result = REGS_RegCodeX86_ds;}break; -case RADDBG_RegisterCode_X86_es:{result = REGS_RegCodeX86_es;}break; -case RADDBG_RegisterCode_X86_fs:{result = REGS_RegCodeX86_fs;}break; -case RADDBG_RegisterCode_X86_gs:{result = REGS_RegCodeX86_gs;}break; -case RADDBG_RegisterCode_X86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; -case RADDBG_RegisterCode_X86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; -case RADDBG_RegisterCode_X86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; -case RADDBG_RegisterCode_X86_ymm3:{result = REGS_RegCodeX86_ymm3;}break; -case RADDBG_RegisterCode_X86_ymm4:{result = REGS_RegCodeX86_ymm4;}break; -case RADDBG_RegisterCode_X86_ymm5:{result = REGS_RegCodeX86_ymm5;}break; -case RADDBG_RegisterCode_X86_ymm6:{result = REGS_RegCodeX86_ymm6;}break; -case RADDBG_RegisterCode_X86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; +case RADDBGI_RegisterCode_X86_eax:{result = REGS_RegCodeX86_eax;}break; +case RADDBGI_RegisterCode_X86_ecx:{result = REGS_RegCodeX86_ecx;}break; +case RADDBGI_RegisterCode_X86_edx:{result = REGS_RegCodeX86_edx;}break; +case RADDBGI_RegisterCode_X86_ebx:{result = REGS_RegCodeX86_ebx;}break; +case RADDBGI_RegisterCode_X86_esp:{result = REGS_RegCodeX86_esp;}break; +case RADDBGI_RegisterCode_X86_ebp:{result = REGS_RegCodeX86_ebp;}break; +case RADDBGI_RegisterCode_X86_esi:{result = REGS_RegCodeX86_esi;}break; +case RADDBGI_RegisterCode_X86_edi:{result = REGS_RegCodeX86_edi;}break; +case RADDBGI_RegisterCode_X86_fsbase:{result = REGS_RegCodeX86_fsbase;}break; +case RADDBGI_RegisterCode_X86_gsbase:{result = REGS_RegCodeX86_gsbase;}break; +case RADDBGI_RegisterCode_X86_eflags:{result = REGS_RegCodeX86_eflags;}break; +case RADDBGI_RegisterCode_X86_eip:{result = REGS_RegCodeX86_eip;}break; +case RADDBGI_RegisterCode_X86_dr0:{result = REGS_RegCodeX86_dr0;}break; +case RADDBGI_RegisterCode_X86_dr1:{result = REGS_RegCodeX86_dr1;}break; +case RADDBGI_RegisterCode_X86_dr2:{result = REGS_RegCodeX86_dr2;}break; +case RADDBGI_RegisterCode_X86_dr3:{result = REGS_RegCodeX86_dr3;}break; +case RADDBGI_RegisterCode_X86_dr4:{result = REGS_RegCodeX86_dr4;}break; +case RADDBGI_RegisterCode_X86_dr5:{result = REGS_RegCodeX86_dr5;}break; +case RADDBGI_RegisterCode_X86_dr6:{result = REGS_RegCodeX86_dr6;}break; +case RADDBGI_RegisterCode_X86_dr7:{result = REGS_RegCodeX86_dr7;}break; +case RADDBGI_RegisterCode_X86_fpr0:{result = REGS_RegCodeX86_fpr0;}break; +case RADDBGI_RegisterCode_X86_fpr1:{result = REGS_RegCodeX86_fpr1;}break; +case RADDBGI_RegisterCode_X86_fpr2:{result = REGS_RegCodeX86_fpr2;}break; +case RADDBGI_RegisterCode_X86_fpr3:{result = REGS_RegCodeX86_fpr3;}break; +case RADDBGI_RegisterCode_X86_fpr4:{result = REGS_RegCodeX86_fpr4;}break; +case RADDBGI_RegisterCode_X86_fpr5:{result = REGS_RegCodeX86_fpr5;}break; +case RADDBGI_RegisterCode_X86_fpr6:{result = REGS_RegCodeX86_fpr6;}break; +case RADDBGI_RegisterCode_X86_fpr7:{result = REGS_RegCodeX86_fpr7;}break; +case RADDBGI_RegisterCode_X86_st0:{result = REGS_RegCodeX86_st0;}break; +case RADDBGI_RegisterCode_X86_st1:{result = REGS_RegCodeX86_st1;}break; +case RADDBGI_RegisterCode_X86_st2:{result = REGS_RegCodeX86_st2;}break; +case RADDBGI_RegisterCode_X86_st3:{result = REGS_RegCodeX86_st3;}break; +case RADDBGI_RegisterCode_X86_st4:{result = REGS_RegCodeX86_st4;}break; +case RADDBGI_RegisterCode_X86_st5:{result = REGS_RegCodeX86_st5;}break; +case RADDBGI_RegisterCode_X86_st6:{result = REGS_RegCodeX86_st6;}break; +case RADDBGI_RegisterCode_X86_st7:{result = REGS_RegCodeX86_st7;}break; +case RADDBGI_RegisterCode_X86_fcw:{result = REGS_RegCodeX86_fcw;}break; +case RADDBGI_RegisterCode_X86_fsw:{result = REGS_RegCodeX86_fsw;}break; +case RADDBGI_RegisterCode_X86_ftw:{result = REGS_RegCodeX86_ftw;}break; +case RADDBGI_RegisterCode_X86_fop:{result = REGS_RegCodeX86_fop;}break; +case RADDBGI_RegisterCode_X86_fcs:{result = REGS_RegCodeX86_fcs;}break; +case RADDBGI_RegisterCode_X86_fds:{result = REGS_RegCodeX86_fds;}break; +case RADDBGI_RegisterCode_X86_fip:{result = REGS_RegCodeX86_fip;}break; +case RADDBGI_RegisterCode_X86_fdp:{result = REGS_RegCodeX86_fdp;}break; +case RADDBGI_RegisterCode_X86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break; +case RADDBGI_RegisterCode_X86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break; +case RADDBGI_RegisterCode_X86_ss:{result = REGS_RegCodeX86_ss;}break; +case RADDBGI_RegisterCode_X86_cs:{result = REGS_RegCodeX86_cs;}break; +case RADDBGI_RegisterCode_X86_ds:{result = REGS_RegCodeX86_ds;}break; +case RADDBGI_RegisterCode_X86_es:{result = REGS_RegCodeX86_es;}break; +case RADDBGI_RegisterCode_X86_fs:{result = REGS_RegCodeX86_fs;}break; +case RADDBGI_RegisterCode_X86_gs:{result = REGS_RegCodeX86_gs;}break; +case RADDBGI_RegisterCode_X86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; +case RADDBGI_RegisterCode_X86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; +case RADDBGI_RegisterCode_X86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; +case RADDBGI_RegisterCode_X86_ymm3:{result = REGS_RegCodeX86_ymm3;}break; +case RADDBGI_RegisterCode_X86_ymm4:{result = REGS_RegCodeX86_ymm4;}break; +case RADDBGI_RegisterCode_X86_ymm5:{result = REGS_RegCodeX86_ymm5;}break; +case RADDBGI_RegisterCode_X86_ymm6:{result = REGS_RegCodeX86_ymm6;}break; +case RADDBGI_RegisterCode_X86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; } }break; } diff --git a/src/regs/raddbgi/generated/regs_raddbgi.meta.h b/src/regs/raddbgi/generated/regs_raddbgi.meta.h index 6e1c7f59..43dafbdd 100644 --- a/src/regs/raddbgi/generated/regs_raddbgi.meta.h +++ b/src/regs/raddbgi/generated/regs_raddbgi.meta.h @@ -3,8 +3,8 @@ //- GENERATED CODE -#ifndef REGS_RADDBG_META_H -#define REGS_RADDBG_META_H +#ifndef REGS_RADDBGI_META_H +#define REGS_RADDBGI_META_H -#endif // REGS_RADDBG_META_H +#endif // REGS_RADDBGI_META_H diff --git a/src/regs/raddbgi/regs_raddbgi.h b/src/regs/raddbgi/regs_raddbgi.h index 77f9a25d..03b3a569 100644 --- a/src/regs/raddbgi/regs_raddbgi.h +++ b/src/regs/raddbgi/regs_raddbgi.h @@ -1,10 +1,10 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef REGS_RADDBG_H -#define REGS_RADDBG_H +#ifndef REGS_RADDBGI_H +#define REGS_RADDBGI_H -internal RADDBG_RegisterCode regs_raddbg_code_from_arch_reg_code(Architecture arch, REGS_RegCode code); -internal REGS_RegCode regs_reg_code_from_arch_raddbg_code(Architecture arch, RADDBG_RegisterCode reg); +internal RADDBGI_RegisterCode regs_raddbgi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code); +internal REGS_RegCode regs_reg_code_from_arch_raddbgi_code(Architecture arch, RADDBGI_RegisterCode reg); -#endif //REGS_RADDBG_H +#endif //REGS_RADDBGI_H diff --git a/src/regs/raddbgi/regs_raddbgi.mc b/src/regs/raddbgi/regs_raddbgi.mdesk similarity index 65% rename from src/regs/raddbgi/regs_raddbgi.mc rename to src/regs/raddbgi/regs_raddbgi.mdesk index ce76ed45..a70a5011 100644 --- a/src/regs/raddbgi/regs_raddbgi.mc +++ b/src/regs/raddbgi/regs_raddbgi.mdesk @@ -6,9 +6,9 @@ @table_gen @c_file { - `internal RADDBG_RegisterCode regs_raddbg_code_from_arch_reg_code(Architecture arch, REGS_RegCode code)`; + `internal RADDBGI_RegisterCode regs_raddbgi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code)`; `{`; - `RADDBG_RegisterCode result = 0;`; + `RADDBGI_RegisterCode result = 0;`; `switch(arch)`; `{`; `default:{}break;`; @@ -17,7 +17,7 @@ `switch(code)` `{`; `default:{}break;`; - @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RADDBG_RegisterCode_X64_$(a.name);}break;`; + @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RADDBGI_RegisterCode_X64_$(a.name);}break;`; `}`; `}break;`; `case Architecture_x86:`; @@ -25,7 +25,7 @@ `switch(code)` `{`; `default:{}break;`; - @expand(REGS_RegTableX86 a) `case REGS_RegCodeX86_$(a.name):{result = RADDBG_RegisterCode_X86_$(a.name);}break;`; + @expand(REGS_RegTableX86 a) `case REGS_RegCodeX86_$(a.name):{result = RADDBGI_RegisterCode_X86_$(a.name);}break;`; `}`; `}break;`; `}`; @@ -35,7 +35,7 @@ @table_gen @c_file { - `internal REGS_RegCode regs_reg_code_from_arch_raddbg_code(Architecture arch, RADDBG_RegisterCode code)`; + `internal REGS_RegCode regs_reg_code_from_arch_raddbgi_code(Architecture arch, RADDBGI_RegisterCode code)`; `{`; `REGS_RegCode result = 0;`; `switch(arch)`; @@ -46,7 +46,7 @@ `switch(code)` `{`; `default:{}break;`; - @expand(REGS_RegTableX64 a) `case RADDBG_RegisterCode_X64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`; + @expand(REGS_RegTableX64 a) `case RADDBGI_RegisterCode_X64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`; `}`; `}break;`; `case Architecture_x86:`; @@ -54,7 +54,7 @@ `switch(code)` `{`; `default:{}break;`; - @expand(REGS_RegTableX86 a) `case RADDBG_RegisterCode_X86_$(a.name):{result = REGS_RegCodeX86_$(a.name);}break;`; + @expand(REGS_RegTableX86 a) `case RADDBGI_RegisterCode_X86_$(a.name):{result = REGS_RegCodeX86_$(a.name);}break;`; `}`; `}break;`; `}`; diff --git a/src/scratch/look_at_raddbg.c b/src/scratch/look_at_raddbg.c index ce6d9129..a6aa5b8d 100644 --- a/src/scratch/look_at_raddbg.c +++ b/src/scratch/look_at_raddbg.c @@ -22,16 +22,16 @@ int main(int argument_count, char **arguments) uint8_t *data = (uint8_t *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, data_size); // parse raw data as raddbg - RADDBG_Parsed rdbg = {0}; - RADDBG_ParseStatus parse_status = raddbg_parse(data, data_size, &rdbg); + RADDBGI_Parsed rdbg = {0}; + RADDBGI_ParseStatus parse_status = raddbgi_parse(data, data_size, &rdbg); // usage example: print out all procedure symbol names #if 1 for(uint64_t procedure_idx = 0; procedure_idx < rdbg.procedure_count; procedure_idx += 1) { - RADDBG_Procedure *procedure = &rdbg.procedures[procedure_idx]; + RADDBGI_Procedure *procedure = &rdbg.procedures[procedure_idx]; uint64_t name_size = 0; - uint8_t *name = raddbg_string_from_idx(&rdbg, procedure->name_string_idx, &name_size); + uint8_t *name = raddbgi_string_from_idx(&rdbg, procedure->name_string_idx, &name_size); printf("[%I64u] %.*s\n", procedure_idx, (int)name_size, name); } #endif @@ -40,15 +40,15 @@ int main(int argument_count, char **arguments) #if 0 for(uint64_t udt_idx = 0; udt_idx < rdbg.udt_count; udt_idx += 1) { - RADDBG_UDT *udt = &rdbg.udts[udt_idx]; - RADDBG_TypeNode *type = &rdbg.type_nodes[udt->self_type_idx]; + RADDBGI_UDT *udt = &rdbg.udts[udt_idx]; + RADDBGI_TypeNode *type = &rdbg.type_nodes[udt->self_type_idx]; uint64_t name_size = 0; - uint8_t *name = raddbg_string_from_idx(&rdbg, type->user_defined.name_string_idx, &name_size); + uint8_t *name = raddbgi_string_from_idx(&rdbg, type->user_defined.name_string_idx, &name_size); printf("[%I64u] %.*s\n", udt_idx, (int)name_size, name); } #endif - // for getting more info, look at the `RADDBG_Parsed` structure. all data is + // for getting more info, look at the `RADDBGI_Parsed` structure. all data is // represented as a bunch of flat plain-old-data tables. data which must // reference other data uses indices into that other data's table. for // example, given a `type_idx`, I will index into `rdbg.type_nodes`. given a diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c index 48bfa512..0500ac74 100644 --- a/src/type_graph/type_graph.c +++ b/src/type_graph/type_graph.c @@ -54,85 +54,85 @@ tg_key_list_copy(Arena *arena, TG_KeyList *src) //~ rjf: RADDBG <-> TG Enum Conversions internal TG_Kind -tg_kind_from_raddbg_type_kind(RADDBG_TypeKind kind) +tg_kind_from_raddbgi_type_kind(RADDBGI_TypeKind kind) { TG_Kind result = TG_Kind_Null; switch(kind) { default:{}break; - case RADDBG_TypeKind_Void: {result = TG_Kind_Void;}break; - case RADDBG_TypeKind_Handle: {result = TG_Kind_Handle;}break; - case RADDBG_TypeKind_Char8: {result = TG_Kind_Char8;}break; - case RADDBG_TypeKind_Char16: {result = TG_Kind_Char16;}break; - case RADDBG_TypeKind_Char32: {result = TG_Kind_Char32;}break; - case RADDBG_TypeKind_UChar8: {result = TG_Kind_UChar8;}break; - case RADDBG_TypeKind_UChar16: {result = TG_Kind_UChar16;}break; - case RADDBG_TypeKind_UChar32: {result = TG_Kind_UChar32;}break; - case RADDBG_TypeKind_U8: {result = TG_Kind_U8;}break; - case RADDBG_TypeKind_U16: {result = TG_Kind_U16;}break; - case RADDBG_TypeKind_U32: {result = TG_Kind_U32;}break; - case RADDBG_TypeKind_U64: {result = TG_Kind_U64;}break; - case RADDBG_TypeKind_U128: {result = TG_Kind_U128;}break; - case RADDBG_TypeKind_U256: {result = TG_Kind_U256;}break; - case RADDBG_TypeKind_U512: {result = TG_Kind_U512;}break; - case RADDBG_TypeKind_S8: {result = TG_Kind_S8;}break; - case RADDBG_TypeKind_S16: {result = TG_Kind_S16;}break; - case RADDBG_TypeKind_S32: {result = TG_Kind_S32;}break; - case RADDBG_TypeKind_S64: {result = TG_Kind_S64;}break; - case RADDBG_TypeKind_S128: {result = TG_Kind_S128;}break; - case RADDBG_TypeKind_S256: {result = TG_Kind_S256;}break; - case RADDBG_TypeKind_S512: {result = TG_Kind_S512;}break; - case RADDBG_TypeKind_Bool: {result = TG_Kind_Bool;}break; - case RADDBG_TypeKind_F16: {result = TG_Kind_F16;}break; - case RADDBG_TypeKind_F32: {result = TG_Kind_F32;}break; - case RADDBG_TypeKind_F32PP: {result = TG_Kind_F32PP;}break; - case RADDBG_TypeKind_F48: {result = TG_Kind_F48;}break; - case RADDBG_TypeKind_F64: {result = TG_Kind_F64;}break; - case RADDBG_TypeKind_F80: {result = TG_Kind_F80;}break; - case RADDBG_TypeKind_F128: {result = TG_Kind_F128;}break; - case RADDBG_TypeKind_ComplexF32: {result = TG_Kind_ComplexF32;}break; - case RADDBG_TypeKind_ComplexF64: {result = TG_Kind_ComplexF64;}break; - case RADDBG_TypeKind_ComplexF80: {result = TG_Kind_ComplexF80;}break; - case RADDBG_TypeKind_ComplexF128: {result = TG_Kind_ComplexF128;}break; - case RADDBG_TypeKind_Modifier: {result = TG_Kind_Modifier;}break; - case RADDBG_TypeKind_Ptr: {result = TG_Kind_Ptr;}break; - case RADDBG_TypeKind_LRef: {result = TG_Kind_LRef;}break; - case RADDBG_TypeKind_RRef: {result = TG_Kind_RRef;}break; - case RADDBG_TypeKind_Array: {result = TG_Kind_Array;}break; - case RADDBG_TypeKind_Function: {result = TG_Kind_Function;}break; - case RADDBG_TypeKind_Method: {result = TG_Kind_Method;}break; - case RADDBG_TypeKind_MemberPtr: {result = TG_Kind_MemberPtr;}break; - case RADDBG_TypeKind_Struct: {result = TG_Kind_Struct;}break; - case RADDBG_TypeKind_Class: {result = TG_Kind_Class;}break; - case RADDBG_TypeKind_Union: {result = TG_Kind_Union;}break; - case RADDBG_TypeKind_Enum: {result = TG_Kind_Enum;}break; - case RADDBG_TypeKind_Alias: {result = TG_Kind_Alias;}break; - case RADDBG_TypeKind_IncompleteStruct: {result = TG_Kind_IncompleteStruct;}break; - case RADDBG_TypeKind_IncompleteUnion: {result = TG_Kind_IncompleteUnion;}break; - case RADDBG_TypeKind_IncompleteClass: {result = TG_Kind_IncompleteClass;}break; - case RADDBG_TypeKind_IncompleteEnum: {result = TG_Kind_IncompleteEnum;}break; - case RADDBG_TypeKind_Bitfield: {result = TG_Kind_Bitfield;}break; - case RADDBG_TypeKind_Variadic: {result = TG_Kind_Variadic;}break; + case RADDBGI_TypeKind_Void: {result = TG_Kind_Void;}break; + case RADDBGI_TypeKind_Handle: {result = TG_Kind_Handle;}break; + case RADDBGI_TypeKind_Char8: {result = TG_Kind_Char8;}break; + case RADDBGI_TypeKind_Char16: {result = TG_Kind_Char16;}break; + case RADDBGI_TypeKind_Char32: {result = TG_Kind_Char32;}break; + case RADDBGI_TypeKind_UChar8: {result = TG_Kind_UChar8;}break; + case RADDBGI_TypeKind_UChar16: {result = TG_Kind_UChar16;}break; + case RADDBGI_TypeKind_UChar32: {result = TG_Kind_UChar32;}break; + case RADDBGI_TypeKind_U8: {result = TG_Kind_U8;}break; + case RADDBGI_TypeKind_U16: {result = TG_Kind_U16;}break; + case RADDBGI_TypeKind_U32: {result = TG_Kind_U32;}break; + case RADDBGI_TypeKind_U64: {result = TG_Kind_U64;}break; + case RADDBGI_TypeKind_U128: {result = TG_Kind_U128;}break; + case RADDBGI_TypeKind_U256: {result = TG_Kind_U256;}break; + case RADDBGI_TypeKind_U512: {result = TG_Kind_U512;}break; + case RADDBGI_TypeKind_S8: {result = TG_Kind_S8;}break; + case RADDBGI_TypeKind_S16: {result = TG_Kind_S16;}break; + case RADDBGI_TypeKind_S32: {result = TG_Kind_S32;}break; + case RADDBGI_TypeKind_S64: {result = TG_Kind_S64;}break; + case RADDBGI_TypeKind_S128: {result = TG_Kind_S128;}break; + case RADDBGI_TypeKind_S256: {result = TG_Kind_S256;}break; + case RADDBGI_TypeKind_S512: {result = TG_Kind_S512;}break; + case RADDBGI_TypeKind_Bool: {result = TG_Kind_Bool;}break; + case RADDBGI_TypeKind_F16: {result = TG_Kind_F16;}break; + case RADDBGI_TypeKind_F32: {result = TG_Kind_F32;}break; + case RADDBGI_TypeKind_F32PP: {result = TG_Kind_F32PP;}break; + case RADDBGI_TypeKind_F48: {result = TG_Kind_F48;}break; + case RADDBGI_TypeKind_F64: {result = TG_Kind_F64;}break; + case RADDBGI_TypeKind_F80: {result = TG_Kind_F80;}break; + case RADDBGI_TypeKind_F128: {result = TG_Kind_F128;}break; + case RADDBGI_TypeKind_ComplexF32: {result = TG_Kind_ComplexF32;}break; + case RADDBGI_TypeKind_ComplexF64: {result = TG_Kind_ComplexF64;}break; + case RADDBGI_TypeKind_ComplexF80: {result = TG_Kind_ComplexF80;}break; + case RADDBGI_TypeKind_ComplexF128: {result = TG_Kind_ComplexF128;}break; + case RADDBGI_TypeKind_Modifier: {result = TG_Kind_Modifier;}break; + case RADDBGI_TypeKind_Ptr: {result = TG_Kind_Ptr;}break; + case RADDBGI_TypeKind_LRef: {result = TG_Kind_LRef;}break; + case RADDBGI_TypeKind_RRef: {result = TG_Kind_RRef;}break; + case RADDBGI_TypeKind_Array: {result = TG_Kind_Array;}break; + case RADDBGI_TypeKind_Function: {result = TG_Kind_Function;}break; + case RADDBGI_TypeKind_Method: {result = TG_Kind_Method;}break; + case RADDBGI_TypeKind_MemberPtr: {result = TG_Kind_MemberPtr;}break; + case RADDBGI_TypeKind_Struct: {result = TG_Kind_Struct;}break; + case RADDBGI_TypeKind_Class: {result = TG_Kind_Class;}break; + case RADDBGI_TypeKind_Union: {result = TG_Kind_Union;}break; + case RADDBGI_TypeKind_Enum: {result = TG_Kind_Enum;}break; + case RADDBGI_TypeKind_Alias: {result = TG_Kind_Alias;}break; + case RADDBGI_TypeKind_IncompleteStruct: {result = TG_Kind_IncompleteStruct;}break; + case RADDBGI_TypeKind_IncompleteUnion: {result = TG_Kind_IncompleteUnion;}break; + case RADDBGI_TypeKind_IncompleteClass: {result = TG_Kind_IncompleteClass;}break; + case RADDBGI_TypeKind_IncompleteEnum: {result = TG_Kind_IncompleteEnum;}break; + case RADDBGI_TypeKind_Bitfield: {result = TG_Kind_Bitfield;}break; + case RADDBGI_TypeKind_Variadic: {result = TG_Kind_Variadic;}break; } return result; } internal TG_MemberKind -tg_member_kind_from_raddbg_member_kind(RADDBG_MemberKind kind) +tg_member_kind_from_raddbgi_member_kind(RADDBGI_MemberKind kind) { TG_MemberKind result = TG_MemberKind_Null; switch(kind) { default:{}break; - case RADDBG_MemberKind_DataField: {result = TG_MemberKind_DataField;}break; - case RADDBG_MemberKind_StaticData: {result = TG_MemberKind_StaticData;}break; - case RADDBG_MemberKind_Method: {result = TG_MemberKind_Method;}break; - case RADDBG_MemberKind_StaticMethod: {result = TG_MemberKind_StaticMethod;}break; - case RADDBG_MemberKind_VirtualMethod: {result = TG_MemberKind_VirtualMethod;}break; - case RADDBG_MemberKind_VTablePtr: {result = TG_MemberKind_VTablePtr;}break; - case RADDBG_MemberKind_Base: {result = TG_MemberKind_Base;}break; - case RADDBG_MemberKind_VirtualBase: {result = TG_MemberKind_VirtualBase;}break; - case RADDBG_MemberKind_NestedType: {result = TG_MemberKind_NestedType;}break; + case RADDBGI_MemberKind_DataField: {result = TG_MemberKind_DataField;}break; + case RADDBGI_MemberKind_StaticData: {result = TG_MemberKind_StaticData;}break; + case RADDBGI_MemberKind_Method: {result = TG_MemberKind_Method;}break; + case RADDBGI_MemberKind_StaticMethod: {result = TG_MemberKind_StaticMethod;}break; + case RADDBGI_MemberKind_VirtualMethod: {result = TG_MemberKind_VirtualMethod;}break; + case RADDBGI_MemberKind_VTablePtr: {result = TG_MemberKind_VTablePtr;}break; + case RADDBGI_MemberKind_Base: {result = TG_MemberKind_Base;}break; + case RADDBGI_MemberKind_VirtualBase: {result = TG_MemberKind_VirtualBase;}break; + case RADDBGI_MemberKind_NestedType: {result = TG_MemberKind_NestedType;}break; } return result; } @@ -274,7 +274,7 @@ tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_type_key, U64 u64 //~ rjf: Graph Introspection API internal TG_Type * -tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { TG_Type *type = &tg_type_nil; U64 reg_byte_count = 0; @@ -319,7 +319,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg }break; case TG_Kind_Array: { - U64 ptee_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, cons_type->direct_type_key); + U64 ptee_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, cons_type->direct_type_key); type->byte_size = ptee_size * type->count; }break; } @@ -333,18 +333,18 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg U64 type_node_idx = key.u64[0]; if(0 <= type_node_idx && type_node_idx < rdbg->type_nodes_count) { - RADDBG_TypeNode *rdbg_type = &rdbg->type_nodes[type_node_idx]; - TG_Kind kind = tg_kind_from_raddbg_type_kind(rdbg_type->kind); + RADDBGI_TypeNode *rdbg_type = &rdbg->type_nodes[type_node_idx]; + TG_Kind kind = tg_kind_from_raddbgi_type_kind(rdbg_type->kind); //- rjf: record types => unpack name * members & produce - if(RADDBG_TypeKind_FirstRecord <= rdbg_type->kind && rdbg_type->kind <= RADDBG_TypeKind_LastRecord) + if(RADDBGI_TypeKind_FirstRecord <= rdbg_type->kind && rdbg_type->kind <= RADDBGI_TypeKind_LastRecord) { // rjf: unpack name String8 name = {0}; - name.str = raddbg_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); // rjf: unpack UDT info - RADDBG_UDT *udt = raddbg_element_from_idx(rdbg, udts, rdbg_type->user_defined.udt_idx); + RADDBGI_UDT *udt = raddbgi_element_from_idx(rdbg, udts, rdbg_type->user_defined.udt_idx); // rjf: unpack members TG_Member *members = 0; @@ -358,17 +358,17 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg member_idx < udt->member_first+udt->member_count; member_idx += 1) { - RADDBG_Member *src = &rdbg->members[member_idx]; + RADDBGI_Member *src = &rdbg->members[member_idx]; TG_Kind member_type_kind = TG_Kind_Null; if(src->type_idx < rdbg->type_nodes_count) { - RADDBG_TypeNode *member_type = &rdbg->type_nodes[src->type_idx]; - member_type_kind = tg_kind_from_raddbg_type_kind(member_type->kind); + RADDBGI_TypeNode *member_type = &rdbg->type_nodes[src->type_idx]; + member_type_kind = tg_kind_from_raddbgi_type_kind(member_type->kind); } TG_Member *dst = &members[member_idx-udt->member_first]; - dst->kind = tg_member_kind_from_raddbg_member_kind(src->kind); + dst->kind = tg_member_kind_from_raddbgi_member_kind(src->kind); dst->type_key = tg_key_ext(member_type_kind, (U64)src->type_idx); - dst->name.str = raddbg_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); + dst->name.str = raddbgi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); dst->off = (U64)src->off; } } @@ -384,18 +384,18 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg } //- rjf: enum types => unpack name * values & produce - else if(rdbg_type->kind == RADDBG_TypeKind_Enum) + else if(rdbg_type->kind == RADDBGI_TypeKind_Enum) { // rjf: unpack name String8 name = {0}; - name.str = raddbg_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); // rjf: unpack direct type TG_Key direct_type_key = zero_struct; if(rdbg_type->user_defined.direct_type_idx < type_node_idx) { - RADDBG_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; - TG_Kind direct_type_kind = tg_kind_from_raddbg_type_kind(direct_type_node->kind); + RADDBGI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; + TG_Kind direct_type_kind = tg_kind_from_raddbgi_type_kind(direct_type_node->kind); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->user_defined.direct_type_idx); } @@ -406,7 +406,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg U32 udt_idx = rdbg_type->user_defined.udt_idx; if(0 <= udt_idx && udt_idx < rdbg->udts_count) { - RADDBG_UDT *udt = &rdbg->udts[udt_idx]; + RADDBGI_UDT *udt = &rdbg->udts[udt_idx]; enum_vals_count = udt->member_count; enum_vals = push_array(arena, TG_EnumVal, enum_vals_count); if(0 <= udt->member_first && udt->member_first+udt->member_count < rdbg->enum_members_count) @@ -415,9 +415,9 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg member_idx < udt->member_first+udt->member_count; member_idx += 1) { - RADDBG_EnumMember *src = &rdbg->enum_members[member_idx]; + RADDBGI_EnumMember *src = &rdbg->enum_members[member_idx]; TG_EnumVal *dst = &enum_vals[member_idx-udt->member_first]; - dst->name.str = raddbg_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); + dst->name.str = raddbgi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); dst->val = src->val; } } @@ -435,7 +435,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg } //- rjf: constructed types - if(RADDBG_TypeKind_FirstConstructed <= rdbg_type->kind && rdbg_type->kind <= RADDBG_TypeKind_LastConstructed) + if(RADDBGI_TypeKind_FirstConstructed <= rdbg_type->kind && rdbg_type->kind <= RADDBGI_TypeKind_LastConstructed) { // rjf: unpack direct type B32 direct_type_is_good = 0; @@ -443,8 +443,8 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg U64 direct_type_byte_size = 0; if(rdbg_type->constructed.direct_type_idx < type_node_idx) { - RADDBG_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->constructed.direct_type_idx]; - TG_Kind direct_type_kind = tg_kind_from_raddbg_type_kind(direct_type_node->kind); + RADDBGI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->constructed.direct_type_idx]; + TG_Kind direct_type_kind = tg_kind_from_raddbgi_type_kind(direct_type_node->kind); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->constructed.direct_type_idx); direct_type_is_good = 1; direct_type_byte_size = (U64)direct_type_node->byte_size; @@ -453,14 +453,14 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg // rjf: construct based on kind switch(rdbg_type->kind) { - case RADDBG_TypeKind_Modifier: + case RADDBGI_TypeKind_Modifier: { TG_Flags flags = 0; - if(rdbg_type->flags & RADDBG_TypeModifierFlag_Const) + if(rdbg_type->flags & RADDBGI_TypeModifierFlag_Const) { flags |= TG_Flag_Const; } - if(rdbg_type->flags & RADDBG_TypeModifierFlag_Volatile) + if(rdbg_type->flags & RADDBGI_TypeModifierFlag_Volatile) { flags |= TG_Flag_Volatile; } @@ -470,9 +470,9 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg type->byte_size = direct_type_byte_size; type->flags = flags; }break; - case RADDBG_TypeKind_Ptr: - case RADDBG_TypeKind_LRef: - case RADDBG_TypeKind_RRef: + case RADDBGI_TypeKind_Ptr: + case RADDBGI_TypeKind_LRef: + case RADDBGI_TypeKind_RRef: { type = push_array(arena, TG_Type, 1); type->kind = kind; @@ -480,7 +480,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg type->byte_size = graph->address_size; }break; - case RADDBG_TypeKind_Array: + case RADDBGI_TypeKind_Array: { type = push_array(arena, TG_Type, 1); type->kind = kind; @@ -488,12 +488,12 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg type->count = rdbg_type->constructed.count; type->byte_size = direct_type_byte_size * type->count; }break; - case RADDBG_TypeKind_Function: + case RADDBGI_TypeKind_Function: { U32 count = rdbg_type->constructed.count; U32 idx_run_first = rdbg_type->constructed.param_idx_run_first; U32 check_count = 0; - U32 *idx_run = raddbg_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); + U32 *idx_run = raddbgi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); if(check_count == count) { type = push_array(arena, TG_Type, 1); @@ -507,8 +507,8 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg U32 param_type_idx = idx_run[idx]; if(param_type_idx < type_node_idx) { - RADDBG_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; - TG_Kind param_kind = tg_kind_from_raddbg_type_kind(param_type_node->kind); + RADDBGI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; + TG_Kind param_kind = tg_kind_from_raddbgi_type_kind(param_type_node->kind); type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); } else @@ -518,7 +518,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg } } }break; - case RADDBG_TypeKind_Method: + case RADDBGI_TypeKind_Method: { // NOTE(rjf): for methods, the `direct` type points at the owner type. // the return type, instead of being encoded via the `direct` type, is @@ -526,7 +526,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg U32 count = rdbg_type->constructed.count; U32 idx_run_first = rdbg_type->constructed.param_idx_run_first; U32 check_count = 0; - U32 *idx_run = raddbg_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); + U32 *idx_run = raddbgi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); if(check_count == count) { type = push_array(arena, TG_Type, 1); @@ -540,8 +540,8 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg U32 param_type_idx = idx_run[idx]; if(param_type_idx < type_node_idx) { - RADDBG_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; - TG_Kind param_kind = tg_kind_from_raddbg_type_kind(param_type_node->kind); + RADDBGI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; + TG_Kind param_kind = tg_kind_from_raddbgi_type_kind(param_type_node->kind); type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); } else @@ -557,14 +557,14 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg } } }break; - case RADDBG_TypeKind_MemberPtr: + case RADDBGI_TypeKind_MemberPtr: { // rjf: unpack owner type TG_Key owner_type_key = zero_struct; if(rdbg_type->constructed.owner_type_idx < type_node_idx) { - RADDBG_TypeNode *owner_type_node = &rdbg->type_nodes[rdbg_type->constructed.owner_type_idx]; - TG_Kind owner_type_kind = tg_kind_from_raddbg_type_kind(owner_type_node->kind); + RADDBGI_TypeNode *owner_type_node = &rdbg->type_nodes[rdbg_type->constructed.owner_type_idx]; + TG_Kind owner_type_kind = tg_kind_from_raddbgi_type_kind(owner_type_node->kind); owner_type_key = tg_key_ext(owner_type_kind, (U64)rdbg_type->constructed.owner_type_idx); } type = push_array(arena, TG_Type, 1); @@ -577,19 +577,19 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg } //- rjf: alias types - else if(rdbg_type->kind == RADDBG_TypeKind_Alias) + else if(rdbg_type->kind == RADDBGI_TypeKind_Alias) { // rjf: unpack name String8 name = {0}; - name.str = raddbg_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); // rjf: unpack direct type TG_Key direct_type_key = zero_struct; U64 direct_type_byte_size = 0; if(rdbg_type->user_defined.direct_type_idx < type_node_idx) { - RADDBG_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; - TG_Kind direct_type_kind = tg_kind_from_raddbg_type_kind(direct_type_node->kind); + RADDBGI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; + TG_Kind direct_type_kind = tg_kind_from_raddbgi_type_kind(direct_type_node->kind); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->user_defined.direct_type_idx); direct_type_byte_size = direct_type_node->byte_size; } @@ -603,11 +603,11 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg } //- rjf: incomplete types - else if(RADDBG_TypeKind_FirstIncomplete <= rdbg_type->kind && rdbg_type->kind <= RADDBG_TypeKind_LastIncomplete) + else if(RADDBGI_TypeKind_FirstIncomplete <= rdbg_type->kind && rdbg_type->kind <= RADDBGI_TypeKind_LastIncomplete) { // rjf: unpack name String8 name = {0}; - name.str = raddbg_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = raddbgi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); // rjf: produce type = push_array(arena, TG_Type, 1); @@ -790,7 +790,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg } internal TG_Key -tg_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { TG_Key result = zero_struct; switch(key.kind) @@ -800,7 +800,7 @@ tg_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); result = type->direct_type_key; scratch_end(scratch); }break; @@ -809,16 +809,16 @@ tg_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key } internal TG_Key -tg_unwrapped_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_unwrapped_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { - key = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, key); - key = tg_direct_from_graph_raddbg_key(graph, rdbg, key); - key = tg_unwrapped_from_graph_raddbg_key(graph, rdbg, key); + key = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, key); + key = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + key = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, key); return key; } internal TG_Key -tg_owner_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_owner_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { TG_Key result = zero_struct; switch(key.kind) @@ -828,7 +828,7 @@ tg_owner_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); result = type->owner_type_key; scratch_end(scratch); }break; @@ -837,14 +837,14 @@ tg_owner_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) } internal TG_Key -tg_ptee_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_ptee_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { TG_Key result = key; B32 passed_ptr = 0; for(;;) { TG_Kind kind = tg_kind_from_key(result); - result = tg_direct_from_graph_raddbg_key(graph, rdbg, result); + result = tg_direct_from_graph_raddbgi_key(graph, rdbg, result); if(kind == TG_Kind_Ptr || kind == TG_Kind_LRef || kind == TG_Kind_RRef) { passed_ptr = 1; @@ -869,7 +869,7 @@ tg_ptee_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) } internal TG_Key -tg_unwrapped_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_unwrapped_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { TG_Key result = key; for(B32 good = 1; good;) @@ -879,7 +879,7 @@ tg_unwrapped_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key kind == TG_Kind_Modifier || kind == TG_Kind_Alias) { - result = tg_direct_from_graph_raddbg_key(graph, rdbg, result); + result = tg_direct_from_graph_raddbgi_key(graph, rdbg, result); } else { @@ -890,7 +890,7 @@ tg_unwrapped_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key } internal U64 -tg_byte_size_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_byte_size_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { U64 result = 0; switch(key.kind) @@ -905,7 +905,7 @@ tg_byte_size_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); result = type->byte_size; scratch_end(scratch); }break; @@ -940,12 +940,12 @@ tg_member_copy(Arena *arena, TG_Member *src) } internal TG_MemberArray -tg_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { TG_MemberArray result = {0}; Temp scratch = scratch_begin(&arena, 1); { - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); if(type->members != 0) { result.count = type->count; @@ -962,7 +962,7 @@ tg_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *r } internal TG_MemberArray -tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_data_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { Temp scratch = scratch_begin(&arena, 1); TG_Kind root_type_kind = tg_kind_from_key(key); @@ -971,7 +971,7 @@ tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Pars TG_MemberList members_list = {0}; B32 members_need_offset_sort = 0; { - TG_Type *root_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *root_type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); typedef struct Task Task; struct Task { @@ -1010,7 +1010,7 @@ tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Pars t->inheritance_chain = tg_key_list_copy(scratch.arena, &task->inheritance_chain); tg_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key); t->type_key = type->members[member_idx].type_key; - t->type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key); + t->type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key); SLLQueuePush(first_task, last_task, t); members_need_offset_sort = 1; } @@ -1059,7 +1059,7 @@ tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Pars TG_Member *member = &members.v[idx]; if(idx+1 < members.count) { - U64 member_byte_size = tg_byte_size_from_graph_raddbg_key(graph, rdbg, member->type_key); + U64 member_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, member->type_key); Rng1U64 member_byte_range = r1u64(member->off, member->off + member_byte_size); if(member[1].off > member_byte_range.max) { @@ -1106,7 +1106,7 @@ tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Pars } internal void -tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return) +tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return) { String8 keyword = {0}; TG_Kind kind = tg_kind_from_key(key); @@ -1115,7 +1115,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke default: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, str8_lit(" ")); scratch_end(scratch); @@ -1123,14 +1123,14 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke case TG_Kind_Bitfield: { - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, prec, skip_return); }break; case TG_Kind_Modifier: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); TG_Key direct = type->direct_type_key; tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); if(type->flags & TG_Flag_Const) @@ -1156,7 +1156,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke case TG_Kind_Alias: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, str8_lit(" ")); scratch_end(scratch); @@ -1169,7 +1169,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke fwd_udt:; { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); str8_list_push(arena, out, keyword); str8_list_push(arena, out, str8_lit(" ")); str8_list_push(arena, out, push_str8_copy(arena, type->name)); @@ -1179,7 +1179,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke case TG_Kind_Array: { - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, skip_return); if(prec == 1) { @@ -1191,7 +1191,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke { if(!skip_return) { - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, 0); } if(prec == 1) @@ -1202,21 +1202,21 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke case TG_Kind_Ptr: { - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("*")); }break; case TG_Kind_LRef: { - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("&")); }break; case TG_Kind_RRef: { - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("&&")); }break; @@ -1224,10 +1224,10 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke case TG_Kind_MemberPtr: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); TG_Key direct = type->direct_type_key; tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); - TG_Type *container = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, type->owner_type_key); + TG_Type *container = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, type->owner_type_key); if(container->kind != TG_Kind_Null) { str8_list_push(arena, out, push_str8_copy(arena, container->name)); @@ -1243,7 +1243,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke } internal void -tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key, String8List *out, U32 prec) +tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec) { TG_Kind kind = tg_kind_from_key(key); switch(kind) @@ -1252,7 +1252,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke case TG_Kind_Bitfield: { - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_rhs_string_from_key(arena, graph, rdbg, direct, out, prec); }break; @@ -1262,14 +1262,14 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke case TG_Kind_RRef: case TG_Kind_MemberPtr: { - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 1); }break; case TG_Kind_Array: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); if(prec == 1) { str8_list_push(arena, out, str8_lit(")")); @@ -1278,7 +1278,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke str8_list_push(arena, out, str8_lit("[")); str8_list_push(arena, out, count_str); str8_list_push(arena, out, str8_lit("]")); - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2); scratch_end(scratch); }break; @@ -1286,7 +1286,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke case TG_Kind_Function: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); if(prec == 1) { str8_list_push(arena, out, str8_lit(")")); @@ -1315,7 +1315,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke } str8_list_push(arena, out, str8_lit(")")); } - TG_Key direct = tg_direct_from_graph_raddbg_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2); scratch_end(scratch); }break; @@ -1323,7 +1323,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Ke } internal String8 -tg_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key) +tg_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; diff --git a/src/type_graph/type_graph.h b/src/type_graph/type_graph.h index 68bf9b60..9ce08056 100644 --- a/src/type_graph/type_graph.h +++ b/src/type_graph/type_graph.h @@ -203,8 +203,8 @@ internal TG_KeyList tg_key_list_copy(Arena *arena, TG_KeyList *src); //////////////////////////////// //~ rjf: RADDBG <-> TG Enum Conversions -internal TG_Kind tg_kind_from_raddbg_type_kind(RADDBG_TypeKind kind); -internal TG_MemberKind tg_member_kind_from_raddbg_member_kind(RADDBG_MemberKind kind); +internal TG_Kind tg_kind_from_raddbgi_type_kind(RADDBGI_TypeKind kind); +internal TG_MemberKind tg_member_kind_from_raddbgi_member_kind(RADDBGI_MemberKind kind); //////////////////////////////// //~ rjf: Key Type Functions @@ -225,19 +225,19 @@ internal TG_Key tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_t //////////////////////////////// //~ rjf: Graph Introspection API -internal TG_Type *tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal TG_Key tg_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal TG_Key tg_unwrapped_direct_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal TG_Key tg_owner_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal TG_Key tg_ptee_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal TG_Key tg_unwrapped_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal U64 tg_byte_size_from_graph_raddbg_key(TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); +internal TG_Type *tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_unwrapped_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_owner_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_ptee_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_unwrapped_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal U64 tg_byte_size_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); internal TG_Kind tg_kind_from_key(TG_Key key); internal TG_Member *tg_member_copy(Arena *arena, TG_Member *src); -internal TG_MemberArray tg_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal TG_MemberArray tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); -internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return); -internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key, String8List *out, U32 prec); -internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key); +internal TG_MemberArray tg_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_MemberArray tg_data_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return); +internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec); +internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); #endif // TYPE_GRAPH_NEW_H From d35bdf212819593c9111f1a51b1cb0d611890f6e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 15:08:40 -0800 Subject: [PATCH 032/275] adjust readme for new debug info naming convention --- README.md | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 93647aae..2725e66c 100644 --- a/README.md +++ b/README.md @@ -15,22 +15,23 @@ You can download pre-built binaries for the debugger The RAD Debugger project aims to simplify the debugger by simplifying and unifying the underlying debug info format. In that pursuit we've built -the RADDBG debug info format, which is what the debugger parses and uses. To +the RADDBGI debug info format, which is what the debugger parses and uses. To work with existing toolchains, we convert PDB (and eventually PE/ELF files -with embedded DWARF) into the RADDBG format on-demand. This conversion process +with embedded DWARF) into the RADDBGI format on-demand. This conversion process is currently an unoptimized reference version. Nevertheless it's still quite fast for smaller PDB files (in many cases faster than many other programs simply deserialize the PDBs). It is much slower for much larger projects at the moment, but we expect this will vastly improve overtime. -The RADDBG format is currently specified in code, in the files within the +The RADDBGI format is currently specified in code, in the files within the `src/raddbgi_format` folder. The other relevant folders for working with the format are: -- `raddbgi_cons`: The RADDBG construction layer, for making RADDBG debug info. -- `raddbgi_convert`: Our implementation of PDB-to-RADDBG (and an in-progress -implementation of a DWARF-to-RADDBG) conversion. -- `raddbgi_dump`: Code for textually dumping information from RADDBG files. +- `raddbgi_cons`: The RADDBGI construction layer, for making RADDBGI debug +info. +- `raddbgi_convert`: Our implementation of PDB-to-RADDBGI (and an in-progress +implementation of a DWARF-to-RADDBGI) conversion. +- `raddbgi_dump`: Code for textually dumping information from RADDBGI files. ## Development Setup Instructions @@ -119,13 +120,13 @@ such that the debugging experience is rock solid. Additionally, the debug info conversion process is not fast (nor wide) enough to support extremely large projects. This is for two reasons: (a) the -PDB-to-RADDBG converter is an unoptimized reference implementation, and (b) the -debugger learns of new modules (and thus which PDBs to load) in a +PDB-to-RADDBGI converter is an unoptimized reference implementation, and (b) +the debugger learns of new modules (and thus which PDBs to load) in a serially-dependent way (this is necessarily the case for correct debugging results). We expect that the conversion process' performance can be massively improved, and also that some heuristics can be used to begin converting PDBs -to RADDBGs before the debugger knows those PDBs are needed, thus ensuring the -associated RADDBG files are ready instantaneously when the associated modules +to RADDBGIs before the debugger knows those PDBs are needed, thus ensuring the +associated RADDBGI files are ready instantaneously when the associated modules are finally loaded by the debugger. Improving this situation is a major part of this phase, as it will make the debugger much more usable for large projects. @@ -145,9 +146,9 @@ The major parts of this phase are: abstraction API. - Porting the `src/unwind` layer to support x64 ELF unwinding (currently, there is only an x64 PE unwinding implementation). -- Creating a DWARF-to-RADDBG converter (in the same way that we've built a PDB- -to-RADDBG converter). A partial implementation of this is in -`src/raddbg_convert/dwarf`. +- Creating a DWARF-to-RADDBGI converter (in the same way that we've built a +PDB-to-RADDBGI converter). A partial implementation of this is in +`src/raddbgi_convert/dwarf`. - Porting the `src/render` layer to implement all of the rendering features the frontend needs on a Linux-compatible API (the backend used on Windows is D3D11). - Porting the `src/font_provider` layer to a Linux-compatible font @@ -221,10 +222,10 @@ A list of the layers in the codebase and their associated namespaces is below: disassembly for a particular virtual address range in a process, and threads implemented in this layer decode and cache the disassembly for that range. - `dbgi` (`DBGI_`): An asynchronous debug info loader and cache. Loads debug - info stored in the RADDBG format. Users ask for debug info for a particular + info stored in the RADDBGI format. Users ask for debug info for a particular executable, and on separate threads, this layer loads the associated debug info file. If necessary, it will launch a separate conversion process to - convert original debug info into the RADDBG format. + convert original debug info into the RADDBGI format. - `demon` (`DEMON_`): An abstraction layer for local-machine, low-level process control. The abstraction is used to provide a common interface for process control on target platforms. Used to implement part of `ctrl`. @@ -292,11 +293,11 @@ A list of the layers in the codebase and their associated namespaces is below: programs to work with various features in the `raddbg` debugger. Does not depend on `base`. - `raddbgi_cons` (`CONS_`): Implements an API for constructing files of the - RADDBG debug info file format. + RADDBGI debug info file format. - `raddbgi_dump` (`DUMP_`): A dumper utility program for dumping - textualizations of RADDBG debug info files. -- `raddbgi_format` (`RADDBG_`): Standalone types and helper functions for the - RADDBG debug info file format. Does not depend on `base`. + textualizations of RADDBGI debug info files. +- `raddbgi_format` (`RADDBGI_`): Standalone types and helper functions for the + RADDBGI debug info file format. Does not depend on `base`. - `regs` (`REGS_`): Types, helper functions, and metadata for registers on supported architectures. Used in reading/writing registers in `demon`, or in looking up register metadata. @@ -315,7 +316,7 @@ A list of the layers in the codebase and their associated namespaces is below: Used by the debugger to visualize source code files. Users ask for text lines, tokens, and metadata, and it is prepared on background threads. - `type_graph` (`TG_`): Code for analyzing and navigating type structures from - RADDBG debug info files, with the additional capability of constructing + RADDBGI debug info files, with the additional capability of constructing synthetic types *not* found in debug info. Used in `eval` and for various visualization features. - `ui` (`UI_`): Machinery for building graphical user interfaces. Provides a From 5c33c410d34364b042320878fba2ef61ddc9dc9c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 15:11:20 -0800 Subject: [PATCH 033/275] flatten cons api; eliminate private/public distinction --- src/raddbgi_cons/raddbgi_cons.c | 746 ++++++++++++++++---------------- src/raddbgi_cons/raddbgi_cons.h | 360 +++++++-------- 2 files changed, 553 insertions(+), 553 deletions(-) diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/raddbgi_cons/raddbgi_cons.c index a6fa9e37..17612767 100644 --- a/src/raddbgi_cons/raddbgi_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -105,8 +105,8 @@ cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *ri //- rjf: sortable range sorting -static CONS__SortKey* -cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) +static CONS_SortKey* +cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) { // This sort is designed to take advantage of lots of pre-existing sorted ranges. // Most line info is already sorted or close to already sorted. @@ -114,9 +114,9 @@ cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) // Also - this sort should be a "stable" sort. In the use case of sorting vmap // ranges, we want to be able to rely on order, so it needs to be preserved here. - ProfBegin("cons__sort_key_array"); + ProfBegin("cons_sort_key_array"); Temp scratch = scratch_begin(&arena, 1); - CONS__SortKey *result = 0; + CONS_SortKey *result = 0; if(count <= 1) { @@ -124,8 +124,8 @@ cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) } else { - CONS__OrderedRange *ranges_first = 0; - CONS__OrderedRange *ranges_last = 0; + CONS_OrderedRange *ranges_first = 0; + CONS_OrderedRange *ranges_last = 0; U64 range_count = 0; { U64 pos = 0; @@ -137,7 +137,7 @@ cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); // generate an ordered range node - CONS__OrderedRange *new_range = push_array(scratch.arena, CONS__OrderedRange, 1); + CONS_OrderedRange *new_range = push_array(scratch.arena, CONS_OrderedRange, 1); SLLQueuePush(ranges_first, ranges_last, new_range); range_count += 1; new_range->first = first; @@ -154,12 +154,12 @@ cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) } else { - CONS__SortKey *keys_swap = push_array_no_zero(arena, CONS__SortKey, count); - CONS__SortKey *src = keys; - CONS__SortKey *dst = keys_swap; - CONS__OrderedRange *src_ranges = ranges_first; - CONS__OrderedRange *dst_ranges = 0; - CONS__OrderedRange *dst_ranges_last = 0; + CONS_SortKey *keys_swap = push_array_no_zero(arena, CONS_SortKey, count); + CONS_SortKey *src = keys; + CONS_SortKey *dst = keys_swap; + CONS_OrderedRange *src_ranges = ranges_first; + CONS_OrderedRange *dst_ranges = 0; + CONS_OrderedRange *dst_ranges_last = 0; for(;;) { @@ -173,7 +173,7 @@ cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) } // get first range - CONS__OrderedRange *range1 = src_ranges; + CONS_OrderedRange *range1 = src_ranges; SLLStackPop(src_ranges); // if this range is the whole array, we are done @@ -193,7 +193,7 @@ cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) } // get second range - CONS__OrderedRange *range2 = src_ranges; + CONS_OrderedRange *range2 = src_ranges; SLLStackPop(src_ranges); Assert(range1->opl == range2->first); @@ -242,7 +242,7 @@ cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) } // end pass by swapping buffers and range nodes - Swap(CONS__SortKey*, src, dst); + Swap(CONS_SortKey*, src, dst); src_ranges = dst_ranges; dst_ranges = 0; dst_ranges_last = 0; @@ -270,18 +270,18 @@ cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count) //- rjf: u64 -> ptr map static void -cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count) +cons_u64toptr_init(Arena *arena, CONS_U64ToPtrMap *map, U64 bucket_count) { Assert(IsPow2OrZero(bucket_count) && bucket_count > 0); - map->buckets = push_array(arena, CONS__U64ToPtrNode*, bucket_count); + map->buckets = push_array(arena, CONS_U64ToPtrNode*, bucket_count); map->buckets_count = bucket_count; } static void -cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out) +cons_u64toptr_lookup(CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLookup *lookup_out) { U64 bucket_idx = hash&(map->buckets_count - 1); - CONS__U64ToPtrNode *check_node = map->buckets[bucket_idx]; + CONS_U64ToPtrNode *check_node = map->buckets[bucket_idx]; for(;check_node != 0; check_node = check_node->next){ for(U32 k = 0; k < ArrayCount(check_node->key); k += 1){ if(check_node->ptr[k] == 0){ @@ -298,11 +298,11 @@ cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrL } static void -cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup, void *ptr) +cons_u64toptr_insert(Arena *arena, CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLookup *lookup, void *ptr) { if(lookup->fill_node != 0) { - CONS__U64ToPtrNode *node = lookup->fill_node; + CONS_U64ToPtrNode *node = lookup->fill_node; U32 k = lookup->fill_k; node->key[k] = key; node->ptr[k] = ptr; @@ -311,7 +311,7 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, C { U64 bucket_idx = hash&(map->buckets_count - 1); - CONS__U64ToPtrNode *node = push_array(arena, CONS__U64ToPtrNode, 1); + CONS_U64ToPtrNode *node = push_array(arena, CONS_U64ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); node->key[0] = key; node->ptr[0] = ptr; @@ -327,18 +327,18 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, C //- rjf: string8 -> ptr map static void -cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count) +cons_str8toptr_init(Arena *arena, CONS_Str8ToPtrMap *map, U64 bucket_count) { map->buckets_count = bucket_count; - map->buckets = push_array(arena, CONS__Str8ToPtrNode*, map->buckets_count); + map->buckets = push_array(arena, CONS_Str8ToPtrNode*, map->buckets_count); } static void* -cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash) +cons_str8toptr_lookup(CONS_Str8ToPtrMap *map, String8 key, U64 hash) { void *result = 0; U64 bucket_idx = hash%map->buckets_count; - for(CONS__Str8ToPtrNode *node = map->buckets[bucket_idx]; + for(CONS_Str8ToPtrNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) { @@ -352,11 +352,11 @@ cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash) } static void -cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 hash, void *ptr) +cons_str8toptr_insert(Arena *arena, CONS_Str8ToPtrMap *map, String8 key, U64 hash, void *ptr) { U64 bucket_idx = hash%map->buckets_count; - CONS__Str8ToPtrNode *node = push_array(arena, CONS__Str8ToPtrNode, 1); + CONS_Str8ToPtrNode *node = push_array(arena, CONS_Str8ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); node->key = push_str8_copy(arena, key); @@ -385,8 +385,8 @@ cons_root_new(CONS_RootParams *params) // setup singular types { - result->nil_type = cons__type_new(result); - result->variadic_type = cons__type_new(result); + result->nil_type = cons_type_new(result); + result->variadic_type = cons_type_new(result); result->variadic_type->kind = RADDBGI_TypeKind_Variadic; // references to "handled nil type" should be emitted as @@ -404,19 +404,19 @@ cons_root_new(CONS_RootParams *params) // rjf: setup null UDT { - cons__type_udt_from_any_type(result, result->nil_type); + cons_type_udt_from_any_type(result, result->nil_type); } // initialize maps { #define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128)) - cons__u64toptr_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); - cons__u64toptr_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); - cons__u64toptr_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); - cons__u64toptr_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); - cons__u64toptr_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); - cons__str8toptr_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); + cons_u64toptr_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); + cons_u64toptr_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); + cons_u64toptr_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); + cons_u64toptr_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); + cons_u64toptr_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); + cons_str8toptr_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); #undef BKTCOUNT } @@ -488,8 +488,8 @@ cons_add_binary_section(CONS_Root *root, String8 name, RADDBGI_BinarySectionFlag static CONS_Unit* cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash) { - CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); + CONS_U64ToPtrLookup lookup = {0}; + cons_u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); CONS_Unit *result = 0; if(lookup.match != 0) { @@ -501,7 +501,7 @@ cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_i result->idx = root->unit_count; SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); root->unit_count += 1; - cons__u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); + cons_u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); } return result; } @@ -560,8 +560,8 @@ cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl) static CONS_Type* cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash) { - CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); + CONS_U64ToPtrLookup lookup = {0}; + cons_u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); CONS_Type *result = (CONS_Type*)lookup.match; return result; } @@ -570,11 +570,11 @@ static CONS_Reservation* cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash) { CONS_Reservation *result = 0; - CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); + CONS_U64ToPtrLookup lookup = {0}; + cons_u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); if(lookup.match == 0) { - cons__u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); + cons_u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); void **slot = &lookup.fill_node->ptr[lookup.fill_k]; result = (CONS_Reservation*)slot; } @@ -620,7 +620,7 @@ cons_type_variadic(CONS_Root *root) //- rjf: base type info constructors static CONS_Type* -cons__type_new(CONS_Root *root) +cons_type_new(CONS_Root *root) { CONS_Type *result = push_array(root->arena, CONS_Type, 1); result->idx = root->type_count; @@ -630,7 +630,7 @@ cons__type_new(CONS_Root *root) } static CONS_TypeUDT* -cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *type) +cons_type_udt_from_any_type(CONS_Root *root, CONS_Type *type) { if(type->udt == 0) { @@ -646,7 +646,7 @@ cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *type) } static CONS_TypeUDT* -cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type) +cons_type_udt_from_record_type(CONS_Root *root, CONS_Type *type) { cons_requiref(root, (type->kind == RADDBGI_TypeKind_Struct || type->kind == RADDBGI_TypeKind_Class || @@ -654,7 +654,7 @@ cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type) return 0, "Tried to use non-user-defined-type-kind to create user-defined-type."); CONS_TypeUDT *result = 0; - result = cons__type_udt_from_any_type(root, type); + result = cons_type_udt_from_any_type(root, type); return result; } @@ -686,7 +686,7 @@ cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { @@ -698,18 +698,18 @@ cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) } // setup new node - result = cons__type_new(root); + result = cons_type_new(root); result->kind = type_kind; result->name = push_str8_copy(root->arena, name); result->byte_size = byte_size; // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); // save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons__name_map_add_pair(root, map, result->name, result->idx); + CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + cons_name_map_add_pair(root, map, result->name, result->idx); } } @@ -743,19 +743,19 @@ cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeModifier // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0){ // setup new node - result = cons__type_new(root); + result = cons_type_new(root); result->kind = RADDBGI_TypeKind_Modifier; result->flags = flags; result->byte_size = direct_type->byte_size; result->direct_type = direct_type; // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -791,12 +791,12 @@ cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { // setup new node - result = cons__type_new(root); + result = cons_type_new(root); result->kind = RADDBGI_TypeKind_Bitfield; result->byte_size = direct_type->byte_size; result->off = bit_off; @@ -804,7 +804,7 @@ cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit result->direct_type = direct_type; // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -842,18 +842,18 @@ cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeKind ptr_ // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { // setup new node - result = cons__type_new(root); + result = cons_type_new(root); result->kind = ptr_type_kind; result->byte_size = root->addr_size; result->direct_type = direct_type; // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -887,19 +887,19 @@ cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count) // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { // setup new node - result = cons__type_new(root); + result = cons_type_new(root); result->kind = RADDBGI_TypeKind_Array; result->count = count; result->direct_type = direct_type; result->byte_size = direct_type->byte_size*count; // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -937,7 +937,7 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { @@ -955,7 +955,7 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa } // setup new node - result = cons__type_new(root); + result = cons_type_new(root); result->kind = RADDBGI_TypeKind_Function; result->byte_size = root->addr_size; result->count = params->count; @@ -963,7 +963,7 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa result->param_types = param_types; // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -1005,7 +1005,7 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons__str8toptr_lookup(&root->construct_map, blob, blob_hash); + void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); result = (CONS_Type*)lookup_ptr; if(result == 0) { @@ -1027,7 +1027,7 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, } // setup new node - result = cons__type_new(root); + result = cons_type_new(root); result->kind = RADDBGI_TypeKind_Method; result->byte_size = root->addr_size; result->count = params->count; @@ -1035,7 +1035,7 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, result->param_types = param_types; // save in construct map - cons__str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -1055,15 +1055,15 @@ cons_type_udt(CONS_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, "Non-user-defined-type-kind used to create user-defined type."); // rjf: make type - CONS_Type *result = cons__type_new(root); + CONS_Type *result = cons_type_new(root); result->kind = record_type_kind; result->byte_size = size; result->name = push_str8_copy(root->arena, name); // rjf: save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons__name_map_add_pair(root, map, result->name, result->idx); + CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + cons_name_map_add_pair(root, map, result->name, result->idx); } return result; @@ -1073,7 +1073,7 @@ static CONS_Type* cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name) { // rjf: make type - CONS_Type *result = cons__type_new(root); + CONS_Type *result = cons_type_new(root); result->kind = RADDBGI_TypeKind_Enum; result->byte_size = direct_type->byte_size; result->name = push_str8_copy(root->arena, name); @@ -1081,8 +1081,8 @@ cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name) // rjf: save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons__name_map_add_pair(root, map, result->name, result->idx); + CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + cons_name_map_add_pair(root, map, result->name, result->idx); } return result; @@ -1092,7 +1092,7 @@ static CONS_Type* cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name) { // rjf: make type - CONS_Type *result = cons__type_new(root); + CONS_Type *result = cons_type_new(root); result->kind = RADDBGI_TypeKind_Alias; result->byte_size = direct_type->byte_size; result->name = push_str8_copy(root->arena, name); @@ -1100,8 +1100,8 @@ cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name) // rjf: save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons__name_map_add_pair(root, map, result->name, result->idx); + CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + cons_name_map_add_pair(root, map, result->name, result->idx); } return result; @@ -1118,14 +1118,14 @@ cons_type_incomplete(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) "Non-incomplete-type-kind used to create incomplete type."); // rjf: make type - CONS_Type *result = cons__type_new(root); + CONS_Type *result = cons_type_new(root); result->kind = type_kind; result->name = push_str8_copy(root->arena, name); // save in name map { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons__name_map_add_pair(root, map, result->name, result->idx); + CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + cons_name_map_add_pair(root, map, result->name, result->idx); } return result; @@ -1136,7 +1136,7 @@ cons_type_incomplete(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) static void cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type, U32 off) { - CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); + CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); if(udt != 0) { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); @@ -1153,7 +1153,7 @@ cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 static void cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) { - CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); + CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); if(udt != 0) { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); @@ -1169,7 +1169,7 @@ cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, String static void cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) { - CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); + CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); if(udt != 0) { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); @@ -1185,7 +1185,7 @@ cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, String8 nam static void cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) { - CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); + CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); if(udt != 0) { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); @@ -1203,7 +1203,7 @@ cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, Stri static void cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) { - CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); + CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); if(udt != 0) { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); @@ -1219,7 +1219,7 @@ cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, Str static void cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 off) { - CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); + CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); if(udt != 0) { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); @@ -1235,7 +1235,7 @@ cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *ba static void cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 vptr_off, U32 vtable_off) { - CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); + CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); if(udt != 0) { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); @@ -1251,7 +1251,7 @@ cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, CONS_ static void cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, CONS_Type *nested_type) { - CONS_TypeUDT *udt = cons__type_udt_from_record_type(root, record_type); + CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); if(udt != 0) { CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); @@ -1267,7 +1267,7 @@ static void cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 val) { cons_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); - CONS_TypeUDT *udt = cons__type_udt_from_any_type(root, enum_type); + CONS_TypeUDT *udt = cons_type_udt_from_any_type(root, enum_type); if(udt != 0) { CONS_TypeEnumVal *enum_val = push_array(root->arena, CONS_TypeEnumVal, 1); @@ -1285,7 +1285,7 @@ cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, Strin { cons_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), return, "Tried to add source coordinates to non-user-defined type."); - CONS_TypeUDT *udt = cons__type_udt_from_any_type(root, defined_type); + CONS_TypeUDT *udt = cons_type_udt_from_any_type(root, defined_type); if(udt != 0) { udt->source_path = push_str8_copy(root->arena, source_path); @@ -1299,8 +1299,8 @@ cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, Strin static CONS_Symbol* cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash) { - CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); + CONS_U64ToPtrLookup lookup = {0}; + cons_u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); CONS_Symbol *result = 0; if(lookup.match != 0) { @@ -1311,7 +1311,7 @@ cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_ result = push_array(root->arena, CONS_Symbol, 1); SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); root->symbol_count += 1; - cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); + cons_u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); } return result; } @@ -1355,40 +1355,40 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info { cons_requiref(root, info->root_scope != 0, NoOp, "Procedure symbol initialized without root scope."); symbol->root_scope = info->root_scope; - cons__scope_recursive_set_symbol(info->root_scope, symbol); + cons_scope_recursive_set_symbol(info->root_scope, symbol); }break; } // save name map { - CONS__NameMap *map = 0; + CONS_NameMap *map = 0; switch(kind) { default:{}break; case CONS_SymbolKind_GlobalVariable: { - map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_GlobalVariables); + map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_GlobalVariables); }break; case CONS_SymbolKind_ThreadVariable: { - map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_ThreadVariables); + map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_ThreadVariables); }break; case CONS_SymbolKind_Procedure: { - map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_Procedures); + map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Procedures); }break; } if(map != 0) { - cons__name_map_add_pair(root, map, symbol->name, symbol->idx); + cons_name_map_add_pair(root, map, symbol->name, symbol->idx); } } // save link name map if(kind == CONS_SymbolKind_Procedure && symbol->link_name.size > 0) { - CONS__NameMap *map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_LinkNameProcedures); - cons__name_map_add_pair(root, map, symbol->link_name, symbol->idx); + CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_LinkNameProcedures); + cons_name_map_add_pair(root, map, symbol->link_name, symbol->idx); } } @@ -1398,8 +1398,8 @@ static CONS_Scope * cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash) { CONS_Scope *result = 0; - CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); + CONS_U64ToPtrLookup lookup = {0}; + cons_u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); if(lookup.match != 0) { result = (CONS_Scope*)lookup.match; @@ -1410,7 +1410,7 @@ cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_use result->idx = root->scope_count; SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); root->scope_count += 1; - cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); + cons_u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); } return result; } @@ -1428,7 +1428,7 @@ cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent) static void cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl) { - CONS__VOffRange *range = push_array(root->arena, CONS__VOffRange, 1); + CONS_VOffRange *range = push_array(root->arena, CONS_VOffRange, 1); SLLQueuePush(scope->first_range, scope->last_range, range); scope->range_count += 1; range->voff_first = voff_first; @@ -1438,14 +1438,14 @@ cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U6 } static void -cons__scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol) +cons_scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol) { scope->symbol = symbol; for(CONS_Scope *node = scope->first_child; node != 0; node = node->next_sibling) { - cons__scope_recursive_set_symbol(node, symbol); + cons_scope_recursive_set_symbol(node, symbol); } } @@ -1455,8 +1455,8 @@ static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash) { CONS_Local *result = 0; - CONS__U64ToPtrLookup lookup = {0}; - cons__u64toptr_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); + CONS_U64ToPtrLookup lookup = {0}; + cons_u64toptr_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); if(lookup.match != 0) { result = (CONS_Local*)lookup.match; @@ -1464,7 +1464,7 @@ cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_use else { result = push_array(root->arena, CONS_Local, 1); - cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); + cons_u64toptr_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); } return result; } @@ -1502,7 +1502,7 @@ cons_location_set_from_local(CONS_Root *root, CONS_Local *local) static void cons_location_set_add_case(CONS_Root *root, CONS_LocationSet *locset, U64 voff_first, U64 voff_opl, CONS_Location *location) { - CONS__LocationCase *location_case = push_array(root->arena, CONS__LocationCase, 1); + CONS_LocationCase *location_case = push_array(root->arena, CONS_LocationCase, 1); SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); locset->location_case_count += 1; root->location_count += 1; @@ -1560,17 +1560,17 @@ cons_location_val_reg(CONS_Root *root, U8 reg_code) //- rjf: name map building -static CONS__NameMap* -cons__name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind) +static CONS_NameMap* +cons_name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind) { - CONS__NameMap *result = 0; + CONS_NameMap *result = 0; if(kind < RADDBGI_NameMapKind_COUNT) { if(root->name_maps[kind] == 0) { - root->name_maps[kind] = push_array(root->arena, CONS__NameMap, 1); + root->name_maps[kind] = push_array(root->arena, CONS_NameMap, 1); root->name_maps[kind]->buckets_count = 16384; - root->name_maps[kind]->buckets = push_array(root->arena, CONS__NameMapNode *, root->name_maps[kind]->buckets_count); + root->name_maps[kind]->buckets = push_array(root->arena, CONS_NameMapNode *, root->name_maps[kind]->buckets_count); } result = root->name_maps[kind]; } @@ -1578,15 +1578,15 @@ cons__name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind) } static void -cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 idx) +cons_name_map_add_pair(CONS_Root *root, CONS_NameMap *map, String8 string, U32 idx) { // hash U64 hash = raddbgi_hash(string.str, string.size); U64 bucket_idx = hash%map->buckets_count; // find existing name node - CONS__NameMapNode *match = 0; - for(CONS__NameMapNode *node = map->buckets[bucket_idx]; + CONS_NameMapNode *match = 0; + for(CONS_NameMapNode *node = map->buckets[bucket_idx]; node != 0; node = node->bucket_next) { @@ -1600,7 +1600,7 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 // make name node if necessary if(match == 0) { - match = push_array(root->arena, CONS__NameMapNode, 1); + match = push_array(root->arena, CONS_NameMapNode, 1); match->string = push_str8_copy(root->arena, string); SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); SLLQueuePush_N(map->first, map->last, match, order_next); @@ -1610,7 +1610,7 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 // find existing idx B32 existing_idx = 0; - for(CONS__NameMapIdxNode *node = match->idx_first; + for(CONS_NameMapIdxNode *node = match->idx_first; node != 0; node = node->next) { @@ -1631,11 +1631,11 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 // insert new idx if necessary if(!existing_idx) { - CONS__NameMapIdxNode *idx_node = match->idx_last; + CONS_NameMapIdxNode *idx_node = match->idx_last; U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); if(insert_i == 0) { - idx_node = push_array(root->arena, CONS__NameMapIdxNode, 1); + idx_node = push_array(root->arena, CONS_NameMapIdxNode, 1); SLLQueuePush(match->idx_first, match->idx_last, idx_node); } @@ -1649,27 +1649,27 @@ cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 string, U32 //- rjf: bake context construction -static CONS__BakeCtx* -cons__bake_ctx_begin(CONS__BakeParams *params) +static CONS_BakeCtx* +cons_bake_ctx_begin(CONS_BakeParams *params) { Arena *arena = arena_alloc(); - CONS__BakeCtx *result = push_array(arena, CONS__BakeCtx, 1); + CONS_BakeCtx *result = push_array(arena, CONS_BakeCtx, 1); result->arena = arena; #define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) result->strs.buckets_count = BKTCOUNT(params->strings_bucket_count); result->idxs.buckets_count = BKTCOUNT(params->idx_runs_bucket_count); #undef BKTCOUNT - result->strs.buckets = push_array(arena, CONS__StringNode *, result->strs.buckets_count); - result->idxs.buckets = push_array(arena, CONS__IdxRunNode *, result->idxs.buckets_count); + result->strs.buckets = push_array(arena, CONS_StringNode *, result->strs.buckets_count); + result->idxs.buckets = push_array(arena, CONS_IdxRunNode *, result->idxs.buckets_count); - cons__string(result, str8_lit("")); - cons__idx_run(result, 0, 0); + cons_string(result, str8_lit("")); + cons_idx_run(result, 0, 0); - result->tree = push_array(arena, CONS__PathTree, 1); + result->tree = push_array(arena, CONS_PathTree, 1); { - CONS__PathNode *nil_path_node = cons__paths_new_node(result); + CONS_PathNode *nil_path_node = cons_paths_new_node(result); nil_path_node->name = str8_lit(""); - CONS__SrcNode *nil_src_node = cons__paths_new_src_node(result); + CONS_SrcNode *nil_src_node = cons_paths_new_src_node(result); nil_src_node->path_node = nil_path_node; nil_src_node->normal_full_path = str8_lit(""); nil_path_node->src_file = nil_src_node; @@ -1679,7 +1679,7 @@ cons__bake_ctx_begin(CONS__BakeParams *params) } static void -cons__bake_ctx_release(CONS__BakeCtx *bake_ctx) +cons_bake_ctx_release(CONS_BakeCtx *bake_ctx) { arena_release(bake_ctx->arena); } @@ -1687,16 +1687,16 @@ cons__bake_ctx_release(CONS__BakeCtx *bake_ctx) //- rjf: string baking static U32 -cons__string(CONS__BakeCtx *bctx, String8 str) +cons_string(CONS_BakeCtx *bctx, String8 str) { Arena *arena = bctx->arena; - CONS__Strings *strs = &bctx->strs; + CONS_Strings *strs = &bctx->strs; U64 hash = raddbgi_hash(str.str, str.size); U64 bucket_idx = hash%strs->buckets_count; // look for a match - CONS__StringNode *match = 0; - for(CONS__StringNode *node = strs->buckets[bucket_idx]; + CONS_StringNode *match = 0; + for(CONS_StringNode *node = strs->buckets[bucket_idx]; node != 0; node = node->bucket_next) { @@ -1710,7 +1710,7 @@ cons__string(CONS__BakeCtx *bctx, String8 str) // insert new node if no match if(match == 0) { - CONS__StringNode *node = push_array_no_zero(arena, CONS__StringNode, 1); + CONS_StringNode *node = push_array_no_zero(arena, CONS_StringNode, 1); node->str = push_str8_copy(arena, str); node->hash = hash; node->idx = strs->count; @@ -1730,7 +1730,7 @@ cons__string(CONS__BakeCtx *bctx, String8 str) //- rjf: idx run baking static U64 -cons__idx_run_hash(U32 *idx_run, U32 count) +cons_idx_run_hash(U32 *idx_run, U32 count) { U64 hash = 5381; U32 *ptr = idx_run; @@ -1743,17 +1743,17 @@ cons__idx_run_hash(U32 *idx_run, U32 count) } static U32 -cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count) +cons_idx_run(CONS_BakeCtx *bctx, U32 *idx_run, U32 count) { Arena *arena = bctx->arena; - CONS__IdxRuns *idxs = &bctx->idxs; + CONS_IdxRuns *idxs = &bctx->idxs; - U64 hash = cons__idx_run_hash(idx_run, count); + U64 hash = cons_idx_run_hash(idx_run, count); U64 bucket_idx = hash%idxs->buckets_count; // look for a match - CONS__IdxRunNode *match = 0; - for(CONS__IdxRunNode *node = idxs->buckets[bucket_idx]; + CONS_IdxRunNode *match = 0; + for(CONS_IdxRunNode *node = idxs->buckets[bucket_idx]; node != 0; node = node->bucket_next) { @@ -1780,7 +1780,7 @@ cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count) // insert new node if no match if(match == 0) { - CONS__IdxRunNode *node = push_array_no_zero(arena, CONS__IdxRunNode, 1); + CONS_IdxRunNode *node = push_array_no_zero(arena, CONS_IdxRunNode, 1); U32 *idx_run_copy = push_array_no_zero(arena, U32, count); for(U32 i = 0; i < count; i += 1) { @@ -1807,10 +1807,10 @@ cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count) //- rjf: data section baking static U32 -cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag) +cons_dsection(Arena *arena, CONS_DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag) { U32 result = dss->count; - CONS__DSectionNode *node = push_array(arena, CONS__DSectionNode, 1); + CONS_DSectionNode *node = push_array(arena, CONS_DSectionNode, 1); SLLQueuePush(dss->first, dss->last, node); node->data = data; node->size = size; @@ -1822,13 +1822,13 @@ cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBGI //- rjf: paths baking static String8 -cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node) +cons_normal_string_from_path_node(Arena *arena, CONS_PathNode *node) { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; if(node != 0) { - cons__normal_string_from_path_node_build(scratch.arena, node, &list); + cons_normal_string_from_path_node_build(scratch.arena, node, &list); } StringJoin join = {0}; join.sep = str8_lit("/"); @@ -1848,12 +1848,12 @@ cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node) } static void -cons__normal_string_from_path_node_build(Arena *arena, CONS__PathNode *node, String8List *out) +cons_normal_string_from_path_node_build(Arena *arena, CONS_PathNode *node, String8List *out) { // TODO(rjf): why is this recursive... if(node->parent != 0) { - cons__normal_string_from_path_node_build(arena, node->parent, out); + cons_normal_string_from_path_node_build(arena, node->parent, out); } if(node->name.size > 0) { @@ -1861,23 +1861,23 @@ cons__normal_string_from_path_node_build(Arena *arena, CONS__PathNode *node, Str } } -static CONS__PathNode* -cons__paths_new_node(CONS__BakeCtx *bctx) +static CONS_PathNode* +cons_paths_new_node(CONS_BakeCtx *bctx) { - CONS__PathTree *tree = bctx->tree; - CONS__PathNode *result = push_array(bctx->arena, CONS__PathNode, 1); + CONS_PathTree *tree = bctx->tree; + CONS_PathNode *result = push_array(bctx->arena, CONS_PathNode, 1); SLLQueuePush_N(tree->first, tree->last, result, next_order); result->idx = tree->count; tree->count += 1; return result; } -static CONS__PathNode* -cons__paths_sub_path(CONS__BakeCtx *bctx, CONS__PathNode *dir, String8 sub_dir) +static CONS_PathNode* +cons_paths_sub_path(CONS_BakeCtx *bctx, CONS_PathNode *dir, String8 sub_dir) { // look for existing match - CONS__PathNode *match = 0; - for(CONS__PathNode *node = dir->first_child; + CONS_PathNode *match = 0; + for(CONS_PathNode *node = dir->first_child; node != 0; node = node->next_sibling){ if(str8_match(node->name, sub_dir, StringMatchFlag_CaseInsensitive)){ @@ -1887,16 +1887,16 @@ cons__paths_sub_path(CONS__BakeCtx *bctx, CONS__PathNode *dir, String8 sub_dir) } // construct new node if no match - CONS__PathNode *new_node = 0; + CONS_PathNode *new_node = 0; if(match == 0){ - new_node = cons__paths_new_node(bctx); + new_node = cons_paths_new_node(bctx); new_node->parent = dir; SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); new_node->name = push_str8_copy(bctx->arena, sub_dir); } // select result from the two paths - CONS__PathNode *result = match; + CONS_PathNode *result = match; if(match == 0){ result = new_node; } @@ -1904,10 +1904,10 @@ cons__paths_sub_path(CONS__BakeCtx *bctx, CONS__PathNode *dir, String8 sub_dir) return result; } -static CONS__PathNode* -cons__paths_node_from_path(CONS__BakeCtx *bctx, String8 path) +static CONS_PathNode* +cons_paths_node_from_path(CONS_BakeCtx *bctx, String8 path) { - CONS__PathNode *node_cursor = &bctx->tree->root; + CONS_PathNode *node_cursor = &bctx->tree->root; U8 *ptr = path.str; U8 *opl = path.str + path.size; @@ -1924,42 +1924,42 @@ cons__paths_node_from_path(CONS__BakeCtx *bctx, String8 path) // if range is non-empty advance the node cursor if(range_first < ptr){ String8 sub_dir = str8_range(range_first, ptr); - node_cursor = cons__paths_sub_path(bctx, node_cursor, sub_dir); + node_cursor = cons_paths_sub_path(bctx, node_cursor, sub_dir); } } - CONS__PathNode *result = node_cursor; + CONS_PathNode *result = node_cursor; return result; } static U32 -cons__paths_idx_from_path(CONS__BakeCtx *bctx, String8 path) +cons_paths_idx_from_path(CONS_BakeCtx *bctx, String8 path) { - CONS__PathNode *node = cons__paths_node_from_path(bctx, path); + CONS_PathNode *node = cons_paths_node_from_path(bctx, path); U32 result = node->idx; return result; } -static CONS__SrcNode* -cons__paths_new_src_node(CONS__BakeCtx *bctx) +static CONS_SrcNode* +cons_paths_new_src_node(CONS_BakeCtx *bctx) { - CONS__PathTree *tree = bctx->tree; - CONS__SrcNode *result = push_array(bctx->arena, CONS__SrcNode, 1); + CONS_PathTree *tree = bctx->tree; + CONS_SrcNode *result = push_array(bctx->arena, CONS_SrcNode, 1); SLLQueuePush(tree->src_first, tree->src_last, result); result->idx = tree->src_count; tree->src_count += 1; return result; } -static CONS__SrcNode* -cons__paths_src_node_from_path_node(CONS__BakeCtx *bctx, CONS__PathNode *path_node) +static CONS_SrcNode* +cons_paths_src_node_from_path_node(CONS_BakeCtx *bctx, CONS_PathNode *path_node) { - CONS__SrcNode *result = path_node->src_file; + CONS_SrcNode *result = path_node->src_file; if(result == 0) { - CONS__SrcNode *new_node = cons__paths_new_src_node(bctx); + CONS_SrcNode *new_node = cons_paths_new_src_node(bctx); new_node->path_node = path_node; - new_node->normal_full_path = cons__normal_string_from_path_node(bctx->arena, path_node); + new_node->normal_full_path = cons_normal_string_from_path_node(bctx->arena, path_node); result = path_node->src_file = new_node; } return result; @@ -1967,10 +1967,10 @@ cons__paths_src_node_from_path_node(CONS__BakeCtx *bctx, CONS__PathNode *path_no //- rjf: per-unit line info baking -static CONS__UnitLinesCombined* -cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNode *first_seq) +static CONS_UnitLinesCombined* +cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode *first_seq) { - ProfBegin("cons__unit_combine_lines"); + ProfBegin("cons_unit_combine_lines"); Temp scratch = scratch_begin(&arena, 1); // gather up all line info into two arrays @@ -1986,19 +1986,19 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod } U64 key_count = line_count + seq_count; - CONS__SortKey *line_keys = push_array_no_zero(scratch.arena, CONS__SortKey, key_count); - CONS__LineRec *line_recs = push_array_no_zero(scratch.arena, CONS__LineRec, line_count); + CONS_SortKey *line_keys = push_array_no_zero(scratch.arena, CONS_SortKey, key_count); + CONS_LineRec *line_recs = push_array_no_zero(scratch.arena, CONS_LineRec, line_count); { - CONS__SortKey *key_ptr = line_keys; - CONS__LineRec *rec_ptr = line_recs; + CONS_SortKey *key_ptr = line_keys; + CONS_LineRec *rec_ptr = line_recs; for(CONS_LineSequenceNode *node = first_seq; node != 0; node = node->next){ - CONS__PathNode *src_path = - cons__paths_node_from_path(bctx, node->line_seq.file_name); - CONS__SrcNode *src_file = cons__paths_src_node_from_path_node(bctx, src_path); + CONS_PathNode *src_path = + cons_paths_node_from_path(bctx, node->line_seq.file_name); + CONS_SrcNode *src_file = cons_paths_src_node_from_path_node(bctx, src_path); U32 file_id = src_file->idx; U64 node_line_count = node->line_seq.line_count; @@ -2020,14 +2020,14 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod key_ptr->val = 0; key_ptr += 1; - CONS__LineMapFragment *fragment = push_array(arena, CONS__LineMapFragment, 1); + CONS_LineMapFragment *fragment = push_array(arena, CONS_LineMapFragment, 1); SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); fragment->sequence = node; } } // sort - CONS__SortKey *sorted_line_keys = cons__sort_key_array(scratch.arena, line_keys, key_count); + CONS_SortKey *sorted_line_keys = cons_sort_key_array(scratch.arena, line_keys, key_count); // TODO(allen): do a pass over sorted keys to make sure duplicate keys are sorted with // null record first, and no more than one null record and one non-null record @@ -2041,7 +2041,7 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod } arranged_voffs[key_count] = ~0ull; for(U64 i = 0; i < key_count; i += 1){ - CONS__LineRec *rec = (CONS__LineRec*)sorted_line_keys[i].val; + CONS_LineRec *rec = (CONS_LineRec*)sorted_line_keys[i].val; if(rec != 0){ arranged_lines[i].file_idx = rec->file_id; arranged_lines[i].line_num = rec->line_num; @@ -2052,7 +2052,7 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod } } - CONS__UnitLinesCombined *result = push_array(arena, CONS__UnitLinesCombined, 1); + CONS_UnitLinesCombined *result = push_array(arena, CONS_UnitLinesCombined, 1); result->voffs = arranged_voffs; result->lines = arranged_lines; result->cols = 0; @@ -2066,23 +2066,23 @@ cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNod //- rjf: per-src line info baking -static CONS__SrcLinesCombined* -cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) +static CONS_SrcLinesCombined* +cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) { - ProfBegin("cons__source_combine_lines"); + ProfBegin("cons_source_combine_lines"); Temp scratch = scratch_begin(&arena, 1); // gather line number map - CONS__SrcLineMapBucket *first_bucket = 0; - CONS__SrcLineMapBucket *last_bucket = 0; + CONS_SrcLineMapBucket *first_bucket = 0; + CONS_SrcLineMapBucket *last_bucket = 0; U64 line_hash_slots_count = 1024; - CONS__SrcLineMapBucket **line_hash_slots = push_array(scratch.arena, CONS__SrcLineMapBucket *, line_hash_slots_count); + CONS_SrcLineMapBucket **line_hash_slots = push_array(scratch.arena, CONS_SrcLineMapBucket *, line_hash_slots_count); U64 line_count = 0; U64 voff_count = 0; U64 max_line_num = 0; ProfScope("gather line number map") { - for(CONS__LineMapFragment *map_fragment = first; + for(CONS_LineMapFragment *map_fragment = first; map_fragment != 0; map_fragment = map_fragment->next) { @@ -2101,9 +2101,9 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) max_line_num = Max(max_line_num, line_num); // find match - CONS__SrcLineMapBucket *match = 0; + CONS_SrcLineMapBucket *match = 0; { - for(CONS__SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + for(CONS_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; node != 0; node = node->hash_next){ if(node->line_num == line_num){ @@ -2115,7 +2115,7 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) // introduce new line if no match if(match == 0){ - match = push_array(scratch.arena, CONS__SrcLineMapBucket, 1); + match = push_array(scratch.arena, CONS_SrcLineMapBucket, 1); SLLQueuePush_N(first_bucket, last_bucket, match, order_next); SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); match->line_num = line_num; @@ -2124,7 +2124,7 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) // insert new voff { - CONS__SrcLineMapVoffBlock *block = push_array(scratch.arena, CONS__SrcLineMapVoffBlock, 1); + CONS_SrcLineMapVoffBlock *block = push_array(scratch.arena, CONS_SrcLineMapVoffBlock, 1); SLLQueuePush(match->first_voff_block, match->last_voff_block, block); match->voff_count += 1; block->voff = voff; @@ -2134,11 +2134,11 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) } // bake sortable keys array - CONS__SortKey *keys = push_array_no_zero(scratch.arena, CONS__SortKey, line_count); + CONS_SortKey *keys = push_array_no_zero(scratch.arena, CONS_SortKey, line_count); ProfScope("bake sortable keys array") { - CONS__SortKey *key_ptr = keys; - for(CONS__SrcLineMapBucket *node = first_bucket; + CONS_SortKey *key_ptr = keys; + for(CONS_SrcLineMapBucket *node = first_bucket; node != 0; node = node->order_next, key_ptr += 1){ key_ptr->key = node->line_num; @@ -2147,7 +2147,7 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) } // sort - CONS__SortKey *sorted_keys = cons__sort_key_array(scratch.arena, keys, line_count); + CONS_SortKey *sorted_keys = cons_sort_key_array(scratch.arena, keys, line_count); // bake result U32 *line_nums = push_array_no_zero(arena, U32, line_count); @@ -2159,8 +2159,8 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) for(U32 i = 0; i < line_count; i += 1){ line_nums[i] = sorted_keys[i].key; line_ranges[i] = (U32)(voff_ptr - voffs); - CONS__SrcLineMapBucket *bucket = (CONS__SrcLineMapBucket*)sorted_keys[i].val; - for(CONS__SrcLineMapVoffBlock *node = bucket->first_voff_block; + CONS_SrcLineMapBucket *bucket = (CONS_SrcLineMapBucket*)sorted_keys[i].val; + for(CONS_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next){ *voff_ptr = node->voff; @@ -2170,7 +2170,7 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) line_ranges[line_count] = voff_count; } - CONS__SrcLinesCombined *result = push_array(arena, CONS__SrcLinesCombined, 1); + CONS_SrcLinesCombined *result = push_array(arena, CONS_SrcLinesCombined, 1); result->line_nums = line_nums; result->line_ranges = line_ranges; result->line_count = line_count; @@ -2184,13 +2184,13 @@ cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first) } //- rjf: vmap baking -static CONS__VMap* -cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey *keys, U64 marker_count) +static CONS_VMap* +cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *keys, U64 marker_count) { Temp scratch = scratch_begin(&arena, 1); // sort markers - CONS__SortKey *sorted_keys = cons__sort_key_array(scratch.arena, keys, marker_count); + CONS_SortKey *sorted_keys = cons_sort_key_array(scratch.arena, keys, marker_count); // determine if an extra vmap entry for zero is needed U32 extra_vmap_entry = 0; @@ -2212,11 +2212,11 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * vmap_ptr += 1; } - CONS__VMapRangeTracker *tracker_stack = 0; - CONS__VMapRangeTracker *tracker_free = 0; + CONS_VMapRangeTracker *tracker_stack = 0; + CONS_VMapRangeTracker *tracker_free = 0; - CONS__SortKey *key_ptr = sorted_keys; - CONS__SortKey *key_opl = sorted_keys + marker_count; + CONS_SortKey *key_ptr = sorted_keys; + CONS_SortKey *key_opl = sorted_keys + marker_count; for(;key_ptr < key_opl;){ // get initial map state from tracker stack U32 initial_idx = max_U32; @@ -2229,17 +2229,17 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * U64 voff = key_ptr->key; for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ - CONS__VMapMarker *marker = (CONS__VMapMarker*)key_ptr->val; + CONS_VMapMarker *marker = (CONS_VMapMarker*)key_ptr->val; U32 idx = marker->idx; // push to stack if(marker->begin_range){ - CONS__VMapRangeTracker *new_tracker = tracker_free; + CONS_VMapRangeTracker *new_tracker = tracker_free; if(new_tracker != 0){ SLLStackPop(tracker_free); } else{ - new_tracker = push_array(scratch.arena, CONS__VMapRangeTracker, 1); + new_tracker = push_array(scratch.arena, CONS_VMapRangeTracker, 1); } SLLStackPush(tracker_stack, new_tracker); new_tracker->idx = idx; @@ -2247,9 +2247,9 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * // pop matching node from stack (not always the top) else{ - CONS__VMapRangeTracker **ptr_in = &tracker_stack; - CONS__VMapRangeTracker *match = 0; - for(CONS__VMapRangeTracker *node = tracker_stack; + CONS_VMapRangeTracker **ptr_in = &tracker_stack; + CONS_VMapRangeTracker *match = 0; + for(CONS_VMapRangeTracker *node = tracker_stack; node != 0;){ if(node->idx == idx){ match = node; @@ -2325,7 +2325,7 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * } // fill result - CONS__VMap *result = push_array(arena, CONS__VMap, 1); + CONS_VMap *result = push_array(arena, CONS_VMap, 1); result->vmap = vmap; result->count = vmap_entry_count - 1; @@ -2334,8 +2334,8 @@ cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey * return result; } -static CONS__VMap* -cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) +static CONS_VMap* +cons_vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) { Temp scratch = scratch_begin(&arena, 1); @@ -2343,12 +2343,12 @@ cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) U64 marker_count = count*2; // fill markers - CONS__SortKey *keys = push_array_no_zero(scratch.arena, CONS__SortKey, marker_count); - CONS__VMapMarker *markers = push_array_no_zero(scratch.arena, CONS__VMapMarker, marker_count); + CONS_SortKey *keys = push_array_no_zero(scratch.arena, CONS_SortKey, marker_count); + CONS_VMapMarker *markers = push_array_no_zero(scratch.arena, CONS_VMapMarker, marker_count); { - CONS__SortKey *key_ptr = keys; - CONS__VMapMarker *marker_ptr = markers; + CONS_SortKey *key_ptr = keys; + CONS_VMapMarker *marker_ptr = markers; for(CONS_UnitVMapRange *range = first; range != 0; range = range->next){ @@ -2373,7 +2373,7 @@ cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) } // construct vmap - CONS__VMap *result = cons__vmap_from_markers(arena, markers, keys, marker_count); + CONS_VMap *result = cons_vmap_from_markers(arena, markers, keys, marker_count); scratch_end(scratch); return result; } @@ -2381,7 +2381,7 @@ cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) //- rjf: type info baking static U32* -cons__idx_run_from_types(Arena *arena, CONS_Type **types, U32 count) +cons_idx_run_from_types(Arena *arena, CONS_Type **types, U32 count) { U32 *result = push_array(arena, U32, count); for(U32 i = 0; i < count; i += 1){ @@ -2390,10 +2390,10 @@ cons__idx_run_from_types(Arena *arena, CONS_Type **types, U32 count) return result; } -static CONS__TypeData* -cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) +static CONS_TypeData* +cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) { - ProfBegin("cons__type_data_combine"); + ProfBegin("cons_type_data_combine"); Temp scratch = scratch_begin(&arena, 1); // fill type nodes @@ -2416,7 +2416,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) // built-in if(RADDBGI_TypeKind_FirstBuiltIn <= kind && kind <= RADDBGI_TypeKind_LastBuiltIn){ - ptr->built_in.name_string_idx = cons__string(bctx, loose_type->name); + ptr->built_in.name_string_idx = cons_string(bctx, loose_type->name); } // constructed @@ -2433,8 +2433,8 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) { // parameters U32 count = loose_type->count; - U32 *idx_run = cons__idx_run_from_types(scratch.arena, loose_type->param_types, count); - ptr->constructed.param_idx_run_first = cons__idx_run(bctx, idx_run, count); + U32 *idx_run = cons_idx_run_from_types(scratch.arena, loose_type->param_types, count); + ptr->constructed.param_idx_run_first = cons_idx_run(bctx, idx_run, count); ptr->constructed.count = count; }break; @@ -2442,8 +2442,8 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) { // parameters U32 count = loose_type->count; - U32 *idx_run = cons__idx_run_from_types(scratch.arena, loose_type->param_types, count); - ptr->constructed.param_idx_run_first = cons__idx_run(bctx, idx_run, count); + U32 *idx_run = cons_idx_run_from_types(scratch.arena, loose_type->param_types, count); + ptr->constructed.param_idx_run_first = cons_idx_run(bctx, idx_run, count); ptr->constructed.count = count; }break; } @@ -2451,7 +2451,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) // user-defined else if(RADDBGI_TypeKind_FirstUserDefined <= kind && kind <= RADDBGI_TypeKind_LastUserDefined){ - ptr->user_defined.name_string_idx = cons__string(bctx, loose_type->name); + ptr->user_defined.name_string_idx = cons_string(bctx, loose_type->name); if(loose_type->udt != 0){ ptr->user_defined.udt_idx = loose_type->udt->idx; } @@ -2515,7 +2515,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) for(U32 i = 0; i < local_enum_val_count; i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ - enum_member_ptr->name_string_idx = cons__string(bctx, loose_enum_val->name); + enum_member_ptr->name_string_idx = cons_string(bctx, loose_enum_val->name); enum_member_ptr->val = loose_enum_val->val; } } @@ -2532,7 +2532,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) i += 1, member_ptr += 1, loose_member = loose_member->next){ member_ptr->kind = loose_member->kind; // TODO(allen): member_ptr->visibility = ; - member_ptr->name_string_idx = cons__string(bctx, loose_member->name); + member_ptr->name_string_idx = cons_string(bctx, loose_member->name); member_ptr->off = loose_member->off; member_ptr->type_idx = loose_member->type->idx; @@ -2547,8 +2547,8 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) U32 file_idx = 0; if(loose_udt->source_path.size > 0){ - CONS__PathNode *path_node = cons__paths_node_from_path(bctx, loose_udt->source_path); - CONS__SrcNode *src_node = cons__paths_src_node_from_path_node(bctx, path_node); + CONS_PathNode *path_node = cons_paths_node_from_path(bctx, loose_udt->source_path); + CONS_SrcNode *src_node = cons_paths_src_node_from_path_node(bctx, path_node); file_idx = src_node->idx; } @@ -2566,7 +2566,7 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) // fill result - CONS__TypeData *result = push_array(arena, CONS__TypeData, 1); + CONS_TypeData *result = push_array(arena, CONS_TypeData, 1); result->type_nodes = type_nodes; result->type_node_count = type_count; result->udts = udts; @@ -2583,10 +2583,10 @@ cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) //- rjf: symbol data baking -static CONS__SymbolData* -cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) +static CONS_SymbolData* +cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) { - ProfBegin("cons__symbol_data_combine"); + ProfBegin("cons_symbol_data_combine"); Temp scratch = scratch_begin(&arena, 1); // count symbol kinds @@ -2618,8 +2618,8 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) for(CONS_Symbol *node = root->first_symbol; node != 0; node = node->next_order){ - U32 name_string_idx = cons__string(bctx, node->name); - U32 link_name_string_idx = cons__string(bctx, node->link_name); + U32 name_string_idx = cons_string(bctx, node->name); + U32 link_name_string_idx = cons_string(bctx, node->link_name); U32 type_idx = node->type->idx; RADDBGI_LinkFlags link_flags = 0; @@ -2680,17 +2680,17 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) } // global vmap - CONS__VMap *global_vmap = 0; + CONS_VMap *global_vmap = 0; { // count necessary markers U32 marker_count = globalvar_count*2; // fill markers - CONS__SortKey *keys = push_array_no_zero(scratch.arena, CONS__SortKey, marker_count); - CONS__VMapMarker *markers = push_array_no_zero(scratch.arena, CONS__VMapMarker, marker_count); + CONS_SortKey *keys = push_array_no_zero(scratch.arena, CONS_SortKey, marker_count); + CONS_VMapMarker *markers = push_array_no_zero(scratch.arena, CONS_VMapMarker, marker_count); - CONS__SortKey *key_ptr = keys; - CONS__VMapMarker *marker_ptr = markers; + CONS_SortKey *key_ptr = keys; + CONS_VMapMarker *marker_ptr = markers; // real globals for(CONS_Symbol *node = root->first_symbol; @@ -2745,7 +2745,7 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) marker_ptr - markers == marker_count); // construct vmap - global_vmap = cons__vmap_from_markers(arena, markers, keys, marker_count); + global_vmap = cons_vmap_from_markers(arena, markers, keys, marker_count); } // allocate scope array @@ -2786,7 +2786,7 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) // emit voffs U32 voff_first = (U32)(scope_voff_ptr - scope_voffs); - for(CONS__VOffRange *range = node->first_range; + for(CONS_VOffRange *range = node->first_range; range != 0; range = range->next){ *scope_voff_ptr = range->voff_first; @@ -2803,7 +2803,7 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) slocal != 0; slocal = slocal->next, local_ptr += 1){ local_ptr->kind = slocal->kind; - local_ptr->name_string_idx = cons__string(bctx, slocal->name); + local_ptr->name_string_idx = cons_string(bctx, slocal->name); local_ptr->type_idx = slocal->type->idx; CONS_LocationSet *locset = slocal->locset; @@ -2813,7 +2813,7 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) local_ptr->location_first = location_first; local_ptr->location_opl = location_opl; - for(CONS__LocationCase *location_case = locset->first_location_case; + for(CONS_LocationCase *location_case = locset->first_location_case; location_case != 0; location_case = location_case->next){ location_block_ptr->scope_off_first = location_case->voff_first; @@ -2906,24 +2906,24 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) String8 location_data_str = str8_list_join(arena, &location_data, 0); // scope vmap - CONS__VMap *scope_vmap = 0; + CONS_VMap *scope_vmap = 0; { // count necessary markers U32 marker_count = scope_voff_count; // fill markers - CONS__SortKey *keys = push_array_no_zero(scratch.arena, CONS__SortKey, marker_count); - CONS__VMapMarker *markers = push_array_no_zero(scratch.arena, CONS__VMapMarker, marker_count); + CONS_SortKey *keys = push_array_no_zero(scratch.arena, CONS_SortKey, marker_count); + CONS_VMapMarker *markers = push_array_no_zero(scratch.arena, CONS_VMapMarker, marker_count); - CONS__SortKey *key_ptr = keys; - CONS__VMapMarker *marker_ptr = markers; + CONS_SortKey *key_ptr = keys; + CONS_VMapMarker *marker_ptr = markers; for(CONS_Scope *node = root->first_scope; node != 0; node = node->next_order){ U32 scope_idx = node->idx; - for(CONS__VOffRange *range = node->first_range; + for(CONS_VOffRange *range = node->first_range; range != 0; range = range->next){ key_ptr->key = range->voff_first; @@ -2942,11 +2942,11 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) } } - scope_vmap = cons__vmap_from_markers(arena, markers, keys, marker_count); + scope_vmap = cons_vmap_from_markers(arena, markers, keys, marker_count); } // fill result - CONS__SymbolData *result = push_array(arena, CONS__SymbolData, 1); + CONS_SymbolData *result = push_array(arena, CONS_SymbolData, 1); result->global_variables = global_variables; result->global_variable_count = globalvar_count; result->global_vmap = global_vmap; @@ -2974,8 +2974,8 @@ cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx) //- rjf: name map baking -static CONS__NameMapBaked* -cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__NameMap *map) +static CONS_NameMapBaked* +cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameMap *map) { Temp scratch = scratch_begin(&arena, 1); @@ -2983,13 +2983,13 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na U32 node_count = map->name_count; // setup the final bucket layouts - CONS__NameMapSemiBucket *sbuckets = push_array(scratch.arena, CONS__NameMapSemiBucket, bucket_count); - for(CONS__NameMapNode *node = map->first; + CONS_NameMapSemiBucket *sbuckets = push_array(scratch.arena, CONS_NameMapSemiBucket, bucket_count); + for(CONS_NameMapNode *node = map->first; node != 0; node = node->order_next){ U64 hash = raddbgi_hash(node->string.str, node->string.size); U64 bi = hash%bucket_count; - CONS__NameMapSemiNode *snode = push_array(scratch.arena, CONS__NameMapSemiNode, 1); + CONS_NameMapSemiNode *snode = push_array(scratch.arena, CONS_NameMapSemiNode, 1); SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); snode->node = node; sbuckets[bi].count += 1; @@ -3007,13 +3007,13 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na bucket_ptr->first_node = (U32)(node_ptr - nodes); bucket_ptr->node_count = sbuckets[i].count; - for(CONS__NameMapSemiNode *snode = sbuckets[i].first; + for(CONS_NameMapSemiNode *snode = sbuckets[i].first; snode != 0; snode = snode->next){ - CONS__NameMapNode *node = snode->node; + CONS_NameMapNode *node = snode->node; // cons name and index(es) - U32 string_idx = cons__string(bctx, node->string); + U32 string_idx = cons_string(bctx, node->string); U32 match_count = node->idx_count; U32 idx = 0; if(match_count == 1){ @@ -3023,7 +3023,7 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na Temp temp = temp_begin(scratch.arena); U32 *idx_run = push_array_no_zero(temp.arena, U32, match_count); U32 *idx_ptr = idx_run; - for(CONS__NameMapIdxNode *idxnode = node->idx_first; + for(CONS_NameMapIdxNode *idxnode = node->idx_first; idxnode != 0; idxnode = idxnode->next){ for(U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ @@ -3036,7 +3036,7 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na } dblbreak:; Assert(idx_ptr == idx_run + match_count); - idx = cons__idx_run(bctx, idx_run, match_count); + idx = cons_idx_run(bctx, idx_run, match_count); temp_end(temp); } @@ -3052,7 +3052,7 @@ cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__Na scratch_end(scratch); - CONS__NameMapBaked *result = push_array(arena, CONS__NameMapBaked, 1); + CONS_NameMapBaked *result = push_array(arena, CONS_NameMapBaked, 1); result->buckets = buckets; result->nodes = nodes; result->bucket_count = bucket_count; @@ -3069,15 +3069,15 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) str8_serial_begin(arena, out); // setup cons helpers - CONS__DSections dss = {0}; - cons__dsection(arena, &dss, 0, 0, RADDBGI_DataSectionTag_NULL); + CONS_DSections dss = {0}; + cons_dsection(arena, &dss, 0, 0, RADDBGI_DataSectionTag_NULL); - CONS__BakeParams bctx_params = {0}; + CONS_BakeParams bctx_params = {0}; { bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); } - CONS__BakeCtx *bctx = cons__bake_ctx_begin(&bctx_params); + CONS_BakeCtx *bctx = cons_bake_ctx_begin(&bctx_params); //////////////////////////////// // MAIN PART: allocating and filling out sections of the file @@ -3087,11 +3087,11 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) { CONS_TopLevelInfo *cons_tli = &root->top_level_info; tli->architecture = cons_tli->architecture; - tli->exe_name_string_idx = cons__string(bctx, cons_tli->exe_name); + tli->exe_name_string_idx = cons_string(bctx, cons_tli->exe_name); tli->exe_hash = cons_tli->exe_hash; tli->voff_max = cons_tli->voff_max; } - cons__dsection(arena, &dss, tli, sizeof(*tli), RADDBGI_DataSectionTag_TopLevelInfo); + cons_dsection(arena, &dss, tli, sizeof(*tli), RADDBGI_DataSectionTag_TopLevelInfo); // binary sections array { @@ -3101,14 +3101,14 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) for(CONS_BinarySection *ssec = root->binary_section_first; ssec != 0; ssec = ssec->next, dsec += 1){ - dsec->name_string_idx = cons__string(bctx, ssec->name); + dsec->name_string_idx = cons_string(bctx, ssec->name); dsec->flags = ssec->flags; dsec->voff_first = ssec->voff_first; dsec->voff_opl = ssec->voff_opl; dsec->foff_first = ssec->foff_first; dsec->foff_opl = ssec->foff_opl; } - cons__dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBGI_DataSectionTag_BinarySections); + cons_dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBGI_DataSectionTag_BinarySections); } // units array @@ -3123,13 +3123,13 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) sunit != 0; sunit = sunit->next_order, dunit += 1){ // strings & paths - U32 unit_name = cons__string(bctx, sunit->unit_name); - U32 cmp_name = cons__string(bctx, sunit->compiler_name); + U32 unit_name = cons_string(bctx, sunit->unit_name); + U32 cmp_name = cons_string(bctx, sunit->compiler_name); - U32 src_path = cons__paths_idx_from_path(bctx, sunit->source_file); - U32 obj_path = cons__paths_idx_from_path(bctx, sunit->object_file); - U32 archive_path = cons__paths_idx_from_path(bctx, sunit->archive_file); - U32 build_path = cons__paths_idx_from_path(bctx, sunit->build_path); + U32 src_path = cons_paths_idx_from_path(bctx, sunit->source_file); + U32 obj_path = cons_paths_idx_from_path(bctx, sunit->object_file); + U32 archive_path = cons_paths_idx_from_path(bctx, sunit->archive_file); + U32 build_path = cons_paths_idx_from_path(bctx, sunit->build_path); dunit->unit_name_string_idx = unit_name; dunit->compiler_name_string_idx = cmp_name; @@ -3141,139 +3141,139 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) // line info (voff -> file*line*col) CONS_LineSequenceNode *first_seq = sunit->line_seq_first; - CONS__UnitLinesCombined *lines = cons__unit_combine_lines(arena, bctx, first_seq); + CONS_UnitLinesCombined *lines = cons_unit_combine_lines(arena, bctx, first_seq); U32 line_count = lines->line_count; if(line_count > 0){ dunit->line_info_voffs_data_idx = - cons__dsection(arena, &dss, lines->voffs, sizeof(U64)*(line_count + 1), - RADDBGI_DataSectionTag_LineInfoVoffs); + cons_dsection(arena, &dss, lines->voffs, sizeof(U64)*(line_count + 1), + RADDBGI_DataSectionTag_LineInfoVoffs); dunit->line_info_data_idx = - cons__dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, - RADDBGI_DataSectionTag_LineInfoData); + cons_dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, + RADDBGI_DataSectionTag_LineInfoData); if(lines->cols != 0){ dunit->line_info_col_data_idx = - cons__dsection(arena, &dss, lines->cols, sizeof(RADDBGI_Column)*line_count, - RADDBGI_DataSectionTag_LineInfoColumns); + cons_dsection(arena, &dss, lines->cols, sizeof(RADDBGI_Column)*line_count, + RADDBGI_DataSectionTag_LineInfoColumns); } dunit->line_info_count = line_count; } } - cons__dsection(arena, &dss, units, sizeof(*units)*count, RADDBGI_DataSectionTag_Units); + cons_dsection(arena, &dss, units, sizeof(*units)*count, RADDBGI_DataSectionTag_Units); } // source file line info baking // * pass for "source_combine_line" for each source file - // * can only be run after a pass that does "unit_combine_lines" for each unit. - for(CONS__SrcNode *src_node = bctx->tree->src_first; + for(CONS_SrcNode *src_node = bctx->tree->src_first; src_node != 0; src_node = src_node->next){ - CONS__LineMapFragment *first_fragment = src_node->first_fragment; - CONS__SrcLinesCombined *lines = cons__source_combine_lines(arena, first_fragment); + CONS_LineMapFragment *first_fragment = src_node->first_fragment; + CONS_SrcLinesCombined *lines = cons_source_combine_lines(arena, first_fragment); U32 line_count = lines->line_count; if(line_count > 0){ src_node->line_map_count = line_count; src_node->line_map_nums_data_idx = - cons__dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, - RADDBGI_DataSectionTag_LineMapNumbers); + cons_dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, + RADDBGI_DataSectionTag_LineMapNumbers); src_node->line_map_range_data_idx = - cons__dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), - RADDBGI_DataSectionTag_LineMapRanges); + cons_dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), + RADDBGI_DataSectionTag_LineMapRanges); src_node->line_map_voff_data_idx = - cons__dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, - RADDBGI_DataSectionTag_LineMapVoffs); + cons_dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, + RADDBGI_DataSectionTag_LineMapVoffs); } } // source file name mapping { - CONS__NameMap* map = cons__name_map_for_kind(root, RADDBGI_NameMapKind_NormalSourcePaths); - for(CONS__SrcNode *src_node = bctx->tree->src_first; + CONS_NameMap* map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_NormalSourcePaths); + for(CONS_SrcNode *src_node = bctx->tree->src_first; src_node != 0; src_node = src_node->next){ if(src_node->idx != 0){ - cons__name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); + cons_name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); } } } // unit vmap baking { - CONS__VMap *vmap = cons__vmap_from_unit_ranges(arena, - root->unit_vmap_range_first, - root->unit_vmap_range_count); + CONS_VMap *vmap = cons_vmap_from_unit_ranges(arena, + root->unit_vmap_range_first, + root->unit_vmap_range_count); U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); - cons__dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); + cons_dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); } // type info baking { - CONS__TypeData *types = cons__type_data_combine(arena, root, bctx); + CONS_TypeData *types = cons_type_data_combine(arena, root, bctx); U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; - cons__dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); + cons_dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); U64 udt_size = sizeof(*types->udts)*types->udt_count; - cons__dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); + cons_dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); U64 member_size = sizeof(*types->members)*types->member_count; - cons__dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); + cons_dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; - cons__dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); + cons_dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); } // symbol info baking { - CONS__SymbolData *symbol_data = cons__symbol_data_combine(arena, root, bctx); + CONS_SymbolData *symbol_data = cons_symbol_data_combine(arena, root, bctx); U64 global_variables_size = sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; - cons__dsection(arena, &dss, symbol_data->global_variables, global_variables_size, - RADDBGI_DataSectionTag_GlobalVariables); + cons_dsection(arena, &dss, symbol_data->global_variables, global_variables_size, + RADDBGI_DataSectionTag_GlobalVariables); - CONS__VMap *global_vmap = symbol_data->global_vmap; + CONS_VMap *global_vmap = symbol_data->global_vmap; U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); - cons__dsection(arena, &dss, global_vmap->vmap, global_vmap_size, - RADDBGI_DataSectionTag_GlobalVmap); + cons_dsection(arena, &dss, global_vmap->vmap, global_vmap_size, + RADDBGI_DataSectionTag_GlobalVmap); U64 thread_variables_size = sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; - cons__dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, - RADDBGI_DataSectionTag_ThreadVariables); + cons_dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, + RADDBGI_DataSectionTag_ThreadVariables); U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; - cons__dsection(arena, &dss, symbol_data->procedures, procedures_size, - RADDBGI_DataSectionTag_Procedures); + cons_dsection(arena, &dss, symbol_data->procedures, procedures_size, + RADDBGI_DataSectionTag_Procedures); U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; - cons__dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); + cons_dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; - cons__dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, - RADDBGI_DataSectionTag_ScopeVoffData); + cons_dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, + RADDBGI_DataSectionTag_ScopeVoffData); - CONS__VMap *scope_vmap = symbol_data->scope_vmap; + CONS_VMap *scope_vmap = symbol_data->scope_vmap; U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); - cons__dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); + cons_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; - cons__dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); + cons_dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); U64 location_blocks_size = sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; - cons__dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, - RADDBGI_DataSectionTag_LocationBlocks); + cons_dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, + RADDBGI_DataSectionTag_LocationBlocks); U64 location_data_size = symbol_data->location_data_size; - cons__dsection(arena, &dss, symbol_data->location_data, location_data_size, - RADDBGI_DataSectionTag_LocationData); + cons_dsection(arena, &dss, symbol_data->location_data, location_data_size, + RADDBGI_DataSectionTag_LocationData); } // name map baking @@ -3289,23 +3289,23 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) RADDBGI_NameMap *name_map_ptr = name_maps; for(U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ - CONS__NameMap *map = root->name_maps[i]; + CONS_NameMap *map = root->name_maps[i]; if(map != 0){ - CONS__NameMapBaked *baked = cons__name_map_bake(arena, root, bctx, map); + CONS_NameMapBaked *baked = cons_name_map_bake(arena, root, bctx, map); name_map_ptr->kind = i; name_map_ptr->bucket_data_idx = - cons__dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, - RADDBGI_DataSectionTag_NameMapBuckets); + cons_dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, + RADDBGI_DataSectionTag_NameMapBuckets); name_map_ptr->node_data_idx = - cons__dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, - RADDBGI_DataSectionTag_NameMapNodes); + cons_dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, + RADDBGI_DataSectionTag_NameMapNodes); name_map_ptr += 1; } } - cons__dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, - RADDBGI_DataSectionTag_NameMaps); + cons_dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, + RADDBGI_DataSectionTag_NameMaps); } //////////////////////////////// @@ -3317,10 +3317,10 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) RADDBGI_FilePathNode *nodes = push_array(arena, RADDBGI_FilePathNode, count); RADDBGI_FilePathNode *out_node = nodes; - for(CONS__PathNode *node = bctx->tree->first; + for(CONS_PathNode *node = bctx->tree->first; node != 0; node = node->next_order, out_node += 1){ - out_node->name_string_idx = cons__string(bctx, node->name); + out_node->name_string_idx = cons_string(bctx, node->name); if(node->parent != 0){ out_node->parent_path_node = node->parent->idx; } @@ -3335,7 +3335,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } } - cons__dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBGI_DataSectionTag_FilePathNodes); + cons_dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBGI_DataSectionTag_FilePathNodes); } // generate data sections for files @@ -3344,18 +3344,18 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) RADDBGI_SourceFile *src_files = push_array(arena, RADDBGI_SourceFile, count); RADDBGI_SourceFile *out_src_file = src_files; - for(CONS__SrcNode *node = bctx->tree->src_first; + for(CONS_SrcNode *node = bctx->tree->src_first; node != 0; node = node->next, out_src_file += 1){ out_src_file->file_path_node_idx = node->path_node->idx; - out_src_file->normal_full_path_string_idx = cons__string(bctx, node->normal_full_path); + out_src_file->normal_full_path_string_idx = cons_string(bctx, node->normal_full_path); out_src_file->line_map_nums_data_idx = node->line_map_nums_data_idx; out_src_file->line_map_range_data_idx = node->line_map_range_data_idx; out_src_file->line_map_count = node->line_map_count; out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; } - cons__dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBGI_DataSectionTag_SourceFiles); + cons_dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBGI_DataSectionTag_SourceFiles); } // generate data sections for strings @@ -3367,7 +3367,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) U32 *off_ptr = str_offs; *off_ptr = 0; off_ptr += 1; - for(CONS__StringNode *node = bctx->strs.order_first; + for(CONS_StringNode *node = bctx->strs.order_first; node != 0; node = node->order_next){ off_cursor += node->str.size; @@ -3379,7 +3379,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) U8 *buf = push_array(arena, U8, off_cursor); { U8 *ptr = buf; - for(CONS__StringNode *node = bctx->strs.order_first; + for(CONS_StringNode *node = bctx->strs.order_first; node != 0; node = node->order_next){ MemoryCopy(ptr, node->str.str, node->str.size); @@ -3387,9 +3387,9 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } } - cons__dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), - RADDBGI_DataSectionTag_StringTable); - cons__dsection(arena, &dss, buf, off_cursor, RADDBGI_DataSectionTag_StringData); + cons_dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), + RADDBGI_DataSectionTag_StringTable); + cons_dsection(arena, &dss, buf, off_cursor, RADDBGI_DataSectionTag_StringData); } // generate data sections for index runs @@ -3399,7 +3399,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) { U32 *out_ptr = idx_data; U32 *opl = out_ptr + bctx->idxs.idx_count; - CONS__IdxRunNode *node = bctx->idxs.order_first; + CONS_IdxRunNode *node = bctx->idxs.order_first; for(;node != 0 && out_ptr < opl; node = node->order_next){ MemoryCopy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); @@ -3408,8 +3408,8 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) Assert(out_ptr == opl); } - cons__dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, - RADDBGI_DataSectionTag_IndexRuns); + cons_dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, + RADDBGI_DataSectionTag_IndexRuns); } // layout @@ -3431,7 +3431,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } { U64 test_dss_count = 0; - for(CONS__DSectionNode *node = dss.first; + for(CONS_DSectionNode *node = dss.first; node != 0; node = node->next){ test_dss_count += 1; @@ -3439,7 +3439,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) Assert(test_dss_count == dss.count); RADDBGI_DataSection *ptr = dstable; - for(CONS__DSectionNode *node = dss.first; + for(CONS_DSectionNode *node = dss.first; node != 0; node = node->next, ptr += 1){ U64 data_section_offset = 0; @@ -3458,6 +3458,6 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) Assert(ptr == dstable + dss.count); } - cons__bake_ctx_release(bctx); + cons_bake_ctx_release(bctx); ProfEnd(); } diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/raddbgi_cons/raddbgi_cons.h index f1c7e573..e9ab4716 100644 --- a/src/raddbgi_cons/raddbgi_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -27,47 +27,47 @@ struct CONS_ErrorList //- rjf: u64 -> pointer map -typedef struct CONS__U64ToPtrNode CONS__U64ToPtrNode; -struct CONS__U64ToPtrNode +typedef struct CONS_U64ToPtrNode CONS_U64ToPtrNode; +struct CONS_U64ToPtrNode { - CONS__U64ToPtrNode *next; + CONS_U64ToPtrNode *next; U64 _padding_; U64 key[1]; void *ptr[1]; }; -typedef struct CONS__U64ToPtrMap CONS__U64ToPtrMap; -struct CONS__U64ToPtrMap +typedef struct CONS_U64ToPtrMap CONS_U64ToPtrMap; +struct CONS_U64ToPtrMap { - CONS__U64ToPtrNode **buckets; + CONS_U64ToPtrNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 pair_count; }; -typedef struct CONS__U64ToPtrLookup CONS__U64ToPtrLookup; -struct CONS__U64ToPtrLookup +typedef struct CONS_U64ToPtrLookup CONS_U64ToPtrLookup; +struct CONS_U64ToPtrLookup { void *match; - CONS__U64ToPtrNode *fill_node; + CONS_U64ToPtrNode *fill_node; U32 fill_k; }; //- rjf: string8 -> pointer map -typedef struct CONS__Str8ToPtrNode CONS__Str8ToPtrNode; -struct CONS__Str8ToPtrNode +typedef struct CONS_Str8ToPtrNode CONS_Str8ToPtrNode; +struct CONS_Str8ToPtrNode { - struct CONS__Str8ToPtrNode *next; + struct CONS_Str8ToPtrNode *next; String8 key; U64 hash; void *ptr; }; -typedef struct CONS__Str8ToPtrMap CONS__Str8ToPtrMap; -struct CONS__Str8ToPtrMap +typedef struct CONS_Str8ToPtrMap CONS_Str8ToPtrMap; +struct CONS_Str8ToPtrMap { - CONS__Str8ToPtrNode **buckets; + CONS_Str8ToPtrNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 pair_count; @@ -75,17 +75,17 @@ struct CONS__Str8ToPtrMap //- rjf: sortable range data structure -typedef struct CONS__SortKey CONS__SortKey; -struct CONS__SortKey +typedef struct CONS_SortKey CONS_SortKey; +struct CONS_SortKey { U64 key; void *val; }; -typedef struct CONS__OrderedRange CONS__OrderedRange; -struct CONS__OrderedRange +typedef struct CONS_OrderedRange CONS_OrderedRange; +struct CONS_OrderedRange { - CONS__OrderedRange *next; + CONS_OrderedRange *next; U64 first; U64 opl; }; @@ -314,10 +314,10 @@ struct CONS_Local struct CONS_LocationSet *locset; }; -typedef struct CONS__VOffRange CONS__VOffRange; -struct CONS__VOffRange +typedef struct CONS_VOffRange CONS_VOffRange; +struct CONS_VOffRange { - CONS__VOffRange *next; + CONS_VOffRange *next; U64 voff_first; U64 voff_opl; }; @@ -332,8 +332,8 @@ struct CONS_Scope CONS_Scope *last_child; CONS_Scope *next_sibling; U64 voff_base; - CONS__VOffRange *first_range; - CONS__VOffRange *last_range; + CONS_VOffRange *first_range; + CONS_VOffRange *last_range; U32 range_count; U32 idx; CONS_Local *first_local; @@ -371,10 +371,10 @@ struct CONS_Location CONS_EvalBytecode bytecode; }; -typedef struct CONS__LocationCase CONS__LocationCase; -struct CONS__LocationCase +typedef struct CONS_LocationCase CONS_LocationCase; +struct CONS_LocationCase { - CONS__LocationCase *next; + CONS_LocationCase *next; U64 voff_first; U64 voff_opl; CONS_Location *location; @@ -383,40 +383,40 @@ struct CONS__LocationCase typedef struct CONS_LocationSet CONS_LocationSet; struct CONS_LocationSet { - CONS__LocationCase *first_location_case; - CONS__LocationCase *last_location_case; + CONS_LocationCase *first_location_case; + CONS_LocationCase *last_location_case; U64 location_case_count; }; //////////////////////////////// //~ rjf: Name Map Types -typedef struct CONS__NameMapIdxNode CONS__NameMapIdxNode; -struct CONS__NameMapIdxNode +typedef struct CONS_NameMapIdxNode CONS_NameMapIdxNode; +struct CONS_NameMapIdxNode { - CONS__NameMapIdxNode *next; + CONS_NameMapIdxNode *next; U32 idx[8]; }; -typedef struct CONS__NameMapNode CONS__NameMapNode; -struct CONS__NameMapNode +typedef struct CONS_NameMapNode CONS_NameMapNode; +struct CONS_NameMapNode { - CONS__NameMapNode *bucket_next; - CONS__NameMapNode *order_next; + CONS_NameMapNode *bucket_next; + CONS_NameMapNode *order_next; String8 string; - CONS__NameMapIdxNode *idx_first; - CONS__NameMapIdxNode *idx_last; + CONS_NameMapIdxNode *idx_first; + CONS_NameMapIdxNode *idx_last; U64 idx_count; }; -typedef struct CONS__NameMap CONS__NameMap; -struct CONS__NameMap +typedef struct CONS_NameMap CONS_NameMap; +struct CONS_NameMap { - CONS__NameMapNode **buckets; + CONS_NameMapNode **buckets; U64 buckets_count; U64 bucket_collision_count; - CONS__NameMapNode *first; - CONS__NameMapNode *last; + CONS_NameMapNode *first; + CONS_NameMapNode *last; U64 name_count; }; @@ -513,16 +513,16 @@ struct CONS_Root U64 location_count; // name maps - CONS__NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; + CONS_NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; //////// Handle Relationship Maps - CONS__U64ToPtrMap unit_map; - CONS__U64ToPtrMap symbol_map; - CONS__U64ToPtrMap scope_map; - CONS__U64ToPtrMap local_map; - CONS__U64ToPtrMap type_from_id_map; - CONS__Str8ToPtrMap construct_map; + CONS_U64ToPtrMap unit_map; + CONS_U64ToPtrMap symbol_map; + CONS_U64ToPtrMap scope_map; + CONS_U64ToPtrMap local_map; + CONS_U64ToPtrMap type_from_id_map; + CONS_Str8ToPtrMap construct_map; }; //////////////////////////////// @@ -530,41 +530,41 @@ struct CONS_Root //- rjf: bake data section data structure -typedef struct CONS__DSectionNode CONS__DSectionNode; -struct CONS__DSectionNode +typedef struct CONS_DSectionNode CONS_DSectionNode; +struct CONS_DSectionNode { - CONS__DSectionNode *next; + CONS_DSectionNode *next; void *data; U64 size; RADDBGI_DataSectionTag tag; }; -typedef struct CONS__DSections CONS__DSections; -struct CONS__DSections +typedef struct CONS_DSections CONS_DSections; +struct CONS_DSections { - CONS__DSectionNode *first; - CONS__DSectionNode *last; + CONS_DSectionNode *first; + CONS_DSectionNode *last; U32 count; }; //- rjf: bake string data structure -typedef struct CONS__StringNode CONS__StringNode; -struct CONS__StringNode +typedef struct CONS_StringNode CONS_StringNode; +struct CONS_StringNode { - CONS__StringNode *order_next; - CONS__StringNode *bucket_next; + CONS_StringNode *order_next; + CONS_StringNode *bucket_next; String8 str; U64 hash; U32 idx; }; -typedef struct CONS__Strings CONS__Strings; -struct CONS__Strings +typedef struct CONS_Strings CONS_Strings; +struct CONS_Strings { - CONS__StringNode *order_first; - CONS__StringNode *order_last; - CONS__StringNode **buckets; + CONS_StringNode *order_first; + CONS_StringNode *order_last; + CONS_StringNode **buckets; U64 buckets_count; U64 bucket_collision_count; U32 count; @@ -572,23 +572,23 @@ struct CONS__Strings //- rjf: index run baking data structure -typedef struct CONS__IdxRunNode CONS__IdxRunNode; -struct CONS__IdxRunNode +typedef struct CONS_IdxRunNode CONS_IdxRunNode; +struct CONS_IdxRunNode { - CONS__IdxRunNode *order_next; - CONS__IdxRunNode *bucket_next; + CONS_IdxRunNode *order_next; + CONS_IdxRunNode *bucket_next; U32 *idx_run; U64 hash; U32 count; U32 first_idx; }; -typedef struct CONS__IdxRuns CONS__IdxRuns; -struct CONS__IdxRuns +typedef struct CONS_IdxRuns CONS_IdxRuns; +struct CONS_IdxRuns { - CONS__IdxRunNode *order_first; - CONS__IdxRunNode *order_last; - CONS__IdxRunNode **buckets; + CONS_IdxRunNode *order_first; + CONS_IdxRunNode *order_last; + CONS_IdxRunNode **buckets; U64 buckets_count; U64 bucket_collision_count; U32 count; @@ -597,38 +597,38 @@ struct CONS__IdxRuns //- rjf: source file & file path baking data structures -typedef struct CONS__PathNode CONS__PathNode; -struct CONS__PathNode +typedef struct CONS_PathNode CONS_PathNode; +struct CONS_PathNode { - CONS__PathNode *next_order; - CONS__PathNode *parent; - CONS__PathNode *first_child; - CONS__PathNode *last_child; - CONS__PathNode *next_sibling; + CONS_PathNode *next_order; + CONS_PathNode *parent; + CONS_PathNode *first_child; + CONS_PathNode *last_child; + CONS_PathNode *next_sibling; String8 name; - struct CONS__SrcNode *src_file; + struct CONS_SrcNode *src_file; U32 idx; }; -typedef struct CONS__LineMapFragment CONS__LineMapFragment; -struct CONS__LineMapFragment +typedef struct CONS_LineMapFragment CONS_LineMapFragment; +struct CONS_LineMapFragment { - CONS__LineMapFragment *next; + CONS_LineMapFragment *next; CONS_LineSequenceNode *sequence; }; -typedef struct CONS__SrcNode CONS__SrcNode; -struct CONS__SrcNode +typedef struct CONS_SrcNode CONS_SrcNode; +struct CONS_SrcNode { - CONS__SrcNode *next; - CONS__PathNode *path_node; + CONS_SrcNode *next; + CONS_PathNode *path_node; U32 idx; String8 normal_full_path; // place to gather the line info attached to this src file - CONS__LineMapFragment *first_fragment; - CONS__LineMapFragment *last_fragment; + CONS_LineMapFragment *first_fragment; + CONS_LineMapFragment *last_fragment; // place to put the final baked version of this file's line map U32 line_map_nums_data_idx; @@ -637,22 +637,22 @@ struct CONS__SrcNode U32 line_map_voff_data_idx; }; -typedef struct CONS__PathTree CONS__PathTree; -struct CONS__PathTree +typedef struct CONS_PathTree CONS_PathTree; +struct CONS_PathTree { - CONS__PathNode *first; - CONS__PathNode *last; + CONS_PathNode *first; + CONS_PathNode *last; U32 count; - CONS__PathNode root; - CONS__SrcNode *src_first; - CONS__SrcNode *src_last; + CONS_PathNode root; + CONS_SrcNode *src_first; + CONS_SrcNode *src_last; U32 src_count; }; //- rjf: line info baking data structures -typedef struct CONS__LineRec CONS__LineRec; -struct CONS__LineRec +typedef struct CONS_LineRec CONS_LineRec; +struct CONS_LineRec { U32 file_id; U32 line_num; @@ -660,8 +660,8 @@ struct CONS__LineRec U16 col_opl; }; -typedef struct CONS__UnitLinesCombined CONS__UnitLinesCombined; -struct CONS__UnitLinesCombined +typedef struct CONS_UnitLinesCombined CONS_UnitLinesCombined; +struct CONS_UnitLinesCombined { U64 *voffs; RADDBGI_Line *lines; @@ -669,8 +669,8 @@ struct CONS__UnitLinesCombined U32 line_count; }; -typedef struct CONS__SrcLinesCombined CONS__SrcLinesCombined; -struct CONS__SrcLinesCombined +typedef struct CONS_SrcLinesCombined CONS_SrcLinesCombined; +struct CONS_SrcLinesCombined { U32 *line_nums; U32 *line_ranges; @@ -679,51 +679,51 @@ struct CONS__SrcLinesCombined U32 voff_count; }; -typedef struct CONS__SrcLineMapVoffBlock CONS__SrcLineMapVoffBlock; -struct CONS__SrcLineMapVoffBlock +typedef struct CONS_SrcLineMapVoffBlock CONS_SrcLineMapVoffBlock; +struct CONS_SrcLineMapVoffBlock { - CONS__SrcLineMapVoffBlock *next; + CONS_SrcLineMapVoffBlock *next; U64 voff; }; -typedef struct CONS__SrcLineMapBucket CONS__SrcLineMapBucket; -struct CONS__SrcLineMapBucket +typedef struct CONS_SrcLineMapBucket CONS_SrcLineMapBucket; +struct CONS_SrcLineMapBucket { - CONS__SrcLineMapBucket *order_next; - CONS__SrcLineMapBucket *hash_next; + CONS_SrcLineMapBucket *order_next; + CONS_SrcLineMapBucket *hash_next; U32 line_num; - CONS__SrcLineMapVoffBlock *first_voff_block; - CONS__SrcLineMapVoffBlock *last_voff_block; + CONS_SrcLineMapVoffBlock *first_voff_block; + CONS_SrcLineMapVoffBlock *last_voff_block; U64 voff_count; }; //- rjf: vmap baking data structure -typedef struct CONS__VMap CONS__VMap; -struct CONS__VMap +typedef struct CONS_VMap CONS_VMap; +struct CONS_VMap { RADDBGI_VMapEntry *vmap; // [count + 1] U32 count; }; -typedef struct CONS__VMapMarker CONS__VMapMarker; -struct CONS__VMapMarker +typedef struct CONS_VMapMarker CONS_VMapMarker; +struct CONS_VMapMarker { U32 idx; U32 begin_range; }; -typedef struct CONS__VMapRangeTracker CONS__VMapRangeTracker; -struct CONS__VMapRangeTracker +typedef struct CONS_VMapRangeTracker CONS_VMapRangeTracker; +struct CONS_VMapRangeTracker { - CONS__VMapRangeTracker *next; + CONS_VMapRangeTracker *next; U32 idx; }; //- rjf: type data baking types -typedef struct CONS__TypeData CONS__TypeData; -struct CONS__TypeData +typedef struct CONS_TypeData CONS_TypeData; +struct CONS_TypeData { RADDBGI_TypeNode *type_nodes; U32 type_node_count; @@ -740,13 +740,13 @@ struct CONS__TypeData //- rjf: symbol data baking types -typedef struct CONS__SymbolData CONS__SymbolData; -struct CONS__SymbolData +typedef struct CONS_SymbolData CONS_SymbolData; +struct CONS_SymbolData { RADDBGI_GlobalVariable *global_variables; U32 global_variable_count; - CONS__VMap *global_vmap; + CONS_VMap *global_vmap; RADDBGI_ThreadVariable *thread_variables; U32 thread_variable_count; @@ -760,7 +760,7 @@ struct CONS__SymbolData U64 *scope_voffs; U32 scope_voff_count; - CONS__VMap *scope_vmap; + CONS_VMap *scope_vmap; RADDBGI_Local *locals; U32 local_count; @@ -774,23 +774,23 @@ struct CONS__SymbolData //- rjf: name map baking types -typedef struct CONS__NameMapSemiNode CONS__NameMapSemiNode; -struct CONS__NameMapSemiNode +typedef struct CONS_NameMapSemiNode CONS_NameMapSemiNode; +struct CONS_NameMapSemiNode { - CONS__NameMapSemiNode *next; - CONS__NameMapNode *node; + CONS_NameMapSemiNode *next; + CONS_NameMapNode *node; }; -typedef struct CONS__NameMapSemiBucket CONS__NameMapSemiBucket; -struct CONS__NameMapSemiBucket +typedef struct CONS_NameMapSemiBucket CONS_NameMapSemiBucket; +struct CONS_NameMapSemiBucket { - CONS__NameMapSemiNode *first; - CONS__NameMapSemiNode *last; + CONS_NameMapSemiNode *first; + CONS_NameMapSemiNode *last; U64 count; }; -typedef struct CONS__NameMapBaked CONS__NameMapBaked; -struct CONS__NameMapBaked +typedef struct CONS_NameMapBaked CONS_NameMapBaked; +struct CONS_NameMapBaked { RADDBGI_NameMapBucket *buckets; RADDBGI_NameMapNode *nodes; @@ -800,20 +800,20 @@ struct CONS__NameMapBaked //- rjf: bundle baking context type -typedef struct CONS__BakeParams CONS__BakeParams; -struct CONS__BakeParams +typedef struct CONS_BakeParams CONS_BakeParams; +struct CONS_BakeParams { U64 strings_bucket_count; U64 idx_runs_bucket_count; }; -typedef struct CONS__BakeCtx CONS__BakeCtx; -struct CONS__BakeCtx +typedef struct CONS_BakeCtx CONS_BakeCtx; +struct CONS_BakeCtx { Arena *arena; - CONS__Strings strs; - CONS__IdxRuns idxs; - CONS__PathTree *tree; + CONS_Strings strs; + CONS_IdxRuns idxs; + CONS_PathTree *tree; }; //////////////////////////////// @@ -829,20 +829,20 @@ static void cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, static void cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *right_destroyed); //- rjf: sortable range sorting -static CONS__SortKey* cons__sort_key_array(Arena *arena, CONS__SortKey *keys, U64 count); +static CONS_SortKey* cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count); //////////////////////////////// //~ rjf: Auxiliary Data Structure Functions //- rjf: u64 -> ptr map -static void cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count); -static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out); -static void cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup, void *ptr); +static void cons_u64toptr_init(Arena *arena, CONS_U64ToPtrMap *map, U64 bucket_count); +static void cons_u64toptr_lookup(CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLookup *lookup_out); +static void cons_u64toptr_insert(Arena *arena, CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLookup *lookup, void *ptr); //- rjf: string8 -> ptr map -static void cons__str8toptr_init(Arena *arena, CONS__Str8ToPtrMap *map, U64 bucket_count); -static void*cons__str8toptr_lookup(CONS__Str8ToPtrMap *map, String8 key, U64 hash); -static void cons__str8toptr_insert(Arena *arena, CONS__Str8ToPtrMap *map, String8 key, U64 hash, void *ptr); +static void cons_str8toptr_init(Arena *arena, CONS_Str8ToPtrMap *map, U64 bucket_count); +static void*cons_str8toptr_lookup(CONS_Str8ToPtrMap *map, String8 key, U64 hash); +static void cons_str8toptr_insert(Arena *arena, CONS_Str8ToPtrMap *map, String8 key, U64 hash, void *ptr); //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions @@ -884,9 +884,9 @@ static CONS_Type* cons_type_nil(CONS_Root *root); static CONS_Type* cons_type_variadic(CONS_Root *root); //- rjf: base type info constructors -static CONS_Type* cons__type_new(CONS_Root *root); -static CONS_TypeUDT* cons__type_udt_from_any_type(CONS_Root *root, CONS_Type *type); -static CONS_TypeUDT* cons__type_udt_from_record_type(CONS_Root *root, CONS_Type *type); +static CONS_Type* cons_type_new(CONS_Root *root); +static CONS_TypeUDT* cons_type_udt_from_any_type(CONS_Root *root, CONS_Type *type); +static CONS_TypeUDT* cons_type_udt_from_record_type(CONS_Root *root, CONS_Type *type); //- rjf: basic/operator type construction helpers static CONS_Type* cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name); @@ -925,7 +925,7 @@ static void cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_Symb static CONS_Scope *cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash); static void cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent); static void cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl); -static void cons__scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol); +static void cons_scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol); //- rjf: local info building static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash); @@ -941,55 +941,55 @@ static CONS_Location* cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 r static CONS_Location* cons_location_val_reg(CONS_Root *root, U8 reg_code); //- rjf: name map building -static CONS__NameMap* cons__name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind); -static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *map, String8 name, U32 idx); +static CONS_NameMap* cons_name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind); +static void cons_name_map_add_pair(CONS_Root *root, CONS_NameMap *map, String8 name, U32 idx); //////////////////////////////// //~ rjf: Debug Info Baking (Loose -> Tight) Functions //- rjf: bake context construction -static CONS__BakeCtx* cons__bake_ctx_begin(CONS__BakeParams *params); -static void cons__bake_ctx_release(CONS__BakeCtx *bake_ctx); +static CONS_BakeCtx* cons_bake_ctx_begin(CONS_BakeParams *params); +static void cons_bake_ctx_release(CONS_BakeCtx *bake_ctx); //- rjf: string baking -static U32 cons__string(CONS__BakeCtx *bctx, String8 str); +static U32 cons_string(CONS_BakeCtx *bctx, String8 str); //- rjf: idx run baking -static U64 cons__idx_run_hash(U32 *idx_run, U32 count); -static U32 cons__idx_run(CONS__BakeCtx *bctx, U32 *idx_run, U32 count); +static U64 cons_idx_run_hash(U32 *idx_run, U32 count); +static U32 cons_idx_run(CONS_BakeCtx *bctx, U32 *idx_run, U32 count); //- rjf: data section baking -static U32 cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag); +static U32 cons_dsection(Arena *arena, CONS_DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag); //- rjf: paths baking -static String8 cons__normal_string_from_path_node(Arena *arena, CONS__PathNode *node); -static void cons__normal_string_from_path_node_build(Arena *arena, CONS__PathNode *node, String8List *out); -static CONS__PathNode* cons__paths_new_node(CONS__BakeCtx *bctx); -static CONS__PathNode* cons__paths_sub_path(CONS__BakeCtx *bctx, CONS__PathNode *dir, String8 sub_dir); -static CONS__PathNode* cons__paths_node_from_path(CONS__BakeCtx *bctx, String8 path); -static U32 cons__paths_idx_from_path(CONS__BakeCtx *bctx, String8 path); -static CONS__SrcNode* cons__paths_new_src_node(CONS__BakeCtx *bctx); -static CONS__SrcNode* cons__paths_src_node_from_path_node(CONS__BakeCtx *bctx, CONS__PathNode *path_node); +static String8 cons_normal_string_from_path_node(Arena *arena, CONS_PathNode *node); +static void cons_normal_string_from_path_node_build(Arena *arena, CONS_PathNode *node, String8List *out); +static CONS_PathNode* cons_paths_new_node(CONS_BakeCtx *bctx); +static CONS_PathNode* cons_paths_sub_path(CONS_BakeCtx *bctx, CONS_PathNode *dir, String8 sub_dir); +static CONS_PathNode* cons_paths_node_from_path(CONS_BakeCtx *bctx, String8 path); +static U32 cons_paths_idx_from_path(CONS_BakeCtx *bctx, String8 path); +static CONS_SrcNode* cons_paths_new_src_node(CONS_BakeCtx *bctx); +static CONS_SrcNode* cons_paths_src_node_from_path_node(CONS_BakeCtx *bctx, CONS_PathNode *path_node); //- rjf: per-unit line info baking -static CONS__UnitLinesCombined* cons__unit_combine_lines(Arena *arena, CONS__BakeCtx *bctx, CONS_LineSequenceNode *first_seq); +static CONS_UnitLinesCombined* cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode *first_seq); //- rjf: per-src line info baking -static CONS__SrcLinesCombined* cons__source_combine_lines(Arena *arena, CONS__LineMapFragment *first); +static CONS_SrcLinesCombined* cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first); //- rjf: vmap baking -static CONS__VMap* cons__vmap_from_markers(Arena *arena, CONS__VMapMarker *markers, CONS__SortKey *keys, U64 marker_count); -static CONS__VMap* cons__vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count); +static CONS_VMap* cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *keys, U64 marker_count); +static CONS_VMap* cons_vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count); //- rjf: type info baking -static U32* cons__idx_run_from_types(Arena *arena, CONS_Type **types, U32 count); -static CONS__TypeData* cons__type_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx); +static U32* cons_idx_run_from_types(Arena *arena, CONS_Type **types, U32 count); +static CONS_TypeData* cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx); //- rjf: symbol data baking -static CONS__SymbolData* cons__symbol_data_combine(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx); +static CONS_SymbolData* cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx); //- rjf: name map baking -static CONS__NameMapBaked* cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__NameMap *map); +static CONS_NameMapBaked* cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameMap *map); //- rjf: top-level baking entry point static void cons_bake_file(Arena *arena, CONS_Root *root, String8List *out); From ad4003e70dfc2fb2209aafa1e348ad28cbc2e673 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 15:17:23 -0800 Subject: [PATCH 034/275] cons -> raddbgic --- README.md | 2 +- src/raddbg/raddbg.c | 2 +- src/raddbgi_cons/raddbgi_cons.c | 1288 ++++++++--------- src/raddbgi_cons/raddbgi_cons.h | 782 +++++----- src/raddbgi_convert/pdb/raddbgi_from_pdb.c | 416 +++--- src/raddbgi_convert/pdb/raddbgi_from_pdb.h | 54 +- .../pdb/raddbgi_from_pdb_main.c | 2 +- 7 files changed, 1273 insertions(+), 1273 deletions(-) diff --git a/README.md b/README.md index 2725e66c..a7f465a3 100644 --- a/README.md +++ b/README.md @@ -292,7 +292,7 @@ A list of the layers in the codebase and their associated namespaces is below: - `raddbg_markup` (`RADDBG_`): Standalone header file for marking up user programs to work with various features in the `raddbg` debugger. Does not depend on `base`. -- `raddbgi_cons` (`CONS_`): Implements an API for constructing files of the +- `raddbgi_cons` (`RADDBGIC_`): Implements an API for constructing files of the RADDBGI debug info file format. - `raddbgi_dump` (`DUMP_`): A dumper utility program for dumping textualizations of RADDBGI debug info files. diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 88f48b56..6ced157b 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -634,7 +634,7 @@ entry_point(int argc, char **argv) if(out != 0 && params->output_name.size > 0) { String8List baked = {0}; - cons_bake_file(scratch.arena, out->root, &baked); + raddbgic_bake_file(scratch.arena, out->root, &baked); U64 off = 0; for(String8Node *node = baked.first; node != 0; node = node->next) { diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/raddbgi_cons/raddbgi_cons.c index 17612767..219cea0e 100644 --- a/src/raddbgi_cons/raddbgi_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -4,8 +4,8 @@ //////////////////////////////// //~ rjf: API Implementation Helper Macros -#define cons_require(root, b32, else_code, error_msg) do { if(!(b32)) {cons_error((root), (error_msg)); else_code;} }while(0) -#define cons_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {cons_errorf((root), (fmt), __VA_ARGS__); else_code;} }while(0) +#define raddbgic_require(root, b32, else_code, error_msg) do { if(!(b32)) {raddbgic_error((root), (error_msg)); else_code;} }while(0) +#define raddbgic_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {raddbgic_errorf((root), (fmt), __VA_ARGS__); else_code;} }while(0) //////////////////////////////// //~ rjf: Basic Type Helpers @@ -13,9 +13,9 @@ //- rjf: type lists static void -cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type) +raddbgic_type_list_push(Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type) { - CONS_TypeNode *node = push_array(arena, CONS_TypeNode, 1); + RADDBGIC_TypeNode *node = push_array(arena, RADDBGIC_TypeNode, 1); SLLQueuePush(list->first, list->last, node); list->count += 1; node->type = type; @@ -24,12 +24,12 @@ cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type) //- rjf: bytecode lists static void -cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBGI_EvalOp op, U64 p) +raddbgic_bytecode_push_op(Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_EvalOp op, U64 p) { U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); - CONS_EvalBytecodeOp *node = push_array(arena, CONS_EvalBytecodeOp, 1); + RADDBGIC_EvalBytecodeOp *node = push_array(arena, RADDBGIC_EvalBytecodeOp, 1); node->op = op; node->p_size = p_size; node->p = p; @@ -40,52 +40,52 @@ cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBGI_EvalOp } static void -cons_bytecode_push_uconst(Arena *arena, CONS_EvalBytecode *bytecode, U64 x) +raddbgic_bytecode_push_uconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, U64 x) { if(x <= 0xFF) { - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, x); } else if(x <= 0xFFFF) { - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, x); } else if(x <= 0xFFFFFFFF) { - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, x); } else { - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, x); } } static void -cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, S64 x) +raddbgic_bytecode_push_sconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, S64 x) { if(-0x80 <= x && x <= 0x7F) { - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 8); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, (U64)x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 8); } else if(-0x8000 <= x && x <= 0x7FFF) { - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 16); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, (U64)x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 16); } else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) { - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, (U64)x); - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 32); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, (U64)x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 32); } else { - cons_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, (U64)x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, (U64)x); } } static void -cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *right_destroyed) +raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_EvalBytecode *right_destroyed) { if(right_destroyed->first_op != 0) { @@ -105,8 +105,8 @@ cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *ri //- rjf: sortable range sorting -static CONS_SortKey* -cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) +static RADDBGIC_SortKey* +raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count) { // This sort is designed to take advantage of lots of pre-existing sorted ranges. // Most line info is already sorted or close to already sorted. @@ -114,9 +114,9 @@ cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) // Also - this sort should be a "stable" sort. In the use case of sorting vmap // ranges, we want to be able to rely on order, so it needs to be preserved here. - ProfBegin("cons_sort_key_array"); + ProfBegin("raddbgic_sort_key_array"); Temp scratch = scratch_begin(&arena, 1); - CONS_SortKey *result = 0; + RADDBGIC_SortKey *result = 0; if(count <= 1) { @@ -124,8 +124,8 @@ cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) } else { - CONS_OrderedRange *ranges_first = 0; - CONS_OrderedRange *ranges_last = 0; + RADDBGIC_OrderedRange *ranges_first = 0; + RADDBGIC_OrderedRange *ranges_last = 0; U64 range_count = 0; { U64 pos = 0; @@ -137,7 +137,7 @@ cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); // generate an ordered range node - CONS_OrderedRange *new_range = push_array(scratch.arena, CONS_OrderedRange, 1); + RADDBGIC_OrderedRange *new_range = push_array(scratch.arena, RADDBGIC_OrderedRange, 1); SLLQueuePush(ranges_first, ranges_last, new_range); range_count += 1; new_range->first = first; @@ -154,12 +154,12 @@ cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) } else { - CONS_SortKey *keys_swap = push_array_no_zero(arena, CONS_SortKey, count); - CONS_SortKey *src = keys; - CONS_SortKey *dst = keys_swap; - CONS_OrderedRange *src_ranges = ranges_first; - CONS_OrderedRange *dst_ranges = 0; - CONS_OrderedRange *dst_ranges_last = 0; + RADDBGIC_SortKey *keys_swap = push_array_no_zero(arena, RADDBGIC_SortKey, count); + RADDBGIC_SortKey *src = keys; + RADDBGIC_SortKey *dst = keys_swap; + RADDBGIC_OrderedRange *src_ranges = ranges_first; + RADDBGIC_OrderedRange *dst_ranges = 0; + RADDBGIC_OrderedRange *dst_ranges_last = 0; for(;;) { @@ -173,7 +173,7 @@ cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) } // get first range - CONS_OrderedRange *range1 = src_ranges; + RADDBGIC_OrderedRange *range1 = src_ranges; SLLStackPop(src_ranges); // if this range is the whole array, we are done @@ -193,7 +193,7 @@ cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) } // get second range - CONS_OrderedRange *range2 = src_ranges; + RADDBGIC_OrderedRange *range2 = src_ranges; SLLStackPop(src_ranges); Assert(range1->opl == range2->first); @@ -242,7 +242,7 @@ cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) } // end pass by swapping buffers and range nodes - Swap(CONS_SortKey*, src, dst); + Swap(RADDBGIC_SortKey*, src, dst); src_ranges = dst_ranges; dst_ranges = 0; dst_ranges_last = 0; @@ -270,18 +270,18 @@ cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count) //- rjf: u64 -> ptr map static void -cons_u64toptr_init(Arena *arena, CONS_U64ToPtrMap *map, U64 bucket_count) +raddbgic_u64toptr_init(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 bucket_count) { Assert(IsPow2OrZero(bucket_count) && bucket_count > 0); - map->buckets = push_array(arena, CONS_U64ToPtrNode*, bucket_count); + map->buckets = push_array(arena, RADDBGIC_U64ToPtrNode*, bucket_count); map->buckets_count = bucket_count; } static void -cons_u64toptr_lookup(CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLookup *lookup_out) +raddbgic_u64toptr_lookup(RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_U64ToPtrLookup *lookup_out) { U64 bucket_idx = hash&(map->buckets_count - 1); - CONS_U64ToPtrNode *check_node = map->buckets[bucket_idx]; + RADDBGIC_U64ToPtrNode *check_node = map->buckets[bucket_idx]; for(;check_node != 0; check_node = check_node->next){ for(U32 k = 0; k < ArrayCount(check_node->key); k += 1){ if(check_node->ptr[k] == 0){ @@ -298,11 +298,11 @@ cons_u64toptr_lookup(CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLook } static void -cons_u64toptr_insert(Arena *arena, CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLookup *lookup, void *ptr) +raddbgic_u64toptr_insert(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_U64ToPtrLookup *lookup, void *ptr) { if(lookup->fill_node != 0) { - CONS_U64ToPtrNode *node = lookup->fill_node; + RADDBGIC_U64ToPtrNode *node = lookup->fill_node; U32 k = lookup->fill_k; node->key[k] = key; node->ptr[k] = ptr; @@ -311,7 +311,7 @@ cons_u64toptr_insert(Arena *arena, CONS_U64ToPtrMap *map, U64 key, U64 hash, CON { U64 bucket_idx = hash&(map->buckets_count - 1); - CONS_U64ToPtrNode *node = push_array(arena, CONS_U64ToPtrNode, 1); + RADDBGIC_U64ToPtrNode *node = push_array(arena, RADDBGIC_U64ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); node->key[0] = key; node->ptr[0] = ptr; @@ -327,18 +327,18 @@ cons_u64toptr_insert(Arena *arena, CONS_U64ToPtrMap *map, U64 key, U64 hash, CON //- rjf: string8 -> ptr map static void -cons_str8toptr_init(Arena *arena, CONS_Str8ToPtrMap *map, U64 bucket_count) +raddbgic_str8toptr_init(Arena *arena, RADDBGIC_Str8ToPtrMap *map, U64 bucket_count) { map->buckets_count = bucket_count; - map->buckets = push_array(arena, CONS_Str8ToPtrNode*, map->buckets_count); + map->buckets = push_array(arena, RADDBGIC_Str8ToPtrNode*, map->buckets_count); } static void* -cons_str8toptr_lookup(CONS_Str8ToPtrMap *map, String8 key, U64 hash) +raddbgic_str8toptr_lookup(RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash) { void *result = 0; U64 bucket_idx = hash%map->buckets_count; - for(CONS_Str8ToPtrNode *node = map->buckets[bucket_idx]; + for(RADDBGIC_Str8ToPtrNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) { @@ -352,11 +352,11 @@ cons_str8toptr_lookup(CONS_Str8ToPtrMap *map, String8 key, U64 hash) } static void -cons_str8toptr_insert(Arena *arena, CONS_Str8ToPtrMap *map, String8 key, U64 hash, void *ptr) +raddbgic_str8toptr_insert(Arena *arena, RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash, void *ptr) { U64 bucket_idx = hash%map->buckets_count; - CONS_Str8ToPtrNode *node = push_array(arena, CONS_Str8ToPtrNode, 1); + RADDBGIC_Str8ToPtrNode *node = push_array(arena, RADDBGIC_Str8ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); node->key = push_str8_copy(arena, key); @@ -371,11 +371,11 @@ cons_str8toptr_insert(Arena *arena, CONS_Str8ToPtrMap *map, String8 key, U64 has //- rjf: root creation -static CONS_Root* -cons_root_new(CONS_RootParams *params) +static RADDBGIC_Root* +raddbgic_root_new(RADDBGIC_RootParams *params) { Arena *arena = arena_alloc__sized(GB(64), MB(64)); - CONS_Root *result = push_array(arena, CONS_Root, 1); + RADDBGIC_Root *result = push_array(arena, RADDBGIC_Root, 1); result->arena = arena; // fill in root parameters @@ -385,8 +385,8 @@ cons_root_new(CONS_RootParams *params) // setup singular types { - result->nil_type = cons_type_new(result); - result->variadic_type = cons_type_new(result); + result->nil_type = raddbgic_type_new(result); + result->variadic_type = raddbgic_type_new(result); result->variadic_type->kind = RADDBGI_TypeKind_Variadic; // references to "handled nil type" should be emitted as @@ -397,26 +397,26 @@ cons_root_new(CONS_RootParams *params) // setup a null scope { - CONS_Scope *scope = push_array(result->arena, CONS_Scope, 1); + RADDBGIC_Scope *scope = push_array(result->arena, RADDBGIC_Scope, 1); SLLQueuePush_N(result->first_scope, result->last_scope, scope, next_order); result->scope_count += 1; } // rjf: setup null UDT { - cons_type_udt_from_any_type(result, result->nil_type); + raddbgic_type_udt_from_any_type(result, result->nil_type); } // initialize maps { #define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128)) - cons_u64toptr_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); - cons_u64toptr_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); - cons_u64toptr_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); - cons_u64toptr_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); - cons_u64toptr_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); - cons_str8toptr_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); + raddbgic_u64toptr_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); + raddbgic_u64toptr_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); + raddbgic_u64toptr_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); + raddbgic_u64toptr_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); + raddbgic_u64toptr_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); + raddbgic_str8toptr_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); #undef BKTCOUNT } @@ -425,7 +425,7 @@ cons_root_new(CONS_RootParams *params) } static void -cons_root_release(CONS_Root *root) +raddbgic_root_release(RADDBGIC_Root *root) { arena_release(root->arena); } @@ -433,26 +433,26 @@ cons_root_release(CONS_Root *root) //- rjf: error accumulation static void -cons_error(CONS_Root *root, String8 string) +raddbgic_error(RADDBGIC_Root *root, String8 string) { - CONS_Error *error = push_array(root->arena, CONS_Error, 1); + RADDBGIC_Error *error = push_array(root->arena, RADDBGIC_Error, 1); SLLQueuePush(root->errors.first, root->errors.last, error); root->errors.count += 1; error->msg = string; } static void -cons_errorf(CONS_Root *root, char *fmt, ...) +raddbgic_errorf(RADDBGIC_Root *root, char *fmt, ...) { va_list args; va_start(args, fmt); String8 str = push_str8fv(root->arena, fmt, args); - cons_error(root, str); + raddbgic_error(root, str); va_end(args); } -static CONS_Error* -cons_get_first_error(CONS_Root *root) +static RADDBGIC_Error* +raddbgic_get_first_error(RADDBGIC_Root *root) { return root->errors.first; } @@ -460,9 +460,9 @@ cons_get_first_error(CONS_Root *root) //- rjf: top-level info specification static void -cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli) +raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli) { - cons_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); + raddbgic_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); MemoryCopyStruct(&root->top_level_info, tli); root->top_level_info_is_set = 1; } @@ -470,9 +470,9 @@ cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli) //- rjf: binary section building static void -cons_add_binary_section(CONS_Root *root, String8 name, RADDBGI_BinarySectionFlags flags, U64 voff_first, U64 voff_opl, U64 foff_first, U64 foff_opl) +raddbgic_add_binary_section(RADDBGIC_Root *root, String8 name, RADDBGI_BinarySectionFlags flags, U64 voff_first, U64 voff_opl, U64 foff_first, U64 foff_opl) { - CONS_BinarySection *sec = push_array(root->arena, CONS_BinarySection, 1); + RADDBGIC_BinarySection *sec = push_array(root->arena, RADDBGIC_BinarySection, 1); SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); root->binary_section_count += 1; sec->name = name; @@ -485,31 +485,31 @@ cons_add_binary_section(CONS_Root *root, String8 name, RADDBGI_BinarySectionFlag //- rjf: unit info building -static CONS_Unit* -cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash) +static RADDBGIC_Unit* +raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, U64 unit_user_id, U64 unit_user_id_hash) { - CONS_U64ToPtrLookup lookup = {0}; - cons_u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); - CONS_Unit *result = 0; + RADDBGIC_U64ToPtrLookup lookup = {0}; + raddbgic_u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); + RADDBGIC_Unit *result = 0; if(lookup.match != 0) { - result = (CONS_Unit*)lookup.match; + result = (RADDBGIC_Unit*)lookup.match; } else { - result = push_array(root->arena, CONS_Unit, 1); + result = push_array(root->arena, RADDBGIC_Unit, 1); result->idx = root->unit_count; SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); root->unit_count += 1; - cons_u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); + raddbgic_u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); } return result; } static void -cons_unit_set_info(CONS_Root *root, CONS_Unit *unit, CONS_UnitInfo *info) +raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitInfo *info) { - cons_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); + raddbgic_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); unit->info_is_set = 1; unit->unit_name = push_str8_copy(root->arena, info->unit_name); unit->compiler_name = push_str8_copy(root->arena, info->compiler_name); @@ -521,9 +521,9 @@ cons_unit_set_info(CONS_Root *root, CONS_Unit *unit, CONS_UnitInfo *info) } static void -cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, CONS_LineSequence *line_sequence) +raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_LineSequence *line_sequence) { - CONS_LineSequenceNode *node = push_array(root->arena, CONS_LineSequenceNode, 1); + RADDBGIC_LineSequenceNode *node = push_array(root->arena, RADDBGIC_LineSequenceNode, 1); SLLQueuePush(unit->line_seq_first, unit->line_seq_last, node); unit->line_seq_count += 1; @@ -545,9 +545,9 @@ cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, CONS_LineSequence } static void -cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl) +raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, U64 first, U64 opl) { - CONS_UnitVMapRange *node = push_array(root->arena, CONS_UnitVMapRange, 1); + RADDBGIC_UnitVMapRange *node = push_array(root->arena, RADDBGIC_UnitVMapRange, 1); SLLQueuePush(root->unit_vmap_range_first, root->unit_vmap_range_last, node); root->unit_vmap_range_count += 1; node->unit = unit; @@ -557,32 +557,32 @@ cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl) //- rjf: type info lookups/reservations -static CONS_Type* -cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash) +static RADDBGIC_Type* +raddbgic_type_from_id(RADDBGIC_Root *root, U64 type_user_id, U64 type_user_id_hash) { - CONS_U64ToPtrLookup lookup = {0}; - cons_u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); - CONS_Type *result = (CONS_Type*)lookup.match; + RADDBGIC_U64ToPtrLookup lookup = {0}; + raddbgic_u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); + RADDBGIC_Type *result = (RADDBGIC_Type*)lookup.match; return result; } -static CONS_Reservation* -cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash) +static RADDBGIC_Reservation* +raddbgic_type_reserve_id(RADDBGIC_Root *root, U64 type_user_id, U64 type_user_id_hash) { - CONS_Reservation *result = 0; - CONS_U64ToPtrLookup lookup = {0}; - cons_u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); + RADDBGIC_Reservation *result = 0; + RADDBGIC_U64ToPtrLookup lookup = {0}; + raddbgic_u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); if(lookup.match == 0) { - cons_u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); + raddbgic_u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); void **slot = &lookup.fill_node->ptr[lookup.fill_k]; - result = (CONS_Reservation*)slot; + result = (RADDBGIC_Reservation*)slot; } return result; } static void -cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type) +raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_Type *type) { if(res != 0 && type != 0) { @@ -593,88 +593,88 @@ cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type) //- rjf: nil/singleton types static B32 -cons_type_is_unhandled_nil(CONS_Root *root, CONS_Type *type) +raddbgic_type_is_unhandled_nil(RADDBGIC_Root *root, RADDBGIC_Type *type) { B32 result = (type->kind == RADDBGI_TypeKind_NULL && type != &root->handled_nil_type); return result; } -static CONS_Type* -cons_type_handled_nil(CONS_Root *root) +static RADDBGIC_Type* +raddbgic_type_handled_nil(RADDBGIC_Root *root) { return &root->handled_nil_type; } -static CONS_Type* -cons_type_nil(CONS_Root *root) +static RADDBGIC_Type* +raddbgic_type_nil(RADDBGIC_Root *root) { return root->nil_type; } -static CONS_Type* -cons_type_variadic(CONS_Root *root) +static RADDBGIC_Type* +raddbgic_type_variadic(RADDBGIC_Root *root) { return root->variadic_type; } //- rjf: base type info constructors -static CONS_Type* -cons_type_new(CONS_Root *root) +static RADDBGIC_Type* +raddbgic_type_new(RADDBGIC_Root *root) { - CONS_Type *result = push_array(root->arena, CONS_Type, 1); + RADDBGIC_Type *result = push_array(root->arena, RADDBGIC_Type, 1); result->idx = root->type_count; SLLQueuePush_N(root->first_type, root->last_type, result, next_order); root->type_count += 1; return result; } -static CONS_TypeUDT* -cons_type_udt_from_any_type(CONS_Root *root, CONS_Type *type) +static RADDBGIC_TypeUDT* +raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type) { if(type->udt == 0) { - CONS_TypeUDT *new_udt = push_array(root->arena, CONS_TypeUDT, 1); + RADDBGIC_TypeUDT *new_udt = push_array(root->arena, RADDBGIC_TypeUDT, 1); new_udt->idx = root->type_udt_count; SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); root->type_udt_count += 1; new_udt->self_type = type; type->udt = new_udt; } - CONS_TypeUDT *result = type->udt; + RADDBGIC_TypeUDT *result = type->udt; return result; } -static CONS_TypeUDT* -cons_type_udt_from_record_type(CONS_Root *root, CONS_Type *type) +static RADDBGIC_TypeUDT* +raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type) { - cons_requiref(root, (type->kind == RADDBGI_TypeKind_Struct || - type->kind == RADDBGI_TypeKind_Class || - type->kind == RADDBGI_TypeKind_Union), - return 0, - "Tried to use non-user-defined-type-kind to create user-defined-type."); - CONS_TypeUDT *result = 0; - result = cons_type_udt_from_any_type(root, type); + raddbgic_requiref(root, (type->kind == RADDBGI_TypeKind_Struct || + type->kind == RADDBGI_TypeKind_Class || + type->kind == RADDBGI_TypeKind_Union), + return 0, + "Tried to use non-user-defined-type-kind to create user-defined-type."); + RADDBGIC_TypeUDT *result = 0; + result = raddbgic_type_udt_from_any_type(root, type); return result; } //- rjf: basic/operator type construction helpers -static CONS_Type* -cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) +static RADDBGIC_Type* +raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name) { - cons_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); - CONS_Type *result = root->nil_type; + raddbgic_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); + RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(type_kind) + name.size; + U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(type_kind) + name.size; U8 *buf = push_array(scratch.arena, U8, buf_size); { U8 *ptr = buf; // "basic" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Basic; - ptr += sizeof(CONS_TypeConstructKind); + *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Basic; + ptr += sizeof(RADDBGIC_TypeConstructKind); // type_kind MemoryCopy(ptr, &type_kind, sizeof(type_kind)); ptr += sizeof(type_kind); @@ -686,8 +686,8 @@ cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; + void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // calculate size @@ -698,18 +698,18 @@ cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) } // setup new node - result = cons_type_new(root); + result = raddbgic_type_new(root); result->kind = type_kind; result->name = push_str8_copy(root->arena, name); result->byte_size = byte_size; // save in construct map - cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); // save in name map { - CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons_name_map_add_pair(root, map, result->name, result->idx); + RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + raddbgic_name_map_add_pair(root, map, result->name, result->idx); } } @@ -718,20 +718,20 @@ cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) return result; } -static CONS_Type* -cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeModifierFlags flags) +static RADDBGIC_Type* +raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeModifierFlags flags) { - CONS_Type *result = root->nil_type; + RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); + U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); U8 *buf = push_array(scratch.arena, U8, buf_size); { U8 *ptr = buf; // "modifier" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Modifier; - ptr += sizeof(CONS_TypeConstructKind); + *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Modifier; + ptr += sizeof(RADDBGIC_TypeConstructKind); // flags MemoryCopy(ptr, &flags, sizeof(flags)); ptr += sizeof(flags); @@ -743,19 +743,19 @@ cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeModifier // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; + void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (RADDBGIC_Type*)lookup_ptr; if(result == 0){ // setup new node - result = cons_type_new(root); + result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Modifier; result->flags = flags; result->byte_size = direct_type->byte_size; result->direct_type = direct_type; // save in construct map - cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -763,20 +763,20 @@ cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeModifier return result; } -static CONS_Type* -cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit_count) +static RADDBGIC_Type* +raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U32 bit_off, U32 bit_count) { - CONS_Type *result = root->nil_type; + RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(U32)*2; + U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(U32)*2; U8 *buf = push_array(scratch.arena, U8, buf_size); { U8 *ptr = buf; // "bitfield" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Bitfield; - ptr += sizeof(CONS_TypeConstructKind); + *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Bitfield; + ptr += sizeof(RADDBGIC_TypeConstructKind); // direct_type->idx MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); ptr += sizeof(direct_type->idx); @@ -791,12 +791,12 @@ cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; + void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // setup new node - result = cons_type_new(root); + result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Bitfield; result->byte_size = direct_type->byte_size; result->off = bit_off; @@ -804,7 +804,7 @@ cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit result->direct_type = direct_type; // save in construct map - cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -812,25 +812,25 @@ cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit return result; } -static CONS_Type* -cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeKind ptr_type_kind) +static RADDBGIC_Type* +raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeKind ptr_type_kind) { - cons_requiref(root, (ptr_type_kind == RADDBGI_TypeKind_Ptr || - ptr_type_kind == RADDBGI_TypeKind_LRef || - ptr_type_kind == RADDBGI_TypeKind_RRef), - return root->nil_type, - "Non-pointer type kind used to construct pointer type."); - CONS_Type *result = root->nil_type; + raddbgic_requiref(root, (ptr_type_kind == RADDBGI_TypeKind_Ptr || + ptr_type_kind == RADDBGI_TypeKind_LRef || + ptr_type_kind == RADDBGI_TypeKind_RRef), + return root->nil_type, + "Non-pointer type kind used to construct pointer type."); + RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); + U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); U8 *buf = push_array(scratch.arena, U8, buf_size); { U8 *ptr = buf; // "pointer" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Pointer; - ptr += sizeof(CONS_TypeConstructKind); + *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Pointer; + ptr += sizeof(RADDBGIC_TypeConstructKind); // type_kind MemoryCopy(ptr, &ptr_type_kind, sizeof(ptr_type_kind)); ptr += sizeof(ptr_type_kind); @@ -842,18 +842,18 @@ cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeKind ptr_ // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; + void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // setup new node - result = cons_type_new(root); + result = raddbgic_type_new(root); result->kind = ptr_type_kind; result->byte_size = root->addr_size; result->direct_type = direct_type; // save in construct map - cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -861,21 +861,21 @@ cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeKind ptr_ return result; } -static CONS_Type* -cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count) +static RADDBGIC_Type* +raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U64 count) { - CONS_Type *result = root->nil_type; + RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer U64 buf_size = - sizeof(CONS_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); + sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); U8 *buf = push_array(scratch.arena, U8, buf_size); { U8 *ptr = buf; // "array" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Array; - ptr += sizeof(CONS_TypeConstructKind); + *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Array; + ptr += sizeof(RADDBGIC_TypeConstructKind); // direct_type->idx MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); ptr += sizeof(direct_type->idx); @@ -887,19 +887,19 @@ cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count) // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; + void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // setup new node - result = cons_type_new(root); + result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Array; result->count = count; result->direct_type = direct_type; result->byte_size = direct_type->byte_size*count; // save in construct map - cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -907,25 +907,25 @@ cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count) return result; } -static CONS_Type* -cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *params) +static RADDBGIC_Type* +raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params) { - CONS_Type *result = root->nil_type; + RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(CONS_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); + U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); U8 *buf = push_array(scratch.arena, U8, buf_size); { U8 *ptr = buf; // "procedure" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Procedure; - ptr += sizeof(CONS_TypeConstructKind); + *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Procedure; + ptr += sizeof(RADDBGIC_TypeConstructKind); // ret_type->idx MemoryCopy(ptr, &return_type->idx, sizeof(return_type->idx)); ptr += sizeof(return_type->idx); // (params ...)->idx - for(CONS_TypeNode *node = params->first; + for(RADDBGIC_TypeNode *node = params->first; node != 0; node = node->next) { @@ -937,15 +937,15 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; + void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // setup param buffer - CONS_Type **param_types = push_array(root->arena, CONS_Type*, params->count); + RADDBGIC_Type **param_types = push_array(root->arena, RADDBGIC_Type*, params->count); { - CONS_Type **ptr = param_types; - for(CONS_TypeNode *node = params->first; + RADDBGIC_Type **ptr = param_types; + for(RADDBGIC_TypeNode *node = params->first; node != 0; node = node->next) { @@ -955,7 +955,7 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa } // setup new node - result = cons_type_new(root); + result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Function; result->byte_size = root->addr_size; result->count = params->count; @@ -963,7 +963,7 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa result->param_types = param_types; // save in construct map - cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -971,21 +971,21 @@ cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *pa return result; } -static CONS_Type* -cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, struct CONS_TypeList *params) +static RADDBGIC_Type* +raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params) { - CONS_Type *result = root->nil_type; + RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer U64 buf_size = - sizeof(CONS_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); + sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); U8 *buf = push_array(scratch.arena, U8, buf_size); { U8 *ptr = buf; // "method" - *(CONS_TypeConstructKind*)ptr = CONS_TypeConstructKind_Method; - ptr += sizeof(CONS_TypeConstructKind); + *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Method; + ptr += sizeof(RADDBGIC_TypeConstructKind); // ret_type->idx MemoryCopy(ptr, &return_type->idx, sizeof(return_type->idx)); ptr += sizeof(return_type->idx); @@ -993,7 +993,7 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, MemoryCopy(ptr, &this_type->idx, sizeof(this_type->idx)); ptr += sizeof(this_type->idx); // (params ...)->idx - for(CONS_TypeNode *node = params->first; + for(RADDBGIC_TypeNode *node = params->first; node != 0; node = node->next) { @@ -1005,19 +1005,19 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, // check for duplicate construct String8 blob = str8(buf, buf_size); U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = cons_str8toptr_lookup(&root->construct_map, blob, blob_hash); - result = (CONS_Type*)lookup_ptr; + void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // setup param buffer - CONS_Type **param_types = push_array(root->arena, CONS_Type*, params->count + 1); + RADDBGIC_Type **param_types = push_array(root->arena, RADDBGIC_Type*, params->count + 1); { - CONS_Type **ptr = param_types; + RADDBGIC_Type **ptr = param_types; { *ptr = this_type; ptr += 1; } - for(CONS_TypeNode *node = params->first; + for(RADDBGIC_TypeNode *node = params->first; node != 0; node = node->next) { @@ -1027,7 +1027,7 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, } // setup new node - result = cons_type_new(root); + result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Method; result->byte_size = root->addr_size; result->count = params->count; @@ -1035,7 +1035,7 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, result->param_types = param_types; // save in construct map - cons_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -1045,35 +1045,35 @@ cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, //- rjf: udt type constructors -static CONS_Type* -cons_type_udt(CONS_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, U64 size) +static RADDBGIC_Type* +raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, U64 size) { - cons_requiref(root, (record_type_kind == RADDBGI_TypeKind_Struct || - record_type_kind == RADDBGI_TypeKind_Class || - record_type_kind == RADDBGI_TypeKind_Union), - return root->nil_type, - "Non-user-defined-type-kind used to create user-defined type."); + raddbgic_requiref(root, (record_type_kind == RADDBGI_TypeKind_Struct || + record_type_kind == RADDBGI_TypeKind_Class || + record_type_kind == RADDBGI_TypeKind_Union), + return root->nil_type, + "Non-user-defined-type-kind used to create user-defined type."); // rjf: make type - CONS_Type *result = cons_type_new(root); + RADDBGIC_Type *result = raddbgic_type_new(root); result->kind = record_type_kind; result->byte_size = size; result->name = push_str8_copy(root->arena, name); // rjf: save in name map { - CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons_name_map_add_pair(root, map, result->name, result->idx); + RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + raddbgic_name_map_add_pair(root, map, result->name, result->idx); } return result; } -static CONS_Type* -cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name) +static RADDBGIC_Type* +raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name) { // rjf: make type - CONS_Type *result = cons_type_new(root); + RADDBGIC_Type *result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Enum; result->byte_size = direct_type->byte_size; result->name = push_str8_copy(root->arena, name); @@ -1081,18 +1081,18 @@ cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name) // rjf: save in name map { - CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons_name_map_add_pair(root, map, result->name, result->idx); + RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + raddbgic_name_map_add_pair(root, map, result->name, result->idx); } return result; } -static CONS_Type* -cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name) +static RADDBGIC_Type* +raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name) { // rjf: make type - CONS_Type *result = cons_type_new(root); + RADDBGIC_Type *result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Alias; result->byte_size = direct_type->byte_size; result->name = push_str8_copy(root->arena, name); @@ -1100,32 +1100,32 @@ cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name) // rjf: save in name map { - CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons_name_map_add_pair(root, map, result->name, result->idx); + RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + raddbgic_name_map_add_pair(root, map, result->name, result->idx); } return result; } -static CONS_Type* -cons_type_incomplete(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) +static RADDBGIC_Type* +raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name) { - cons_requiref(root, (type_kind == RADDBGI_TypeKind_IncompleteStruct || - type_kind == RADDBGI_TypeKind_IncompleteClass || - type_kind == RADDBGI_TypeKind_IncompleteUnion || - type_kind == RADDBGI_TypeKind_IncompleteEnum), - return root->nil_type, - "Non-incomplete-type-kind used to create incomplete type."); + raddbgic_requiref(root, (type_kind == RADDBGI_TypeKind_IncompleteStruct || + type_kind == RADDBGI_TypeKind_IncompleteClass || + type_kind == RADDBGI_TypeKind_IncompleteUnion || + type_kind == RADDBGI_TypeKind_IncompleteEnum), + return root->nil_type, + "Non-incomplete-type-kind used to create incomplete type."); // rjf: make type - CONS_Type *result = cons_type_new(root); + RADDBGIC_Type *result = raddbgic_type_new(root); result->kind = type_kind; result->name = push_str8_copy(root->arena, name); // save in name map { - CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - cons_name_map_add_pair(root, map, result->name, result->idx); + RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + raddbgic_name_map_add_pair(root, map, result->name, result->idx); } return result; @@ -1134,12 +1134,12 @@ cons_type_incomplete(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name) //- rjf: type member building static void -cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type, U32 off) +raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type, U32 off) { - CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); + RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1151,12 +1151,12 @@ cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 } static void -cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) +raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) { - CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); + RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1167,12 +1167,12 @@ cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, String } static void -cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) +raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) { - CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); + RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1183,12 +1183,12 @@ cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, String8 nam } static void -cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) +raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) { - CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); + RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; @@ -1201,12 +1201,12 @@ cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, Stri } static void -cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type) +raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) { - CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); + RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1217,12 +1217,12 @@ cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, Str } static void -cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 off) +raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, U32 off) { - CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); + RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1233,12 +1233,12 @@ cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *ba } static void -cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 vptr_off, U32 vtable_off) +raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, U32 vptr_off, U32 vtable_off) { - CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); + RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1249,12 +1249,12 @@ cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, CONS_ } static void -cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, CONS_Type *nested_type) +raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *nested_type) { - CONS_TypeUDT *udt = cons_type_udt_from_record_type(root, record_type); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - CONS_TypeMember *member = push_array(root->arena, CONS_TypeMember, 1); + RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1264,13 +1264,13 @@ cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, CONS_T } static void -cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 val) +raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, String8 name, U64 val) { - cons_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); - CONS_TypeUDT *udt = cons_type_udt_from_any_type(root, enum_type); + raddbgic_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_any_type(root, enum_type); if(udt != 0) { - CONS_TypeEnumVal *enum_val = push_array(root->arena, CONS_TypeEnumVal, 1); + RADDBGIC_TypeEnumVal *enum_val = push_array(root->arena, RADDBGIC_TypeEnumVal, 1); SLLQueuePush(udt->first_enum_val, udt->last_enum_val, enum_val); udt->enum_val_count += 1; root->total_enum_val_count += 1; @@ -1281,11 +1281,11 @@ cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 //- rjf: type source coordinate specifications static void -cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, String8 source_path, U32 line, U32 col) +raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, String8 source_path, U32 line, U32 col) { - cons_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), - return, "Tried to add source coordinates to non-user-defined type."); - CONS_TypeUDT *udt = cons_type_udt_from_any_type(root, defined_type); + raddbgic_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), + return, "Tried to add source coordinates to non-user-defined type."); + RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_any_type(root, defined_type); if(udt != 0) { udt->source_path = push_str8_copy(root->arena, source_path); @@ -1296,39 +1296,39 @@ cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, Strin //- rjf: symbol info building -static CONS_Symbol* -cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash) +static RADDBGIC_Symbol* +raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash) { - CONS_U64ToPtrLookup lookup = {0}; - cons_u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); - CONS_Symbol *result = 0; + RADDBGIC_U64ToPtrLookup lookup = {0}; + raddbgic_u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); + RADDBGIC_Symbol *result = 0; if(lookup.match != 0) { - result = (CONS_Symbol*)lookup.match; + result = (RADDBGIC_Symbol*)lookup.match; } else { - result = push_array(root->arena, CONS_Symbol, 1); + result = push_array(root->arena, RADDBGIC_Symbol, 1); SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); root->symbol_count += 1; - cons_u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); + raddbgic_u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); } return result; } static void -cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info) +raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_SymbolInfo *info) { // rjf: unpack - CONS_SymbolKind kind = info->kind; - CONS_Symbol *container_symbol = info->container_symbol; - CONS_Type *container_type = info->container_type; + RADDBGIC_SymbolKind kind = info->kind; + RADDBGIC_Symbol *container_symbol = info->container_symbol; + RADDBGIC_Type *container_type = info->container_type; // rjf: requirements - cons_requiref(root, CONS_SymbolKind_NULL == symbol->kind, return, "Symbol information set multiple times."); - cons_requiref(root, CONS_SymbolKind_NULL < info->kind && info->kind < CONS_SymbolKind_COUNT, return, "Invalid symbol kind used to initialize symbol."); - cons_requiref(root, info->type != 0, return, "Invalid type used to initialize symbol."); - cons_requiref(root, info->container_symbol == 0 || info->container_type == 0, container_type = 0, "Symbol initialized with both a containing symbol and containing type, when only one is allowed."); + raddbgic_requiref(root, RADDBGIC_SymbolKind_NULL == symbol->kind, return, "Symbol information set multiple times."); + raddbgic_requiref(root, RADDBGIC_SymbolKind_NULL < info->kind && info->kind < RADDBGIC_SymbolKind_COUNT, return, "Invalid symbol kind used to initialize symbol."); + raddbgic_requiref(root, info->type != 0, return, "Invalid type used to initialize symbol."); + raddbgic_requiref(root, info->container_symbol == 0 || info->container_type == 0, container_type = 0, "Symbol initialized with both a containing symbol and containing type, when only one is allowed."); // rjf: fill root->symbol_kind_counts[kind] += 1; @@ -1346,89 +1346,89 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info switch(kind) { default:{}break; - case CONS_SymbolKind_GlobalVariable: - case CONS_SymbolKind_ThreadVariable: + case RADDBGIC_SymbolKind_GlobalVariable: + case RADDBGIC_SymbolKind_ThreadVariable: { - cons_requiref(root, info->root_scope == 0, NoOp, "Global or thread variable initialized with root scope."); + raddbgic_requiref(root, info->root_scope == 0, NoOp, "Global or thread variable initialized with root scope."); }break; - case CONS_SymbolKind_Procedure: + case RADDBGIC_SymbolKind_Procedure: { - cons_requiref(root, info->root_scope != 0, NoOp, "Procedure symbol initialized without root scope."); + raddbgic_requiref(root, info->root_scope != 0, NoOp, "Procedure symbol initialized without root scope."); symbol->root_scope = info->root_scope; - cons_scope_recursive_set_symbol(info->root_scope, symbol); + raddbgic_scope_recursive_set_symbol(info->root_scope, symbol); }break; } // save name map { - CONS_NameMap *map = 0; + RADDBGIC_NameMap *map = 0; switch(kind) { default:{}break; - case CONS_SymbolKind_GlobalVariable: + case RADDBGIC_SymbolKind_GlobalVariable: { - map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_GlobalVariables); + map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_GlobalVariables); }break; - case CONS_SymbolKind_ThreadVariable: + case RADDBGIC_SymbolKind_ThreadVariable: { - map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_ThreadVariables); + map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_ThreadVariables); }break; - case CONS_SymbolKind_Procedure: + case RADDBGIC_SymbolKind_Procedure: { - map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_Procedures); + map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Procedures); }break; } if(map != 0) { - cons_name_map_add_pair(root, map, symbol->name, symbol->idx); + raddbgic_name_map_add_pair(root, map, symbol->name, symbol->idx); } } // save link name map - if(kind == CONS_SymbolKind_Procedure && symbol->link_name.size > 0) + if(kind == RADDBGIC_SymbolKind_Procedure && symbol->link_name.size > 0) { - CONS_NameMap *map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_LinkNameProcedures); - cons_name_map_add_pair(root, map, symbol->link_name, symbol->idx); + RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_LinkNameProcedures); + raddbgic_name_map_add_pair(root, map, symbol->link_name, symbol->idx); } } //- rjf: scope info building -static CONS_Scope * -cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash) +static RADDBGIC_Scope * +raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, U64 scope_user_id, U64 scope_user_id_hash) { - CONS_Scope *result = 0; - CONS_U64ToPtrLookup lookup = {0}; - cons_u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); + RADDBGIC_Scope *result = 0; + RADDBGIC_U64ToPtrLookup lookup = {0}; + raddbgic_u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); if(lookup.match != 0) { - result = (CONS_Scope*)lookup.match; + result = (RADDBGIC_Scope*)lookup.match; } else { - result = push_array(root->arena, CONS_Scope, 1); + result = push_array(root->arena, RADDBGIC_Scope, 1); result->idx = root->scope_count; SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); root->scope_count += 1; - cons_u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); + raddbgic_u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); } return result; } static void -cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent) +raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_Scope *parent) { - cons_requiref(root, scope->parent_scope == 0, return, "Scope parent set multiple times."); - cons_requiref(root, parent != 0, return, "Tried to set invalid parent as scope parent."); + raddbgic_requiref(root, scope->parent_scope == 0, return, "Scope parent set multiple times."); + raddbgic_requiref(root, parent != 0, return, "Tried to set invalid parent as scope parent."); scope->symbol = parent->symbol; scope->parent_scope = parent; SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); } static void -cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl) +raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, U64 voff_first, U64 voff_opl) { - CONS_VOffRange *range = push_array(root->arena, CONS_VOffRange, 1); + RADDBGIC_VOffRange *range = push_array(root->arena, RADDBGIC_VOffRange, 1); SLLQueuePush(scope->first_range, scope->last_range, range); scope->range_count += 1; range->voff_first = voff_first; @@ -1438,45 +1438,45 @@ cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U6 } static void -cons_scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol) +raddbgic_scope_recursive_set_symbol(RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol) { scope->symbol = symbol; - for(CONS_Scope *node = scope->first_child; + for(RADDBGIC_Scope *node = scope->first_child; node != 0; node = node->next_sibling) { - cons_scope_recursive_set_symbol(node, symbol); + raddbgic_scope_recursive_set_symbol(node, symbol); } } //- rjf: local info building -static CONS_Local* -cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash) +static RADDBGIC_Local* +raddbgic_local_handle_from_user_id(RADDBGIC_Root *root, U64 local_user_id, U64 local_user_id_hash) { - CONS_Local *result = 0; - CONS_U64ToPtrLookup lookup = {0}; - cons_u64toptr_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); + RADDBGIC_Local *result = 0; + RADDBGIC_U64ToPtrLookup lookup = {0}; + raddbgic_u64toptr_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); if(lookup.match != 0) { - result = (CONS_Local*)lookup.match; + result = (RADDBGIC_Local*)lookup.match; } else { - result = push_array(root->arena, CONS_Local, 1); - cons_u64toptr_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); + result = push_array(root->arena, RADDBGIC_Local, 1); + raddbgic_u64toptr_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); } return result; } static void -cons_local_set_basic_info(CONS_Root *root, CONS_Local *local, CONS_LocalInfo *info) +raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBGIC_LocalInfo *info) { - cons_requiref(root, local->kind == RADDBGI_LocalKind_NULL, return, "Local information set multiple times."); - cons_requiref(root, info->scope != 0, return, "Tried to set invalid scope as local's containing scope."); - cons_requiref(root, RADDBGI_LocalKind_NULL < info->kind && info->kind < RADDBGI_LocalKind_COUNT, return, "Invalid local kind."); - cons_requiref(root, info->type != 0, return, "Tried to set invalid type as local's type."); - CONS_Scope *scope = info->scope; + raddbgic_requiref(root, local->kind == RADDBGI_LocalKind_NULL, return, "Local information set multiple times."); + raddbgic_requiref(root, info->scope != 0, return, "Tried to set invalid scope as local's containing scope."); + raddbgic_requiref(root, RADDBGI_LocalKind_NULL < info->kind && info->kind < RADDBGI_LocalKind_COUNT, return, "Invalid local kind."); + raddbgic_requiref(root, info->type != 0, return, "Tried to set invalid type as local's type."); + RADDBGIC_Scope *scope = info->scope; SLLQueuePush(scope->first_local, scope->last_local, local); scope->local_count += 1; root->local_count += 1; @@ -1485,13 +1485,13 @@ cons_local_set_basic_info(CONS_Root *root, CONS_Local *local, CONS_LocalInfo *in local->type = info->type; } -static CONS_LocationSet* -cons_location_set_from_local(CONS_Root *root, CONS_Local *local) +static RADDBGIC_LocationSet* +raddbgic_location_set_from_local(RADDBGIC_Root *root, RADDBGIC_Local *local) { - CONS_LocationSet *result = local->locset; + RADDBGIC_LocationSet *result = local->locset; if(result == 0) { - local->locset = push_array(root->arena, CONS_LocationSet, 1); + local->locset = push_array(root->arena, RADDBGIC_LocationSet, 1); result = local->locset; } return result; @@ -1500,9 +1500,9 @@ cons_location_set_from_local(CONS_Root *root, CONS_Local *local) //- rjf: location info building static void -cons_location_set_add_case(CONS_Root *root, CONS_LocationSet *locset, U64 voff_first, U64 voff_opl, CONS_Location *location) +raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset, U64 voff_first, U64 voff_opl, RADDBGIC_Location *location) { - CONS_LocationCase *location_case = push_array(root->arena, CONS_LocationCase, 1); + RADDBGIC_LocationCase *location_case = push_array(root->arena, RADDBGIC_LocationCase, 1); SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); locset->location_case_count += 1; root->location_count += 1; @@ -1511,48 +1511,48 @@ cons_location_set_add_case(CONS_Root *root, CONS_LocationSet *locset, U64 voff_f location_case->location = location; } -static CONS_Location* -cons_location_addr_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode) +static RADDBGIC_Location* +raddbgic_location_addr_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode) { - CONS_Location *result = push_array(root->arena, CONS_Location, 1); + RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_AddrBytecodeStream; result->bytecode = *bytecode; return result; } -static CONS_Location* -cons_location_val_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode) +static RADDBGIC_Location* +raddbgic_location_val_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode) { - CONS_Location *result = push_array(root->arena, CONS_Location, 1); + RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_ValBytecodeStream; result->bytecode = *bytecode; return result; } -static CONS_Location* -cons_location_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset) +static RADDBGIC_Location* +raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, U8 reg_code, U16 offset) { - CONS_Location *result = push_array(root->arena, CONS_Location, 1); + RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_AddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; return result; } -static CONS_Location* -cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset) +static RADDBGIC_Location* +raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, U8 reg_code, U16 offset) { - CONS_Location *result = push_array(root->arena, CONS_Location, 1); + RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_AddrAddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; return result; } -static CONS_Location* -cons_location_val_reg(CONS_Root *root, U8 reg_code) +static RADDBGIC_Location* +raddbgic_location_val_reg(RADDBGIC_Root *root, U8 reg_code) { - CONS_Location *result = push_array(root->arena, CONS_Location, 1); + RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_ValRegister; result->register_code = reg_code; return result; @@ -1560,17 +1560,17 @@ cons_location_val_reg(CONS_Root *root, U8 reg_code) //- rjf: name map building -static CONS_NameMap* -cons_name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind) +static RADDBGIC_NameMap* +raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind) { - CONS_NameMap *result = 0; + RADDBGIC_NameMap *result = 0; if(kind < RADDBGI_NameMapKind_COUNT) { if(root->name_maps[kind] == 0) { - root->name_maps[kind] = push_array(root->arena, CONS_NameMap, 1); + root->name_maps[kind] = push_array(root->arena, RADDBGIC_NameMap, 1); root->name_maps[kind]->buckets_count = 16384; - root->name_maps[kind]->buckets = push_array(root->arena, CONS_NameMapNode *, root->name_maps[kind]->buckets_count); + root->name_maps[kind]->buckets = push_array(root->arena, RADDBGIC_NameMapNode *, root->name_maps[kind]->buckets_count); } result = root->name_maps[kind]; } @@ -1578,15 +1578,15 @@ cons_name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind) } static void -cons_name_map_add_pair(CONS_Root *root, CONS_NameMap *map, String8 string, U32 idx) +raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 string, U32 idx) { // hash U64 hash = raddbgi_hash(string.str, string.size); U64 bucket_idx = hash%map->buckets_count; // find existing name node - CONS_NameMapNode *match = 0; - for(CONS_NameMapNode *node = map->buckets[bucket_idx]; + RADDBGIC_NameMapNode *match = 0; + for(RADDBGIC_NameMapNode *node = map->buckets[bucket_idx]; node != 0; node = node->bucket_next) { @@ -1600,7 +1600,7 @@ cons_name_map_add_pair(CONS_Root *root, CONS_NameMap *map, String8 string, U32 i // make name node if necessary if(match == 0) { - match = push_array(root->arena, CONS_NameMapNode, 1); + match = push_array(root->arena, RADDBGIC_NameMapNode, 1); match->string = push_str8_copy(root->arena, string); SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); SLLQueuePush_N(map->first, map->last, match, order_next); @@ -1610,7 +1610,7 @@ cons_name_map_add_pair(CONS_Root *root, CONS_NameMap *map, String8 string, U32 i // find existing idx B32 existing_idx = 0; - for(CONS_NameMapIdxNode *node = match->idx_first; + for(RADDBGIC_NameMapIdxNode *node = match->idx_first; node != 0; node = node->next) { @@ -1631,11 +1631,11 @@ cons_name_map_add_pair(CONS_Root *root, CONS_NameMap *map, String8 string, U32 i // insert new idx if necessary if(!existing_idx) { - CONS_NameMapIdxNode *idx_node = match->idx_last; + RADDBGIC_NameMapIdxNode *idx_node = match->idx_last; U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); if(insert_i == 0) { - idx_node = push_array(root->arena, CONS_NameMapIdxNode, 1); + idx_node = push_array(root->arena, RADDBGIC_NameMapIdxNode, 1); SLLQueuePush(match->idx_first, match->idx_last, idx_node); } @@ -1649,27 +1649,27 @@ cons_name_map_add_pair(CONS_Root *root, CONS_NameMap *map, String8 string, U32 i //- rjf: bake context construction -static CONS_BakeCtx* -cons_bake_ctx_begin(CONS_BakeParams *params) +static RADDBGIC_BakeCtx* +raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params) { Arena *arena = arena_alloc(); - CONS_BakeCtx *result = push_array(arena, CONS_BakeCtx, 1); + RADDBGIC_BakeCtx *result = push_array(arena, RADDBGIC_BakeCtx, 1); result->arena = arena; #define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) result->strs.buckets_count = BKTCOUNT(params->strings_bucket_count); result->idxs.buckets_count = BKTCOUNT(params->idx_runs_bucket_count); #undef BKTCOUNT - result->strs.buckets = push_array(arena, CONS_StringNode *, result->strs.buckets_count); - result->idxs.buckets = push_array(arena, CONS_IdxRunNode *, result->idxs.buckets_count); + result->strs.buckets = push_array(arena, RADDBGIC_StringNode *, result->strs.buckets_count); + result->idxs.buckets = push_array(arena, RADDBGIC_IdxRunNode *, result->idxs.buckets_count); - cons_string(result, str8_lit("")); - cons_idx_run(result, 0, 0); + raddbgic_string(result, str8_lit("")); + raddbgic_idx_run(result, 0, 0); - result->tree = push_array(arena, CONS_PathTree, 1); + result->tree = push_array(arena, RADDBGIC_PathTree, 1); { - CONS_PathNode *nil_path_node = cons_paths_new_node(result); + RADDBGIC_PathNode *nil_path_node = raddbgic_paths_new_node(result); nil_path_node->name = str8_lit(""); - CONS_SrcNode *nil_src_node = cons_paths_new_src_node(result); + RADDBGIC_SrcNode *nil_src_node = raddbgic_paths_new_src_node(result); nil_src_node->path_node = nil_path_node; nil_src_node->normal_full_path = str8_lit(""); nil_path_node->src_file = nil_src_node; @@ -1679,7 +1679,7 @@ cons_bake_ctx_begin(CONS_BakeParams *params) } static void -cons_bake_ctx_release(CONS_BakeCtx *bake_ctx) +raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx) { arena_release(bake_ctx->arena); } @@ -1687,16 +1687,16 @@ cons_bake_ctx_release(CONS_BakeCtx *bake_ctx) //- rjf: string baking static U32 -cons_string(CONS_BakeCtx *bctx, String8 str) +raddbgic_string(RADDBGIC_BakeCtx *bctx, String8 str) { Arena *arena = bctx->arena; - CONS_Strings *strs = &bctx->strs; + RADDBGIC_Strings *strs = &bctx->strs; U64 hash = raddbgi_hash(str.str, str.size); U64 bucket_idx = hash%strs->buckets_count; // look for a match - CONS_StringNode *match = 0; - for(CONS_StringNode *node = strs->buckets[bucket_idx]; + RADDBGIC_StringNode *match = 0; + for(RADDBGIC_StringNode *node = strs->buckets[bucket_idx]; node != 0; node = node->bucket_next) { @@ -1710,7 +1710,7 @@ cons_string(CONS_BakeCtx *bctx, String8 str) // insert new node if no match if(match == 0) { - CONS_StringNode *node = push_array_no_zero(arena, CONS_StringNode, 1); + RADDBGIC_StringNode *node = push_array_no_zero(arena, RADDBGIC_StringNode, 1); node->str = push_str8_copy(arena, str); node->hash = hash; node->idx = strs->count; @@ -1730,7 +1730,7 @@ cons_string(CONS_BakeCtx *bctx, String8 str) //- rjf: idx run baking static U64 -cons_idx_run_hash(U32 *idx_run, U32 count) +raddbgic_idx_run_hash(U32 *idx_run, U32 count) { U64 hash = 5381; U32 *ptr = idx_run; @@ -1743,17 +1743,17 @@ cons_idx_run_hash(U32 *idx_run, U32 count) } static U32 -cons_idx_run(CONS_BakeCtx *bctx, U32 *idx_run, U32 count) +raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, U32 *idx_run, U32 count) { Arena *arena = bctx->arena; - CONS_IdxRuns *idxs = &bctx->idxs; + RADDBGIC_IdxRuns *idxs = &bctx->idxs; - U64 hash = cons_idx_run_hash(idx_run, count); + U64 hash = raddbgic_idx_run_hash(idx_run, count); U64 bucket_idx = hash%idxs->buckets_count; // look for a match - CONS_IdxRunNode *match = 0; - for(CONS_IdxRunNode *node = idxs->buckets[bucket_idx]; + RADDBGIC_IdxRunNode *match = 0; + for(RADDBGIC_IdxRunNode *node = idxs->buckets[bucket_idx]; node != 0; node = node->bucket_next) { @@ -1780,7 +1780,7 @@ cons_idx_run(CONS_BakeCtx *bctx, U32 *idx_run, U32 count) // insert new node if no match if(match == 0) { - CONS_IdxRunNode *node = push_array_no_zero(arena, CONS_IdxRunNode, 1); + RADDBGIC_IdxRunNode *node = push_array_no_zero(arena, RADDBGIC_IdxRunNode, 1); U32 *idx_run_copy = push_array_no_zero(arena, U32, count); for(U32 i = 0; i < count; i += 1) { @@ -1807,10 +1807,10 @@ cons_idx_run(CONS_BakeCtx *bctx, U32 *idx_run, U32 count) //- rjf: data section baking static U32 -cons_dsection(Arena *arena, CONS_DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag) +raddbgic_dsection(Arena *arena, RADDBGIC_DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag) { U32 result = dss->count; - CONS_DSectionNode *node = push_array(arena, CONS_DSectionNode, 1); + RADDBGIC_DSectionNode *node = push_array(arena, RADDBGIC_DSectionNode, 1); SLLQueuePush(dss->first, dss->last, node); node->data = data; node->size = size; @@ -1822,13 +1822,13 @@ cons_dsection(Arena *arena, CONS_DSections *dss, void *data, U64 size, RADDBGI_D //- rjf: paths baking static String8 -cons_normal_string_from_path_node(Arena *arena, CONS_PathNode *node) +raddbgic_normal_string_from_path_node(Arena *arena, RADDBGIC_PathNode *node) { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; if(node != 0) { - cons_normal_string_from_path_node_build(scratch.arena, node, &list); + raddbgic_normal_string_from_path_node_build(scratch.arena, node, &list); } StringJoin join = {0}; join.sep = str8_lit("/"); @@ -1848,12 +1848,12 @@ cons_normal_string_from_path_node(Arena *arena, CONS_PathNode *node) } static void -cons_normal_string_from_path_node_build(Arena *arena, CONS_PathNode *node, String8List *out) +raddbgic_normal_string_from_path_node_build(Arena *arena, RADDBGIC_PathNode *node, String8List *out) { // TODO(rjf): why is this recursive... if(node->parent != 0) { - cons_normal_string_from_path_node_build(arena, node->parent, out); + raddbgic_normal_string_from_path_node_build(arena, node->parent, out); } if(node->name.size > 0) { @@ -1861,23 +1861,23 @@ cons_normal_string_from_path_node_build(Arena *arena, CONS_PathNode *node, Strin } } -static CONS_PathNode* -cons_paths_new_node(CONS_BakeCtx *bctx) +static RADDBGIC_PathNode* +raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx) { - CONS_PathTree *tree = bctx->tree; - CONS_PathNode *result = push_array(bctx->arena, CONS_PathNode, 1); + RADDBGIC_PathTree *tree = bctx->tree; + RADDBGIC_PathNode *result = push_array(bctx->arena, RADDBGIC_PathNode, 1); SLLQueuePush_N(tree->first, tree->last, result, next_order); result->idx = tree->count; tree->count += 1; return result; } -static CONS_PathNode* -cons_paths_sub_path(CONS_BakeCtx *bctx, CONS_PathNode *dir, String8 sub_dir) +static RADDBGIC_PathNode* +raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, String8 sub_dir) { // look for existing match - CONS_PathNode *match = 0; - for(CONS_PathNode *node = dir->first_child; + RADDBGIC_PathNode *match = 0; + for(RADDBGIC_PathNode *node = dir->first_child; node != 0; node = node->next_sibling){ if(str8_match(node->name, sub_dir, StringMatchFlag_CaseInsensitive)){ @@ -1887,16 +1887,16 @@ cons_paths_sub_path(CONS_BakeCtx *bctx, CONS_PathNode *dir, String8 sub_dir) } // construct new node if no match - CONS_PathNode *new_node = 0; + RADDBGIC_PathNode *new_node = 0; if(match == 0){ - new_node = cons_paths_new_node(bctx); + new_node = raddbgic_paths_new_node(bctx); new_node->parent = dir; SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); new_node->name = push_str8_copy(bctx->arena, sub_dir); } // select result from the two paths - CONS_PathNode *result = match; + RADDBGIC_PathNode *result = match; if(match == 0){ result = new_node; } @@ -1904,10 +1904,10 @@ cons_paths_sub_path(CONS_BakeCtx *bctx, CONS_PathNode *dir, String8 sub_dir) return result; } -static CONS_PathNode* -cons_paths_node_from_path(CONS_BakeCtx *bctx, String8 path) +static RADDBGIC_PathNode* +raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, String8 path) { - CONS_PathNode *node_cursor = &bctx->tree->root; + RADDBGIC_PathNode *node_cursor = &bctx->tree->root; U8 *ptr = path.str; U8 *opl = path.str + path.size; @@ -1924,42 +1924,42 @@ cons_paths_node_from_path(CONS_BakeCtx *bctx, String8 path) // if range is non-empty advance the node cursor if(range_first < ptr){ String8 sub_dir = str8_range(range_first, ptr); - node_cursor = cons_paths_sub_path(bctx, node_cursor, sub_dir); + node_cursor = raddbgic_paths_sub_path(bctx, node_cursor, sub_dir); } } - CONS_PathNode *result = node_cursor; + RADDBGIC_PathNode *result = node_cursor; return result; } static U32 -cons_paths_idx_from_path(CONS_BakeCtx *bctx, String8 path) +raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, String8 path) { - CONS_PathNode *node = cons_paths_node_from_path(bctx, path); + RADDBGIC_PathNode *node = raddbgic_paths_node_from_path(bctx, path); U32 result = node->idx; return result; } -static CONS_SrcNode* -cons_paths_new_src_node(CONS_BakeCtx *bctx) +static RADDBGIC_SrcNode* +raddbgic_paths_new_src_node(RADDBGIC_BakeCtx *bctx) { - CONS_PathTree *tree = bctx->tree; - CONS_SrcNode *result = push_array(bctx->arena, CONS_SrcNode, 1); + RADDBGIC_PathTree *tree = bctx->tree; + RADDBGIC_SrcNode *result = push_array(bctx->arena, RADDBGIC_SrcNode, 1); SLLQueuePush(tree->src_first, tree->src_last, result); result->idx = tree->src_count; tree->src_count += 1; return result; } -static CONS_SrcNode* -cons_paths_src_node_from_path_node(CONS_BakeCtx *bctx, CONS_PathNode *path_node) +static RADDBGIC_SrcNode* +raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *path_node) { - CONS_SrcNode *result = path_node->src_file; + RADDBGIC_SrcNode *result = path_node->src_file; if(result == 0) { - CONS_SrcNode *new_node = cons_paths_new_src_node(bctx); + RADDBGIC_SrcNode *new_node = raddbgic_paths_new_src_node(bctx); new_node->path_node = path_node; - new_node->normal_full_path = cons_normal_string_from_path_node(bctx->arena, path_node); + new_node->normal_full_path = raddbgic_normal_string_from_path_node(bctx->arena, path_node); result = path_node->src_file = new_node; } return result; @@ -1967,10 +1967,10 @@ cons_paths_src_node_from_path_node(CONS_BakeCtx *bctx, CONS_PathNode *path_node) //- rjf: per-unit line info baking -static CONS_UnitLinesCombined* -cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode *first_seq) +static RADDBGIC_UnitLinesCombined* +raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq) { - ProfBegin("cons_unit_combine_lines"); + ProfBegin("raddbgic_unit_combine_lines"); Temp scratch = scratch_begin(&arena, 1); // gather up all line info into two arrays @@ -1978,7 +1978,7 @@ cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode // recs: contains all the source coordinates for a range of voffs U64 line_count = 0; U64 seq_count = 0; - for(CONS_LineSequenceNode *node = first_seq; + for(RADDBGIC_LineSequenceNode *node = first_seq; node != 0; node = node->next){ seq_count += 1; @@ -1986,19 +1986,19 @@ cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode } U64 key_count = line_count + seq_count; - CONS_SortKey *line_keys = push_array_no_zero(scratch.arena, CONS_SortKey, key_count); - CONS_LineRec *line_recs = push_array_no_zero(scratch.arena, CONS_LineRec, line_count); + RADDBGIC_SortKey *line_keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, key_count); + RADDBGIC_LineRec *line_recs = push_array_no_zero(scratch.arena, RADDBGIC_LineRec, line_count); { - CONS_SortKey *key_ptr = line_keys; - CONS_LineRec *rec_ptr = line_recs; + RADDBGIC_SortKey *key_ptr = line_keys; + RADDBGIC_LineRec *rec_ptr = line_recs; - for(CONS_LineSequenceNode *node = first_seq; + for(RADDBGIC_LineSequenceNode *node = first_seq; node != 0; node = node->next){ - CONS_PathNode *src_path = - cons_paths_node_from_path(bctx, node->line_seq.file_name); - CONS_SrcNode *src_file = cons_paths_src_node_from_path_node(bctx, src_path); + RADDBGIC_PathNode *src_path = + raddbgic_paths_node_from_path(bctx, node->line_seq.file_name); + RADDBGIC_SrcNode *src_file = raddbgic_paths_src_node_from_path_node(bctx, src_path); U32 file_id = src_file->idx; U64 node_line_count = node->line_seq.line_count; @@ -2020,14 +2020,14 @@ cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode key_ptr->val = 0; key_ptr += 1; - CONS_LineMapFragment *fragment = push_array(arena, CONS_LineMapFragment, 1); + RADDBGIC_LineMapFragment *fragment = push_array(arena, RADDBGIC_LineMapFragment, 1); SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); fragment->sequence = node; } } // sort - CONS_SortKey *sorted_line_keys = cons_sort_key_array(scratch.arena, line_keys, key_count); + RADDBGIC_SortKey *sorted_line_keys = raddbgic_sort_key_array(scratch.arena, line_keys, key_count); // TODO(allen): do a pass over sorted keys to make sure duplicate keys are sorted with // null record first, and no more than one null record and one non-null record @@ -2041,7 +2041,7 @@ cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode } arranged_voffs[key_count] = ~0ull; for(U64 i = 0; i < key_count; i += 1){ - CONS_LineRec *rec = (CONS_LineRec*)sorted_line_keys[i].val; + RADDBGIC_LineRec *rec = (RADDBGIC_LineRec*)sorted_line_keys[i].val; if(rec != 0){ arranged_lines[i].file_idx = rec->file_id; arranged_lines[i].line_num = rec->line_num; @@ -2052,7 +2052,7 @@ cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode } } - CONS_UnitLinesCombined *result = push_array(arena, CONS_UnitLinesCombined, 1); + RADDBGIC_UnitLinesCombined *result = push_array(arena, RADDBGIC_UnitLinesCombined, 1); result->voffs = arranged_voffs; result->lines = arranged_lines; result->cols = 0; @@ -2066,27 +2066,27 @@ cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode //- rjf: per-src line info baking -static CONS_SrcLinesCombined* -cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) +static RADDBGIC_SrcLinesCombined* +raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) { - ProfBegin("cons_source_combine_lines"); + ProfBegin("raddbgic_source_combine_lines"); Temp scratch = scratch_begin(&arena, 1); // gather line number map - CONS_SrcLineMapBucket *first_bucket = 0; - CONS_SrcLineMapBucket *last_bucket = 0; + RADDBGIC_SrcLineMapBucket *first_bucket = 0; + RADDBGIC_SrcLineMapBucket *last_bucket = 0; U64 line_hash_slots_count = 1024; - CONS_SrcLineMapBucket **line_hash_slots = push_array(scratch.arena, CONS_SrcLineMapBucket *, line_hash_slots_count); + RADDBGIC_SrcLineMapBucket **line_hash_slots = push_array(scratch.arena, RADDBGIC_SrcLineMapBucket *, line_hash_slots_count); U64 line_count = 0; U64 voff_count = 0; U64 max_line_num = 0; ProfScope("gather line number map") { - for(CONS_LineMapFragment *map_fragment = first; + for(RADDBGIC_LineMapFragment *map_fragment = first; map_fragment != 0; map_fragment = map_fragment->next) { - CONS_LineSequence *sequence = &map_fragment->sequence->line_seq; + RADDBGIC_LineSequence *sequence = &map_fragment->sequence->line_seq; U64 *seq_voffs = sequence->voffs; U32 *seq_line_nums = sequence->line_nums; @@ -2101,9 +2101,9 @@ cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) max_line_num = Max(max_line_num, line_num); // find match - CONS_SrcLineMapBucket *match = 0; + RADDBGIC_SrcLineMapBucket *match = 0; { - for(CONS_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + for(RADDBGIC_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; node != 0; node = node->hash_next){ if(node->line_num == line_num){ @@ -2115,7 +2115,7 @@ cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) // introduce new line if no match if(match == 0){ - match = push_array(scratch.arena, CONS_SrcLineMapBucket, 1); + match = push_array(scratch.arena, RADDBGIC_SrcLineMapBucket, 1); SLLQueuePush_N(first_bucket, last_bucket, match, order_next); SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); match->line_num = line_num; @@ -2124,7 +2124,7 @@ cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) // insert new voff { - CONS_SrcLineMapVoffBlock *block = push_array(scratch.arena, CONS_SrcLineMapVoffBlock, 1); + RADDBGIC_SrcLineMapVoffBlock *block = push_array(scratch.arena, RADDBGIC_SrcLineMapVoffBlock, 1); SLLQueuePush(match->first_voff_block, match->last_voff_block, block); match->voff_count += 1; block->voff = voff; @@ -2134,11 +2134,11 @@ cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) } // bake sortable keys array - CONS_SortKey *keys = push_array_no_zero(scratch.arena, CONS_SortKey, line_count); + RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, line_count); ProfScope("bake sortable keys array") { - CONS_SortKey *key_ptr = keys; - for(CONS_SrcLineMapBucket *node = first_bucket; + RADDBGIC_SortKey *key_ptr = keys; + for(RADDBGIC_SrcLineMapBucket *node = first_bucket; node != 0; node = node->order_next, key_ptr += 1){ key_ptr->key = node->line_num; @@ -2147,7 +2147,7 @@ cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) } // sort - CONS_SortKey *sorted_keys = cons_sort_key_array(scratch.arena, keys, line_count); + RADDBGIC_SortKey *sorted_keys = raddbgic_sort_key_array(scratch.arena, keys, line_count); // bake result U32 *line_nums = push_array_no_zero(arena, U32, line_count); @@ -2159,8 +2159,8 @@ cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) for(U32 i = 0; i < line_count; i += 1){ line_nums[i] = sorted_keys[i].key; line_ranges[i] = (U32)(voff_ptr - voffs); - CONS_SrcLineMapBucket *bucket = (CONS_SrcLineMapBucket*)sorted_keys[i].val; - for(CONS_SrcLineMapVoffBlock *node = bucket->first_voff_block; + RADDBGIC_SrcLineMapBucket *bucket = (RADDBGIC_SrcLineMapBucket*)sorted_keys[i].val; + for(RADDBGIC_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next){ *voff_ptr = node->voff; @@ -2170,7 +2170,7 @@ cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) line_ranges[line_count] = voff_count; } - CONS_SrcLinesCombined *result = push_array(arena, CONS_SrcLinesCombined, 1); + RADDBGIC_SrcLinesCombined *result = push_array(arena, RADDBGIC_SrcLinesCombined, 1); result->line_nums = line_nums; result->line_ranges = line_ranges; result->line_count = line_count; @@ -2184,13 +2184,13 @@ cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first) } //- rjf: vmap baking -static CONS_VMap* -cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *keys, U64 marker_count) +static RADDBGIC_VMap* +raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, U64 marker_count) { Temp scratch = scratch_begin(&arena, 1); // sort markers - CONS_SortKey *sorted_keys = cons_sort_key_array(scratch.arena, keys, marker_count); + RADDBGIC_SortKey *sorted_keys = raddbgic_sort_key_array(scratch.arena, keys, marker_count); // determine if an extra vmap entry for zero is needed U32 extra_vmap_entry = 0; @@ -2212,11 +2212,11 @@ cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *key vmap_ptr += 1; } - CONS_VMapRangeTracker *tracker_stack = 0; - CONS_VMapRangeTracker *tracker_free = 0; + RADDBGIC_VMapRangeTracker *tracker_stack = 0; + RADDBGIC_VMapRangeTracker *tracker_free = 0; - CONS_SortKey *key_ptr = sorted_keys; - CONS_SortKey *key_opl = sorted_keys + marker_count; + RADDBGIC_SortKey *key_ptr = sorted_keys; + RADDBGIC_SortKey *key_opl = sorted_keys + marker_count; for(;key_ptr < key_opl;){ // get initial map state from tracker stack U32 initial_idx = max_U32; @@ -2229,17 +2229,17 @@ cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *key U64 voff = key_ptr->key; for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ - CONS_VMapMarker *marker = (CONS_VMapMarker*)key_ptr->val; + RADDBGIC_VMapMarker *marker = (RADDBGIC_VMapMarker*)key_ptr->val; U32 idx = marker->idx; // push to stack if(marker->begin_range){ - CONS_VMapRangeTracker *new_tracker = tracker_free; + RADDBGIC_VMapRangeTracker *new_tracker = tracker_free; if(new_tracker != 0){ SLLStackPop(tracker_free); } else{ - new_tracker = push_array(scratch.arena, CONS_VMapRangeTracker, 1); + new_tracker = push_array(scratch.arena, RADDBGIC_VMapRangeTracker, 1); } SLLStackPush(tracker_stack, new_tracker); new_tracker->idx = idx; @@ -2247,9 +2247,9 @@ cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *key // pop matching node from stack (not always the top) else{ - CONS_VMapRangeTracker **ptr_in = &tracker_stack; - CONS_VMapRangeTracker *match = 0; - for(CONS_VMapRangeTracker *node = tracker_stack; + RADDBGIC_VMapRangeTracker **ptr_in = &tracker_stack; + RADDBGIC_VMapRangeTracker *match = 0; + for(RADDBGIC_VMapRangeTracker *node = tracker_stack; node != 0;){ if(node->idx == idx){ match = node; @@ -2325,7 +2325,7 @@ cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *key } // fill result - CONS_VMap *result = push_array(arena, CONS_VMap, 1); + RADDBGIC_VMap *result = push_array(arena, RADDBGIC_VMap, 1); result->vmap = vmap; result->count = vmap_entry_count - 1; @@ -2334,8 +2334,8 @@ cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *key return result; } -static CONS_VMap* -cons_vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) +static RADDBGIC_VMap* +raddbgic_vmap_from_unit_ranges(Arena *arena, RADDBGIC_UnitVMapRange *first, U64 count) { Temp scratch = scratch_begin(&arena, 1); @@ -2343,13 +2343,13 @@ cons_vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) U64 marker_count = count*2; // fill markers - CONS_SortKey *keys = push_array_no_zero(scratch.arena, CONS_SortKey, marker_count); - CONS_VMapMarker *markers = push_array_no_zero(scratch.arena, CONS_VMapMarker, marker_count); + RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); + RADDBGIC_VMapMarker *markers = push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); { - CONS_SortKey *key_ptr = keys; - CONS_VMapMarker *marker_ptr = markers; - for(CONS_UnitVMapRange *range = first; + RADDBGIC_SortKey *key_ptr = keys; + RADDBGIC_VMapMarker *marker_ptr = markers; + for(RADDBGIC_UnitVMapRange *range = first; range != 0; range = range->next){ if(range->first < range->opl){ @@ -2373,7 +2373,7 @@ cons_vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) } // construct vmap - CONS_VMap *result = cons_vmap_from_markers(arena, markers, keys, marker_count); + RADDBGIC_VMap *result = raddbgic_vmap_from_markers(arena, markers, keys, marker_count); scratch_end(scratch); return result; } @@ -2381,7 +2381,7 @@ cons_vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count) //- rjf: type info baking static U32* -cons_idx_run_from_types(Arena *arena, CONS_Type **types, U32 count) +raddbgic_idx_run_from_types(Arena *arena, RADDBGIC_Type **types, U32 count) { U32 *result = push_array(arena, U32, count); for(U32 i = 0; i < count; i += 1){ @@ -2390,10 +2390,10 @@ cons_idx_run_from_types(Arena *arena, CONS_Type **types, U32 count) return result; } -static CONS_TypeData* -cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) +static RADDBGIC_TypeData* +raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) { - ProfBegin("cons_type_data_combine"); + ProfBegin("raddbgic_type_data_combine"); Temp scratch = scratch_begin(&arena, 1); // fill type nodes @@ -2403,7 +2403,7 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) { RADDBGI_TypeNode *ptr = type_nodes; RADDBGI_TypeNode *opl = ptr + type_count; - CONS_Type *loose_type = root->first_type; + RADDBGIC_Type *loose_type = root->first_type; for(;loose_type != 0 && ptr < opl; loose_type = loose_type->next_order, ptr += 1){ @@ -2416,7 +2416,7 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) // built-in if(RADDBGI_TypeKind_FirstBuiltIn <= kind && kind <= RADDBGI_TypeKind_LastBuiltIn){ - ptr->built_in.name_string_idx = cons_string(bctx, loose_type->name); + ptr->built_in.name_string_idx = raddbgic_string(bctx, loose_type->name); } // constructed @@ -2433,8 +2433,8 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) { // parameters U32 count = loose_type->count; - U32 *idx_run = cons_idx_run_from_types(scratch.arena, loose_type->param_types, count); - ptr->constructed.param_idx_run_first = cons_idx_run(bctx, idx_run, count); + U32 *idx_run = raddbgic_idx_run_from_types(scratch.arena, loose_type->param_types, count); + ptr->constructed.param_idx_run_first = raddbgic_idx_run(bctx, idx_run, count); ptr->constructed.count = count; }break; @@ -2442,8 +2442,8 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) { // parameters U32 count = loose_type->count; - U32 *idx_run = cons_idx_run_from_types(scratch.arena, loose_type->param_types, count); - ptr->constructed.param_idx_run_first = cons_idx_run(bctx, idx_run, count); + U32 *idx_run = raddbgic_idx_run_from_types(scratch.arena, loose_type->param_types, count); + ptr->constructed.param_idx_run_first = raddbgic_idx_run(bctx, idx_run, count); ptr->constructed.count = count; }break; } @@ -2451,7 +2451,7 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) // user-defined else if(RADDBGI_TypeKind_FirstUserDefined <= kind && kind <= RADDBGI_TypeKind_LastUserDefined){ - ptr->user_defined.name_string_idx = cons_string(bctx, loose_type->name); + ptr->user_defined.name_string_idx = raddbgic_string(bctx, loose_type->name); if(loose_type->udt != 0){ ptr->user_defined.udt_idx = loose_type->udt->idx; } @@ -2495,7 +2495,7 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) RADDBGI_EnumMember *enum_member_ptr = enum_members; RADDBGI_EnumMember *enum_member_opl = enum_members + enum_member_count; - CONS_TypeUDT *loose_udt = root->first_udt; + RADDBGIC_TypeUDT *loose_udt = root->first_udt; for(;loose_udt != 0 && ptr < opl; loose_udt = loose_udt->next_order, ptr += 1){ ptr->self_type_idx = loose_udt->self_type->idx; @@ -2511,11 +2511,11 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) ptr->member_count = loose_udt->enum_val_count; U32 local_enum_val_count = loose_udt->enum_val_count; - CONS_TypeEnumVal *loose_enum_val = loose_udt->first_enum_val; + RADDBGIC_TypeEnumVal *loose_enum_val = loose_udt->first_enum_val; for(U32 i = 0; i < local_enum_val_count; i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ - enum_member_ptr->name_string_idx = cons_string(bctx, loose_enum_val->name); + enum_member_ptr->name_string_idx = raddbgic_string(bctx, loose_enum_val->name); enum_member_ptr->val = loose_enum_val->val; } } @@ -2526,13 +2526,13 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) ptr->member_count = loose_udt->member_count; U32 local_member_count = loose_udt->member_count; - CONS_TypeMember *loose_member = loose_udt->first_member; + RADDBGIC_TypeMember *loose_member = loose_udt->first_member; for(U32 i = 0; i < local_member_count; i += 1, member_ptr += 1, loose_member = loose_member->next){ member_ptr->kind = loose_member->kind; // TODO(allen): member_ptr->visibility = ; - member_ptr->name_string_idx = cons_string(bctx, loose_member->name); + member_ptr->name_string_idx = raddbgic_string(bctx, loose_member->name); member_ptr->off = loose_member->off; member_ptr->type_idx = loose_member->type->idx; @@ -2547,8 +2547,8 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) U32 file_idx = 0; if(loose_udt->source_path.size > 0){ - CONS_PathNode *path_node = cons_paths_node_from_path(bctx, loose_udt->source_path); - CONS_SrcNode *src_node = cons_paths_src_node_from_path_node(bctx, path_node); + RADDBGIC_PathNode *path_node = raddbgic_paths_node_from_path(bctx, loose_udt->source_path); + RADDBGIC_SrcNode *src_node = raddbgic_paths_src_node_from_path_node(bctx, path_node); file_idx = src_node->idx; } @@ -2566,7 +2566,7 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) // fill result - CONS_TypeData *result = push_array(arena, CONS_TypeData, 1); + RADDBGIC_TypeData *result = push_array(arena, RADDBGIC_TypeData, 1); result->type_nodes = type_nodes; result->type_node_count = type_count; result->udts = udts; @@ -2583,16 +2583,16 @@ cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) //- rjf: symbol data baking -static CONS_SymbolData* -cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) +static RADDBGIC_SymbolData* +raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) { - ProfBegin("cons_symbol_data_combine"); + ProfBegin("raddbgic_symbol_data_combine"); Temp scratch = scratch_begin(&arena, 1); // count symbol kinds - U32 globalvar_count = 1 + root->symbol_kind_counts[CONS_SymbolKind_GlobalVariable]; - U32 threadvar_count = 1 + root->symbol_kind_counts[CONS_SymbolKind_ThreadVariable]; - U32 procedure_count = 1 + root->symbol_kind_counts[CONS_SymbolKind_Procedure]; + U32 globalvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_GlobalVariable]; + U32 threadvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_ThreadVariable]; + U32 procedure_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_Procedure]; // allocate symbol arrays RADDBGI_GlobalVariable *global_variables = @@ -2615,11 +2615,11 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) procedure_ptr += 1; // symbol nodes - for(CONS_Symbol *node = root->first_symbol; + for(RADDBGIC_Symbol *node = root->first_symbol; node != 0; node = node->next_order){ - U32 name_string_idx = cons_string(bctx, node->name); - U32 link_name_string_idx = cons_string(bctx, node->link_name); + U32 name_string_idx = raddbgic_string(bctx, node->name); + U32 link_name_string_idx = raddbgic_string(bctx, node->link_name); U32 type_idx = node->type->idx; RADDBGI_LinkFlags link_flags = 0; @@ -2641,7 +2641,7 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) switch (node->kind){ default:{}break; - case CONS_SymbolKind_GlobalVariable: + case RADDBGIC_SymbolKind_GlobalVariable: { global_ptr->name_string_idx = name_string_idx; global_ptr->link_flags = link_flags; @@ -2651,7 +2651,7 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) global_ptr += 1; }break; - case CONS_SymbolKind_ThreadVariable: + case RADDBGIC_SymbolKind_ThreadVariable: { thread_local_ptr->name_string_idx = name_string_idx; thread_local_ptr->link_flags = link_flags; @@ -2661,7 +2661,7 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) thread_local_ptr += 1; }break; - case CONS_SymbolKind_Procedure: + case RADDBGIC_SymbolKind_Procedure: { procedure_ptr->name_string_idx = name_string_idx; procedure_ptr->link_name_string_idx = link_name_string_idx; @@ -2680,23 +2680,23 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) } // global vmap - CONS_VMap *global_vmap = 0; + RADDBGIC_VMap *global_vmap = 0; { // count necessary markers U32 marker_count = globalvar_count*2; // fill markers - CONS_SortKey *keys = push_array_no_zero(scratch.arena, CONS_SortKey, marker_count); - CONS_VMapMarker *markers = push_array_no_zero(scratch.arena, CONS_VMapMarker, marker_count); + RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); + RADDBGIC_VMapMarker *markers = push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); - CONS_SortKey *key_ptr = keys; - CONS_VMapMarker *marker_ptr = markers; + RADDBGIC_SortKey *key_ptr = keys; + RADDBGIC_VMapMarker *marker_ptr = markers; // real globals - for(CONS_Symbol *node = root->first_symbol; + for(RADDBGIC_Symbol *node = root->first_symbol; node != 0; node = node->next_order){ - if(node->kind == CONS_SymbolKind_GlobalVariable){ + if(node->kind == RADDBGIC_SymbolKind_GlobalVariable){ U32 global_idx = node->idx; U64 first = node->offset; @@ -2745,7 +2745,7 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) marker_ptr - markers == marker_count); // construct vmap - global_vmap = cons_vmap_from_markers(arena, markers, keys, marker_count); + global_vmap = raddbgic_vmap_from_markers(arena, markers, keys, marker_count); } // allocate scope array @@ -2780,13 +2780,13 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) RADDBGI_Local *local_ptr = locals; RADDBGI_LocationBlock *location_block_ptr = location_blocks; - for(CONS_Scope *node = root->first_scope; + for(RADDBGIC_Scope *node = root->first_scope; node != 0; node = node->next_order, scope_ptr += 1){ // emit voffs U32 voff_first = (U32)(scope_voff_ptr - scope_voffs); - for(CONS_VOffRange *range = node->first_range; + for(RADDBGIC_VOffRange *range = node->first_range; range != 0; range = range->next){ *scope_voff_ptr = range->voff_first; @@ -2799,21 +2799,21 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) // emit locals U32 scope_local_count = node->local_count; U32 scope_local_first = (U32)(local_ptr - locals); - for(CONS_Local *slocal = node->first_local; + for(RADDBGIC_Local *slocal = node->first_local; slocal != 0; slocal = slocal->next, local_ptr += 1){ local_ptr->kind = slocal->kind; - local_ptr->name_string_idx = cons_string(bctx, slocal->name); + local_ptr->name_string_idx = raddbgic_string(bctx, slocal->name); local_ptr->type_idx = slocal->type->idx; - CONS_LocationSet *locset = slocal->locset; + RADDBGIC_LocationSet *locset = slocal->locset; if(locset != 0){ U32 location_first = (U32)(location_block_ptr - location_blocks); U32 location_opl = location_first + locset->location_case_count; local_ptr->location_first = location_first; local_ptr->location_opl = location_opl; - for(CONS_LocationCase *location_case = locset->first_location_case; + for(RADDBGIC_LocationCase *location_case = locset->first_location_case; location_case != 0; location_case = location_case->next){ location_block_ptr->scope_off_first = location_case->voff_first; @@ -2821,7 +2821,7 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) location_block_ptr->location_data_off = location_data.total_size; location_block_ptr += 1; - CONS_Location *location = location_case->location; + RADDBGIC_Location *location = location_case->location; if(location == 0){ U64 data = 0; str8_serial_push_align(scratch.arena, &location_data, 8); @@ -2840,7 +2840,7 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) case RADDBGI_LocationKind_ValBytecodeStream: { str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, str8_struct(&location->kind))); - for(CONS_EvalBytecodeOp *op_node = location->bytecode.first_op; + for(RADDBGIC_EvalBytecodeOp *op_node = location->bytecode.first_op; op_node != 0; op_node = op_node->next){ U8 op_data[9]; @@ -2906,24 +2906,24 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) String8 location_data_str = str8_list_join(arena, &location_data, 0); // scope vmap - CONS_VMap *scope_vmap = 0; + RADDBGIC_VMap *scope_vmap = 0; { // count necessary markers U32 marker_count = scope_voff_count; // fill markers - CONS_SortKey *keys = push_array_no_zero(scratch.arena, CONS_SortKey, marker_count); - CONS_VMapMarker *markers = push_array_no_zero(scratch.arena, CONS_VMapMarker, marker_count); + RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); + RADDBGIC_VMapMarker *markers = push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); - CONS_SortKey *key_ptr = keys; - CONS_VMapMarker *marker_ptr = markers; + RADDBGIC_SortKey *key_ptr = keys; + RADDBGIC_VMapMarker *marker_ptr = markers; - for(CONS_Scope *node = root->first_scope; + for(RADDBGIC_Scope *node = root->first_scope; node != 0; node = node->next_order){ U32 scope_idx = node->idx; - for(CONS_VOffRange *range = node->first_range; + for(RADDBGIC_VOffRange *range = node->first_range; range != 0; range = range->next){ key_ptr->key = range->voff_first; @@ -2942,11 +2942,11 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) } } - scope_vmap = cons_vmap_from_markers(arena, markers, keys, marker_count); + scope_vmap = raddbgic_vmap_from_markers(arena, markers, keys, marker_count); } // fill result - CONS_SymbolData *result = push_array(arena, CONS_SymbolData, 1); + RADDBGIC_SymbolData *result = push_array(arena, RADDBGIC_SymbolData, 1); result->global_variables = global_variables; result->global_variable_count = globalvar_count; result->global_vmap = global_vmap; @@ -2974,8 +2974,8 @@ cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx) //- rjf: name map baking -static CONS_NameMapBaked* -cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameMap *map) +static RADDBGIC_NameMapBaked* +raddbgic_name_map_bake(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map) { Temp scratch = scratch_begin(&arena, 1); @@ -2983,13 +2983,13 @@ cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameM U32 node_count = map->name_count; // setup the final bucket layouts - CONS_NameMapSemiBucket *sbuckets = push_array(scratch.arena, CONS_NameMapSemiBucket, bucket_count); - for(CONS_NameMapNode *node = map->first; + RADDBGIC_NameMapSemiBucket *sbuckets = push_array(scratch.arena, RADDBGIC_NameMapSemiBucket, bucket_count); + for(RADDBGIC_NameMapNode *node = map->first; node != 0; node = node->order_next){ U64 hash = raddbgi_hash(node->string.str, node->string.size); U64 bi = hash%bucket_count; - CONS_NameMapSemiNode *snode = push_array(scratch.arena, CONS_NameMapSemiNode, 1); + RADDBGIC_NameMapSemiNode *snode = push_array(scratch.arena, RADDBGIC_NameMapSemiNode, 1); SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); snode->node = node; sbuckets[bi].count += 1; @@ -3007,13 +3007,13 @@ cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameM bucket_ptr->first_node = (U32)(node_ptr - nodes); bucket_ptr->node_count = sbuckets[i].count; - for(CONS_NameMapSemiNode *snode = sbuckets[i].first; + for(RADDBGIC_NameMapSemiNode *snode = sbuckets[i].first; snode != 0; snode = snode->next){ - CONS_NameMapNode *node = snode->node; + RADDBGIC_NameMapNode *node = snode->node; // cons name and index(es) - U32 string_idx = cons_string(bctx, node->string); + U32 string_idx = raddbgic_string(bctx, node->string); U32 match_count = node->idx_count; U32 idx = 0; if(match_count == 1){ @@ -3023,7 +3023,7 @@ cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameM Temp temp = temp_begin(scratch.arena); U32 *idx_run = push_array_no_zero(temp.arena, U32, match_count); U32 *idx_ptr = idx_run; - for(CONS_NameMapIdxNode *idxnode = node->idx_first; + for(RADDBGIC_NameMapIdxNode *idxnode = node->idx_first; idxnode != 0; idxnode = idxnode->next){ for(U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ @@ -3036,7 +3036,7 @@ cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameM } dblbreak:; Assert(idx_ptr == idx_run + match_count); - idx = cons_idx_run(bctx, idx_run, match_count); + idx = raddbgic_idx_run(bctx, idx_run, match_count); temp_end(temp); } @@ -3052,7 +3052,7 @@ cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameM scratch_end(scratch); - CONS_NameMapBaked *result = push_array(arena, CONS_NameMapBaked, 1); + RADDBGIC_NameMapBaked *result = push_array(arena, RADDBGIC_NameMapBaked, 1); result->buckets = buckets; result->nodes = nodes; result->bucket_count = bucket_count; @@ -3063,21 +3063,21 @@ cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameM //- rjf: top-level baking entry point static void -cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) +raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) { ProfBeginFunction(); str8_serial_begin(arena, out); // setup cons helpers - CONS_DSections dss = {0}; - cons_dsection(arena, &dss, 0, 0, RADDBGI_DataSectionTag_NULL); + RADDBGIC_DSections dss = {0}; + raddbgic_dsection(arena, &dss, 0, 0, RADDBGI_DataSectionTag_NULL); - CONS_BakeParams bctx_params = {0}; + RADDBGIC_BakeParams bctx_params = {0}; { bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); } - CONS_BakeCtx *bctx = cons_bake_ctx_begin(&bctx_params); + RADDBGIC_BakeCtx *bctx = raddbgic_bake_ctx_begin(&bctx_params); //////////////////////////////// // MAIN PART: allocating and filling out sections of the file @@ -3085,30 +3085,30 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) // top level info RADDBGI_TopLevelInfo *tli = push_array(arena, RADDBGI_TopLevelInfo, 1); { - CONS_TopLevelInfo *cons_tli = &root->top_level_info; - tli->architecture = cons_tli->architecture; - tli->exe_name_string_idx = cons_string(bctx, cons_tli->exe_name); - tli->exe_hash = cons_tli->exe_hash; - tli->voff_max = cons_tli->voff_max; + RADDBGIC_TopLevelInfo *raddbgic_tli = &root->top_level_info; + tli->architecture = raddbgic_tli->architecture; + tli->exe_name_string_idx = raddbgic_string(bctx, raddbgic_tli->exe_name); + tli->exe_hash = raddbgic_tli->exe_hash; + tli->voff_max = raddbgic_tli->voff_max; } - cons_dsection(arena, &dss, tli, sizeof(*tli), RADDBGI_DataSectionTag_TopLevelInfo); + raddbgic_dsection(arena, &dss, tli, sizeof(*tli), RADDBGI_DataSectionTag_TopLevelInfo); // binary sections array { U32 count = root->binary_section_count; RADDBGI_BinarySection *sections = push_array(arena, RADDBGI_BinarySection, count); RADDBGI_BinarySection *dsec = sections; - for(CONS_BinarySection *ssec = root->binary_section_first; + for(RADDBGIC_BinarySection *ssec = root->binary_section_first; ssec != 0; ssec = ssec->next, dsec += 1){ - dsec->name_string_idx = cons_string(bctx, ssec->name); + dsec->name_string_idx = raddbgic_string(bctx, ssec->name); dsec->flags = ssec->flags; dsec->voff_first = ssec->voff_first; dsec->voff_opl = ssec->voff_opl; dsec->foff_first = ssec->foff_first; dsec->foff_opl = ssec->foff_opl; } - cons_dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBGI_DataSectionTag_BinarySections); + raddbgic_dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBGI_DataSectionTag_BinarySections); } // units array @@ -3119,17 +3119,17 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) U32 count = root->unit_count; RADDBGI_Unit *units = push_array(arena, RADDBGI_Unit, count); RADDBGI_Unit *dunit = units; - for(CONS_Unit *sunit = root->unit_first; + for(RADDBGIC_Unit *sunit = root->unit_first; sunit != 0; sunit = sunit->next_order, dunit += 1){ // strings & paths - U32 unit_name = cons_string(bctx, sunit->unit_name); - U32 cmp_name = cons_string(bctx, sunit->compiler_name); + U32 unit_name = raddbgic_string(bctx, sunit->unit_name); + U32 cmp_name = raddbgic_string(bctx, sunit->compiler_name); - U32 src_path = cons_paths_idx_from_path(bctx, sunit->source_file); - U32 obj_path = cons_paths_idx_from_path(bctx, sunit->object_file); - U32 archive_path = cons_paths_idx_from_path(bctx, sunit->archive_file); - U32 build_path = cons_paths_idx_from_path(bctx, sunit->build_path); + U32 src_path = raddbgic_paths_idx_from_path(bctx, sunit->source_file); + U32 obj_path = raddbgic_paths_idx_from_path(bctx, sunit->object_file); + U32 archive_path = raddbgic_paths_idx_from_path(bctx, sunit->archive_file); + U32 build_path = raddbgic_paths_idx_from_path(bctx, sunit->build_path); dunit->unit_name_string_idx = unit_name; dunit->compiler_name_string_idx = cmp_name; @@ -3140,140 +3140,140 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) dunit->language = sunit->language; // line info (voff -> file*line*col) - CONS_LineSequenceNode *first_seq = sunit->line_seq_first; - CONS_UnitLinesCombined *lines = cons_unit_combine_lines(arena, bctx, first_seq); + RADDBGIC_LineSequenceNode *first_seq = sunit->line_seq_first; + RADDBGIC_UnitLinesCombined *lines = raddbgic_unit_combine_lines(arena, bctx, first_seq); U32 line_count = lines->line_count; if(line_count > 0){ dunit->line_info_voffs_data_idx = - cons_dsection(arena, &dss, lines->voffs, sizeof(U64)*(line_count + 1), - RADDBGI_DataSectionTag_LineInfoVoffs); + raddbgic_dsection(arena, &dss, lines->voffs, sizeof(U64)*(line_count + 1), + RADDBGI_DataSectionTag_LineInfoVoffs); dunit->line_info_data_idx = - cons_dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, - RADDBGI_DataSectionTag_LineInfoData); + raddbgic_dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, + RADDBGI_DataSectionTag_LineInfoData); if(lines->cols != 0){ dunit->line_info_col_data_idx = - cons_dsection(arena, &dss, lines->cols, sizeof(RADDBGI_Column)*line_count, - RADDBGI_DataSectionTag_LineInfoColumns); + raddbgic_dsection(arena, &dss, lines->cols, sizeof(RADDBGI_Column)*line_count, + RADDBGI_DataSectionTag_LineInfoColumns); } dunit->line_info_count = line_count; } } - cons_dsection(arena, &dss, units, sizeof(*units)*count, RADDBGI_DataSectionTag_Units); + raddbgic_dsection(arena, &dss, units, sizeof(*units)*count, RADDBGI_DataSectionTag_Units); } // source file line info baking // * pass for "source_combine_line" for each source file - // * can only be run after a pass that does "unit_combine_lines" for each unit. - for(CONS_SrcNode *src_node = bctx->tree->src_first; + for(RADDBGIC_SrcNode *src_node = bctx->tree->src_first; src_node != 0; src_node = src_node->next){ - CONS_LineMapFragment *first_fragment = src_node->first_fragment; - CONS_SrcLinesCombined *lines = cons_source_combine_lines(arena, first_fragment); + RADDBGIC_LineMapFragment *first_fragment = src_node->first_fragment; + RADDBGIC_SrcLinesCombined *lines = raddbgic_source_combine_lines(arena, first_fragment); U32 line_count = lines->line_count; if(line_count > 0){ src_node->line_map_count = line_count; src_node->line_map_nums_data_idx = - cons_dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, - RADDBGI_DataSectionTag_LineMapNumbers); + raddbgic_dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, + RADDBGI_DataSectionTag_LineMapNumbers); src_node->line_map_range_data_idx = - cons_dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), - RADDBGI_DataSectionTag_LineMapRanges); + raddbgic_dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), + RADDBGI_DataSectionTag_LineMapRanges); src_node->line_map_voff_data_idx = - cons_dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, - RADDBGI_DataSectionTag_LineMapVoffs); + raddbgic_dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, + RADDBGI_DataSectionTag_LineMapVoffs); } } // source file name mapping { - CONS_NameMap* map = cons_name_map_for_kind(root, RADDBGI_NameMapKind_NormalSourcePaths); - for(CONS_SrcNode *src_node = bctx->tree->src_first; + RADDBGIC_NameMap* map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_NormalSourcePaths); + for(RADDBGIC_SrcNode *src_node = bctx->tree->src_first; src_node != 0; src_node = src_node->next){ if(src_node->idx != 0){ - cons_name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); + raddbgic_name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); } } } // unit vmap baking { - CONS_VMap *vmap = cons_vmap_from_unit_ranges(arena, - root->unit_vmap_range_first, - root->unit_vmap_range_count); + RADDBGIC_VMap *vmap = raddbgic_vmap_from_unit_ranges(arena, + root->unit_vmap_range_first, + root->unit_vmap_range_count); U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); - cons_dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); + raddbgic_dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); } // type info baking { - CONS_TypeData *types = cons_type_data_combine(arena, root, bctx); + RADDBGIC_TypeData *types = raddbgic_type_data_combine(arena, root, bctx); U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; - cons_dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); + raddbgic_dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); U64 udt_size = sizeof(*types->udts)*types->udt_count; - cons_dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); + raddbgic_dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); U64 member_size = sizeof(*types->members)*types->member_count; - cons_dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); + raddbgic_dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; - cons_dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); + raddbgic_dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); } // symbol info baking { - CONS_SymbolData *symbol_data = cons_symbol_data_combine(arena, root, bctx); + RADDBGIC_SymbolData *symbol_data = raddbgic_symbol_data_combine(arena, root, bctx); U64 global_variables_size = sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; - cons_dsection(arena, &dss, symbol_data->global_variables, global_variables_size, - RADDBGI_DataSectionTag_GlobalVariables); + raddbgic_dsection(arena, &dss, symbol_data->global_variables, global_variables_size, + RADDBGI_DataSectionTag_GlobalVariables); - CONS_VMap *global_vmap = symbol_data->global_vmap; + RADDBGIC_VMap *global_vmap = symbol_data->global_vmap; U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); - cons_dsection(arena, &dss, global_vmap->vmap, global_vmap_size, - RADDBGI_DataSectionTag_GlobalVmap); + raddbgic_dsection(arena, &dss, global_vmap->vmap, global_vmap_size, + RADDBGI_DataSectionTag_GlobalVmap); U64 thread_variables_size = sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; - cons_dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, - RADDBGI_DataSectionTag_ThreadVariables); + raddbgic_dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, + RADDBGI_DataSectionTag_ThreadVariables); U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; - cons_dsection(arena, &dss, symbol_data->procedures, procedures_size, - RADDBGI_DataSectionTag_Procedures); + raddbgic_dsection(arena, &dss, symbol_data->procedures, procedures_size, + RADDBGI_DataSectionTag_Procedures); U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; - cons_dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); + raddbgic_dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; - cons_dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, - RADDBGI_DataSectionTag_ScopeVoffData); + raddbgic_dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, + RADDBGI_DataSectionTag_ScopeVoffData); - CONS_VMap *scope_vmap = symbol_data->scope_vmap; + RADDBGIC_VMap *scope_vmap = symbol_data->scope_vmap; U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); - cons_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); + raddbgic_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; - cons_dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); + raddbgic_dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); U64 location_blocks_size = sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; - cons_dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, - RADDBGI_DataSectionTag_LocationBlocks); + raddbgic_dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, + RADDBGI_DataSectionTag_LocationBlocks); U64 location_data_size = symbol_data->location_data_size; - cons_dsection(arena, &dss, symbol_data->location_data, location_data_size, - RADDBGI_DataSectionTag_LocationData); + raddbgic_dsection(arena, &dss, symbol_data->location_data, location_data_size, + RADDBGI_DataSectionTag_LocationData); } // name map baking @@ -3289,23 +3289,23 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) RADDBGI_NameMap *name_map_ptr = name_maps; for(U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ - CONS_NameMap *map = root->name_maps[i]; + RADDBGIC_NameMap *map = root->name_maps[i]; if(map != 0){ - CONS_NameMapBaked *baked = cons_name_map_bake(arena, root, bctx, map); + RADDBGIC_NameMapBaked *baked = raddbgic_name_map_bake(arena, root, bctx, map); name_map_ptr->kind = i; name_map_ptr->bucket_data_idx = - cons_dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, - RADDBGI_DataSectionTag_NameMapBuckets); + raddbgic_dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, + RADDBGI_DataSectionTag_NameMapBuckets); name_map_ptr->node_data_idx = - cons_dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, - RADDBGI_DataSectionTag_NameMapNodes); + raddbgic_dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, + RADDBGI_DataSectionTag_NameMapNodes); name_map_ptr += 1; } } - cons_dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, - RADDBGI_DataSectionTag_NameMaps); + raddbgic_dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, + RADDBGI_DataSectionTag_NameMaps); } //////////////////////////////// @@ -3317,10 +3317,10 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) RADDBGI_FilePathNode *nodes = push_array(arena, RADDBGI_FilePathNode, count); RADDBGI_FilePathNode *out_node = nodes; - for(CONS_PathNode *node = bctx->tree->first; + for(RADDBGIC_PathNode *node = bctx->tree->first; node != 0; node = node->next_order, out_node += 1){ - out_node->name_string_idx = cons_string(bctx, node->name); + out_node->name_string_idx = raddbgic_string(bctx, node->name); if(node->parent != 0){ out_node->parent_path_node = node->parent->idx; } @@ -3335,7 +3335,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } } - cons_dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBGI_DataSectionTag_FilePathNodes); + raddbgic_dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBGI_DataSectionTag_FilePathNodes); } // generate data sections for files @@ -3344,18 +3344,18 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) RADDBGI_SourceFile *src_files = push_array(arena, RADDBGI_SourceFile, count); RADDBGI_SourceFile *out_src_file = src_files; - for(CONS_SrcNode *node = bctx->tree->src_first; + for(RADDBGIC_SrcNode *node = bctx->tree->src_first; node != 0; node = node->next, out_src_file += 1){ out_src_file->file_path_node_idx = node->path_node->idx; - out_src_file->normal_full_path_string_idx = cons_string(bctx, node->normal_full_path); + out_src_file->normal_full_path_string_idx = raddbgic_string(bctx, node->normal_full_path); out_src_file->line_map_nums_data_idx = node->line_map_nums_data_idx; out_src_file->line_map_range_data_idx = node->line_map_range_data_idx; out_src_file->line_map_count = node->line_map_count; out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; } - cons_dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBGI_DataSectionTag_SourceFiles); + raddbgic_dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBGI_DataSectionTag_SourceFiles); } // generate data sections for strings @@ -3367,7 +3367,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) U32 *off_ptr = str_offs; *off_ptr = 0; off_ptr += 1; - for(CONS_StringNode *node = bctx->strs.order_first; + for(RADDBGIC_StringNode *node = bctx->strs.order_first; node != 0; node = node->order_next){ off_cursor += node->str.size; @@ -3379,7 +3379,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) U8 *buf = push_array(arena, U8, off_cursor); { U8 *ptr = buf; - for(CONS_StringNode *node = bctx->strs.order_first; + for(RADDBGIC_StringNode *node = bctx->strs.order_first; node != 0; node = node->order_next){ MemoryCopy(ptr, node->str.str, node->str.size); @@ -3387,9 +3387,9 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } } - cons_dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), - RADDBGI_DataSectionTag_StringTable); - cons_dsection(arena, &dss, buf, off_cursor, RADDBGI_DataSectionTag_StringData); + raddbgic_dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), + RADDBGI_DataSectionTag_StringTable); + raddbgic_dsection(arena, &dss, buf, off_cursor, RADDBGI_DataSectionTag_StringData); } // generate data sections for index runs @@ -3399,7 +3399,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) { U32 *out_ptr = idx_data; U32 *opl = out_ptr + bctx->idxs.idx_count; - CONS_IdxRunNode *node = bctx->idxs.order_first; + RADDBGIC_IdxRunNode *node = bctx->idxs.order_first; for(;node != 0 && out_ptr < opl; node = node->order_next){ MemoryCopy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); @@ -3408,8 +3408,8 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) Assert(out_ptr == opl); } - cons_dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, - RADDBGI_DataSectionTag_IndexRuns); + raddbgic_dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, + RADDBGI_DataSectionTag_IndexRuns); } // layout @@ -3431,7 +3431,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) } { U64 test_dss_count = 0; - for(CONS_DSectionNode *node = dss.first; + for(RADDBGIC_DSectionNode *node = dss.first; node != 0; node = node->next){ test_dss_count += 1; @@ -3439,7 +3439,7 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) Assert(test_dss_count == dss.count); RADDBGI_DataSection *ptr = dstable; - for(CONS_DSectionNode *node = dss.first; + for(RADDBGIC_DSectionNode *node = dss.first; node != 0; node = node->next, ptr += 1){ U64 data_section_offset = 0; @@ -3458,6 +3458,6 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out) Assert(ptr == dstable + dss.count); } - cons_bake_ctx_release(bctx); + raddbgic_bake_ctx_release(bctx); ProfEnd(); } diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/raddbgi_cons/raddbgi_cons.h index e9ab4716..cadb75c1 100644 --- a/src/raddbgi_cons/raddbgi_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -7,18 +7,18 @@ //////////////////////////////// //~ rjf: Error Types -typedef struct CONS_Error CONS_Error; -struct CONS_Error +typedef struct RADDBGIC_Error RADDBGIC_Error; +struct RADDBGIC_Error { - CONS_Error *next; + RADDBGIC_Error *next; String8 msg; }; -typedef struct CONS_ErrorList CONS_ErrorList; -struct CONS_ErrorList +typedef struct RADDBGIC_ErrorList RADDBGIC_ErrorList; +struct RADDBGIC_ErrorList { - CONS_Error *first; - CONS_Error *last; + RADDBGIC_Error *first; + RADDBGIC_Error *last; U64 count; }; @@ -27,47 +27,47 @@ struct CONS_ErrorList //- rjf: u64 -> pointer map -typedef struct CONS_U64ToPtrNode CONS_U64ToPtrNode; -struct CONS_U64ToPtrNode +typedef struct RADDBGIC_U64ToPtrNode RADDBGIC_U64ToPtrNode; +struct RADDBGIC_U64ToPtrNode { - CONS_U64ToPtrNode *next; + RADDBGIC_U64ToPtrNode *next; U64 _padding_; U64 key[1]; void *ptr[1]; }; -typedef struct CONS_U64ToPtrMap CONS_U64ToPtrMap; -struct CONS_U64ToPtrMap +typedef struct RADDBGIC_U64ToPtrMap RADDBGIC_U64ToPtrMap; +struct RADDBGIC_U64ToPtrMap { - CONS_U64ToPtrNode **buckets; + RADDBGIC_U64ToPtrNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 pair_count; }; -typedef struct CONS_U64ToPtrLookup CONS_U64ToPtrLookup; -struct CONS_U64ToPtrLookup +typedef struct RADDBGIC_U64ToPtrLookup RADDBGIC_U64ToPtrLookup; +struct RADDBGIC_U64ToPtrLookup { void *match; - CONS_U64ToPtrNode *fill_node; + RADDBGIC_U64ToPtrNode *fill_node; U32 fill_k; }; //- rjf: string8 -> pointer map -typedef struct CONS_Str8ToPtrNode CONS_Str8ToPtrNode; -struct CONS_Str8ToPtrNode +typedef struct RADDBGIC_Str8ToPtrNode RADDBGIC_Str8ToPtrNode; +struct RADDBGIC_Str8ToPtrNode { - struct CONS_Str8ToPtrNode *next; + struct RADDBGIC_Str8ToPtrNode *next; String8 key; U64 hash; void *ptr; }; -typedef struct CONS_Str8ToPtrMap CONS_Str8ToPtrMap; -struct CONS_Str8ToPtrMap +typedef struct RADDBGIC_Str8ToPtrMap RADDBGIC_Str8ToPtrMap; +struct RADDBGIC_Str8ToPtrMap { - CONS_Str8ToPtrNode **buckets; + RADDBGIC_Str8ToPtrNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 pair_count; @@ -75,17 +75,17 @@ struct CONS_Str8ToPtrMap //- rjf: sortable range data structure -typedef struct CONS_SortKey CONS_SortKey; -struct CONS_SortKey +typedef struct RADDBGIC_SortKey RADDBGIC_SortKey; +struct RADDBGIC_SortKey { U64 key; void *val; }; -typedef struct CONS_OrderedRange CONS_OrderedRange; -struct CONS_OrderedRange +typedef struct RADDBGIC_OrderedRange RADDBGIC_OrderedRange; +struct RADDBGIC_OrderedRange { - CONS_OrderedRange *next; + RADDBGIC_OrderedRange *next; U64 first; U64 opl; }; @@ -93,10 +93,10 @@ struct CONS_OrderedRange //////////////////////////////// //~ rjf: Binary Section Types -typedef struct CONS_BinarySection CONS_BinarySection; -struct CONS_BinarySection +typedef struct RADDBGIC_BinarySection RADDBGIC_BinarySection; +struct RADDBGIC_BinarySection { - CONS_BinarySection *next; + RADDBGIC_BinarySection *next; String8 name; RADDBGI_BinarySectionFlags flags; U64 voff_first; @@ -108,8 +108,8 @@ struct CONS_BinarySection //////////////////////////////// //~ rjf: Per-Compilation-Unit Info Types -typedef struct CONS_LineSequence CONS_LineSequence; -struct CONS_LineSequence +typedef struct RADDBGIC_LineSequence RADDBGIC_LineSequence; +struct RADDBGIC_LineSequence { String8 file_name; U64 *voffs; // [line_count + 1] (sorted) @@ -118,15 +118,15 @@ struct CONS_LineSequence U64 line_count; }; -typedef struct CONS_LineSequenceNode CONS_LineSequenceNode; -struct CONS_LineSequenceNode +typedef struct RADDBGIC_LineSequenceNode RADDBGIC_LineSequenceNode; +struct RADDBGIC_LineSequenceNode { - CONS_LineSequenceNode *next; - CONS_LineSequence line_seq; + RADDBGIC_LineSequenceNode *next; + RADDBGIC_LineSequence line_seq; }; -typedef struct CONS_UnitInfo CONS_UnitInfo; -struct CONS_UnitInfo +typedef struct RADDBGIC_UnitInfo RADDBGIC_UnitInfo; +struct RADDBGIC_UnitInfo { String8 unit_name; String8 compiler_name; @@ -137,10 +137,10 @@ struct CONS_UnitInfo RADDBGI_Language language; }; -typedef struct CONS_Unit CONS_Unit; -struct CONS_Unit +typedef struct RADDBGIC_Unit RADDBGIC_Unit; +struct RADDBGIC_Unit { - CONS_Unit *next_order; + RADDBGIC_Unit *next_order; U32 idx; B32 info_is_set; String8 unit_name; @@ -150,16 +150,16 @@ struct CONS_Unit String8 archive_file; String8 build_path; RADDBGI_Language language; - CONS_LineSequenceNode *line_seq_first; - CONS_LineSequenceNode *line_seq_last; + RADDBGIC_LineSequenceNode *line_seq_first; + RADDBGIC_LineSequenceNode *line_seq_last; U64 line_seq_count; }; -typedef struct CONS_UnitVMapRange CONS_UnitVMapRange; -struct CONS_UnitVMapRange +typedef struct RADDBGIC_UnitVMapRange RADDBGIC_UnitVMapRange; +struct RADDBGIC_UnitVMapRange { - CONS_UnitVMapRange *next; - CONS_Unit *unit; + RADDBGIC_UnitVMapRange *next; + RADDBGIC_Unit *unit; U64 first; U64 opl; }; @@ -167,42 +167,42 @@ struct CONS_UnitVMapRange //////////////////////////////// //~ rjf: Type Info Types -typedef U8 CONS_TypeConstructKind; +typedef U8 RADDBGIC_TypeConstructKind; enum { - CONS_TypeConstructKind_Basic, - CONS_TypeConstructKind_Modifier, - CONS_TypeConstructKind_Bitfield, - CONS_TypeConstructKind_Pointer, - CONS_TypeConstructKind_Array, - CONS_TypeConstructKind_Procedure, - CONS_TypeConstructKind_Method, + RADDBGIC_TypeConstructKind_Basic, + RADDBGIC_TypeConstructKind_Modifier, + RADDBGIC_TypeConstructKind_Bitfield, + RADDBGIC_TypeConstructKind_Pointer, + RADDBGIC_TypeConstructKind_Array, + RADDBGIC_TypeConstructKind_Procedure, + RADDBGIC_TypeConstructKind_Method, }; -typedef struct CONS_Reservation CONS_Reservation; +typedef struct RADDBGIC_Reservation RADDBGIC_Reservation; -typedef struct CONS_TypeMember CONS_TypeMember; -struct CONS_TypeMember +typedef struct RADDBGIC_TypeMember RADDBGIC_TypeMember; +struct RADDBGIC_TypeMember { - CONS_TypeMember *next; + RADDBGIC_TypeMember *next; RADDBGI_MemberKind kind; String8 name; - struct CONS_Type *type; + struct RADDBGIC_Type *type; U32 off; }; -typedef struct CONS_TypeEnumVal CONS_TypeEnumVal; -struct CONS_TypeEnumVal +typedef struct RADDBGIC_TypeEnumVal RADDBGIC_TypeEnumVal; +struct RADDBGIC_TypeEnumVal { - CONS_TypeEnumVal *next; + RADDBGIC_TypeEnumVal *next; String8 name; U64 val; }; -typedef struct CONS_Type CONS_Type; -struct CONS_Type +typedef struct RADDBGIC_Type RADDBGIC_Type; +struct RADDBGIC_Type { - CONS_Type *next_order; + RADDBGIC_Type *next_order; RADDBGI_TypeKind kind; U32 idx; U32 byte_size; @@ -210,221 +210,221 @@ struct CONS_Type U32 off; U32 count; String8 name; - CONS_Type *direct_type; - CONS_Type **param_types; - struct CONS_TypeUDT *udt; + RADDBGIC_Type *direct_type; + RADDBGIC_Type **param_types; + struct RADDBGIC_TypeUDT *udt; }; -typedef struct CONS_TypeUDT CONS_TypeUDT; -struct CONS_TypeUDT +typedef struct RADDBGIC_TypeUDT RADDBGIC_TypeUDT; +struct RADDBGIC_TypeUDT { - CONS_TypeUDT *next_order; + RADDBGIC_TypeUDT *next_order; U32 idx; - CONS_Type *self_type; - CONS_TypeMember *first_member; - CONS_TypeMember *last_member; + RADDBGIC_Type *self_type; + RADDBGIC_TypeMember *first_member; + RADDBGIC_TypeMember *last_member; U64 member_count; - CONS_TypeEnumVal *first_enum_val; - CONS_TypeEnumVal *last_enum_val; + RADDBGIC_TypeEnumVal *first_enum_val; + RADDBGIC_TypeEnumVal *last_enum_val; U64 enum_val_count; String8 source_path; U32 line; U32 col; }; -typedef struct CONS_TypeNode CONS_TypeNode; -struct CONS_TypeNode +typedef struct RADDBGIC_TypeNode RADDBGIC_TypeNode; +struct RADDBGIC_TypeNode { - CONS_TypeNode *next; - CONS_Type *type; + RADDBGIC_TypeNode *next; + RADDBGIC_Type *type; }; -typedef struct CONS_TypeList CONS_TypeList; -struct CONS_TypeList +typedef struct RADDBGIC_TypeList RADDBGIC_TypeList; +struct RADDBGIC_TypeList { - CONS_TypeNode *first; - CONS_TypeNode *last; + RADDBGIC_TypeNode *first; + RADDBGIC_TypeNode *last; U64 count; }; //////////////////////////////// //~ rjf: Symbol Info Types -typedef enum CONS_SymbolKind +typedef enum RADDBGIC_SymbolKind { - CONS_SymbolKind_NULL, - CONS_SymbolKind_GlobalVariable, - CONS_SymbolKind_ThreadVariable, - CONS_SymbolKind_Procedure, - CONS_SymbolKind_COUNT + RADDBGIC_SymbolKind_NULL, + RADDBGIC_SymbolKind_GlobalVariable, + RADDBGIC_SymbolKind_ThreadVariable, + RADDBGIC_SymbolKind_Procedure, + RADDBGIC_SymbolKind_COUNT } -CONS_SymbolKind; +RADDBGIC_SymbolKind; -typedef struct CONS_SymbolInfo CONS_SymbolInfo; -struct CONS_SymbolInfo +typedef struct RADDBGIC_SymbolInfo RADDBGIC_SymbolInfo; +struct RADDBGIC_SymbolInfo { - CONS_SymbolKind kind; + RADDBGIC_SymbolKind kind; String8 name; String8 link_name; - CONS_Type *type; + RADDBGIC_Type *type; B32 is_extern; U64 offset; // TODO(allen): should this actually be "container scope"? - struct CONS_Symbol *container_symbol; - CONS_Type *container_type; - struct CONS_Scope *root_scope; + struct RADDBGIC_Symbol *container_symbol; + RADDBGIC_Type *container_type; + struct RADDBGIC_Scope *root_scope; }; -typedef struct CONS_Symbol CONS_Symbol; -struct CONS_Symbol +typedef struct RADDBGIC_Symbol RADDBGIC_Symbol; +struct RADDBGIC_Symbol { - CONS_Symbol *next_order; + RADDBGIC_Symbol *next_order; U32 idx; - CONS_SymbolKind kind; + RADDBGIC_SymbolKind kind; String8 name; String8 link_name; - CONS_Type *type; + RADDBGIC_Type *type; B32 is_extern; B8 offset_is_set; U64 offset; - CONS_Symbol *container_symbol; - CONS_Type *container_type; - struct CONS_Scope *root_scope; + RADDBGIC_Symbol *container_symbol; + RADDBGIC_Type *container_type; + struct RADDBGIC_Scope *root_scope; }; //////////////////////////////// //~ rjf: Scope Info Types -typedef struct CONS_LocalInfo CONS_LocalInfo; -struct CONS_LocalInfo +typedef struct RADDBGIC_LocalInfo RADDBGIC_LocalInfo; +struct RADDBGIC_LocalInfo { RADDBGI_LocalKind kind; - struct CONS_Scope *scope; + struct RADDBGIC_Scope *scope; String8 name; - CONS_Type *type; + RADDBGIC_Type *type; }; -typedef struct CONS_Local CONS_Local; -struct CONS_Local +typedef struct RADDBGIC_Local RADDBGIC_Local; +struct RADDBGIC_Local { - CONS_Local *next; + RADDBGIC_Local *next; RADDBGI_LocalKind kind; String8 name; - CONS_Type *type; - struct CONS_LocationSet *locset; + RADDBGIC_Type *type; + struct RADDBGIC_LocationSet *locset; }; -typedef struct CONS_VOffRange CONS_VOffRange; -struct CONS_VOffRange +typedef struct RADDBGIC_VOffRange RADDBGIC_VOffRange; +struct RADDBGIC_VOffRange { - CONS_VOffRange *next; + RADDBGIC_VOffRange *next; U64 voff_first; U64 voff_opl; }; -typedef struct CONS_Scope CONS_Scope; -struct CONS_Scope +typedef struct RADDBGIC_Scope RADDBGIC_Scope; +struct RADDBGIC_Scope { - CONS_Scope *next_order; - CONS_Symbol *symbol; - CONS_Scope *parent_scope; - CONS_Scope *first_child; - CONS_Scope *last_child; - CONS_Scope *next_sibling; + RADDBGIC_Scope *next_order; + RADDBGIC_Symbol *symbol; + RADDBGIC_Scope *parent_scope; + RADDBGIC_Scope *first_child; + RADDBGIC_Scope *last_child; + RADDBGIC_Scope *next_sibling; U64 voff_base; - CONS_VOffRange *first_range; - CONS_VOffRange *last_range; + RADDBGIC_VOffRange *first_range; + RADDBGIC_VOffRange *last_range; U32 range_count; U32 idx; - CONS_Local *first_local; - CONS_Local *last_local; + RADDBGIC_Local *first_local; + RADDBGIC_Local *last_local; U32 local_count; }; //////////////////////////////// //~ rjf: Location Info Types -typedef struct CONS_EvalBytecodeOp CONS_EvalBytecodeOp; -struct CONS_EvalBytecodeOp +typedef struct RADDBGIC_EvalBytecodeOp RADDBGIC_EvalBytecodeOp; +struct RADDBGIC_EvalBytecodeOp { - CONS_EvalBytecodeOp *next; + RADDBGIC_EvalBytecodeOp *next; RADDBGI_EvalOp op; U32 p_size; U64 p; }; -typedef struct CONS_EvalBytecode CONS_EvalBytecode; -struct CONS_EvalBytecode +typedef struct RADDBGIC_EvalBytecode RADDBGIC_EvalBytecode; +struct RADDBGIC_EvalBytecode { - CONS_EvalBytecodeOp *first_op; - CONS_EvalBytecodeOp *last_op; + RADDBGIC_EvalBytecodeOp *first_op; + RADDBGIC_EvalBytecodeOp *last_op; U32 op_count; U32 encoded_size; }; -typedef struct CONS_Location CONS_Location; -struct CONS_Location +typedef struct RADDBGIC_Location RADDBGIC_Location; +struct RADDBGIC_Location { RADDBGI_LocationKind kind; U8 register_code; U16 offset; - CONS_EvalBytecode bytecode; + RADDBGIC_EvalBytecode bytecode; }; -typedef struct CONS_LocationCase CONS_LocationCase; -struct CONS_LocationCase +typedef struct RADDBGIC_LocationCase RADDBGIC_LocationCase; +struct RADDBGIC_LocationCase { - CONS_LocationCase *next; + RADDBGIC_LocationCase *next; U64 voff_first; U64 voff_opl; - CONS_Location *location; + RADDBGIC_Location *location; }; -typedef struct CONS_LocationSet CONS_LocationSet; -struct CONS_LocationSet +typedef struct RADDBGIC_LocationSet RADDBGIC_LocationSet; +struct RADDBGIC_LocationSet { - CONS_LocationCase *first_location_case; - CONS_LocationCase *last_location_case; + RADDBGIC_LocationCase *first_location_case; + RADDBGIC_LocationCase *last_location_case; U64 location_case_count; }; //////////////////////////////// //~ rjf: Name Map Types -typedef struct CONS_NameMapIdxNode CONS_NameMapIdxNode; -struct CONS_NameMapIdxNode +typedef struct RADDBGIC_NameMapIdxNode RADDBGIC_NameMapIdxNode; +struct RADDBGIC_NameMapIdxNode { - CONS_NameMapIdxNode *next; + RADDBGIC_NameMapIdxNode *next; U32 idx[8]; }; -typedef struct CONS_NameMapNode CONS_NameMapNode; -struct CONS_NameMapNode +typedef struct RADDBGIC_NameMapNode RADDBGIC_NameMapNode; +struct RADDBGIC_NameMapNode { - CONS_NameMapNode *bucket_next; - CONS_NameMapNode *order_next; + RADDBGIC_NameMapNode *bucket_next; + RADDBGIC_NameMapNode *order_next; String8 string; - CONS_NameMapIdxNode *idx_first; - CONS_NameMapIdxNode *idx_last; + RADDBGIC_NameMapIdxNode *idx_first; + RADDBGIC_NameMapIdxNode *idx_last; U64 idx_count; }; -typedef struct CONS_NameMap CONS_NameMap; -struct CONS_NameMap +typedef struct RADDBGIC_NameMap RADDBGIC_NameMap; +struct RADDBGIC_NameMap { - CONS_NameMapNode **buckets; + RADDBGIC_NameMapNode **buckets; U64 buckets_count; U64 bucket_collision_count; - CONS_NameMapNode *first; - CONS_NameMapNode *last; + RADDBGIC_NameMapNode *first; + RADDBGIC_NameMapNode *last; U64 name_count; }; //////////////////////////////// //~ rjf: Top-Level Debug Info Types -typedef struct CONS_TopLevelInfo CONS_TopLevelInfo; -struct CONS_TopLevelInfo +typedef struct RADDBGIC_TopLevelInfo RADDBGIC_TopLevelInfo; +struct RADDBGIC_TopLevelInfo { RADDBGI_Arch architecture; String8 exe_name; @@ -435,8 +435,8 @@ struct CONS_TopLevelInfo //////////////////////////////// //~ rjf: Root Construction Bundle Types -typedef struct CONS_RootParams CONS_RootParams; -struct CONS_RootParams +typedef struct RADDBGIC_RootParams RADDBGIC_RootParams; +struct RADDBGIC_RootParams { U64 addr_size; U32 bucket_count_units; // optional; default chosen if 0 @@ -447,11 +447,11 @@ struct CONS_RootParams U64 bucket_count_type_constructs; // optional; default chosen if 0 }; -typedef struct CONS_Root CONS_Root; -struct CONS_Root +typedef struct RADDBGIC_Root RADDBGIC_Root; +struct RADDBGIC_Root { Arena *arena; - CONS_ErrorList errors; + RADDBGIC_ErrorList errors; //////// Contextual Information @@ -461,68 +461,68 @@ struct CONS_Root // top level info B32 top_level_info_is_set; - CONS_TopLevelInfo top_level_info; + RADDBGIC_TopLevelInfo top_level_info; // binary layout - CONS_BinarySection *binary_section_first; - CONS_BinarySection *binary_section_last; + RADDBGIC_BinarySection *binary_section_first; + RADDBGIC_BinarySection *binary_section_last; U64 binary_section_count; // compilation units - CONS_Unit *unit_first; - CONS_Unit *unit_last; + RADDBGIC_Unit *unit_first; + RADDBGIC_Unit *unit_last; U64 unit_count; - CONS_UnitVMapRange *unit_vmap_range_first; - CONS_UnitVMapRange *unit_vmap_range_last; + RADDBGIC_UnitVMapRange *unit_vmap_range_first; + RADDBGIC_UnitVMapRange *unit_vmap_range_last; U64 unit_vmap_range_count; // types - CONS_Type *first_type; - CONS_Type *last_type; + RADDBGIC_Type *first_type; + RADDBGIC_Type *last_type; U64 type_count; - CONS_Type *nil_type; - CONS_Type *variadic_type; + RADDBGIC_Type *nil_type; + RADDBGIC_Type *variadic_type; - CONS_Type handled_nil_type; + RADDBGIC_Type handled_nil_type; - CONS_TypeUDT *first_udt; - CONS_TypeUDT *last_udt; + RADDBGIC_TypeUDT *first_udt; + RADDBGIC_TypeUDT *last_udt; U64 type_udt_count; U64 total_member_count; U64 total_enum_val_count; // symbols - CONS_Symbol *first_symbol; - CONS_Symbol *last_symbol; + RADDBGIC_Symbol *first_symbol; + RADDBGIC_Symbol *last_symbol; union{ U64 symbol_count; - U64 symbol_kind_counts[CONS_SymbolKind_COUNT]; + U64 symbol_kind_counts[RADDBGIC_SymbolKind_COUNT]; }; - CONS_Scope *first_scope; - CONS_Scope *last_scope; + RADDBGIC_Scope *first_scope; + RADDBGIC_Scope *last_scope; U64 scope_count; U64 scope_voff_count; - CONS_Local *first_local; - CONS_Local *last_local; + RADDBGIC_Local *first_local; + RADDBGIC_Local *last_local; U64 local_count; U64 location_count; // name maps - CONS_NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; + RADDBGIC_NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; //////// Handle Relationship Maps - CONS_U64ToPtrMap unit_map; - CONS_U64ToPtrMap symbol_map; - CONS_U64ToPtrMap scope_map; - CONS_U64ToPtrMap local_map; - CONS_U64ToPtrMap type_from_id_map; - CONS_Str8ToPtrMap construct_map; + RADDBGIC_U64ToPtrMap unit_map; + RADDBGIC_U64ToPtrMap symbol_map; + RADDBGIC_U64ToPtrMap scope_map; + RADDBGIC_U64ToPtrMap local_map; + RADDBGIC_U64ToPtrMap type_from_id_map; + RADDBGIC_Str8ToPtrMap construct_map; }; //////////////////////////////// @@ -530,41 +530,41 @@ struct CONS_Root //- rjf: bake data section data structure -typedef struct CONS_DSectionNode CONS_DSectionNode; -struct CONS_DSectionNode +typedef struct RADDBGIC_DSectionNode RADDBGIC_DSectionNode; +struct RADDBGIC_DSectionNode { - CONS_DSectionNode *next; + RADDBGIC_DSectionNode *next; void *data; U64 size; RADDBGI_DataSectionTag tag; }; -typedef struct CONS_DSections CONS_DSections; -struct CONS_DSections +typedef struct RADDBGIC_DSections RADDBGIC_DSections; +struct RADDBGIC_DSections { - CONS_DSectionNode *first; - CONS_DSectionNode *last; + RADDBGIC_DSectionNode *first; + RADDBGIC_DSectionNode *last; U32 count; }; //- rjf: bake string data structure -typedef struct CONS_StringNode CONS_StringNode; -struct CONS_StringNode +typedef struct RADDBGIC_StringNode RADDBGIC_StringNode; +struct RADDBGIC_StringNode { - CONS_StringNode *order_next; - CONS_StringNode *bucket_next; + RADDBGIC_StringNode *order_next; + RADDBGIC_StringNode *bucket_next; String8 str; U64 hash; U32 idx; }; -typedef struct CONS_Strings CONS_Strings; -struct CONS_Strings +typedef struct RADDBGIC_Strings RADDBGIC_Strings; +struct RADDBGIC_Strings { - CONS_StringNode *order_first; - CONS_StringNode *order_last; - CONS_StringNode **buckets; + RADDBGIC_StringNode *order_first; + RADDBGIC_StringNode *order_last; + RADDBGIC_StringNode **buckets; U64 buckets_count; U64 bucket_collision_count; U32 count; @@ -572,23 +572,23 @@ struct CONS_Strings //- rjf: index run baking data structure -typedef struct CONS_IdxRunNode CONS_IdxRunNode; -struct CONS_IdxRunNode +typedef struct RADDBGIC_IdxRunNode RADDBGIC_IdxRunNode; +struct RADDBGIC_IdxRunNode { - CONS_IdxRunNode *order_next; - CONS_IdxRunNode *bucket_next; + RADDBGIC_IdxRunNode *order_next; + RADDBGIC_IdxRunNode *bucket_next; U32 *idx_run; U64 hash; U32 count; U32 first_idx; }; -typedef struct CONS_IdxRuns CONS_IdxRuns; -struct CONS_IdxRuns +typedef struct RADDBGIC_IdxRuns RADDBGIC_IdxRuns; +struct RADDBGIC_IdxRuns { - CONS_IdxRunNode *order_first; - CONS_IdxRunNode *order_last; - CONS_IdxRunNode **buckets; + RADDBGIC_IdxRunNode *order_first; + RADDBGIC_IdxRunNode *order_last; + RADDBGIC_IdxRunNode **buckets; U64 buckets_count; U64 bucket_collision_count; U32 count; @@ -597,38 +597,38 @@ struct CONS_IdxRuns //- rjf: source file & file path baking data structures -typedef struct CONS_PathNode CONS_PathNode; -struct CONS_PathNode +typedef struct RADDBGIC_PathNode RADDBGIC_PathNode; +struct RADDBGIC_PathNode { - CONS_PathNode *next_order; - CONS_PathNode *parent; - CONS_PathNode *first_child; - CONS_PathNode *last_child; - CONS_PathNode *next_sibling; + RADDBGIC_PathNode *next_order; + RADDBGIC_PathNode *parent; + RADDBGIC_PathNode *first_child; + RADDBGIC_PathNode *last_child; + RADDBGIC_PathNode *next_sibling; String8 name; - struct CONS_SrcNode *src_file; + struct RADDBGIC_SrcNode *src_file; U32 idx; }; -typedef struct CONS_LineMapFragment CONS_LineMapFragment; -struct CONS_LineMapFragment +typedef struct RADDBGIC_LineMapFragment RADDBGIC_LineMapFragment; +struct RADDBGIC_LineMapFragment { - CONS_LineMapFragment *next; - CONS_LineSequenceNode *sequence; + RADDBGIC_LineMapFragment *next; + RADDBGIC_LineSequenceNode *sequence; }; -typedef struct CONS_SrcNode CONS_SrcNode; -struct CONS_SrcNode +typedef struct RADDBGIC_SrcNode RADDBGIC_SrcNode; +struct RADDBGIC_SrcNode { - CONS_SrcNode *next; - CONS_PathNode *path_node; + RADDBGIC_SrcNode *next; + RADDBGIC_PathNode *path_node; U32 idx; String8 normal_full_path; // place to gather the line info attached to this src file - CONS_LineMapFragment *first_fragment; - CONS_LineMapFragment *last_fragment; + RADDBGIC_LineMapFragment *first_fragment; + RADDBGIC_LineMapFragment *last_fragment; // place to put the final baked version of this file's line map U32 line_map_nums_data_idx; @@ -637,22 +637,22 @@ struct CONS_SrcNode U32 line_map_voff_data_idx; }; -typedef struct CONS_PathTree CONS_PathTree; -struct CONS_PathTree +typedef struct RADDBGIC_PathTree RADDBGIC_PathTree; +struct RADDBGIC_PathTree { - CONS_PathNode *first; - CONS_PathNode *last; + RADDBGIC_PathNode *first; + RADDBGIC_PathNode *last; U32 count; - CONS_PathNode root; - CONS_SrcNode *src_first; - CONS_SrcNode *src_last; + RADDBGIC_PathNode root; + RADDBGIC_SrcNode *src_first; + RADDBGIC_SrcNode *src_last; U32 src_count; }; //- rjf: line info baking data structures -typedef struct CONS_LineRec CONS_LineRec; -struct CONS_LineRec +typedef struct RADDBGIC_LineRec RADDBGIC_LineRec; +struct RADDBGIC_LineRec { U32 file_id; U32 line_num; @@ -660,8 +660,8 @@ struct CONS_LineRec U16 col_opl; }; -typedef struct CONS_UnitLinesCombined CONS_UnitLinesCombined; -struct CONS_UnitLinesCombined +typedef struct RADDBGIC_UnitLinesCombined RADDBGIC_UnitLinesCombined; +struct RADDBGIC_UnitLinesCombined { U64 *voffs; RADDBGI_Line *lines; @@ -669,8 +669,8 @@ struct CONS_UnitLinesCombined U32 line_count; }; -typedef struct CONS_SrcLinesCombined CONS_SrcLinesCombined; -struct CONS_SrcLinesCombined +typedef struct RADDBGIC_SrcLinesCombined RADDBGIC_SrcLinesCombined; +struct RADDBGIC_SrcLinesCombined { U32 *line_nums; U32 *line_ranges; @@ -679,51 +679,51 @@ struct CONS_SrcLinesCombined U32 voff_count; }; -typedef struct CONS_SrcLineMapVoffBlock CONS_SrcLineMapVoffBlock; -struct CONS_SrcLineMapVoffBlock +typedef struct RADDBGIC_SrcLineMapVoffBlock RADDBGIC_SrcLineMapVoffBlock; +struct RADDBGIC_SrcLineMapVoffBlock { - CONS_SrcLineMapVoffBlock *next; + RADDBGIC_SrcLineMapVoffBlock *next; U64 voff; }; -typedef struct CONS_SrcLineMapBucket CONS_SrcLineMapBucket; -struct CONS_SrcLineMapBucket +typedef struct RADDBGIC_SrcLineMapBucket RADDBGIC_SrcLineMapBucket; +struct RADDBGIC_SrcLineMapBucket { - CONS_SrcLineMapBucket *order_next; - CONS_SrcLineMapBucket *hash_next; + RADDBGIC_SrcLineMapBucket *order_next; + RADDBGIC_SrcLineMapBucket *hash_next; U32 line_num; - CONS_SrcLineMapVoffBlock *first_voff_block; - CONS_SrcLineMapVoffBlock *last_voff_block; + RADDBGIC_SrcLineMapVoffBlock *first_voff_block; + RADDBGIC_SrcLineMapVoffBlock *last_voff_block; U64 voff_count; }; //- rjf: vmap baking data structure -typedef struct CONS_VMap CONS_VMap; -struct CONS_VMap +typedef struct RADDBGIC_VMap RADDBGIC_VMap; +struct RADDBGIC_VMap { RADDBGI_VMapEntry *vmap; // [count + 1] U32 count; }; -typedef struct CONS_VMapMarker CONS_VMapMarker; -struct CONS_VMapMarker +typedef struct RADDBGIC_VMapMarker RADDBGIC_VMapMarker; +struct RADDBGIC_VMapMarker { U32 idx; U32 begin_range; }; -typedef struct CONS_VMapRangeTracker CONS_VMapRangeTracker; -struct CONS_VMapRangeTracker +typedef struct RADDBGIC_VMapRangeTracker RADDBGIC_VMapRangeTracker; +struct RADDBGIC_VMapRangeTracker { - CONS_VMapRangeTracker *next; + RADDBGIC_VMapRangeTracker *next; U32 idx; }; //- rjf: type data baking types -typedef struct CONS_TypeData CONS_TypeData; -struct CONS_TypeData +typedef struct RADDBGIC_TypeData RADDBGIC_TypeData; +struct RADDBGIC_TypeData { RADDBGI_TypeNode *type_nodes; U32 type_node_count; @@ -740,13 +740,13 @@ struct CONS_TypeData //- rjf: symbol data baking types -typedef struct CONS_SymbolData CONS_SymbolData; -struct CONS_SymbolData +typedef struct RADDBGIC_SymbolData RADDBGIC_SymbolData; +struct RADDBGIC_SymbolData { RADDBGI_GlobalVariable *global_variables; U32 global_variable_count; - CONS_VMap *global_vmap; + RADDBGIC_VMap *global_vmap; RADDBGI_ThreadVariable *thread_variables; U32 thread_variable_count; @@ -760,7 +760,7 @@ struct CONS_SymbolData U64 *scope_voffs; U32 scope_voff_count; - CONS_VMap *scope_vmap; + RADDBGIC_VMap *scope_vmap; RADDBGI_Local *locals; U32 local_count; @@ -774,23 +774,23 @@ struct CONS_SymbolData //- rjf: name map baking types -typedef struct CONS_NameMapSemiNode CONS_NameMapSemiNode; -struct CONS_NameMapSemiNode +typedef struct RADDBGIC_NameMapSemiNode RADDBGIC_NameMapSemiNode; +struct RADDBGIC_NameMapSemiNode { - CONS_NameMapSemiNode *next; - CONS_NameMapNode *node; + RADDBGIC_NameMapSemiNode *next; + RADDBGIC_NameMapNode *node; }; -typedef struct CONS_NameMapSemiBucket CONS_NameMapSemiBucket; -struct CONS_NameMapSemiBucket +typedef struct RADDBGIC_NameMapSemiBucket RADDBGIC_NameMapSemiBucket; +struct RADDBGIC_NameMapSemiBucket { - CONS_NameMapSemiNode *first; - CONS_NameMapSemiNode *last; + RADDBGIC_NameMapSemiNode *first; + RADDBGIC_NameMapSemiNode *last; U64 count; }; -typedef struct CONS_NameMapBaked CONS_NameMapBaked; -struct CONS_NameMapBaked +typedef struct RADDBGIC_NameMapBaked RADDBGIC_NameMapBaked; +struct RADDBGIC_NameMapBaked { RADDBGI_NameMapBucket *buckets; RADDBGI_NameMapNode *nodes; @@ -800,198 +800,198 @@ struct CONS_NameMapBaked //- rjf: bundle baking context type -typedef struct CONS_BakeParams CONS_BakeParams; -struct CONS_BakeParams +typedef struct RADDBGIC_BakeParams RADDBGIC_BakeParams; +struct RADDBGIC_BakeParams { U64 strings_bucket_count; U64 idx_runs_bucket_count; }; -typedef struct CONS_BakeCtx CONS_BakeCtx; -struct CONS_BakeCtx +typedef struct RADDBGIC_BakeCtx RADDBGIC_BakeCtx; +struct RADDBGIC_BakeCtx { Arena *arena; - CONS_Strings strs; - CONS_IdxRuns idxs; - CONS_PathTree *tree; + RADDBGIC_Strings strs; + RADDBGIC_IdxRuns idxs; + RADDBGIC_PathTree *tree; }; //////////////////////////////// //~ rjf: Basic Type Helpers //- rjf: type lists -static void cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type); +static void raddbgic_type_list_push(Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type); //- rjf: bytecode lists -static void cons_bytecode_push_op(Arena *arena, CONS_EvalBytecode *bytecode, RADDBGI_EvalOp op, U64 p); -static void cons_bytecode_push_uconst(Arena *arena, CONS_EvalBytecode *bytecode, U64 x); -static void cons_bytecode_push_sconst(Arena *arena, CONS_EvalBytecode *bytecode, S64 x); -static void cons_bytecode_concat_in_place(CONS_EvalBytecode *left_dst, CONS_EvalBytecode *right_destroyed); +static void raddbgic_bytecode_push_op(Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_EvalOp op, U64 p); +static void raddbgic_bytecode_push_uconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, U64 x); +static void raddbgic_bytecode_push_sconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, S64 x); +static void raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_EvalBytecode *right_destroyed); //- rjf: sortable range sorting -static CONS_SortKey* cons_sort_key_array(Arena *arena, CONS_SortKey *keys, U64 count); +static RADDBGIC_SortKey* raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count); //////////////////////////////// //~ rjf: Auxiliary Data Structure Functions //- rjf: u64 -> ptr map -static void cons_u64toptr_init(Arena *arena, CONS_U64ToPtrMap *map, U64 bucket_count); -static void cons_u64toptr_lookup(CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLookup *lookup_out); -static void cons_u64toptr_insert(Arena *arena, CONS_U64ToPtrMap *map, U64 key, U64 hash, CONS_U64ToPtrLookup *lookup, void *ptr); +static void raddbgic_u64toptr_init(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 bucket_count); +static void raddbgic_u64toptr_lookup(RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_U64ToPtrLookup *lookup_out); +static void raddbgic_u64toptr_insert(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_U64ToPtrLookup *lookup, void *ptr); //- rjf: string8 -> ptr map -static void cons_str8toptr_init(Arena *arena, CONS_Str8ToPtrMap *map, U64 bucket_count); -static void*cons_str8toptr_lookup(CONS_Str8ToPtrMap *map, String8 key, U64 hash); -static void cons_str8toptr_insert(Arena *arena, CONS_Str8ToPtrMap *map, String8 key, U64 hash, void *ptr); +static void raddbgic_str8toptr_init(Arena *arena, RADDBGIC_Str8ToPtrMap *map, U64 bucket_count); +static void*raddbgic_str8toptr_lookup(RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash); +static void raddbgic_str8toptr_insert(Arena *arena, RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash, void *ptr); //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions //- rjf: root creation -static CONS_Root* cons_root_new(CONS_RootParams *params); -static void cons_root_release(CONS_Root *root); +static RADDBGIC_Root* raddbgic_root_new(RADDBGIC_RootParams *params); +static void raddbgic_root_release(RADDBGIC_Root *root); //- rjf: error accumulation -static void cons_error(CONS_Root *root, String8 string); -static void cons_errorf(CONS_Root *root, char *fmt, ...); -static CONS_Error* cons_get_first_error(CONS_Root *root); +static void raddbgic_error(RADDBGIC_Root *root, String8 string); +static void raddbgic_errorf(RADDBGIC_Root *root, char *fmt, ...); +static RADDBGIC_Error* raddbgic_get_first_error(RADDBGIC_Root *root); //- rjf: top-level info specification -static void cons_set_top_level_info(CONS_Root *root, CONS_TopLevelInfo *tli); +static void raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli); //- rjf: binary section building -static void cons_add_binary_section(CONS_Root *root, - String8 name, RADDBGI_BinarySectionFlags flags, - U64 voff_first, U64 voff_opl, U64 foff_first, - U64 foff_opl); +static void raddbgic_add_binary_section(RADDBGIC_Root *root, + String8 name, RADDBGI_BinarySectionFlags flags, + U64 voff_first, U64 voff_opl, U64 foff_first, + U64 foff_opl); //- rjf: unit info building -static CONS_Unit* cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id, U64 unit_user_id_hash); -static void cons_unit_set_info(CONS_Root *root, CONS_Unit *unit, CONS_UnitInfo *info); -static void cons_unit_add_line_sequence(CONS_Root *root, CONS_Unit *unit, - CONS_LineSequence *line_sequence); -static void cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl); +static RADDBGIC_Unit* raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, U64 unit_user_id, U64 unit_user_id_hash); +static void raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitInfo *info); +static void raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, + RADDBGIC_LineSequence *line_sequence); +static void raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, U64 first, U64 opl); //- rjf: type info lookups/reservations -static CONS_Type* cons_type_from_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash); -static CONS_Reservation* cons_type_reserve_id(CONS_Root *root, U64 type_user_id, U64 type_user_id_hash); -static void cons_type_fill_id(CONS_Root *root, CONS_Reservation *res, CONS_Type *type); +static RADDBGIC_Type* raddbgic_type_from_id(RADDBGIC_Root *root, U64 type_user_id, U64 type_user_id_hash); +static RADDBGIC_Reservation* raddbgic_type_reserve_id(RADDBGIC_Root *root, U64 type_user_id, U64 type_user_id_hash); +static void raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_Type *type); //- rjf: nil/singleton types -static B32 cons_type_is_unhandled_nil(CONS_Root *root, CONS_Type *type); -static CONS_Type* cons_type_handled_nil(CONS_Root *root); -static CONS_Type* cons_type_nil(CONS_Root *root); -static CONS_Type* cons_type_variadic(CONS_Root *root); +static B32 raddbgic_type_is_unhandled_nil(RADDBGIC_Root *root, RADDBGIC_Type *type); +static RADDBGIC_Type* raddbgic_type_handled_nil(RADDBGIC_Root *root); +static RADDBGIC_Type* raddbgic_type_nil(RADDBGIC_Root *root); +static RADDBGIC_Type* raddbgic_type_variadic(RADDBGIC_Root *root); //- rjf: base type info constructors -static CONS_Type* cons_type_new(CONS_Root *root); -static CONS_TypeUDT* cons_type_udt_from_any_type(CONS_Root *root, CONS_Type *type); -static CONS_TypeUDT* cons_type_udt_from_record_type(CONS_Root *root, CONS_Type *type); +static RADDBGIC_Type* raddbgic_type_new(RADDBGIC_Root *root); +static RADDBGIC_TypeUDT* raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type); +static RADDBGIC_TypeUDT* raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type); //- rjf: basic/operator type construction helpers -static CONS_Type* cons_type_basic(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name); -static CONS_Type* cons_type_modifier(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeModifierFlags flags); -static CONS_Type* cons_type_bitfield(CONS_Root *root, CONS_Type *direct_type, U32 bit_off, U32 bit_count); -static CONS_Type* cons_type_pointer(CONS_Root *root, CONS_Type *direct_type, RADDBGI_TypeKind ptr_type_kind); -static CONS_Type* cons_type_array(CONS_Root *root, CONS_Type *direct_type, U64 count); -static CONS_Type* cons_type_proc(CONS_Root *root, CONS_Type *return_type, struct CONS_TypeList *params); -static CONS_Type* cons_type_method(CONS_Root *root, CONS_Type *this_type, CONS_Type *return_type, struct CONS_TypeList *params); +static RADDBGIC_Type* raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name); +static RADDBGIC_Type* raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeModifierFlags flags); +static RADDBGIC_Type* raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U32 bit_off, U32 bit_count); +static RADDBGIC_Type* raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeKind ptr_type_kind); +static RADDBGIC_Type* raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U64 count); +static RADDBGIC_Type* raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params); +static RADDBGIC_Type* raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params); //- rjf: udt type constructors -static CONS_Type* cons_type_udt(CONS_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, U64 size); -static CONS_Type* cons_type_enum(CONS_Root *root, CONS_Type *direct_type, String8 name); -static CONS_Type* cons_type_alias(CONS_Root *root, CONS_Type *direct_type, String8 name); -static CONS_Type* cons_type_incomplete(CONS_Root *root, RADDBGI_TypeKind type_kind, String8 name); +static RADDBGIC_Type* raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, U64 size); +static RADDBGIC_Type* raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name); +static RADDBGIC_Type* raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name); +static RADDBGIC_Type* raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name); //- rjf: type member building -static void cons_type_add_member_data_field(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type, U32 off); -static void cons_type_add_member_static_data(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type); -static void cons_type_add_member_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type); -static void cons_type_add_member_static_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type); -static void cons_type_add_member_virtual_method(CONS_Root *root, CONS_Type *record_type, String8 name, CONS_Type *mem_type); -static void cons_type_add_member_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 off); -static void cons_type_add_member_virtual_base(CONS_Root *root, CONS_Type *record_type, CONS_Type *base_type, U32 vptr_off, U32 vtable_off); -static void cons_type_add_member_nested_type(CONS_Root *root, CONS_Type *record_type, CONS_Type *nested_type); -static void cons_type_add_enum_val(CONS_Root *root, CONS_Type *enum_type, String8 name, U64 val); +static void raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type, U32 off); +static void raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type); +static void raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type); +static void raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type); +static void raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type); +static void raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, U32 off); +static void raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, U32 vptr_off, U32 vtable_off); +static void raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *nested_type); +static void raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, String8 name, U64 val); //- rjf: type source coordinate specifications -static void cons_type_set_source_coordinates(CONS_Root *root, CONS_Type *defined_type, String8 source_path, U32 line, U32 col); +static void raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, String8 source_path, U32 line, U32 col); //- rjf: symbol info building -static CONS_Symbol* cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash); -static void cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info); +static RADDBGIC_Symbol* raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash); +static void raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_SymbolInfo *info); //- rjf: scope info building -static CONS_Scope *cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id, U64 scope_user_id_hash); -static void cons_scope_set_parent(CONS_Root *root, CONS_Scope *scope, CONS_Scope *parent); -static void cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U64 voff_opl); -static void cons_scope_recursive_set_symbol(CONS_Scope *scope, CONS_Symbol *symbol); +static RADDBGIC_Scope *raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, U64 scope_user_id, U64 scope_user_id_hash); +static void raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_Scope *parent); +static void raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, U64 voff_first, U64 voff_opl); +static void raddbgic_scope_recursive_set_symbol(RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); //- rjf: local info building -static CONS_Local* cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id, U64 local_user_id_hash); -static void cons_local_set_basic_info(CONS_Root *root, CONS_Local *local, CONS_LocalInfo *info); -static CONS_LocationSet* cons_location_set_from_local(CONS_Root *root, CONS_Local *local); +static RADDBGIC_Local* raddbgic_local_handle_from_user_id(RADDBGIC_Root *root, U64 local_user_id, U64 local_user_id_hash); +static void raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBGIC_LocalInfo *info); +static RADDBGIC_LocationSet* raddbgic_location_set_from_local(RADDBGIC_Root *root, RADDBGIC_Local *local); //- rjf: location info building -static void cons_location_set_add_case(CONS_Root *root, CONS_LocationSet *locset, U64 voff_first, U64 voff_opl, CONS_Location *location); -static CONS_Location* cons_location_addr_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode); -static CONS_Location* cons_location_val_bytecode_stream(CONS_Root *root, struct CONS_EvalBytecode *bytecode); -static CONS_Location* cons_location_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset); -static CONS_Location* cons_location_addr_addr_reg_plus_u16(CONS_Root *root, U8 reg_code, U16 offset); -static CONS_Location* cons_location_val_reg(CONS_Root *root, U8 reg_code); +static void raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset, U64 voff_first, U64 voff_opl, RADDBGIC_Location *location); +static RADDBGIC_Location* raddbgic_location_addr_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode); +static RADDBGIC_Location* raddbgic_location_val_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode); +static RADDBGIC_Location* raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, U8 reg_code, U16 offset); +static RADDBGIC_Location* raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, U8 reg_code, U16 offset); +static RADDBGIC_Location* raddbgic_location_val_reg(RADDBGIC_Root *root, U8 reg_code); //- rjf: name map building -static CONS_NameMap* cons_name_map_for_kind(CONS_Root *root, RADDBGI_NameMapKind kind); -static void cons_name_map_add_pair(CONS_Root *root, CONS_NameMap *map, String8 name, U32 idx); +static RADDBGIC_NameMap* raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind); +static void raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 name, U32 idx); //////////////////////////////// //~ rjf: Debug Info Baking (Loose -> Tight) Functions //- rjf: bake context construction -static CONS_BakeCtx* cons_bake_ctx_begin(CONS_BakeParams *params); -static void cons_bake_ctx_release(CONS_BakeCtx *bake_ctx); +static RADDBGIC_BakeCtx* raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params); +static void raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx); //- rjf: string baking -static U32 cons_string(CONS_BakeCtx *bctx, String8 str); +static U32 raddbgic_string(RADDBGIC_BakeCtx *bctx, String8 str); //- rjf: idx run baking -static U64 cons_idx_run_hash(U32 *idx_run, U32 count); -static U32 cons_idx_run(CONS_BakeCtx *bctx, U32 *idx_run, U32 count); +static U64 raddbgic_idx_run_hash(U32 *idx_run, U32 count); +static U32 raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, U32 *idx_run, U32 count); //- rjf: data section baking -static U32 cons_dsection(Arena *arena, CONS_DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag); +static U32 raddbgic_dsection(Arena *arena, RADDBGIC_DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag); //- rjf: paths baking -static String8 cons_normal_string_from_path_node(Arena *arena, CONS_PathNode *node); -static void cons_normal_string_from_path_node_build(Arena *arena, CONS_PathNode *node, String8List *out); -static CONS_PathNode* cons_paths_new_node(CONS_BakeCtx *bctx); -static CONS_PathNode* cons_paths_sub_path(CONS_BakeCtx *bctx, CONS_PathNode *dir, String8 sub_dir); -static CONS_PathNode* cons_paths_node_from_path(CONS_BakeCtx *bctx, String8 path); -static U32 cons_paths_idx_from_path(CONS_BakeCtx *bctx, String8 path); -static CONS_SrcNode* cons_paths_new_src_node(CONS_BakeCtx *bctx); -static CONS_SrcNode* cons_paths_src_node_from_path_node(CONS_BakeCtx *bctx, CONS_PathNode *path_node); +static String8 raddbgic_normal_string_from_path_node(Arena *arena, RADDBGIC_PathNode *node); +static void raddbgic_normal_string_from_path_node_build(Arena *arena, RADDBGIC_PathNode *node, String8List *out); +static RADDBGIC_PathNode* raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx); +static RADDBGIC_PathNode* raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, String8 sub_dir); +static RADDBGIC_PathNode* raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, String8 path); +static U32 raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, String8 path); +static RADDBGIC_SrcNode* raddbgic_paths_new_src_node(RADDBGIC_BakeCtx *bctx); +static RADDBGIC_SrcNode* raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *path_node); //- rjf: per-unit line info baking -static CONS_UnitLinesCombined* cons_unit_combine_lines(Arena *arena, CONS_BakeCtx *bctx, CONS_LineSequenceNode *first_seq); +static RADDBGIC_UnitLinesCombined* raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq); //- rjf: per-src line info baking -static CONS_SrcLinesCombined* cons_source_combine_lines(Arena *arena, CONS_LineMapFragment *first); +static RADDBGIC_SrcLinesCombined* raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first); //- rjf: vmap baking -static CONS_VMap* cons_vmap_from_markers(Arena *arena, CONS_VMapMarker *markers, CONS_SortKey *keys, U64 marker_count); -static CONS_VMap* cons_vmap_from_unit_ranges(Arena *arena, CONS_UnitVMapRange *first, U64 count); +static RADDBGIC_VMap* raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, U64 marker_count); +static RADDBGIC_VMap* raddbgic_vmap_from_unit_ranges(Arena *arena, RADDBGIC_UnitVMapRange *first, U64 count); //- rjf: type info baking -static U32* cons_idx_run_from_types(Arena *arena, CONS_Type **types, U32 count); -static CONS_TypeData* cons_type_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx); +static U32* raddbgic_idx_run_from_types(Arena *arena, RADDBGIC_Type **types, U32 count); +static RADDBGIC_TypeData* raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx); //- rjf: symbol data baking -static CONS_SymbolData* cons_symbol_data_combine(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx); +static RADDBGIC_SymbolData* raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx); //- rjf: name map baking -static CONS_NameMapBaked* cons_name_map_bake(Arena *arena, CONS_Root *root, CONS_BakeCtx *bctx, CONS_NameMap *map); +static RADDBGIC_NameMapBaked* raddbgic_name_map_bake(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map); //- rjf: top-level baking entry point -static void cons_bake_file(Arena *arena, CONS_Root *root, String8List *out); +static void raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out); #endif // RADDBGI_CONS_H diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c index 84347d2a..5a36f3d0 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c @@ -139,7 +139,7 @@ pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ //- rjf: pdb conversion context creation static PDBCONV_Ctx * -pdbconv_ctx_alloc(PDBCONV_CtxParams *params, CONS_Root *out_root) +pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root) { Arena *arena = arena_alloc(); PDBCONV_Ctx *pdb_ctx = push_array(arena, PDBCONV_Ctx, 1); @@ -193,7 +193,7 @@ pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num){ U64 n_u64 = cv_u64_from_numeric(num); U32 n_u32 = (U32)n_u64; if (n_u64 > 0xFFFFFFFF){ - cons_errorf(ctx->root, "constant too large"); + raddbgic_errorf(ctx->root, "constant too large"); n_u32 = 0; } return(n_u32); @@ -219,9 +219,9 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ // setup variadic itype -> node ProfScope("setup variadic itype -> node") { - CONS_Type *variadic_type = cons_type_variadic(ctx->root); - CONS_Reservation *res = cons_type_reserve_id(ctx->root, CV_TypeId_Variadic, CV_TypeId_Variadic); - cons_type_fill_id(ctx->root, res, variadic_type); + RADDBGIC_Type *variadic_type = raddbgic_type_variadic(ctx->root); + RADDBGIC_Reservation *res = raddbgic_type_reserve_id(ctx->root, CV_TypeId_Variadic, CV_TypeId_Variadic); + raddbgic_type_fill_id(ctx->root, res, variadic_type); } // resolve forward references @@ -414,7 +414,7 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ return(result); } -static CONS_Type* +static RADDBGIC_Type* pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ B32 is_basic = (itype < 0x1000); @@ -429,7 +429,7 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ } // type handle from id - CONS_Type *result = cons_type_from_id(ctx->root, itype, itype); + RADDBGIC_Type *result = raddbgic_type_from_id(ctx->root, itype, itype); // basic type if(result == 0 && is_basic) @@ -446,14 +446,14 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ // never return null, return "nil" instead if(result == 0) { - result = cons_type_nil(ctx->root); + result = raddbgic_type_nil(ctx->root); } return(result); } static void -pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId field_itype){ +pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype){ Temp scratch = scratch_begin(0, 0); String8 data = ctx->leaf->data; @@ -554,9 +554,9 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi list_item_opl_off = name_off + name.size + 1; // emit member - CONS_Type *mem_type = pdbconv_type_resolve_itype(ctx, member->itype); + RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, member->itype); U32 offset_u32 = pdbconv_u32_from_numeric(ctx, &offset); - cons_type_add_member_data_field(ctx->root, owner_type, name, mem_type, offset_u32); + raddbgic_type_add_member_data_field(ctx->root, owner_type, name, mem_type, offset_u32); } }break; @@ -575,8 +575,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi // TODO(allen): handle attribs // emit member - CONS_Type *mem_type = pdbconv_type_resolve_itype(ctx, stmember->itype); - cons_type_add_member_static_data(ctx->root, owner_type, name, mem_type); + RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, stmember->itype); + raddbgic_type_add_member_static_data(ctx->root, owner_type, name, mem_type); } }break; @@ -654,17 +654,17 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi // TODO(allen): handle attribs // emit - CONS_Type *mem_type = pdbconv_type_resolve_itype(ctx, method->itype); + RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, method->itype); switch (prop){ default: { - cons_type_add_member_method(ctx->root, owner_type, name, mem_type); + raddbgic_type_add_member_method(ctx->root, owner_type, name, mem_type); }break; case CV_MethodProp_Static: { - cons_type_add_member_static_method(ctx->root, owner_type, name, mem_type); + raddbgic_type_add_member_static_method(ctx->root, owner_type, name, mem_type); }break; case CV_MethodProp_Virtual: @@ -672,7 +672,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - cons_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); + raddbgic_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); }break; } } @@ -705,17 +705,17 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi // TODO(allen): handle attribs // emit - CONS_Type *mem_type = pdbconv_type_resolve_itype(ctx, one_method->itype); + RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, one_method->itype); switch (prop){ default: { - cons_type_add_member_method(ctx->root, owner_type, name, mem_type); + raddbgic_type_add_member_method(ctx->root, owner_type, name, mem_type); }break; case CV_MethodProp_Static: { - cons_type_add_member_static_method(ctx->root, owner_type, name, mem_type); + raddbgic_type_add_member_static_method(ctx->root, owner_type, name, mem_type); }break; case CV_MethodProp_Virtual: @@ -723,7 +723,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - cons_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); + raddbgic_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); }break; } } @@ -742,8 +742,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi list_item_opl_off = name_off + name.size + 1; // emit member - CONS_Type *mem_type = pdbconv_type_resolve_itype(ctx, nest_type->itype); - cons_type_add_member_nested_type(ctx->root, owner_type, mem_type); + RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, nest_type->itype); + raddbgic_type_add_member_nested_type(ctx->root, owner_type, mem_type); } }break; @@ -762,8 +762,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi // TODO(allen): handle attribs // emit member - CONS_Type *mem_type = pdbconv_type_resolve_itype(ctx, nest_type->itype); - cons_type_add_member_nested_type(ctx->root, owner_type, mem_type); + RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, nest_type->itype); + raddbgic_type_add_member_nested_type(ctx->root, owner_type, mem_type); } }break; @@ -782,9 +782,9 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi // TODO(allen): handle attribs // emit member - CONS_Type *base_type = pdbconv_type_resolve_itype(ctx, bclass->itype); + RADDBGIC_Type *base_type = pdbconv_type_resolve_itype(ctx, bclass->itype); U32 offset_u32 = pdbconv_u32_from_numeric(ctx, &offset); - cons_type_add_member_base(ctx->root, owner_type, base_type, offset_u32); + raddbgic_type_add_member_base(ctx->root, owner_type, base_type, offset_u32); } }break; @@ -807,11 +807,11 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi // TODO(allen): handle attribs // emit member - CONS_Type *base_type = pdbconv_type_resolve_itype(ctx, vbclass->itype); + RADDBGIC_Type *base_type = pdbconv_type_resolve_itype(ctx, vbclass->itype); U32 vbptr_offset_u32 = pdbconv_u32_from_numeric(ctx, &num1); U32 vtable_offset_u32 = pdbconv_u32_from_numeric(ctx, &num2); - cons_type_add_member_virtual_base(ctx->root, owner_type, base_type, - vbptr_offset_u32, vtable_offset_u32); + raddbgic_type_add_member_virtual_base(ctx->root, owner_type, base_type, + vbptr_offset_u32, vtable_offset_u32); } }break; @@ -829,8 +829,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi default: { String8 kind_str = cv_string_from_leaf_kind(field_kind); - cons_errorf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", - str8_varg(kind_str)); + raddbgic_errorf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", + str8_varg(kind_str)); }break; } @@ -844,7 +844,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId fi } static void -pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId field_itype){ +pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype){ Temp scratch = scratch_begin(0, 0); String8 data = ctx->leaf->data; @@ -946,15 +946,15 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId // emit enum val U64 val_u64 = cv_u64_from_numeric(&val); - cons_type_add_enum_val(ctx->root, owner_type, name, val_u64); + raddbgic_type_add_enum_val(ctx->root, owner_type, name, val_u64); }break; // unhandled or invalid cases default: { String8 kind_str = cv_string_from_leaf_kind(field_kind); - cons_errorf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", - str8_varg(kind_str)); + raddbgic_errorf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", + str8_varg(kind_str)); }break; } @@ -967,188 +967,188 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, CONS_Type *owner_type, CV_TypeId scratch_end(scratch); } -static CONS_Type* +static RADDBGIC_Type* pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ Assert(itype < 0x1000); CV_BasicPointerKind basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); CV_BasicType basic_type_code = CV_BasicTypeFromTypeId(itype); - CONS_Reservation *basic_res = cons_type_reserve_id(ctx->root, basic_type_code, basic_type_code); + RADDBGIC_Reservation *basic_res = raddbgic_type_reserve_id(ctx->root, basic_type_code, basic_type_code); - CONS_Type *basic_type = 0; + RADDBGIC_Type *basic_type = 0; switch (basic_type_code){ case CV_BasicType_VOID: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Void, str8_lit("void")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Void, str8_lit("void")); }break; case CV_BasicType_HRESULT: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("HRESULT")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("HRESULT")); }break; case CV_BasicType_RCHAR: case CV_BasicType_CHAR: case CV_BasicType_CHAR8: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Char8, str8_lit("char")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Char8, str8_lit("char")); }break; case CV_BasicType_UCHAR: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_UChar8, str8_lit("UCHAR")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_UChar8, str8_lit("UCHAR")); }break; case CV_BasicType_WCHAR: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_UChar16, str8_lit("WCHAR")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_UChar16, str8_lit("WCHAR")); }break; case CV_BasicType_CHAR16: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Char16, str8_lit("CHAR16")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Char16, str8_lit("CHAR16")); }break; case CV_BasicType_CHAR32: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Char32, str8_lit("CHAR32")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Char32, str8_lit("CHAR32")); }break; case CV_BasicType_BOOL8: case CV_BasicType_INT8: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S8, str8_lit("S8")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S8, str8_lit("S8")); }break; case CV_BasicType_BOOL16: case CV_BasicType_INT16: case CV_BasicType_SHORT: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S16, str8_lit("S16")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S16, str8_lit("S16")); }break; case CV_BasicType_BOOL32: case CV_BasicType_INT32: case CV_BasicType_LONG: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S32, str8_lit("S32")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S32, str8_lit("S32")); }break; case CV_BasicType_BOOL64: case CV_BasicType_INT64: case CV_BasicType_QUAD: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S64, str8_lit("S64")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S64, str8_lit("S64")); }break; case CV_BasicType_INT128: case CV_BasicType_OCT: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_S128, str8_lit("S128")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S128, str8_lit("S128")); }break; case CV_BasicType_UINT8: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U8, str8_lit("U8")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U8, str8_lit("U8")); }break; case CV_BasicType_UINT16: case CV_BasicType_USHORT: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U16, str8_lit("U16")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U16, str8_lit("U16")); }break; case CV_BasicType_UINT32: case CV_BasicType_ULONG: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U32, str8_lit("U32")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U32, str8_lit("U32")); }break; case CV_BasicType_UINT64: case CV_BasicType_UQUAD: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U64, str8_lit("U64")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U64, str8_lit("U64")); }break; case CV_BasicType_UINT128: case CV_BasicType_UOCT: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_U128, str8_lit("U128")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U128, str8_lit("U128")); }break; case CV_BasicType_FLOAT16: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F16, str8_lit("F16")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F16, str8_lit("F16")); }break; case CV_BasicType_FLOAT32: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F32, str8_lit("F32")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F32, str8_lit("F32")); }break; case CV_BasicType_FLOAT32PP: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F32PP, str8_lit("F32PP")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F32PP, str8_lit("F32PP")); }break; case CV_BasicType_FLOAT48: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F48, str8_lit("F48")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F48, str8_lit("F48")); }break; case CV_BasicType_FLOAT64: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F64, str8_lit("F64")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F64, str8_lit("F64")); }break; case CV_BasicType_FLOAT80: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F80, str8_lit("F80")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F80, str8_lit("F80")); }break; case CV_BasicType_FLOAT128: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_F128, str8_lit("F128")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F128, str8_lit("F128")); }break; case CV_BasicType_COMPLEX32: { basic_type = - cons_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF32, str8_lit("ComplexF32")); + raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF32, str8_lit("ComplexF32")); }break; case CV_BasicType_COMPLEX64: { basic_type = - cons_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF64, str8_lit("ComplexF64")); + raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF64, str8_lit("ComplexF64")); }break; case CV_BasicType_COMPLEX80: { basic_type = - cons_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF80, str8_lit("ComplexF80")); + raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF80, str8_lit("ComplexF80")); }break; case CV_BasicType_COMPLEX128: { basic_type = - cons_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF128, str8_lit("ComplexF128")); + raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF128, str8_lit("ComplexF128")); }break; case CV_BasicType_PTR: { - basic_type = cons_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("PTR")); + basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("PTR")); }break; } // basic resolve - cons_type_fill_id(ctx->root, basic_res, basic_type); + raddbgic_type_fill_id(ctx->root, basic_res, basic_type); // wrap in constructed type - CONS_Type *constructed_type = 0; + RADDBGIC_Type *constructed_type = 0; if (basic_ptr_kind != 0 && basic_type != 0){ - CONS_Reservation *constructed_res = cons_type_reserve_id(ctx->root, itype, itype); + RADDBGIC_Reservation *constructed_res = raddbgic_type_reserve_id(ctx->root, itype, itype); switch (basic_ptr_kind){ case CV_BasicPointerKind_16BIT: @@ -1158,16 +1158,16 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_BasicPointerKind_16_32BIT: case CV_BasicPointerKind_64BIT: { - constructed_type = cons_type_pointer(ctx->root, basic_type, RADDBGI_TypeKind_Ptr); + constructed_type = raddbgic_type_pointer(ctx->root, basic_type, RADDBGI_TypeKind_Ptr); }break; } // constructed resolve - cons_type_fill_id(ctx->root, constructed_res, constructed_type); + raddbgic_type_fill_id(ctx->root, constructed_res, constructed_type); } // select output - CONS_Type *result = basic_type; + RADDBGIC_Type *result = basic_type; if (basic_ptr_kind != 0){ result = constructed_type; } @@ -1175,16 +1175,16 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ return(result); } -static CONS_Type* +static RADDBGIC_Type* pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); - CONS_Reservation *res = cons_type_reserve_id(ctx->root, itype, itype); + RADDBGIC_Reservation *res = raddbgic_type_reserve_id(ctx->root, itype, itype); CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[itype - ctx->leaf->itype_first]; String8 data = ctx->leaf->data; - CONS_Type *result = 0; + RADDBGIC_Type *result = 0; if (range->off + range->hdr.size <= data.size){ U8 *first = data.str + range->off + 2; U64 cap = range->hdr.size - 2; @@ -1204,9 +1204,9 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ flags |= RADDBGI_TypeModifierFlag_Volatile; } - CONS_Type *direct_type = pdbconv_type_resolve_and_check(ctx, modifier->itype); + RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, modifier->itype); if (flags != 0){ - result = cons_type_modifier(ctx->root, direct_type, flags); + result = raddbgic_type_modifier(ctx->root, direct_type, flags); } else{ result = direct_type; @@ -1250,12 +1250,12 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ type_kind = RADDBGI_TypeKind_RRef; } - CONS_Type *direct_type = pdbconv_type_resolve_and_check(ctx, pointer->itype); - CONS_Type *ptr_type = cons_type_pointer(ctx->root, direct_type, type_kind); + RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, pointer->itype); + RADDBGIC_Type *ptr_type = raddbgic_type_pointer(ctx->root, direct_type, type_kind); result = ptr_type; if (modifier_flags != 0){ - result = cons_type_modifier(ctx->root, ptr_type, modifier_flags); + result = raddbgic_type_modifier(ctx->root, ptr_type, modifier_flags); } } }break; @@ -1270,12 +1270,12 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // TODO(allen): handle call_kind & attribs - CONS_Type *ret_type = pdbconv_type_resolve_and_check(ctx, procedure->ret_itype); + RADDBGIC_Type *ret_type = pdbconv_type_resolve_and_check(ctx, procedure->ret_itype); - CONS_TypeList param_list = {0}; + RADDBGIC_TypeList param_list = {0}; pdbconv_type_resolve_arglist(scratch.arena, ¶m_list, ctx, procedure->arg_itype); - result = cons_type_proc(ctx->root, ret_type, ¶m_list); + result = raddbgic_type_proc(ctx->root, ret_type, ¶m_list); scratch_end(scratch); } @@ -1292,18 +1292,18 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // TODO(allen): handle call_kind & attribs // TODO(allen): preserve "this_adjust" - CONS_Type *ret_type = pdbconv_type_resolve_and_check(ctx, mfunction->ret_itype); + RADDBGIC_Type *ret_type = pdbconv_type_resolve_and_check(ctx, mfunction->ret_itype); - CONS_TypeList param_list = {0}; + RADDBGIC_TypeList param_list = {0}; pdbconv_type_resolve_arglist(scratch.arena, ¶m_list, ctx, mfunction->arg_itype); - CONS_Type *this_type = 0; + RADDBGIC_Type *this_type = 0; if (mfunction->this_itype != 0){ this_type = pdbconv_type_resolve_and_check(ctx, mfunction->this_itype); - result = cons_type_method(ctx->root, this_type, ret_type, ¶m_list); + result = raddbgic_type_method(ctx->root, this_type, ret_type, ¶m_list); } else{ - result = cons_type_proc(ctx->root, ret_type, ¶m_list); + result = raddbgic_type_proc(ctx->root, ret_type, ¶m_list); } scratch_end(scratch); @@ -1315,8 +1315,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // TODO(allen): error if bad range if (sizeof(CV_LeafBitField) <= cap){ CV_LeafBitField *bit_field = (CV_LeafBitField*)first; - CONS_Type *direct_type = pdbconv_type_resolve_and_check(ctx, bit_field->itype); - result = cons_type_bitfield(ctx->root, direct_type, bit_field->pos, bit_field->len); + RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, bit_field->itype); + result = raddbgic_type_bitfield(ctx->root, direct_type, bit_field->pos, bit_field->len); } }break; @@ -1332,14 +1332,14 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ U64 full_size = cv_u64_from_numeric(&array_count); - CONS_Type *direct_type = pdbconv_type_resolve_and_check(ctx, array->entry_itype); + RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, array->entry_itype); U64 count = full_size; if (direct_type != 0 && direct_type->byte_size != 0){ count /= direct_type->byte_size; } // build type - result = cons_type_array(ctx->root, direct_type, count); + result = raddbgic_type_array(ctx->root, direct_type, count); } }break; @@ -1367,7 +1367,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ if (range->hdr.kind == CV_LeafKind_CLASS){ type_kind = RADDBGI_TypeKind_IncompleteClass; } - result = cons_type_incomplete(ctx->root, type_kind, name); + result = raddbgic_type_incomplete(ctx->root, type_kind, name); } // complete type @@ -1376,7 +1376,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ if (range->hdr.kind == CV_LeafKind_CLASS){ type_kind = RADDBGI_TypeKind_Class; } - result = cons_type_udt(ctx->root, type_kind, name, size_u64); + result = raddbgic_type_udt(ctx->root, type_kind, name, size_u64); // remember to revisit this for members { @@ -1413,7 +1413,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ if (range->hdr.kind == CV_LeafKind_CLASS2){ type_kind = RADDBGI_TypeKind_IncompleteClass; } - result = cons_type_incomplete(ctx->root, type_kind, name); + result = raddbgic_type_incomplete(ctx->root, type_kind, name); } // complete type @@ -1422,7 +1422,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ if (range->hdr.kind == CV_LeafKind_CLASS2){ type_kind = RADDBGI_TypeKind_Class; } - result = cons_type_udt(ctx->root, type_kind, name, size_u64); + result = raddbgic_type_udt(ctx->root, type_kind, name, size_u64); // remember to revisit this for members { @@ -1455,12 +1455,12 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // incomplete type if (lf_union->props & CV_TypeProp_FwdRef){ result = - cons_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteUnion, name); + raddbgic_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteUnion, name); } // complete type else{ - result = cons_type_udt(ctx->root, RADDBGI_TypeKind_Union, name, size_u64); + result = raddbgic_type_udt(ctx->root, RADDBGI_TypeKind_Union, name, size_u64); // remember to revisit this for members { @@ -1487,13 +1487,13 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // incomplete type if (lf_enum->props & CV_TypeProp_FwdRef){ - result = cons_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteEnum, name); + result = raddbgic_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteEnum, name); } // complete type else{ - CONS_Type *direct_type = pdbconv_type_resolve_and_check(ctx, lf_enum->base_itype); - result = cons_type_enum(ctx->root, direct_type, name); + RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, lf_enum->base_itype); + result = raddbgic_type_enum(ctx->root, direct_type, name); // remember to revisit this for enumerates { @@ -1512,7 +1512,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_VFTABLE: case CV_LeafKind_LABEL: { - result = cons_type_handled_nil(ctx->root); + result = raddbgic_type_handled_nil(ctx->root); }break; // do nothing cases - these get handled in special passes and @@ -1653,29 +1653,29 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ default: { String8 kind_str = cv_string_from_leaf_kind(range->hdr.kind); - cons_errorf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", - str8_varg(kind_str), range->hdr.kind); + raddbgic_errorf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", + str8_varg(kind_str), range->hdr.kind); }break; } } - cons_type_fill_id(ctx->root, res, result); + raddbgic_type_fill_id(ctx->root, res, result); return(result); } -static CONS_Type* +static RADDBGIC_Type* pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype){ - CONS_Type *result = pdbconv_type_resolve_itype(ctx, itype); - if(cons_type_is_unhandled_nil(ctx->root, result)) + RADDBGIC_Type *result = pdbconv_type_resolve_itype(ctx, itype); + if(raddbgic_type_is_unhandled_nil(ctx->root, result)) { - cons_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); + raddbgic_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); } return(result); } static void -pdbconv_type_resolve_arglist(Arena *arena, CONS_TypeList *out, +pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, PDBCONV_Ctx *ctx, CV_TypeId arglist_itype){ ProfBeginFunction(); @@ -1697,8 +1697,8 @@ pdbconv_type_resolve_arglist(Arena *arena, CONS_TypeList *out, U32 max_count = (cap - sizeof(*arglist))/sizeof(CV_TypeId); U32 clamped_count = ClampTop(arglist->count, max_count); for (U32 i = 0; i < clamped_count; i += 1){ - CONS_Type *param_type = pdbconv_type_resolve_and_check(ctx, itypes[i]); - cons_type_list_push(arena, out, param_type); + RADDBGIC_Type *param_type = pdbconv_type_resolve_and_check(ctx, itypes[i]); + raddbgic_type_list_push(arena, out, param_type); } } @@ -1708,11 +1708,11 @@ pdbconv_type_resolve_arglist(Arena *arena, CONS_TypeList *out, ProfEnd(); } -static CONS_Type* +static RADDBGIC_Type* pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name){ // TODO(rjf): no idea if this is correct CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); - CONS_Type *result = cons_type_from_id(ctx->root, cv_type_id, cv_type_id); + RADDBGIC_Type *result = raddbgic_type_from_id(ctx->root, cv_type_id, cv_type_id); return(result); } @@ -1805,7 +1805,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ ProfScope("map out data associations") { // state variables - CONS_Symbol *current_proc = 0; + RADDBGIC_Symbol *current_proc = 0; // loop CV_RecRange *rec_range = sym->sym_ranges.ranges; @@ -1851,7 +1851,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ { U64 symbol_id = user_id_base + off; U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - current_proc = cons_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + current_proc = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); }break; } } @@ -1861,7 +1861,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ ProfScope("main symbol construction pass") { // state variables - CONS_LocationSet *defrange_target = 0; + RADDBGIC_LocationSet *defrange_target = 0; B32 defrange_target_is_param = 0; // loop @@ -1882,8 +1882,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ U64 cap = (opl_off - off); // current state - CONS_Scope *current_scope = pdbconv_symbol_current_scope(ctx); - CONS_Symbol *current_procedure = 0; + RADDBGIC_Scope *current_scope = pdbconv_symbol_current_scope(ctx); + RADDBGIC_Symbol *current_procedure = 0; if(current_scope != 0) { current_procedure = current_scope->symbol; @@ -1927,8 +1927,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ U64 scope_id = user_id_base + scope_num; U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); scope_num += 1; - CONS_Scope *block_scope = cons_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); - cons_scope_set_parent(ctx->root, block_scope, current_scope); + RADDBGIC_Scope *block_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); + raddbgic_scope_set_parent(ctx->root, block_scope, current_scope); pdbconv_symbol_push_scope(ctx, block_scope, current_procedure); // set voff range @@ -1936,7 +1936,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ if (section != 0){ U64 voff_first = section->voff + block32->off; U64 voff_last = voff_first + block32->len; - cons_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last); + raddbgic_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last); } } }break; @@ -1966,10 +1966,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ pdbconv_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); // type of variable - CONS_Type *type = pdbconv_type_resolve_itype(ctx, data32->itype); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, data32->itype); // container type - CONS_Type *container_type = 0; + RADDBGIC_Type *container_type = 0; U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); if (container_name_opl > 2){ String8 container_name = str8(name.str, container_name_opl - 2); @@ -1977,7 +1977,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } // container symbol - CONS_Symbol *container_symbol = 0; + RADDBGIC_Symbol *container_symbol = 0; if (container_type == 0){ container_symbol = current_procedure; } @@ -1988,10 +1988,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // cons this symbol U64 symbol_id = user_id_base + off; U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - CONS_SymbolInfo info = zero_struct; - info.kind = CONS_SymbolKind_GlobalVariable; + RADDBGIC_SymbolInfo info = zero_struct; + info.kind = RADDBGIC_SymbolKind_GlobalVariable; info.name = name; info.type = type; info.is_extern = is_extern; @@ -1999,7 +1999,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ info.container_type = container_type; info.container_symbol = container_symbol; - cons_symbol_set_info(ctx->root, symbol, &info); + raddbgic_symbol_set_info(ctx->root, symbol, &info); } } }break; @@ -2018,10 +2018,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ String8 name = str8_cstring_capped((char*)(proc32 + 1), first + cap); // type of procedure - CONS_Type *type = pdbconv_type_resolve_itype(ctx, proc32->itype); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, proc32->itype); // container type - CONS_Type *container_type = 0; + RADDBGIC_Type *container_type = 0; U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); if (container_name_opl > 2){ String8 container_name = str8(name.str, container_name_opl - 2); @@ -2029,7 +2029,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } // container symbol - CONS_Symbol *container_symbol = 0; + RADDBGIC_Symbol *container_symbol = 0; if (container_type == 0){ container_symbol = current_procedure; } @@ -2037,7 +2037,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // get this symbol handle U64 symbol_id = user_id_base + off; U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - CONS_Symbol *proc_symbol = cons_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + RADDBGIC_Symbol *proc_symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); // scope @@ -2048,7 +2048,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // no parent. U64 scope_id = user_id_base + scope_num; U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); - CONS_Scope *root_scope = cons_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); + RADDBGIC_Scope *root_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); pdbconv_symbol_push_scope(ctx, root_scope, proc_symbol); scope_num += 1; @@ -2058,7 +2058,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ if (section != 0){ U64 voff_first = section->voff + proc32->off; U64 voff_last = voff_first + proc32->len; - cons_scope_add_voff_range(ctx->root, root_scope, voff_first, voff_last); + raddbgic_scope_add_voff_range(ctx->root, root_scope, voff_first, voff_last); voff = voff_first; } @@ -2073,8 +2073,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ B32 is_extern = (kind == CV_SymKind_GPROC32); // set symbol info - CONS_SymbolInfo info = zero_struct; - info.kind = CONS_SymbolKind_Procedure; + RADDBGIC_SymbolInfo info = zero_struct; + info.kind = RADDBGIC_SymbolKind_Procedure; info.name = name; info.link_name = link_name; info.type = type; @@ -2083,7 +2083,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ info.container_symbol = container_symbol; info.root_scope = root_scope; - cons_symbol_set_info(ctx->root, proc_symbol, &info); + raddbgic_symbol_set_info(ctx->root, proc_symbol, &info); } }break; @@ -2103,7 +2103,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ String8 name = str8_cstring_capped((char*)(regrel32 + 1), first + cap); // type of variable - CONS_Type *type = pdbconv_type_resolve_itype(ctx, regrel32->itype); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, regrel32->itype); // extract regrel's info CV_Reg cv_reg = regrel32->reg; @@ -2137,15 +2137,15 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // emit local U64 local_id = user_id_base + local_num;; U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); - CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, local_id, local_id_hash); + RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; - CONS_LocalInfo info = {0}; + RADDBGIC_LocalInfo info = {0}; info.kind = local_kind; info.scope = current_scope; info.name = name; info.type = type; - cons_local_set_basic_info(ctx->root, local_var, &info); + raddbgic_local_set_basic_info(ctx->root, local_var, &info); // add location to local { @@ -2176,12 +2176,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ U32 byte_pos = 0; // set location case - CONS_Location *loc = + RADDBGIC_Location *loc = pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - CONS_LocationSet *locset = cons_location_set_from_local(ctx->root, local_var); - cons_location_set_add_case(ctx->root, locset, 0, max_U64, loc); + RADDBGIC_LocationSet *locset = raddbgic_location_set_from_local(ctx->root, local_var); + raddbgic_location_set_add_case(ctx->root, locset, 0, max_U64, loc); } } }break; @@ -2203,10 +2203,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ U32 tls_off = thread32->tls_off; // type of variable - CONS_Type *type = pdbconv_type_resolve_itype(ctx, thread32->itype); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, thread32->itype); // container type - CONS_Type *container_type = 0; + RADDBGIC_Type *container_type = 0; U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); if (container_name_opl > 2){ String8 container_name = str8(name.str, container_name_opl - 2); @@ -2214,7 +2214,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ } // container symbol - CONS_Symbol *container_symbol = 0; + RADDBGIC_Symbol *container_symbol = 0; if (container_type == 0){ container_symbol = current_procedure; } @@ -2225,10 +2225,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // setup symbol U64 symbol_id = user_id_base + off; U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - CONS_Symbol *symbol = cons_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - CONS_SymbolInfo info = zero_struct; - info.kind = CONS_SymbolKind_ThreadVariable; + RADDBGIC_SymbolInfo info = zero_struct; + info.kind = RADDBGIC_SymbolKind_ThreadVariable; info.name = name; info.type = type; info.is_extern = is_extern; @@ -2236,7 +2236,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ info.container_type = container_type; info.container_symbol = container_symbol; - cons_symbol_set_info(ctx->root, symbol, &info); + raddbgic_symbol_set_info(ctx->root, symbol, &info); } }break; @@ -2253,7 +2253,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ String8 name = str8_cstring_capped((char*)(slocal + 1), first + cap); // type of variable - CONS_Type *type = pdbconv_type_resolve_itype(ctx, slocal->itype); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, slocal->itype); // determine how to handle B32 begin_a_global_modification = 0; @@ -2280,20 +2280,20 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // emit local U64 local_id = user_id_base + local_num; U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); - CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, local_id, local_id_hash); + RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; local_var->kind = local_kind; local_var->name = name; local_var->type = type; - CONS_LocalInfo info = {0}; + RADDBGIC_LocalInfo info = {0}; info.kind = local_kind; info.scope = current_scope; info.name = name; info.type = type; - cons_local_set_basic_info(ctx->root, local_var, &info); + raddbgic_local_set_basic_info(ctx->root, local_var, &info); - defrange_target = cons_location_set_from_local(ctx->root, local_var); + defrange_target = raddbgic_location_set_from_local(ctx->root, local_var); defrange_target_is_param = (local_kind == RADDBGI_LocalKind_Parameter); } } @@ -2318,7 +2318,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); // setup location - CONS_Location *location = cons_location_val_reg(ctx->root, register_code); + RADDBGIC_Location *location = raddbgic_location_val_reg(ctx->root, register_code); // extract range info CV_LvarAddrRange *range = &defrange_register->range; @@ -2356,7 +2356,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ U32 byte_size = ctx->addr_size; U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel->off; - CONS_Location *location = + RADDBGIC_Location *location = pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); @@ -2394,7 +2394,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); // setup location - CONS_Location *location = cons_location_val_reg(ctx->root, register_code); + RADDBGIC_Location *location = raddbgic_location_val_reg(ctx->root, register_code); // extract range info CV_LvarAddrRange *range = &defrange_subfield_register->range; @@ -2434,13 +2434,13 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ U32 byte_size = ctx->addr_size; U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel_full_scope->off; - CONS_Location *location = + RADDBGIC_Location *location = pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); // emit location - cons_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location); + raddbgic_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location); } } }break; @@ -2470,7 +2470,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ S64 var_off = defrange_register_rel->reg_off; // setup location - CONS_Location *location = + RADDBGIC_Location *location = pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, var_off, extra_indirection_to_value); @@ -2500,7 +2500,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ String8 name = str8_cstring_capped((char*)(file_static + 1), first + cap); // type of variable - CONS_Type *type = pdbconv_type_resolve_itype(ctx, file_static->itype); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, file_static->itype); // TODO(allen): emit a global modifier symbol @@ -2514,7 +2514,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // if scope stack isn't empty emit an error { - CONS_Scope* scope = pdbconv_symbol_current_scope(ctx); + RADDBGIC_Scope* scope = pdbconv_symbol_current_scope(ctx); if(scope != 0) { // TODO(allen): emit error @@ -2583,7 +2583,7 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym){ // "frameproc" map static void -pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,CONS_Symbol *key,PDBCONV_FrameProcData *data){ +pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key,PDBCONV_FrameProcData *data){ ProfBeginFunction(); U64 key_int = IntFromPtr(key); PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; @@ -2618,7 +2618,7 @@ pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,CONS_Symbol *key,PDBCONV_FrameP } static PDBCONV_FrameProcData* -pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, CONS_Symbol *key){ +pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key){ U64 key_int = IntFromPtr(key); PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; U32 bucket_idx = key_int%map->buckets_count; @@ -2639,7 +2639,7 @@ pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, CONS_Symbol *key){ // scope stack static void -pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, CONS_Scope *scope, CONS_Symbol *symbol){ +pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol){ PDBCONV_ScopeNode *node = ctx->scope_node_free; if (node == 0){ node = push_array(ctx->arena, PDBCONV_ScopeNode, 1); @@ -2757,42 +2757,42 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n // location info helpers -static CONS_Location* +static RADDBGIC_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, RADDBGI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection){ - CONS_Location *result = 0; + RADDBGIC_Location *result = 0; if (0 <= offset && offset <= (S64)max_U16){ if (extra_indirection){ - result = cons_location_addr_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); + result = raddbgic_location_addr_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); } else{ - result = cons_location_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); + result = raddbgic_location_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); } } else{ Arena *arena = ctx->arena; - CONS_EvalBytecode bytecode = {0}; + RADDBGIC_EvalBytecode bytecode = {0}; U32 regread_param = RADDBGI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); - cons_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_RegRead, regread_param); - cons_bytecode_push_sconst(arena, &bytecode, offset); - cons_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_Add, 0); + raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_RegRead, regread_param); + raddbgic_bytecode_push_sconst(arena, &bytecode, offset); + raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_Add, 0); if (extra_indirection){ - cons_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_MemRead, ctx->addr_size); + raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_MemRead, ctx->addr_size); } - result = cons_location_addr_bytecode_stream(ctx->root, &bytecode); + result = raddbgic_location_addr_bytecode_stream(ctx->root, &bytecode); } return(result); } static CV_EncodedFramePtrReg -pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, CONS_Symbol *proc, B32 param_base){ +pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *proc, B32 param_base){ CV_EncodedFramePtrReg result = 0; if (proc != 0){ PDBCONV_FrameProcData *frame_proc = pdbconv_symbol_frame_proc_read(ctx, proc); @@ -2855,8 +2855,8 @@ pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrR static void pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, - CONS_LocationSet *locset, - CONS_Location *location, + RADDBGIC_LocationSet *locset, + RADDBGIC_Location *location, CV_LvarAddrRange *range, CV_LvarAddrGap *gaps, U64 gap_count){ // extract range info @@ -2877,13 +2877,13 @@ pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, U64 voff_gap_first = voff_first + gap_ptr->off; U64 voff_gap_opl = voff_gap_first + gap_ptr->len; if (voff_cursor < voff_gap_first){ - cons_location_set_add_case(ctx->root, locset, voff_cursor, voff_gap_first, location); + raddbgic_location_set_add_case(ctx->root, locset, voff_cursor, voff_gap_first, location); } voff_cursor = voff_gap_opl; } if (voff_cursor < voff_opl){ - cons_location_set_add_case(ctx->root, locset, voff_cursor, voff_opl, location); + raddbgic_location_set_add_case(ctx->root, locset, voff_cursor, voff_opl, location); } } @@ -3195,7 +3195,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // setup root - CONS_RootParams root_params = {0}; + RADDBGIC_RootParams root_params = {0}; root_params.addr_size = addr_size; root_params.bucket_count_units = comp_unit_count; @@ -3205,7 +3205,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ root_params.bucket_count_types = tpi->itype_opl; root_params.bucket_count_type_constructs = tpi->itype_opl; - CONS_Root *root = cons_root_new(&root_params); + RADDBGIC_Root *root = raddbgic_root_new(&root_params); out->root = root; // top level info @@ -3222,13 +3222,13 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // set top level info - CONS_TopLevelInfo tli = {0}; + RADDBGIC_TopLevelInfo tli = {0}; tli.architecture = architecture; tli.exe_name = params->input_exe_name; tli.exe_hash = exe_hash; tli.voff_max = voff_max; - cons_set_top_level_info(root, &tli); + raddbgic_set_top_level_info(root, &tli); } @@ -3242,9 +3242,9 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 name = str8_cstring_capped(name_first, name_opl); RADDBGI_BinarySectionFlags flags = raddbgi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); - cons_add_binary_section(root, name, flags, - coff_ptr->voff, coff_ptr->voff + coff_ptr->vsize, - coff_ptr->foff, coff_ptr->foff + coff_ptr->fsize); + raddbgic_add_binary_section(root, name, flags, + coff_ptr->voff, coff_ptr->voff + coff_ptr->vsize, + coff_ptr->foff, coff_ptr->foff + coff_ptr->fsize); } } @@ -3287,16 +3287,16 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ RADDBGI_Language lang = raddbgi_language_from_cv_language(sym->info.language); // basic per unit info - CONS_Unit *unit_handle = cons_unit_handle_from_user_id(root, i, i); + RADDBGIC_Unit *unit_handle = raddbgic_unit_handle_from_user_id(root, i, i); - CONS_UnitInfo info = {0}; + RADDBGIC_UnitInfo info = {0}; info.unit_name = unit_name; info.compiler_name = compiler_name; info.object_file = obj_name; info.archive_file = archive_file; info.language = lang; - cons_unit_set_info(root, unit_handle, &info); + raddbgic_unit_set_info(root, unit_handle, &info); // unit's line info for (CV_C13SubSectionNode *node = unit_c13->first_sub_section; @@ -3310,13 +3310,13 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ lines_n = lines_n->next) { CV_C13LinesParsed *lines = &lines_n->v; - CONS_LineSequence seq = {0}; + RADDBGIC_LineSequence seq = {0}; seq.file_name = lines->file_name; seq.voffs = lines->voffs; seq.line_nums = lines->line_nums; seq.col_nums = lines->col_nums; seq.line_count = lines->line_count; - cons_unit_add_line_sequence(root, unit_handle, &seq); + raddbgic_unit_add_line_sequence(root, unit_handle, &seq); } } } @@ -3330,10 +3330,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ PDB_CompUnitContribution *contrib_opl = contrib_ptr + comp_unit_contribution_count; for (;contrib_ptr < contrib_opl; contrib_ptr += 1){ if (contrib_ptr->mod < root->unit_count){ - CONS_Unit *unit_handle = cons_unit_handle_from_user_id(root, contrib_ptr->mod, contrib_ptr->mod); - cons_unit_vmap_add_range(root, unit_handle, - contrib_ptr->voff_first, - contrib_ptr->voff_opl); + RADDBGIC_Unit *unit_handle = raddbgic_unit_handle_from_user_id(root, contrib_ptr->mod, contrib_ptr->mod); + raddbgic_unit_vmap_add_range(root, unit_handle, + contrib_ptr->voff_first, + contrib_ptr->voff_opl); } } } @@ -3365,7 +3365,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // conversion errors if (!params->hide_errors.converting){ - for (CONS_Error *error = cons_get_first_error(root); + for (RADDBGIC_Error *error = raddbgic_get_first_error(root); error != 0; error = error->next){ str8_list_push(arena, &out->errors, error->msg); @@ -3561,12 +3561,12 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ {str8_lit("pdbconv_ctx frame_proc_map"), pdbconv_ctx?pdbconv_ctx->frame_proc_map.buckets_count:0, pdbconv_ctx?pdbconv_ctx->frame_proc_map.pair_count:0, pdbconv_ctx?pdbconv_ctx->frame_proc_map.bucket_collision_count:0}, {str8_lit("pdbconv_ctx known_globals"), pdbconv_ctx?pdbconv_ctx->known_globals.buckets_count:0, pdbconv_ctx?pdbconv_ctx->known_globals.global_count:0, pdbconv_ctx?pdbconv_ctx->known_globals.bucket_collision_count:0}, {str8_lit("pdbconv_ctx link_names"), pdbconv_ctx?pdbconv_ctx->link_names.buckets_count:0, pdbconv_ctx?pdbconv_ctx->link_names.link_name_count:0, pdbconv_ctx?pdbconv_ctx->link_names.bucket_collision_count:0}, - {str8_lit("cons_root unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count, out->root->unit_map.bucket_collision_count}, - {str8_lit("cons_root symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count, out->root->symbol_map.bucket_collision_count}, - {str8_lit("cons_root scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count, out->root->scope_map.bucket_collision_count}, - {str8_lit("cons_root local_map"), out->root->local_map.buckets_count, out->root->local_map.pair_count, out->root->local_map.bucket_collision_count}, - {str8_lit("cons_root type_from_id_map"), out->root->type_from_id_map.buckets_count, out->root->type_from_id_map.pair_count, out->root->type_from_id_map.bucket_collision_count}, - {str8_lit("cons_root construct_map"), out->root->construct_map.buckets_count, out->root->construct_map.pair_count, out->root->construct_map.bucket_collision_count}, + {str8_lit("raddbgic_root unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count, out->root->unit_map.bucket_collision_count}, + {str8_lit("raddbgic_root symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count, out->root->symbol_map.bucket_collision_count}, + {str8_lit("raddbgic_root scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count, out->root->scope_map.bucket_collision_count}, + {str8_lit("raddbgic_root local_map"), out->root->local_map.buckets_count, out->root->local_map.pair_count, out->root->local_map.bucket_collision_count}, + {str8_lit("raddbgic_root type_from_id_map"), out->root->type_from_id_map.buckets_count, out->root->type_from_id_map.pair_count, out->root->type_from_id_map.bucket_collision_count}, + {str8_lit("raddbgic_root construct_map"), out->root->construct_map.buckets_count, out->root->construct_map.pair_count, out->root->construct_map.bucket_collision_count}, }; for(U64 idx = 0; idx < ArrayCount(table_info); idx += 1) { diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h index ff1c1513..094df987 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h @@ -62,7 +62,7 @@ typedef struct PDBCONV_FwdMap{ typedef struct PDBCONV_TypeRev{ struct PDBCONV_TypeRev *next; - CONS_Type *owner_type; + RADDBGIC_Type *owner_type; CV_TypeId field_itype; } PDBCONV_TypeRev; @@ -73,7 +73,7 @@ typedef struct PDBCONV_FrameProcData{ typedef struct PDBCONV_FrameProcNode{ struct PDBCONV_FrameProcNode *next; - CONS_Symbol *key; + RADDBGIC_Symbol *key; PDBCONV_FrameProcData data; } PDBCONV_FrameProcNode; @@ -86,8 +86,8 @@ typedef struct PDBCONV_FrameProcMap{ typedef struct PDBCONV_ScopeNode{ struct PDBCONV_ScopeNode *next; - CONS_Scope *scope; - CONS_Symbol *symbol; + RADDBGIC_Scope *scope; + RADDBGIC_Symbol *symbol; } PDBCONV_ScopeNode; typedef struct PDBCONV_KnownGlobalNode{ @@ -148,7 +148,7 @@ typedef struct PDBCONV_Ctx{ U64 section_count; // OUTPUT data - CONS_Root *root; + RADDBGIC_Root *root; // TEMPORARY STATE PDBCONV_FwdMap fwd_map; @@ -164,7 +164,7 @@ typedef struct PDBCONV_Ctx{ } PDBCONV_Ctx; //- rjf: pdb conversion context creation -static PDBCONV_Ctx *pdbconv_ctx_alloc(PDBCONV_CtxParams *params, CONS_Root *out_root); +static PDBCONV_Ctx *pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root); //- pdb types and symbols static void pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *params); @@ -187,21 +187,21 @@ static COFF_SectionHeader* pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U32 static void pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx); static CV_TypeId pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype); -static CONS_Type* pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype); -static void pdbconv_type_equip_members(PDBCONV_Ctx *ctx, CONS_Type *owern_type, +static RADDBGIC_Type* pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype); +static void pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owern_type, CV_TypeId field_itype); -static void pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, CONS_Type *owner_type, +static void pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype); // type info construction helpers -static CONS_Type* pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype); -static CONS_Type* pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype); -static CONS_Type* pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype); -static void pdbconv_type_resolve_arglist(Arena *arena, CONS_TypeList *out, +static RADDBGIC_Type* pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype); +static RADDBGIC_Type* pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype); +static RADDBGIC_Type* pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype); +static void pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, PDBCONV_Ctx *ctx, CV_TypeId arglist_itype); // type info resolution helpers -static CONS_Type* pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name); +static RADDBGIC_Type* pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name); // type fwd map static void pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, @@ -219,12 +219,12 @@ static void pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_uni static void pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym); // "frameproc" map -static void pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,CONS_Symbol *key, +static void pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key, PDBCONV_FrameProcData *data); -static PDBCONV_FrameProcData* pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, CONS_Symbol *key); +static PDBCONV_FrameProcData* pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key); // scope stack -static void pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, CONS_Scope *scope, CONS_Symbol *symbol); +static void pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); static void pdbconv_symbol_pop_scope(PDBCONV_Ctx *ctx); static void pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx); @@ -246,23 +246,23 @@ static void pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *se // location info helpers -static CONS_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, - RADDBGI_RegisterCode reg_code, - U32 reg_byte_size, - U32 reg_byte_pos, - S64 offset, - B32 extra_indirection); +static RADDBGIC_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, + RADDBGI_RegisterCode reg_code, + U32 reg_byte_size, + U32 reg_byte_pos, + S64 offset, + B32 extra_indirection); static CV_EncodedFramePtrReg pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, - CONS_Symbol *proc, + RADDBGIC_Symbol *proc, B32 param_base); static RADDBGI_RegisterCode pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg encoded_reg); static void pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, - CONS_LocationSet *locset, - CONS_Location *location, + RADDBGIC_LocationSet *locset, + RADDBGIC_Location *location, CV_LvarAddrRange *range, CV_LvarAddrGap *gaps, U64 gap_count); @@ -278,7 +278,7 @@ typedef struct PDBCONV_Out PDBCONV_Out; struct PDBCONV_Out { B32 good_parse; - CONS_Root *root; + RADDBGIC_Root *root; String8List dump; String8List errors; }; diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c index 44a591a4..3245651e 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c @@ -98,7 +98,7 @@ main(int argc, char **argv){ if(out != 0 && out->good_parse && params->output_name.size > 0 && out->good_parse) { String8List baked = {0}; - cons_bake_file(arena, out->root, &baked); + raddbgic_bake_file(arena, out->root, &baked); for(String8Node *node = baked.first; node != 0; node = node->next) { fwrite(node->string.str, node->string.size, 1, out_file); From cf19b13b780b6ca7ad2d92ce6ac3c9a81d560787 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 15:19:20 -0800 Subject: [PATCH 035/275] dump -> raddbgidump --- README.md | 2 +- src/raddbgi_dump/raddbgi_dump.c | 8 ++++---- src/raddbgi_dump/raddbgi_dump.h | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a7f465a3..0ba8ed7a 100644 --- a/README.md +++ b/README.md @@ -294,7 +294,7 @@ A list of the layers in the codebase and their associated namespaces is below: depend on `base`. - `raddbgi_cons` (`RADDBGIC_`): Implements an API for constructing files of the RADDBGI debug info file format. -- `raddbgi_dump` (`DUMP_`): A dumper utility program for dumping +- `raddbgi_dump` (`RADDBGIDUMP_`): A dumper utility program for dumping textualizations of RADDBGI debug info files. - `raddbgi_format` (`RADDBGI_`): Standalone types and helper functions for the RADDBGI debug info file format. Does not depend on `base`. diff --git a/src/raddbgi_dump/raddbgi_dump.c b/src/raddbgi_dump/raddbgi_dump.c index d5862b86..54bf9a5e 100644 --- a/src/raddbgi_dump/raddbgi_dump.c +++ b/src/raddbgi_dump/raddbgi_dump.c @@ -18,9 +18,9 @@ //////////////////////////////// //~ Program Parameters Parser -static DUMP_Params* -dump_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ - DUMP_Params *result = push_array(arena, DUMP_Params, 1); +static RADDBGIDUMP_Params* +raddbgidump_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ + RADDBGIDUMP_Params *result = push_array(arena, RADDBGIDUMP_Params, 1); // get input raddbg { @@ -144,7 +144,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); - DUMP_Params *params = dump_params_from_cmd_line(arena, &cmdline); + RADDBGIDUMP_Params *params = raddbgidump_params_from_cmd_line(arena, &cmdline); // show input errors if (params->errors.node_count > 0 && diff --git a/src/raddbgi_dump/raddbgi_dump.h b/src/raddbgi_dump/raddbgi_dump.h index e791ff40..4b555ddd 100644 --- a/src/raddbgi_dump/raddbgi_dump.h +++ b/src/raddbgi_dump/raddbgi_dump.h @@ -7,7 +7,7 @@ //////////////////////////////// //~ Program Parameters Type -typedef struct DUMP_Params{ +typedef struct RADDBGIDUMP_Params{ String8 input_name; String8 input_data; @@ -35,11 +35,11 @@ typedef struct DUMP_Params{ B8 dump__last; String8List errors; -} DUMP_Params; +} RADDBGIDUMP_Params; //////////////////////////////// //~ Program Parameters Parser -static DUMP_Params *dump_params_from_cmd_line(Arena *arena, CmdLine *cmdline); +static RADDBGIDUMP_Params *raddbgidump_params_from_cmd_line(Arena *arena, CmdLine *cmdline); #endif //RADDBGI_DUMP_H From 02825f3b3e3848eb4424a397c3eea6f0e07c646e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 15:22:41 -0800 Subject: [PATCH 036/275] move raddbgi stringize into standalone layer --- README.md | 4 ++++ src/raddbgi_dump/raddbgi_dump.c | 4 ++-- src/{raddbgi_dump => raddbgi_stringize}/raddbgi_stringize.c | 0 src/{raddbgi_dump => raddbgi_stringize}/raddbgi_stringize.h | 0 4 files changed, 6 insertions(+), 2 deletions(-) rename src/{raddbgi_dump => raddbgi_stringize}/raddbgi_stringize.c (100%) rename src/{raddbgi_dump => raddbgi_stringize}/raddbgi_stringize.h (100%) diff --git a/README.md b/README.md index 0ba8ed7a..64d8dbb0 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ format are: info. - `raddbgi_convert`: Our implementation of PDB-to-RADDBGI (and an in-progress implementation of a DWARF-to-RADDBGI) conversion. +- `raddbgi_stringize`: Code for converting binary RADDBGI info into text. - `raddbgi_dump`: Code for textually dumping information from RADDBGI files. ## Development Setup Instructions @@ -298,6 +299,9 @@ A list of the layers in the codebase and their associated namespaces is below: textualizations of RADDBGI debug info files. - `raddbgi_format` (`RADDBGI_`): Standalone types and helper functions for the RADDBGI debug info file format. Does not depend on `base`. +- `raddbgi_stringize` (`RADDBGI_`): Code to stringify binary RADDBGI info, for + visualizing textualizations of RADDBGI debug info. Used in `raddbgi_dump`, + and depends on `base`. - `regs` (`REGS_`): Types, helper functions, and metadata for registers on supported architectures. Used in reading/writing registers in `demon`, or in looking up register metadata. diff --git a/src/raddbgi_dump/raddbgi_dump.c b/src/raddbgi_dump/raddbgi_dump.c index 54bf9a5e..66687e94 100644 --- a/src/raddbgi_dump/raddbgi_dump.c +++ b/src/raddbgi_dump/raddbgi_dump.c @@ -5,7 +5,7 @@ #include "os/os_inc.h" #include "raddbgi_format/raddbgi_format.h" #include "raddbgi_format/raddbgi_format_parse.h" -#include "raddbgi_stringize.h" +#include "raddbgi_stringize/raddbgi_stringize.h" #include "raddbgi_dump.h" @@ -13,7 +13,7 @@ #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 diff --git a/src/raddbgi_dump/raddbgi_stringize.c b/src/raddbgi_stringize/raddbgi_stringize.c similarity index 100% rename from src/raddbgi_dump/raddbgi_stringize.c rename to src/raddbgi_stringize/raddbgi_stringize.c diff --git a/src/raddbgi_dump/raddbgi_stringize.h b/src/raddbgi_stringize/raddbgi_stringize.h similarity index 100% rename from src/raddbgi_dump/raddbgi_stringize.h rename to src/raddbgi_stringize/raddbgi_stringize.h From 840e1da5f3a94e525c58c57f37641a92e5d959e1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 15:26:06 -0800 Subject: [PATCH 037/275] update github workflows to new debug info naming --- .github/workflows/builds.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index d73f27c3..6734ecb5 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -20,9 +20,11 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build raddbg msvc debug || exit /b 1 - call build raddbg_from_pdb msvc debug || exit /b 1 - call build raddbg_from_dwarf msvc debug || exit /b 1 - call build raddbg clang debug || exit /b 1 - call build raddbg_from_pdb clang debug || exit /b 1 - call build raddbg_from_dwarf clang debug || exit /b 1 + call build raddbg msvc debug || exit /b 1 + call build raddbgi_from_pdb msvc debug || exit /b 1 + call build raddbgi_from_dwarf msvc debug || exit /b 1 + call build raddbgi_dump msvc debug || exit /b 1 + call build raddbg clang debug || exit /b 1 + call build raddbgi_from_pdb clang debug || exit /b 1 + call build raddbgi_from_dwarf clang debug || exit /b 1 + call build raddbgi_dump clang debug || exit /b 1 From 7022c5801899364b26d8b3364a3a5ed07151e82d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 16:17:54 -0800 Subject: [PATCH 038/275] begin libraryifying raddbgi_cons; switch to raddbgi_format types, or overrideable base-layer-style types; just override & include in codebase-local inclusion sites. next step is to break out this stuff, along with stringization, into a raddbgi helper layer --- project.4coder | 9 + src/raddbg/raddbg_main.cpp | 4 +- src/raddbgi_cons/raddbgi_cons.c | 1024 +++++++++-------- src/raddbgi_cons/raddbgi_cons.h | 665 ++++++----- src/raddbgi_cons/raddbgi_cons_local.c | 4 + src/raddbgi_cons/raddbgi_cons_local.h | 27 + .../dwarf/raddbgi_from_dwarf.c | 4 +- src/raddbgi_convert/pdb/raddbgi_from_pdb.c | 20 +- .../pdb/raddbgi_from_pdb_main.c | 4 +- src/raddbgi_format/raddbgi_format_parse.h | 2 +- src/scratch/ryan_scratch.c | 24 +- 11 files changed, 977 insertions(+), 810 deletions(-) create mode 100644 src/raddbgi_cons/raddbgi_cons_local.c create mode 100644 src/raddbgi_cons/raddbgi_cons_local.h diff --git a/project.4coder b/project.4coder index 30ba820b..21a2732d 100644 --- a/project.4coder +++ b/project.4coder @@ -135,6 +135,15 @@ commands = .save_dirty_files = true, .cursor_at_end = false, }, + .build_ryan_scratch = + { + .win = "build ryan_scratch", + .linux = "", + .out = "*compilation*", + .footer_panel = true, + .save_dirty_files = true, + .cursor_at_end = false, + }, .run_raddbg = { .win = "pushd build && raddbg.exe && popd", diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 5334c154..49300df1 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -17,7 +17,7 @@ #include "pe/pe.h" #include "raddbgi_format/raddbgi_format.h" #include "raddbgi_format/raddbgi_format_parse.h" -#include "raddbgi_cons/raddbgi_cons.h" +#include "raddbgi_cons/raddbgi_cons_local.h" #include "raddbgi_convert/pdb/raddbgi_coff.h" #include "raddbgi_convert/pdb/raddbgi_codeview.h" #include "raddbgi_convert/pdb/raddbgi_msf.h" @@ -59,7 +59,7 @@ #include "pe/pe.c" #include "raddbgi_format/raddbgi_format.c" #include "raddbgi_format/raddbgi_format_parse.c" -#include "raddbgi_cons/raddbgi_cons.c" +#include "raddbgi_cons/raddbgi_cons_local.c" #include "raddbgi_convert/pdb/raddbgi_msf.c" #include "raddbgi_convert/pdb/raddbgi_codeview.c" #include "raddbgi_convert/pdb/raddbgi_pdb.c" diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/raddbgi_cons/raddbgi_cons.c index 219cea0e..7680a8d8 100644 --- a/src/raddbgi_cons/raddbgi_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -4,18 +4,58 @@ //////////////////////////////// //~ rjf: API Implementation Helper Macros -#define raddbgic_require(root, b32, else_code, error_msg) do { if(!(b32)) {raddbgic_error((root), (error_msg)); else_code;} }while(0) -#define raddbgic_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {raddbgic_errorf((root), (fmt), __VA_ARGS__); else_code;} }while(0) +#define raddbgic_require(root, b32, else_code, error_msg) do { if(!(b32)) {raddbgic_push_error((root), (error_msg)); else_code;} }while(0) +#define raddbgic_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {raddbgic_push_errorf((root), (fmt), __VA_ARGS__); else_code;} }while(0) //////////////////////////////// -//~ rjf: Basic Type Helpers +//~ rjf: Basic Helpers + +//- rjf: memory set + +#if !defined(raddbgic_memset) +RADDBGI_PROC void * +raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size) +{ + for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + { + ((RADDBGI_U8 *)dst)[idx] = c; + } + return dst; +} +#endif + +//- rjf: strings + +RADDBGI_PROC RADDBGIC_String8 +raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size) +{ + RADDBGIC_String8 result; + result.RADDBGIC_String8_BaseMember = str; + result.RADDBGIC_String8_SizeMember = size; + return result; +} + +//- rjf: arenas + +RADDBGI_PROC void * +raddbgic_arena_push(RADDBGIC_Arena *arena, RADDBGI_U64 size) +{ + void *result = RADDBGIC_Arena_PushImpl((arena), (size)); + return result; +} + +RADDBGI_PROC void +raddbgic_arena_pop_to(RADDBGIC_Arena *arena, RADDBGI_U64 pos) +{ + RADDBGIC_Arena_PopToImpl((arena), (pos)); +} //- rjf: type lists -static void -raddbgic_type_list_push(Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type) +RADDBGI_PROC void +raddbgic_type_list_push(RADDBGIC_Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type) { - RADDBGIC_TypeNode *node = push_array(arena, RADDBGIC_TypeNode, 1); + RADDBGIC_TypeNode *node = raddbgic_push_array(arena, RADDBGIC_TypeNode, 1); SLLQueuePush(list->first, list->last, node); list->count += 1; node->type = type; @@ -23,13 +63,13 @@ raddbgic_type_list_push(Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *ty //- rjf: bytecode lists -static void -raddbgic_bytecode_push_op(Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_EvalOp op, U64 p) +RADDBGI_PROC void +raddbgic_bytecode_push_op(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_EvalOp op, RADDBGI_U64 p) { - U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; - U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); + RADDBGI_U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; + RADDBGI_U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); - RADDBGIC_EvalBytecodeOp *node = push_array(arena, RADDBGIC_EvalBytecodeOp, 1); + RADDBGIC_EvalBytecodeOp *node = raddbgic_push_array(arena, RADDBGIC_EvalBytecodeOp, 1); node->op = op; node->p_size = p_size; node->p = p; @@ -39,8 +79,8 @@ raddbgic_bytecode_push_op(Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI bytecode->encoded_size += 1 + p_size; } -static void -raddbgic_bytecode_push_uconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, U64 x) +RADDBGI_PROC void +raddbgic_bytecode_push_uconst(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_U64 x) { if(x <= 0xFF) { @@ -60,31 +100,31 @@ raddbgic_bytecode_push_uconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, U64 } } -static void -raddbgic_bytecode_push_sconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, S64 x) +RADDBGI_PROC void +raddbgic_bytecode_push_sconst(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_S64 x) { if(-0x80 <= x && x <= 0x7F) { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, (U64)x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, (RADDBGI_U64)x); raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 8); } else if(-0x8000 <= x && x <= 0x7FFF) { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, (U64)x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, (RADDBGI_U64)x); raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 16); } else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, (U64)x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, (RADDBGI_U64)x); raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 32); } else { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, (U64)x); + raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, (RADDBGI_U64)x); } } -static void +RADDBGI_PROC void raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_EvalBytecode *right_destroyed) { if(right_destroyed->first_op != 0) @@ -105,8 +145,8 @@ raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_Eval //- rjf: sortable range sorting -static RADDBGIC_SortKey* -raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count) +RADDBGI_PROC RADDBGIC_SortKey* +raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U64 count) { // This sort is designed to take advantage of lots of pre-existing sorted ranges. // Most line info is already sorted or close to already sorted. @@ -126,18 +166,18 @@ raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count) { RADDBGIC_OrderedRange *ranges_first = 0; RADDBGIC_OrderedRange *ranges_last = 0; - U64 range_count = 0; + RADDBGI_U64 range_count = 0; { - U64 pos = 0; + RADDBGI_U64 pos = 0; for(;pos < count;) { // identify ordered range - U64 first = pos; - U64 opl = pos + 1; + RADDBGI_U64 first = pos; + RADDBGI_U64 opl = pos + 1; for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); // generate an ordered range node - RADDBGIC_OrderedRange *new_range = push_array(scratch.arena, RADDBGIC_OrderedRange, 1); + RADDBGIC_OrderedRange *new_range = raddbgic_push_array(scratch.arena, RADDBGIC_OrderedRange, 1); SLLQueuePush(ranges_first, ranges_last, new_range); range_count += 1; new_range->first = first; @@ -186,7 +226,7 @@ raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count) // if there is not a second range, save this range for next time and end this pass if(src_ranges == 0) { - U64 first = range1->first; + RADDBGI_U64 first = range1->first; MemoryCopy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); SLLQueuePush(dst_ranges, dst_ranges_last, range1); break; @@ -199,11 +239,11 @@ raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count) Assert(range1->opl == range2->first); // merge these ranges - U64 jd = range1->first; - U64 j1 = range1->first; - U64 j1_opl = range1->opl; - U64 j2 = range2->first; - U64 j2_opl = range2->opl; + RADDBGI_U64 jd = range1->first; + RADDBGI_U64 j1 = range1->first; + RADDBGI_U64 j1_opl = range1->opl; + RADDBGI_U64 j2 = range2->first; + RADDBGI_U64 j2_opl = range2->opl; for(;;) { if(src[j1].key <= src[j2].key) @@ -253,7 +293,7 @@ raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count) #if 0 // assert sortedness - for(U64 i = 1; i < count; i += 1){ + for(RADDBGI_U64 i = 1; i < count; i += 1){ Assert(result[i - 1].key <= result[i].key); } #endif @@ -269,21 +309,21 @@ raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count) //- rjf: u64 -> ptr map -static void -raddbgic_u64toptr_init(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 bucket_count) +RADDBGI_PROC void +raddbgic_u64toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 bucket_count) { Assert(IsPow2OrZero(bucket_count) && bucket_count > 0); - map->buckets = push_array(arena, RADDBGIC_U64ToPtrNode*, bucket_count); + map->buckets = raddbgic_push_array(arena, RADDBGIC_U64ToPtrNode*, bucket_count); map->buckets_count = bucket_count; } -static void -raddbgic_u64toptr_lookup(RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_U64ToPtrLookup *lookup_out) +RADDBGI_PROC void +raddbgic_u64toptr_map_lookup(RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RADDBGIC_U64ToPtrLookup *lookup_out) { - U64 bucket_idx = hash&(map->buckets_count - 1); + RADDBGI_U64 bucket_idx = hash&(map->buckets_count - 1); RADDBGIC_U64ToPtrNode *check_node = map->buckets[bucket_idx]; for(;check_node != 0; check_node = check_node->next){ - for(U32 k = 0; k < ArrayCount(check_node->key); k += 1){ + for(RADDBGI_U32 k = 0; k < ArrayCount(check_node->key); k += 1){ if(check_node->ptr[k] == 0){ lookup_out->fill_node = check_node; lookup_out->fill_k = k; @@ -297,21 +337,21 @@ raddbgic_u64toptr_lookup(RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_ } } -static void -raddbgic_u64toptr_insert(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_U64ToPtrLookup *lookup, void *ptr) +RADDBGI_PROC void +raddbgic_u64toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RADDBGIC_U64ToPtrLookup *lookup, void *ptr) { if(lookup->fill_node != 0) { RADDBGIC_U64ToPtrNode *node = lookup->fill_node; - U32 k = lookup->fill_k; + RADDBGI_U32 k = lookup->fill_k; node->key[k] = key; node->ptr[k] = ptr; } else { - U64 bucket_idx = hash&(map->buckets_count - 1); + RADDBGI_U64 bucket_idx = hash&(map->buckets_count - 1); - RADDBGIC_U64ToPtrNode *node = push_array(arena, RADDBGIC_U64ToPtrNode, 1); + RADDBGIC_U64ToPtrNode *node = raddbgic_push_array(arena, RADDBGIC_U64ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); node->key[0] = key; node->ptr[0] = ptr; @@ -326,18 +366,18 @@ raddbgic_u64toptr_insert(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 key, U64 h //- rjf: string8 -> ptr map -static void -raddbgic_str8toptr_init(Arena *arena, RADDBGIC_Str8ToPtrMap *map, U64 bucket_count) +RADDBGI_PROC void +raddbgic_str8toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGI_U64 bucket_count) { map->buckets_count = bucket_count; - map->buckets = push_array(arena, RADDBGIC_Str8ToPtrNode*, map->buckets_count); + map->buckets = raddbgic_push_array(arena, RADDBGIC_Str8ToPtrNode*, map->buckets_count); } -static void* -raddbgic_str8toptr_lookup(RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash) +RADDBGI_PROC void* +raddbgic_str8toptr_map_lookup(RADDBGIC_Str8ToPtrMap *map, String8 key, RADDBGI_U64 hash) { void *result = 0; - U64 bucket_idx = hash%map->buckets_count; + RADDBGI_U64 bucket_idx = hash%map->buckets_count; for(RADDBGIC_Str8ToPtrNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) @@ -351,12 +391,12 @@ raddbgic_str8toptr_lookup(RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash) return result; } -static void -raddbgic_str8toptr_insert(Arena *arena, RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash, void *ptr) +RADDBGI_PROC void +raddbgic_str8toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, String8 key, RADDBGI_U64 hash, void *ptr) { - U64 bucket_idx = hash%map->buckets_count; + RADDBGI_U64 bucket_idx = hash%map->buckets_count; - RADDBGIC_Str8ToPtrNode *node = push_array(arena, RADDBGIC_Str8ToPtrNode, 1); + RADDBGIC_Str8ToPtrNode *node = raddbgic_push_array(arena, RADDBGIC_Str8ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); node->key = push_str8_copy(arena, key); @@ -371,11 +411,11 @@ raddbgic_str8toptr_insert(Arena *arena, RADDBGIC_Str8ToPtrMap *map, String8 key, //- rjf: root creation -static RADDBGIC_Root* -raddbgic_root_new(RADDBGIC_RootParams *params) +RADDBGI_PROC RADDBGIC_Root* +raddbgic_root_alloc(RADDBGIC_RootParams *params) { - Arena *arena = arena_alloc__sized(GB(64), MB(64)); - RADDBGIC_Root *result = push_array(arena, RADDBGIC_Root, 1); + RADDBGIC_Arena *arena = arena_alloc__sized(GB(64), MB(64)); + RADDBGIC_Root *result = raddbgic_push_array(arena, RADDBGIC_Root, 1); result->arena = arena; // fill in root parameters @@ -397,7 +437,7 @@ raddbgic_root_new(RADDBGIC_RootParams *params) // setup a null scope { - RADDBGIC_Scope *scope = push_array(result->arena, RADDBGIC_Scope, 1); + RADDBGIC_Scope *scope = raddbgic_push_array(result->arena, RADDBGIC_Scope, 1); SLLQueuePush_N(result->first_scope, result->last_scope, scope, next_order); result->scope_count += 1; } @@ -411,12 +451,12 @@ raddbgic_root_new(RADDBGIC_RootParams *params) { #define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128)) - raddbgic_u64toptr_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); - raddbgic_u64toptr_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); - raddbgic_u64toptr_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); - raddbgic_u64toptr_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); - raddbgic_u64toptr_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); - raddbgic_str8toptr_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); + raddbgic_u64toptr_map_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); + raddbgic_u64toptr_map_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); + raddbgic_u64toptr_map_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); + raddbgic_u64toptr_map_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); + raddbgic_u64toptr_map_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); + raddbgic_str8toptr_map_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); #undef BKTCOUNT } @@ -424,7 +464,7 @@ raddbgic_root_new(RADDBGIC_RootParams *params) return result; } -static void +RADDBGI_PROC void raddbgic_root_release(RADDBGIC_Root *root) { arena_release(root->arena); @@ -432,34 +472,34 @@ raddbgic_root_release(RADDBGIC_Root *root) //- rjf: error accumulation -static void -raddbgic_error(RADDBGIC_Root *root, String8 string) +RADDBGI_PROC void +raddbgic_push_error(RADDBGIC_Root *root, String8 string) { - RADDBGIC_Error *error = push_array(root->arena, RADDBGIC_Error, 1); + RADDBGIC_Error *error = raddbgic_push_array(root->arena, RADDBGIC_Error, 1); SLLQueuePush(root->errors.first, root->errors.last, error); root->errors.count += 1; error->msg = string; } -static void -raddbgic_errorf(RADDBGIC_Root *root, char *fmt, ...) +RADDBGI_PROC void +raddbgic_push_errorf(RADDBGIC_Root *root, char *fmt, ...) { va_list args; va_start(args, fmt); String8 str = push_str8fv(root->arena, fmt, args); - raddbgic_error(root, str); + raddbgic_push_error(root, str); va_end(args); } -static RADDBGIC_Error* -raddbgic_get_first_error(RADDBGIC_Root *root) +RADDBGI_PROC RADDBGIC_Error* +raddbgic_first_error_from_root(RADDBGIC_Root *root) { return root->errors.first; } //- rjf: top-level info specification -static void +RADDBGI_PROC void raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli) { raddbgic_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); @@ -469,10 +509,10 @@ raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli) //- rjf: binary section building -static void -raddbgic_add_binary_section(RADDBGIC_Root *root, String8 name, RADDBGI_BinarySectionFlags flags, U64 voff_first, U64 voff_opl, U64 foff_first, U64 foff_opl) +RADDBGI_PROC void +raddbgic_add_binary_section(RADDBGIC_Root *root, String8 name, RADDBGI_BinarySectionFlags flags, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, RADDBGI_U64 foff_opl) { - RADDBGIC_BinarySection *sec = push_array(root->arena, RADDBGIC_BinarySection, 1); + RADDBGIC_BinarySection *sec = raddbgic_push_array(root->arena, RADDBGIC_BinarySection, 1); SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); root->binary_section_count += 1; sec->name = name; @@ -485,11 +525,11 @@ raddbgic_add_binary_section(RADDBGIC_Root *root, String8 name, RADDBGI_BinarySec //- rjf: unit info building -static RADDBGIC_Unit* -raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, U64 unit_user_id, U64 unit_user_id_hash) +RADDBGI_PROC RADDBGIC_Unit* +raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 unit_user_id, RADDBGI_U64 unit_user_id_hash) { RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); + raddbgic_u64toptr_map_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); RADDBGIC_Unit *result = 0; if(lookup.match != 0) { @@ -497,16 +537,16 @@ raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, U64 unit_user_id, U64 uni } else { - result = push_array(root->arena, RADDBGIC_Unit, 1); + result = raddbgic_push_array(root->arena, RADDBGIC_Unit, 1); result->idx = root->unit_count; SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); root->unit_count += 1; - raddbgic_u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); + raddbgic_u64toptr_map_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); } return result; } -static void +RADDBGI_PROC void raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitInfo *info) { raddbgic_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); @@ -520,34 +560,34 @@ raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitIn unit->language = info->language; } -static void +RADDBGI_PROC void raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_LineSequence *line_sequence) { - RADDBGIC_LineSequenceNode *node = push_array(root->arena, RADDBGIC_LineSequenceNode, 1); + RADDBGIC_LineSequenceNode *node = raddbgic_push_array(root->arena, RADDBGIC_LineSequenceNode, 1); SLLQueuePush(unit->line_seq_first, unit->line_seq_last, node); unit->line_seq_count += 1; node->line_seq.file_name = push_str8_copy(root->arena, line_sequence->file_name); - node->line_seq.voffs = push_array(root->arena, U64, line_sequence->line_count + 1); - MemoryCopy(node->line_seq.voffs, line_sequence->voffs, sizeof(U64)*(line_sequence->line_count + 1)); + node->line_seq.voffs = raddbgic_push_array(root->arena, RADDBGI_U64, line_sequence->line_count + 1); + MemoryCopy(node->line_seq.voffs, line_sequence->voffs, sizeof(RADDBGI_U64)*(line_sequence->line_count + 1)); - node->line_seq.line_nums = push_array(root->arena, U32, line_sequence->line_count); - MemoryCopy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(U32)*line_sequence->line_count); + node->line_seq.line_nums = raddbgic_push_array(root->arena, RADDBGI_U32, line_sequence->line_count); + MemoryCopy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(RADDBGI_U32)*line_sequence->line_count); if(line_sequence->col_nums != 0) { - node->line_seq.col_nums = push_array(root->arena, U16, line_sequence->line_count); + node->line_seq.col_nums = raddbgic_push_array(root->arena, U16, line_sequence->line_count); MemoryCopy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(U16)*line_sequence->line_count); } node->line_seq.line_count = line_sequence->line_count; } -static void -raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, U64 first, U64 opl) +RADDBGI_PROC void +raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGI_U64 first, RADDBGI_U64 opl) { - RADDBGIC_UnitVMapRange *node = push_array(root->arena, RADDBGIC_UnitVMapRange, 1); + RADDBGIC_UnitVMapRange *node = raddbgic_push_array(root->arena, RADDBGIC_UnitVMapRange, 1); SLLQueuePush(root->unit_vmap_range_first, root->unit_vmap_range_last, node); root->unit_vmap_range_count += 1; node->unit = unit; @@ -557,31 +597,31 @@ raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, U64 first //- rjf: type info lookups/reservations -static RADDBGIC_Type* -raddbgic_type_from_id(RADDBGIC_Root *root, U64 type_user_id, U64 type_user_id_hash) +RADDBGI_PROC RADDBGIC_Type* +raddbgic_type_from_id(RADDBGIC_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash) { RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); + raddbgic_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); RADDBGIC_Type *result = (RADDBGIC_Type*)lookup.match; return result; } -static RADDBGIC_Reservation* -raddbgic_type_reserve_id(RADDBGIC_Root *root, U64 type_user_id, U64 type_user_id_hash) +RADDBGI_PROC RADDBGIC_Reservation* +raddbgic_type_reserve_id(RADDBGIC_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash) { RADDBGIC_Reservation *result = 0; RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); + raddbgic_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); if(lookup.match == 0) { - raddbgic_u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); + raddbgic_u64toptr_map_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); void **slot = &lookup.fill_node->ptr[lookup.fill_k]; result = (RADDBGIC_Reservation*)slot; } return result; } -static void +RADDBGI_PROC void raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_Type *type) { if(res != 0 && type != 0) @@ -592,26 +632,26 @@ raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_T //- rjf: nil/singleton types -static B32 +RADDBGI_PROC B32 raddbgic_type_is_unhandled_nil(RADDBGIC_Root *root, RADDBGIC_Type *type) { B32 result = (type->kind == RADDBGI_TypeKind_NULL && type != &root->handled_nil_type); return result; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_handled_nil(RADDBGIC_Root *root) { return &root->handled_nil_type; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_nil(RADDBGIC_Root *root) { return root->nil_type; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_variadic(RADDBGIC_Root *root) { return root->variadic_type; @@ -619,22 +659,22 @@ raddbgic_type_variadic(RADDBGIC_Root *root) //- rjf: base type info constructors -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_new(RADDBGIC_Root *root) { - RADDBGIC_Type *result = push_array(root->arena, RADDBGIC_Type, 1); + RADDBGIC_Type *result = raddbgic_push_array(root->arena, RADDBGIC_Type, 1); result->idx = root->type_count; SLLQueuePush_N(root->first_type, root->last_type, result, next_order); root->type_count += 1; return result; } -static RADDBGIC_TypeUDT* +RADDBGI_PROC RADDBGIC_TypeUDT* raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type) { if(type->udt == 0) { - RADDBGIC_TypeUDT *new_udt = push_array(root->arena, RADDBGIC_TypeUDT, 1); + RADDBGIC_TypeUDT *new_udt = raddbgic_push_array(root->arena, RADDBGIC_TypeUDT, 1); new_udt->idx = root->type_udt_count; SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); root->type_udt_count += 1; @@ -645,7 +685,7 @@ raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type) return result; } -static RADDBGIC_TypeUDT* +RADDBGI_PROC RADDBGIC_TypeUDT* raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type) { raddbgic_requiref(root, (type->kind == RADDBGI_TypeKind_Struct || @@ -660,7 +700,7 @@ raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type) //- rjf: basic/operator type construction helpers -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name) { raddbgic_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); @@ -668,10 +708,10 @@ raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 nam Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(type_kind) + name.size; - U8 *buf = push_array(scratch.arena, U8, buf_size); + RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(type_kind) + name.size; + RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); { - U8 *ptr = buf; + RADDBGI_U8 *ptr = buf; // "basic" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Basic; ptr += sizeof(RADDBGIC_TypeConstructKind); @@ -685,13 +725,13 @@ raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 nam // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // calculate size - U32 byte_size = raddbgi_size_from_basic_type_kind(type_kind); + RADDBGI_U32 byte_size = raddbgi_size_from_basic_type_kind(type_kind); if(byte_size == 0xFFFFFFFF) { byte_size = root->addr_size; @@ -704,7 +744,7 @@ raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 nam result->byte_size = byte_size; // save in construct map - raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); // save in name map { @@ -718,17 +758,17 @@ raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 nam return result; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeModifierFlags flags) { RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); - U8 *buf = push_array(scratch.arena, U8, buf_size); + RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); + RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); { - U8 *ptr = buf; + RADDBGI_U8 *ptr = buf; // "modifier" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Modifier; ptr += sizeof(RADDBGIC_TypeConstructKind); @@ -742,8 +782,8 @@ raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_ // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; if(result == 0){ @@ -755,7 +795,7 @@ raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_ result->direct_type = direct_type; // save in construct map - raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -763,17 +803,17 @@ raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_ return result; } -static RADDBGIC_Type* -raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U32 bit_off, U32 bit_count) +RADDBGI_PROC RADDBGIC_Type* +raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count) { RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(U32)*2; - U8 *buf = push_array(scratch.arena, U8, buf_size); + RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(RADDBGI_U32)*2; + RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); { - U8 *ptr = buf; + RADDBGI_U8 *ptr = buf; // "bitfield" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Bitfield; ptr += sizeof(RADDBGIC_TypeConstructKind); @@ -790,8 +830,8 @@ raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U32 bit_ // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { @@ -804,7 +844,7 @@ raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U32 bit_ result->direct_type = direct_type; // save in construct map - raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -812,7 +852,7 @@ raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U32 bit_ return result; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeKind ptr_type_kind) { raddbgic_requiref(root, (ptr_type_kind == RADDBGI_TypeKind_Ptr || @@ -824,10 +864,10 @@ raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_T Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); - U8 *buf = push_array(scratch.arena, U8, buf_size); + RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); + RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); { - U8 *ptr = buf; + RADDBGI_U8 *ptr = buf; // "pointer" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Pointer; ptr += sizeof(RADDBGIC_TypeConstructKind); @@ -841,8 +881,8 @@ raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_T // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { @@ -853,7 +893,7 @@ raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_T result->direct_type = direct_type; // save in construct map - raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -861,18 +901,18 @@ raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_T return result; } -static RADDBGIC_Type* -raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U64 count) +RADDBGI_PROC RADDBGIC_Type* +raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U64 count) { RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = + RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); - U8 *buf = push_array(scratch.arena, U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); { - U8 *ptr = buf; + RADDBGI_U8 *ptr = buf; // "array" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Array; ptr += sizeof(RADDBGIC_TypeConstructKind); @@ -886,8 +926,8 @@ raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U64 count) // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { @@ -899,7 +939,7 @@ raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U64 count) result->byte_size = direct_type->byte_size*count; // save in construct map - raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -907,17 +947,17 @@ raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U64 count) return result; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params) { RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); - U8 *buf = push_array(scratch.arena, U8, buf_size); + RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); + RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); { - U8 *ptr = buf; + RADDBGI_U8 *ptr = buf; // "procedure" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Procedure; ptr += sizeof(RADDBGIC_TypeConstructKind); @@ -936,13 +976,13 @@ raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDB // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // setup param buffer - RADDBGIC_Type **param_types = push_array(root->arena, RADDBGIC_Type*, params->count); + RADDBGIC_Type **param_types = raddbgic_push_array(root->arena, RADDBGIC_Type*, params->count); { RADDBGIC_Type **ptr = param_types; for(RADDBGIC_TypeNode *node = params->first; @@ -963,7 +1003,7 @@ raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDB result->param_types = param_types; // save in construct map - raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -971,18 +1011,18 @@ raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDB return result; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params) { RADDBGIC_Type *result = root->nil_type; Temp scratch = scratch_begin(0, 0); // setup construct buffer - U64 buf_size = + RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); - U8 *buf = push_array(scratch.arena, U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); { - U8 *ptr = buf; + RADDBGI_U8 *ptr = buf; // "method" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Method; ptr += sizeof(RADDBGIC_TypeConstructKind); @@ -1004,13 +1044,13 @@ raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Typ // check for duplicate construct String8 blob = str8(buf, buf_size); - U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_lookup(&root->construct_map, blob, blob_hash); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; if(result == 0) { // setup param buffer - RADDBGIC_Type **param_types = push_array(root->arena, RADDBGIC_Type*, params->count + 1); + RADDBGIC_Type **param_types = raddbgic_push_array(root->arena, RADDBGIC_Type*, params->count + 1); { RADDBGIC_Type **ptr = param_types; { @@ -1035,7 +1075,7 @@ raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Typ result->param_types = param_types; // save in construct map - raddbgic_str8toptr_insert(root->arena, &root->construct_map, blob, blob_hash, result); + raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } scratch_end(scratch); @@ -1045,8 +1085,8 @@ raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Typ //- rjf: udt type constructors -static RADDBGIC_Type* -raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, U64 size) +RADDBGI_PROC RADDBGIC_Type* +raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, RADDBGI_U64 size) { raddbgic_requiref(root, (record_type_kind == RADDBGI_TypeKind_Struct || record_type_kind == RADDBGI_TypeKind_Class || @@ -1069,7 +1109,7 @@ raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String return result; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name) { // rjf: make type @@ -1088,7 +1128,7 @@ raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name return result; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name) { // rjf: make type @@ -1107,7 +1147,7 @@ raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 nam return result; } -static RADDBGIC_Type* +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name) { raddbgic_requiref(root, (type_kind == RADDBGI_TypeKind_IncompleteStruct || @@ -1133,13 +1173,13 @@ raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String //- rjf: type member building -static void -raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type, U32 off) +RADDBGI_PROC void +raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type, RADDBGI_U32 off) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); + RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1150,13 +1190,13 @@ raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_t } } -static void +RADDBGI_PROC void raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); + RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1166,13 +1206,13 @@ raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_ } } -static void +RADDBGI_PROC void raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); + RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1182,13 +1222,13 @@ raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, } } -static void +RADDBGI_PROC void raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); + RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; @@ -1200,13 +1240,13 @@ raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *recor } } -static void +RADDBGI_PROC void raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); + RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1216,13 +1256,13 @@ raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *reco } } -static void -raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, U32 off) +RADDBGI_PROC void +raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, RADDBGI_U32 off) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); + RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1232,13 +1272,13 @@ raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, R } } -static void -raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, U32 vptr_off, U32 vtable_off) +RADDBGI_PROC void +raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, RADDBGI_U32 vptr_off, RADDBGI_U32 vtable_off) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); + RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1248,13 +1288,13 @@ raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record } } -static void +RADDBGI_PROC void raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *nested_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) { - RADDBGIC_TypeMember *member = push_array(root->arena, RADDBGIC_TypeMember, 1); + RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; @@ -1263,14 +1303,14 @@ raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_ } } -static void -raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, String8 name, U64 val) +RADDBGI_PROC void +raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, String8 name, RADDBGI_U64 val) { raddbgic_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_any_type(root, enum_type); if(udt != 0) { - RADDBGIC_TypeEnumVal *enum_val = push_array(root->arena, RADDBGIC_TypeEnumVal, 1); + RADDBGIC_TypeEnumVal *enum_val = raddbgic_push_array(root->arena, RADDBGIC_TypeEnumVal, 1); SLLQueuePush(udt->first_enum_val, udt->last_enum_val, enum_val); udt->enum_val_count += 1; root->total_enum_val_count += 1; @@ -1280,8 +1320,8 @@ raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, String } //- rjf: type source coordinate specifications -static void -raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, String8 source_path, U32 line, U32 col) +RADDBGI_PROC void +raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col) { raddbgic_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), return, "Tried to add source coordinates to non-user-defined type."); @@ -1296,11 +1336,11 @@ raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined //- rjf: symbol info building -static RADDBGIC_Symbol* -raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash) +RADDBGI_PROC RADDBGIC_Symbol* +raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 symbol_user_id, RADDBGI_U64 symbol_user_id_hash) { RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); + raddbgic_u64toptr_map_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); RADDBGIC_Symbol *result = 0; if(lookup.match != 0) { @@ -1308,15 +1348,15 @@ raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, U64 symbol_user_id, U64 } else { - result = push_array(root->arena, RADDBGIC_Symbol, 1); + result = raddbgic_push_array(root->arena, RADDBGIC_Symbol, 1); SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); root->symbol_count += 1; - raddbgic_u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); + raddbgic_u64toptr_map_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); } return result; } -static void +RADDBGI_PROC void raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_SymbolInfo *info) { // rjf: unpack @@ -1394,28 +1434,28 @@ raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_ //- rjf: scope info building -static RADDBGIC_Scope * -raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, U64 scope_user_id, U64 scope_user_id_hash) +RADDBGI_PROC RADDBGIC_Scope * +raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 scope_user_id, RADDBGI_U64 scope_user_id_hash) { RADDBGIC_Scope *result = 0; RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); + raddbgic_u64toptr_map_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); if(lookup.match != 0) { result = (RADDBGIC_Scope*)lookup.match; } else { - result = push_array(root->arena, RADDBGIC_Scope, 1); + result = raddbgic_push_array(root->arena, RADDBGIC_Scope, 1); result->idx = root->scope_count; SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); root->scope_count += 1; - raddbgic_u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); + raddbgic_u64toptr_map_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); } return result; } -static void +RADDBGI_PROC void raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_Scope *parent) { raddbgic_requiref(root, scope->parent_scope == 0, return, "Scope parent set multiple times."); @@ -1425,10 +1465,10 @@ raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_S SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); } -static void -raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, U64 voff_first, U64 voff_opl) +RADDBGI_PROC void +raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl) { - RADDBGIC_VOffRange *range = push_array(root->arena, RADDBGIC_VOffRange, 1); + RADDBGIC_VOffRange *range = raddbgic_push_array(root->arena, RADDBGIC_VOffRange, 1); SLLQueuePush(scope->first_range, scope->last_range, range); scope->range_count += 1; range->voff_first = voff_first; @@ -1437,7 +1477,7 @@ raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, U64 vo root->scope_voff_count += 2; } -static void +RADDBGI_PROC void raddbgic_scope_recursive_set_symbol(RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol) { scope->symbol = symbol; @@ -1451,25 +1491,25 @@ raddbgic_scope_recursive_set_symbol(RADDBGIC_Scope *scope, RADDBGIC_Symbol *symb //- rjf: local info building -static RADDBGIC_Local* -raddbgic_local_handle_from_user_id(RADDBGIC_Root *root, U64 local_user_id, U64 local_user_id_hash) +RADDBGI_PROC RADDBGIC_Local* +raddbgic_local_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 local_user_id, RADDBGI_U64 local_user_id_hash) { RADDBGIC_Local *result = 0; RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); + raddbgic_u64toptr_map_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); if(lookup.match != 0) { result = (RADDBGIC_Local*)lookup.match; } else { - result = push_array(root->arena, RADDBGIC_Local, 1); - raddbgic_u64toptr_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); + result = raddbgic_push_array(root->arena, RADDBGIC_Local, 1); + raddbgic_u64toptr_map_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); } return result; } -static void +RADDBGI_PROC void raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBGIC_LocalInfo *info) { raddbgic_requiref(root, local->kind == RADDBGI_LocalKind_NULL, return, "Local information set multiple times."); @@ -1485,13 +1525,13 @@ raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBG local->type = info->type; } -static RADDBGIC_LocationSet* +RADDBGI_PROC RADDBGIC_LocationSet* raddbgic_location_set_from_local(RADDBGIC_Root *root, RADDBGIC_Local *local) { RADDBGIC_LocationSet *result = local->locset; if(result == 0) { - local->locset = push_array(root->arena, RADDBGIC_LocationSet, 1); + local->locset = raddbgic_push_array(root->arena, RADDBGIC_LocationSet, 1); result = local->locset; } return result; @@ -1499,10 +1539,10 @@ raddbgic_location_set_from_local(RADDBGIC_Root *root, RADDBGIC_Local *local) //- rjf: location info building -static void -raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset, U64 voff_first, U64 voff_opl, RADDBGIC_Location *location) +RADDBGI_PROC void +raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGIC_Location *location) { - RADDBGIC_LocationCase *location_case = push_array(root->arena, RADDBGIC_LocationCase, 1); + RADDBGIC_LocationCase *location_case = raddbgic_push_array(root->arena, RADDBGIC_LocationCase, 1); SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); locset->location_case_count += 1; root->location_count += 1; @@ -1511,48 +1551,48 @@ raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset location_case->location = location; } -static RADDBGIC_Location* +RADDBGI_PROC RADDBGIC_Location* raddbgic_location_addr_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode) { - RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); + RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_AddrBytecodeStream; result->bytecode = *bytecode; return result; } -static RADDBGIC_Location* +RADDBGI_PROC RADDBGIC_Location* raddbgic_location_val_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode) { - RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); + RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_ValBytecodeStream; result->bytecode = *bytecode; return result; } -static RADDBGIC_Location* -raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, U8 reg_code, U16 offset) +RADDBGI_PROC RADDBGIC_Location* +raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, U16 offset) { - RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); + RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_AddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; return result; } -static RADDBGIC_Location* -raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, U8 reg_code, U16 offset) +RADDBGI_PROC RADDBGIC_Location* +raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, U16 offset) { - RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); + RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_AddrAddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; return result; } -static RADDBGIC_Location* -raddbgic_location_val_reg(RADDBGIC_Root *root, U8 reg_code) +RADDBGI_PROC RADDBGIC_Location* +raddbgic_location_val_reg(RADDBGIC_Root *root, RADDBGI_U8 reg_code) { - RADDBGIC_Location *result = push_array(root->arena, RADDBGIC_Location, 1); + RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_ValRegister; result->register_code = reg_code; return result; @@ -1560,7 +1600,7 @@ raddbgic_location_val_reg(RADDBGIC_Root *root, U8 reg_code) //- rjf: name map building -static RADDBGIC_NameMap* +RADDBGI_PROC RADDBGIC_NameMap* raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind) { RADDBGIC_NameMap *result = 0; @@ -1568,21 +1608,21 @@ raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind) { if(root->name_maps[kind] == 0) { - root->name_maps[kind] = push_array(root->arena, RADDBGIC_NameMap, 1); + root->name_maps[kind] = raddbgic_push_array(root->arena, RADDBGIC_NameMap, 1); root->name_maps[kind]->buckets_count = 16384; - root->name_maps[kind]->buckets = push_array(root->arena, RADDBGIC_NameMapNode *, root->name_maps[kind]->buckets_count); + root->name_maps[kind]->buckets = raddbgic_push_array(root->arena, RADDBGIC_NameMapNode *, root->name_maps[kind]->buckets_count); } result = root->name_maps[kind]; } return result; } -static void -raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 string, U32 idx) +RADDBGI_PROC void +raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 string, RADDBGI_U32 idx) { // hash - U64 hash = raddbgi_hash(string.str, string.size); - U64 bucket_idx = hash%map->buckets_count; + RADDBGI_U64 hash = raddbgi_hash(string.str, string.size); + RADDBGI_U64 bucket_idx = hash%map->buckets_count; // find existing name node RADDBGIC_NameMapNode *match = 0; @@ -1600,7 +1640,7 @@ raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 s // make name node if necessary if(match == 0) { - match = push_array(root->arena, RADDBGIC_NameMapNode, 1); + match = raddbgic_push_array(root->arena, RADDBGIC_NameMapNode, 1); match->string = push_str8_copy(root->arena, string); SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); SLLQueuePush_N(map->first, map->last, match, order_next); @@ -1614,7 +1654,7 @@ raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 s node != 0; node = node->next) { - for(U32 i = 0; i < ArrayCount(node->idx); i += 1) + for(RADDBGI_U32 i = 0; i < ArrayCount(node->idx); i += 1) { if(node->idx[i] == 0) { @@ -1632,10 +1672,10 @@ raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 s if(!existing_idx) { RADDBGIC_NameMapIdxNode *idx_node = match->idx_last; - U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); + RADDBGI_U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); if(insert_i == 0) { - idx_node = push_array(root->arena, RADDBGIC_NameMapIdxNode, 1); + idx_node = raddbgic_push_array(root->arena, RADDBGIC_NameMapIdxNode, 1); SLLQueuePush(match->idx_first, match->idx_last, idx_node); } @@ -1649,23 +1689,23 @@ raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 s //- rjf: bake context construction -static RADDBGIC_BakeCtx* +RADDBGI_PROC RADDBGIC_BakeCtx* raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params) { Arena *arena = arena_alloc(); - RADDBGIC_BakeCtx *result = push_array(arena, RADDBGIC_BakeCtx, 1); + RADDBGIC_BakeCtx *result = raddbgic_push_array(arena, RADDBGIC_BakeCtx, 1); result->arena = arena; #define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) result->strs.buckets_count = BKTCOUNT(params->strings_bucket_count); result->idxs.buckets_count = BKTCOUNT(params->idx_runs_bucket_count); #undef BKTCOUNT - result->strs.buckets = push_array(arena, RADDBGIC_StringNode *, result->strs.buckets_count); - result->idxs.buckets = push_array(arena, RADDBGIC_IdxRunNode *, result->idxs.buckets_count); + result->strs.buckets = raddbgic_push_array(arena, RADDBGIC_StringNode *, result->strs.buckets_count); + result->idxs.buckets = raddbgic_push_array(arena, RADDBGIC_IdxRunNode *, result->idxs.buckets_count); - raddbgic_string(result, str8_lit("")); + raddbgic_string(result, raddbgic_str8_lit("")); raddbgic_idx_run(result, 0, 0); - result->tree = push_array(arena, RADDBGIC_PathTree, 1); + result->tree = raddbgic_push_array(arena, RADDBGIC_PathTree, 1); { RADDBGIC_PathNode *nil_path_node = raddbgic_paths_new_node(result); nil_path_node->name = str8_lit(""); @@ -1678,7 +1718,7 @@ raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params) return result; } -static void +RADDBGI_PROC void raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx) { arena_release(bake_ctx->arena); @@ -1686,13 +1726,13 @@ raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx) //- rjf: string baking -static U32 +RADDBGI_PROC RADDBGI_U32 raddbgic_string(RADDBGIC_BakeCtx *bctx, String8 str) { Arena *arena = bctx->arena; RADDBGIC_Strings *strs = &bctx->strs; - U64 hash = raddbgi_hash(str.str, str.size); - U64 bucket_idx = hash%strs->buckets_count; + RADDBGI_U64 hash = raddbgi_hash(str.str, str.size); + RADDBGI_U64 bucket_idx = hash%strs->buckets_count; // look for a match RADDBGIC_StringNode *match = 0; @@ -1723,18 +1763,18 @@ raddbgic_string(RADDBGIC_BakeCtx *bctx, String8 str) // extract idx to return Assert(match != 0); - U32 result = match->idx; + RADDBGI_U32 result = match->idx; return result; } //- rjf: idx run baking -static U64 -raddbgic_idx_run_hash(U32 *idx_run, U32 count) +RADDBGI_PROC RADDBGI_U64 +raddbgic_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count) { - U64 hash = 5381; - U32 *ptr = idx_run; - U32 *opl = idx_run + count; + RADDBGI_U64 hash = 5381; + RADDBGI_U32 *ptr = idx_run; + RADDBGI_U32 *opl = idx_run + count; for(;ptr < opl; ptr += 1) { hash = ((hash << 5) + hash) + (*ptr); @@ -1742,14 +1782,14 @@ raddbgic_idx_run_hash(U32 *idx_run, U32 count) return(hash); } -static U32 -raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, U32 *idx_run, U32 count) +RADDBGI_PROC RADDBGI_U32 +raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count) { Arena *arena = bctx->arena; RADDBGIC_IdxRuns *idxs = &bctx->idxs; - U64 hash = raddbgic_idx_run_hash(idx_run, count); - U64 bucket_idx = hash%idxs->buckets_count; + RADDBGI_U64 hash = raddbgic_idx_run_hash(idx_run, count); + RADDBGI_U64 bucket_idx = hash%idxs->buckets_count; // look for a match RADDBGIC_IdxRunNode *match = 0; @@ -1760,8 +1800,8 @@ raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, U32 *idx_run, U32 count) if(node->hash == hash) { S32 is_match = 1; - U32 *node_idx = node->idx_run; - for(U32 i = 0; i < count; i += 1) + RADDBGI_U32 *node_idx = node->idx_run; + for(RADDBGI_U32 i = 0; i < count; i += 1) { if(node_idx[i] != idx_run[i]) { @@ -1781,8 +1821,8 @@ raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, U32 *idx_run, U32 count) if(match == 0) { RADDBGIC_IdxRunNode *node = push_array_no_zero(arena, RADDBGIC_IdxRunNode, 1); - U32 *idx_run_copy = push_array_no_zero(arena, U32, count); - for(U32 i = 0; i < count; i += 1) + RADDBGI_U32 *idx_run_copy = push_array_no_zero(arena, RADDBGI_U32, count); + for(RADDBGI_U32 i = 0; i < count; i += 1) { idx_run_copy[i] = idx_run[i]; } @@ -1800,17 +1840,17 @@ raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, U32 *idx_run, U32 count) // extract idx to return Assert(match != 0); - U32 result = match->first_idx; + RADDBGI_U32 result = match->first_idx; return result; } //- rjf: data section baking -static U32 -raddbgic_dsection(Arena *arena, RADDBGIC_DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag) +RADDBGI_PROC RADDBGI_U32 +raddbgic_dsection(RADDBGIC_Arena *arena, RADDBGIC_DSections *dss, void *data, RADDBGI_U64 size, RADDBGI_DataSectionTag tag) { - U32 result = dss->count; - RADDBGIC_DSectionNode *node = push_array(arena, RADDBGIC_DSectionNode, 1); + RADDBGI_U32 result = dss->count; + RADDBGIC_DSectionNode *node = raddbgic_push_array(arena, RADDBGIC_DSectionNode, 1); SLLQueuePush(dss->first, dss->last, node); node->data = data; node->size = size; @@ -1821,11 +1861,11 @@ raddbgic_dsection(Arena *arena, RADDBGIC_DSections *dss, void *data, U64 size, R //- rjf: paths baking -static String8 -raddbgic_normal_string_from_path_node(Arena *arena, RADDBGIC_PathNode *node) +RADDBGI_PROC String8 +raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node) { Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; + RADDBGIC_String8List list = {0}; if(node != 0) { raddbgic_normal_string_from_path_node_build(scratch.arena, node, &list); @@ -1834,11 +1874,11 @@ raddbgic_normal_string_from_path_node(Arena *arena, RADDBGIC_PathNode *node) join.sep = str8_lit("/"); String8 result = str8_list_join(arena, &list, &join); { - U8 *ptr = result.str; - U8 *opl = result.str + result.size; + RADDBGI_U8 *ptr = result.str; + RADDBGI_U8 *opl = result.str + result.size; for(; ptr < opl; ptr += 1) { - U8 c = *ptr; + RADDBGI_U8 c = *ptr; if('A' <= c && c <= 'Z') { c += 'a' - 'A'; } *ptr = c; } @@ -1847,8 +1887,8 @@ raddbgic_normal_string_from_path_node(Arena *arena, RADDBGIC_PathNode *node) return result; } -static void -raddbgic_normal_string_from_path_node_build(Arena *arena, RADDBGIC_PathNode *node, String8List *out) +RADDBGI_PROC void +raddbgic_normal_string_from_path_node_build(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node, String8List *out) { // TODO(rjf): why is this recursive... if(node->parent != 0) @@ -1861,18 +1901,18 @@ raddbgic_normal_string_from_path_node_build(Arena *arena, RADDBGIC_PathNode *nod } } -static RADDBGIC_PathNode* +RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx) { RADDBGIC_PathTree *tree = bctx->tree; - RADDBGIC_PathNode *result = push_array(bctx->arena, RADDBGIC_PathNode, 1); + RADDBGIC_PathNode *result = raddbgic_push_array(bctx->arena, RADDBGIC_PathNode, 1); SLLQueuePush_N(tree->first, tree->last, result, next_order); result->idx = tree->count; tree->count += 1; return result; } -static RADDBGIC_PathNode* +RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, String8 sub_dir) { // look for existing match @@ -1904,19 +1944,19 @@ raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, String8 return result; } -static RADDBGIC_PathNode* +RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, String8 path) { RADDBGIC_PathNode *node_cursor = &bctx->tree->root; - U8 *ptr = path.str; - U8 *opl = path.str + path.size; + RADDBGI_U8 *ptr = path.str; + RADDBGI_U8 *opl = path.str + path.size; for(;ptr < opl;){ // skip past slashes for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); // save beginning of non-slash range - U8 *range_first = ptr; + RADDBGI_U8 *range_first = ptr; // skip past non-slashes for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); @@ -1932,26 +1972,26 @@ raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, String8 path) return result; } -static U32 +RADDBGI_PROC RADDBGI_U32 raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, String8 path) { RADDBGIC_PathNode *node = raddbgic_paths_node_from_path(bctx, path); - U32 result = node->idx; + RADDBGI_U32 result = node->idx; return result; } -static RADDBGIC_SrcNode* +RADDBGI_PROC RADDBGIC_SrcNode* raddbgic_paths_new_src_node(RADDBGIC_BakeCtx *bctx) { RADDBGIC_PathTree *tree = bctx->tree; - RADDBGIC_SrcNode *result = push_array(bctx->arena, RADDBGIC_SrcNode, 1); + RADDBGIC_SrcNode *result = raddbgic_push_array(bctx->arena, RADDBGIC_SrcNode, 1); SLLQueuePush(tree->src_first, tree->src_last, result); result->idx = tree->src_count; tree->src_count += 1; return result; } -static RADDBGIC_SrcNode* +RADDBGI_PROC RADDBGIC_SrcNode* raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *path_node) { RADDBGIC_SrcNode *result = path_node->src_file; @@ -1967,8 +2007,8 @@ raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode //- rjf: per-unit line info baking -static RADDBGIC_UnitLinesCombined* -raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq) +RADDBGI_PROC RADDBGIC_UnitLinesCombined* +raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq) { ProfBegin("raddbgic_unit_combine_lines"); Temp scratch = scratch_begin(&arena, 1); @@ -1976,8 +2016,8 @@ raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineS // gather up all line info into two arrays // keys: sortable array; pairs voffs with line info records; null records are sequence enders // recs: contains all the source coordinates for a range of voffs - U64 line_count = 0; - U64 seq_count = 0; + RADDBGI_U64 line_count = 0; + RADDBGI_U64 seq_count = 0; for(RADDBGIC_LineSequenceNode *node = first_seq; node != 0; node = node->next){ @@ -1985,7 +2025,7 @@ raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineS line_count += node->line_seq.line_count; } - U64 key_count = line_count + seq_count; + RADDBGI_U64 key_count = line_count + seq_count; RADDBGIC_SortKey *line_keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, key_count); RADDBGIC_LineRec *line_recs = push_array_no_zero(scratch.arena, RADDBGIC_LineRec, line_count); @@ -1999,10 +2039,10 @@ raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineS RADDBGIC_PathNode *src_path = raddbgic_paths_node_from_path(bctx, node->line_seq.file_name); RADDBGIC_SrcNode *src_file = raddbgic_paths_src_node_from_path_node(bctx, src_path); - U32 file_id = src_file->idx; + RADDBGI_U32 file_id = src_file->idx; - U64 node_line_count = node->line_seq.line_count; - for(U64 i = 0; i < node_line_count; i += 1){ + RADDBGI_U64 node_line_count = node->line_seq.line_count; + for(RADDBGI_U64 i = 0; i < node_line_count; i += 1){ key_ptr->key = node->line_seq.voffs[i]; key_ptr->val = rec_ptr; key_ptr += 1; @@ -2020,7 +2060,7 @@ raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineS key_ptr->val = 0; key_ptr += 1; - RADDBGIC_LineMapFragment *fragment = push_array(arena, RADDBGIC_LineMapFragment, 1); + RADDBGIC_LineMapFragment *fragment = raddbgic_push_array(arena, RADDBGIC_LineMapFragment, 1); SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); fragment->sequence = node; } @@ -2033,14 +2073,14 @@ raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineS // null record first, and no more than one null record and one non-null record // arrange output - U64 *arranged_voffs = push_array_no_zero(arena, U64, key_count + 1); + RADDBGI_U64 *arranged_voffs = push_array_no_zero(arena, RADDBGI_U64, key_count + 1); RADDBGI_Line *arranged_lines = push_array_no_zero(arena, RADDBGI_Line, key_count); - for(U64 i = 0; i < key_count; i += 1){ + for(RADDBGI_U64 i = 0; i < key_count; i += 1){ arranged_voffs[i] = sorted_line_keys[i].key; } arranged_voffs[key_count] = ~0ull; - for(U64 i = 0; i < key_count; i += 1){ + for(RADDBGI_U64 i = 0; i < key_count; i += 1){ RADDBGIC_LineRec *rec = (RADDBGIC_LineRec*)sorted_line_keys[i].val; if(rec != 0){ arranged_lines[i].file_idx = rec->file_id; @@ -2052,7 +2092,7 @@ raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineS } } - RADDBGIC_UnitLinesCombined *result = push_array(arena, RADDBGIC_UnitLinesCombined, 1); + RADDBGIC_UnitLinesCombined *result = raddbgic_push_array(arena, RADDBGIC_UnitLinesCombined, 1); result->voffs = arranged_voffs; result->lines = arranged_lines; result->cols = 0; @@ -2066,8 +2106,8 @@ raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineS //- rjf: per-src line info baking -static RADDBGIC_SrcLinesCombined* -raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) +RADDBGI_PROC RADDBGIC_SrcLinesCombined* +raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *first) { ProfBegin("raddbgic_source_combine_lines"); Temp scratch = scratch_begin(&arena, 1); @@ -2075,11 +2115,11 @@ raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) // gather line number map RADDBGIC_SrcLineMapBucket *first_bucket = 0; RADDBGIC_SrcLineMapBucket *last_bucket = 0; - U64 line_hash_slots_count = 1024; - RADDBGIC_SrcLineMapBucket **line_hash_slots = push_array(scratch.arena, RADDBGIC_SrcLineMapBucket *, line_hash_slots_count); - U64 line_count = 0; - U64 voff_count = 0; - U64 max_line_num = 0; + RADDBGI_U64 line_hash_slots_count = 1024; + RADDBGIC_SrcLineMapBucket **line_hash_slots = raddbgic_push_array(scratch.arena, RADDBGIC_SrcLineMapBucket *, line_hash_slots_count); + RADDBGI_U64 line_count = 0; + RADDBGI_U64 voff_count = 0; + RADDBGI_U64 max_line_num = 0; ProfScope("gather line number map") { for(RADDBGIC_LineMapFragment *map_fragment = first; @@ -2088,13 +2128,13 @@ raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) { RADDBGIC_LineSequence *sequence = &map_fragment->sequence->line_seq; - U64 *seq_voffs = sequence->voffs; - U32 *seq_line_nums = sequence->line_nums; - U64 seq_line_count = sequence->line_count; - for(U64 i = 0; i < seq_line_count; i += 1){ - U32 line_num = seq_line_nums[i]; - U64 voff = seq_voffs[i]; - U64 line_hash_slot_idx = line_num%line_hash_slots_count; + RADDBGI_U64 *seq_voffs = sequence->voffs; + RADDBGI_U32 *seq_line_nums = sequence->line_nums; + RADDBGI_U64 seq_line_count = sequence->line_count; + for(RADDBGI_U64 i = 0; i < seq_line_count; i += 1){ + RADDBGI_U32 line_num = seq_line_nums[i]; + RADDBGI_U64 voff = seq_voffs[i]; + RADDBGI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; // update unique voff counter & max line number voff_count += 1; @@ -2115,7 +2155,7 @@ raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) // introduce new line if no match if(match == 0){ - match = push_array(scratch.arena, RADDBGIC_SrcLineMapBucket, 1); + match = raddbgic_push_array(scratch.arena, RADDBGIC_SrcLineMapBucket, 1); SLLQueuePush_N(first_bucket, last_bucket, match, order_next); SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); match->line_num = line_num; @@ -2124,7 +2164,7 @@ raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) // insert new voff { - RADDBGIC_SrcLineMapVoffBlock *block = push_array(scratch.arena, RADDBGIC_SrcLineMapVoffBlock, 1); + RADDBGIC_SrcLineMapVoffBlock *block = raddbgic_push_array(scratch.arena, RADDBGIC_SrcLineMapVoffBlock, 1); SLLQueuePush(match->first_voff_block, match->last_voff_block, block); match->voff_count += 1; block->voff = voff; @@ -2150,15 +2190,15 @@ raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) RADDBGIC_SortKey *sorted_keys = raddbgic_sort_key_array(scratch.arena, keys, line_count); // bake result - U32 *line_nums = push_array_no_zero(arena, U32, line_count); - U32 *line_ranges = push_array_no_zero(arena, U32, line_count + 1); - U64 *voffs = push_array_no_zero(arena, U64, voff_count); + RADDBGI_U32 *line_nums = push_array_no_zero(arena, RADDBGI_U32, line_count); + RADDBGI_U32 *line_ranges = push_array_no_zero(arena, RADDBGI_U32, line_count + 1); + RADDBGI_U64 *voffs = push_array_no_zero(arena, RADDBGI_U64, voff_count); ProfScope("bake result") { - U64 *voff_ptr = voffs; - for(U32 i = 0; i < line_count; i += 1){ + RADDBGI_U64 *voff_ptr = voffs; + for(RADDBGI_U32 i = 0; i < line_count; i += 1){ line_nums[i] = sorted_keys[i].key; - line_ranges[i] = (U32)(voff_ptr - voffs); + line_ranges[i] = (RADDBGI_U32)(voff_ptr - voffs); RADDBGIC_SrcLineMapBucket *bucket = (RADDBGIC_SrcLineMapBucket*)sorted_keys[i].val; for(RADDBGIC_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; @@ -2170,7 +2210,7 @@ raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) line_ranges[line_count] = voff_count; } - RADDBGIC_SrcLinesCombined *result = push_array(arena, RADDBGIC_SrcLinesCombined, 1); + RADDBGIC_SrcLinesCombined *result = raddbgic_push_array(arena, RADDBGIC_SrcLinesCombined, 1); result->line_nums = line_nums; result->line_ranges = line_ranges; result->line_count = line_count; @@ -2184,8 +2224,8 @@ raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first) } //- rjf: vmap baking -static RADDBGIC_VMap* -raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, U64 marker_count) +RADDBGI_PROC RADDBGIC_VMap* +raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, RADDBGI_U64 marker_count) { Temp scratch = scratch_begin(&arena, 1); @@ -2193,15 +2233,15 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ RADDBGIC_SortKey *sorted_keys = raddbgic_sort_key_array(scratch.arena, keys, marker_count); // determine if an extra vmap entry for zero is needed - U32 extra_vmap_entry = 0; + RADDBGI_U32 extra_vmap_entry = 0; if(marker_count > 0 && sorted_keys[0].key != 0){ extra_vmap_entry = 1; } // fill output vmap entries - U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; + RADDBGI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; RADDBGI_VMapEntry *vmap = push_array_no_zero(arena, RADDBGI_VMapEntry, vmap_count_raw + 1); - U32 vmap_entry_count_pass_1 = 0; + RADDBGI_U32 vmap_entry_count_pass_1 = 0; { RADDBGI_VMapEntry *vmap_ptr = vmap; @@ -2219,18 +2259,18 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ RADDBGIC_SortKey *key_opl = sorted_keys + marker_count; for(;key_ptr < key_opl;){ // get initial map state from tracker stack - U32 initial_idx = max_U32; + RADDBGI_U32 initial_idx = max_U32; if(tracker_stack != 0){ initial_idx = tracker_stack->idx; } // update tracker stack // * we must process _all_ of the changes that apply at this voff before moving on - U64 voff = key_ptr->key; + RADDBGI_U64 voff = key_ptr->key; for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ RADDBGIC_VMapMarker *marker = (RADDBGIC_VMapMarker*)key_ptr->val; - U32 idx = marker->idx; + RADDBGI_U32 idx = marker->idx; // push to stack if(marker->begin_range){ @@ -2239,7 +2279,7 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ SLLStackPop(tracker_free); } else{ - new_tracker = push_array(scratch.arena, RADDBGIC_VMapRangeTracker, 1); + new_tracker = raddbgic_push_array(scratch.arena, RADDBGIC_VMapRangeTracker, 1); } SLLStackPush(tracker_stack, new_tracker); new_tracker->idx = idx; @@ -2266,7 +2306,7 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ } // get final map state from tracker stack - U32 final_idx = 0; + RADDBGI_U32 final_idx = 0; if(tracker_stack != 0){ final_idx = tracker_stack->idx; } @@ -2279,7 +2319,7 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ } } - vmap_entry_count_pass_1 = (U32)(vmap_ptr - vmap); + vmap_entry_count_pass_1 = (RADDBGI_U32)(vmap_ptr - vmap); } // replace zero unit indexes that follow a non-zero @@ -2287,12 +2327,12 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ if(0) { // (the last entry is not replaced because it acts as a terminator) - U32 last = vmap_entry_count_pass_1 - 1; + RADDBGI_U32 last = vmap_entry_count_pass_1 - 1; RADDBGI_VMapEntry *vmap_ptr = vmap; - U64 real_idx = 0; + RADDBGI_U64 real_idx = 0; - for(U32 i = 0; i < last; i += 1, vmap_ptr += 1){ + for(RADDBGI_U32 i = 0; i < last; i += 1, vmap_ptr += 1){ // is this a zero after a real index? if(vmap_ptr->idx == 0){ vmap_ptr->idx = real_idx; @@ -2306,7 +2346,7 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ } // combine duplicate neighbors - U32 vmap_entry_count = 0; + RADDBGI_U32 vmap_entry_count = 0; { RADDBGI_VMapEntry *vmap_ptr = vmap; RADDBGI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; @@ -2314,18 +2354,18 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ for(;vmap_ptr < vmap_opl;){ RADDBGI_VMapEntry *vmap_range_first = vmap_ptr; - U64 idx = vmap_ptr->idx; + RADDBGI_U64 idx = vmap_ptr->idx; vmap_ptr += 1; for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; MemoryCopyStruct(vmap_out, vmap_range_first); vmap_out += 1; } - vmap_entry_count = (U32)(vmap_out - vmap); + vmap_entry_count = (RADDBGI_U32)(vmap_out - vmap); } // fill result - RADDBGIC_VMap *result = push_array(arena, RADDBGIC_VMap, 1); + RADDBGIC_VMap *result = raddbgic_push_array(arena, RADDBGIC_VMap, 1); result->vmap = vmap; result->count = vmap_entry_count - 1; @@ -2334,13 +2374,13 @@ raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_ return result; } -static RADDBGIC_VMap* -raddbgic_vmap_from_unit_ranges(Arena *arena, RADDBGIC_UnitVMapRange *first, U64 count) +RADDBGI_PROC RADDBGIC_VMap* +raddbgic_vmap_from_unit_ranges(RADDBGIC_Arena *arena, RADDBGIC_UnitVMapRange *first, RADDBGI_U64 count) { Temp scratch = scratch_begin(&arena, 1); // count necessary markers - U64 marker_count = count*2; + RADDBGI_U64 marker_count = count*2; // fill markers RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); @@ -2353,7 +2393,7 @@ raddbgic_vmap_from_unit_ranges(Arena *arena, RADDBGIC_UnitVMapRange *first, U64 range != 0; range = range->next){ if(range->first < range->opl){ - U32 unit_idx = range->unit->idx; + RADDBGI_U32 unit_idx = range->unit->idx; key_ptr->key = range->first; key_ptr->val = marker_ptr; @@ -2380,24 +2420,24 @@ raddbgic_vmap_from_unit_ranges(Arena *arena, RADDBGIC_UnitVMapRange *first, U64 //- rjf: type info baking -static U32* -raddbgic_idx_run_from_types(Arena *arena, RADDBGIC_Type **types, U32 count) +RADDBGI_PROC RADDBGI_U32* +raddbgic_idx_run_from_types(RADDBGIC_Arena *arena, RADDBGIC_Type **types, RADDBGI_U32 count) { - U32 *result = push_array(arena, U32, count); - for(U32 i = 0; i < count; i += 1){ + RADDBGI_U32 *result = raddbgic_push_array(arena, RADDBGI_U32, count); + for(RADDBGI_U32 i = 0; i < count; i += 1){ result[i] = types[i]->idx; } return result; } -static RADDBGIC_TypeData* -raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) +RADDBGI_PROC RADDBGIC_TypeData* +raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) { ProfBegin("raddbgic_type_data_combine"); Temp scratch = scratch_begin(&arena, 1); // fill type nodes - U32 type_count = root->type_count; + RADDBGI_U32 type_count = root->type_count; RADDBGI_TypeNode *type_nodes = push_array_no_zero(arena, RADDBGI_TypeNode, type_count); { @@ -2432,8 +2472,8 @@ raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx * case RADDBGI_TypeKind_Function: { // parameters - U32 count = loose_type->count; - U32 *idx_run = raddbgic_idx_run_from_types(scratch.arena, loose_type->param_types, count); + RADDBGI_U32 count = loose_type->count; + RADDBGI_U32 *idx_run = raddbgic_idx_run_from_types(scratch.arena, loose_type->param_types, count); ptr->constructed.param_idx_run_first = raddbgic_idx_run(bctx, idx_run, count); ptr->constructed.count = count; }break; @@ -2441,8 +2481,8 @@ raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx * case RADDBGI_TypeKind_Method: { // parameters - U32 count = loose_type->count; - U32 *idx_run = raddbgic_idx_run_from_types(scratch.arena, loose_type->param_types, count); + RADDBGI_U32 count = loose_type->count; + RADDBGI_U32 *idx_run = raddbgic_idx_run_from_types(scratch.arena, loose_type->param_types, count); ptr->constructed.param_idx_run_first = raddbgic_idx_run(bctx, idx_run, count); ptr->constructed.count = count; }break; @@ -2476,13 +2516,13 @@ raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx * // fill udts - U32 udt_count = root->type_udt_count; + RADDBGI_U32 udt_count = root->type_udt_count; RADDBGI_UDT *udts = push_array_no_zero(arena, RADDBGI_UDT, udt_count); - U32 member_count = root->total_member_count; + RADDBGI_U32 member_count = root->total_member_count; RADDBGI_Member *members = push_array_no_zero(arena, RADDBGI_Member, member_count); - U32 enum_member_count = root->total_enum_val_count; + RADDBGI_U32 enum_member_count = root->total_enum_val_count; RADDBGI_EnumMember *enum_members = push_array_no_zero(arena, RADDBGI_EnumMember, enum_member_count); { @@ -2507,12 +2547,12 @@ raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx * if(loose_udt->enum_val_count != 0){ ptr->flags |= RADDBGI_UserDefinedTypeFlag_EnumMembers; - ptr->member_first = (U32)(enum_member_ptr - enum_members); + ptr->member_first = (RADDBGI_U32)(enum_member_ptr - enum_members); ptr->member_count = loose_udt->enum_val_count; - U32 local_enum_val_count = loose_udt->enum_val_count; + RADDBGI_U32 local_enum_val_count = loose_udt->enum_val_count; RADDBGIC_TypeEnumVal *loose_enum_val = loose_udt->first_enum_val; - for(U32 i = 0; + for(RADDBGI_U32 i = 0; i < local_enum_val_count; i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ enum_member_ptr->name_string_idx = raddbgic_string(bctx, loose_enum_val->name); @@ -2522,12 +2562,12 @@ raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx * // struct/class/union members else{ - ptr->member_first = (U32)(member_ptr - members); + ptr->member_first = (RADDBGI_U32)(member_ptr - members); ptr->member_count = loose_udt->member_count; - U32 local_member_count = loose_udt->member_count; + RADDBGI_U32 local_member_count = loose_udt->member_count; RADDBGIC_TypeMember *loose_member = loose_udt->first_member; - for(U32 i = 0; + for(RADDBGI_U32 i = 0; i < local_member_count; i += 1, member_ptr += 1, loose_member = loose_member->next){ member_ptr->kind = loose_member->kind; @@ -2545,7 +2585,7 @@ raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx * } - U32 file_idx = 0; + RADDBGI_U32 file_idx = 0; if(loose_udt->source_path.size > 0){ RADDBGIC_PathNode *path_node = raddbgic_paths_node_from_path(bctx, loose_udt->source_path); RADDBGIC_SrcNode *src_node = raddbgic_paths_src_node_from_path_node(bctx, path_node); @@ -2566,7 +2606,7 @@ raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx * // fill result - RADDBGIC_TypeData *result = push_array(arena, RADDBGIC_TypeData, 1); + RADDBGIC_TypeData *result = raddbgic_push_array(arena, RADDBGIC_TypeData, 1); result->type_nodes = type_nodes; result->type_node_count = type_count; result->udts = udts; @@ -2583,25 +2623,25 @@ raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx * //- rjf: symbol data baking -static RADDBGIC_SymbolData* -raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) +RADDBGI_PROC RADDBGIC_SymbolData* +raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) { ProfBegin("raddbgic_symbol_data_combine"); Temp scratch = scratch_begin(&arena, 1); // count symbol kinds - U32 globalvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_GlobalVariable]; - U32 threadvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_ThreadVariable]; - U32 procedure_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_Procedure]; + RADDBGI_U32 globalvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_GlobalVariable]; + RADDBGI_U32 threadvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_ThreadVariable]; + RADDBGI_U32 procedure_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_Procedure]; // allocate symbol arrays RADDBGI_GlobalVariable *global_variables = - push_array(arena, RADDBGI_GlobalVariable, globalvar_count); + raddbgic_push_array(arena, RADDBGI_GlobalVariable, globalvar_count); RADDBGI_ThreadVariable *thread_variables = - push_array(arena, RADDBGI_ThreadVariable, threadvar_count); + raddbgic_push_array(arena, RADDBGI_ThreadVariable, threadvar_count); - RADDBGI_Procedure *procedures = push_array(arena, RADDBGI_Procedure, procedure_count); + RADDBGI_Procedure *procedures = raddbgic_push_array(arena, RADDBGI_Procedure, procedure_count); // fill symbol arrays { @@ -2618,12 +2658,12 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx for(RADDBGIC_Symbol *node = root->first_symbol; node != 0; node = node->next_order){ - U32 name_string_idx = raddbgic_string(bctx, node->name); - U32 link_name_string_idx = raddbgic_string(bctx, node->link_name); - U32 type_idx = node->type->idx; + RADDBGI_U32 name_string_idx = raddbgic_string(bctx, node->name); + RADDBGI_U32 link_name_string_idx = raddbgic_string(bctx, node->link_name); + RADDBGI_U32 type_idx = node->type->idx; RADDBGI_LinkFlags link_flags = 0; - U32 container_idx = 0; + RADDBGI_U32 container_idx = 0; { if(node->is_extern){ link_flags |= RADDBGI_LinkFlag_External; @@ -2655,7 +2695,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx { thread_local_ptr->name_string_idx = name_string_idx; thread_local_ptr->link_flags = link_flags; - thread_local_ptr->tls_off = (U32)node->offset; + thread_local_ptr->tls_off = (RADDBGI_U32)node->offset; thread_local_ptr->type_idx = type_idx; thread_local_ptr->container_idx = container_idx; thread_local_ptr += 1; @@ -2683,7 +2723,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx RADDBGIC_VMap *global_vmap = 0; { // count necessary markers - U32 marker_count = globalvar_count*2; + RADDBGI_U32 marker_count = globalvar_count*2; // fill markers RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); @@ -2697,10 +2737,10 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx node != 0; node = node->next_order){ if(node->kind == RADDBGIC_SymbolKind_GlobalVariable){ - U32 global_idx = node->idx; + RADDBGI_U32 global_idx = node->idx; - U64 first = node->offset; - U64 opl = first + node->type->byte_size; + RADDBGI_U64 first = node->offset; + RADDBGI_U64 opl = first + node->type->byte_size; key_ptr->key = first; key_ptr->val = marker_ptr; @@ -2720,10 +2760,10 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx // nil global { - U32 global_idx = 0; + RADDBGI_U32 global_idx = 0; - U64 first = 0; - U64 opl = max_U64; + RADDBGI_U64 first = 0; + RADDBGI_U64 opl = max_U64; key_ptr->key = first; key_ptr->val = marker_ptr; @@ -2757,18 +2797,18 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx root->first_scope->next_sibling == 0 && root->first_scope->range_count == 0); - U32 scope_count = root->scope_count; - RADDBGI_Scope *scopes = push_array(arena, RADDBGI_Scope, scope_count); + RADDBGI_U32 scope_count = root->scope_count; + RADDBGI_Scope *scopes = raddbgic_push_array(arena, RADDBGI_Scope, scope_count); - U32 scope_voff_count = root->scope_voff_count; - U64 *scope_voffs = push_array(arena, U64, scope_voff_count); + RADDBGI_U32 scope_voff_count = root->scope_voff_count; + RADDBGI_U64 *scope_voffs = raddbgic_push_array(arena, RADDBGI_U64, scope_voff_count); - U32 local_count = root->local_count; - RADDBGI_Local *locals = push_array(arena, RADDBGI_Local, local_count); + RADDBGI_U32 local_count = root->local_count; + RADDBGI_Local *locals = raddbgic_push_array(arena, RADDBGI_Local, local_count); - U32 location_block_count = root->location_count; + RADDBGI_U32 location_block_count = root->location_count; RADDBGI_LocationBlock *location_blocks = - push_array(arena, RADDBGI_LocationBlock, location_block_count); + raddbgic_push_array(arena, RADDBGI_LocationBlock, location_block_count); String8List location_data = {0}; @@ -2776,7 +2816,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx // fill scope voffs, locals, and location information { RADDBGI_Scope *scope_ptr = scopes; - U64 *scope_voff_ptr = scope_voffs; + RADDBGI_U64 *scope_voff_ptr = scope_voffs; RADDBGI_Local *local_ptr = locals; RADDBGI_LocationBlock *location_block_ptr = location_blocks; @@ -2785,7 +2825,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx node = node->next_order, scope_ptr += 1){ // emit voffs - U32 voff_first = (U32)(scope_voff_ptr - scope_voffs); + RADDBGI_U32 voff_first = (RADDBGI_U32)(scope_voff_ptr - scope_voffs); for(RADDBGIC_VOffRange *range = node->first_range; range != 0; range = range->next){ @@ -2794,11 +2834,11 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *scope_voff_ptr = range->voff_opl; scope_voff_ptr += 1; } - U32 voff_opl = (U32)(scope_voff_ptr - scope_voffs); + RADDBGI_U32 voff_opl = (RADDBGI_U32)(scope_voff_ptr - scope_voffs); // emit locals - U32 scope_local_count = node->local_count; - U32 scope_local_first = (U32)(local_ptr - locals); + RADDBGI_U32 scope_local_count = node->local_count; + RADDBGI_U32 scope_local_first = (RADDBGI_U32)(local_ptr - locals); for(RADDBGIC_Local *slocal = node->first_local; slocal != 0; slocal = slocal->next, local_ptr += 1){ @@ -2808,8 +2848,8 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx RADDBGIC_LocationSet *locset = slocal->locset; if(locset != 0){ - U32 location_first = (U32)(location_block_ptr - location_blocks); - U32 location_opl = location_first + locset->location_case_count; + RADDBGI_U32 location_first = (RADDBGI_U32)(location_block_ptr - location_blocks); + RADDBGI_U32 location_opl = location_first + locset->location_case_count; local_ptr->location_first = location_first; local_ptr->location_opl = location_opl; @@ -2823,7 +2863,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx RADDBGIC_Location *location = location_case->location; if(location == 0){ - U64 data = 0; + RADDBGI_U64 data = 0; str8_serial_push_align(scratch.arena, &location_data, 8); str8_serial_push_data(scratch.arena, &location_data, &data, 1); } @@ -2831,7 +2871,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx switch (location->kind){ default: { - U64 data = 0; + RADDBGI_U64 data = 0; str8_serial_push_align(scratch.arena, &location_data, 8); str8_serial_push_data(scratch.arena, &location_data, &data, 1); }break; @@ -2843,15 +2883,15 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx for(RADDBGIC_EvalBytecodeOp *op_node = location->bytecode.first_op; op_node != 0; op_node = op_node->next){ - U8 op_data[9]; + RADDBGI_U8 op_data[9]; op_data[0] = op_node->op; MemoryCopy(op_data + 1, &op_node->p, op_node->p_size); String8 op_data_str = str8(op_data, 1 + op_node->p_size); str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, op_data_str)); } { - U64 data = 0; - String8 data_str = str8((U8 *)&data, 1); + RADDBGI_U64 data = 0; + String8 data_str = str8((RADDBGI_U8 *)&data, 1); str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, data_str)); } }break; @@ -2909,7 +2949,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx RADDBGIC_VMap *scope_vmap = 0; { // count necessary markers - U32 marker_count = scope_voff_count; + RADDBGI_U32 marker_count = scope_voff_count; // fill markers RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); @@ -2921,7 +2961,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx for(RADDBGIC_Scope *node = root->first_scope; node != 0; node = node->next_order){ - U32 scope_idx = node->idx; + RADDBGI_U32 scope_idx = node->idx; for(RADDBGIC_VOffRange *range = node->first_range; range != 0; @@ -2946,7 +2986,7 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx } // fill result - RADDBGIC_SymbolData *result = push_array(arena, RADDBGIC_SymbolData, 1); + RADDBGIC_SymbolData *result = raddbgic_push_array(arena, RADDBGIC_SymbolData, 1); result->global_variables = global_variables; result->global_variable_count = globalvar_count; result->global_vmap = global_vmap; @@ -2974,37 +3014,37 @@ raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx //- rjf: name map baking -static RADDBGIC_NameMapBaked* -raddbgic_name_map_bake(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map) +RADDBGI_PROC RADDBGIC_NameMapBaked* +raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map) { Temp scratch = scratch_begin(&arena, 1); - U32 bucket_count = map->name_count; - U32 node_count = map->name_count; + RADDBGI_U32 bucket_count = map->name_count; + RADDBGI_U32 node_count = map->name_count; // setup the final bucket layouts - RADDBGIC_NameMapSemiBucket *sbuckets = push_array(scratch.arena, RADDBGIC_NameMapSemiBucket, bucket_count); + RADDBGIC_NameMapSemiBucket *sbuckets = raddbgic_push_array(scratch.arena, RADDBGIC_NameMapSemiBucket, bucket_count); for(RADDBGIC_NameMapNode *node = map->first; node != 0; node = node->order_next){ - U64 hash = raddbgi_hash(node->string.str, node->string.size); - U64 bi = hash%bucket_count; - RADDBGIC_NameMapSemiNode *snode = push_array(scratch.arena, RADDBGIC_NameMapSemiNode, 1); + RADDBGI_U64 hash = raddbgi_hash(node->string.str, node->string.size); + RADDBGI_U64 bi = hash%bucket_count; + RADDBGIC_NameMapSemiNode *snode = raddbgic_push_array(scratch.arena, RADDBGIC_NameMapSemiNode, 1); SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); snode->node = node; sbuckets[bi].count += 1; } // allocate tables - RADDBGI_NameMapBucket *buckets = push_array(arena, RADDBGI_NameMapBucket, bucket_count); + RADDBGI_NameMapBucket *buckets = raddbgic_push_array(arena, RADDBGI_NameMapBucket, bucket_count); RADDBGI_NameMapNode *nodes = push_array_no_zero(arena, RADDBGI_NameMapNode, node_count); // convert to serialized buckets & nodes { RADDBGI_NameMapBucket *bucket_ptr = buckets; RADDBGI_NameMapNode *node_ptr = nodes; - for(U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ - bucket_ptr->first_node = (U32)(node_ptr - nodes); + for(RADDBGI_U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ + bucket_ptr->first_node = (RADDBGI_U32)(node_ptr - nodes); bucket_ptr->node_count = sbuckets[i].count; for(RADDBGIC_NameMapSemiNode *snode = sbuckets[i].first; @@ -3013,20 +3053,20 @@ raddbgic_name_map_bake(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx RADDBGIC_NameMapNode *node = snode->node; // cons name and index(es) - U32 string_idx = raddbgic_string(bctx, node->string); - U32 match_count = node->idx_count; - U32 idx = 0; + RADDBGI_U32 string_idx = raddbgic_string(bctx, node->string); + RADDBGI_U32 match_count = node->idx_count; + RADDBGI_U32 idx = 0; if(match_count == 1){ idx = node->idx_first->idx[0]; } else{ Temp temp = temp_begin(scratch.arena); - U32 *idx_run = push_array_no_zero(temp.arena, U32, match_count); - U32 *idx_ptr = idx_run; + RADDBGI_U32 *idx_run = push_array_no_zero(temp.arena, RADDBGI_U32, match_count); + RADDBGI_U32 *idx_ptr = idx_run; for(RADDBGIC_NameMapIdxNode *idxnode = node->idx_first; idxnode != 0; idxnode = idxnode->next){ - for(U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ + for(RADDBGI_U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ if(idxnode->idx[i] == 0){ goto dblbreak; } @@ -3052,7 +3092,7 @@ raddbgic_name_map_bake(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx scratch_end(scratch); - RADDBGIC_NameMapBaked *result = push_array(arena, RADDBGIC_NameMapBaked, 1); + RADDBGIC_NameMapBaked *result = raddbgic_push_array(arena, RADDBGIC_NameMapBaked, 1); result->buckets = buckets; result->nodes = nodes; result->bucket_count = bucket_count; @@ -3062,8 +3102,8 @@ raddbgic_name_map_bake(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx //- rjf: top-level baking entry point -static void -raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) +RADDBGI_PROC void +raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, String8List *out) { ProfBeginFunction(); str8_serial_begin(arena, out); @@ -3083,7 +3123,7 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) // MAIN PART: allocating and filling out sections of the file // top level info - RADDBGI_TopLevelInfo *tli = push_array(arena, RADDBGI_TopLevelInfo, 1); + RADDBGI_TopLevelInfo *tli = raddbgic_push_array(arena, RADDBGI_TopLevelInfo, 1); { RADDBGIC_TopLevelInfo *raddbgic_tli = &root->top_level_info; tli->architecture = raddbgic_tli->architecture; @@ -3095,8 +3135,8 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) // binary sections array { - U32 count = root->binary_section_count; - RADDBGI_BinarySection *sections = push_array(arena, RADDBGI_BinarySection, count); + RADDBGI_U32 count = root->binary_section_count; + RADDBGI_BinarySection *sections = raddbgic_push_array(arena, RADDBGI_BinarySection, count); RADDBGI_BinarySection *dsec = sections; for(RADDBGIC_BinarySection *ssec = root->binary_section_first; ssec != 0; @@ -3116,20 +3156,20 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) // * top-level unit information // * combining line info for whole unit { - U32 count = root->unit_count; - RADDBGI_Unit *units = push_array(arena, RADDBGI_Unit, count); + RADDBGI_U32 count = root->unit_count; + RADDBGI_Unit *units = raddbgic_push_array(arena, RADDBGI_Unit, count); RADDBGI_Unit *dunit = units; for(RADDBGIC_Unit *sunit = root->unit_first; sunit != 0; sunit = sunit->next_order, dunit += 1){ // strings & paths - U32 unit_name = raddbgic_string(bctx, sunit->unit_name); - U32 cmp_name = raddbgic_string(bctx, sunit->compiler_name); + RADDBGI_U32 unit_name = raddbgic_string(bctx, sunit->unit_name); + RADDBGI_U32 cmp_name = raddbgic_string(bctx, sunit->compiler_name); - U32 src_path = raddbgic_paths_idx_from_path(bctx, sunit->source_file); - U32 obj_path = raddbgic_paths_idx_from_path(bctx, sunit->object_file); - U32 archive_path = raddbgic_paths_idx_from_path(bctx, sunit->archive_file); - U32 build_path = raddbgic_paths_idx_from_path(bctx, sunit->build_path); + RADDBGI_U32 src_path = raddbgic_paths_idx_from_path(bctx, sunit->source_file); + RADDBGI_U32 obj_path = raddbgic_paths_idx_from_path(bctx, sunit->object_file); + RADDBGI_U32 archive_path = raddbgic_paths_idx_from_path(bctx, sunit->archive_file); + RADDBGI_U32 build_path = raddbgic_paths_idx_from_path(bctx, sunit->build_path); dunit->unit_name_string_idx = unit_name; dunit->compiler_name_string_idx = cmp_name; @@ -3143,10 +3183,10 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) RADDBGIC_LineSequenceNode *first_seq = sunit->line_seq_first; RADDBGIC_UnitLinesCombined *lines = raddbgic_unit_combine_lines(arena, bctx, first_seq); - U32 line_count = lines->line_count; + RADDBGI_U32 line_count = lines->line_count; if(line_count > 0){ dunit->line_info_voffs_data_idx = - raddbgic_dsection(arena, &dss, lines->voffs, sizeof(U64)*(line_count + 1), + raddbgic_dsection(arena, &dss, lines->voffs, sizeof(RADDBGI_U64)*(line_count + 1), RADDBGI_DataSectionTag_LineInfoVoffs); dunit->line_info_data_idx = raddbgic_dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, @@ -3171,7 +3211,7 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) src_node = src_node->next){ RADDBGIC_LineMapFragment *first_fragment = src_node->first_fragment; RADDBGIC_SrcLinesCombined *lines = raddbgic_source_combine_lines(arena, first_fragment); - U32 line_count = lines->line_count; + RADDBGI_U32 line_count = lines->line_count; if(line_count > 0){ src_node->line_map_count = line_count; @@ -3208,7 +3248,7 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) root->unit_vmap_range_first, root->unit_vmap_range_count); - U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); + RADDBGI_U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); raddbgic_dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); } @@ -3216,16 +3256,16 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) { RADDBGIC_TypeData *types = raddbgic_type_data_combine(arena, root, bctx); - U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; + RADDBGI_U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; raddbgic_dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); - U64 udt_size = sizeof(*types->udts)*types->udt_count; + RADDBGI_U64 udt_size = sizeof(*types->udts)*types->udt_count; raddbgic_dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); - U64 member_size = sizeof(*types->members)*types->member_count; + RADDBGI_U64 member_size = sizeof(*types->members)*types->member_count; raddbgic_dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); - U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; + RADDBGI_U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; raddbgic_dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); } @@ -3233,62 +3273,62 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) { RADDBGIC_SymbolData *symbol_data = raddbgic_symbol_data_combine(arena, root, bctx); - U64 global_variables_size = + RADDBGI_U64 global_variables_size = sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; raddbgic_dsection(arena, &dss, symbol_data->global_variables, global_variables_size, RADDBGI_DataSectionTag_GlobalVariables); RADDBGIC_VMap *global_vmap = symbol_data->global_vmap; - U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); + RADDBGI_U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); raddbgic_dsection(arena, &dss, global_vmap->vmap, global_vmap_size, RADDBGI_DataSectionTag_GlobalVmap); - U64 thread_variables_size = + RADDBGI_U64 thread_variables_size = sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; raddbgic_dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, RADDBGI_DataSectionTag_ThreadVariables); - U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; + RADDBGI_U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; raddbgic_dsection(arena, &dss, symbol_data->procedures, procedures_size, RADDBGI_DataSectionTag_Procedures); - U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; + RADDBGI_U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; raddbgic_dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); - U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; + RADDBGI_U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; raddbgic_dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, RADDBGI_DataSectionTag_ScopeVoffData); RADDBGIC_VMap *scope_vmap = symbol_data->scope_vmap; - U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); + RADDBGI_U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); raddbgic_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); - U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; + RADDBGI_U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; raddbgic_dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); - U64 location_blocks_size = + RADDBGI_U64 location_blocks_size = sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; raddbgic_dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, RADDBGI_DataSectionTag_LocationBlocks); - U64 location_data_size = symbol_data->location_data_size; + RADDBGI_U64 location_data_size = symbol_data->location_data_size; raddbgic_dsection(arena, &dss, symbol_data->location_data, location_data_size, RADDBGI_DataSectionTag_LocationData); } // name map baking { - U32 name_map_count = 0; - for(U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ + RADDBGI_U32 name_map_count = 0; + for(RADDBGI_U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ if(root->name_maps[i] != 0){ name_map_count += 1; } } - RADDBGI_NameMap *name_maps = push_array(arena, RADDBGI_NameMap, name_map_count); + RADDBGI_NameMap *name_maps = raddbgic_push_array(arena, RADDBGI_NameMap, name_map_count); RADDBGI_NameMap *name_map_ptr = name_maps; - for(U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ + for(RADDBGI_U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ RADDBGIC_NameMap *map = root->name_maps[i]; if(map != 0){ RADDBGIC_NameMapBaked *baked = raddbgic_name_map_bake(arena, root, bctx, map); @@ -3313,8 +3353,8 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) // generate data sections for file paths { - U32 count = bctx->tree->count; - RADDBGI_FilePathNode *nodes = push_array(arena, RADDBGI_FilePathNode, count); + RADDBGI_U32 count = bctx->tree->count; + RADDBGI_FilePathNode *nodes = raddbgic_push_array(arena, RADDBGI_FilePathNode, count); RADDBGI_FilePathNode *out_node = nodes; for(RADDBGIC_PathNode *node = bctx->tree->first; @@ -3340,8 +3380,8 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) // generate data sections for files { - U32 count = bctx->tree->src_count; - RADDBGI_SourceFile *src_files = push_array(arena, RADDBGI_SourceFile, count); + RADDBGI_U32 count = bctx->tree->src_count; + RADDBGI_SourceFile *src_files = raddbgic_push_array(arena, RADDBGI_SourceFile, count); RADDBGI_SourceFile *out_src_file = src_files; for(RADDBGIC_SrcNode *node = bctx->tree->src_first; @@ -3360,11 +3400,11 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) // generate data sections for strings { - U32 *str_offs = push_array_no_zero(arena, U32, bctx->strs.count + 1); + RADDBGI_U32 *str_offs = push_array_no_zero(arena, RADDBGI_U32, bctx->strs.count + 1); - U32 off_cursor = 0; + RADDBGI_U32 off_cursor = 0; { - U32 *off_ptr = str_offs; + RADDBGI_U32 *off_ptr = str_offs; *off_ptr = 0; off_ptr += 1; for(RADDBGIC_StringNode *node = bctx->strs.order_first; @@ -3376,9 +3416,9 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) } } - U8 *buf = push_array(arena, U8, off_cursor); + RADDBGI_U8 *buf = raddbgic_push_array(arena, RADDBGI_U8, off_cursor); { - U8 *ptr = buf; + RADDBGI_U8 *ptr = buf; for(RADDBGIC_StringNode *node = bctx->strs.order_first; node != 0; node = node->order_next){ @@ -3394,11 +3434,11 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) // generate data sections for index runs { - U32 *idx_data = push_array_no_zero(arena, U32, bctx->idxs.idx_count); + RADDBGI_U32 *idx_data = push_array_no_zero(arena, RADDBGI_U32, bctx->idxs.idx_count); { - U32 *out_ptr = idx_data; - U32 *opl = out_ptr + bctx->idxs.idx_count; + RADDBGI_U32 *out_ptr = idx_data; + RADDBGI_U32 *opl = out_ptr + bctx->idxs.idx_count; RADDBGIC_IdxRunNode *node = bctx->idxs.order_first; for(;node != 0 && out_ptr < opl; node = node->order_next){ @@ -3415,14 +3455,14 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) // layout // * the header and data section table have to be initialized "out of order" // * so that the rest of the system can avoid this tricky order-layout interdependence stuff - RADDBGI_Header *header = push_array(arena, RADDBGI_Header, 1); - RADDBGI_DataSection *dstable = push_array(arena, RADDBGI_DataSection, dss.count); + RADDBGI_Header *header = raddbgic_push_array(arena, RADDBGI_Header, 1); + RADDBGI_DataSection *dstable = raddbgic_push_array(arena, RADDBGI_DataSection, dss.count); str8_serial_push_align(arena, out, 8); - U64 header_off = out->total_size; + RADDBGI_U64 header_off = out->total_size; str8_list_push(arena, out, str8_struct(header)); str8_serial_push_align(arena, out, 8); - U64 data_section_off = out->total_size; - str8_list_push(arena, out, str8((U8 *)dstable, sizeof(*dstable)*dss.count)); + RADDBGI_U64 data_section_off = out->total_size; + str8_list_push(arena, out, str8((RADDBGI_U8 *)dstable, sizeof(*dstable)*dss.count)); { header->magic = RADDBGI_MAGIC_CONSTANT; header->encoding_version = RADDBGI_ENCODING_VERSION; @@ -3430,7 +3470,7 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) header->data_section_count = dss.count; } { - U64 test_dss_count = 0; + RADDBGI_U64 test_dss_count = 0; for(RADDBGIC_DSectionNode *node = dss.first; node != 0; node = node->next){ @@ -3442,12 +3482,12 @@ raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out) for(RADDBGIC_DSectionNode *node = dss.first; node != 0; node = node->next, ptr += 1){ - U64 data_section_offset = 0; + RADDBGI_U64 data_section_offset = 0; if(node->size != 0) { str8_serial_push_align(arena, out, 8); data_section_offset = out->total_size; - str8_list_push(arena, out, str8((U8 *)node->data, node->size)); + str8_list_push(arena, out, str8((RADDBGI_U8 *)node->data, node->size)); } ptr->tag = node->tag; ptr->encoding = RADDBGI_DataSectionEncoding_Unpacked; diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/raddbgi_cons/raddbgi_cons.h index cadb75c1..27abc7b6 100644 --- a/src/raddbgi_cons/raddbgi_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -4,6 +4,88 @@ #ifndef RADDBGI_CONS_H #define RADDBGI_CONS_H +//////////////////////////////// +//~ rjf: Overrideable Memory Operations + +#if !defined(raddbgic_memset) +# define raddbgic_memset raddbgic_memset_fallback +#endif +#define raddbgic_memzero(ptr, size) raddbgic_memset((ptr), 0, (size)) + +//////////////////////////////// +//~ rjf: Overrideable String View Types + +// To override the string view type used by the library, do the following: +// +// #define RADDBGIC_String8 +// #define RADDBGIC_String8_BaseMember +// #define RADDBGIC_String8_SizeMember + +#if !defined(RADDBGIC_String8) +#define RADDBGIC_String8_BaseMember str +#define RADDBGIC_String8_SizeMember size +typedef struct RADDBGIC_String8 RADDBGIC_String8; +struct RADDBGIC_String8 +{ + RADDBGI_U8 *RADDBGIC_String8_BaseMember; + RADDBGI_U64 RADDBGIC_String8_SizeMember; +}; +#endif + +#if !defined(RADDBGIC_String8Node) +typedef struct RADDBGIC_String8Node RADDBGIC_String8Node; +struct RADDBGIC_String8Node +{ + RADDBGIC_String8Node *next; + RADDBGIC_String8 string; +}; +#endif + +#if !defined(RADDBGIC_String8List) +typedef struct RADDBGIC_String8List RADDBGIC_String8List; +struct RADDBGIC_String8List +{ + RADDBGIC_String8Node *first; + RADDBGIC_String8Node *last; + RADDBGI_U64 node_count; + RADDBGI_U64 total_size; +}; +#endif + +//////////////////////////////// +//~ rjf: Overrideable Arena Allocator Types + +// To override the arena allocator type used by the library, do the following: +// +// #define RADDBGIC_Arena +// #define RADDBGIC_Arena_AllocImpl Arena*> +// #define RADDBGIC_Arena_ReleaseImpl void> +// #define RADDBGIC_Arena_PosImpl U64> +// #define RADDBGIC_Arena_PushImpl void*> +// #define RADDBGIC_Arena_PopToImpl void> + +#if !defined(RADDBGIC_Arena) +typedef struct RADDBGIC_Arena RADDBGIC_Arena; +struct RADDBGIC_Arena +{ + RADDBGIC_Arena *prev; + RADDBGIC_Arena *current; + RADDBGI_U64 base_pos; + RADDBGI_U64 pos; + RADDBGI_U64 cmt; + RADDBGI_U64 res; + RADDBGI_U64 align; + RADDBGI_S8 grow; +}; +#endif + +typedef struct RADDBGIC_Temp RADDBGIC_Temp; +struct RADDBGIC_Temp +{ + RADDBGIC_Arena *arena; + RADDBGI_U64 pos; +}; + //////////////////////////////// //~ rjf: Error Types @@ -11,7 +93,7 @@ typedef struct RADDBGIC_Error RADDBGIC_Error; struct RADDBGIC_Error { RADDBGIC_Error *next; - String8 msg; + RADDBGIC_String8 msg; }; typedef struct RADDBGIC_ErrorList RADDBGIC_ErrorList; @@ -19,7 +101,7 @@ struct RADDBGIC_ErrorList { RADDBGIC_Error *first; RADDBGIC_Error *last; - U64 count; + RADDBGI_U64 count; }; //////////////////////////////// @@ -31,8 +113,8 @@ typedef struct RADDBGIC_U64ToPtrNode RADDBGIC_U64ToPtrNode; struct RADDBGIC_U64ToPtrNode { RADDBGIC_U64ToPtrNode *next; - U64 _padding_; - U64 key[1]; + RADDBGI_U64 _padding_; + RADDBGI_U64 key[1]; void *ptr[1]; }; @@ -40,9 +122,9 @@ typedef struct RADDBGIC_U64ToPtrMap RADDBGIC_U64ToPtrMap; struct RADDBGIC_U64ToPtrMap { RADDBGIC_U64ToPtrNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 pair_count; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RADDBGI_U64 pair_count; }; typedef struct RADDBGIC_U64ToPtrLookup RADDBGIC_U64ToPtrLookup; @@ -50,7 +132,7 @@ struct RADDBGIC_U64ToPtrLookup { void *match; RADDBGIC_U64ToPtrNode *fill_node; - U32 fill_k; + RADDBGI_U32 fill_k; }; //- rjf: string8 -> pointer map @@ -59,8 +141,8 @@ typedef struct RADDBGIC_Str8ToPtrNode RADDBGIC_Str8ToPtrNode; struct RADDBGIC_Str8ToPtrNode { struct RADDBGIC_Str8ToPtrNode *next; - String8 key; - U64 hash; + RADDBGIC_String8 key; + RADDBGI_U64 hash; void *ptr; }; @@ -68,9 +150,9 @@ typedef struct RADDBGIC_Str8ToPtrMap RADDBGIC_Str8ToPtrMap; struct RADDBGIC_Str8ToPtrMap { RADDBGIC_Str8ToPtrNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 pair_count; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RADDBGI_U64 pair_count; }; //- rjf: sortable range data structure @@ -78,7 +160,7 @@ struct RADDBGIC_Str8ToPtrMap typedef struct RADDBGIC_SortKey RADDBGIC_SortKey; struct RADDBGIC_SortKey { - U64 key; + RADDBGI_U64 key; void *val; }; @@ -86,8 +168,8 @@ typedef struct RADDBGIC_OrderedRange RADDBGIC_OrderedRange; struct RADDBGIC_OrderedRange { RADDBGIC_OrderedRange *next; - U64 first; - U64 opl; + RADDBGI_U64 first; + RADDBGI_U64 opl; }; //////////////////////////////// @@ -97,12 +179,12 @@ typedef struct RADDBGIC_BinarySection RADDBGIC_BinarySection; struct RADDBGIC_BinarySection { RADDBGIC_BinarySection *next; - String8 name; + RADDBGIC_String8 name; RADDBGI_BinarySectionFlags flags; - U64 voff_first; - U64 voff_opl; - U64 foff_first; - U64 foff_opl; + RADDBGI_U64 voff_first; + RADDBGI_U64 voff_opl; + RADDBGI_U64 foff_first; + RADDBGI_U64 foff_opl; }; //////////////////////////////// @@ -111,11 +193,11 @@ struct RADDBGIC_BinarySection typedef struct RADDBGIC_LineSequence RADDBGIC_LineSequence; struct RADDBGIC_LineSequence { - String8 file_name; - U64 *voffs; // [line_count + 1] (sorted) - U32 *line_nums; // [line_count] - U16 *col_nums; // [2*line_count] - U64 line_count; + RADDBGIC_String8 file_name; + RADDBGI_U64 *voffs; // [line_count + 1] (sorted) + RADDBGI_U32 *line_nums; // [line_count] + RADDBGI_U16 *col_nums; // [2*line_count] + RADDBGI_U64 line_count; }; typedef struct RADDBGIC_LineSequenceNode RADDBGIC_LineSequenceNode; @@ -128,12 +210,12 @@ struct RADDBGIC_LineSequenceNode typedef struct RADDBGIC_UnitInfo RADDBGIC_UnitInfo; struct RADDBGIC_UnitInfo { - String8 unit_name; - String8 compiler_name; - String8 source_file; - String8 object_file; - String8 archive_file; - String8 build_path; + RADDBGIC_String8 unit_name; + RADDBGIC_String8 compiler_name; + RADDBGIC_String8 source_file; + RADDBGIC_String8 object_file; + RADDBGIC_String8 archive_file; + RADDBGIC_String8 build_path; RADDBGI_Language language; }; @@ -141,18 +223,18 @@ typedef struct RADDBGIC_Unit RADDBGIC_Unit; struct RADDBGIC_Unit { RADDBGIC_Unit *next_order; - U32 idx; - B32 info_is_set; - String8 unit_name; - String8 compiler_name; - String8 source_file; - String8 object_file; - String8 archive_file; - String8 build_path; + RADDBGI_U32 idx; + RADDBGI_S32 info_is_set; + RADDBGIC_String8 unit_name; + RADDBGIC_String8 compiler_name; + RADDBGIC_String8 source_file; + RADDBGIC_String8 object_file; + RADDBGIC_String8 archive_file; + RADDBGIC_String8 build_path; RADDBGI_Language language; RADDBGIC_LineSequenceNode *line_seq_first; RADDBGIC_LineSequenceNode *line_seq_last; - U64 line_seq_count; + RADDBGI_U64 line_seq_count; }; typedef struct RADDBGIC_UnitVMapRange RADDBGIC_UnitVMapRange; @@ -160,14 +242,14 @@ struct RADDBGIC_UnitVMapRange { RADDBGIC_UnitVMapRange *next; RADDBGIC_Unit *unit; - U64 first; - U64 opl; + RADDBGI_U64 first; + RADDBGI_U64 opl; }; //////////////////////////////// //~ rjf: Type Info Types -typedef U8 RADDBGIC_TypeConstructKind; +typedef RADDBGI_U8 RADDBGIC_TypeConstructKind; enum { RADDBGIC_TypeConstructKind_Basic, @@ -186,17 +268,17 @@ struct RADDBGIC_TypeMember { RADDBGIC_TypeMember *next; RADDBGI_MemberKind kind; - String8 name; + RADDBGIC_String8 name; struct RADDBGIC_Type *type; - U32 off; + RADDBGI_U32 off; }; typedef struct RADDBGIC_TypeEnumVal RADDBGIC_TypeEnumVal; struct RADDBGIC_TypeEnumVal { RADDBGIC_TypeEnumVal *next; - String8 name; - U64 val; + RADDBGIC_String8 name; + RADDBGI_U64 val; }; typedef struct RADDBGIC_Type RADDBGIC_Type; @@ -204,12 +286,12 @@ struct RADDBGIC_Type { RADDBGIC_Type *next_order; RADDBGI_TypeKind kind; - U32 idx; - U32 byte_size; - U32 flags; - U32 off; - U32 count; - String8 name; + RADDBGI_U32 idx; + RADDBGI_U32 byte_size; + RADDBGI_U32 flags; + RADDBGI_U32 off; + RADDBGI_U32 count; + RADDBGIC_String8 name; RADDBGIC_Type *direct_type; RADDBGIC_Type **param_types; struct RADDBGIC_TypeUDT *udt; @@ -219,17 +301,17 @@ typedef struct RADDBGIC_TypeUDT RADDBGIC_TypeUDT; struct RADDBGIC_TypeUDT { RADDBGIC_TypeUDT *next_order; - U32 idx; + RADDBGI_U32 idx; RADDBGIC_Type *self_type; RADDBGIC_TypeMember *first_member; RADDBGIC_TypeMember *last_member; - U64 member_count; + RADDBGI_U64 member_count; RADDBGIC_TypeEnumVal *first_enum_val; RADDBGIC_TypeEnumVal *last_enum_val; - U64 enum_val_count; - String8 source_path; - U32 line; - U32 col; + RADDBGI_U64 enum_val_count; + RADDBGIC_String8 source_path; + RADDBGI_U32 line; + RADDBGI_U32 col; }; typedef struct RADDBGIC_TypeNode RADDBGIC_TypeNode; @@ -244,7 +326,7 @@ struct RADDBGIC_TypeList { RADDBGIC_TypeNode *first; RADDBGIC_TypeNode *last; - U64 count; + RADDBGI_U64 count; }; //////////////////////////////// @@ -264,11 +346,11 @@ typedef struct RADDBGIC_SymbolInfo RADDBGIC_SymbolInfo; struct RADDBGIC_SymbolInfo { RADDBGIC_SymbolKind kind; - String8 name; - String8 link_name; + RADDBGIC_String8 name; + RADDBGIC_String8 link_name; RADDBGIC_Type *type; - B32 is_extern; - U64 offset; + RADDBGI_S32 is_extern; + RADDBGI_U64 offset; // TODO(allen): should this actually be "container scope"? struct RADDBGIC_Symbol *container_symbol; RADDBGIC_Type *container_type; @@ -279,14 +361,14 @@ typedef struct RADDBGIC_Symbol RADDBGIC_Symbol; struct RADDBGIC_Symbol { RADDBGIC_Symbol *next_order; - U32 idx; + RADDBGI_U32 idx; RADDBGIC_SymbolKind kind; - String8 name; - String8 link_name; + RADDBGIC_String8 name; + RADDBGIC_String8 link_name; RADDBGIC_Type *type; - B32 is_extern; - B8 offset_is_set; - U64 offset; + RADDBGI_S32 is_extern; + RADDBGI_S8 offset_is_set; + RADDBGI_U64 offset; RADDBGIC_Symbol *container_symbol; RADDBGIC_Type *container_type; struct RADDBGIC_Scope *root_scope; @@ -300,7 +382,7 @@ struct RADDBGIC_LocalInfo { RADDBGI_LocalKind kind; struct RADDBGIC_Scope *scope; - String8 name; + RADDBGIC_String8 name; RADDBGIC_Type *type; }; @@ -309,7 +391,7 @@ struct RADDBGIC_Local { RADDBGIC_Local *next; RADDBGI_LocalKind kind; - String8 name; + RADDBGIC_String8 name; RADDBGIC_Type *type; struct RADDBGIC_LocationSet *locset; }; @@ -318,8 +400,8 @@ typedef struct RADDBGIC_VOffRange RADDBGIC_VOffRange; struct RADDBGIC_VOffRange { RADDBGIC_VOffRange *next; - U64 voff_first; - U64 voff_opl; + RADDBGI_U64 voff_first; + RADDBGI_U64 voff_opl; }; typedef struct RADDBGIC_Scope RADDBGIC_Scope; @@ -331,14 +413,14 @@ struct RADDBGIC_Scope RADDBGIC_Scope *first_child; RADDBGIC_Scope *last_child; RADDBGIC_Scope *next_sibling; - U64 voff_base; + RADDBGI_U64 voff_base; RADDBGIC_VOffRange *first_range; RADDBGIC_VOffRange *last_range; - U32 range_count; - U32 idx; + RADDBGI_U32 range_count; + RADDBGI_U32 idx; RADDBGIC_Local *first_local; RADDBGIC_Local *last_local; - U32 local_count; + RADDBGI_U32 local_count; }; //////////////////////////////// @@ -349,8 +431,8 @@ struct RADDBGIC_EvalBytecodeOp { RADDBGIC_EvalBytecodeOp *next; RADDBGI_EvalOp op; - U32 p_size; - U64 p; + RADDBGI_U32 p_size; + RADDBGI_U64 p; }; typedef struct RADDBGIC_EvalBytecode RADDBGIC_EvalBytecode; @@ -358,16 +440,16 @@ struct RADDBGIC_EvalBytecode { RADDBGIC_EvalBytecodeOp *first_op; RADDBGIC_EvalBytecodeOp *last_op; - U32 op_count; - U32 encoded_size; + RADDBGI_U32 op_count; + RADDBGI_U32 encoded_size; }; typedef struct RADDBGIC_Location RADDBGIC_Location; struct RADDBGIC_Location { RADDBGI_LocationKind kind; - U8 register_code; - U16 offset; + RADDBGI_U8 register_code; + RADDBGI_U16 offset; RADDBGIC_EvalBytecode bytecode; }; @@ -375,8 +457,8 @@ typedef struct RADDBGIC_LocationCase RADDBGIC_LocationCase; struct RADDBGIC_LocationCase { RADDBGIC_LocationCase *next; - U64 voff_first; - U64 voff_opl; + RADDBGI_U64 voff_first; + RADDBGI_U64 voff_opl; RADDBGIC_Location *location; }; @@ -385,7 +467,7 @@ struct RADDBGIC_LocationSet { RADDBGIC_LocationCase *first_location_case; RADDBGIC_LocationCase *last_location_case; - U64 location_case_count; + RADDBGI_U64 location_case_count; }; //////////////////////////////// @@ -395,7 +477,7 @@ typedef struct RADDBGIC_NameMapIdxNode RADDBGIC_NameMapIdxNode; struct RADDBGIC_NameMapIdxNode { RADDBGIC_NameMapIdxNode *next; - U32 idx[8]; + RADDBGI_U32 idx[8]; }; typedef struct RADDBGIC_NameMapNode RADDBGIC_NameMapNode; @@ -403,21 +485,21 @@ struct RADDBGIC_NameMapNode { RADDBGIC_NameMapNode *bucket_next; RADDBGIC_NameMapNode *order_next; - String8 string; + RADDBGIC_String8 string; RADDBGIC_NameMapIdxNode *idx_first; RADDBGIC_NameMapIdxNode *idx_last; - U64 idx_count; + RADDBGI_U64 idx_count; }; typedef struct RADDBGIC_NameMap RADDBGIC_NameMap; struct RADDBGIC_NameMap { RADDBGIC_NameMapNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; RADDBGIC_NameMapNode *first; RADDBGIC_NameMapNode *last; - U64 name_count; + RADDBGI_U64 name_count; }; //////////////////////////////// @@ -427,9 +509,9 @@ typedef struct RADDBGIC_TopLevelInfo RADDBGIC_TopLevelInfo; struct RADDBGIC_TopLevelInfo { RADDBGI_Arch architecture; - String8 exe_name; - U64 exe_hash; - U64 voff_max; + RADDBGIC_String8 exe_name; + RADDBGI_U64 exe_hash; + RADDBGI_U64 voff_max; }; //////////////////////////////// @@ -438,49 +520,49 @@ struct RADDBGIC_TopLevelInfo typedef struct RADDBGIC_RootParams RADDBGIC_RootParams; struct RADDBGIC_RootParams { - U64 addr_size; - U32 bucket_count_units; // optional; default chosen if 0 - U32 bucket_count_symbols; // optional; default chosen if 0 - U32 bucket_count_scopes; // optional; default chosen if 0 - U32 bucket_count_locals; // optional; default chosen if 0 - U32 bucket_count_types; // optional; default chosen if 0 - U64 bucket_count_type_constructs; // optional; default chosen if 0 + RADDBGI_U64 addr_size; + RADDBGI_U32 bucket_count_units; // optional; default chosen if 0 + RADDBGI_U32 bucket_count_symbols; // optional; default chosen if 0 + RADDBGI_U32 bucket_count_scopes; // optional; default chosen if 0 + RADDBGI_U32 bucket_count_locals; // optional; default chosen if 0 + RADDBGI_U32 bucket_count_types; // optional; default chosen if 0 + RADDBGI_U64 bucket_count_type_constructs; // optional; default chosen if 0 }; typedef struct RADDBGIC_Root RADDBGIC_Root; struct RADDBGIC_Root { - Arena *arena; + RADDBGIC_Arena *arena; RADDBGIC_ErrorList errors; //////// Contextual Information - U64 addr_size; + RADDBGI_U64 addr_size; //////// Info Declared By User // top level info - B32 top_level_info_is_set; + RADDBGI_S32 top_level_info_is_set; RADDBGIC_TopLevelInfo top_level_info; // binary layout RADDBGIC_BinarySection *binary_section_first; RADDBGIC_BinarySection *binary_section_last; - U64 binary_section_count; + RADDBGI_U64 binary_section_count; // compilation units RADDBGIC_Unit *unit_first; RADDBGIC_Unit *unit_last; - U64 unit_count; + RADDBGI_U64 unit_count; RADDBGIC_UnitVMapRange *unit_vmap_range_first; RADDBGIC_UnitVMapRange *unit_vmap_range_last; - U64 unit_vmap_range_count; + RADDBGI_U64 unit_vmap_range_count; // types RADDBGIC_Type *first_type; RADDBGIC_Type *last_type; - U64 type_count; + RADDBGI_U64 type_count; RADDBGIC_Type *nil_type; RADDBGIC_Type *variadic_type; @@ -489,28 +571,29 @@ struct RADDBGIC_Root RADDBGIC_TypeUDT *first_udt; RADDBGIC_TypeUDT *last_udt; - U64 type_udt_count; + RADDBGI_U64 type_udt_count; - U64 total_member_count; - U64 total_enum_val_count; + RADDBGI_U64 total_member_count; + RADDBGI_U64 total_enum_val_count; // symbols RADDBGIC_Symbol *first_symbol; RADDBGIC_Symbol *last_symbol; - union{ - U64 symbol_count; - U64 symbol_kind_counts[RADDBGIC_SymbolKind_COUNT]; + union + { + RADDBGI_U64 symbol_count; + RADDBGI_U64 symbol_kind_counts[RADDBGIC_SymbolKind_COUNT]; }; RADDBGIC_Scope *first_scope; RADDBGIC_Scope *last_scope; - U64 scope_count; - U64 scope_voff_count; + RADDBGI_U64 scope_count; + RADDBGI_U64 scope_voff_count; RADDBGIC_Local *first_local; RADDBGIC_Local *last_local; - U64 local_count; - U64 location_count; + RADDBGI_U64 local_count; + RADDBGI_U64 location_count; // name maps RADDBGIC_NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; @@ -535,7 +618,7 @@ struct RADDBGIC_DSectionNode { RADDBGIC_DSectionNode *next; void *data; - U64 size; + RADDBGI_U64 size; RADDBGI_DataSectionTag tag; }; @@ -544,7 +627,7 @@ struct RADDBGIC_DSections { RADDBGIC_DSectionNode *first; RADDBGIC_DSectionNode *last; - U32 count; + RADDBGI_U32 count; }; //- rjf: bake string data structure @@ -554,9 +637,9 @@ struct RADDBGIC_StringNode { RADDBGIC_StringNode *order_next; RADDBGIC_StringNode *bucket_next; - String8 str; - U64 hash; - U32 idx; + RADDBGIC_String8 str; + RADDBGI_U64 hash; + RADDBGI_U32 idx; }; typedef struct RADDBGIC_Strings RADDBGIC_Strings; @@ -565,9 +648,9 @@ struct RADDBGIC_Strings RADDBGIC_StringNode *order_first; RADDBGIC_StringNode *order_last; RADDBGIC_StringNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U32 count; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RADDBGI_U32 count; }; //- rjf: index run baking data structure @@ -577,10 +660,10 @@ struct RADDBGIC_IdxRunNode { RADDBGIC_IdxRunNode *order_next; RADDBGIC_IdxRunNode *bucket_next; - U32 *idx_run; - U64 hash; - U32 count; - U32 first_idx; + RADDBGI_U32 *idx_run; + RADDBGI_U64 hash; + RADDBGI_U32 count; + RADDBGI_U32 first_idx; }; typedef struct RADDBGIC_IdxRuns RADDBGIC_IdxRuns; @@ -589,10 +672,10 @@ struct RADDBGIC_IdxRuns RADDBGIC_IdxRunNode *order_first; RADDBGIC_IdxRunNode *order_last; RADDBGIC_IdxRunNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U32 count; - U32 idx_count; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RADDBGI_U32 count; + RADDBGI_U32 idx_count; }; //- rjf: source file & file path baking data structures @@ -605,9 +688,9 @@ struct RADDBGIC_PathNode RADDBGIC_PathNode *first_child; RADDBGIC_PathNode *last_child; RADDBGIC_PathNode *next_sibling; - String8 name; + RADDBGIC_String8 name; struct RADDBGIC_SrcNode *src_file; - U32 idx; + RADDBGI_U32 idx; }; typedef struct RADDBGIC_LineMapFragment RADDBGIC_LineMapFragment; @@ -622,19 +705,19 @@ struct RADDBGIC_SrcNode { RADDBGIC_SrcNode *next; RADDBGIC_PathNode *path_node; - U32 idx; + RADDBGI_U32 idx; - String8 normal_full_path; + RADDBGIC_String8 normal_full_path; // place to gather the line info attached to this src file RADDBGIC_LineMapFragment *first_fragment; RADDBGIC_LineMapFragment *last_fragment; // place to put the final baked version of this file's line map - U32 line_map_nums_data_idx; - U32 line_map_range_data_idx; - U32 line_map_count; - U32 line_map_voff_data_idx; + RADDBGI_U32 line_map_nums_data_idx; + RADDBGI_U32 line_map_range_data_idx; + RADDBGI_U32 line_map_count; + RADDBGI_U32 line_map_voff_data_idx; }; typedef struct RADDBGIC_PathTree RADDBGIC_PathTree; @@ -642,11 +725,11 @@ struct RADDBGIC_PathTree { RADDBGIC_PathNode *first; RADDBGIC_PathNode *last; - U32 count; + RADDBGI_U32 count; RADDBGIC_PathNode root; RADDBGIC_SrcNode *src_first; RADDBGIC_SrcNode *src_last; - U32 src_count; + RADDBGI_U32 src_count; }; //- rjf: line info baking data structures @@ -654,36 +737,36 @@ struct RADDBGIC_PathTree typedef struct RADDBGIC_LineRec RADDBGIC_LineRec; struct RADDBGIC_LineRec { - U32 file_id; - U32 line_num; - U16 col_first; - U16 col_opl; + RADDBGI_U32 file_id; + RADDBGI_U32 line_num; + RADDBGI_U16 col_first; + RADDBGI_U16 col_opl; }; typedef struct RADDBGIC_UnitLinesCombined RADDBGIC_UnitLinesCombined; struct RADDBGIC_UnitLinesCombined { - U64 *voffs; + RADDBGI_U64 *voffs; RADDBGI_Line *lines; - U16 *cols; - U32 line_count; + RADDBGI_U16 *cols; + RADDBGI_U32 line_count; }; typedef struct RADDBGIC_SrcLinesCombined RADDBGIC_SrcLinesCombined; struct RADDBGIC_SrcLinesCombined { - U32 *line_nums; - U32 *line_ranges; - U64 *voffs; - U32 line_count; - U32 voff_count; + RADDBGI_U32 *line_nums; + RADDBGI_U32 *line_ranges; + RADDBGI_U64 *voffs; + RADDBGI_U32 line_count; + RADDBGI_U32 voff_count; }; typedef struct RADDBGIC_SrcLineMapVoffBlock RADDBGIC_SrcLineMapVoffBlock; struct RADDBGIC_SrcLineMapVoffBlock { RADDBGIC_SrcLineMapVoffBlock *next; - U64 voff; + RADDBGI_U64 voff; }; typedef struct RADDBGIC_SrcLineMapBucket RADDBGIC_SrcLineMapBucket; @@ -691,10 +774,10 @@ struct RADDBGIC_SrcLineMapBucket { RADDBGIC_SrcLineMapBucket *order_next; RADDBGIC_SrcLineMapBucket *hash_next; - U32 line_num; + RADDBGI_U32 line_num; RADDBGIC_SrcLineMapVoffBlock *first_voff_block; RADDBGIC_SrcLineMapVoffBlock *last_voff_block; - U64 voff_count; + RADDBGI_U64 voff_count; }; //- rjf: vmap baking data structure @@ -703,21 +786,21 @@ typedef struct RADDBGIC_VMap RADDBGIC_VMap; struct RADDBGIC_VMap { RADDBGI_VMapEntry *vmap; // [count + 1] - U32 count; + RADDBGI_U32 count; }; typedef struct RADDBGIC_VMapMarker RADDBGIC_VMapMarker; struct RADDBGIC_VMapMarker { - U32 idx; - U32 begin_range; + RADDBGI_U32 idx; + RADDBGI_U32 begin_range; }; typedef struct RADDBGIC_VMapRangeTracker RADDBGIC_VMapRangeTracker; struct RADDBGIC_VMapRangeTracker { RADDBGIC_VMapRangeTracker *next; - U32 idx; + RADDBGI_U32 idx; }; //- rjf: type data baking types @@ -726,16 +809,16 @@ typedef struct RADDBGIC_TypeData RADDBGIC_TypeData; struct RADDBGIC_TypeData { RADDBGI_TypeNode *type_nodes; - U32 type_node_count; + RADDBGI_U32 type_node_count; RADDBGI_UDT *udts; - U32 udt_count; + RADDBGI_U32 udt_count; RADDBGI_Member *members; - U32 member_count; + RADDBGI_U32 member_count; RADDBGI_EnumMember *enum_members; - U32 enum_member_count; + RADDBGI_U32 enum_member_count; }; //- rjf: symbol data baking types @@ -744,32 +827,32 @@ typedef struct RADDBGIC_SymbolData RADDBGIC_SymbolData; struct RADDBGIC_SymbolData { RADDBGI_GlobalVariable *global_variables; - U32 global_variable_count; + RADDBGI_U32 global_variable_count; RADDBGIC_VMap *global_vmap; RADDBGI_ThreadVariable *thread_variables; - U32 thread_variable_count; + RADDBGI_U32 thread_variable_count; RADDBGI_Procedure *procedures; - U32 procedure_count; + RADDBGI_U32 procedure_count; RADDBGI_Scope *scopes; - U32 scope_count; + RADDBGI_U32 scope_count; - U64 *scope_voffs; - U32 scope_voff_count; + RADDBGI_U64 *scope_voffs; + RADDBGI_U32 scope_voff_count; RADDBGIC_VMap *scope_vmap; RADDBGI_Local *locals; - U32 local_count; + RADDBGI_U32 local_count; RADDBGI_LocationBlock *location_blocks; - U32 location_block_count; + RADDBGI_U32 location_block_count; void *location_data; - U32 location_data_size; + RADDBGI_U32 location_data_size; }; //- rjf: name map baking types @@ -786,7 +869,7 @@ struct RADDBGIC_NameMapSemiBucket { RADDBGIC_NameMapSemiNode *first; RADDBGIC_NameMapSemiNode *last; - U64 count; + RADDBGI_U64 count; }; typedef struct RADDBGIC_NameMapBaked RADDBGIC_NameMapBaked; @@ -794,8 +877,8 @@ struct RADDBGIC_NameMapBaked { RADDBGI_NameMapBucket *buckets; RADDBGI_NameMapNode *nodes; - U32 bucket_count; - U32 node_count; + RADDBGI_U32 bucket_count; + RADDBGI_U32 node_count; }; //- rjf: bundle baking context type @@ -803,195 +886,209 @@ struct RADDBGIC_NameMapBaked typedef struct RADDBGIC_BakeParams RADDBGIC_BakeParams; struct RADDBGIC_BakeParams { - U64 strings_bucket_count; - U64 idx_runs_bucket_count; + RADDBGI_U64 strings_bucket_count; + RADDBGI_U64 idx_runs_bucket_count; }; typedef struct RADDBGIC_BakeCtx RADDBGIC_BakeCtx; struct RADDBGIC_BakeCtx { - Arena *arena; + RADDBGIC_Arena *arena; RADDBGIC_Strings strs; RADDBGIC_IdxRuns idxs; RADDBGIC_PathTree *tree; }; //////////////////////////////// -//~ rjf: Basic Type Helpers +//~ rjf: Basic Helpers + +//- rjf: memory set +#if !defined(raddbgic_memset) +RADDBGI_PROC void *raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size); +#endif + +//- rjf: strings +RADDBGI_PROC RADDBGIC_String8 raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size); +#define raddbgic_str8_lit(S) raddbgic_str8((U8*)(S), sizeof(S) - 1) + +//- rjf: arenas +RADDBGI_PROC void *raddbgic_arena_push(RADDBGIC_Arena *arena, RADDBGI_U64 size); +RADDBGI_PROC void raddbgic_arena_pop_to(RADDBGIC_Arena *arena, RADDBGI_U64 pos); +#define raddbgic_push_array_no_zero(a,T,c) (T*)raddbgic_arena_push((a), sizeof(T)*(c)) +#define raddbgic_push_array(a,T,c) (T*)raddbgic_memzero(raddbgic_push_array_no_zero(a,T,c), sizeof(T)*(c)) //- rjf: type lists -static void raddbgic_type_list_push(Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type); +RADDBGI_PROC void raddbgic_type_list_push(RADDBGIC_Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type); //- rjf: bytecode lists -static void raddbgic_bytecode_push_op(Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_EvalOp op, U64 p); -static void raddbgic_bytecode_push_uconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, U64 x); -static void raddbgic_bytecode_push_sconst(Arena *arena, RADDBGIC_EvalBytecode *bytecode, S64 x); -static void raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_EvalBytecode *right_destroyed); +RADDBGI_PROC void raddbgic_bytecode_push_op(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_EvalOp op, RADDBGI_U64 p); +RADDBGI_PROC void raddbgic_bytecode_push_uconst(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_U64 x); +RADDBGI_PROC void raddbgic_bytecode_push_sconst(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_S64 x); +RADDBGI_PROC void raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_EvalBytecode *right_destroyed); //- rjf: sortable range sorting -static RADDBGIC_SortKey* raddbgic_sort_key_array(Arena *arena, RADDBGIC_SortKey *keys, U64 count); +RADDBGI_PROC RADDBGIC_SortKey* raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U64 count); //////////////////////////////// //~ rjf: Auxiliary Data Structure Functions //- rjf: u64 -> ptr map -static void raddbgic_u64toptr_init(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 bucket_count); -static void raddbgic_u64toptr_lookup(RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_U64ToPtrLookup *lookup_out); -static void raddbgic_u64toptr_insert(Arena *arena, RADDBGIC_U64ToPtrMap *map, U64 key, U64 hash, RADDBGIC_U64ToPtrLookup *lookup, void *ptr); +RADDBGI_PROC void raddbgic_u64toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 bucket_count); +RADDBGI_PROC void raddbgic_u64toptr_map_lookup(RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RADDBGIC_U64ToPtrLookup *lookup_out); +RADDBGI_PROC void raddbgic_u64toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RADDBGIC_U64ToPtrLookup *lookup, void *ptr); //- rjf: string8 -> ptr map -static void raddbgic_str8toptr_init(Arena *arena, RADDBGIC_Str8ToPtrMap *map, U64 bucket_count); -static void*raddbgic_str8toptr_lookup(RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash); -static void raddbgic_str8toptr_insert(Arena *arena, RADDBGIC_Str8ToPtrMap *map, String8 key, U64 hash, void *ptr); +RADDBGI_PROC void raddbgic_str8toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGI_U64 bucket_count); +RADDBGI_PROC void*raddbgic_str8toptr_map_lookup(RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, RADDBGI_U64 hash); +RADDBGI_PROC void raddbgic_str8toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, RADDBGI_U64 hash, void *ptr); //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions //- rjf: root creation -static RADDBGIC_Root* raddbgic_root_new(RADDBGIC_RootParams *params); -static void raddbgic_root_release(RADDBGIC_Root *root); +RADDBGI_PROC RADDBGIC_Root* raddbgic_root_alloc(RADDBGIC_RootParams *params); +RADDBGI_PROC void raddbgic_root_release(RADDBGIC_Root *root); //- rjf: error accumulation -static void raddbgic_error(RADDBGIC_Root *root, String8 string); -static void raddbgic_errorf(RADDBGIC_Root *root, char *fmt, ...); -static RADDBGIC_Error* raddbgic_get_first_error(RADDBGIC_Root *root); +RADDBGI_PROC void raddbgic_push_error(RADDBGIC_Root *root, RADDBGIC_String8 string); +RADDBGI_PROC void raddbgic_push_errorf(RADDBGIC_Root *root, char *fmt, ...); +RADDBGI_PROC RADDBGIC_Error* raddbgic_first_error_from_root(RADDBGIC_Root *root); //- rjf: top-level info specification -static void raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli); +RADDBGI_PROC void raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli); //- rjf: binary section building -static void raddbgic_add_binary_section(RADDBGIC_Root *root, - String8 name, RADDBGI_BinarySectionFlags flags, - U64 voff_first, U64 voff_opl, U64 foff_first, - U64 foff_opl); +RADDBGI_PROC void raddbgic_add_binary_section(RADDBGIC_Root *root, + RADDBGIC_String8 name, RADDBGI_BinarySectionFlags flags, + RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, + RADDBGI_U64 foff_opl); //- rjf: unit info building -static RADDBGIC_Unit* raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, U64 unit_user_id, U64 unit_user_id_hash); -static void raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitInfo *info); -static void raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, - RADDBGIC_LineSequence *line_sequence); -static void raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, U64 first, U64 opl); +RADDBGI_PROC RADDBGIC_Unit* raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 unit_user_id, RADDBGI_U64 unit_user_id_hash); +RADDBGI_PROC void raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitInfo *info); +RADDBGI_PROC void raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_LineSequence *line_sequence); +RADDBGI_PROC void raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGI_U64 first, RADDBGI_U64 opl); //- rjf: type info lookups/reservations -static RADDBGIC_Type* raddbgic_type_from_id(RADDBGIC_Root *root, U64 type_user_id, U64 type_user_id_hash); -static RADDBGIC_Reservation* raddbgic_type_reserve_id(RADDBGIC_Root *root, U64 type_user_id, U64 type_user_id_hash); -static void raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_Type *type); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_from_id(RADDBGIC_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash); +RADDBGI_PROC RADDBGIC_Reservation* raddbgic_type_reserve_id(RADDBGIC_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash); +RADDBGI_PROC void raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_Type *type); //- rjf: nil/singleton types -static B32 raddbgic_type_is_unhandled_nil(RADDBGIC_Root *root, RADDBGIC_Type *type); -static RADDBGIC_Type* raddbgic_type_handled_nil(RADDBGIC_Root *root); -static RADDBGIC_Type* raddbgic_type_nil(RADDBGIC_Root *root); -static RADDBGIC_Type* raddbgic_type_variadic(RADDBGIC_Root *root); +RADDBGI_PROC RADDBGI_S32 raddbgic_type_is_unhandled_nil(RADDBGIC_Root *root, RADDBGIC_Type *type); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_handled_nil(RADDBGIC_Root *root); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_nil(RADDBGIC_Root *root); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_variadic(RADDBGIC_Root *root); //- rjf: base type info constructors -static RADDBGIC_Type* raddbgic_type_new(RADDBGIC_Root *root); -static RADDBGIC_TypeUDT* raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type); -static RADDBGIC_TypeUDT* raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_new(RADDBGIC_Root *root); +RADDBGI_PROC RADDBGIC_TypeUDT* raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type); +RADDBGI_PROC RADDBGIC_TypeUDT* raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type); //- rjf: basic/operator type construction helpers -static RADDBGIC_Type* raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name); -static RADDBGIC_Type* raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeModifierFlags flags); -static RADDBGIC_Type* raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U32 bit_off, U32 bit_count); -static RADDBGIC_Type* raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeKind ptr_type_kind); -static RADDBGIC_Type* raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, U64 count); -static RADDBGIC_Type* raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params); -static RADDBGIC_Type* raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_String8 name); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeModifierFlags flags); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeKind ptr_type_kind); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U64 count); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params); //- rjf: udt type constructors -static RADDBGIC_Type* raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, U64 size); -static RADDBGIC_Type* raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name); -static RADDBGIC_Type* raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name); -static RADDBGIC_Type* raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, RADDBGIC_String8 name, RADDBGI_U64 size); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGIC_String8 name); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGIC_String8 name); +RADDBGI_PROC RADDBGIC_Type* raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_String8 name); //- rjf: type member building -static void raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type, U32 off); -static void raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type); -static void raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type); -static void raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type); -static void raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type); -static void raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, U32 off); -static void raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, U32 vptr_off, U32 vtable_off); -static void raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *nested_type); -static void raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, String8 name, U64 val); +RADDBGI_PROC void raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type, RADDBGI_U32 off); +RADDBGI_PROC void raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type); +RADDBGI_PROC void raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type); +RADDBGI_PROC void raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type); +RADDBGI_PROC void raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type); +RADDBGI_PROC void raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, RADDBGI_U32 off); +RADDBGI_PROC void raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, RADDBGI_U32 vptr_off, RADDBGI_U32 vtable_off); +RADDBGI_PROC void raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *nested_type); +RADDBGI_PROC void raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, RADDBGIC_String8 name, RADDBGI_U64 val); //- rjf: type source coordinate specifications -static void raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, String8 source_path, U32 line, U32 col); +RADDBGI_PROC void raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, RADDBGIC_String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col); //- rjf: symbol info building -static RADDBGIC_Symbol* raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, U64 symbol_user_id, U64 symbol_user_id_hash); -static void raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_SymbolInfo *info); +RADDBGI_PROC RADDBGIC_Symbol* raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 symbol_user_id, RADDBGI_U64 symbol_user_id_hash); +RADDBGI_PROC void raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_SymbolInfo *info); //- rjf: scope info building -static RADDBGIC_Scope *raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, U64 scope_user_id, U64 scope_user_id_hash); -static void raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_Scope *parent); -static void raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, U64 voff_first, U64 voff_opl); -static void raddbgic_scope_recursive_set_symbol(RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); +RADDBGI_PROC RADDBGIC_Scope *raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 scope_user_id, RADDBGI_U64 scope_user_id_hash); +RADDBGI_PROC void raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_Scope *parent); +RADDBGI_PROC void raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl); +RADDBGI_PROC void raddbgic_scope_recursive_set_symbol(RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); //- rjf: local info building -static RADDBGIC_Local* raddbgic_local_handle_from_user_id(RADDBGIC_Root *root, U64 local_user_id, U64 local_user_id_hash); -static void raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBGIC_LocalInfo *info); -static RADDBGIC_LocationSet* raddbgic_location_set_from_local(RADDBGIC_Root *root, RADDBGIC_Local *local); +RADDBGI_PROC RADDBGIC_Local* raddbgic_local_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 local_user_id, RADDBGI_U64 local_user_id_hash); +RADDBGI_PROC void raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBGIC_LocalInfo *info); +RADDBGI_PROC RADDBGIC_LocationSet* raddbgic_location_set_from_local(RADDBGIC_Root *root, RADDBGIC_Local *local); //- rjf: location info building -static void raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset, U64 voff_first, U64 voff_opl, RADDBGIC_Location *location); -static RADDBGIC_Location* raddbgic_location_addr_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode); -static RADDBGIC_Location* raddbgic_location_val_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode); -static RADDBGIC_Location* raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, U8 reg_code, U16 offset); -static RADDBGIC_Location* raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, U8 reg_code, U16 offset); -static RADDBGIC_Location* raddbgic_location_val_reg(RADDBGIC_Root *root, U8 reg_code); +RADDBGI_PROC void raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGIC_Location *location); +RADDBGI_PROC RADDBGIC_Location* raddbgic_location_addr_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode); +RADDBGI_PROC RADDBGIC_Location* raddbgic_location_val_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode); +RADDBGI_PROC RADDBGIC_Location* raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset); +RADDBGI_PROC RADDBGIC_Location* raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset); +RADDBGI_PROC RADDBGIC_Location* raddbgic_location_val_reg(RADDBGIC_Root *root, RADDBGI_U8 reg_code); //- rjf: name map building -static RADDBGIC_NameMap* raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind); -static void raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 name, U32 idx); +RADDBGI_PROC RADDBGIC_NameMap* raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind); +RADDBGI_PROC void raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, RADDBGIC_String8 name, RADDBGI_U32 idx); //////////////////////////////// //~ rjf: Debug Info Baking (Loose -> Tight) Functions //- rjf: bake context construction -static RADDBGIC_BakeCtx* raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params); -static void raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx); +RADDBGI_PROC RADDBGIC_BakeCtx* raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params); +RADDBGI_PROC void raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx); //- rjf: string baking -static U32 raddbgic_string(RADDBGIC_BakeCtx *bctx, String8 str); +RADDBGI_PROC RADDBGI_U32 raddbgic_string(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 str); //- rjf: idx run baking -static U64 raddbgic_idx_run_hash(U32 *idx_run, U32 count); -static U32 raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, U32 *idx_run, U32 count); +RADDBGI_PROC RADDBGI_U64 raddbgic_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count); +RADDBGI_PROC RADDBGI_U32 raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count); //- rjf: data section baking -static U32 raddbgic_dsection(Arena *arena, RADDBGIC_DSections *dss, void *data, U64 size, RADDBGI_DataSectionTag tag); +RADDBGI_PROC RADDBGI_U32 raddbgic_dsection(RADDBGIC_Arena *arena, RADDBGIC_DSections *dss, void *data, RADDBGI_U64 size, RADDBGI_DataSectionTag tag); //- rjf: paths baking -static String8 raddbgic_normal_string_from_path_node(Arena *arena, RADDBGIC_PathNode *node); -static void raddbgic_normal_string_from_path_node_build(Arena *arena, RADDBGIC_PathNode *node, String8List *out); -static RADDBGIC_PathNode* raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx); -static RADDBGIC_PathNode* raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, String8 sub_dir); -static RADDBGIC_PathNode* raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, String8 path); -static U32 raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, String8 path); -static RADDBGIC_SrcNode* raddbgic_paths_new_src_node(RADDBGIC_BakeCtx *bctx); -static RADDBGIC_SrcNode* raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *path_node); +RADDBGI_PROC RADDBGIC_String8 raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node); +RADDBGI_PROC void raddbgic_normal_string_from_path_node_build(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node, RADDBGIC_String8List *out); +RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx); +RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, RADDBGIC_String8 sub_dir); +RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path); +RADDBGI_PROC RADDBGI_U32 raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path); +RADDBGI_PROC RADDBGIC_SrcNode* raddbgic_paths_new_src_node(RADDBGIC_BakeCtx *bctx); +RADDBGI_PROC RADDBGIC_SrcNode* raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *path_node); //- rjf: per-unit line info baking -static RADDBGIC_UnitLinesCombined* raddbgic_unit_combine_lines(Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq); +RADDBGI_PROC RADDBGIC_UnitLinesCombined* raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq); //- rjf: per-src line info baking -static RADDBGIC_SrcLinesCombined* raddbgic_source_combine_lines(Arena *arena, RADDBGIC_LineMapFragment *first); +RADDBGI_PROC RADDBGIC_SrcLinesCombined* raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *first); //- rjf: vmap baking -static RADDBGIC_VMap* raddbgic_vmap_from_markers(Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, U64 marker_count); -static RADDBGIC_VMap* raddbgic_vmap_from_unit_ranges(Arena *arena, RADDBGIC_UnitVMapRange *first, U64 count); +RADDBGI_PROC RADDBGIC_VMap* raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, RADDBGI_U64 marker_count); +RADDBGI_PROC RADDBGIC_VMap* raddbgic_vmap_from_unit_ranges(RADDBGIC_Arena *arena, RADDBGIC_UnitVMapRange *first, RADDBGI_U64 count); //- rjf: type info baking -static U32* raddbgic_idx_run_from_types(Arena *arena, RADDBGIC_Type **types, U32 count); -static RADDBGIC_TypeData* raddbgic_type_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx); +RADDBGI_PROC RADDBGI_U32* raddbgic_idx_run_from_types(RADDBGIC_Arena *arena, RADDBGIC_Type **types, RADDBGI_U32 count); +RADDBGI_PROC RADDBGIC_TypeData* raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx); //- rjf: symbol data baking -static RADDBGIC_SymbolData* raddbgic_symbol_data_combine(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx); +RADDBGI_PROC RADDBGIC_SymbolData* raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx); //- rjf: name map baking -static RADDBGIC_NameMapBaked* raddbgic_name_map_bake(Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map); +RADDBGI_PROC RADDBGIC_NameMapBaked* raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map); //- rjf: top-level baking entry point -static void raddbgic_bake_file(Arena *arena, RADDBGIC_Root *root, String8List *out); +RADDBGI_PROC void raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8List *out); #endif // RADDBGI_CONS_H diff --git a/src/raddbgi_cons/raddbgi_cons_local.c b/src/raddbgi_cons/raddbgi_cons_local.c new file mode 100644 index 00000000..18e07f38 --- /dev/null +++ b/src/raddbgi_cons/raddbgi_cons_local.c @@ -0,0 +1,4 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "raddbgi_cons.c" diff --git a/src/raddbgi_cons/raddbgi_cons_local.h b/src/raddbgi_cons/raddbgi_cons_local.h new file mode 100644 index 00000000..2117e02f --- /dev/null +++ b/src/raddbgi_cons/raddbgi_cons_local.h @@ -0,0 +1,27 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RADDBGI_CONS_LOCAL_H +#define RADDBGI_CONS_LOCAL_H + +// rjf: base layer memory ops +#define raddbgic_memset memset + +// rjf: base layer string overrides +#define RADDBGIC_String8 String8 +#define RADDBGIC_String8_BaseMember str +#define RADDBGIC_String8_SizeMember size +#define RADDBGIC_String8Node String8Node +#define RADDBGIC_String8List String8List + +// rjf: base layer arena overrides +#define RADDBGIC_Arena Arena +#define RADDBGIC_Arena_AllocImpl arena_alloc +#define RADDBGIC_Arena_ReleaseImpl arena_release +#define RADDBGIC_Arena_PosImpl arena_pos +#define RADDBGIC_Arena_PushImpl arena_push +#define RADDBGIC_Arena_PopToImpl arena_pop_to + +#include "raddbgi_cons.h" + +#endif // RADDBGI_CONS_LOCAL_H diff --git a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c index 04f55c7b..83b73fb5 100644 --- a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c +++ b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c @@ -4,7 +4,7 @@ #include "base/base_inc.h" #include "os/os_inc.h" #include "raddbgi_format/raddbgi_format.h" -#include "raddbgi_cons/raddbgi_cons.h" +#include "raddbgi_cons/raddbgi_cons_local.h" #include "raddbgi_elf.h" #include "raddbgi_dwarf.h" @@ -16,7 +16,7 @@ #include "base/base_inc.c" #include "os/os_inc.c" #include "raddbgi_format/raddbgi_format.c" -#include "raddbgi_cons/raddbgi_cons.c" +#include "raddbgi_cons/raddbgi_cons_local.c" #include "raddbgi_elf.c" #include "raddbgi_dwarf.c" diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c index 5a36f3d0..faf88fba 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c @@ -193,7 +193,7 @@ pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num){ U64 n_u64 = cv_u64_from_numeric(num); U32 n_u32 = (U32)n_u64; if (n_u64 > 0xFFFFFFFF){ - raddbgic_errorf(ctx->root, "constant too large"); + raddbgic_push_errorf(ctx->root, "constant too large"); n_u32 = 0; } return(n_u32); @@ -829,8 +829,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI default: { String8 kind_str = cv_string_from_leaf_kind(field_kind); - raddbgic_errorf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", - str8_varg(kind_str)); + raddbgic_push_errorf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", + str8_varg(kind_str)); }break; } @@ -953,8 +953,8 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_Ty default: { String8 kind_str = cv_string_from_leaf_kind(field_kind); - raddbgic_errorf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", - str8_varg(kind_str)); + raddbgic_push_errorf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", + str8_varg(kind_str)); }break; } @@ -1653,8 +1653,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ default: { String8 kind_str = cv_string_from_leaf_kind(range->hdr.kind); - raddbgic_errorf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", - str8_varg(kind_str), range->hdr.kind); + raddbgic_push_errorf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", + str8_varg(kind_str), range->hdr.kind); }break; } } @@ -1669,7 +1669,7 @@ pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype){ RADDBGIC_Type *result = pdbconv_type_resolve_itype(ctx, itype); if(raddbgic_type_is_unhandled_nil(ctx->root, result)) { - raddbgic_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); + raddbgic_push_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); } return(result); } @@ -3205,7 +3205,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ root_params.bucket_count_types = tpi->itype_opl; root_params.bucket_count_type_constructs = tpi->itype_opl; - RADDBGIC_Root *root = raddbgic_root_new(&root_params); + RADDBGIC_Root *root = raddbgic_root_alloc(&root_params); out->root = root; // top level info @@ -3365,7 +3365,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // conversion errors if (!params->hide_errors.converting){ - for (RADDBGIC_Error *error = raddbgic_get_first_error(root); + for (RADDBGIC_Error *error = raddbgic_first_error_from_root(root); error != 0; error = error->next){ str8_list_push(arena, &out->errors, error->msg); diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c index 3245651e..54dca6b7 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c @@ -5,7 +5,7 @@ #include "os/os_inc.h" #include "coff/coff.h" #include "raddbgi_format/raddbgi_format.h" -#include "raddbgi_cons/raddbgi_cons.h" +#include "raddbgi_cons/raddbgi_cons_local.h" #include "raddbgi_coff.h" #include "raddbgi_codeview.h" @@ -23,7 +23,7 @@ #include "coff/coff.c" #include "os/os_inc.c" #include "raddbgi_format/raddbgi_format.c" -#include "raddbgi_cons/raddbgi_cons.c" +#include "raddbgi_cons/raddbgi_cons_local.c" #include "raddbgi_msf.c" #include "raddbgi_codeview.c" diff --git a/src/raddbgi_format/raddbgi_format_parse.h b/src/raddbgi_format/raddbgi_format_parse.h index 6d167aa6..e0c3fa9c 100644 --- a/src/raddbgi_format/raddbgi_format_parse.h +++ b/src/raddbgi_format/raddbgi_format_parse.h @@ -141,7 +141,7 @@ static RADDBGI_GlobalVariable raddbgi_global_variable_nil = {0}; static RADDBGI_ThreadVariable raddbgi_thread_variable_nil = {0}; static RADDBGI_Procedure raddbgi_procedure_nil = {0}; static RADDBGI_Scope raddbgi_scope_nil = {0}; -static U64 raddbgi_voff_nil = 0; +static RADDBGI_U64 raddbgi_voff_nil = 0; static RADDBGI_LocationBlock raddbgi_location_block_nil = {0}; static RADDBGI_Local raddbgi_local_nil = {0}; #endif diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 0ebb7184..9bfeb01f 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -1,25 +1,15 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#include +#include "raddbgi_format/raddbgi_format.h" +#include "raddbgi_format/raddbgi_format.c" +#include "raddbgi_format/raddbgi_format_parse.h" +#include "raddbgi_format/raddbgi_format_parse.c" +#include "raddbgi_cons/raddbgi_cons.h" +#include "raddbgi_cons/raddbgi_cons.c" int main(int argument_count, char **arguments) { - for(int i = 0; i < 1000; i += 1) - { - OutputDebugStringA("Hello, this is a long string which is being output in loop #1.\n"); - } - for(int i = 0; i < 1000; i += 1) - { - OutputDebugStringA("Hello, this is a long string which is being output in loop #2.\n"); - } - for(int i = 0; i < 1000; i += 1) - { - OutputDebugStringA("Hello, this is a long string which is being output in loop #3.\n"); - } - for(int i = 0; i < 1000; i += 1) - { - OutputDebugStringA("Hello, this is a long string which is being output in loop #4.\n"); - } + return 0; } From 2a85e1d37d711af97ad3f90b7cea08b6779ae583 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 19:10:31 -0800 Subject: [PATCH 039/275] raddbgi cons: more overrides work --- src/raddbgi_cons/raddbgi_cons.c | 38 +++++++++++++++++----- src/raddbgi_cons/raddbgi_cons.h | 45 +++++++++++++++++++++------ src/raddbgi_cons/raddbgi_cons_local.h | 13 +++++--- 3 files changed, 73 insertions(+), 23 deletions(-) diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/raddbgi_cons/raddbgi_cons.c index 7680a8d8..2bfaabeb 100644 --- a/src/raddbgi_cons/raddbgi_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -12,7 +12,7 @@ //- rjf: memory set -#if !defined(raddbgic_memset) +#if !defined(RADDBGIC_MEMSET_OVERRIDE) RADDBGI_PROC void * raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size) { @@ -37,19 +37,41 @@ raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size) //- rjf: arenas -RADDBGI_PROC void * -raddbgic_arena_push(RADDBGIC_Arena *arena, RADDBGI_U64 size) +#if !defined (RADDBGIC_ARENA_OVERRIDE) + +RADDBGI_PROC RADDBGIC_Arena * +raddbgic_arena_alloc_fallback(void) { - void *result = RADDBGIC_Arena_PushImpl((arena), (size)); - return result; + RADDBGIC_Arena *arena = 0; + return arena; } RADDBGI_PROC void -raddbgic_arena_pop_to(RADDBGIC_Arena *arena, RADDBGI_U64 pos) +raddbgic_arena_release_fallback(RADDBGIC_Arena *arena) { - RADDBGIC_Arena_PopToImpl((arena), (pos)); + } +RADDBGI_PROC RADDBGI_U64 +raddbgic_arena_pos_fallback(RADDBGIC_Arena *arena) +{ + return 0; +} + +RADDBGI_PROC void * +raddbgic_arena_push_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 size) +{ + return 0; +} + +RADDBGI_PROC void +raddbgic_arena_pop_to_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 pos) +{ + +} + +#endif + //- rjf: type lists RADDBGI_PROC void @@ -194,7 +216,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U } else { - RADDBGIC_SortKey *keys_swap = push_array_no_zero(arena, RADDBGIC_SortKey, count); + RADDBGIC_SortKey *keys_swap = raddbgic_push_array_no_zero(arena, RADDBGIC_SortKey, count); RADDBGIC_SortKey *src = keys; RADDBGIC_SortKey *dst = keys_swap; RADDBGIC_OrderedRange *src_ranges = ranges_first; diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/raddbgi_cons/raddbgi_cons.h index 27abc7b6..1a55abf0 100644 --- a/src/raddbgi_cons/raddbgi_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -7,10 +7,15 @@ //////////////////////////////// //~ rjf: Overrideable Memory Operations +// To override the slow/default memset implementation used by the library, +// do the following: +// +// #define RADDBGIC_MEMSET_OVERRIDE +// #define raddbgic_memset + #if !defined(raddbgic_memset) # define raddbgic_memset raddbgic_memset_fallback #endif -#define raddbgic_memzero(ptr, size) raddbgic_memset((ptr), 0, (size)) //////////////////////////////// //~ rjf: Overrideable String View Types @@ -57,12 +62,13 @@ struct RADDBGIC_String8List // To override the arena allocator type used by the library, do the following: // +// #define RADDBGIC_ARENA_OVERRIDE // #define RADDBGIC_Arena -// #define RADDBGIC_Arena_AllocImpl Arena*> -// #define RADDBGIC_Arena_ReleaseImpl void> -// #define RADDBGIC_Arena_PosImpl U64> -// #define RADDBGIC_Arena_PushImpl void*> -// #define RADDBGIC_Arena_PopToImpl void> +// #define raddbgic_arena_alloc Arena*> +// #define raddbgic_arena_release void> +// #define raddbgic_arena_pos U64> +// #define raddbgic_arena_push void*> +// #define raddbgic_arena_pop_to void> #if !defined(RADDBGIC_Arena) typedef struct RADDBGIC_Arena RADDBGIC_Arena; @@ -79,6 +85,19 @@ struct RADDBGIC_Arena }; #endif +#if !defined(raddbgic_arena_alloc) +# define raddbgic_arena_alloc raddbgic_arena_alloc_fallback +#endif +#if !defined(raddbgic_arena_release) +# define raddbgic_arena_release raddbgic_arena_release_fallback +#endif +#if !defined(raddbgic_arena_pos) +# define raddbgic_arena_pos raddbgic_arena_pos_fallback +#endif +#if !defined(raddbgic_arena_push) +# define raddbgic_arena_push raddbgic_arena_push_fallback +#endif + typedef struct RADDBGIC_Temp RADDBGIC_Temp; struct RADDBGIC_Temp { @@ -902,18 +921,24 @@ struct RADDBGIC_BakeCtx //////////////////////////////// //~ rjf: Basic Helpers -//- rjf: memory set -#if !defined(raddbgic_memset) +//- rjf: memory operations +#if !defined(RADDBGIC_MEMSET_OVERRIDE) RADDBGI_PROC void *raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size); #endif +#define raddbgic_memzero(ptr, size) raddbgic_memset((ptr), 0, (size)) //- rjf: strings RADDBGI_PROC RADDBGIC_String8 raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size); #define raddbgic_str8_lit(S) raddbgic_str8((U8*)(S), sizeof(S) - 1) //- rjf: arenas -RADDBGI_PROC void *raddbgic_arena_push(RADDBGIC_Arena *arena, RADDBGI_U64 size); -RADDBGI_PROC void raddbgic_arena_pop_to(RADDBGIC_Arena *arena, RADDBGI_U64 pos); +#if !defined (RADDBGIC_ARENA_OVERRIDE) +RADDBGI_PROC RADDBGIC_Arena *raddbgic_arena_alloc_fallback(void); +RADDBGI_PROC void raddbgic_arena_release_fallback(RADDBGIC_Arena *arena); +RADDBGI_PROC RADDBGI_U64 raddbgic_arena_pos_fallback(RADDBGIC_Arena *arena); +RADDBGI_PROC void *raddbgic_arena_push_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 size); +RADDBGI_PROC void raddbgic_arena_pop_to_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 pos); +#endif #define raddbgic_push_array_no_zero(a,T,c) (T*)raddbgic_arena_push((a), sizeof(T)*(c)) #define raddbgic_push_array(a,T,c) (T*)raddbgic_memzero(raddbgic_push_array_no_zero(a,T,c), sizeof(T)*(c)) diff --git a/src/raddbgi_cons/raddbgi_cons_local.h b/src/raddbgi_cons/raddbgi_cons_local.h index 2117e02f..04c90bf0 100644 --- a/src/raddbgi_cons/raddbgi_cons_local.h +++ b/src/raddbgi_cons/raddbgi_cons_local.h @@ -5,9 +5,11 @@ #define RADDBGI_CONS_LOCAL_H // rjf: base layer memory ops +#define RADDBGIC_MEMSET_OVERRIDE #define raddbgic_memset memset // rjf: base layer string overrides +#define RADDBGI_STRING8_OVERRIDE #define RADDBGIC_String8 String8 #define RADDBGIC_String8_BaseMember str #define RADDBGIC_String8_SizeMember size @@ -15,12 +17,13 @@ #define RADDBGIC_String8List String8List // rjf: base layer arena overrides +#define RADDBGIC_ARENA_OVERRIDE #define RADDBGIC_Arena Arena -#define RADDBGIC_Arena_AllocImpl arena_alloc -#define RADDBGIC_Arena_ReleaseImpl arena_release -#define RADDBGIC_Arena_PosImpl arena_pos -#define RADDBGIC_Arena_PushImpl arena_push -#define RADDBGIC_Arena_PopToImpl arena_pop_to +#define raddbgic_arena_alloc arena_alloc +#define raddbgic_arena_release arena_release +#define raddbgic_arena_pos arena_pos +#define raddbgic_arena_push arena_push +#define raddbgic_arena_pop_to arena_pop_to #include "raddbgi_cons.h" From 440dcf21a259cbb99e8799365f079bc842b75394 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 20:32:20 -0800 Subject: [PATCH 040/275] further raddbg_cons librarification --- src/base/base_bits.c | 2 +- src/base/base_context_cracking.h | 26 ++- src/base/base_types.c | 4 +- src/base/base_types.h | 12 +- src/raddbgi_cons/raddbgi_cons.c | 234 +++++++++++++++++--------- src/raddbgi_cons/raddbgi_cons.h | 70 +++++++- src/raddbgi_cons/raddbgi_cons_local.h | 11 +- 7 files changed, 261 insertions(+), 98 deletions(-) diff --git a/src/base/base_bits.c b/src/base/base_bits.c index 98ae781f..1cb13455 100644 --- a/src/base/base_bits.c +++ b/src/base/base_bits.c @@ -1,7 +1,7 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#if COMPILER_CL || (COMPILER_CLANG && OS_WINDOWS) +#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) internal U64 count_bits_set16(U16 val) diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index 65f49e7b..b918cfdf 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -32,7 +32,27 @@ #elif defined(_MSC_VER) -# define COMPILER_CL 1 +# define COMPILER_MSVC 1 + +# if _MSC_VER >= 1920 +# define COMPILER_MSVC_YEAR 2019 +# elif _MSC_VER >= 1910 +# define COMPILER_MSVC_YEAR 2017 +# elif _MSC_VER >= 1900 +# define COMPILER_MSVC_YEAR 2015 +# elif _MSC_VER >= 1800 +# define COMPILER_MSVC_YEAR 2013 +# elif _MSC_VER >= 1700 +# define COMPILER_MSVC_YEAR 2012 +# elif _MSC_VER >= 1600 +# define COMPILER_MSVC_YEAR 2010 +# elif _MSC_VER >= 1500 +# define COMPILER_MSVC_YEAR 2008 +# elif _MSC_VER >= 1400 +# define COMPILER_MSVC_YEAR 2005 +# else +# define COMPILER_MSVC_YEAR 0 +# endif # if defined(_WIN32) # define OS_WINDOWS 1 @@ -110,8 +130,8 @@ #if !defined(ARCH_ARM32) # define ARCH_ARM32 0 #endif -#if !defined(COMPILER_CL) -# define COMPILER_CL 0 +#if !defined(COMPILER_MSVC) +# define COMPILER_MSVC 0 #endif #if !defined(COMPILER_GCC) # define COMPILER_GCC 0 diff --git a/src/base/base_types.c b/src/base/base_types.c index 9627f478..f79bade6 100644 --- a/src/base/base_types.c +++ b/src/base/base_types.c @@ -344,8 +344,8 @@ architecture_from_context(void){ internal Compiler compiler_from_context(void){ Compiler compiler = Compiler_Null; -#if COMPILER_CL - compiler = Compiler_cl; +#if COMPILER_MSVC + compiler = Compiler_msvc; #elif COMPILER_GCC compiler = Compiler_gcc; #elif COMPILER_CLANG diff --git a/src/base/base_types.h b/src/base/base_types.h index 3ed2cba6..20c35d06 100644 --- a/src/base/base_types.h +++ b/src/base/base_types.h @@ -31,7 +31,7 @@ #define global static #define local_persist static -#if COMPILER_CL || (COMPILER_CLANG && OS_WINDOWS) +#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) # pragma section(".rdata$", read) # define read_only __declspec(allocate(".rdata$")) #elif (COMPILER_CLANG && OS_LINUX) @@ -84,7 +84,7 @@ //////////////////////////////// //~ rjf: Asserts -#if COMPILER_CL +#if COMPILER_MSVC # define Trap() __debugbreak() #elif COMPILER_CLANG || COMPILER_GCC # define Trap() __builtin_trap() @@ -180,7 +180,7 @@ # define zero_struct {0} #endif -#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015 +#if COMPILER_MSVC && COMPILER_CL_YEAR < 2015 # define this_function_name "unknown" #else # define this_function_name __func__ @@ -196,7 +196,7 @@ # define C_LINKAGE #endif -#if COMPILER_CL +#if COMPILER_MSVC # define thread_static __declspec(thread) #elif COMPILER_CLANG || COMPILER_GCC # define thread_static __thread @@ -211,7 +211,7 @@ //////////////////////////////// //~ ASAN -#if COMPILER_CL +#if COMPILER_MSVC # if defined(__SANITIZE_ADDRESS__) # define ASAN_ENABLED 1 # define NO_ASAN __declspec(no_sanitize_address) @@ -345,7 +345,7 @@ Architecture; typedef enum Compiler { Compiler_Null, - Compiler_cl, + Compiler_msvc, Compiler_gcc, Compiler_clang, Compiler_COUNT, diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/raddbgi_cons/raddbgi_cons.c index 2bfaabeb..df672bba 100644 --- a/src/raddbgi_cons/raddbgi_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -24,16 +24,17 @@ raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size) } #endif -//- rjf: strings - -RADDBGI_PROC RADDBGIC_String8 -raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size) +#if !defined(RADDBGIC_MEMCPY_OVERRIDE) +RADDBGI_PROC void * +raddbgic_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size) { - RADDBGIC_String8 result; - result.RADDBGIC_String8_BaseMember = str; - result.RADDBGIC_String8_SizeMember = size; - return result; + for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + { + ((RADDBGI_U8 *)dst)[idx] = ((RADDBGI_U8 *)src)[idx]; + } + return dst; } +#endif //- rjf: arenas @@ -72,6 +73,74 @@ raddbgic_arena_pop_to_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 pos) #endif +//- rjf: thread-local scratch arenas + +#if !defined (RADDBGIC_SCRATCH_OVERRIDE) +static RADDBGIC_THREAD_LOCAL RADDBGIC_Arena *raddbgic_thread_scratches[2]; + +RADDBGI_PROC RADDBGIC_Temp +raddbgic_scratch_begin_fallback(RADDBGIC_Arena **conflicts, RADDBGI_U64 conflicts_count) +{ + if(raddbgic_thread_scratches[0] == 0) + { + raddbgic_thread_scratches[0] = raddbgic_arena_alloc(); + raddbgic_thread_scratches[1] = raddbgic_arena_alloc(); + } + RADDBGIC_Arena *arena = 0; + for(RADDBGI_U64 scratch_idx = 0; + scratch_idx < sizeof(raddbgic_thread_scratches)/sizeof(raddbgic_thread_scratches[0]); + scratch_idx += 1) + { + RADDBGI_S32 scratch_conflicts = 0; + for(RADDBGI_U64 conflict_idx = 0; conflict_idx < conflicts_count; conflict_idx += 1) + { + if(conflicts[conflict_idx] == raddbgic_thread_scratches[scratch_idx]) + { + scratch_conflicts = 1; + break; + } + } + if(!scratch_conflicts) + { + arena = raddbgic_thread_scratches[scratch_idx]; + } + } + RADDBGIC_Temp temp; + temp.arena = arena; + temp.pos = raddbgic_arena_pos(arena); + return temp; +} + +RADDBGI_PROC void +raddbgic_scratch_end_fallback(RADDBGIC_Temp temp) +{ + raddbgic_arena_pop_to(temp.arena, temp.pos); +} + +#endif + +//- rjf: strings + +RADDBGI_PROC RADDBGIC_String8 +raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size) +{ + RADDBGIC_String8 result; + result.RADDBGIC_String8_BaseMember = str; + result.RADDBGIC_String8_SizeMember = size; + return result; +} + +RADDBGI_PROC RADDBGIC_String8 +raddbgic_str8_copy(RADDBGIC_Arena *arena, RADDBGIC_String8 src) +{ + RADDBGIC_String8 dst; + dst.RADDBGIC_String8_SizeMember = src.RADDBGIC_String8_SizeMember; + dst.RADDBGIC_String8_BaseMember = raddbgic_push_array_no_zero(arena, RADDBGI_U8, dst.RADDBGIC_String8_SizeMember+1); + raddbgic_memcpy(dst.RADDBGIC_String8_BaseMember, src.RADDBGIC_String8_BaseMember, src.RADDBGIC_String8_SizeMember); + dst.RADDBGIC_String8_BaseMember[dst.RADDBGIC_String8_SizeMember] = 0; + return dst; +} + //- rjf: type lists RADDBGI_PROC void @@ -177,7 +246,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U // ranges, we want to be able to rely on order, so it needs to be preserved here. ProfBegin("raddbgic_sort_key_array"); - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); RADDBGIC_SortKey *result = 0; if(count <= 1) @@ -304,7 +373,11 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U } // end pass by swapping buffers and range nodes - Swap(RADDBGIC_SortKey*, src, dst); + { + RADDBGIC_SortKey *temp = src; + src = dst; + dst = temp; + } src_ranges = dst_ranges; dst_ranges = 0; dst_ranges_last = 0; @@ -396,7 +469,7 @@ raddbgic_str8toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, R } RADDBGI_PROC void* -raddbgic_str8toptr_map_lookup(RADDBGIC_Str8ToPtrMap *map, String8 key, RADDBGI_U64 hash) +raddbgic_str8toptr_map_lookup(RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, RADDBGI_U64 hash) { void *result = 0; RADDBGI_U64 bucket_idx = hash%map->buckets_count; @@ -414,14 +487,13 @@ raddbgic_str8toptr_map_lookup(RADDBGIC_Str8ToPtrMap *map, String8 key, RADDBGI_U } RADDBGI_PROC void -raddbgic_str8toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, String8 key, RADDBGI_U64 hash, void *ptr) +raddbgic_str8toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, RADDBGI_U64 hash, void *ptr) { RADDBGI_U64 bucket_idx = hash%map->buckets_count; - RADDBGIC_Str8ToPtrNode *node = raddbgic_push_array(arena, RADDBGIC_Str8ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); - node->key = push_str8_copy(arena, key); + node->key = raddbgic_str8_copy(arena, key); node->hash = hash; node->ptr = ptr; map->bucket_collision_count += (node->next != 0); @@ -436,7 +508,7 @@ raddbgic_str8toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGI_PROC RADDBGIC_Root* raddbgic_root_alloc(RADDBGIC_RootParams *params) { - RADDBGIC_Arena *arena = arena_alloc__sized(GB(64), MB(64)); + RADDBGIC_Arena *arena = raddbgic_arena_alloc(); RADDBGIC_Root *result = raddbgic_push_array(arena, RADDBGIC_Root, 1); result->arena = arena; @@ -495,7 +567,7 @@ raddbgic_root_release(RADDBGIC_Root *root) //- rjf: error accumulation RADDBGI_PROC void -raddbgic_push_error(RADDBGIC_Root *root, String8 string) +raddbgic_push_error(RADDBGIC_Root *root, RADDBGIC_String8 string) { RADDBGIC_Error *error = raddbgic_push_array(root->arena, RADDBGIC_Error, 1); SLLQueuePush(root->errors.first, root->errors.last, error); @@ -508,7 +580,7 @@ raddbgic_push_errorf(RADDBGIC_Root *root, char *fmt, ...) { va_list args; va_start(args, fmt); - String8 str = push_str8fv(root->arena, fmt, args); + RADDBGIC_String8 str = push_str8fv(root->arena, fmt, args); raddbgic_push_error(root, str); va_end(args); } @@ -532,7 +604,7 @@ raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli) //- rjf: binary section building RADDBGI_PROC void -raddbgic_add_binary_section(RADDBGIC_Root *root, String8 name, RADDBGI_BinarySectionFlags flags, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, RADDBGI_U64 foff_opl) +raddbgic_add_binary_section(RADDBGIC_Root *root, RADDBGIC_String8 name, RADDBGI_BinarySectionFlags flags, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, RADDBGI_U64 foff_opl) { RADDBGIC_BinarySection *sec = raddbgic_push_array(root->arena, RADDBGIC_BinarySection, 1); SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); @@ -573,12 +645,12 @@ raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitIn { raddbgic_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); unit->info_is_set = 1; - unit->unit_name = push_str8_copy(root->arena, info->unit_name); - unit->compiler_name = push_str8_copy(root->arena, info->compiler_name); - unit->source_file = push_str8_copy(root->arena, info->source_file); - unit->object_file = push_str8_copy(root->arena, info->object_file); - unit->archive_file = push_str8_copy(root->arena, info->archive_file); - unit->build_path = push_str8_copy(root->arena, info->build_path); + unit->unit_name = raddbgic_str8_copy(root->arena, info->unit_name); + unit->compiler_name = raddbgic_str8_copy(root->arena, info->compiler_name); + unit->source_file = raddbgic_str8_copy(root->arena, info->source_file); + unit->object_file = raddbgic_str8_copy(root->arena, info->object_file); + unit->archive_file = raddbgic_str8_copy(root->arena, info->archive_file); + unit->build_path = raddbgic_str8_copy(root->arena, info->build_path); unit->language = info->language; } @@ -589,7 +661,7 @@ raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBG SLLQueuePush(unit->line_seq_first, unit->line_seq_last, node); unit->line_seq_count += 1; - node->line_seq.file_name = push_str8_copy(root->arena, line_sequence->file_name); + node->line_seq.file_name = raddbgic_str8_copy(root->arena, line_sequence->file_name); node->line_seq.voffs = raddbgic_push_array(root->arena, RADDBGI_U64, line_sequence->line_count + 1); MemoryCopy(node->line_seq.voffs, line_sequence->voffs, sizeof(RADDBGI_U64)*(line_sequence->line_count + 1)); @@ -723,7 +795,7 @@ raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type) //- rjf: basic/operator type construction helpers RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name) +raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_String8 name) { raddbgic_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); RADDBGIC_Type *result = root->nil_type; @@ -746,7 +818,7 @@ raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 nam } // check for duplicate construct - String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -762,7 +834,7 @@ raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 nam // setup new node result = raddbgic_type_new(root); result->kind = type_kind; - result->name = push_str8_copy(root->arena, name); + result->name = raddbgic_str8_copy(root->arena, name); result->byte_size = byte_size; // save in construct map @@ -803,7 +875,7 @@ raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_ } // check for duplicate construct - String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -851,7 +923,7 @@ raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_ } // check for duplicate construct - String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -902,7 +974,7 @@ raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_T } // check for duplicate construct - String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -947,7 +1019,7 @@ raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U64 } // check for duplicate construct - String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -997,7 +1069,7 @@ raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDB } // check for duplicate construct - String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -1065,7 +1137,7 @@ raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Typ } // check for duplicate construct - String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -1108,7 +1180,7 @@ raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Typ //- rjf: udt type constructors RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String8 name, RADDBGI_U64 size) +raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, RADDBGIC_String8 name, RADDBGI_U64 size) { raddbgic_requiref(root, (record_type_kind == RADDBGI_TypeKind_Struct || record_type_kind == RADDBGI_TypeKind_Class || @@ -1120,7 +1192,7 @@ raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String RADDBGIC_Type *result = raddbgic_type_new(root); result->kind = record_type_kind; result->byte_size = size; - result->name = push_str8_copy(root->arena, name); + result->name = raddbgic_str8_copy(root->arena, name); // rjf: save in name map { @@ -1132,13 +1204,13 @@ raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, String } RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name) +raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGIC_String8 name) { // rjf: make type RADDBGIC_Type *result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Enum; result->byte_size = direct_type->byte_size; - result->name = push_str8_copy(root->arena, name); + result->name = raddbgic_str8_copy(root->arena, name); result->direct_type = direct_type; // rjf: save in name map @@ -1151,13 +1223,13 @@ raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name } RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 name) +raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGIC_String8 name) { // rjf: make type RADDBGIC_Type *result = raddbgic_type_new(root); result->kind = RADDBGI_TypeKind_Alias; result->byte_size = direct_type->byte_size; - result->name = push_str8_copy(root->arena, name); + result->name = raddbgic_str8_copy(root->arena, name); result->direct_type = direct_type; // rjf: save in name map @@ -1170,7 +1242,7 @@ raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, String8 nam } RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String8 name) +raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_String8 name) { raddbgic_requiref(root, (type_kind == RADDBGI_TypeKind_IncompleteStruct || type_kind == RADDBGI_TypeKind_IncompleteClass || @@ -1182,7 +1254,7 @@ raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String // rjf: make type RADDBGIC_Type *result = raddbgic_type_new(root); result->kind = type_kind; - result->name = push_str8_copy(root->arena, name); + result->name = raddbgic_str8_copy(root->arena, name); // save in name map { @@ -1196,7 +1268,7 @@ raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, String //- rjf: type member building RADDBGI_PROC void -raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type, RADDBGI_U32 off) +raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type, RADDBGI_U32 off) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) @@ -1206,14 +1278,14 @@ raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_t udt->member_count += 1; root->total_member_count += 1; member->kind = RADDBGI_MemberKind_DataField; - member->name = push_str8_copy(root->arena, name); + member->name = raddbgic_str8_copy(root->arena, name); member->type = mem_type; member->off = off; } } RADDBGI_PROC void -raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) +raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) @@ -1223,13 +1295,13 @@ raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_ udt->member_count += 1; root->total_member_count += 1; member->kind = RADDBGI_MemberKind_StaticData; - member->name = push_str8_copy(root->arena, name); + member->name = raddbgic_str8_copy(root->arena, name); member->type = mem_type; } } RADDBGI_PROC void -raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) +raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) @@ -1239,13 +1311,13 @@ raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, udt->member_count += 1; root->total_member_count += 1; member->kind = RADDBGI_MemberKind_Method; - member->name = push_str8_copy(root->arena, name); + member->name = raddbgic_str8_copy(root->arena, name); member->type = mem_type; } } RADDBGI_PROC void -raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) +raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) @@ -1257,13 +1329,13 @@ raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *recor root->total_member_count += 1; member->kind = RADDBGI_MemberKind_StaticMethod; - member->name = push_str8_copy(root->arena, name); + member->name = raddbgic_str8_copy(root->arena, name); member->type = mem_type; } } RADDBGI_PROC void -raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, String8 name, RADDBGIC_Type *mem_type) +raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type) { RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); if(udt != 0) @@ -1273,7 +1345,7 @@ raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *reco udt->member_count += 1; root->total_member_count += 1; member->kind = RADDBGI_MemberKind_VirtualMethod; - member->name = push_str8_copy(root->arena, name); + member->name = raddbgic_str8_copy(root->arena, name); member->type = mem_type; } } @@ -1326,7 +1398,7 @@ raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_ } RADDBGI_PROC void -raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, String8 name, RADDBGI_U64 val) +raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, RADDBGIC_String8 name, RADDBGI_U64 val) { raddbgic_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_any_type(root, enum_type); @@ -1336,21 +1408,21 @@ raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, String SLLQueuePush(udt->first_enum_val, udt->last_enum_val, enum_val); udt->enum_val_count += 1; root->total_enum_val_count += 1; - enum_val->name = push_str8_copy(root->arena, name); + enum_val->name = raddbgic_str8_copy(root->arena, name); enum_val->val = val; } } //- rjf: type source coordinate specifications RADDBGI_PROC void -raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col) +raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, RADDBGIC_String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col) { raddbgic_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), return, "Tried to add source coordinates to non-user-defined type."); RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_any_type(root, defined_type); if(udt != 0) { - udt->source_path = push_str8_copy(root->arena, source_path); + udt->source_path = raddbgic_str8_copy(root->arena, source_path); udt->line = line; udt->col = col; } @@ -1396,8 +1468,8 @@ raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_ root->symbol_kind_counts[kind] += 1; symbol->idx = root->symbol_kind_counts[kind]; symbol->kind = kind; - symbol->name = push_str8_copy(root->arena, info->name); - symbol->link_name = push_str8_copy(root->arena, info->link_name); + symbol->name = raddbgic_str8_copy(root->arena, info->name); + symbol->link_name = raddbgic_str8_copy(root->arena, info->link_name); symbol->type = info->type; symbol->is_extern = info->is_extern; symbol->offset = info->offset; @@ -1543,7 +1615,7 @@ raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBG scope->local_count += 1; root->local_count += 1; local->kind = info->kind; - local->name = push_str8_copy(root->arena, info->name); + local->name = raddbgic_str8_copy(root->arena, info->name); local->type = info->type; } @@ -1640,7 +1712,7 @@ raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind) } RADDBGI_PROC void -raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 string, RADDBGI_U32 idx) +raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, RADDBGIC_String8 string, RADDBGI_U32 idx) { // hash RADDBGI_U64 hash = raddbgi_hash(string.str, string.size); @@ -1663,7 +1735,7 @@ raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, String8 s if(match == 0) { match = raddbgic_push_array(root->arena, RADDBGIC_NameMapNode, 1); - match->string = push_str8_copy(root->arena, string); + match->string = raddbgic_str8_copy(root->arena, string); SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); SLLQueuePush_N(map->first, map->last, match, order_next); map->name_count += 1; @@ -1749,7 +1821,7 @@ raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx) //- rjf: string baking RADDBGI_PROC RADDBGI_U32 -raddbgic_string(RADDBGIC_BakeCtx *bctx, String8 str) +raddbgic_string(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 str) { Arena *arena = bctx->arena; RADDBGIC_Strings *strs = &bctx->strs; @@ -1773,7 +1845,7 @@ raddbgic_string(RADDBGIC_BakeCtx *bctx, String8 str) if(match == 0) { RADDBGIC_StringNode *node = push_array_no_zero(arena, RADDBGIC_StringNode, 1); - node->str = push_str8_copy(arena, str); + node->str = raddbgic_str8_copy(arena, str); node->hash = hash; node->idx = strs->count; strs->count += 1; @@ -1883,7 +1955,7 @@ raddbgic_dsection(RADDBGIC_Arena *arena, RADDBGIC_DSections *dss, void *data, RA //- rjf: paths baking -RADDBGI_PROC String8 +RADDBGI_PROC RADDBGIC_String8 raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node) { Temp scratch = scratch_begin(&arena, 1); @@ -1894,7 +1966,7 @@ raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode * } StringJoin join = {0}; join.sep = str8_lit("/"); - String8 result = str8_list_join(arena, &list, &join); + RADDBGIC_String8 result = str8_list_join(arena, &list, &join); { RADDBGI_U8 *ptr = result.str; RADDBGI_U8 *opl = result.str + result.size; @@ -1910,7 +1982,7 @@ raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode * } RADDBGI_PROC void -raddbgic_normal_string_from_path_node_build(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node, String8List *out) +raddbgic_normal_string_from_path_node_build(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node, RADDBGIC_String8List *out) { // TODO(rjf): why is this recursive... if(node->parent != 0) @@ -1935,7 +2007,7 @@ raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx) } RADDBGI_PROC RADDBGIC_PathNode* -raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, String8 sub_dir) +raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, RADDBGIC_String8 sub_dir) { // look for existing match RADDBGIC_PathNode *match = 0; @@ -1954,7 +2026,7 @@ raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, String8 new_node = raddbgic_paths_new_node(bctx); new_node->parent = dir; SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); - new_node->name = push_str8_copy(bctx->arena, sub_dir); + new_node->name = raddbgic_str8_copy(bctx->arena, sub_dir); } // select result from the two paths @@ -1967,7 +2039,7 @@ raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, String8 } RADDBGI_PROC RADDBGIC_PathNode* -raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, String8 path) +raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path) { RADDBGIC_PathNode *node_cursor = &bctx->tree->root; @@ -1985,7 +2057,7 @@ raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, String8 path) // if range is non-empty advance the node cursor if(range_first < ptr){ - String8 sub_dir = str8_range(range_first, ptr); + RADDBGIC_String8 sub_dir = str8_range(range_first, ptr); node_cursor = raddbgic_paths_sub_path(bctx, node_cursor, sub_dir); } } @@ -1995,7 +2067,7 @@ raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, String8 path) } RADDBGI_PROC RADDBGI_U32 -raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, String8 path) +raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path) { RADDBGIC_PathNode *node = raddbgic_paths_node_from_path(bctx, path); RADDBGI_U32 result = node->idx; @@ -2832,7 +2904,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI RADDBGI_LocationBlock *location_blocks = raddbgic_push_array(arena, RADDBGI_LocationBlock, location_block_count); - String8List location_data = {0}; + RADDBGIC_String8List location_data = {0}; // iterate scopes, locals, and locations // fill scope voffs, locals, and location information @@ -2901,20 +2973,20 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI case RADDBGI_LocationKind_AddrBytecodeStream: case RADDBGI_LocationKind_ValBytecodeStream: { - str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, str8_struct(&location->kind))); + str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, str8_struct(&location->kind))); for(RADDBGIC_EvalBytecodeOp *op_node = location->bytecode.first_op; op_node != 0; op_node = op_node->next){ RADDBGI_U8 op_data[9]; op_data[0] = op_node->op; MemoryCopy(op_data + 1, &op_node->p, op_node->p_size); - String8 op_data_str = str8(op_data, 1 + op_node->p_size); - str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, op_data_str)); + RADDBGIC_String8 op_data_str = str8(op_data, 1 + op_node->p_size); + str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, op_data_str)); } { RADDBGI_U64 data = 0; - String8 data_str = str8((RADDBGI_U8 *)&data, 1); - str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, data_str)); + RADDBGIC_String8 data_str = str8((RADDBGI_U8 *)&data, 1); + str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, data_str)); } }break; @@ -2925,7 +2997,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI loc.kind = location->kind; loc.register_code = location->register_code; loc.offset = location->offset; - str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, str8_struct(&loc))); + str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, str8_struct(&loc))); }break; case RADDBGI_LocationKind_ValRegister: @@ -2933,7 +3005,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI RADDBGI_LocationRegister loc = {0}; loc.kind = location->kind; loc.register_code = location->register_code; - str8_list_push(scratch.arena, &location_data, push_str8_copy(scratch.arena, str8_struct(&loc))); + str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, str8_struct(&loc))); }break; } } @@ -2965,7 +3037,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI } // flatten location data - String8 location_data_str = str8_list_join(arena, &location_data, 0); + RADDBGIC_String8 location_data_str = str8_list_join(arena, &location_data, 0); // scope vmap RADDBGIC_VMap *scope_vmap = 0; @@ -3125,7 +3197,7 @@ raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_Bake //- rjf: top-level baking entry point RADDBGI_PROC void -raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, String8List *out) +raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8List *out) { ProfBeginFunction(); str8_serial_begin(arena, out); diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/raddbgi_cons/raddbgi_cons.h index 1a55abf0..9d1958d5 100644 --- a/src/raddbgi_cons/raddbgi_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -17,11 +17,26 @@ # define raddbgic_memset raddbgic_memset_fallback #endif +// To override the slow/default memcpy implementation used by the library, +// do the following: +// +// #define RADDBGIC_MEMCPY_OVERRIDE +// #define raddbgic_memcpy + +#if !defined(raddbgic_memset) +# define raddbgic_memset raddbgic_memset_fallback +#endif + +#if !defined(raddbgic_memcpy) +# define raddbgic_memcpy raddbgic_memcpy_fallback +#endif + //////////////////////////////// //~ rjf: Overrideable String View Types // To override the string view type used by the library, do the following: // +// #define RADDBGIC_STRING8_OVERRIDE // #define RADDBGIC_String8 // #define RADDBGIC_String8_BaseMember // #define RADDBGIC_String8_SizeMember @@ -71,6 +86,7 @@ struct RADDBGIC_String8List // #define raddbgic_arena_pop_to void> #if !defined(RADDBGIC_Arena) +# define RADDBGIC_Arena RADDBGIC_Arena typedef struct RADDBGIC_Arena RADDBGIC_Arena; struct RADDBGIC_Arena { @@ -98,12 +114,48 @@ struct RADDBGIC_Arena # define raddbgic_arena_push raddbgic_arena_push_fallback #endif +//////////////////////////////// +//~ rjf: Overrideable Thread-Local Scratch Arenas + +// To override the default thread-local scratch arenas used b yhe library, +// do the following: +// +// #define RADDBGIC_SCRATCH_OVERRIDE +// #define RADDBGIC_Temp arena implementation - must be (Temp) -> (Arena*)> +// #define raddbgic_scratch_begin Temp> +// #define raddbgic_scratch_end void + +#if !defined(RADDBGIC_Temp) +# define RADDBGIC_Temp RADDBGIC_Temp typedef struct RADDBGIC_Temp RADDBGIC_Temp; struct RADDBGIC_Temp { RADDBGIC_Arena *arena; RADDBGI_U64 pos; }; +#endif + +#if !defined(raddbgic_scratch_begin) +# define raddbgic_scratch_begin raddbgic_scratch_begin_fallback +#endif +#if !defined(raddbgic_scratch_end) +# define raddbgic_scratch_end raddbgic_scratch_end_fallback +#endif + +//////////////////////////////// +//~ rjf: Linked List Helpers + +//////////////////////////////// +//~ rjf: Helper Macros + +#if defined(_MSC_VER) +# define RADDBGIC_THREAD_LOCAL __declspec(thread) +#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +# define RADDBGIC_THREAD_LOCAL __thread +#else +# error RADDBGIC_THREAD_LOCAL not defined for this compiler. +#endif //////////////////////////////// //~ rjf: Error Types @@ -925,12 +977,11 @@ struct RADDBGIC_BakeCtx #if !defined(RADDBGIC_MEMSET_OVERRIDE) RADDBGI_PROC void *raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size); #endif +#if !defined(RADDBGIC_MEMCPY_OVERRIDE) +RADDBGI_PROC void *raddbgic_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size); +#endif #define raddbgic_memzero(ptr, size) raddbgic_memset((ptr), 0, (size)) -//- rjf: strings -RADDBGI_PROC RADDBGIC_String8 raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size); -#define raddbgic_str8_lit(S) raddbgic_str8((U8*)(S), sizeof(S) - 1) - //- rjf: arenas #if !defined (RADDBGIC_ARENA_OVERRIDE) RADDBGI_PROC RADDBGIC_Arena *raddbgic_arena_alloc_fallback(void); @@ -942,6 +993,17 @@ RADDBGI_PROC void raddbgic_arena_pop_to_fallback(RADDBGIC_Arena *arena, RADDBGI_ #define raddbgic_push_array_no_zero(a,T,c) (T*)raddbgic_arena_push((a), sizeof(T)*(c)) #define raddbgic_push_array(a,T,c) (T*)raddbgic_memzero(raddbgic_push_array_no_zero(a,T,c), sizeof(T)*(c)) +//- rjf: thread-local scratch arenas +#if !defined (RADDBGIC_SCRATCH_OVERRIDE) +RADDBGI_PROC RADDBGIC_Temp raddbgic_scratch_begin_fallback(RADDBGIC_Arena **conflicts, RADDBGI_U64 conflicts_count); +RADDBGI_PROC void raddbgic_scratch_end_fallback(RADDBGIC_Temp temp); +#endif + +//- rjf: strings +RADDBGI_PROC RADDBGIC_String8 raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size); +RADDBGI_PROC RADDBGIC_String8 raddbgic_str8_copy(RADDBGIC_Arena *arena, RADDBGIC_String8 src); +#define raddbgic_str8_lit(S) raddbgic_str8((U8*)(S), sizeof(S) - 1) + //- rjf: type lists RADDBGI_PROC void raddbgic_type_list_push(RADDBGIC_Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type); diff --git a/src/raddbgi_cons/raddbgi_cons_local.h b/src/raddbgi_cons/raddbgi_cons_local.h index 04c90bf0..81c22f44 100644 --- a/src/raddbgi_cons/raddbgi_cons_local.h +++ b/src/raddbgi_cons/raddbgi_cons_local.h @@ -6,7 +6,9 @@ // rjf: base layer memory ops #define RADDBGIC_MEMSET_OVERRIDE -#define raddbgic_memset memset +#define RADDBGIC_MEMCPY_OVERRIDE +#define raddbgic_memset MemorySet +#define raddbgic_memcpy MemoryCopy // rjf: base layer string overrides #define RADDBGI_STRING8_OVERRIDE @@ -25,6 +27,13 @@ #define raddbgic_arena_push arena_push #define raddbgic_arena_pop_to arena_pop_to +// rjf: base layer scratch arena overrides +#define RADDBGIC_SCRATCH_OVERRIDE +#define RADDBGIC_Temp Temp +#define raddbgic_temp_arena(t) ((t).arena) +#define raddbgic_scratch_begin scratch_begin +#define raddbgic_scratch_end scratch_end + #include "raddbgi_cons.h" #endif // RADDBGI_CONS_LOCAL_H From 4aa2cb655b8862c60d913e44e16ff909991b10c0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Feb 2024 21:05:05 -0800 Subject: [PATCH 041/275] further progress on raddbgi cons librarification --- src/raddbgi_cons/raddbgi_cons.c | 372 ++++++++++++++++---------------- src/raddbgi_cons/raddbgi_cons.h | 81 ++++++- 2 files changed, 268 insertions(+), 185 deletions(-) diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/raddbgi_cons/raddbgi_cons.c index df672bba..a87f44fa 100644 --- a/src/raddbgi_cons/raddbgi_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -222,7 +222,7 @@ raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_Eval { if(left_dst->first_op == 0) { - MemoryCopyStruct(left_dst, right_destroyed); + raddbgic_memcpy_struct(left_dst, right_destroyed); } else { @@ -230,7 +230,7 @@ raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_Eval left_dst->op_count += right_destroyed->op_count; left_dst->encoded_size += right_destroyed->encoded_size; } - MemoryZeroStruct(right_destroyed); + raddbgic_memzero_struct(right_destroyed); } } @@ -268,7 +268,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); // generate an ordered range node - RADDBGIC_OrderedRange *new_range = raddbgic_push_array(scratch.arena, RADDBGIC_OrderedRange, 1); + RADDBGIC_OrderedRange *new_range = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGIC_OrderedRange, 1); SLLQueuePush(ranges_first, ranges_last, new_range); range_count += 1; new_range->first = first; @@ -318,7 +318,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U if(src_ranges == 0) { RADDBGI_U64 first = range1->first; - MemoryCopy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); + raddbgic_memcpy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); SLLQueuePush(dst_ranges, dst_ranges_last, range1); break; } @@ -327,7 +327,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U RADDBGIC_OrderedRange *range2 = src_ranges; SLLStackPop(src_ranges); - Assert(range1->opl == range2->first); + raddbgic_assert(range1->opl == range2->first); // merge these ranges RADDBGI_U64 jd = range1->first; @@ -339,7 +339,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U { if(src[j1].key <= src[j2].key) { - MemoryCopy(dst + jd, src + j1, sizeof(*src)); + raddbgic_memcpy(dst + jd, src + j1, sizeof(*src)); j1 += 1; jd += 1; if(j1 >= j1_opl) @@ -349,7 +349,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U } else { - MemoryCopy(dst + jd, src + j2, sizeof(*src)); + raddbgic_memcpy(dst + jd, src + j2, sizeof(*src)); j2 += 1; jd += 1; if(j2 >= j2_opl) @@ -360,11 +360,11 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U } if(j1 < j1_opl) { - MemoryCopy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1)); + raddbgic_memcpy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1)); } else { - MemoryCopy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2)); + raddbgic_memcpy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2)); } // save this as one range @@ -389,7 +389,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U #if 0 // assert sortedness for(RADDBGI_U64 i = 1; i < count; i += 1){ - Assert(result[i - 1].key <= result[i].key); + raddbgic_assert(result[i - 1].key <= result[i].key); } #endif @@ -407,7 +407,7 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U RADDBGI_PROC void raddbgic_u64toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 bucket_count) { - Assert(IsPow2OrZero(bucket_count) && bucket_count > 0); + raddbgic_assert(IsPow2OrZero(bucket_count) && bucket_count > 0); map->buckets = raddbgic_push_array(arena, RADDBGIC_U64ToPtrNode*, bucket_count); map->buckets_count = bucket_count; } @@ -526,13 +526,13 @@ raddbgic_root_alloc(RADDBGIC_RootParams *params) // references to "handled nil type" should be emitted as // references to nil - but should not generate error // messages when they are detected - they are expected! - Assert(result->nil_type->idx == result->handled_nil_type.idx); + raddbgic_assert(result->nil_type->idx == result->handled_nil_type.idx); } // setup a null scope { RADDBGIC_Scope *scope = raddbgic_push_array(result->arena, RADDBGIC_Scope, 1); - SLLQueuePush_N(result->first_scope, result->last_scope, scope, next_order); + RADDBGIC_SLLQueuePush_N(result->first_scope, result->last_scope, scope, next_order); result->scope_count += 1; } @@ -597,7 +597,7 @@ RADDBGI_PROC void raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli) { raddbgic_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); - MemoryCopyStruct(&root->top_level_info, tli); + raddbgic_memcpy_struct(&root->top_level_info, tli); root->top_level_info_is_set = 1; } @@ -633,7 +633,7 @@ raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 unit_user_id, { result = raddbgic_push_array(root->arena, RADDBGIC_Unit, 1); result->idx = root->unit_count; - SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); + RADDBGIC_SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); root->unit_count += 1; raddbgic_u64toptr_map_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); } @@ -664,15 +664,15 @@ raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBG node->line_seq.file_name = raddbgic_str8_copy(root->arena, line_sequence->file_name); node->line_seq.voffs = raddbgic_push_array(root->arena, RADDBGI_U64, line_sequence->line_count + 1); - MemoryCopy(node->line_seq.voffs, line_sequence->voffs, sizeof(RADDBGI_U64)*(line_sequence->line_count + 1)); + raddbgic_memcpy(node->line_seq.voffs, line_sequence->voffs, sizeof(RADDBGI_U64)*(line_sequence->line_count + 1)); node->line_seq.line_nums = raddbgic_push_array(root->arena, RADDBGI_U32, line_sequence->line_count); - MemoryCopy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(RADDBGI_U32)*line_sequence->line_count); + raddbgic_memcpy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(RADDBGI_U32)*line_sequence->line_count); if(line_sequence->col_nums != 0) { - node->line_seq.col_nums = raddbgic_push_array(root->arena, U16, line_sequence->line_count); - MemoryCopy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(U16)*line_sequence->line_count); + node->line_seq.col_nums = raddbgic_push_array(root->arena, RADDBGI_U16, line_sequence->line_count); + raddbgic_memcpy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(RADDBGI_U16)*line_sequence->line_count); } node->line_seq.line_count = line_sequence->line_count; @@ -726,10 +726,10 @@ raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_T //- rjf: nil/singleton types -RADDBGI_PROC B32 +RADDBGI_PROC RADDBGI_S32 raddbgic_type_is_unhandled_nil(RADDBGIC_Root *root, RADDBGIC_Type *type) { - B32 result = (type->kind == RADDBGI_TypeKind_NULL && type != &root->handled_nil_type); + RADDBGI_S32 result = (type->kind == RADDBGI_TypeKind_NULL && type != &root->handled_nil_type); return result; } @@ -758,7 +758,7 @@ raddbgic_type_new(RADDBGIC_Root *root) { RADDBGIC_Type *result = raddbgic_push_array(root->arena, RADDBGIC_Type, 1); result->idx = root->type_count; - SLLQueuePush_N(root->first_type, root->last_type, result, next_order); + RADDBGIC_SLLQueuePush_N(root->first_type, root->last_type, result, next_order); root->type_count += 1; return result; } @@ -770,7 +770,7 @@ raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type) { RADDBGIC_TypeUDT *new_udt = raddbgic_push_array(root->arena, RADDBGIC_TypeUDT, 1); new_udt->idx = root->type_udt_count; - SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); + RADDBGIC_SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); root->type_udt_count += 1; new_udt->self_type = type; type->udt = new_udt; @@ -799,26 +799,26 @@ raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_St { raddbgic_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); RADDBGIC_Type *result = root->nil_type; - Temp scratch = scratch_begin(0, 0); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); // setup construct buffer RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(type_kind) + name.size; - RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); { RADDBGI_U8 *ptr = buf; // "basic" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Basic; ptr += sizeof(RADDBGIC_TypeConstructKind); // type_kind - MemoryCopy(ptr, &type_kind, sizeof(type_kind)); + raddbgic_memcpy(ptr, &type_kind, sizeof(type_kind)); ptr += sizeof(type_kind); // name - MemoryCopy(ptr, name.str, name.size); + raddbgic_memcpy(ptr, name.str, name.size); ptr += name.size; } // check for duplicate construct - RADDBGIC_String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -848,7 +848,7 @@ raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_St } scratch_end(scratch); - Assert(result != 0); + raddbgic_assert(result != 0); return result; } @@ -856,26 +856,26 @@ RADDBGI_PROC RADDBGIC_Type* raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeModifierFlags flags) { RADDBGIC_Type *result = root->nil_type; - Temp scratch = scratch_begin(0, 0); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); // setup construct buffer RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); - RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); { RADDBGI_U8 *ptr = buf; // "modifier" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Modifier; ptr += sizeof(RADDBGIC_TypeConstructKind); // flags - MemoryCopy(ptr, &flags, sizeof(flags)); + raddbgic_memcpy(ptr, &flags, sizeof(flags)); ptr += sizeof(flags); // direct_type->idx - MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + raddbgic_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); ptr += sizeof(direct_type->idx); } // check for duplicate construct - RADDBGIC_String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -892,8 +892,8 @@ raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_ raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } - scratch_end(scratch); - Assert(result != 0); + raddbgic_scratch_end(scratch); + raddbgic_assert(result != 0); return result; } @@ -901,29 +901,29 @@ RADDBGI_PROC RADDBGIC_Type* raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count) { RADDBGIC_Type *result = root->nil_type; - Temp scratch = scratch_begin(0, 0); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); // setup construct buffer RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(RADDBGI_U32)*2; - RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); { RADDBGI_U8 *ptr = buf; // "bitfield" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Bitfield; ptr += sizeof(RADDBGIC_TypeConstructKind); // direct_type->idx - MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + raddbgic_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); ptr += sizeof(direct_type->idx); // bit_off - MemoryCopy(ptr, &bit_off, sizeof(bit_off)); + raddbgic_memcpy(ptr, &bit_off, sizeof(bit_off)); ptr += sizeof(bit_off); // bit_count - MemoryCopy(ptr, &bit_count, sizeof(bit_count)); + raddbgic_memcpy(ptr, &bit_count, sizeof(bit_count)); ptr += sizeof(bit_count); } // check for duplicate construct - RADDBGIC_String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -941,8 +941,8 @@ raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_ raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } - scratch_end(scratch); - Assert(result != 0); + raddbgic_scratch_end(scratch); + raddbgic_assert(result != 0); return result; } @@ -955,26 +955,26 @@ raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_T return root->nil_type, "Non-pointer type kind used to construct pointer type."); RADDBGIC_Type *result = root->nil_type; - Temp scratch = scratch_begin(0, 0); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); // setup construct buffer RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); - RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); { RADDBGI_U8 *ptr = buf; // "pointer" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Pointer; ptr += sizeof(RADDBGIC_TypeConstructKind); // type_kind - MemoryCopy(ptr, &ptr_type_kind, sizeof(ptr_type_kind)); + raddbgic_memcpy(ptr, &ptr_type_kind, sizeof(ptr_type_kind)); ptr += sizeof(ptr_type_kind); // direct_type->idx - MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + raddbgic_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); ptr += sizeof(direct_type->idx); } // check for duplicate construct - RADDBGIC_String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -990,8 +990,8 @@ raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_T raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } - scratch_end(scratch); - Assert(result != 0); + raddbgic_scratch_end(scratch); + raddbgic_assert(result != 0); return result; } @@ -999,27 +999,27 @@ RADDBGI_PROC RADDBGIC_Type* raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U64 count) { RADDBGIC_Type *result = root->nil_type; - Temp scratch = scratch_begin(0, 0); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); // setup construct buffer RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); - RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); { RADDBGI_U8 *ptr = buf; // "array" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Array; ptr += sizeof(RADDBGIC_TypeConstructKind); // direct_type->idx - MemoryCopy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + raddbgic_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); ptr += sizeof(direct_type->idx); // count - MemoryCopy(ptr, &count, sizeof(count)); + raddbgic_memcpy(ptr, &count, sizeof(count)); ptr += sizeof(count); } // check for duplicate construct - RADDBGIC_String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -1037,7 +1037,7 @@ raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U64 } scratch_end(scratch); - Assert(result != 0); + raddbgic_assert(result != 0); return result; } @@ -1045,31 +1045,31 @@ RADDBGI_PROC RADDBGIC_Type* raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params) { RADDBGIC_Type *result = root->nil_type; - Temp scratch = scratch_begin(0, 0); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); // setup construct buffer RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); - RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); { RADDBGI_U8 *ptr = buf; // "procedure" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Procedure; ptr += sizeof(RADDBGIC_TypeConstructKind); // ret_type->idx - MemoryCopy(ptr, &return_type->idx, sizeof(return_type->idx)); + raddbgic_memcpy(ptr, &return_type->idx, sizeof(return_type->idx)); ptr += sizeof(return_type->idx); // (params ...)->idx for(RADDBGIC_TypeNode *node = params->first; node != 0; node = node->next) { - MemoryCopy(ptr, &node->type->idx, sizeof(node->type->idx)); + raddbgic_memcpy(ptr, &node->type->idx, sizeof(node->type->idx)); ptr += sizeof(node->type->idx); } } // check for duplicate construct - RADDBGIC_String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -1100,8 +1100,8 @@ raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDB raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } - scratch_end(scratch); - Assert(result != 0); + raddbgic_scratch_end(scratch); + raddbgic_assert(result != 0); return result; } @@ -1109,35 +1109,35 @@ RADDBGI_PROC RADDBGIC_Type* raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params) { RADDBGIC_Type *result = root->nil_type; - Temp scratch = scratch_begin(0, 0); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); // setup construct buffer RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); - RADDBGI_U8 *buf = raddbgic_push_array(scratch.arena, RADDBGI_U8, buf_size); + RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); { RADDBGI_U8 *ptr = buf; // "method" *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Method; ptr += sizeof(RADDBGIC_TypeConstructKind); // ret_type->idx - MemoryCopy(ptr, &return_type->idx, sizeof(return_type->idx)); + raddbgic_memcpy(ptr, &return_type->idx, sizeof(return_type->idx)); ptr += sizeof(return_type->idx); // this_type->idx - MemoryCopy(ptr, &this_type->idx, sizeof(this_type->idx)); + raddbgic_memcpy(ptr, &this_type->idx, sizeof(this_type->idx)); ptr += sizeof(this_type->idx); // (params ...)->idx for(RADDBGIC_TypeNode *node = params->first; node != 0; node = node->next) { - MemoryCopy(ptr, &node->type->idx, sizeof(node->type->idx)); + raddbgic_memcpy(ptr, &node->type->idx, sizeof(node->type->idx)); ptr += sizeof(node->type->idx); } } // check for duplicate construct - RADDBGIC_String8 blob = str8(buf, buf_size); + RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RADDBGIC_Type*)lookup_ptr; @@ -1172,8 +1172,8 @@ raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Typ raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); } - scratch_end(scratch); - Assert(result != 0); + raddbgic_scratch_end(scratch); + raddbgic_assert(result != 0); return result; } @@ -1443,7 +1443,7 @@ raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 symbol_user else { result = raddbgic_push_array(root->arena, RADDBGIC_Symbol, 1); - SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); + RADDBGIC_SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); root->symbol_count += 1; raddbgic_u64toptr_map_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); } @@ -1483,11 +1483,11 @@ raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_ case RADDBGIC_SymbolKind_GlobalVariable: case RADDBGIC_SymbolKind_ThreadVariable: { - raddbgic_requiref(root, info->root_scope == 0, NoOp, "Global or thread variable initialized with root scope."); + raddbgic_requiref(root, info->root_scope == 0, raddbgic_noop, "Global or thread variable initialized with root scope."); }break; case RADDBGIC_SymbolKind_Procedure: { - raddbgic_requiref(root, info->root_scope != 0, NoOp, "Procedure symbol initialized without root scope."); + raddbgic_requiref(root, info->root_scope != 0, raddbgic_noop, "Procedure symbol initialized without root scope."); symbol->root_scope = info->root_scope; raddbgic_scope_recursive_set_symbol(info->root_scope, symbol); }break; @@ -1542,7 +1542,7 @@ raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 scope_user_i { result = raddbgic_push_array(root->arena, RADDBGIC_Scope, 1); result->idx = root->scope_count; - SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); + RADDBGIC_SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); root->scope_count += 1; raddbgic_u64toptr_map_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); } @@ -1556,7 +1556,7 @@ raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_S raddbgic_requiref(root, parent != 0, return, "Tried to set invalid parent as scope parent."); scope->symbol = parent->symbol; scope->parent_scope = parent; - SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); + RADDBGIC_SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); } RADDBGI_PROC void @@ -1664,7 +1664,7 @@ raddbgic_location_val_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalB } RADDBGI_PROC RADDBGIC_Location* -raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, U16 offset) +raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset) { RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_AddrRegisterPlusU16; @@ -1674,7 +1674,7 @@ raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, U1 } RADDBGI_PROC RADDBGIC_Location* -raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, U16 offset) +raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset) { RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); result->kind = RADDBGI_LocationKind_AddrAddrRegisterPlusU16; @@ -1736,14 +1736,14 @@ raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, RADDBGIC_ { match = raddbgic_push_array(root->arena, RADDBGIC_NameMapNode, 1); match->string = raddbgic_str8_copy(root->arena, string); - SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); - SLLQueuePush_N(map->first, map->last, match, order_next); + RADDBGIC_SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); + RADDBGIC_SLLQueuePush_N(map->first, map->last, match, order_next); map->name_count += 1; map->bucket_collision_count += (match->bucket_next != 0); } // find existing idx - B32 existing_idx = 0; + RADDBGI_S32 existing_idx = 0; for(RADDBGIC_NameMapIdxNode *node = match->idx_first; node != 0; node = node->next) @@ -1786,7 +1786,7 @@ raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, RADDBGIC_ RADDBGI_PROC RADDBGIC_BakeCtx* raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params) { - Arena *arena = arena_alloc(); + RADDBGIC_Arena *arena = raddbgic_arena_alloc(); RADDBGIC_BakeCtx *result = raddbgic_push_array(arena, RADDBGIC_BakeCtx, 1); result->arena = arena; #define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) @@ -1802,10 +1802,10 @@ raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params) result->tree = raddbgic_push_array(arena, RADDBGIC_PathTree, 1); { RADDBGIC_PathNode *nil_path_node = raddbgic_paths_new_node(result); - nil_path_node->name = str8_lit(""); + nil_path_node->name = raddbgic_str8_lit(""); RADDBGIC_SrcNode *nil_src_node = raddbgic_paths_new_src_node(result); nil_src_node->path_node = nil_path_node; - nil_src_node->normal_full_path = str8_lit(""); + nil_src_node->normal_full_path = raddbgic_str8_lit(""); nil_path_node->src_file = nil_src_node; } @@ -1823,7 +1823,7 @@ raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx) RADDBGI_PROC RADDBGI_U32 raddbgic_string(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 str) { - Arena *arena = bctx->arena; + RADDBGIC_Arena *arena = bctx->arena; RADDBGIC_Strings *strs = &bctx->strs; RADDBGI_U64 hash = raddbgi_hash(str.str, str.size); RADDBGI_U64 bucket_idx = hash%strs->buckets_count; @@ -1844,19 +1844,19 @@ raddbgic_string(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 str) // insert new node if no match if(match == 0) { - RADDBGIC_StringNode *node = push_array_no_zero(arena, RADDBGIC_StringNode, 1); + RADDBGIC_StringNode *node = raddbgic_push_array_no_zero(arena, RADDBGIC_StringNode, 1); node->str = raddbgic_str8_copy(arena, str); node->hash = hash; node->idx = strs->count; strs->count += 1; - SLLQueuePush_N(strs->order_first, strs->order_last, node, order_next); - SLLStackPush_N(strs->buckets[bucket_idx], node, bucket_next); + RADDBGIC_SLLQueuePush_N(strs->order_first, strs->order_last, node, order_next); + RADDBGIC_SLLStackPush_N(strs->buckets[bucket_idx], node, bucket_next); match = node; strs->bucket_collision_count += (node->bucket_next != 0); } // extract idx to return - Assert(match != 0); + raddbgic_assert(match != 0); RADDBGI_U32 result = match->idx; return result; } @@ -1879,7 +1879,7 @@ raddbgic_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count) RADDBGI_PROC RADDBGI_U32 raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count) { - Arena *arena = bctx->arena; + RADDBGIC_Arena *arena = bctx->arena; RADDBGIC_IdxRuns *idxs = &bctx->idxs; RADDBGI_U64 hash = raddbgic_idx_run_hash(idx_run, count); @@ -1893,7 +1893,7 @@ raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count { if(node->hash == hash) { - S32 is_match = 1; + RADDBGI_S32 is_match = 1; RADDBGI_U32 *node_idx = node->idx_run; for(RADDBGI_U32 i = 0; i < count; i += 1) { @@ -1914,8 +1914,8 @@ raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count // insert new node if no match if(match == 0) { - RADDBGIC_IdxRunNode *node = push_array_no_zero(arena, RADDBGIC_IdxRunNode, 1); - RADDBGI_U32 *idx_run_copy = push_array_no_zero(arena, RADDBGI_U32, count); + RADDBGIC_IdxRunNode *node = raddbgic_push_array_no_zero(arena, RADDBGIC_IdxRunNode, 1); + RADDBGI_U32 *idx_run_copy = raddbgic_push_array_no_zero(arena, RADDBGI_U32, count); for(RADDBGI_U32 i = 0; i < count; i += 1) { idx_run_copy[i] = idx_run[i]; @@ -1926,14 +1926,14 @@ raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count node->first_idx = idxs->idx_count; idxs->count += 1; idxs->idx_count += count; - SLLQueuePush_N(idxs->order_first, idxs->order_last, node, order_next); - SLLStackPush_N(idxs->buckets[bucket_idx], node, bucket_next); + RADDBGIC_SLLQueuePush_N(idxs->order_first, idxs->order_last, node, order_next); + RADDBGIC_SLLStackPush_N(idxs->buckets[bucket_idx], node, bucket_next); match = node; idxs->bucket_collision_count += (node->bucket_next != 0); } // extract idx to return - Assert(match != 0); + raddbgic_assert(match != 0); RADDBGI_U32 result = match->first_idx; return result; } @@ -1958,7 +1958,7 @@ raddbgic_dsection(RADDBGIC_Arena *arena, RADDBGIC_DSections *dss, void *data, RA RADDBGI_PROC RADDBGIC_String8 raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node) { - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); RADDBGIC_String8List list = {0}; if(node != 0) { @@ -2000,7 +2000,7 @@ raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx) { RADDBGIC_PathTree *tree = bctx->tree; RADDBGIC_PathNode *result = raddbgic_push_array(bctx->arena, RADDBGIC_PathNode, 1); - SLLQueuePush_N(tree->first, tree->last, result, next_order); + RADDBGIC_SLLQueuePush_N(tree->first, tree->last, result, next_order); result->idx = tree->count; tree->count += 1; return result; @@ -2013,8 +2013,10 @@ raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, RADDBGIC RADDBGIC_PathNode *match = 0; for(RADDBGIC_PathNode *node = dir->first_child; node != 0; - node = node->next_sibling){ - if(str8_match(node->name, sub_dir, StringMatchFlag_CaseInsensitive)){ + node = node->next_sibling) + { + if(str8_match(node->name, sub_dir, StringMatchFlag_CaseInsensitive)) + { match = node; break; } @@ -2025,7 +2027,7 @@ raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, RADDBGIC if(match == 0){ new_node = raddbgic_paths_new_node(bctx); new_node->parent = dir; - SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); + RADDBGIC_SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); new_node->name = raddbgic_str8_copy(bctx->arena, sub_dir); } @@ -2105,7 +2107,7 @@ RADDBGI_PROC RADDBGIC_UnitLinesCombined* raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq) { ProfBegin("raddbgic_unit_combine_lines"); - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // gather up all line info into two arrays // keys: sortable array; pairs voffs with line info records; null records are sequence enders @@ -2114,14 +2116,15 @@ raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDB RADDBGI_U64 seq_count = 0; for(RADDBGIC_LineSequenceNode *node = first_seq; node != 0; - node = node->next){ + node = node->next) + { seq_count += 1; line_count += node->line_seq.line_count; } RADDBGI_U64 key_count = line_count + seq_count; - RADDBGIC_SortKey *line_keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, key_count); - RADDBGIC_LineRec *line_recs = push_array_no_zero(scratch.arena, RADDBGIC_LineRec, line_count); + RADDBGIC_SortKey *line_keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, key_count); + RADDBGIC_LineRec *line_recs = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_LineRec, line_count); { RADDBGIC_SortKey *key_ptr = line_keys; @@ -2129,7 +2132,8 @@ raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDB for(RADDBGIC_LineSequenceNode *node = first_seq; node != 0; - node = node->next){ + node = node->next) + { RADDBGIC_PathNode *src_path = raddbgic_paths_node_from_path(bctx, node->line_seq.file_name); RADDBGIC_SrcNode *src_file = raddbgic_paths_src_node_from_path_node(bctx, src_path); @@ -2155,7 +2159,7 @@ raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDB key_ptr += 1; RADDBGIC_LineMapFragment *fragment = raddbgic_push_array(arena, RADDBGIC_LineMapFragment, 1); - SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); + RADDBGIC_SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); fragment->sequence = node; } } @@ -2167,8 +2171,8 @@ raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDB // null record first, and no more than one null record and one non-null record // arrange output - RADDBGI_U64 *arranged_voffs = push_array_no_zero(arena, RADDBGI_U64, key_count + 1); - RADDBGI_Line *arranged_lines = push_array_no_zero(arena, RADDBGI_Line, key_count); + RADDBGI_U64 *arranged_voffs = raddbgic_push_array_no_zero(arena, RADDBGI_U64, key_count + 1); + RADDBGI_Line *arranged_lines = raddbgic_push_array_no_zero(arena, RADDBGI_Line, key_count); for(RADDBGI_U64 i = 0; i < key_count; i += 1){ arranged_voffs[i] = sorted_line_keys[i].key; @@ -2204,7 +2208,7 @@ RADDBGI_PROC RADDBGIC_SrcLinesCombined* raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *first) { ProfBegin("raddbgic_source_combine_lines"); - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // gather line number map RADDBGIC_SrcLineMapBucket *first_bucket = 0; @@ -2250,8 +2254,8 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f // introduce new line if no match if(match == 0){ match = raddbgic_push_array(scratch.arena, RADDBGIC_SrcLineMapBucket, 1); - SLLQueuePush_N(first_bucket, last_bucket, match, order_next); - SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); + RADDBGIC_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); + RADDBGIC_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); match->line_num = line_num; line_count += 1; } @@ -2259,7 +2263,7 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f // insert new voff { RADDBGIC_SrcLineMapVoffBlock *block = raddbgic_push_array(scratch.arena, RADDBGIC_SrcLineMapVoffBlock, 1); - SLLQueuePush(match->first_voff_block, match->last_voff_block, block); + RADDBGIC_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); match->voff_count += 1; block->voff = voff; } @@ -2268,7 +2272,7 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f } // bake sortable keys array - RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, line_count); + RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, line_count); ProfScope("bake sortable keys array") { RADDBGIC_SortKey *key_ptr = keys; @@ -2284,9 +2288,9 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f RADDBGIC_SortKey *sorted_keys = raddbgic_sort_key_array(scratch.arena, keys, line_count); // bake result - RADDBGI_U32 *line_nums = push_array_no_zero(arena, RADDBGI_U32, line_count); - RADDBGI_U32 *line_ranges = push_array_no_zero(arena, RADDBGI_U32, line_count + 1); - RADDBGI_U64 *voffs = push_array_no_zero(arena, RADDBGI_U64, voff_count); + RADDBGI_U32 *line_nums = raddbgic_push_array_no_zero(arena, RADDBGI_U32, line_count); + RADDBGI_U32 *line_ranges = raddbgic_push_array_no_zero(arena, RADDBGI_U32, line_count + 1); + RADDBGI_U64 *voffs = raddbgic_push_array_no_zero(arena, RADDBGI_U64, voff_count); ProfScope("bake result") { RADDBGI_U64 *voff_ptr = voffs; @@ -2321,7 +2325,7 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f RADDBGI_PROC RADDBGIC_VMap* raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, RADDBGI_U64 marker_count) { - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // sort markers RADDBGIC_SortKey *sorted_keys = raddbgic_sort_key_array(scratch.arena, keys, marker_count); @@ -2334,7 +2338,7 @@ raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, // fill output vmap entries RADDBGI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; - RADDBGI_VMapEntry *vmap = push_array_no_zero(arena, RADDBGI_VMapEntry, vmap_count_raw + 1); + RADDBGI_VMapEntry *vmap = raddbgic_push_array_no_zero(arena, RADDBGI_VMapEntry, vmap_count_raw + 1); RADDBGI_U32 vmap_entry_count_pass_1 = 0; { @@ -2353,7 +2357,7 @@ raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *key_opl = sorted_keys + marker_count; for(;key_ptr < key_opl;){ // get initial map state from tracker stack - RADDBGI_U32 initial_idx = max_U32; + RADDBGI_U32 initial_idx = (RADDBGI_U32)0xffffffff; if(tracker_stack != 0){ initial_idx = tracker_stack->idx; } @@ -2370,12 +2374,12 @@ raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, if(marker->begin_range){ RADDBGIC_VMapRangeTracker *new_tracker = tracker_free; if(new_tracker != 0){ - SLLStackPop(tracker_free); + RADDBGIC_SLLStackPop(tracker_free); } else{ new_tracker = raddbgic_push_array(scratch.arena, RADDBGIC_VMapRangeTracker, 1); } - SLLStackPush(tracker_stack, new_tracker); + RADDBGIC_SLLStackPush(tracker_stack, new_tracker); new_tracker->idx = idx; } @@ -2394,7 +2398,7 @@ raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, } if(match != 0){ *ptr_in = match->next; - SLLStackPush(tracker_free, match); + RADDBGIC_SLLStackPush(tracker_free, match); } } } @@ -2451,7 +2455,7 @@ raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGI_U64 idx = vmap_ptr->idx; vmap_ptr += 1; for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; - MemoryCopyStruct(vmap_out, vmap_range_first); + raddbgic_memcpy_struct(vmap_out, vmap_range_first); vmap_out += 1; } @@ -2463,7 +2467,7 @@ raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, result->vmap = vmap; result->count = vmap_entry_count - 1; - scratch_end(scratch); + raddbgic_scratch_end(scratch); return result; } @@ -2471,14 +2475,14 @@ raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGI_PROC RADDBGIC_VMap* raddbgic_vmap_from_unit_ranges(RADDBGIC_Arena *arena, RADDBGIC_UnitVMapRange *first, RADDBGI_U64 count) { - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // count necessary markers RADDBGI_U64 marker_count = count*2; // fill markers - RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); - RADDBGIC_VMapMarker *markers = push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); + RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); + RADDBGIC_VMapMarker *markers = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); { RADDBGIC_SortKey *key_ptr = keys; @@ -2508,7 +2512,7 @@ raddbgic_vmap_from_unit_ranges(RADDBGIC_Arena *arena, RADDBGIC_UnitVMapRange *fi // construct vmap RADDBGIC_VMap *result = raddbgic_vmap_from_markers(arena, markers, keys, marker_count); - scratch_end(scratch); + raddbgic_scratch_end(scratch); return result; } @@ -2528,11 +2532,11 @@ RADDBGI_PROC RADDBGIC_TypeData* raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) { ProfBegin("raddbgic_type_data_combine"); - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // fill type nodes RADDBGI_U32 type_count = root->type_count; - RADDBGI_TypeNode *type_nodes = push_array_no_zero(arena, RADDBGI_TypeNode, type_count); + RADDBGI_TypeNode *type_nodes = raddbgic_push_array_no_zero(arena, RADDBGI_TypeNode, type_count); { RADDBGI_TypeNode *ptr = type_nodes; @@ -2600,24 +2604,24 @@ raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_ ptr->bitfield.size = loose_type->count; } - temp_end(scratch); + raddbgic_scratch_end(scratch); } // both iterators should end at the same time - Assert(loose_type == 0); - Assert(ptr == opl); + raddbgic_assert(loose_type == 0); + raddbgic_assert(ptr == opl); } // fill udts RADDBGI_U32 udt_count = root->type_udt_count; - RADDBGI_UDT *udts = push_array_no_zero(arena, RADDBGI_UDT, udt_count); + RADDBGI_UDT *udts = raddbgic_push_array_no_zero(arena, RADDBGI_UDT, udt_count); RADDBGI_U32 member_count = root->total_member_count; - RADDBGI_Member *members = push_array_no_zero(arena, RADDBGI_Member, member_count); + RADDBGI_Member *members = raddbgic_push_array_no_zero(arena, RADDBGI_Member, member_count); RADDBGI_U32 enum_member_count = root->total_enum_val_count; - RADDBGI_EnumMember *enum_members = push_array_no_zero(arena, RADDBGI_EnumMember, enum_member_count); + RADDBGI_EnumMember *enum_members = raddbgic_push_array_no_zero(arena, RADDBGI_EnumMember, enum_member_count); { RADDBGI_UDT *ptr = udts; @@ -2634,8 +2638,8 @@ raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_ loose_udt = loose_udt->next_order, ptr += 1){ ptr->self_type_idx = loose_udt->self_type->idx; - Assert(loose_udt->member_count == 0 || - loose_udt->enum_val_count == 0); + raddbgic_assert(loose_udt->member_count == 0 || + loose_udt->enum_val_count == 0); // enum members if(loose_udt->enum_val_count != 0){ @@ -2692,10 +2696,10 @@ raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_ } // all iterators should end at the same time - Assert(loose_udt == 0); - Assert(ptr == opl); - Assert(member_ptr == member_opl); - Assert(enum_member_ptr == enum_member_opl); + raddbgic_assert(loose_udt == 0); + raddbgic_assert(ptr == opl); + raddbgic_assert(member_ptr == member_opl); + raddbgic_assert(enum_member_ptr == enum_member_opl); } @@ -2710,7 +2714,7 @@ raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_ result->enum_members = enum_members; result->enum_member_count = enum_member_count; - scratch_end(scratch); + raddbgic_scratch_end(scratch); ProfEnd(); return result; } @@ -2721,7 +2725,7 @@ RADDBGI_PROC RADDBGIC_SymbolData* raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) { ProfBegin("raddbgic_symbol_data_combine"); - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // count symbol kinds RADDBGI_U32 globalvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_GlobalVariable]; @@ -2808,9 +2812,9 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI } } - Assert(global_ptr - global_variables == globalvar_count); - Assert(thread_local_ptr - thread_variables == threadvar_count); - Assert(procedure_ptr - procedures == procedure_count); + raddbgic_assert(global_ptr - global_variables == globalvar_count); + raddbgic_assert(thread_local_ptr - thread_variables == threadvar_count); + raddbgic_assert(procedure_ptr - procedures == procedure_count); } // global vmap @@ -2820,8 +2824,8 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI RADDBGI_U32 marker_count = globalvar_count*2; // fill markers - RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); - RADDBGIC_VMapMarker *markers = push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); + RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); + RADDBGIC_VMapMarker *markers = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); RADDBGIC_SortKey *key_ptr = keys; RADDBGIC_VMapMarker *marker_ptr = markers; @@ -2857,7 +2861,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI RADDBGI_U32 global_idx = 0; RADDBGI_U64 first = 0; - RADDBGI_U64 opl = max_U64; + RADDBGI_U64 opl = (RADDBGI_U64)0xffffffffffffffffull; key_ptr->key = first; key_ptr->val = marker_ptr; @@ -2875,8 +2879,8 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI } // assert we filled all the markers - Assert(key_ptr - keys == marker_count && - marker_ptr - markers == marker_count); + raddbgic_assert(key_ptr - keys == marker_count && + marker_ptr - markers == marker_count); // construct vmap global_vmap = raddbgic_vmap_from_markers(arena, markers, keys, marker_count); @@ -2885,11 +2889,11 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI // allocate scope array // (assert there is a nil scope) - Assert(root->first_scope != 0 && - root->first_scope->symbol == 0 && - root->first_scope->first_child == 0 && - root->first_scope->next_sibling == 0 && - root->first_scope->range_count == 0); + raddbgic_assert(root->first_scope != 0 && + root->first_scope->symbol == 0 && + root->first_scope->first_child == 0 && + root->first_scope->next_sibling == 0 && + root->first_scope->range_count == 0); RADDBGI_U32 scope_count = root->scope_count; RADDBGI_Scope *scopes = raddbgic_push_array(arena, RADDBGI_Scope, scope_count); @@ -2979,13 +2983,13 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI op_node = op_node->next){ RADDBGI_U8 op_data[9]; op_data[0] = op_node->op; - MemoryCopy(op_data + 1, &op_node->p, op_node->p_size); - RADDBGIC_String8 op_data_str = str8(op_data, 1 + op_node->p_size); + raddbgic_memcpy(op_data + 1, &op_node->p, op_node->p_size); + RADDBGIC_String8 op_data_str = raddbgic_str8(op_data, 1 + op_node->p_size); str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, op_data_str)); } { RADDBGI_U64 data = 0; - RADDBGIC_String8 data_str = str8((RADDBGI_U8 *)&data, 1); + RADDBGIC_String8 data_str = raddbgic_str8((RADDBGI_U8 *)&data, 1); str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, data_str)); } }break; @@ -3011,11 +3015,11 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI } } - Assert(location_block_ptr - location_blocks == location_opl); + raddbgic_assert(location_block_ptr - location_blocks == location_opl); } } - Assert(local_ptr - locals == scope_local_first + scope_local_count); + raddbgic_assert(local_ptr - locals == scope_local_first + scope_local_count); // emit scope scope_ptr->proc_idx = (node->symbol == 0)?0:node->symbol->idx; @@ -3032,8 +3036,8 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI //scope_ptr->static_local_count = ; } - Assert(scope_ptr - scopes == scope_count); - Assert(local_ptr - locals == local_count); + raddbgic_assert(scope_ptr - scopes == scope_count); + raddbgic_assert(local_ptr - locals == local_count); } // flatten location data @@ -3046,8 +3050,8 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI RADDBGI_U32 marker_count = scope_voff_count; // fill markers - RADDBGIC_SortKey *keys = push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); - RADDBGIC_VMapMarker *markers = push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); + RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); + RADDBGIC_VMapMarker *markers = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); RADDBGIC_SortKey *key_ptr = keys; RADDBGIC_VMapMarker *marker_ptr = markers; @@ -3100,7 +3104,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI result->location_data = location_data_str.str; result->location_data_size = location_data_str.size; - scratch_end(scratch); + raddbgic_scratch_end(scratch); ProfEnd(); return result; @@ -3111,7 +3115,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI RADDBGI_PROC RADDBGIC_NameMapBaked* raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map) { - Temp scratch = scratch_begin(&arena, 1); + RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); RADDBGI_U32 bucket_count = map->name_count; RADDBGI_U32 node_count = map->name_count; @@ -3131,7 +3135,7 @@ raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_Bake // allocate tables RADDBGI_NameMapBucket *buckets = raddbgic_push_array(arena, RADDBGI_NameMapBucket, bucket_count); - RADDBGI_NameMapNode *nodes = push_array_no_zero(arena, RADDBGI_NameMapNode, node_count); + RADDBGI_NameMapNode *nodes = raddbgic_push_array_no_zero(arena, RADDBGI_NameMapNode, node_count); // convert to serialized buckets & nodes { @@ -3154,8 +3158,8 @@ raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_Bake idx = node->idx_first->idx[0]; } else{ - Temp temp = temp_begin(scratch.arena); - RADDBGI_U32 *idx_run = push_array_no_zero(temp.arena, RADDBGI_U32, match_count); + RADDBGI_U64 temp_pos = raddbgic_arena_pos(scratch.arena); + RADDBGI_U32 *idx_run = raddbgic_push_array_no_zero(scratch.arena, RADDBGI_U32, match_count); RADDBGI_U32 *idx_ptr = idx_run; for(RADDBGIC_NameMapIdxNode *idxnode = node->idx_first; idxnode != 0; @@ -3169,9 +3173,9 @@ raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_Bake } } dblbreak:; - Assert(idx_ptr == idx_run + match_count); + raddbgic_assert(idx_ptr == idx_run + match_count); idx = raddbgic_idx_run(bctx, idx_run, match_count); - temp_end(temp); + raddbgic_arena_pop_to(scratch.arena, temp_pos); } // write to node @@ -3181,10 +3185,10 @@ raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_Bake node_ptr += 1; } } - Assert(node_ptr - nodes == node_count); + raddbgic_assert(node_ptr - nodes == node_count); } - scratch_end(scratch); + raddbgic_scratch_end(scratch); RADDBGIC_NameMapBaked *result = raddbgic_push_array(arena, RADDBGIC_NameMapBaked, 1); result->buckets = buckets; @@ -3494,7 +3498,7 @@ raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8L // generate data sections for strings { - RADDBGI_U32 *str_offs = push_array_no_zero(arena, RADDBGI_U32, bctx->strs.count + 1); + RADDBGI_U32 *str_offs = raddbgic_push_array_no_zero(arena, RADDBGI_U32, bctx->strs.count + 1); RADDBGI_U32 off_cursor = 0; { @@ -3516,7 +3520,7 @@ raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8L for(RADDBGIC_StringNode *node = bctx->strs.order_first; node != 0; node = node->order_next){ - MemoryCopy(ptr, node->str.str, node->str.size); + raddbgic_memcpy(ptr, node->str.str, node->str.size); ptr += node->str.size; } } @@ -3528,7 +3532,7 @@ raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8L // generate data sections for index runs { - RADDBGI_U32 *idx_data = push_array_no_zero(arena, RADDBGI_U32, bctx->idxs.idx_count); + RADDBGI_U32 *idx_data = raddbgic_push_array_no_zero(arena, RADDBGI_U32, bctx->idxs.idx_count); { RADDBGI_U32 *out_ptr = idx_data; @@ -3536,10 +3540,10 @@ raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8L RADDBGIC_IdxRunNode *node = bctx->idxs.order_first; for(;node != 0 && out_ptr < opl; node = node->order_next){ - MemoryCopy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); + raddbgic_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); out_ptr += node->count; } - Assert(out_ptr == opl); + raddbgic_assert(out_ptr == opl); } raddbgic_dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, @@ -3570,7 +3574,7 @@ raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8L node = node->next){ test_dss_count += 1; } - Assert(test_dss_count == dss.count); + raddbgic_assert(test_dss_count == dss.count); RADDBGI_DataSection *ptr = dstable; for(RADDBGIC_DSectionNode *node = dss.first; @@ -3589,7 +3593,7 @@ raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8L ptr->encoded_size = node->size; ptr->unpacked_size = node->size; } - Assert(ptr == dstable + dss.count); + raddbgic_assert(ptr == dstable + dss.count); } raddbgic_bake_ctx_release(bctx); diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/raddbgi_cons/raddbgi_cons.h index 9d1958d5..0faf21ed 100644 --- a/src/raddbgi_cons/raddbgi_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -134,6 +134,7 @@ struct RADDBGIC_Temp RADDBGIC_Arena *arena; RADDBGI_U64 pos; }; +#define raddbgic_temp_arena(t) ((t).arena) #endif #if !defined(raddbgic_scratch_begin) @@ -146,6 +147,66 @@ struct RADDBGIC_Temp //////////////////////////////// //~ rjf: Linked List Helpers +#define RADDBGIC_CheckNil(nil,p) ((p) == 0 || (p) == nil) +#define RADDBGIC_SetNil(nil,p) ((p) = nil) + +//- rjf: Base Doubly-Linked-List Macros +#define RADDBGIC_DLLInsert_NPZ(nil,f,l,p,n,next,prev) (RADDBGIC_CheckNil(nil,f) ? \ +((f) = (l) = (n), RADDBGIC_SetNil(nil,(n)->next), RADDBGIC_SetNil(nil,(n)->prev)) :\ +RADDBGIC_CheckNil(nil,p) ? \ +((n)->next = (f), (f)->prev = (n), (f) = (n), RADDBGIC_SetNil(nil,(n)->prev)) :\ +((p)==(l)) ? \ +((l)->next = (n), (n)->prev = (l), (l) = (n), RADDBGIC_SetNil(nil, (n)->next)) :\ +(((!RADDBGIC_CheckNil(nil,p) && RADDBGIC_CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) +#define RADDBGIC_DLLPushBack_NPZ(nil,f,l,n,next,prev) RADDBGIC_DLLInsert_NPZ(nil,f,l,l,n,next,prev) +#define RADDBGIC_DLLPushFront_NPZ(nil,f,l,n,next,prev) RADDBGIC_DLLInsert_NPZ(nil,l,f,f,n,prev,next) +#define RADDBGIC_DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ +((n) == (l) ? (l) = (l)->prev : (0)),\ +(RADDBGIC_CheckNil(nil,(n)->prev) ? (0) :\ +((n)->prev->next = (n)->next)),\ +(RADDBGIC_CheckNil(nil,(n)->next) ? (0) :\ +((n)->next->prev = (n)->prev))) + +//- rjf: Base Singly-Linked-List Queue Macros +#define RADDBGIC_SLLQueuePush_NZ(nil,f,l,n,next) (RADDBGIC_CheckNil(nil,f)?\ +((f)=(l)=(n),RADDBGIC_SetNil(nil,(n)->next)):\ +((l)->next=(n),(l)=(n),RADDBGIC_SetNil(nil,(n)->next))) +#define RADDBGIC_SLLQueuePushFront_NZ(nil,f,l,n,next) (RADDBGIC_CheckNil(nil,f)?\ +((f)=(l)=(n),RADDBGIC_SetNil(nil,(n)->next)):\ +((n)->next=(f),(f)=(n))) +#define RADDBGIC_SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ +(RADDBGIC_SetNil(nil,f), RADDBGIC_SetNil(nil,l)):\ +((f)=(f)->next)) + +//- rjf: Base Singly-Linked-List Stack Macros +#define RADDBGIC_SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) +#define RADDBGIC_SLLStackPop_N(f,next) ((f)=(f)->next) + +//////////////////////////////// +//~ rjf: Convenience Wrappers + +//- rjf: Doubly-Linked-List Wrappers +#define RADDBGIC_DLLInsert_NP(f,l,p,n,next,prev) RADDBGIC_DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define RADDBGIC_DLLPushBack_NP(f,l,n,next,prev) RADDBGIC_DLLPushBack_NPZ(0,f,l,n,next,prev) +#define RADDBGIC_DLLPushFront_NP(f,l,n,next,prev) RADDBGIC_DLLPushFront_NPZ(0,f,l,n,next,prev) +#define RADDBGIC_DLLRemove_NP(f,l,n,next,prev) RADDBGIC_DLLRemove_NPZ(0,f,l,n,next,prev) +#define RADDBGIC_DLLInsert(f,l,p,n) RADDBGIC_DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define RADDBGIC_DLLPushBack(f,l,n) RADDBGIC_DLLPushBack_NPZ(0,f,l,n,next,prev) +#define RADDBGIC_DLLPushFront(f,l,n) RADDBGIC_DLLPushFront_NPZ(0,f,l,n,next,prev) +#define RADDBGIC_DLLRemove(f,l,n) RADDBGIC_DLLRemove_NPZ(0,f,l,n,next,prev) + +//- rjf: Singly-Linked-List Queue Wrappers +#define RADDBGIC_SLLQueuePush_N(f,l,n,next) RADDBGIC_SLLQueuePush_NZ(0,f,l,n,next) +#define RADDBGIC_SLLQueuePushFront_N(f,l,n,next) RADDBGIC_SLLQueuePushFront_NZ(0,f,l,n,next) +#define RADDBGIC_SLLQueuePop_N(f,l,next) RADDBGIC_SLLQueuePop_NZ(0,f,l,next) +#define RADDBGIC_SLLQueuePush(f,l,n) RADDBGIC_SLLQueuePush_NZ(0,f,l,n,next) +#define RADDBGIC_SLLQueuePushFront(f,l,n) RADDBGIC_SLLQueuePushFront_NZ(0,f,l,n,next) +#define RADDBGIC_SLLQueuePop(f,l) RADDBGIC_SLLQueuePop_NZ(0,f,l,next) + +//- rjf: Singly-Linked-List Stack Wrappers +#define RADDBGIC_SLLStackPush(f,n) RADDBGIC_SLLStackPush_N(f,n,next) +#define RADDBGIC_SLLStackPop(f) RADDBGIC_SLLStackPop_N(f,next) + //////////////////////////////// //~ rjf: Helper Macros @@ -157,6 +218,22 @@ struct RADDBGIC_Temp # error RADDBGIC_THREAD_LOCAL not defined for this compiler. #endif +#if defined(_MSC_VER) +# define raddbgic_trap() __debugbreak() +#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +# define raddbgic_trap() __builtin_trap() +#else +# error "raddbgic_trap not defined for this compiler." +#endif + +#define raddbgic_assert_always(x) do{if(!(x)) {raddbgic_trap();}}while(0) +#if !defined(NDEBUG) +# define raddbgic_assert(x) raddbgic_assert_always(x) +#else +# define raddbgic_assert(x) (void)(x) +#endif +#define raddbgic_noop ((void)0) + //////////////////////////////// //~ rjf: Error Types @@ -981,6 +1058,8 @@ RADDBGI_PROC void *raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 RADDBGI_PROC void *raddbgic_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size); #endif #define raddbgic_memzero(ptr, size) raddbgic_memset((ptr), 0, (size)) +#define raddbgic_memzero_struct(ptr) raddbgic_memset((ptr), 0, sizeof(*(ptr))) +#define raddbgic_memcpy_struct(dst, src) raddbgic_memcpy((dst), (src), sizeof(*(dst))) //- rjf: arenas #if !defined (RADDBGIC_ARENA_OVERRIDE) @@ -1002,7 +1081,7 @@ RADDBGI_PROC void raddbgic_scratch_end_fallback(RADDBGIC_Temp temp); //- rjf: strings RADDBGI_PROC RADDBGIC_String8 raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size); RADDBGI_PROC RADDBGIC_String8 raddbgic_str8_copy(RADDBGIC_Arena *arena, RADDBGIC_String8 src); -#define raddbgic_str8_lit(S) raddbgic_str8((U8*)(S), sizeof(S) - 1) +#define raddbgic_str8_lit(S) raddbgic_str8((RADDBGI_U8*)(S), sizeof(S) - 1) //- rjf: type lists RADDBGI_PROC void raddbgic_type_list_push(RADDBGIC_Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type); From 8c70b5efc9b341064c0a75e6324f64818acd767a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 08:58:10 -0800 Subject: [PATCH 042/275] raddbgi_cons: get building standalone, without base layer; complete first pass of librarification --- src/raddbgi_cons/raddbgi_cons.c | 146 +++++++++++++++++++------- src/raddbgi_cons/raddbgi_cons.h | 49 ++++++++- src/raddbgi_cons/raddbgi_cons_local.h | 7 ++ 3 files changed, 162 insertions(+), 40 deletions(-) diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/raddbgi_cons/raddbgi_cons.c index a87f44fa..8eaed41e 100644 --- a/src/raddbgi_cons/raddbgi_cons.c +++ b/src/raddbgi_cons/raddbgi_cons.c @@ -141,13 +141,106 @@ raddbgic_str8_copy(RADDBGIC_Arena *arena, RADDBGIC_String8 src) return dst; } +RADDBGI_PROC RADDBGIC_String8 +raddbgic_str8f(RADDBGIC_Arena *arena, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + RADDBGIC_String8 result = raddbgic_str8fv(arena, fmt, args); + va_end(args); + return(result); +} + +RADDBGI_PROC RADDBGIC_String8 +raddbgic_str8fv(RADDBGIC_Arena *arena, char *fmt, va_list args) +{ + va_list args2; + va_copy(args2, args); + RADDBGI_U32 needed_bytes = raddbgic_vsnprintf(0, 0, fmt, args) + 1; + RADDBGIC_String8 result = {0}; + result.RADDBGIC_String8_BaseMember = raddbgic_push_array_no_zero(arena, RADDBGI_U8, needed_bytes); + result.RADDBGIC_String8_SizeMember = raddbgic_vsnprintf((char*)result.str, needed_bytes, fmt, args2); + result.RADDBGIC_String8_BaseMember[result.RADDBGIC_String8_SizeMember] = 0; + va_end(args2); + return(result); +} + +RADDBGI_PROC RADDBGI_S32 +raddbgic_str8_match(RADDBGIC_String8 a, RADDBGIC_String8 b, RADDBGIC_StringMatchFlags flags) +{ + RADDBGI_S32 result = 0; + if(a.RADDBGIC_String8_SizeMember == b.RADDBGIC_String8_SizeMember) + { + RADDBGI_S32 case_insensitive = (flags & RADDBGIC_StringMatchFlag_CaseInsensitive); + RADDBGI_U64 size = a.RADDBGIC_String8_SizeMember; + result = 1; + for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + { + RADDBGI_U8 at = a.RADDBGIC_String8_BaseMember[idx]; + RADDBGI_U8 bt = b.RADDBGIC_String8_BaseMember[idx]; + if(case_insensitive) + { + at = ('a' <= at && at <= 'z') ? at-('a'-'A') : at; + bt = ('a' <= bt && bt <= 'z') ? bt-('a'-'A') : bt; + } + if(at != bt) + { + result = 0; + break; + } + } + } + return result; +} + +//- rjf: string lists + +RADDBGI_PROC void +raddbgic_str8_list_push(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDBGIC_String8 string) +{ + RADDBGIC_String8Node *n = raddbgic_push_array(arena, RADDBGIC_String8Node, 1); + n->RADDBGIC_String8Node_StringMember = string; + RADDBGIC_SLLQueuePush_N(list->RADDBGIC_String8List_FirstMember, list->RADDBGIC_String8List_LastMember, n, RADDBGIC_String8Node_NextPtrMember); + list->RADDBGIC_String8List_NodeCountMember += 1; + list->RADDBGIC_String8List_TotalSizeMember += string.RADDBGIC_String8_SizeMember; +} + +RADDBGI_PROC RADDBGIC_String8 +raddbgic_str8_list_join(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDBGIC_String8 sep) +{ + RADDBGIC_String8 result; + raddbgic_memzero_struct(&result); + RADDBGI_U64 sep_count = (list->RADDBGIC_String8List_NodeCountMember > 1) ? (list->RADDBGIC_String8List_NodeCountMember-1) : 0; + result.RADDBGIC_String8_SizeMember = list->RADDBGIC_String8List_TotalSizeMember; + result.RADDBGIC_String8_BaseMember = raddbgic_push_array_no_zero(arena, RADDBGI_U8, result.RADDBGIC_String8_SizeMember+sep_count*sep.RADDBGIC_String8_SizeMember+1); + RADDBGI_U64 off = 0; + for(RADDBGIC_String8Node *node = list->RADDBGIC_String8List_FirstMember; + node != 0; + node = node->RADDBGIC_String8Node_NextPtrMember) + { + raddbgic_memcpy((RADDBGI_U8*)result.RADDBGIC_String8_BaseMember+off, + node->RADDBGIC_String8Node_StringMember.RADDBGIC_String8_BaseMember, + node->RADDBGIC_String8Node_StringMember.RADDBGIC_String8_SizeMember); + off += node->RADDBGIC_String8Node_StringMember.RADDBGIC_String8_SizeMember; + if(sep.RADDBGIC_String8_SizeMember != 0 && node->RADDBGIC_String8Node_NextPtrMember != 0) + { + raddbgic_memcpy((RADDBGI_U8*)result.RADDBGIC_String8_BaseMember+off, + sep.RADDBGIC_String8_BaseMember, + sep.RADDBGIC_String8_SizeMember); + off += sep.RADDBGIC_String8_SizeMember; + } + } + result.RADDBGIC_String8_BaseMember[result.RADDBGIC_String8_SizeMember] = 0; + return result; +} + //- rjf: type lists RADDBGI_PROC void raddbgic_type_list_push(RADDBGIC_Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type) { RADDBGIC_TypeNode *node = raddbgic_push_array(arena, RADDBGIC_TypeNode, 1); - SLLQueuePush(list->first, list->last, node); + RADDBGIC_SLLQueuePush(list->first, list->last, node); list->count += 1; node->type = type; } @@ -165,7 +258,7 @@ raddbgic_bytecode_push_op(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode node->p_size = p_size; node->p = p; - SLLQueuePush(bytecode->first_op, bytecode->last_op, node); + RADDBGIC_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); bytecode->op_count += 1; bytecode->encoded_size += 1 + p_size; } @@ -245,7 +338,6 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U // Also - this sort should be a "stable" sort. In the use case of sorting vmap // ranges, we want to be able to rely on order, so it needs to be preserved here. - ProfBegin("raddbgic_sort_key_array"); RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); RADDBGIC_SortKey *result = 0; @@ -394,8 +486,6 @@ raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U #endif scratch_end(scratch); - ProfEnd(); - return result; } @@ -477,7 +567,7 @@ raddbgic_str8toptr_map_lookup(RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, node != 0; node = node->next) { - if(node->hash == hash && str8_match(node->key, key, 0)) + if(node->hash == hash && raddbgic_str8_match(node->key, key, 0)) { result = node->ptr; break; @@ -580,7 +670,7 @@ raddbgic_push_errorf(RADDBGIC_Root *root, char *fmt, ...) { va_list args; va_start(args, fmt); - RADDBGIC_String8 str = push_str8fv(root->arena, fmt, args); + RADDBGIC_String8 str = raddbgic_str8fv(root->arena, fmt, args); raddbgic_push_error(root, str); va_end(args); } @@ -1724,7 +1814,7 @@ raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, RADDBGIC_ node != 0; node = node->bucket_next) { - if(str8_match(string, node->string, 0)) + if(raddbgic_str8_match(string, node->string, 0)) { match = node; break; @@ -1834,7 +1924,7 @@ raddbgic_string(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 str) node != 0; node = node->bucket_next) { - if(node->hash == hash && str8_match(node->str, str, 0)) + if(node->hash == hash && raddbgic_str8_match(node->str, str, 0)) { match = node; break; @@ -1964,9 +2054,7 @@ raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode * { raddbgic_normal_string_from_path_node_build(scratch.arena, node, &list); } - StringJoin join = {0}; - join.sep = str8_lit("/"); - RADDBGIC_String8 result = str8_list_join(arena, &list, &join); + RADDBGIC_String8 result = raddbgic_str8_list_join(arena, &list, raddbgic_str8_lit("/")); { RADDBGI_U8 *ptr = result.str; RADDBGI_U8 *opl = result.str + result.size; @@ -1991,7 +2079,7 @@ raddbgic_normal_string_from_path_node_build(RADDBGIC_Arena *arena, RADDBGIC_Path } if(node->name.size > 0) { - str8_list_push(arena, out, node->name); + raddbgic_str8_list_push(arena, out, node->name); } } @@ -2015,7 +2103,7 @@ raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, RADDBGIC node != 0; node = node->next_sibling) { - if(str8_match(node->name, sub_dir, StringMatchFlag_CaseInsensitive)) + if(raddbgic_str8_match(node->name, sub_dir, RADDBGIC_StringMatchFlag_CaseInsensitive)) { match = node; break; @@ -2059,7 +2147,7 @@ raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path) // if range is non-empty advance the node cursor if(range_first < ptr){ - RADDBGIC_String8 sub_dir = str8_range(range_first, ptr); + RADDBGIC_String8 sub_dir = raddbgic_str8(range_first, (RADDBGI_U64)(ptr-range_first)); node_cursor = raddbgic_paths_sub_path(bctx, node_cursor, sub_dir); } } @@ -2106,7 +2194,6 @@ raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode RADDBGI_PROC RADDBGIC_UnitLinesCombined* raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq) { - ProfBegin("raddbgic_unit_combine_lines"); RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // gather up all line info into two arrays @@ -2197,8 +2284,6 @@ raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDB result->line_count = key_count; scratch_end(scratch); - ProfEnd(); - return result; } @@ -2207,7 +2292,6 @@ raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDB RADDBGI_PROC RADDBGIC_SrcLinesCombined* raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *first) { - ProfBegin("raddbgic_source_combine_lines"); RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // gather line number map @@ -2218,7 +2302,6 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f RADDBGI_U64 line_count = 0; RADDBGI_U64 voff_count = 0; RADDBGI_U64 max_line_num = 0; - ProfScope("gather line number map") { for(RADDBGIC_LineMapFragment *map_fragment = first; map_fragment != 0; @@ -2273,7 +2356,6 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f // bake sortable keys array RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, line_count); - ProfScope("bake sortable keys array") { RADDBGIC_SortKey *key_ptr = keys; for(RADDBGIC_SrcLineMapBucket *node = first_bucket; @@ -2291,7 +2373,6 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f RADDBGI_U32 *line_nums = raddbgic_push_array_no_zero(arena, RADDBGI_U32, line_count); RADDBGI_U32 *line_ranges = raddbgic_push_array_no_zero(arena, RADDBGI_U32, line_count + 1); RADDBGI_U64 *voffs = raddbgic_push_array_no_zero(arena, RADDBGI_U64, voff_count); - ProfScope("bake result") { RADDBGI_U64 *voff_ptr = voffs; for(RADDBGI_U32 i = 0; i < line_count; i += 1){ @@ -2316,8 +2397,6 @@ raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *f result->voff_count = voff_count; scratch_end(scratch); - ProfEnd(); - return result; } @@ -2531,7 +2610,6 @@ raddbgic_idx_run_from_types(RADDBGIC_Arena *arena, RADDBGIC_Type **types, RADDBG RADDBGI_PROC RADDBGIC_TypeData* raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) { - ProfBegin("raddbgic_type_data_combine"); RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // fill type nodes @@ -2715,7 +2793,6 @@ raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_ result->enum_member_count = enum_member_count; raddbgic_scratch_end(scratch); - ProfEnd(); return result; } @@ -2724,7 +2801,6 @@ raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_ RADDBGI_PROC RADDBGIC_SymbolData* raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) { - ProfBegin("raddbgic_symbol_data_combine"); RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); // count symbol kinds @@ -2977,7 +3053,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI case RADDBGI_LocationKind_AddrBytecodeStream: case RADDBGI_LocationKind_ValBytecodeStream: { - str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, str8_struct(&location->kind))); + raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, raddbgic_str8_struct(&location->kind))); for(RADDBGIC_EvalBytecodeOp *op_node = location->bytecode.first_op; op_node != 0; op_node = op_node->next){ @@ -2985,12 +3061,12 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI op_data[0] = op_node->op; raddbgic_memcpy(op_data + 1, &op_node->p, op_node->p_size); RADDBGIC_String8 op_data_str = raddbgic_str8(op_data, 1 + op_node->p_size); - str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, op_data_str)); + raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, op_data_str)); } { RADDBGI_U64 data = 0; RADDBGIC_String8 data_str = raddbgic_str8((RADDBGI_U8 *)&data, 1); - str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, data_str)); + raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, data_str)); } }break; @@ -3001,7 +3077,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI loc.kind = location->kind; loc.register_code = location->register_code; loc.offset = location->offset; - str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, str8_struct(&loc))); + raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, raddbgic_str8_struct(&loc))); }break; case RADDBGI_LocationKind_ValRegister: @@ -3009,7 +3085,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI RADDBGI_LocationRegister loc = {0}; loc.kind = location->kind; loc.register_code = location->register_code; - str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, str8_struct(&loc))); + raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, raddbgic_str8_struct(&loc))); }break; } } @@ -3041,7 +3117,7 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI } // flatten location data - RADDBGIC_String8 location_data_str = str8_list_join(arena, &location_data, 0); + RADDBGIC_String8 location_data_str = raddbgic_str8_list_join(arena, &location_data, raddbgic_str8_lit("")); // scope vmap RADDBGIC_VMap *scope_vmap = 0; @@ -3105,8 +3181,6 @@ raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGI result->location_data_size = location_data_str.size; raddbgic_scratch_end(scratch); - ProfEnd(); - return result; } @@ -3203,7 +3277,6 @@ raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_Bake RADDBGI_PROC void raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8List *out) { - ProfBeginFunction(); str8_serial_begin(arena, out); // setup cons helpers @@ -3597,5 +3670,4 @@ raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8L } raddbgic_bake_ctx_release(bctx); - ProfEnd(); } diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/raddbgi_cons/raddbgi_cons.h index 0faf21ed..5c35fe62 100644 --- a/src/raddbgi_cons/raddbgi_cons.h +++ b/src/raddbgi_cons/raddbgi_cons.h @@ -31,6 +31,14 @@ # define raddbgic_memcpy raddbgic_memcpy_fallback #endif +//////////////////////////////// +//~ rjf: Overrideable sprintf Functions + +#if !defined(raddbgic_vsnprintf) +# include +# define raddbgic_vsnprintf vsnprintf +#endif + //////////////////////////////// //~ rjf: Overrideable String View Types @@ -41,18 +49,34 @@ // #define RADDBGIC_String8_BaseMember // #define RADDBGIC_String8_SizeMember +// To override the string view list type used by the library, do the following: +// +// #define RADDBGIC_STRING8LIST_OVERRIDE +// #define RADDBGIC_String8Node +// #define RADDBGIC_String8_NextPtrMember +// #define RADDBGIC_String8_StringMember +// #define RADDBGIC_String8List +// #define RADDBGIC_String8_FirstMember +// #define RADDBGIC_String8_LastMember +// #define RADDBGIC_String8_NodeCount +// #define RADDBGIC_String8_TotalSizeMember + #if !defined(RADDBGIC_String8) +#define RADDBGIC_String8 RADDBGIC_String8 #define RADDBGIC_String8_BaseMember str #define RADDBGIC_String8_SizeMember size typedef struct RADDBGIC_String8 RADDBGIC_String8; struct RADDBGIC_String8 { - RADDBGI_U8 *RADDBGIC_String8_BaseMember; - RADDBGI_U64 RADDBGIC_String8_SizeMember; + RADDBGI_U8 *str; + RADDBGI_U64 size; }; #endif #if !defined(RADDBGIC_String8Node) +#define RADDBGIC_String8Node RADDBGIC_String8Node +#define RADDBGIC_String8Node_NextPtrMember next +#define RADDBGIC_String8Node_StringMember string typedef struct RADDBGIC_String8Node RADDBGIC_String8Node; struct RADDBGIC_String8Node { @@ -62,6 +86,11 @@ struct RADDBGIC_String8Node #endif #if !defined(RADDBGIC_String8List) +#define RADDBGIC_String8List RADDBGIC_String8List +#define RADDBGIC_String8List_FirstMember first +#define RADDBGIC_String8List_LastMember last +#define RADDBGIC_String8List_NodeCountMember node_count +#define RADDBGIC_String8List_TotalSizeMember total_size typedef struct RADDBGIC_String8List RADDBGIC_String8List; struct RADDBGIC_String8List { @@ -72,6 +101,12 @@ struct RADDBGIC_String8List }; #endif +typedef RADDBGI_U32 RADDBGIC_StringMatchFlags; +enum +{ + RADDBGIC_StringMatchFlag_CaseInsensitive = (1<<0), +}; + //////////////////////////////// //~ rjf: Overrideable Arena Allocator Types @@ -1081,7 +1116,15 @@ RADDBGI_PROC void raddbgic_scratch_end_fallback(RADDBGIC_Temp temp); //- rjf: strings RADDBGI_PROC RADDBGIC_String8 raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size); RADDBGI_PROC RADDBGIC_String8 raddbgic_str8_copy(RADDBGIC_Arena *arena, RADDBGIC_String8 src); -#define raddbgic_str8_lit(S) raddbgic_str8((RADDBGI_U8*)(S), sizeof(S) - 1) +RADDBGI_PROC RADDBGIC_String8 raddbgic_str8f(RADDBGIC_Arena *arena, char *fmt, ...); +RADDBGI_PROC RADDBGIC_String8 raddbgic_str8fv(RADDBGIC_Arena *arena, char *fmt, va_list args); +RADDBGI_PROC RADDBGI_S32 raddbgic_str8_match(RADDBGIC_String8 a, RADDBGIC_String8 b, RADDBGIC_StringMatchFlags flags); +#define raddbgic_str8_lit(S) raddbgic_str8((RADDBGI_U8*)(S), sizeof(S) - 1) +#define raddbgic_str8_struct(S) raddbgic_str8((RADDBGI_U8*)(S), sizeof(*(S))) + +//- rjf: string lists +RADDBGI_PROC void raddbgic_str8_list_push(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDBGIC_String8 string); +RADDBGI_PROC RADDBGIC_String8 raddbgic_str8_list_join(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDBGIC_String8 sep); //- rjf: type lists RADDBGI_PROC void raddbgic_type_list_push(RADDBGIC_Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type); diff --git a/src/raddbgi_cons/raddbgi_cons_local.h b/src/raddbgi_cons/raddbgi_cons_local.h index 81c22f44..ad8971a4 100644 --- a/src/raddbgi_cons/raddbgi_cons_local.h +++ b/src/raddbgi_cons/raddbgi_cons_local.h @@ -15,8 +15,15 @@ #define RADDBGIC_String8 String8 #define RADDBGIC_String8_BaseMember str #define RADDBGIC_String8_SizeMember size +#define RADDBGI_STRING8LIST_OVERRIDE #define RADDBGIC_String8Node String8Node +#define RADDBGIC_String8Node_NextPtrMember next +#define RADDBGIC_String8Node_StringMember string #define RADDBGIC_String8List String8List +#define RADDBGIC_String8List_FirstMember first +#define RADDBGIC_String8List_LastMember last +#define RADDBGIC_String8List_NodeCountMember node_count +#define RADDBGIC_String8List_TotalSizeMember total_size // rjf: base layer arena overrides #define RADDBGIC_ARENA_OVERRIDE From 017116aee98febc4477e12d7c248459bddef7ab3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 09:27:52 -0800 Subject: [PATCH 043/275] formalize codebase's library exports; document in README --- README.md | 50 ++++++++++++------- .../raddbg_markup.h | 0 .../raddbgi_cons.c | 0 .../raddbgi_cons.h | 0 .../raddbgi_format.c | 0 .../raddbgi_format.h | 0 .../raddbgi_format_parse.c | 0 .../raddbgi_format_parse.h | 0 src/raddbg/raddbg_main.cpp | 12 ++--- .../raddbgi_cons_local.c | 2 +- .../raddbgi_cons_local.h | 2 +- .../pdb/raddbgi_from_pdb_main.c | 8 +-- .../raddbgi_stringize.c | 0 .../raddbgi_stringize.h | 6 --- 14 files changed, 44 insertions(+), 36 deletions(-) rename src/{raddbg_markup => lib_raddbg_markup}/raddbg_markup.h (100%) rename src/{raddbgi_cons => lib_raddbgi_cons}/raddbgi_cons.c (100%) rename src/{raddbgi_cons => lib_raddbgi_cons}/raddbgi_cons.h (100%) rename src/{raddbgi_format => lib_raddbgi_format}/raddbgi_format.c (100%) rename src/{raddbgi_format => lib_raddbgi_format}/raddbgi_format.h (100%) rename src/{raddbgi_format => lib_raddbgi_format}/raddbgi_format_parse.c (100%) rename src/{raddbgi_format => lib_raddbgi_format}/raddbgi_format_parse.h (100%) rename src/{raddbgi_cons => raddbgi_cons_local}/raddbgi_cons_local.c (72%) rename src/{raddbgi_cons => raddbgi_cons_local}/raddbgi_cons_local.h (97%) rename src/{raddbgi_stringize => raddbgi_dump}/raddbgi_stringize.c (100%) rename src/{raddbgi_stringize => raddbgi_dump}/raddbgi_stringize.h (92%) diff --git a/README.md b/README.md index 64d8dbb0..48f71017 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # The RAD Debugger Project +_**Note:** This README does not document usage instructions and tips for the +debugger itself, and is intended as a technical overview of the project. The +debugger's README, which includes usage instructions and tips, can be found +packaged along with debugger releases, or within the `build` folder after a +local copy has been built._ + The RAD Debugger is a native, user-mode, multi-process, graphical debugger. It currently only supports local-machine Windows x64 debugging with PDBs, with plans to expand and port in the future. In the future we'll expand to also @@ -24,15 +30,16 @@ simply deserialize the PDBs). It is much slower for much larger projects at the moment, but we expect this will vastly improve overtime. The RADDBGI format is currently specified in code, in the files within the -`src/raddbgi_format` folder. The other relevant folders for working with the -format are: +`src/lib_raddbgi_format` folder. The other relevant folders for working with +the format are: -- `raddbgi_cons`: The RADDBGI construction layer, for making RADDBGI debug -info. -- `raddbgi_convert`: Our implementation of PDB-to-RADDBGI (and an in-progress -implementation of a DWARF-to-RADDBGI) conversion. -- `raddbgi_stringize`: Code for converting binary RADDBGI info into text. -- `raddbgi_dump`: Code for textually dumping information from RADDBGI files. +- `lib_raddbgi_cons`: The RADDBGI construction library, for making RADDBGI +debug info. +- `raddbgi_convert`: Our legacy-debug-info-to-RADDBGI converters. Right now +this includes a working PDB-to-RADDBGI converter, and an in-progress DWARF-to- +RADDBGI converter. These converters can be built both as helper codebase layers +or with a command line interface frontend. +- `raddbgi_dump`: Our RADDBGI textual dumping utility. ## Development Setup Instructions @@ -208,6 +215,11 @@ Layers depend on other layers, but circular dependencies would break the separability and isolation utility of layers (in effect, forming one big layer), so in other words, layers are arranged into a directed acyclic graph. +A few layers are built to be used completely independently from the rest of the +codebase, as libraries in other codebases and projects. As such, these layers do +not depend on any other layers in the codebase. The folders which contain these +layers are prefixed with `lib_`, like `lib_raddbgi_format`. + A list of the layers in the codebase and their associated namespaces is below: - `base` (no namespace): Universal, codebase-wide constructs. Strings, math, memory allocators, helper macros, command-line parsing, and so on. Depends @@ -258,6 +270,16 @@ A list of the layers in the codebase and their associated namespaces is below: for asynchronously preparing data for memory visualization in the debugger. - `hash_store` (`HS_`): Implements a cache for general data blobs, keyed by a 128-bit hash of the data. Used as a general data store by other layers. +- `lib_raddbg_markup` (`RADDBG_`): Standalone library for marking up user + programs to work with various features in the `raddbg` debugger. Does not + depend on `base`, and can be independently relocated to other codebases. +- `lib_raddbgi_cons` (`RADDBGIC_`): Standalone library for constructing RADDBGI + debug info data. Does not depend on `base`, and can be independently relocated + to other codebases. +- `lib_raddbgi_format` (`RADDBGI_`): Standalone library for defining the core + RADDBGI types and helper functions for reading and writing the RADDBGI debug + info file format. Does not depend on `base`, and can be independently + relocated to other codebases. - `metagen` (`MG_`): A metaprogram which is used to generate primarily code and data tables. Consumes Metadesk files, stored with the extension `.mdesk`, and generates C code which is then included by hand-written C code. Currently, it @@ -290,18 +312,10 @@ A list of the layers in the codebase and their associated namespaces is below: - `raddbg` (no namespace): The layer which ties everything together for the main graphical debugger. Not much "meat", just drives `df`, implements command line options, and so on. -- `raddbg_markup` (`RADDBG_`): Standalone header file for marking up user - programs to work with various features in the `raddbg` debugger. Does not - depend on `base`. -- `raddbgi_cons` (`RADDBGIC_`): Implements an API for constructing files of the - RADDBGI debug info file format. +- `raddbgi_convert` (`PDBCONV_`): Our implementation of PDB-to-RADDBGI and + DWARF-to-RADDBGI conversion. - `raddbgi_dump` (`RADDBGIDUMP_`): A dumper utility program for dumping textualizations of RADDBGI debug info files. -- `raddbgi_format` (`RADDBGI_`): Standalone types and helper functions for the - RADDBGI debug info file format. Does not depend on `base`. -- `raddbgi_stringize` (`RADDBGI_`): Code to stringify binary RADDBGI info, for - visualizing textualizations of RADDBGI debug info. Used in `raddbgi_dump`, - and depends on `base`. - `regs` (`REGS_`): Types, helper functions, and metadata for registers on supported architectures. Used in reading/writing registers in `demon`, or in looking up register metadata. diff --git a/src/raddbg_markup/raddbg_markup.h b/src/lib_raddbg_markup/raddbg_markup.h similarity index 100% rename from src/raddbg_markup/raddbg_markup.h rename to src/lib_raddbg_markup/raddbg_markup.h diff --git a/src/raddbgi_cons/raddbgi_cons.c b/src/lib_raddbgi_cons/raddbgi_cons.c similarity index 100% rename from src/raddbgi_cons/raddbgi_cons.c rename to src/lib_raddbgi_cons/raddbgi_cons.c diff --git a/src/raddbgi_cons/raddbgi_cons.h b/src/lib_raddbgi_cons/raddbgi_cons.h similarity index 100% rename from src/raddbgi_cons/raddbgi_cons.h rename to src/lib_raddbgi_cons/raddbgi_cons.h diff --git a/src/raddbgi_format/raddbgi_format.c b/src/lib_raddbgi_format/raddbgi_format.c similarity index 100% rename from src/raddbgi_format/raddbgi_format.c rename to src/lib_raddbgi_format/raddbgi_format.c diff --git a/src/raddbgi_format/raddbgi_format.h b/src/lib_raddbgi_format/raddbgi_format.h similarity index 100% rename from src/raddbgi_format/raddbgi_format.h rename to src/lib_raddbgi_format/raddbgi_format.h diff --git a/src/raddbgi_format/raddbgi_format_parse.c b/src/lib_raddbgi_format/raddbgi_format_parse.c similarity index 100% rename from src/raddbgi_format/raddbgi_format_parse.c rename to src/lib_raddbgi_format/raddbgi_format_parse.c diff --git a/src/raddbgi_format/raddbgi_format_parse.h b/src/lib_raddbgi_format/raddbgi_format_parse.h similarity index 100% rename from src/raddbgi_format/raddbgi_format_parse.h rename to src/lib_raddbgi_format/raddbgi_format_parse.h diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 49300df1..681c22c5 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -5,6 +5,8 @@ //~ rjf: Includes //- rjf: [h] +#include "lib_raddbgi_format/raddbgi_format.h" +#include "lib_raddbgi_format/raddbgi_format_parse.h" #include "base/base_inc.h" #include "os/os_inc.h" #include "mdesk/mdesk.h" @@ -15,9 +17,7 @@ #include "txti/txti.h" #include "coff/coff.h" #include "pe/pe.h" -#include "raddbgi_format/raddbgi_format.h" -#include "raddbgi_format/raddbgi_format_parse.h" -#include "raddbgi_cons/raddbgi_cons_local.h" +#include "raddbgi_cons_local/raddbgi_cons_local.h" #include "raddbgi_convert/pdb/raddbgi_coff.h" #include "raddbgi_convert/pdb/raddbgi_codeview.h" #include "raddbgi_convert/pdb/raddbgi_msf.h" @@ -47,6 +47,8 @@ #include "raddbg.h" //- rjf: [c] +#include "lib_raddbgi_format/raddbgi_format.c" +#include "lib_raddbgi_format/raddbgi_format_parse.c" #include "base/base_inc.c" #include "os/os_inc.c" #include "mdesk/mdesk.c" @@ -57,9 +59,7 @@ #include "txti/txti.c" #include "coff/coff.c" #include "pe/pe.c" -#include "raddbgi_format/raddbgi_format.c" -#include "raddbgi_format/raddbgi_format_parse.c" -#include "raddbgi_cons/raddbgi_cons_local.c" +#include "raddbgi_cons_local/raddbgi_cons_local.c" #include "raddbgi_convert/pdb/raddbgi_msf.c" #include "raddbgi_convert/pdb/raddbgi_codeview.c" #include "raddbgi_convert/pdb/raddbgi_pdb.c" diff --git a/src/raddbgi_cons/raddbgi_cons_local.c b/src/raddbgi_cons_local/raddbgi_cons_local.c similarity index 72% rename from src/raddbgi_cons/raddbgi_cons_local.c rename to src/raddbgi_cons_local/raddbgi_cons_local.c index 18e07f38..59334e1d 100644 --- a/src/raddbgi_cons/raddbgi_cons_local.c +++ b/src/raddbgi_cons_local/raddbgi_cons_local.c @@ -1,4 +1,4 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#include "raddbgi_cons.c" +#include "lib_raddbgi_cons/raddbgi_cons.c" diff --git a/src/raddbgi_cons/raddbgi_cons_local.h b/src/raddbgi_cons_local/raddbgi_cons_local.h similarity index 97% rename from src/raddbgi_cons/raddbgi_cons_local.h rename to src/raddbgi_cons_local/raddbgi_cons_local.h index ad8971a4..3b37a7b7 100644 --- a/src/raddbgi_cons/raddbgi_cons_local.h +++ b/src/raddbgi_cons_local/raddbgi_cons_local.h @@ -41,6 +41,6 @@ #define raddbgic_scratch_begin scratch_begin #define raddbgic_scratch_end scratch_end -#include "raddbgi_cons.h" +#include "lib_raddbgi_cons/raddbgi_cons.h" #endif // RADDBGI_CONS_LOCAL_H diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c index 54dca6b7..e0a3db0c 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c @@ -1,11 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +#include "lib_raddbgi_format/raddbgi_format.h" #include "base/base_inc.h" #include "os/os_inc.h" #include "coff/coff.h" -#include "raddbgi_format/raddbgi_format.h" -#include "raddbgi_cons/raddbgi_cons_local.h" +#include "raddbgi_cons_local/raddbgi_cons_local.h" #include "raddbgi_coff.h" #include "raddbgi_codeview.h" @@ -19,11 +19,11 @@ #include "raddbgi_from_pdb.h" +#include "lib_raddbgi_format/raddbgi_format.c" #include "base/base_inc.c" #include "coff/coff.c" #include "os/os_inc.c" -#include "raddbgi_format/raddbgi_format.c" -#include "raddbgi_cons/raddbgi_cons_local.c" +#include "raddbgi_cons_local/raddbgi_cons_local.c" #include "raddbgi_msf.c" #include "raddbgi_codeview.c" diff --git a/src/raddbgi_stringize/raddbgi_stringize.c b/src/raddbgi_dump/raddbgi_stringize.c similarity index 100% rename from src/raddbgi_stringize/raddbgi_stringize.c rename to src/raddbgi_dump/raddbgi_stringize.c diff --git a/src/raddbgi_stringize/raddbgi_stringize.h b/src/raddbgi_dump/raddbgi_stringize.h similarity index 92% rename from src/raddbgi_stringize/raddbgi_stringize.h rename to src/raddbgi_dump/raddbgi_stringize.h index f1064c6e..e74d3a86 100644 --- a/src/raddbgi_stringize/raddbgi_stringize.h +++ b/src/raddbgi_dump/raddbgi_stringize.h @@ -4,12 +4,6 @@ #ifndef RADDBGI_STRINGIZE_H #define RADDBGI_STRINGIZE_H -// TODO(allen): this depends on types from our base layer. -// we need to decide if we want this to be included in the "format" layer -// and therefore lifted off of the base layer, or if we want to put it in -// "base" or "dump" layers or something like that so that it can -// rely on Arena, String8, and String8List from the "base" layer. - //////////////////////////////// //~ RADDBG Stringize Helper Types From 7defce94c7f4e49d21a559ec104dba8e264e8300 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 09:51:50 -0800 Subject: [PATCH 044/275] float codeview, msf, pdb layers up as regular codebase layers, and out of converter-specific code; clangify some builds --- .../codeview.c} | 124 +++++++++--------- .../codeview.h} | 42 +++--- .../codeview_stringize.c} | 54 ++++---- src/codeview/codeview_stringize.h | 86 ++++++++++++ src/coff/coff.h | 10 ++ src/demon/demon_accel.c | 47 +------ src/demon/demon_accel.h | 2 - src/demon/demon_common.c | 1 + src/demon/win32/demon_os_win32.c | 25 ++-- .../pdb/raddbgi_msf.c => msf/msf.c} | 4 +- .../pdb/raddbgi_msf.h => msf/msf.h} | 10 +- src/mule/mule_main.cpp | 2 +- .../pdb/raddbgi_pdb.c => pdb/pdb.c} | 38 +++--- .../pdb/raddbgi_pdb.h => pdb/pdb.h} | 78 +++++------ .../pdb_stringize.c} | 2 +- src/pdb/pdb_stringize.h | 12 ++ src/raddbg/raddbg_main.cpp | 33 ++--- .../dwarf/raddbgi_from_dwarf.c | 8 +- .../pdb/raddbgi_codeview_stringize.h | 86 ------------ src/raddbgi_convert/pdb/raddbgi_coff.h | 52 -------- .../pdb/raddbgi_coff_conversion.h | 3 +- .../pdb/raddbgi_from_pdb_main.c | 30 ++--- .../pdb/raddbgi_pdb_stringize.h | 12 -- src/raddbgi_dump/raddbgi_dump.c | 14 +- src/scratch/ryan_scratch.c | 12 +- 25 files changed, 359 insertions(+), 428 deletions(-) rename src/{raddbgi_convert/pdb/raddbgi_codeview.c => codeview/codeview.c} (97%) rename src/{raddbgi_convert/pdb/raddbgi_codeview.h => codeview/codeview.h} (98%) rename src/{raddbgi_convert/pdb/raddbgi_codeview_stringize.c => codeview/codeview_stringize.c} (99%) create mode 100644 src/codeview/codeview_stringize.h rename src/{raddbgi_convert/pdb/raddbgi_msf.c => msf/msf.c} (99%) rename src/{raddbgi_convert/pdb/raddbgi_msf.h => msf/msf.h} (84%) rename src/{raddbgi_convert/pdb/raddbgi_pdb.c => pdb/pdb.c} (98%) rename src/{raddbgi_convert/pdb/raddbgi_pdb.h => pdb/pdb.h} (76%) rename src/{raddbgi_convert/pdb/raddbgi_pdb_stringize.c => pdb/pdb_stringize.c} (98%) create mode 100644 src/pdb/pdb_stringize.h delete mode 100644 src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h delete mode 100644 src/raddbgi_convert/pdb/raddbgi_coff.h delete mode 100644 src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview.c b/src/codeview/codeview.c similarity index 97% rename from src/raddbgi_convert/pdb/raddbgi_codeview.c rename to src/codeview/codeview.c index 83ee6e44..e7425434 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview.c +++ b/src/codeview/codeview.c @@ -4,7 +4,7 @@ //////////////////////////////// //~ CodeView Common Functions -static CV_NumericParsed +internal CV_NumericParsed cv_numeric_from_data_range(U8 *first, U8 *opl){ CV_NumericParsed result = {0}; if (first + 2 <= opl){ @@ -52,7 +52,7 @@ cv_numeric_from_data_range(U8 *first, U8 *opl){ return(result); } -static B32 +internal B32 cv_numeric_fits_in_u64(CV_NumericParsed *num){ B32 result = 0; switch (num->kind){ @@ -66,7 +66,7 @@ cv_numeric_fits_in_u64(CV_NumericParsed *num){ return(result); } -static B32 +internal B32 cv_numeric_fits_in_s64(CV_NumericParsed *num){ B32 result = 0; switch (num->kind){ @@ -81,7 +81,7 @@ cv_numeric_fits_in_s64(CV_NumericParsed *num){ return(result); } -static B32 +internal B32 cv_numeric_fits_in_f64(CV_NumericParsed *num){ B32 result = 0; switch (num->kind){ @@ -94,7 +94,7 @@ cv_numeric_fits_in_f64(CV_NumericParsed *num){ return(result); } -static U64 +internal U64 cv_u64_from_numeric(CV_NumericParsed *num){ U64 result = 0; switch (num->kind){ @@ -116,7 +116,7 @@ cv_u64_from_numeric(CV_NumericParsed *num){ return(result); } -static S64 +internal S64 cv_s64_from_numeric(CV_NumericParsed *num){ S64 result = 0; switch (num->kind){ @@ -143,7 +143,7 @@ cv_s64_from_numeric(CV_NumericParsed *num){ return(result); } -static F64 +internal F64 cv_f64_from_numeric(CV_NumericParsed *num){ F64 result = 0; switch (num->kind){ @@ -164,54 +164,9 @@ cv_f64_from_numeric(CV_NumericParsed *num){ //////////////////////////////// //~ CodeView Sym Parser Functions -static 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); -} +//- the first pass parser -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* +internal CV_RecRangeStream* cv_rec_range_stream_from_data(Arena *arena, String8 sym_data, U64 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); } -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_RecRangeArray *ranges, 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 -static CV_RecRangeChunk* +internal CV_RecRangeChunk* cv_rec_range_stream_push_chunk(Arena *arena, CV_RecRangeStream *stream){ CV_RecRangeChunk *result = push_array_no_zero(arena, CV_RecRangeChunk, 1); SLLQueuePush(stream->first_chunk, stream->last_chunk, result); return(result); } -static CV_RecRangeArray +internal CV_RecRangeArray cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream){ U64 total_count = stream->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 -static CV_C13Parsed* -cv_c13_from_data(Arena *arena, String8 c13_data, - PDB_Strtbl *strtbl, PDB_CoffSectionArray *sections){ +internal CV_C13Parsed* +cv_c13_from_data(Arena *arena, String8 c13_data, PDB_Strtbl *strtbl, PDB_CoffSectionArray *sections){ ProfBegin("cv_c13_from_data"); // gather c13 data diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview.h b/src/codeview/codeview.h similarity index 98% rename from src/raddbgi_convert/pdb/raddbgi_codeview.h rename to src/codeview/codeview.h index 35f989f9..8d206d82 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview.h +++ b/src/codeview/codeview.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_CODEVIEW_H -#define RADDBGI_CODEVIEW_H +#ifndef CODEVIEW_H +#define CODEVIEW_H #pragma pack(push, 1) @@ -3015,46 +3015,44 @@ typedef struct CV_TypeIdArray{ //////////////////////////////// //~ 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); -static 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_u64(CV_NumericParsed *num); +internal B32 cv_numeric_fits_in_s64(CV_NumericParsed *num); +internal B32 cv_numeric_fits_in_f64(CV_NumericParsed *num); -static U64 cv_u64_from_numeric(CV_NumericParsed *num); -static S64 cv_s64_from_numeric(CV_NumericParsed *num); -static F64 cv_f64_from_numeric(CV_NumericParsed *num); +internal U64 cv_u64_from_numeric(CV_NumericParsed *num); +internal S64 cv_s64_from_numeric(CV_NumericParsed *num); +internal F64 cv_f64_from_numeric(CV_NumericParsed *num); //////////////////////////////// //~ CodeView Sym/Leaf Parser Functions //- 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 -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, - CV_RecRangeArray *ranges, - CV_SymTopLevelInfo *info_out); +internal void cv_sym_top_level_info_from_syms(Arena *arena, String8 sym_data, + CV_RecRangeArray *ranges, + CV_SymTopLevelInfo *info_out); //- 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 -static CV_RecRangeChunk* cv_rec_range_stream_push_chunk(Arena *arena, - CV_RecRangeStream *stream); +internal CV_RecRangeChunk* cv_rec_range_stream_push_chunk(Arena *arena, + CV_RecRangeStream *stream); // TODO(allen): check why this isn't a 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, - CV_RecRangeStream *stream); +internal CV_RecRangeArray cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream); //////////////////////////////// //~ CodeView C13 Parser Functions typedef struct PDB_Strtbl PDB_Strtbl; typedef struct PDB_CoffSectionArray PDB_CoffSectionArray; -static CV_C13Parsed* cv_c13_from_data(Arena *arena, String8 c13_data, - struct PDB_Strtbl *strtbl, struct PDB_CoffSectionArray *sections); +internal CV_C13Parsed* cv_c13_from_data(Arena *arena, String8 c13_data, struct PDB_Strtbl *strtbl, struct PDB_CoffSectionArray *sections); -#endif //RADDBGI_CODEVIEW_H +#endif // CODEVIEW_H diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.c b/src/codeview/codeview_stringize.c similarity index 99% rename from src/raddbgi_convert/pdb/raddbgi_codeview_stringize.c rename to src/codeview/codeview_stringize.c index b8729609..70ee4628 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.c +++ b/src/codeview/codeview_stringize.c @@ -4,7 +4,7 @@ //////////////////////////////// //~ CodeView Common Stringize Functions -static void +internal void cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num){ String8 numeric_kind_str = cv_string_from_numeric_kind(num->kind); 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){ 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){ 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){ U64 gap_count = ((U8*)first - (U8*)opl)/sizeof(CV_LvarAddrGap); 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){ String8 result = str8_lit("UNRECOGNIZED_SYM_KIND"); switch (kind){ @@ -59,7 +59,7 @@ cv_string_from_sym_kind(CV_SymKind kind){ return(result); } -static String8 +internal String8 cv_string_from_basic_type(CV_BasicType basic_type){ String8 result = str8_lit("UNRECOGNIZED_BASIC_TYPE"); switch (basic_type){ @@ -70,7 +70,7 @@ cv_string_from_basic_type(CV_BasicType basic_type){ return(result); } -static String8 +internal String8 cv_string_from_leaf_kind(CV_LeafKind kind){ String8 result = str8_lit("UNRECOGNIZED_LEAF_KIND"); switch (kind){ @@ -85,7 +85,7 @@ cv_string_from_leaf_kind(CV_LeafKind kind){ return(result); } -static String8 +internal String8 cv_string_from_numeric_kind(CV_NumericKind kind){ String8 result = str8_lit("UNRECOGNIZED_NUMERIC_KIND"); switch (kind){ @@ -97,7 +97,7 @@ cv_string_from_numeric_kind(CV_NumericKind kind){ return(result); } -static String8 +internal String8 cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind){ String8 result = str8_lit("UNRECOGNIZED_C13_SUB_SECTION_KIND"); switch (kind){ @@ -109,7 +109,7 @@ cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind){ return(result); } -static String8 +internal String8 cv_string_from_machine(CV_Arch arch){ String8 result = {0}; switch (arch){ @@ -120,7 +120,7 @@ cv_string_from_machine(CV_Arch arch){ return(result); } -static String8 +internal String8 cv_string_from_reg(CV_Arch arch, CV_Reg reg){ String8 result = {0}; switch (arch){ @@ -147,7 +147,7 @@ cv_string_from_reg(CV_Arch arch, CV_Reg reg){ return(result); } -static String8 +internal String8 cv_string_from_pointer_kind(CV_PointerKind ptr_kind){ String8 result = {0}; switch (ptr_kind){ @@ -169,7 +169,7 @@ cv_string_from_pointer_kind(CV_PointerKind ptr_kind){ return(result); } -static String8 +internal String8 cv_string_from_pointer_mode(CV_PointerMode ptr_mode){ String8 result = {0}; switch (ptr_mode){ @@ -183,7 +183,7 @@ cv_string_from_pointer_mode(CV_PointerMode ptr_mode){ return(result); } -static String8 +internal String8 cv_string_from_hfa_kind(CV_HFAKind hfa_kind){ String8 result = {0}; switch (hfa_kind){ @@ -196,7 +196,7 @@ cv_string_from_hfa_kind(CV_HFAKind hfa_kind){ return(result); } -static String8 +internal String8 cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind){ String8 result = {0}; 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 -static char cv_stringize_spaces[] = " "; +global char cv_stringize_spaces[] = " "; #define SPACES cv_stringize_spaces -static void +internal void cv_stringize_modifier_flags(Arena *arena, String8List *out, U32 indent, CV_ModifierFlags flags){ 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, U32 indent, CV_TypeProps props){ 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, U32 indent, CV_PointerAttribs attribs){ if (attribs & CV_PointerAttrib_IsFlat){ @@ -332,7 +332,7 @@ cv_stringize_pointer_attribs(Arena *arena, String8List *out, indent, SPACES, size); } -static void +internal void cv_stringize_local_flags(Arena *arena, String8List *out, U32 indent, CV_LocalFlags flags){ if (flags & CV_LocalFlag_Param){ @@ -376,7 +376,7 @@ cv_stringize_local_flags(Arena *arena, String8List *out, //////////////////////////////// //~ CodeView Sym Stringize Functions -static void +internal void cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym){ CV_StringizeSymParams params = {0}; 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, ¶ms); } -static void +internal void cv_stringize_sym_range(Arena *arena, String8List *out, CV_RecRange *range, String8 data, 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_RecRangeArray *ranges, String8 data, CV_StringizeSymParams *p){ @@ -1396,7 +1396,7 @@ cv_stringize_sym_array(Arena *arena, String8List *out, //////////////////////////////// //~ CodeView Leaf Stringize Functions -static void +internal void cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf){ CV_StringizeLeafParams params = {0}; @@ -1404,7 +1404,7 @@ cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf){ leaf->data, ¶ms); } -static void +internal void cv_stringize_leaf_range(Arena *arena, String8List *out, CV_RecRange *range, CV_TypeId itype, String8 data, 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_RecRangeArray *ranges, CV_TypeId itype_first, String8 data, CV_StringizeLeafParams *p){ @@ -2328,7 +2328,7 @@ cv_stringize_leaf_array(Arena *arena, String8List *out, //////////////////////////////// //~ CodeView C13 Stringize Functions -static void +internal void cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13){ for(CV_C13SubSectionNode *node = c13->first_sub_section; node != 0; diff --git a/src/codeview/codeview_stringize.h b/src/codeview/codeview_stringize.h new file mode 100644 index 00000000..4e3d3ce3 --- /dev/null +++ b/src/codeview/codeview_stringize.h @@ -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 diff --git a/src/coff/coff.h b/src/coff/coff.h index 6563a4b0..abe1efa2 100644 --- a/src/coff/coff.h +++ b/src/coff/coff.h @@ -11,6 +11,16 @@ typedef U32 COFF_TimeStamp; #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; enum { diff --git a/src/demon/demon_accel.c b/src/demon/demon_accel.c index c9b9ede4..156fb9f1 100644 --- a/src/demon/demon_accel.c +++ b/src/demon/demon_accel.c @@ -158,57 +158,24 @@ demon_accel_write_regs(DEMON_Entity *thread, void *data){ // get accel data DEMON_AccelThread *accel = demon_accel_from_thread(thread); - // low level write - B32 success = 0; - U64 data_size = 0; - 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; - } + // write + U64 data_size = regs_block_size_from_architecture(thread->arch); + B32 success = demon_os_write_regs(thread, data); // update cache - if (success){ + if(success) + { accel->reg_cache_time = demon_time; 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 internal void demon_accel_free(DEMON_Entity *entity){ switch (entity->kind){ + default:{}break; + case DEMON_EntityKind_Module: { if (entity->accel != 0){ diff --git a/src/demon/demon_accel.h b/src/demon/demon_accel.h index 863f028d..0b6f8288 100644 --- a/src/demon/demon_accel.h +++ b/src/demon/demon_accel.h @@ -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_write_regs(DEMON_Entity *thread, void *data); -internal void demon_accel_low_level_write_regs(DEMON_Entity *thread); - //- entity accel free internal void demon_accel_free(DEMON_Entity *entity); diff --git a/src/demon/demon_common.c b/src/demon/demon_common.c index 15e7df8a..1ae895d0 100644 --- a/src/demon/demon_common.c +++ b/src/demon/demon_common.c @@ -134,6 +134,7 @@ demon_ent_new(DEMON_Entity *parent, DEMON_EntityKind kind, U64 id){ internal void demon_ent_release_single(DEMON_Entity *entity){ switch (entity->kind){ + default:{}break; case DEMON_EntityKind_Process: demon_proc_count -= 1; break; case DEMON_EntityKind_Thread: demon_thread_count -= 1; break; case DEMON_EntityKind_Module: demon_module_count -= 1; break; diff --git a/src/demon/win32/demon_os_win32.c b/src/demon/win32/demon_os_win32.c index 435d13ee..a27f816d 100644 --- a/src/demon/win32/demon_os_win32.c +++ b/src/demon/win32/demon_os_win32.c @@ -460,7 +460,9 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){ // set single step bit if (single_step_thread != 0){ // TODO(allen): possibly buggy - switch (single_step_thread->arch){ + switch(single_step_thread->arch) + { + default:{NotImplemented;}break; case Architecture_x86: { 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. if (single_step_thread != 0){ // TODO(allen): possibly buggy - switch (single_step_thread->arch){ + switch(single_step_thread->arch) + { + default:{NotImplemented;}break; case Architecture_x86: { REGS_RegBlockX86 regs = {0}; @@ -1585,34 +1589,37 @@ demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){ } 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_W32_Ext *thread_ext = demon_w32_ext(thread); U64 tlb = thread_ext->thread.thread_local_base; - U64 result = 0; - switch (thread->arch){ + switch (thread->arch) + { + default:{NotImplemented;}break; case Architecture_x64: { U64 stack_base_addr = tlb + 0x8; demon_os_read_memory(process, &result, stack_base_addr, 8); }break; - case Architecture_x86: { U64 stack_base_addr = tlb + 0x4; demon_os_read_memory(process, &result, stack_base_addr, 4); }break; } - return(result); } 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); U64 result = thread_ext->thread.thread_local_base; - switch (thread->arch){ + switch(thread->arch) + { + default:{NotImplemented;}break; case Architecture_x64: { result += 88; diff --git a/src/raddbgi_convert/pdb/raddbgi_msf.c b/src/msf/msf.c similarity index 99% rename from src/raddbgi_convert/pdb/raddbgi_msf.c rename to src/msf/msf.c index 39b01999..f228998e 100644 --- a/src/raddbgi_convert/pdb/raddbgi_msf.c +++ b/src/msf/msf.c @@ -4,7 +4,7 @@ //////////////////////////////// //~ MSF Parser Function -static MSF_Parsed* +internal MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data){ ProfBegin("msf_parsed_from_data"); @@ -274,7 +274,7 @@ msf_parsed_from_data(Arena *arena, String8 msf_data){ return(result); } -static String8 +internal String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn){ String8 result = {0}; if (sn < msf->stream_count){ diff --git a/src/raddbgi_convert/pdb/raddbgi_msf.h b/src/msf/msf.h similarity index 84% rename from src/raddbgi_convert/pdb/raddbgi_msf.h rename to src/msf/msf.h index 4b55f4a6..7184e195 100644 --- a/src/raddbgi_convert/pdb/raddbgi_msf.h +++ b/src/msf/msf.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_MSF_H -#define RADDBGI_MSF_H +#ifndef MSF_H +#define MSF_H //////////////////////////////// //~ MSF Format Types @@ -54,7 +54,7 @@ typedef struct MSF_Parsed{ //////////////////////////////// //~ MSF Parser Function -static MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data); -static String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn); +internal MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data); +internal String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn); -#endif //RADDBGI_MSF_H +#endif // MSF_H diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 87f6c7ef..bcb62a42 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -6,7 +6,7 @@ ** 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 diff --git a/src/raddbgi_convert/pdb/raddbgi_pdb.c b/src/pdb/pdb.c similarity index 98% rename from src/raddbgi_convert/pdb/raddbgi_pdb.c rename to src/pdb/pdb.c index cfe90e6a..f0f2eb2b 100644 --- a/src/raddbgi_convert/pdb/raddbgi_pdb.c +++ b/src/pdb/pdb.c @@ -4,7 +4,7 @@ //////////////////////////////// //~ PDB Parser Functions -static PDB_Info* +internal PDB_Info* pdb_info_from_data(Arena *arena, String8 data){ ProfBegin("pdb_info_from_data"); @@ -110,7 +110,7 @@ pdb_info_from_data(Arena *arena, String8 data){ return(result); } -static PDB_NamedStreamTable* +internal PDB_NamedStreamTable* pdb_named_stream_table_from_info(Arena *arena, PDB_Info *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); } -static PDB_Strtbl* +internal PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 data){ ProfBegin("pdb_strtbl_from_data"); @@ -200,7 +200,7 @@ pdb_strtbl_from_data(Arena *arena, String8 data){ return(result); } -static PDB_DbiParsed* +internal PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 data){ ProfBegin("pdb_dbi_from_data"); @@ -225,7 +225,7 @@ pdb_dbi_from_data(Arena *arena, String8 data){ // fill result result = push_array(arena, PDB_DbiParsed, 1); result->data = data; - result->arch = header->machine; + result->machine_type = header->machine; result->gsi_sn = header->gsi_sn; result->psi_sn = header->psi_sn; result->sym_sn = header->sym_sn; @@ -260,7 +260,7 @@ pdb_dbi_from_data(Arena *arena, String8 data){ return(result); } -static PDB_TpiParsed* +internal PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 data){ ProfBegin("pdb_tpi_from_data"); @@ -302,7 +302,7 @@ pdb_tpi_from_data(Arena *arena, String8 data){ 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){ 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); } -static PDB_GsiParsed* +internal PDB_GsiParsed* pdb_gsi_from_data(Arena *arena, String8 data){ ProfBegin("pdb_gsi_from_data"); @@ -563,7 +563,7 @@ pdb_gsi_from_data(Arena *arena, String8 data){ return(result); } -static PDB_CoffSectionArray* +internal PDB_CoffSectionArray* pdb_coff_section_array_from_data(Arena *arena, String8 data){ U64 count = data.size/sizeof(COFF_SectionHeader); @@ -573,7 +573,7 @@ pdb_coff_section_array_from_data(Arena *arena, String8 data){ return(result); } -static PDB_CompUnitArray* +internal PDB_CompUnitArray* pdb_comp_unit_array_from_data(Arena *arena, String8 data){ PDB_CompUnitNode *first = 0; PDB_CompUnitNode *last = 0; @@ -649,7 +649,7 @@ pdb_comp_unit_array_from_data(Arena *arena, String8 data){ return(result); } -static PDB_CompUnitContributionArray* +internal PDB_CompUnitContributionArray* pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, PDB_CoffSectionArray *sections){ PDB_CompUnitContribution *contributions = 0; @@ -715,7 +715,7 @@ pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, //////////////////////////////// //~ PDB Definition Functions -static U32 +internal U32 pdb_string_hash1(String8 string){ U32 result = 0; U8 *ptr = string.str; @@ -733,7 +733,7 @@ pdb_string_hash1(String8 string){ //////////////////////////////// //~ PDB Dbi Functions -static String8 +internal String8 pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range){ String8 result = {0}; if (range < PDB_DbiRange_COUNT){ @@ -745,7 +745,7 @@ pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range){ return(result); } -static String8 +internal String8 pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, PDB_DbiCompUnitRange range){ String8 result = {0}; 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 -static String8 +internal String8 pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){ String8 data = tpi->data; U8 *first = data.str + tpi->leaf_first; @@ -774,7 +774,7 @@ pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){ return(result); } -static CV_TypeIdArray +internal CV_TypeIdArray pdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *leaf, String8 name, B32 compare_unique_name, U32 output_cap){ 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); } -static CV_TypeId +internal CV_TypeId pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_leaf, String8 name, B32 compare_unique_name){ 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 -static String8 +internal String8 pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off){ U32 strblock_max = strtbl->strblock_max; U32 full_off_raw = strtbl->strblock_min + off; @@ -993,7 +993,7 @@ pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off){ return(result); } -static String8 +internal String8 pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, PDB_StringIndex idx){ String8 result = {0}; if (idx < strtbl->bucket_count){ diff --git a/src/raddbgi_convert/pdb/raddbgi_pdb.h b/src/pdb/pdb.h similarity index 76% rename from src/raddbgi_convert/pdb/raddbgi_pdb.h rename to src/pdb/pdb.h index 0a8e8d16..e86f6851 100644 --- a/src/raddbgi_convert/pdb/raddbgi_pdb.h +++ b/src/pdb/pdb.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_PDB_H -#define RADDBGI_PDB_H +#ifndef PDB_H +#define PDB_H // https://github.com/microsoft/microsoft-pdb/tree/master/PDB @@ -127,7 +127,7 @@ typedef struct PDB_DbiHeader{ U32 ec_info_size; PDB_DbiHeaderFlags flags; - COFF_Arch machine; + COFF_MachineType machine; U32 reserved; } PDB_DbiHeader; @@ -307,7 +307,7 @@ typedef struct PDB_Strtbl{ typedef struct PDB_DbiParsed{ String8 data; - COFF_Arch arch; + COFF_MachineType machine_type; MSF_StreamNumber gsi_sn; MSF_StreamNumber psi_sn; MSF_StreamNumber sym_sn; @@ -400,63 +400,63 @@ typedef struct PDB_CompUnitContributionArray{ //////////////////////////////// //~ PDB Parser Functions -static 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); -static PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 strtbl_data); +internal PDB_Info* pdb_info_from_data(Arena *arena, String8 pdb_info_data); +internal PDB_NamedStreamTable*pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info); +internal PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 strtbl_data); -static PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data); -static PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data); -static PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena, - PDB_Strtbl *strtbl, - PDB_TpiParsed *tpi, - String8 tpi_hash_data, - String8 tpi_hash_aux_data); -static PDB_GsiParsed* pdb_gsi_from_data(Arena *arena, String8 gsi_data); +internal PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data); +internal PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data); +internal PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena, + PDB_Strtbl *strtbl, + PDB_TpiParsed *tpi, + String8 tpi_hash_data, + String8 tpi_hash_aux_data); +internal PDB_GsiParsed* pdb_gsi_from_data(Arena *arena, String8 gsi_data); -static PDB_CoffSectionArray*pdb_coff_section_array_from_data(Arena *arena, - String8 section_data); +internal PDB_CoffSectionArray*pdb_coff_section_array_from_data(Arena *arena, + String8 section_data); -static PDB_CompUnitArray* pdb_comp_unit_array_from_data(Arena *arena, - String8 module_info_data); +internal PDB_CompUnitArray* pdb_comp_unit_array_from_data(Arena *arena, + String8 module_info_data); -static PDB_CompUnitContributionArray* +internal PDB_CompUnitContributionArray* pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 seccontrib_data, PDB_CoffSectionArray *sections); //////////////////////////////// //~ PDB Definition Functions -static U32 pdb_string_hash1(String8 string); +internal U32 pdb_string_hash1(String8 string); //////////////////////////////// //~ PDB Dbi Functions -static 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, - PDB_DbiCompUnitRange range); +internal String8 pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range); +internal String8 pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, + PDB_DbiCompUnitRange range); //////////////////////////////// //~ 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, - PDB_TpiHashParsed *tpi_hash, - CV_LeafParsed *tpi_leaf, - String8 name, - B32 compare_unique_name, - U32 output_cap); +internal CV_TypeIdArray pdb_tpi_itypes_from_name(Arena *arena, + PDB_TpiHashParsed *tpi_hash, + CV_LeafParsed *tpi_leaf, + String8 name, + B32 compare_unique_name, + U32 output_cap); -static CV_TypeId pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, - CV_LeafParsed *tpi_leaf, - String8 name, - B32 compare_unique_name); +internal CV_TypeId pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, + CV_LeafParsed *tpi_leaf, + String8 name, + B32 compare_unique_name); //////////////////////////////// //~ PDB Strtbl Functions -static String8 pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off); -static String8 pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, - PDB_StringIndex idx); +internal String8 pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off); +internal String8 pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, + PDB_StringIndex idx); -#endif //RADDBGI_PDB_H +#endif // PDB_H diff --git a/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.c b/src/pdb/pdb_stringize.c similarity index 98% rename from src/raddbgi_convert/pdb/raddbgi_pdb_stringize.c rename to src/pdb/pdb_stringize.c index a1726d28..7cd3f7e2 100644 --- a/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.c +++ b/src/pdb/pdb_stringize.c @@ -4,7 +4,7 @@ //////////////////////////////// //~ PDB Stringize Functions -static void +internal void pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash){ U32 bucket_count = hash->bucket_count; str8_list_pushf(arena, out, "bucket_count=%u\n\n", bucket_count); diff --git a/src/pdb/pdb_stringize.h b/src/pdb/pdb_stringize.h new file mode 100644 index 00000000..db0ca656 --- /dev/null +++ b/src/pdb/pdb_stringize.h @@ -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 diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 681c22c5..479a6de7 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -4,11 +4,16 @@ //////////////////////////////// //~ rjf: Includes -//- rjf: [h] +//- rjf: [lib] #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" + +//- rjf: [h] #include "base/base_inc.h" #include "os/os_inc.h" +#include "raddbgi_cons_local/raddbgi_cons_local.h" #include "mdesk/mdesk.h" #include "hash_store/hash_store.h" #include "file_stream/file_stream.h" @@ -17,16 +22,14 @@ #include "txti/txti.h" #include "coff/coff.h" #include "pe/pe.h" -#include "raddbgi_cons_local/raddbgi_cons_local.h" -#include "raddbgi_convert/pdb/raddbgi_coff.h" -#include "raddbgi_convert/pdb/raddbgi_codeview.h" -#include "raddbgi_convert/pdb/raddbgi_msf.h" -#include "raddbgi_convert/pdb/raddbgi_pdb.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_convert/pdb/raddbgi_coff_conversion.h" #include "raddbgi_convert/pdb/raddbgi_codeview_conversion.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/raddbgi/regs_raddbgi.h" #include "type_graph/type_graph.h" @@ -47,10 +50,9 @@ #include "raddbg.h" //- rjf: [c] -#include "lib_raddbgi_format/raddbgi_format.c" -#include "lib_raddbgi_format/raddbgi_format_parse.c" #include "base/base_inc.c" #include "os/os_inc.c" +#include "raddbgi_cons_local/raddbgi_cons_local.c" #include "mdesk/mdesk.c" #include "hash_store/hash_store.c" #include "file_stream/file_stream.c" @@ -59,14 +61,13 @@ #include "txti/txti.c" #include "coff/coff.c" #include "pe/pe.c" -#include "raddbgi_cons_local/raddbgi_cons_local.c" -#include "raddbgi_convert/pdb/raddbgi_msf.c" -#include "raddbgi_convert/pdb/raddbgi_codeview.c" -#include "raddbgi_convert/pdb/raddbgi_pdb.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_convert/pdb/raddbgi_coff_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 "regs/regs.c" #include "regs/raddbgi/regs_raddbgi.c" diff --git a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c index 83b73fb5..ca54b69c 100644 --- a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c +++ b/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c @@ -1,10 +1,10 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +#include "lib_raddbgi_format/raddbgi_format.h" #include "base/base_inc.h" #include "os/os_inc.h" -#include "raddbgi_format/raddbgi_format.h" -#include "raddbgi_cons/raddbgi_cons_local.h" +#include "raddbgi_cons_local/raddbgi_cons_local.h" #include "raddbgi_elf.h" #include "raddbgi_dwarf.h" @@ -13,10 +13,10 @@ #include "raddbgi_from_dwarf.h" +#include "lib_raddbgi_format/raddbgi_format.c" #include "base/base_inc.c" #include "os/os_inc.c" -#include "raddbgi_format/raddbgi_format.c" -#include "raddbgi_cons/raddbgi_cons_local.c" +#include "raddbgi_cons_local/raddbgi_cons_local.c" #include "raddbgi_elf.c" #include "raddbgi_dwarf.c" diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h b/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h deleted file mode 100644 index c7d04840..00000000 --- a/src/raddbgi_convert/pdb/raddbgi_codeview_stringize.h +++ /dev/null @@ -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 diff --git a/src/raddbgi_convert/pdb/raddbgi_coff.h b/src/raddbgi_convert/pdb/raddbgi_coff.h deleted file mode 100644 index ae04b185..00000000 --- a/src/raddbgi_convert/pdb/raddbgi_coff.h +++ /dev/null @@ -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 diff --git a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h index 2cd7aad9..375d6a46 100644 --- a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h +++ b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h @@ -7,7 +7,6 @@ //////////////////////////////// //~ COFF Conversion Functions -static RADDBGI_BinarySectionFlags -raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); +static RADDBGI_BinarySectionFlags raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); #endif //RADDBGI_COFF_CONVERSION_H diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c index e0a3db0c..dbe2cbe1 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c @@ -2,38 +2,34 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #include "lib_raddbgi_format/raddbgi_format.h" +#include "lib_raddbgi_format/raddbgi_format.c" + #include "base/base_inc.h" #include "os/os_inc.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_coff.h" -#include "raddbgi_codeview.h" -#include "raddbgi_msf.h" -#include "raddbgi_pdb.h" #include "raddbgi_coff_conversion.h" #include "raddbgi_codeview_conversion.h" -#include "raddbgi_codeview_stringize.h" -#include "raddbgi_pdb_stringize.h" - #include "raddbgi_from_pdb.h" -#include "lib_raddbgi_format/raddbgi_format.c" #include "base/base_inc.c" -#include "coff/coff.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_msf.c" -#include "raddbgi_codeview.c" -#include "raddbgi_pdb.c" #include "raddbgi_coff_conversion.c" #include "raddbgi_codeview_conversion.c" -#include "raddbgi_codeview_stringize.c" -#include "raddbgi_pdb_stringize.c" - #include "raddbgi_from_pdb.c" int diff --git a/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h b/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h deleted file mode 100644 index 9225735b..00000000 --- a/src/raddbgi_convert/pdb/raddbgi_pdb_stringize.h +++ /dev/null @@ -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 diff --git a/src/raddbgi_dump/raddbgi_dump.c b/src/raddbgi_dump/raddbgi_dump.c index 66687e94..cb878ede 100644 --- a/src/raddbgi_dump/raddbgi_dump.c +++ b/src/raddbgi_dump/raddbgi_dump.c @@ -1,19 +1,21 @@ // Copyright (c) 2024 Epic Games Tools // 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 "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 "base/base_inc.c" #include "os/os_inc.c" -#include "raddbgi_format/raddbgi_format.c" -#include "raddbgi_format/raddbgi_format_parse.c" -#include "raddbgi_stringize/raddbgi_stringize.c" + +#include "raddbgi_stringize.c" //////////////////////////////// //~ Program Parameters Parser diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 9bfeb01f..7a1d7af8 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -1,12 +1,12 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#include "raddbgi_format/raddbgi_format.h" -#include "raddbgi_format/raddbgi_format.c" -#include "raddbgi_format/raddbgi_format_parse.h" -#include "raddbgi_format/raddbgi_format_parse.c" -#include "raddbgi_cons/raddbgi_cons.h" -#include "raddbgi_cons/raddbgi_cons.c" +#include "lib_raddbgi_format/raddbgi_format.h" +#include "lib_raddbgi_format/raddbgi_format.c" +#include "lib_raddbgi_format/raddbgi_format_parse.h" +#include "lib_raddbgi_format/raddbgi_format_parse.c" +#include "lib_raddbgi_cons/raddbgi_cons.h" +#include "lib_raddbgi_cons/raddbgi_cons.c" int main(int argument_count, char **arguments) { From ac30c8a84bcafe2e74a137e7a90f55a711ae9362 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 09:53:52 -0800 Subject: [PATCH 045/275] add codeview/msf/pdb notes to readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 48f71017..64ece646 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,7 @@ A list of the layers in the codebase and their associated namespaces is below: - `base` (no namespace): Universal, codebase-wide constructs. Strings, math, memory allocators, helper macros, command-line parsing, and so on. Depends on no other codebase layers. +- `codeview` (`CV_`): Code for parsing and/or writing the CodeView format. - `coff` (`COFF_`): Code for parsing and/or writing the COFF (Common Object File Format) file format. - `ctrl` (`CTRL_`): The debugger's "control system" layer. Implements @@ -294,6 +295,7 @@ A list of the layers in the codebase and their associated namespaces is below: duplicate version of `base` and `os` are included in this layer. They are updated manually, as needed. This is to ensure the stability of the metaprogram. +- `msf` (`MSF_`): Code for parsing and/or writing the MSF file format. - `mule` (no namespace): Test executables for battle testing debugger functionality. - `natvis` (no namespace): NatVis files for type visualization of the codebase's @@ -307,6 +309,7 @@ A list of the layers in the codebase and their associated namespaces is below: - `os/socket` (`OS_`): An abstraction layer, building on `os/core`, providing networking operating system features under an abstract API, which is implemented per-target-operating-system. +- `pdb` (`PDB_`): Code for parsing and/or writing the PDB file format. - `pe` (`PE_`): Code for parsing and/or writing the PE (Portable Executable) file format. - `raddbg` (no namespace): The layer which ties everything together for the main From 4a9e5512f611d706e7f7132fe7f2da3f35239dc3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 09:56:46 -0800 Subject: [PATCH 046/275] fix this_function_name macro --- src/base/base_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/base_types.h b/src/base/base_types.h index 20c35d06..d91358c6 100644 --- a/src/base/base_types.h +++ b/src/base/base_types.h @@ -180,7 +180,7 @@ # define zero_struct {0} #endif -#if COMPILER_MSVC && COMPILER_CL_YEAR < 2015 +#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015 # define this_function_name "unknown" #else # define this_function_name __func__ From ea840a71e89d37c2d9d01478b6d8069e78d33aa4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 10:55:06 -0800 Subject: [PATCH 047/275] metagen: simplify enum generation; reading/organization pass over raddbgi_from_pdb --- src/codeview/codeview.h | 6 +- src/codeview/codeview.mdesk | 28 + src/ctrl/ctrl.mdesk | 8 +- src/ctrl/generated/ctrl.meta.h | 2 +- src/df/core/df_core.mdesk | 54 +- src/df/core/generated/df_core.meta.h | 14 +- src/df/gfx/df_gfx.mdesk | 24 +- src/df/gfx/generated/df_gfx.meta.h | 6 +- src/eval/eval.mdesk | 6 +- src/eval/generated/eval.meta.h | 2 +- src/metagen/metagen_main.c | 38 +- src/os/gfx/generated/os_gfx.meta.h | 2 +- src/os/gfx/os_gfx.mdesk | 7 +- .../pdb/raddbgi_codeview_conversion.c | 6 +- .../pdb/raddbgi_codeview_conversion.h | 6 +- .../pdb/raddbgi_coff_conversion.c | 2 +- .../pdb/raddbgi_coff_conversion.h | 2 +- src/raddbgi_convert/pdb/raddbgi_from_pdb.c | 1203 +++++++++++------ src/raddbgi_convert/pdb/raddbgi_from_pdb.h | 340 ++--- src/regs/generated/regs.meta.h | 8 +- src/regs/regs.mdesk | 32 +- .../d3d11/generated/render_d3d11.meta.h | 6 +- src/render/d3d11/render_d3d11.mdesk | 21 +- src/render/generated/render.meta.h | 12 +- src/render/render_core.mdesk | 36 +- src/type_graph/generated/type_graph.meta.h | 16 +- src/type_graph/type_graph.mdesk | 27 +- 27 files changed, 1149 insertions(+), 765 deletions(-) create mode 100644 src/codeview/codeview.mdesk diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index 8d206d82..1e4a1d37 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -13,14 +13,12 @@ typedef U32 CV_TypeId; typedef U32 CV_ItemId; - -static CV_TypeId cv_type_id_variadic = 0xFFFFFFFF; - typedef U16 CV_ModIndex; typedef U16 CV_SectionIndex; - typedef U16 CV_Reg; +read_only global CV_TypeId cv_type_id_variadic = 0xFFFFFFFF; + #define CV_NumericKindXList(X) \ X(CHAR, 0x8000)\ X(SHORT, 0x8001)\ diff --git a/src/codeview/codeview.mdesk b/src/codeview/codeview.mdesk new file mode 100644 index 00000000..e4864c5b --- /dev/null +++ b/src/codeview/codeview.mdesk @@ -0,0 +1,28 @@ + +@table(name val) +CV_NumericKindTable: +{ + {CHAR 0x8000} + {SHORT 0x8001} + {USHORT 0x8002} + {LONG 0x8003} + {ULONG 0x8004} + {FLOAT32 0x8005} + {FLOAT64 0x8006} + {FLOAT80 0x8007} + {FLOAT128 0x8008} + {QUADWORD 0x8009} + {UQUADWORD 0x800a} + {FLOAT48 0x800b} + {COMPLEX32 0x800c} + {COMPLEX64 0x800d} + {COMPLEX80 0x800e} + {COMPLEX128 0x800f} + {VARSTRING 0x8010} + {OCTWORD 0x8017} + {UOCTWORD 0x8018} + {DECIMAL 0x8019} + {DATE 0x801a} + {UTF8STRING 0x801b} + {FLOAT16 0x801c} +} diff --git a/src/ctrl/ctrl.mdesk b/src/ctrl/ctrl.mdesk index 26da9727..c2518c54 100644 --- a/src/ctrl/ctrl.mdesk +++ b/src/ctrl/ctrl.mdesk @@ -49,11 +49,11 @@ CTRL_ExceptionCodeKindTable: //////////////////////////////// //~ rjf: Generators -@table_gen_enum CTRL_ExceptionCodeKind: +@enum CTRL_ExceptionCodeKind: { - `CTRL_ExceptionCodeKind_Null,`; - @expand(CTRL_ExceptionCodeKindTable a) `CTRL_ExceptionCodeKind_$(a.name),`; - `CTRL_ExceptionCodeKind_COUNT`; + Null, + @expand(CTRL_ExceptionCodeKindTable a) `$(a.name)`, + COUNT, } @table_gen_data(type:U32, fallback:0) diff --git a/src/ctrl/generated/ctrl.meta.h b/src/ctrl/generated/ctrl.meta.h index a9a2fb8a..eb1afc43 100644 --- a/src/ctrl/generated/ctrl.meta.h +++ b/src/ctrl/generated/ctrl.meta.h @@ -46,7 +46,7 @@ CTRL_ExceptionCodeKind_Win32ProcedureNotFound, CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected, CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation, CTRL_ExceptionCodeKind_Win32DirectXDebugLayer, -CTRL_ExceptionCodeKind_COUNT +CTRL_ExceptionCodeKind_COUNT, } CTRL_ExceptionCodeKind; U32 ctrl_exception_code_kind_code_table[] = diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 8273f114..8e69d123 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -1688,59 +1688,49 @@ DF_DevToggleTable: //- rjf: enums -@table_gen_enum -DF_CfgSrc: +@enum DF_CfgSrc: { - @expand(DF_CfgSrcTable a) `DF_CfgSrc_$(a.name),`; - `DF_CfgSrc_COUNT`; + @expand(DF_CfgSrcTable a) `$(a.name)`, + COUNT, } -@table_gen_enum -DF_EntityKind: +@enum DF_EntityKind: { - @expand(DF_EntityKindTable a) `DF_EntityKind_$(a.name),`; - `DF_EntityKind_COUNT`; + @expand(DF_EntityKindTable a) `$(a.name)`, + COUNT, } -@table_gen_enum -DF_NameKind: +@enum DF_NameKind: { - @expand(DF_NameKindTable, a) `DF_NameKind_$(a.name),`; - `DF_NameKind_COUNT`; + @expand(DF_NameKindTable, a) `$(a.name)`, + COUNT, } -@table_gen_enum -DF_CoreCmdKind: +@enum DF_CoreCmdKind: { - @expand(DF_CoreCmdTable, a) - `DF_CoreCmdKind_$(a.name),`, - `DF_CoreCmdKind_COUNT`, + @expand(DF_CoreCmdTable, a) `$(a.name)`, + COUNT, } -@table_gen_enum -DF_IconKind: +@enum DF_IconKind: { - @expand(DF_IconTable a) - `DF_IconKind_$(a.name),`; - `DF_IconKind_COUNT`; + @expand(DF_IconTable a) `$(a.name)`, + COUNT, } -@table_gen_enum -DF_CoreViewRuleKind: +@enum DF_CoreViewRuleKind: { - @expand(DF_CoreViewRuleTable a) `DF_CoreViewRuleKind_$(a.name),`; - `DF_CoreViewRuleKind_COUNT`; + @expand(DF_CoreViewRuleTable a) `$(a.name)`, + COUNT, } //- rjf: command params -@table_gen_enum -DF_CmdParamSlot: +@enum DF_CmdParamSlot: { - `DF_CmdParamSlot_Null,`; - @expand(DF_CmdParamSlotTable a) - `DF_CmdParamSlot_$(a.name),`; - `DF_CmdParamSlot_COUNT`; + Null, + @expand(DF_CmdParamSlotTable a) `$(a.name)`, + COUNT, } @table_gen diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index 45553c01..9179a020 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -12,7 +12,7 @@ DF_CfgSrc_User, DF_CfgSrc_Profile, DF_CfgSrc_CommandLine, DF_CfgSrc_Transient, -DF_CfgSrc_COUNT +DF_CfgSrc_COUNT, } DF_CfgSrc; typedef enum DF_EntityKind @@ -44,7 +44,7 @@ DF_EntityKind_PendingThreadName, DF_EntityKind_ConversionTask, DF_EntityKind_ConversionFail, DF_EntityKind_EndedProcess, -DF_EntityKind_COUNT +DF_EntityKind_COUNT, } DF_EntityKind; typedef enum DF_NameKind @@ -52,7 +52,7 @@ typedef enum DF_NameKind DF_NameKind_Null, DF_NameKind_EntityName, DF_NameKind_EntityKindName, -DF_NameKind_COUNT +DF_NameKind_COUNT, } DF_NameKind; typedef enum DF_CoreCmdKind @@ -263,7 +263,7 @@ DF_CoreCmdKind_PickFileOrFolder, DF_CoreCmdKind_CompleteQuery, DF_CoreCmdKind_CancelQuery, DF_CoreCmdKind_ToggleDevMenu, -DF_CoreCmdKind_COUNT +DF_CoreCmdKind_COUNT, } DF_CoreCmdKind; typedef enum DF_IconKind @@ -337,7 +337,7 @@ DF_IconKind_QuestionMark, DF_IconKind_Person, DF_IconKind_Briefcase, DF_IconKind_Dot, -DF_IconKind_COUNT +DF_IconKind_COUNT, } DF_IconKind; typedef enum DF_CoreViewRuleKind @@ -358,7 +358,7 @@ DF_CoreViewRuleKind_Text, DF_CoreViewRuleKind_Disasm, DF_CoreViewRuleKind_Bitmap, DF_CoreViewRuleKind_Geo, -DF_CoreViewRuleKind_COUNT +DF_CoreViewRuleKind_COUNT, } DF_CoreViewRuleKind; typedef enum DF_CmdParamSlot @@ -382,7 +382,7 @@ DF_CmdParamSlot_Index, DF_CmdParamSlot_ID, DF_CmdParamSlot_PreferDisassembly, DF_CmdParamSlot_ForceConfirm, -DF_CmdParamSlot_COUNT +DF_CmdParamSlot_COUNT, } DF_CmdParamSlot; typedef struct DF_CmdParams DF_CmdParams; diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index 26233177..b23f55ae 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -400,28 +400,22 @@ DF_ThemePresetColorTable: //- rjf: enums -@table_gen_enum -DF_GfxViewKind: +@enum DF_GfxViewKind: { - @expand(DF_GfxViewTable a) - `DF_GfxViewKind_$(a.name),` - `DF_GfxViewKind_COUNT`; + @expand(DF_GfxViewTable a) `$(a.name)`, + COUNT, } -@table_gen_enum -DF_ThemeColor: +@enum DF_ThemeColor: { - @expand(DF_ThemeTable, a) - `DF_ThemeColor_$(a.name),`; - `DF_ThemeColor_COUNT`; + @expand(DF_ThemeTable a) `$(a.name)`, + COUNT, } -@table_gen_enum -DF_ThemePreset: +@enum DF_ThemePreset: { - @expand(DF_ThemePresetTable a) - `DF_ThemePreset_$(a.name),`; - `DF_ThemePreset_COUNT`; + @expand(DF_ThemePresetTable a) `$(a.name)`, + COUNT, } //- rjf: theme preset color tables diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/df/gfx/generated/df_gfx.meta.h index b1cceb74..ab8c3b8b 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/df/gfx/generated/df_gfx.meta.h @@ -37,7 +37,7 @@ DF_GfxViewKind_Breakpoints, DF_GfxViewKind_WatchPins, DF_GfxViewKind_ExceptionFilters, DF_GfxViewKind_Theme, -DF_GfxViewKind_COUNT +DF_GfxViewKind_COUNT, } DF_GfxViewKind; typedef enum DF_ThemeColor @@ -95,7 +95,7 @@ DF_ThemeColor_Thread7, DF_ThemeColor_ThreadUnwound, DF_ThemeColor_InactivePanelOverlay, DF_ThemeColor_DropShadow, -DF_ThemeColor_COUNT +DF_ThemeColor_COUNT, } DF_ThemeColor; typedef enum DF_ThemePreset @@ -109,7 +109,7 @@ DF_ThemePreset_SolarizedLight, DF_ThemePreset_HandmadeHero, DF_ThemePreset_FourCoder, DF_ThemePreset_FarManager, -DF_ThemePreset_COUNT +DF_ThemePreset_COUNT, } DF_ThemePreset; DF_VIEW_SETUP_FUNCTION_DEF(Null); diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index ec8f3a7f..b285be9d 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -81,10 +81,10 @@ EVAL_ResultCodeTable: ``; } -@table_gen_enum EVAL_ResultCode: +@enum EVAL_ResultCode: { - @expand(EVAL_ResultCodeTable a) `EVAL_ResultCode_$(a.name),`; - EVAL_ResultCode_COUNT + @expand(EVAL_ResultCodeTable a) `$(a.name)`, + COUNT, } @table_gen_data(type:U8, fallback:0) diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index c02d018d..66153480 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -19,7 +19,7 @@ EVAL_ResultCode_BadModuleBase, EVAL_ResultCode_BadTLSBase, EVAL_ResultCode_InsufficientStackSpace, EVAL_ResultCode_MalformedBytecode, -EVAL_ResultCode_COUNT +EVAL_ResultCode_COUNT, } EVAL_ResultCode; typedef U32 EVAL_ExprKind; diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 6942687a..1e022dd9 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -98,8 +98,16 @@ int main(int argument_count, char **arguments) for(MD_Msg *msg = parse.msgs.first; msg != 0; msg = msg->next) { TxtPt pt = mg_txt_pt_from_string_off(data, msg->node->src_offset); - // TODO(rjf): error kind display & locations - fprintf(stderr, "%.*s:%i:%i %.*s\n", str8_varg(file_path), (int)pt.line, (int)pt.column, str8_varg(msg->string)); + String8 msg_kind_string = {0}; + switch(msg->kind) + { + default:{}break; + case MD_MsgKind_Note: {msg_kind_string = str8_lit("note");}break; + case MD_MsgKind_Warning: {msg_kind_string = str8_lit("warning");}break; + case MD_MsgKind_Error: {msg_kind_string = str8_lit("error");}break; + case MD_MsgKind_FatalError: {msg_kind_string = str8_lit("fatal error");}break; + } + fprintf(stderr, "%.*s:%i:%i: %.*s: %.*s\n", str8_varg(file_path), (int)pt.line, (int)pt.column, str8_varg(msg_kind_string), str8_varg(msg->string)); } } } @@ -141,19 +149,35 @@ int main(int argument_count, char **arguments) MD_Node *file = n->v.root; for(MD_EachNode(node, file->first)) { - if(md_node_has_tag(node, str8_lit("table_gen_enum"), 0)) + MD_Node *tag = md_tag_from_string(node, str8_lit("enum"), 0); + if(!md_node_is_nil(tag)) { + String8 enum_base_type_name = tag->first->string; String8 layer_key = mg_layer_key_from_path(file->string); MG_Layer *layer = mg_layer_from_key(layer_key); String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - str8_list_pushf(mg_arena, &layer->enums, "typedef enum %S\n{\n", node->string); + if(enum_base_type_name.size == 0) + { + str8_list_pushf(mg_arena, &layer->enums, "typedef enum %S\n{\n", node->string); + } + else + { + str8_list_pushf(mg_arena, &layer->enums, "typedef %S %S;\n", enum_base_type_name, node->string); + str8_list_pushf(mg_arena, &layer->enums, "typedef enum %SEnum\n{\n", node->string); + } for(String8Node *n = gen_strings.first; n != 0; n = n->next) { String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_push(mg_arena, &layer->enums, escaped); - str8_list_push(mg_arena, &layer->enums, str8_lit("\n")); + str8_list_pushf(mg_arena, &layer->enums, "%S_%S,\n", node->string, escaped); + } + if(enum_base_type_name.size == 0) + { + str8_list_pushf(mg_arena, &layer->enums, "} %S;\n\n", node->string); + } + else + { + str8_list_pushf(mg_arena, &layer->enums, "} %SEnum;\n\n", node->string); } - str8_list_pushf(mg_arena, &layer->enums, "} %S;\n\n", node->string); } } } diff --git a/src/os/gfx/generated/os_gfx.meta.h b/src/os/gfx/generated/os_gfx.meta.h index 9ce39166..5485576e 100644 --- a/src/os/gfx/generated/os_gfx.meta.h +++ b/src/os/gfx/generated/os_gfx.meta.h @@ -151,7 +151,7 @@ OS_Key_Num9, OS_Key_LeftMouseButton, OS_Key_MiddleMouseButton, OS_Key_RightMouseButton, -OS_Key_COUNT +OS_Key_COUNT, } OS_Key; String8 os_g_key_display_string_table[] = diff --git a/src/os/gfx/os_gfx.mdesk b/src/os/gfx/os_gfx.mdesk index 297f6ecf..532efc51 100644 --- a/src/os/gfx/os_gfx.mdesk +++ b/src/os/gfx/os_gfx.mdesk @@ -155,11 +155,10 @@ OS_KeyTable: //////////////////////////////// //~ rjf: Generators -@table_gen_enum -OS_Key: +@enum OS_Key: { - @expand(OS_KeyTable a) `OS_Key_$(a.name),`; - `OS_Key_COUNT`; + @expand(OS_KeyTable a) `$(a.name)`, + COUNT, } @table_gen_data(type: String8, fallback:`{0}`) diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c index ef1fe216..fc920d85 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c +++ b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c @@ -4,7 +4,7 @@ //////////////////////////////// //~ CodeView Conversion Functions -static RADDBGI_Arch +internal RADDBGI_Arch raddbgi_arch_from_cv_arch(CV_Arch cv_arch){ RADDBGI_Arch result = 0; switch (cv_arch){ @@ -73,7 +73,7 @@ raddbgi_arch_from_cv_arch(CV_Arch cv_arch){ return(result); } -static RADDBGI_RegisterCode +internal RADDBGI_RegisterCode raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code){ RADDBGI_RegisterCode result = 0; switch (arch){ @@ -98,7 +98,7 @@ raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code){ return(result); } -static RADDBGI_Language +internal RADDBGI_Language raddbgi_language_from_cv_language(CV_Language cv_language){ RADDBGI_Language result = 0; switch (cv_language){ diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h index 92e4cb07..318e9134 100644 --- a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h +++ b/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h @@ -7,8 +7,8 @@ //////////////////////////////// //~ CodeView Conversion Functions -static RADDBGI_Arch raddbgi_arch_from_cv_arch(CV_Arch arch); -static RADDBGI_RegisterCode raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code); -static RADDBGI_Language raddbgi_language_from_cv_language(CV_Language language); +internal RADDBGI_Arch raddbgi_arch_from_cv_arch(CV_Arch arch); +internal RADDBGI_RegisterCode raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code); +internal RADDBGI_Language raddbgi_language_from_cv_language(CV_Language language); #endif //RADDBGI_CODEVIEW_CONVERSION_H diff --git a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c index a07f4597..b04b1118 100644 --- a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c +++ b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c @@ -4,7 +4,7 @@ //////////////////////////////// //~ COFF Conversion Functions -static RADDBGI_BinarySectionFlags +internal RADDBGI_BinarySectionFlags raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags){ RADDBGI_BinarySectionFlags result = 0; diff --git a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h index 375d6a46..d25bf34f 100644 --- a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h +++ b/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h @@ -7,6 +7,6 @@ //////////////////////////////// //~ COFF Conversion Functions -static RADDBGI_BinarySectionFlags raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); +internal RADDBGI_BinarySectionFlags raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); #endif //RADDBGI_COFF_CONVERSION_H diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c index faf88fba..b85ee234 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c @@ -2,29 +2,29 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ Program Parameters Parser +//~ rjf: Command Line -> Conversion Parameters -static PDBCONV_Params* -pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ +internal PDBCONV_Params* +pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline) +{ PDBCONV_Params *result = push_array(arena, PDBCONV_Params, 1); // get input pdb { String8 input_name = cmd_line_string(cmdline, str8_lit("pdb")); - if (input_name.size == 0){ - str8_list_push(arena, &result->errors, - str8_lit("missing required parameter '--pdb:'")); + if(input_name.size == 0) + { + str8_list_push(arena, &result->errors, str8_lit("Missing required parameter: '--pdb:'")); } - - if (input_name.size > 0){ + if(input_name.size > 0) + { String8 input_data = os_data_from_file_path(arena, input_name); - - if (input_data.size == 0){ - str8_list_pushf(arena, &result->errors, - "could not load input file '%.*s'", str8_varg(input_name)); + if(input_data.size == 0) + { + str8_list_pushf(arena, &result->errors, "Could not load input PDB file from '%S'", input_name); } - - if (input_data.size != 0){ + if(input_data.size != 0) + { result->input_pdb_name = input_name; result->input_pdb_data = input_data; } @@ -34,15 +34,15 @@ pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ // get input exe { String8 input_name = cmd_line_string(cmdline, str8_lit("exe")); - if (input_name.size > 0){ + if(input_name.size > 0) + { String8 input_data = os_data_from_file_path(arena, input_name); - - if (input_data.size == 0){ - str8_list_pushf(arena, &result->errors, - "could not load input file '%.*s'", str8_varg(input_name)); + if(input_data.size == 0) + { + str8_list_pushf(arena, &result->errors, "Could not load input EXE file from '%S'", input_name); } - - if (input_data.size != 0){ + if(input_data.size != 0) + { result->input_exe_name = input_name; result->input_exe_data = input_data; } @@ -55,75 +55,90 @@ pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ } // error options - if (cmd_line_has_flag(cmdline, str8_lit("hide_errors"))){ + if(cmd_line_has_flag(cmdline, str8_lit("hide_errors"))) + { String8List vals = cmd_line_strings(cmdline, str8_lit("hide_errors")); // if no values - set all to hidden - if (vals.node_count == 0){ + if(vals.node_count == 0) + { B8 *ptr = (B8*)&result->hide_errors; B8 *opl = ptr + sizeof(result->hide_errors); - for (;ptr < opl; ptr += 1){ + for(;ptr < opl; ptr += 1) + { *ptr = 1; } } // for each explicit value set the corresponding flag to hidden - for (String8Node *node = vals.first; - node != 0; - node = node->next){ - if (str8_match(node->string, str8_lit("input"), 0)){ + for(String8Node *node = vals.first; node != 0; node = node->next) + { + if(str8_match(node->string, str8_lit("input"), 0)) + { result->hide_errors.input = 1; } - else if (str8_match(node->string, str8_lit("output"), 0)){ + else if(str8_match(node->string, str8_lit("output"), 0)) + { result->hide_errors.output = 1; } - else if (str8_match(node->string, str8_lit("parsing"), 0)){ + else if(str8_match(node->string, str8_lit("parsing"), 0)) + { result->hide_errors.parsing = 1; } - else if (str8_match(node->string, str8_lit("converting"), 0)){ + else if(str8_match(node->string, str8_lit("converting"), 0)) + { result->hide_errors.converting = 1; } } - } // dump options - if (cmd_line_has_flag(cmdline, str8_lit("dump"))){ + if(cmd_line_has_flag(cmdline, str8_lit("dump"))) + { result->dump = 1; - String8List vals = cmd_line_strings(cmdline, str8_lit("dump")); - if (vals.first == 0){ + if(vals.first == 0) + { B8 *ptr = &result->dump__first; - for (; ptr < &result->dump__last; ptr += 1){ + for(;ptr < &result->dump__last; ptr += 1) + { *ptr = 1; } } - else{ - for (String8Node *node = vals.first; - node != 0; - node = node->next){ - if (str8_match(node->string, str8_lit("coff_sections"), 0)){ + else + { + for(String8Node *node = vals.first; node != 0; node = node->next) + { + if(str8_match(node->string, str8_lit("coff_sections"), 0)) + { result->dump_coff_sections = 1; } - else if (str8_match(node->string, str8_lit("msf"), 0)){ + else if(str8_match(node->string, str8_lit("msf"), 0)) + { result->dump_msf = 1; } - else if (str8_match(node->string, str8_lit("sym"), 0)){ + else if(str8_match(node->string, str8_lit("sym"), 0)) + { result->dump_sym = 1; } - else if (str8_match(node->string, str8_lit("tpi_hash"), 0)){ + else if(str8_match(node->string, str8_lit("tpi_hash"), 0)) + { result->dump_tpi_hash = 1; } - else if (str8_match(node->string, str8_lit("leaf"), 0)){ + else if(str8_match(node->string, str8_lit("leaf"), 0)) + { result->dump_leaf = 1; } - else if (str8_match(node->string, str8_lit("c13"), 0)){ + else if(str8_match(node->string, str8_lit("c13"), 0)) + { result->dump_c13 = 1; } - else if (str8_match(node->string, str8_lit("contributions"), 0)){ + else if(str8_match(node->string, str8_lit("contributions"), 0)) + { result->dump_contributions = 1; } - else if (str8_match(node->string, str8_lit("table_diagnostics"), 0)){ + else if(str8_match(node->string, str8_lit("table_diagnostics"), 0)) + { result->dump_table_diagnostics = 1; } } @@ -134,11 +149,11 @@ pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ } //////////////////////////////// -//~ PDB Type & Symbol Info Translation Helpers +//~ rjf: Conversion Implementation Helpers //- rjf: pdb conversion context creation -static PDBCONV_Ctx * +internal PDBCONV_Ctx * pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root) { Arena *arena = arena_alloc(); @@ -164,21 +179,23 @@ pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root) return pdb_ctx; } -//- pdb types and symbols +//- rjf: pdb types and symbols -static void +internal void pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *params) { ProfBeginFunction(); // convert types pdbconv_type_cons_main_passes(pdb_ctx); - if (params->sym != 0){ + if(params->sym != 0) + { pdbconv_gather_link_names(pdb_ctx, params->sym); pdbconv_symbol_cons(pdb_ctx, params->sym, 0); } U64 unit_count = params->unit_count; - for (U64 i = 0; i < unit_count; i += 1){ + for(U64 i = 0; i < unit_count; i += 1) + { CV_SymParsed *unit_sym = params->sym_for_unit[i]; pdbconv_symbol_cons(pdb_ctx, unit_sym, 1 + i); } @@ -186,32 +203,37 @@ pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *para ProfEnd(); } -//- decoding helpers +//- rjf: decoding helpers -static U32 -pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num){ +internal U32 +pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num) +{ U64 n_u64 = cv_u64_from_numeric(num); U32 n_u32 = (U32)n_u64; - if (n_u64 > 0xFFFFFFFF){ + if(n_u64 > 0xFFFFFFFF) + { raddbgic_push_errorf(ctx->root, "constant too large"); n_u32 = 0; } return(n_u32); } -static COFF_SectionHeader* -pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U32 sec_num){ +internal COFF_SectionHeader * +pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U32 sec_num) +{ COFF_SectionHeader *result = 0; - if (0 < sec_num && sec_num <= ctx->section_count){ + if(0 < sec_num && sec_num <= ctx->section_count) + { result = ctx->sections + sec_num - 1; } return(result); } -//- type info +//- rjf: type info -static void -pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ +internal void +pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx) +{ ProfBeginFunction(); CV_TypeId itype_first = ctx->leaf->itype_first; CV_TypeId itype_opl = ctx->leaf->itype_opl; @@ -227,7 +249,8 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ // resolve forward references ProfScope("resolve forward references") { - for (CV_TypeId itype = itype_first; itype < itype_opl; itype += 1){ + for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) + { pdbconv_type_resolve_fwd(ctx, itype); } } @@ -235,7 +258,8 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ // construct type info ProfScope("construct type info") { - for (CV_TypeId itype = itype_first; itype < itype_opl; itype += 1){ + for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) + { pdbconv_type_resolve_itype(ctx, itype); } } @@ -243,9 +267,10 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ // construct member info ProfScope("construct member info") { - for (PDBCONV_TypeRev *rev = ctx->member_revisit_first; - rev != 0; - rev = rev->next){ + for(PDBCONV_TypeRev *rev = ctx->member_revisit_first; + rev != 0; + rev = rev->next) + { pdbconv_type_equip_members(ctx, rev->owner_type, rev->field_itype); } } @@ -253,9 +278,10 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ // construct enum info ProfScope("construct enum info") { - for (PDBCONV_TypeRev *rev = ctx->enum_revisit_first; - rev != 0; - rev = rev->next){ + for(PDBCONV_TypeRev *rev = ctx->enum_revisit_first; + rev != 0; + rev = rev->next) + { pdbconv_type_equip_enumerates(ctx, rev->owner_type, rev->field_itype); } } @@ -264,8 +290,9 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx){ ProfEnd(); } -static CV_TypeId -pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ +internal CV_TypeId +pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype) +{ ProfBeginFunction(); Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); @@ -273,19 +300,22 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[itype - ctx->leaf->itype_first]; String8 data = ctx->leaf->data; - if (range->off + range->hdr.size <= data.size){ + if(range->off + range->hdr.size <= data.size) + { U8 *first = data.str + range->off + 2; U64 cap = range->hdr.size - 2; // figure out if this itype resolves to another - switch (range->hdr.kind){ + switch (range->hdr.kind) + { default:break; case CV_LeafKind_CLASS: case CV_LeafKind_STRUCTURE: { // TODO(allen): error if bad range - if (sizeof(CV_LeafStruct) <= cap){ + if(sizeof(CV_LeafStruct) <= cap) + { CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; // size @@ -300,13 +330,16 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ U8 *unique_name_ptr = name_ptr + name.size + 1; String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, first + cap); - if (lf_struct->props & CV_TypeProp_FwdRef){ + if(lf_struct->props & CV_TypeProp_FwdRef) + { B32 do_unique_name_lookup = ((lf_struct->props & CV_TypeProp_Scoped) != 0) && ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0); - if (do_unique_name_lookup){ + if(do_unique_name_lookup) + { result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, unique_name, 1); } - else{ + else + { result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); } } @@ -317,7 +350,8 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_STRUCT2: { // TODO(allen): error if bad range - if (sizeof(CV_LeafStruct2) <= cap){ + if(sizeof(CV_LeafStruct2) <= cap) + { CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first; // size @@ -332,13 +366,16 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ U8 *unique_name_ptr = name_ptr + name.size + 1; String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, first + cap); - if (lf_struct->props & CV_TypeProp_FwdRef){ + if(lf_struct->props & CV_TypeProp_FwdRef) + { B32 do_unique_name_lookup = ((lf_struct->props & CV_TypeProp_Scoped) != 0) && ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0); - if (do_unique_name_lookup){ + if(do_unique_name_lookup) + { result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, unique_name, 1); } - else{ + else + { result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); } } @@ -348,7 +385,8 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_UNION: { // TODO(allen): error if bad range - if (sizeof(CV_LeafUnion) <= cap){ + if(sizeof(CV_LeafUnion) <= cap) + { CV_LeafUnion *lf_union = (CV_LeafUnion*)first; // size @@ -363,13 +401,16 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ U8 *unique_name_ptr = name_ptr + name.size + 1; String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, first + cap); - if (lf_union->props & CV_TypeProp_FwdRef){ + if(lf_union->props & CV_TypeProp_FwdRef) + { B32 do_unique_name_lookup = ((lf_union->props & CV_TypeProp_Scoped) != 0) && ((lf_union->props & CV_TypeProp_HasUniqueName) != 0); - if (do_unique_name_lookup){ + if(do_unique_name_lookup) + { result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, unique_name, 1); } - else{ + else + { result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); } } @@ -379,7 +420,8 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_ENUM: { // TODO(allen): error if bad range - if (sizeof(CV_LeafEnum) <= cap){ + if(sizeof(CV_LeafEnum) <= cap) + { CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; // name @@ -390,13 +432,16 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ U8 *unique_name_ptr = name_ptr + name.size + 1; String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, first + cap); - if (lf_enum->props & CV_TypeProp_FwdRef){ + if(lf_enum->props & CV_TypeProp_FwdRef) + { B32 do_unique_name_lookup = ((lf_enum->props & CV_TypeProp_Scoped) != 0) && ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0); - if (do_unique_name_lookup){ + if(do_unique_name_lookup) + { result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, unique_name, 1); } - else{ + else + { result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); } } @@ -406,7 +451,8 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ } // save in map - if (result != 0){ + if(result != 0) + { pdbconv_type_fwd_map_set(ctx->arena, &ctx->fwd_map, itype, result); } @@ -414,8 +460,9 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype){ return(result); } -static RADDBGIC_Type* -pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ +internal RADDBGIC_Type* +pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype) +{ B32 is_basic = (itype < 0x1000); // convert fwd references to real types @@ -452,8 +499,9 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype){ return(result); } -static void -pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype){ +internal void +pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype) +{ Temp scratch = scratch_begin(0, 0); String8 data = ctx->leaf->data; @@ -472,9 +520,11 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI task->itype = field_itype; } - for (;;){ + for(;;) + { // exit condition - if (todo == 0){ + if(todo == 0) + { break; } @@ -490,18 +540,21 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // TODO(allen): error if this itype is bad U8 *first = 0; U64 cap = 0; - if (ctx->leaf->itype_first <= field_itype && field_itype < ctx->leaf->itype_opl){ + if(ctx->leaf->itype_first <= field_itype && field_itype < ctx->leaf->itype_opl) + { CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[field_itype - ctx->leaf->itype_first]; // check valid arglist - if (range->hdr.kind == CV_LeafKind_FIELDLIST && - range->off + range->hdr.size <= data.size){ + if(range->hdr.kind == CV_LeafKind_FIELDLIST && + range->off + range->hdr.size <= data.size) + { first = data.str + range->off + 2; cap = range->hdr.size - 2; } } U64 cursor = 0; - for (;cursor + sizeof(CV_LeafKind) <= cap;){ + for(;cursor + sizeof(CV_LeafKind) <= cap;) + { CV_LeafKind field_kind = *(CV_LeafKind*)(first + cursor); U64 list_item_off = cursor + 2; @@ -509,11 +562,13 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // default to exiting the loop U64 list_item_opl_off = cap; - switch (field_kind){ + switch (field_kind) + { case CV_LeafKind_INDEX: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafIndex) <= cap){ + if(list_item_off + sizeof(CV_LeafIndex) <= cap) + { // compute whole layout CV_LeafIndex *index = (CV_LeafIndex*)(first + list_item_off); @@ -522,15 +577,18 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // create new todo task CV_TypeId new_itype = index->itype; B32 is_new = 1; - for (struct FieldTask *task = handled; - task != 0; - task = task->next){ - if (task->itype == new_itype){ + for(struct FieldTask *task = handled; + task != 0; + task = task->next) + { + if(task->itype == new_itype) + { is_new = 0; break; } } - if (is_new){ + if(is_new) + { struct FieldTask *task = push_array(scratch.arena, struct FieldTask, 1); SLLStackPush(todo, task); task->itype = new_itype; @@ -541,7 +599,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI case CV_LeafKind_MEMBER: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafMember) <= cap){ + if(list_item_off + sizeof(CV_LeafMember) <= cap) + { // compute whole layout CV_LeafMember *member = (CV_LeafMember*)(first + list_item_off); @@ -563,7 +622,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI case CV_LeafKind_STMEMBER: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafStMember) <= cap){ + if(list_item_off + sizeof(CV_LeafStMember) <= cap) + { // compute whole layout CV_LeafStMember *stmember = (CV_LeafStMember*)(first + list_item_off); @@ -583,7 +643,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI case CV_LeafKind_METHOD: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafMethod) <= cap){ + if(list_item_off + sizeof(CV_LeafMethod) <= cap) + { // compute whole layout CV_LeafMethod *method = (CV_LeafMethod*)(first + list_item_off); @@ -598,13 +659,15 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // TODO(allen): error if bad itype CV_TypeId methodlist_itype = method->list_itype; - if (ctx->leaf->itype_first <= methodlist_itype && - methodlist_itype < ctx->leaf->itype_opl){ + if(ctx->leaf->itype_first <= methodlist_itype && + methodlist_itype < ctx->leaf->itype_opl) + { CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[methodlist_itype - ctx->leaf->itype_first]; // check valid methodlist - if (range->hdr.kind == CV_LeafKind_METHODLIST && - range->off + range->hdr.size <= data.size){ + if(range->hdr.kind == CV_LeafKind_METHODLIST && + range->off + range->hdr.size <= data.size) + { first = data.str + range->off + 2; cap = range->hdr.size - 2; } @@ -612,7 +675,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // emit loop U64 cursor = 0; - for (;cursor + sizeof(CV_LeafMethodListMember) <= cap;){ + for(;cursor + sizeof(CV_LeafMethodListMember) <= cap;) + { CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)(first + cursor); CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); @@ -641,8 +705,10 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // extract vbaseoff U64 next_cursor = cursor + sizeof(*method); U32 vbaseoff = 0; - if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro){ - if (cursor + sizeof(*method) + 4 <= cap){ + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + if(cursor + sizeof(*method) + 4 <= cap) + { vbaseoff = *(U32*)(method + 1); } next_cursor += 4; @@ -656,7 +722,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // emit RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, method->itype); - switch (prop){ + switch (prop) + { default: { raddbgic_type_add_member_method(ctx->root, owner_type, name, mem_type); @@ -683,7 +750,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI case CV_LeafKind_ONEMETHOD: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafOneMethod) <= cap){ + if(list_item_off + sizeof(CV_LeafOneMethod) <= cap) + { // compute whole layout CV_LeafOneMethod *one_method = (CV_LeafOneMethod*)(first + list_item_off); @@ -692,7 +760,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI U64 vbaseoff_off = list_item_off + sizeof(*one_method); U64 vbaseoff_opl_off = vbaseoff_off; U32 vbaseoff = 0; - if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro){ + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { vbaseoff = *(U32*)(first + vbaseoff_off); vbaseoff_opl_off += sizeof(vbaseoff); } @@ -707,7 +776,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // emit RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, one_method->itype); - switch (prop){ + switch (prop) + { default: { raddbgic_type_add_member_method(ctx->root, owner_type, name, mem_type); @@ -732,7 +802,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI case CV_LeafKind_NESTTYPE: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafNestType) <= cap){ + if(list_item_off + sizeof(CV_LeafNestType) <= cap) + { // compute whole layout CV_LeafNestType *nest_type = (CV_LeafNestType*)(first + list_item_off); @@ -750,7 +821,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI case CV_LeafKind_NESTTYPEEX: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafNestTypeEx) <= cap){ + if(list_item_off + sizeof(CV_LeafNestTypeEx) <= cap) + { // compute whole layout CV_LeafNestTypeEx *nest_type = (CV_LeafNestTypeEx*)(first + list_item_off); @@ -770,7 +842,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI case CV_LeafKind_BCLASS: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafBClass) <= cap){ + if(list_item_off + sizeof(CV_LeafBClass) <= cap) + { // compute whole layout CV_LeafBClass *bclass = (CV_LeafBClass*)(first + list_item_off); @@ -792,7 +865,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI case CV_LeafKind_IVBCLASS: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafVBClass) <= cap){ + if(list_item_off + sizeof(CV_LeafVBClass) <= cap) + { // compute whole layout CV_LeafVBClass *vbclass = (CV_LeafVBClass*)(first + list_item_off); @@ -843,8 +917,9 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI scratch_end(scratch); } -static void -pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype){ +internal void +pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype) +{ Temp scratch = scratch_begin(0, 0); String8 data = ctx->leaf->data; @@ -863,9 +938,11 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_Ty task->itype = field_itype; } - for (;;){ + for(;;) + { // exit condition - if (todo == 0){ + if(todo == 0) + { break; } @@ -881,18 +958,21 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_Ty // TODO(allen): error if this itype is bad U8 *first = 0; U64 cap = 0; - if (ctx->leaf->itype_first <= field_itype && field_itype < ctx->leaf->itype_opl){ + if(ctx->leaf->itype_first <= field_itype && field_itype < ctx->leaf->itype_opl) + { CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[field_itype - ctx->leaf->itype_first]; // check valid arglist - if (range->hdr.kind == CV_LeafKind_FIELDLIST && - range->off + range->hdr.size <= data.size){ + if(range->hdr.kind == CV_LeafKind_FIELDLIST && + range->off + range->hdr.size <= data.size) + { first = data.str + range->off + 2; cap = range->hdr.size - 2; } } U64 cursor = 0; - for (;cursor + sizeof(CV_LeafKind) <= cap;){ + for(;cursor + sizeof(CV_LeafKind) <= cap;) + { CV_LeafKind field_kind = *(CV_LeafKind*)(first + cursor); U64 list_item_off = cursor + 2; @@ -900,11 +980,13 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_Ty // default to exiting the loop U64 list_item_opl_off = cap; - switch (field_kind){ + switch (field_kind) + { case CV_LeafKind_INDEX: { // TODO(allen): error if bad range - if (list_item_off + sizeof(CV_LeafIndex) <= cap){ + if(list_item_off + sizeof(CV_LeafIndex) <= cap) + { // compute whole layout CV_LeafIndex *index = (CV_LeafIndex*)(first + list_item_off); @@ -913,15 +995,18 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_Ty // create new todo task CV_TypeId new_itype = index->itype; B32 is_new = 1; - for (struct FieldTask *task = handled; - task != 0; - task = task->next){ - if (task->itype == new_itype){ + for(struct FieldTask *task = handled; + task != 0; + task = task->next) + { + if(task->itype == new_itype) + { is_new = 0; break; } } - if (is_new){ + if(is_new) + { struct FieldTask *task = push_array(scratch.arena, struct FieldTask, 1); SLLStackPush(todo, task); task->itype = new_itype; @@ -967,8 +1052,9 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_Ty scratch_end(scratch); } -static RADDBGIC_Type* -pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ +internal RADDBGIC_Type* +pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype) +{ Assert(itype < 0x1000); CV_BasicPointerKind basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); @@ -977,7 +1063,8 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ RADDBGIC_Reservation *basic_res = raddbgic_type_reserve_id(ctx->root, basic_type_code, basic_type_code); RADDBGIC_Type *basic_type = 0; - switch (basic_type_code){ + switch (basic_type_code) + { case CV_BasicType_VOID: { basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Void, str8_lit("void")); @@ -1147,10 +1234,12 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ // wrap in constructed type RADDBGIC_Type *constructed_type = 0; - if (basic_ptr_kind != 0 && basic_type != 0){ + if(basic_ptr_kind != 0 && basic_type != 0) + { RADDBGIC_Reservation *constructed_res = raddbgic_type_reserve_id(ctx->root, itype, itype); - switch (basic_ptr_kind){ + switch (basic_ptr_kind) + { case CV_BasicPointerKind_16BIT: case CV_BasicPointerKind_FAR_16BIT: case CV_BasicPointerKind_HUGE_16BIT: @@ -1168,15 +1257,17 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype){ // select output RADDBGIC_Type *result = basic_type; - if (basic_ptr_kind != 0){ + if(basic_ptr_kind != 0) + { result = constructed_type; } return(result); } -static RADDBGIC_Type* -pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ +internal RADDBGIC_Type* +pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) +{ Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); RADDBGIC_Reservation *res = raddbgic_type_reserve_id(ctx->root, itype, itype); @@ -1185,30 +1276,37 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ String8 data = ctx->leaf->data; RADDBGIC_Type *result = 0; - if (range->off + range->hdr.size <= data.size){ + if(range->off + range->hdr.size <= data.size) + { U8 *first = data.str + range->off + 2; U64 cap = range->hdr.size - 2; - switch (range->hdr.kind){ + switch (range->hdr.kind) + { case CV_LeafKind_MODIFIER: { // TODO(allen): error if bad range - if (sizeof(CV_LeafModifier) <= cap){ + if(sizeof(CV_LeafModifier) <= cap) + { CV_LeafModifier *modifier = (CV_LeafModifier*)first; RADDBGI_TypeModifierFlags flags = 0; - if (modifier->flags & CV_ModifierFlag_Const){ + if(modifier->flags & CV_ModifierFlag_Const) + { flags |= RADDBGI_TypeModifierFlag_Const; } - if (modifier->flags & CV_ModifierFlag_Volatile){ + if(modifier->flags & CV_ModifierFlag_Volatile) + { flags |= RADDBGI_TypeModifierFlag_Volatile; } RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, modifier->itype); - if (flags != 0){ + if(flags != 0) + { result = raddbgic_type_modifier(ctx->root, direct_type, flags); } - else{ + else + { result = direct_type; } } @@ -1217,7 +1315,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_POINTER: { // TODO(allen): error if bad range - if (sizeof(CV_LeafPointer) <= cap){ + if(sizeof(CV_LeafPointer) <= cap) + { CV_LeafPointer *pointer = (CV_LeafPointer*)first; CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(pointer->attribs); @@ -1228,25 +1327,31 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ // extract modifier flags RADDBGI_TypeModifierFlags modifier_flags = 0; - if (pointer->attribs & CV_PointerAttrib_Const){ + if(pointer->attribs & CV_PointerAttrib_Const) + { modifier_flags |= RADDBGI_TypeModifierFlag_Const; } - if (pointer->attribs & CV_PointerAttrib_Volatile){ + if(pointer->attribs & CV_PointerAttrib_Volatile) + { modifier_flags |= RADDBGI_TypeModifierFlag_Volatile; } // determine type kind RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Ptr; - if (pointer->attribs & CV_PointerAttrib_LRef){ + if(pointer->attribs & CV_PointerAttrib_LRef) + { type_kind = RADDBGI_TypeKind_LRef; } - else if (pointer->attribs & CV_PointerAttrib_RRef){ + else if(pointer->attribs & CV_PointerAttrib_RRef) + { type_kind = RADDBGI_TypeKind_RRef; } - if (ptr_mode == CV_PointerMode_LRef){ + if(ptr_mode == CV_PointerMode_LRef) + { type_kind = RADDBGI_TypeKind_LRef; } - else if (ptr_mode == CV_PointerMode_RRef){ + else if(ptr_mode == CV_PointerMode_RRef) + { type_kind = RADDBGI_TypeKind_RRef; } @@ -1254,7 +1359,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ RADDBGIC_Type *ptr_type = raddbgic_type_pointer(ctx->root, direct_type, type_kind); result = ptr_type; - if (modifier_flags != 0){ + if(modifier_flags != 0) + { result = raddbgic_type_modifier(ctx->root, ptr_type, modifier_flags); } } @@ -1263,7 +1369,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_PROCEDURE: { // TODO(allen): error if bad range - if (sizeof(CV_LeafProcedure) <= cap){ + if(sizeof(CV_LeafProcedure) <= cap) + { CV_LeafProcedure *procedure = (CV_LeafProcedure*)first; Temp scratch = scratch_begin(0, 0); @@ -1284,7 +1391,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_MFUNCTION: { // TODO(allen): error if bad range - if (sizeof(CV_LeafMFunction) <= cap){ + if(sizeof(CV_LeafMFunction) <= cap) + { CV_LeafMFunction *mfunction = (CV_LeafMFunction*)first; Temp scratch = scratch_begin(0, 0); @@ -1298,11 +1406,13 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ pdbconv_type_resolve_arglist(scratch.arena, ¶m_list, ctx, mfunction->arg_itype); RADDBGIC_Type *this_type = 0; - if (mfunction->this_itype != 0){ + if(mfunction->this_itype != 0) + { this_type = pdbconv_type_resolve_and_check(ctx, mfunction->this_itype); result = raddbgic_type_method(ctx->root, this_type, ret_type, ¶m_list); } - else{ + else + { result = raddbgic_type_proc(ctx->root, ret_type, ¶m_list); } @@ -1313,7 +1423,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_BITFIELD: { // TODO(allen): error if bad range - if (sizeof(CV_LeafBitField) <= cap){ + if(sizeof(CV_LeafBitField) <= cap) + { CV_LeafBitField *bit_field = (CV_LeafBitField*)first; RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, bit_field->itype); result = raddbgic_type_bitfield(ctx->root, direct_type, bit_field->pos, bit_field->len); @@ -1323,7 +1434,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_ARRAY: { // TODO(allen): error if bad range - if (sizeof(CV_LeafArray) <= cap){ + if(sizeof(CV_LeafArray) <= cap) + { CV_LeafArray *array = (CV_LeafArray*)first; // parse count @@ -1334,7 +1446,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, array->entry_itype); U64 count = full_size; - if (direct_type != 0 && direct_type->byte_size != 0){ + if(direct_type != 0 && direct_type->byte_size != 0) + { count /= direct_type->byte_size; } @@ -1347,7 +1460,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_STRUCTURE: { // TODO(allen): error if bad range - if (sizeof(CV_LeafStruct) <= cap){ + if(sizeof(CV_LeafStruct) <= cap) + { CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; // TODO(allen): handle props @@ -1362,18 +1476,22 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ String8 name = str8_cstring_capped((char*)name_ptr, first + cap); // incomplete type - if (lf_struct->props & CV_TypeProp_FwdRef){ + if(lf_struct->props & CV_TypeProp_FwdRef) + { RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_IncompleteStruct; - if (range->hdr.kind == CV_LeafKind_CLASS){ + if(range->hdr.kind == CV_LeafKind_CLASS) + { type_kind = RADDBGI_TypeKind_IncompleteClass; } result = raddbgic_type_incomplete(ctx->root, type_kind, name); } // complete type - else{ + else + { RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Struct; - if (range->hdr.kind == CV_LeafKind_CLASS){ + if(range->hdr.kind == CV_LeafKind_CLASS) + { type_kind = RADDBGI_TypeKind_Class; } result = raddbgic_type_udt(ctx->root, type_kind, name, size_u64); @@ -1393,7 +1511,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_STRUCT2: { // TODO(allen): error if bad range - if (sizeof(CV_LeafStruct2) <= cap){ + if(sizeof(CV_LeafStruct2) <= cap) + { CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first; // TODO(allen): handle props @@ -1408,18 +1527,22 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ String8 name = str8_cstring_capped((char*)name_ptr, first + cap); // incomplete type - if (lf_struct->props & CV_TypeProp_FwdRef){ + if(lf_struct->props & CV_TypeProp_FwdRef) + { RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_IncompleteStruct; - if (range->hdr.kind == CV_LeafKind_CLASS2){ + if(range->hdr.kind == CV_LeafKind_CLASS2) + { type_kind = RADDBGI_TypeKind_IncompleteClass; } result = raddbgic_type_incomplete(ctx->root, type_kind, name); } // complete type - else{ + else + { RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Struct; - if (range->hdr.kind == CV_LeafKind_CLASS2){ + if(range->hdr.kind == CV_LeafKind_CLASS2) + { type_kind = RADDBGI_TypeKind_Class; } result = raddbgic_type_udt(ctx->root, type_kind, name, size_u64); @@ -1438,7 +1561,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_UNION: { // TODO(allen): error if bad range - if (sizeof(CV_LeafUnion) <= cap){ + if(sizeof(CV_LeafUnion) <= cap) + { CV_LeafUnion *lf_union = (CV_LeafUnion*)first; // TODO(allen): handle props @@ -1453,13 +1577,15 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ String8 name = str8_cstring_capped((char*)name_ptr, first + cap); // incomplete type - if (lf_union->props & CV_TypeProp_FwdRef){ + if(lf_union->props & CV_TypeProp_FwdRef) + { result = raddbgic_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteUnion, name); } // complete type - else{ + else + { result = raddbgic_type_udt(ctx->root, RADDBGI_TypeKind_Union, name, size_u64); // remember to revisit this for members @@ -1476,7 +1602,8 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ case CV_LeafKind_ENUM: { // TODO(allen): error if bad range - if (sizeof(CV_LeafEnum) <= cap){ + if(sizeof(CV_LeafEnum) <= cap) + { CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; // TODO(allen): handle props @@ -1486,12 +1613,14 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ String8 name = str8_cstring_capped((char*)name_ptr, first + cap); // incomplete type - if (lf_enum->props & CV_TypeProp_FwdRef){ + if(lf_enum->props & CV_TypeProp_FwdRef) + { result = raddbgic_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteEnum, name); } // complete type - else{ + else + { RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, lf_enum->base_itype); result = raddbgic_type_enum(ctx->root, direct_type, name); @@ -1664,8 +1793,9 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){ return(result); } -static RADDBGIC_Type* -pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype){ +internal RADDBGIC_Type* +pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype) +{ RADDBGIC_Type *result = pdbconv_type_resolve_itype(ctx, itype); if(raddbgic_type_is_unhandled_nil(ctx->root, result)) { @@ -1674,29 +1804,34 @@ pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype){ return(result); } -static void +internal void pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, - PDBCONV_Ctx *ctx, CV_TypeId arglist_itype){ + PDBCONV_Ctx *ctx, CV_TypeId arglist_itype) +{ ProfBeginFunction(); // get leaf range - if (ctx->leaf->itype_first <= arglist_itype && arglist_itype < ctx->leaf->itype_opl){ + if(ctx->leaf->itype_first <= arglist_itype && arglist_itype < ctx->leaf->itype_opl) + { CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[arglist_itype - ctx->leaf->itype_first]; // check valid arglist String8 data = ctx->leaf->data; - if (range->hdr.kind == CV_LeafKind_ARGLIST && - range->off + range->hdr.size <= data.size){ + if(range->hdr.kind == CV_LeafKind_ARGLIST && + range->off + range->hdr.size <= data.size) + { U8 *first = data.str + range->off + 2; U64 cap = range->hdr.size - 2; - if (sizeof(CV_LeafArgList) <= cap){ + if(sizeof(CV_LeafArgList) <= cap) + { // resolve parameters CV_LeafArgList *arglist = (CV_LeafArgList*)first; CV_TypeId *itypes = (CV_TypeId*)(arglist + 1); U32 max_count = (cap - sizeof(*arglist))/sizeof(CV_TypeId); U32 clamped_count = ClampTop(arglist->count, max_count); - for (U32 i = 0; i < clamped_count; i += 1){ + for(U32 i = 0; i < clamped_count; i += 1) + { RADDBGIC_Type *param_type = pdbconv_type_resolve_and_check(ctx, itypes[i]); raddbgic_type_list_push(arena, out, param_type); } @@ -1708,31 +1843,36 @@ pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, ProfEnd(); } -static RADDBGIC_Type* -pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name){ +internal RADDBGIC_Type* +pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name) +{ // TODO(rjf): no idea if this is correct CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); RADDBGIC_Type *result = raddbgic_type_from_id(ctx->root, cv_type_id, cv_type_id); return(result); } -static void -pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_TypeId val){ +internal void +pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_TypeId val) +{ U64 bucket_idx = key%map->buckets_count; // search for an existing match PDBCONV_FwdNode *match = 0; - for (PDBCONV_FwdNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next){ - if (node->key == key){ + for(PDBCONV_FwdNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->key == key) + { match = node; break; } } // create a new node if no match - if (match == 0){ + if(match == 0) + { match = push_array(arena, PDBCONV_FwdNode, 1); SLLStackPush(map->buckets[bucket_idx], match); match->key = key; @@ -1744,16 +1884,19 @@ pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_Ty match->val = val; } -static CV_TypeId -pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key){ +internal CV_TypeId +pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key) +{ U64 bucket_idx = key%map->buckets_count; // search for an existing match PDBCONV_FwdNode *match = 0; - for (PDBCONV_FwdNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next){ - if (node->key == key){ + for(PDBCONV_FwdNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->key == key) + { match = node; break; } @@ -1761,7 +1904,8 @@ pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key){ // extract result CV_TypeId result = 0; - if (match != 0){ + if(match != 0) + { result = match->val; } @@ -1770,29 +1914,30 @@ pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key){ //- symbols -static U64 +internal U64 pdbconv_hash_from_local_user_id(U64 sym_hash, U64 id) { U64 hash = id ^ (sym_hash<<1) ^ (sym_hash<<4); return hash; } -static U64 +internal U64 pdbconv_hash_from_scope_user_id(U64 sym_hash, U64 id) { U64 hash = id ^ (sym_hash<<1) ^ (sym_hash<<4); return hash; } -static U64 +internal U64 pdbconv_hash_from_symbol_user_id(U64 sym_hash, U64 id) { U64 hash = id/8 + id ^ (sym_hash<<1) ^ (sym_hash<<4); return hash; } -static void -pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ +internal void +pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) +{ ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -1829,15 +1974,19 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_FRAMEPROC: { - if (sizeof(CV_SymFrameproc) > cap){ + if(sizeof(CV_SymFrameproc) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymFrameproc *frameproc = (CV_SymFrameproc*)first; - if (current_proc == 0){ + if(current_proc == 0) + { // TODO(allen): error } - else{ + else + { PDBCONV_FrameProcData data = {0}; data.frame_size = frameproc->frame_size; data.flags = frameproc->flags; @@ -1906,10 +2055,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_FRAMEPROC: //ProfScope("CV_SymKind_FRAMEPROC") { - if (sizeof(CV_SymFrameproc) > cap){ + if(sizeof(CV_SymFrameproc) > cap) + { // TODO(allen): error } - else{ + else + { // do nothing (handled in 'association map' pass) } }break; @@ -1917,10 +2068,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_BLOCK32: //ProfScope("CV_SymKind_BLOCK32") { - if (sizeof(CV_SymBlock32) > cap){ + if(sizeof(CV_SymBlock32) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymBlock32 *block32 = (CV_SymBlock32*)first; // scope @@ -1933,7 +2086,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // set voff range COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, block32->sec); - if (section != 0){ + if(section != 0) + { U64 voff_first = section->voff + block32->off; U64 voff_last = voff_first + block32->len; raddbgic_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last); @@ -1945,10 +2099,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_GDATA32: //ProfScope("CV_SymKind_LDATA32/CV_SymKind_GDATA32") { - if (sizeof(CV_SymData32) > cap){ + if(sizeof(CV_SymData32) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymData32 *data32 = (CV_SymData32*)first; // name @@ -1962,7 +2118,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // * PDB likes to have duplicates of these spread across // * different symbol streams so we deduplicate across the // * entire translation context. - if (!pdbconv_known_global_lookup(&ctx->known_globals, name, voff)){ + if(!pdbconv_known_global_lookup(&ctx->known_globals, name, voff)) + { pdbconv_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); // type of variable @@ -1971,14 +2128,16 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // container type RADDBGIC_Type *container_type = 0; U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); - if (container_name_opl > 2){ + if(container_name_opl > 2) + { String8 container_name = str8(name.str, container_name_opl - 2); container_type = pdbconv_type_from_name(ctx, container_name); } // container symbol RADDBGIC_Symbol *container_symbol = 0; - if (container_type == 0){ + if(container_type == 0) + { container_symbol = current_procedure; } @@ -2008,10 +2167,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_GPROC32: //ProfScope("CV_SymKind_LPROC32/CV_SymKind_GPROC32") { - if (sizeof(CV_SymProc32) > cap){ + if(sizeof(CV_SymProc32) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymProc32 *proc32 = (CV_SymProc32*)first; // name @@ -2023,14 +2184,16 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // container type RADDBGIC_Type *container_type = 0; U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); - if (container_name_opl > 2){ + if(container_name_opl > 2) + { String8 container_name = str8(name.str, container_name_opl - 2); container_type = pdbconv_type_from_name(ctx, container_name); } // container symbol RADDBGIC_Symbol *container_symbol = 0; - if (container_type == 0){ + if(container_type == 0) + { container_symbol = current_procedure; } @@ -2055,7 +2218,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // set voff range U64 voff = 0; COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, proc32->sec); - if (section != 0){ + if(section != 0) + { U64 voff_first = section->voff + proc32->off; U64 voff_last = voff_first + proc32->len; raddbgic_scope_add_voff_range(ctx->root, root_scope, voff_first, voff_last); @@ -2065,7 +2229,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // link name String8 link_name = {0}; - if (voff != 0){ + if(voff != 0) + { link_name = pdbconv_link_name_find(&ctx->link_names, voff); } @@ -2090,10 +2255,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_REGREL32: ProfScope("CV_SymKind_REGREL32") { - if (sizeof(CV_SymRegrel32) > cap){ + if(sizeof(CV_SymRegrel32) > cap) + { // TODO(allen): error } - else{ + else + { // TODO(allen): hide this when it's redundant with better information // from a CV_SymKind_LOCAL record. @@ -2117,18 +2284,22 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; { B32 is_stack_reg = 0; - switch (arch){ + switch (arch) + { case RADDBGI_Arch_X86: is_stack_reg = (cv_reg == CV_Regx86_ESP); break; case RADDBGI_Arch_X64: is_stack_reg = (cv_reg == CV_Regx64_RSP); break; } - if (is_stack_reg){ + if(is_stack_reg) + { U32 frame_size = 0xFFFFFFFF; - if (current_procedure != 0){ + if(current_procedure != 0) + { PDBCONV_FrameProcData *frameproc = pdbconv_symbol_frame_proc_read(ctx, current_procedure); frame_size = frameproc->frame_size; } - if (var_off > frame_size){ + if(var_off > frame_size) + { local_kind = RADDBGI_LocalKind_Parameter; } } @@ -2151,19 +2322,22 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ { // will there be an extra indirection to the value B32 extra_indirection_to_value = 0; - switch (arch){ + switch (arch) + { case RADDBGI_Arch_X86: { - if (local_kind == RADDBGI_LocalKind_Parameter && - (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))){ + if(local_kind == RADDBGI_LocalKind_Parameter && + (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))) + { extra_indirection_to_value = 1; } }break; case RADDBGI_Arch_X64: { - if (local_kind == RADDBGI_LocalKind_Parameter && - (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))){ + if(local_kind == RADDBGI_LocalKind_Parameter && + (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))) + { extra_indirection_to_value = 1; } }break; @@ -2190,10 +2364,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_GTHREAD32: //ProfScope("CV_SymKind_LTHREAD32/CV_SymKind_GTHREAD32") { - if (sizeof(CV_SymThread32) > cap){ + if(sizeof(CV_SymThread32) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymThread32 *thread32 = (CV_SymThread32*)first; // name @@ -2208,14 +2384,16 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // container type RADDBGIC_Type *container_type = 0; U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); - if (container_name_opl > 2){ + if(container_name_opl > 2) + { String8 container_name = str8(name.str, container_name_opl - 2); container_type = pdbconv_type_from_name(ctx, container_name); } // container symbol RADDBGIC_Symbol *container_symbol = 0; - if (container_type == 0){ + if(container_type == 0) + { container_symbol = current_procedure; } @@ -2243,10 +2421,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_LOCAL: //ProfScope("CV_SymKind_LOCAL") { - if (sizeof(CV_SymLocal) > cap){ + if(sizeof(CV_SymLocal) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymLocal *slocal = (CV_SymLocal*)first; // name @@ -2257,23 +2437,27 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ // determine how to handle B32 begin_a_global_modification = 0; - if ((slocal->flags & CV_LocalFlag_Global) || - (slocal->flags & CV_LocalFlag_Static)){ + if((slocal->flags & CV_LocalFlag_Global) || + (slocal->flags & CV_LocalFlag_Static)) + { begin_a_global_modification = 1; } // emit a global modification - if (begin_a_global_modification){ + if(begin_a_global_modification) + { // TODO(allen): add global modification symbols defrange_target = 0; defrange_target_is_param = 0; } // emit a local variable - else{ + else + { // local kind RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; - if (slocal->flags & CV_LocalFlag_Param){ + if(slocal->flags & CV_LocalFlag_Param) + { local_kind = RADDBGI_LocalKind_Parameter; } @@ -2302,14 +2486,18 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_DEFRANGE_REGISTER: //ProfScope("CV_SymKind_DEFRANGE_REGISTER") { - if (sizeof(CV_SymDefrangeRegister) > cap){ + if(sizeof(CV_SymDefrangeRegister) > cap) + { // TODO(allen): error } - else{ - if (defrange_target == 0){ + else + { + if(defrange_target == 0) + { // TODO(allen): error } - else{ + else + { CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)first; // TODO(allen): offset & size from cv_reg code @@ -2335,14 +2523,18 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: //ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL") { - if (sizeof(CV_SymDefrangeFramepointerRel) > cap){ + if(sizeof(CV_SymDefrangeFramepointerRel) > cap) + { // TODO(allen): error } - else{ - if (defrange_target == 0){ + else + { + if(defrange_target == 0) + { // TODO(allen): error } - else{ + else + { CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)first; // select frame pointer register @@ -2375,18 +2567,23 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: //ProfScope("CV_SymKind_DEFRANGE_SUBFIELD_REGISTER") { - if (sizeof(CV_SymDefrangeSubfieldRegister) > cap){ + if(sizeof(CV_SymDefrangeSubfieldRegister) > cap) + { // TODO(allen): error } - else{ - if (defrange_target == 0){ + else + { + if(defrange_target == 0) + { // TODO(allen): error } - else{ + else + { CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)first; // TODO(allen): full "subfield" location system - if (defrange_subfield_register->field_offset == 0){ + if(defrange_subfield_register->field_offset == 0) + { // TODO(allen): offset & size from cv_reg code RADDBGI_Arch arch = ctx->arch; @@ -2412,14 +2609,18 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: //ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE") { - if (sizeof(CV_SymDefrangeFramepointerRelFullScope) > cap){ + if(sizeof(CV_SymDefrangeFramepointerRelFullScope) > cap) + { // TODO(allen): error } - else{ - if (defrange_target == 0){ + else + { + if(defrange_target == 0) + { // TODO(allen): error } - else{ + else + { CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)first; @@ -2448,10 +2649,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_DEFRANGE_REGISTER_REL: //ProfScope("CV_SymKind_DEFRANGE_REGISTER_REL") { - if (sizeof(CV_SymDefrangeRegisterRel) > cap){ + if(sizeof(CV_SymDefrangeRegisterRel) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)first; if(defrange_target == 0) { @@ -2490,10 +2693,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ case CV_SymKind_FILESTATIC: //ProfScope("CV_SymKind_FILESTATIC") { - if (sizeof(CV_SymFileStatic) > cap){ + if(sizeof(CV_SymFileStatic) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymFileStatic *file_static = (CV_SymFileStatic*)first; // name @@ -2529,8 +2734,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){ ProfEnd(); } -static void -pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym){ +internal void +pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym) +{ ProfBeginFunction(); // extract important values from parameters String8 data = sym->data; @@ -2538,7 +2744,8 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym){ // loop CV_RecRange *rec_range = sym->sym_ranges.ranges; CV_RecRange *opl = rec_range + sym->sym_ranges.count; - for (;rec_range < opl; rec_range += 1){ + for(;rec_range < opl; rec_range += 1) + { // symbol data range U64 opl_off_raw = rec_range->off + rec_range->hdr.size; U64 opl_off = ClampTop(opl_off_raw, data.size); @@ -2550,15 +2757,18 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym){ U64 cap = (opl_off - off); CV_SymKind kind = rec_range->hdr.kind; - switch (kind){ + switch (kind) + { default: break; case CV_SymKind_PUB32: { - if (sizeof(CV_SymPub32) > cap){ + if(sizeof(CV_SymPub32) > cap) + { // TODO(allen): error } - else{ + else + { CV_SymPub32 *pub32 = (CV_SymPub32*)first; // name @@ -2567,7 +2777,8 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym){ // calculate voff U64 voff = 0; COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, pub32->sec); - if (section != 0){ + if(section != 0) + { voff = section->voff + pub32->off; } @@ -2582,8 +2793,9 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym){ // "frameproc" map -static void -pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key,PDBCONV_FrameProcData *data){ +internal void +pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key,PDBCONV_FrameProcData *data) +{ ProfBeginFunction(); U64 key_int = IntFromPtr(key); PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; @@ -2591,22 +2803,26 @@ pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key,PDBCONV_Fr // find match PDBCONV_FrameProcNode *match = 0; - for (PDBCONV_FrameProcNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next){ - if (node->key == key){ + for(PDBCONV_FrameProcNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->key == key) + { match = node; break; } } // if there is already a match emit error - if (match != 0){ + if(match != 0) + { // TODO(allen): error } // insert new association if no match - if (match == 0){ + if(match == 0) + { match = push_array(ctx->arena, PDBCONV_FrameProcNode, 1); SLLStackPush(map->buckets[bucket_idx], match); match->key = key; @@ -2617,18 +2833,21 @@ pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key,PDBCONV_Fr ProfEnd(); } -static PDBCONV_FrameProcData* -pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key){ +internal PDBCONV_FrameProcData* +pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key) +{ U64 key_int = IntFromPtr(key); PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; U32 bucket_idx = key_int%map->buckets_count; // find match PDBCONV_FrameProcData *result = 0; - for (PDBCONV_FrameProcNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next){ - if (node->key == key){ + for(PDBCONV_FrameProcNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->key == key) + { result = &node->data; break; } @@ -2638,13 +2857,16 @@ pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key){ } // scope stack -static void -pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol){ +internal void +pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol) +{ PDBCONV_ScopeNode *node = ctx->scope_node_free; - if (node == 0){ + if(node == 0) + { node = push_array(ctx->arena, PDBCONV_ScopeNode, 1); } - else{ + else + { SLLStackPop(ctx->scope_node_free); } SLLStackPush(ctx->scope_stack, node); @@ -2652,20 +2874,25 @@ pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symb node->symbol = symbol; } -static void -pdbconv_symbol_pop_scope(PDBCONV_Ctx *ctx){ +internal void +pdbconv_symbol_pop_scope(PDBCONV_Ctx *ctx) +{ PDBCONV_ScopeNode *node = ctx->scope_stack; - if (node != 0){ + if(node != 0) + { SLLStackPop(ctx->scope_stack); SLLStackPush(ctx->scope_node_free, node); } } -static void -pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx){ - for (;;){ +internal void +pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx) +{ + for(;;) + { PDBCONV_ScopeNode *node = ctx->scope_stack; - if (node == 0){ + if(node == 0) + { break; } SLLStackPop(ctx->scope_stack); @@ -2675,16 +2902,20 @@ pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx){ // PDB/C++ name parsing helper -static U64 -pdbconv_end_of_cplusplus_container_name(String8 str){ +internal U64 +pdbconv_end_of_cplusplus_container_name(String8 str) +{ // NOTE: This finds the index one past the last "::" contained in str. // if no "::" is contained in str, then the returned index is 0. // The intent is that [0,clamp_bot(0,result - 2)) gives the // "container name" and [result,str.size) gives the leaf name. U64 result = 0; - if (str.size >= 2){ - for (U64 i = str.size; i >= 2; i -= 1){ - if (str.str[i - 2] == ':' && str.str[i - 1] == ':'){ + if(str.size >= 2) + { + for(U64 i = str.size; i >= 2; i -= 1) + { + if(str.str[i - 2] == ':' && str.str[i - 1] == ':') + { result = i; break; } @@ -2695,29 +2926,34 @@ pdbconv_end_of_cplusplus_container_name(String8 str){ // known global set -static U64 -pdbconv_known_global_hash(String8 name, U64 voff){ +internal U64 +pdbconv_known_global_hash(String8 name, U64 voff) +{ U64 result = 5381 ^ voff; U8 *ptr = name.str; U8 *opl = ptr + name.size; - for (; ptr < opl; ptr += 1){ + for(; ptr < opl; ptr += 1) + { result = ((result << 5) + result) + *ptr; } return(result); } -static B32 -pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff){ +internal B32 +pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff) +{ U64 hash = pdbconv_known_global_hash(name, voff); U64 bucket_idx = hash%set->buckets_count; PDBCONV_KnownGlobalNode *match = 0; - for (PDBCONV_KnownGlobalNode *node = set->buckets[bucket_idx]; - node != 0; - node = node->next){ - if (node->hash == hash && - node->key_voff == voff && - str8_match(node->key_name, name, 0)){ + for(PDBCONV_KnownGlobalNode *node = set->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->hash == hash && + node->key_voff == voff && + str8_match(node->key_name, name, 0)) + { match = node; break; } @@ -2727,24 +2963,28 @@ pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff) return(result); } -static void -pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 name, U64 voff){ +internal void +pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 name, U64 voff) +{ U64 hash = pdbconv_known_global_hash(name, voff); U64 bucket_idx = hash%set->buckets_count; PDBCONV_KnownGlobalNode *match = 0; - for (PDBCONV_KnownGlobalNode *node = set->buckets[bucket_idx]; - node != 0; - node = node->next){ - if (node->hash == hash && - node->key_voff == voff && - str8_match(node->key_name, name, 0)){ + for(PDBCONV_KnownGlobalNode *node = set->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->hash == hash && + node->key_voff == voff && + str8_match(node->key_name, name, 0)) + { match = node; break; } } - if (match == 0){ + if(match == 0) + { PDBCONV_KnownGlobalNode *node = push_array(arena, PDBCONV_KnownGlobalNode, 1); SLLStackPush(set->buckets[bucket_idx], node); node->key_name = push_str8_copy(arena, name); @@ -2757,23 +2997,28 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n // location info helpers -static RADDBGIC_Location* +internal RADDBGIC_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, RADDBGI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, - B32 extra_indirection){ + B32 extra_indirection) +{ RADDBGIC_Location *result = 0; - if (0 <= offset && offset <= (S64)max_U16){ - if (extra_indirection){ + if(0 <= offset && offset <= (S64)max_U16) + { + if(extra_indirection) + { result = raddbgic_location_addr_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); } - else{ + else + { result = raddbgic_location_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); } } - else{ + else + { Arena *arena = ctx->arena; RADDBGIC_EvalBytecode bytecode = {0}; @@ -2781,7 +3026,8 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_RegRead, regread_param); raddbgic_bytecode_push_sconst(arena, &bytecode, offset); raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_Add, 0); - if (extra_indirection){ + if(extra_indirection) + { raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_MemRead, ctx->addr_size); } @@ -2791,30 +3037,37 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, return(result); } -static CV_EncodedFramePtrReg -pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *proc, B32 param_base){ +internal CV_EncodedFramePtrReg +pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *proc, B32 param_base) +{ CV_EncodedFramePtrReg result = 0; - if (proc != 0){ + if(proc != 0) + { PDBCONV_FrameProcData *frame_proc = pdbconv_symbol_frame_proc_read(ctx, proc); CV_FrameprocFlags flags = frame_proc->flags; - if (param_base){ + if(param_base) + { result = CV_FrameprocFlags_ExtractParamBasePointer(flags); } - else{ + else + { result = CV_FrameprocFlags_ExtractLocalBasePointer(flags); } } return(result); } -static RADDBGI_RegisterCode -pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg encoded_reg){ +internal RADDBGI_RegisterCode +pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg encoded_reg) +{ RADDBGI_RegisterCode result = 0; - switch (arch){ + switch (arch) + { case RADDBGI_Arch_X86: { - switch (encoded_reg){ + switch (encoded_reg) + { case CV_EncodedFramePtrReg_StackPtr: { // TODO(allen): support CV_AllReg_VFRAME @@ -2833,7 +3086,8 @@ pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrR case RADDBGI_Arch_X64: { - switch (encoded_reg){ + switch (encoded_reg) + { case CV_EncodedFramePtrReg_StackPtr: { result = RADDBGI_RegisterCode_X64_rsp; @@ -2853,18 +3107,20 @@ pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrR return(result); } -static void +internal void pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, RADDBGIC_LocationSet *locset, RADDBGIC_Location *location, CV_LvarAddrRange *range, - CV_LvarAddrGap *gaps, U64 gap_count){ + CV_LvarAddrGap *gaps, U64 gap_count) +{ // extract range info U64 voff_first = 0; U64 voff_opl = 0; { COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, range->sec); - if (section != 0){ + if(section != 0) + { voff_first = section->voff + range->off; voff_opl = voff_first + range->len; } @@ -2873,24 +3129,28 @@ pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, // emit ranges CV_LvarAddrGap *gap_ptr = gaps; U64 voff_cursor = voff_first; - for (U64 i = 0; i < gap_count; i += 1, gap_ptr += 1){ + for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) + { U64 voff_gap_first = voff_first + gap_ptr->off; U64 voff_gap_opl = voff_gap_first + gap_ptr->len; - if (voff_cursor < voff_gap_first){ + if(voff_cursor < voff_gap_first) + { raddbgic_location_set_add_case(ctx->root, locset, voff_cursor, voff_gap_first, location); } voff_cursor = voff_gap_opl; } - if (voff_cursor < voff_opl){ + if(voff_cursor < voff_opl) + { raddbgic_location_set_add_case(ctx->root, locset, voff_cursor, voff_opl, location); } } // link names -static void -pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, U64 voff, String8 name){ +internal void +pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, U64 voff, String8 name) +{ U64 hash = (voff >> 3) ^ ((7 & voff) << 6); U64 bucket_idx = hash%map->buckets_count; @@ -2902,16 +3162,19 @@ pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, U64 voff, String8 map->bucket_collision_count += (node->next != 0); } -static String8 -pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff){ +internal String8 +pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff) +{ U64 hash = (voff >> 3) ^ ((7 & voff) << 6); U64 bucket_idx = hash%map->buckets_count; String8 result = {0}; - for (PDBCONV_LinkNameNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next){ - if (node->voff == voff){ + for(PDBCONV_LinkNameNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->voff == voff) + { result = node->name; break; } @@ -2923,7 +3186,7 @@ pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff){ //////////////////////////////// //~ Conversion Path -static PDBCONV_Out * +internal PDBCONV_Out * pdbconv_convert(Arena *arena, PDBCONV_Params *params) { PDBCONV_Out *out = push_array(arena, PDBCONV_Out, 1); @@ -2932,14 +3195,15 @@ pdbconv_convert(Arena *arena, PDBCONV_Params *params) // will we try to parse an input file? B32 try_parse_input = (params->errors.node_count == 0); -#define PARSE_CHECK_ERROR(p,fmt,...) do{ if ((p) == 0){\ +#define PARSE_CHECK_ERROR(p,fmt,...) do{ if((p) == 0){\ out->good_parse = 0;\ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } }while(0) // parse msf file MSF_Parsed *msf = 0; - if (try_parse_input) ProfScope("parse msf"){ + if(try_parse_input) ProfScope("parse msf") + { msf = msf_parsed_from_data(arena, params->input_pdb_data); PARSE_CHECK_ERROR(msf, "MSF"); } @@ -2947,7 +3211,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse pdb info PDB_NamedStreamTable *named_streams = 0; COFF_Guid auth_guid = {0}; - if (msf != 0) ProfScope("parse pdb info"){ + if(msf != 0) ProfScope("parse pdb info") + { Temp scratch = scratch_begin(&arena, 1); String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_PdbInfo); @@ -2962,7 +3227,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse strtbl PDB_Strtbl *strtbl = 0; - if (named_streams != 0) ProfScope("parse strtbl"){ + if(named_streams != 0) ProfScope("parse strtbl") + { MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_STRTABLE]; String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); strtbl = pdb_strtbl_from_data(arena, strtbl_data); @@ -2972,7 +3238,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse dbi PDB_DbiParsed *dbi = 0; - if (msf != 0) ProfScope("parse dbi"){ + if(msf != 0) ProfScope("parse dbi") + { String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); dbi = pdb_dbi_from_data(arena, dbi_data); @@ -2981,7 +3248,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse tpi PDB_TpiParsed *tpi = 0; - if (msf != 0) ProfScope("parse tpi"){ + if(msf != 0) ProfScope("parse tpi") + { String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi); tpi = pdb_tpi_from_data(arena, tpi_data); @@ -2990,7 +3258,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse ipi PDB_TpiParsed *ipi = 0; - if (msf != 0) ProfScope("parse ipi"){ + if(msf != 0) ProfScope("parse ipi") + { String8 ipi_data = msf_data_from_stream(msf, PDB_FixedStream_Ipi); ipi = pdb_tpi_from_data(arena, ipi_data); @@ -3000,7 +3269,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse coff sections PDB_CoffSectionArray *coff_sections = 0; U64 coff_section_count = 0; - if (dbi != 0) ProfScope("parse coff sections"){ + if(dbi != 0) ProfScope("parse coff sections") + { MSF_StreamNumber section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]; String8 section_data = msf_data_from_stream(msf, section_stream); coff_sections = pdb_coff_section_array_from_data(arena, section_data); @@ -3011,7 +3281,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse gsi PDB_GsiParsed *gsi = 0; - if (dbi != 0) ProfScope("parse gsi"){ + if(dbi != 0) ProfScope("parse gsi") + { String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn); gsi = pdb_gsi_from_data(arena, gsi_data); @@ -3020,7 +3291,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse psi PDB_GsiParsed *psi_gsi_part = 0; - if (dbi != 0) ProfScope("parse psi"){ + if(dbi != 0) ProfScope("parse psi") + { String8 psi_data = msf_data_from_stream(msf, dbi->psi_sn); String8 psi_data_gsi_part = str8_range(psi_data.str + sizeof(PDB_PsiHeader), psi_data.str + psi_data.size); @@ -3031,7 +3303,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse tpi hash PDB_TpiHashParsed *tpi_hash = 0; - if (tpi != 0) ProfScope("parse tpi hash"){ + if(tpi != 0) ProfScope("parse tpi hash") + { String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn); String8 aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); tpi_hash = pdb_tpi_hash_from_data(arena, strtbl, tpi, hash_data, aux_data); @@ -3041,7 +3314,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse tpi leaves CV_LeafParsed *tpi_leaf = 0; - if (tpi != 0) ProfScope("parse tpi leaves"){ + if(tpi != 0) ProfScope("parse tpi leaves") + { String8 leaf_data = pdb_leaf_data_from_tpi(tpi); tpi_leaf = cv_leaf_from_data(arena, leaf_data, tpi->itype_first); @@ -3050,7 +3324,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse ipi hash PDB_TpiHashParsed *ipi_hash = 0; - if (ipi != 0) ProfScope("parse ipi hash"){ + if(ipi != 0) ProfScope("parse ipi hash") + { String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn); String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); ipi_hash = pdb_tpi_hash_from_data(arena, strtbl, ipi, hash_data, aux_data); @@ -3060,7 +3335,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse ipi leaves CV_LeafParsed *ipi_leaf = 0; - if (ipi != 0) ProfScope("parse ipi leaves"){ + if(ipi != 0) ProfScope("parse ipi leaves") + { String8 leaf_data = pdb_leaf_data_from_tpi(ipi); ipi_leaf = cv_leaf_from_data(arena, leaf_data, ipi->itype_first); @@ -3069,7 +3345,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse sym CV_SymParsed *sym = 0; - if (dbi != 0) ProfScope("parse sym"){ + if(dbi != 0) ProfScope("parse sym") + { String8 sym_data = msf_data_from_stream(msf, dbi->sym_sn); sym = cv_sym_from_data(arena, sym_data, 4); @@ -3079,7 +3356,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse compilation units PDB_CompUnitArray *comp_units = 0; U64 comp_unit_count = 0; - if (dbi != 0) ProfScope("parse compilation units"){ + if(dbi != 0) ProfScope("parse compilation units") + { String8 mod_info_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); comp_units = pdb_comp_unit_array_from_data(arena, mod_info_data); comp_unit_count = comp_units->count; @@ -3090,7 +3368,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse dbi's section contributions PDB_CompUnitContributionArray *comp_unit_contributions = 0; U64 comp_unit_contribution_count = 0; - if (dbi != 0 && coff_sections != 0) ProfScope("parse dbi section contributions"){ + if(dbi != 0 && coff_sections != 0) ProfScope("parse dbi section contributions") + { String8 section_contribution_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon); comp_unit_contributions = pdb_comp_unit_contribution_array_from_data(arena, section_contribution_data, coff_sections); @@ -3101,9 +3380,11 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse syms for each compilation unit CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed*, comp_unit_count); - if (comp_units != 0) ProfScope("parse symbols"){ + if(comp_units != 0) ProfScope("parse symbols") + { PDB_CompUnit **unit_ptr = comp_units->units; - for (U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1){ + for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1) + { CV_SymParsed *unit_sym = 0; { String8 sym_data = pdb_data_from_unit_range(msf, *unit_ptr, PDB_DbiCompUnitRange_Symbols); @@ -3117,9 +3398,11 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // parse c13 for each compilation unit CV_C13Parsed **c13_for_unit = push_array(arena, CV_C13Parsed*, comp_unit_count); - if (comp_units != 0) ProfScope("parse c13s"){ + if(comp_units != 0) ProfScope("parse c13s") + { PDB_CompUnit **unit_ptr = comp_units->units; - for (U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1){ + for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1) + { CV_C13Parsed *unit_c13 = 0; { String8 c13_data = pdb_data_from_unit_range(msf, *unit_ptr, PDB_DbiCompUnitRange_C13); @@ -3132,20 +3415,23 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // parsing error - if (try_parse_input && !out->good_parse && - !params->hide_errors.parsing){ + if(try_parse_input && !out->good_parse && + !params->hide_errors.parsing) + { str8_list_pushf(arena, &out->errors, "error(parsing): '%S' as a PDB\n", params->input_pdb_name); } // exe hash U64 exe_hash = 0; - if (out->good_parse && params->input_exe_data.size > 0) ProfScope("hash exe"){ + if(out->good_parse && params->input_exe_data.size > 0) ProfScope("hash exe") + { exe_hash = raddbgi_hash(params->input_exe_data.str, params->input_exe_data.size); } // output generation PDBCONV_Ctx *pdbconv_ctx = 0; - if (params->output_name.size > 0){ + if(params->output_name.size > 0) + { // determine arch RADDBGI_Arch architecture = RADDBGI_Arch_NULL; @@ -3180,15 +3466,18 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ U64 symbol_count_prediction = 0; { U64 rec_range_count = 0; - if (sym != 0){ + if(sym != 0) + { rec_range_count += sym->sym_ranges.count; } - for (U64 i = 0; i < comp_unit_count; i += 1){ + for(U64 i = 0; i < comp_unit_count; i += 1) + { CV_SymParsed *unit_sym = sym_for_unit[i]; rec_range_count += unit_sym->sym_ranges.count; } symbol_count_prediction = rec_range_count/8; - if (symbol_count_prediction < 128){ + if(symbol_count_prediction < 128) + { symbol_count_prediction = 128; } } @@ -3215,7 +3504,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ { COFF_SectionHeader *coff_sec_ptr = coff_sections->sections; COFF_SectionHeader *coff_ptr_opl = coff_sec_ptr + coff_section_count; - for (;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1){ + for(;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) + { U64 sec_voff_max = coff_sec_ptr->voff + coff_sec_ptr->vsize; voff_max = Max(voff_max, sec_voff_max); } @@ -3236,7 +3526,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ { COFF_SectionHeader *coff_ptr = coff_sections->sections; COFF_SectionHeader *coff_opl = coff_ptr + coff_section_count; - for (;coff_ptr < coff_opl; coff_ptr += 1){ + for(;coff_ptr < coff_opl; coff_ptr += 1) + { char *name_first = (char*)coff_ptr->name; char *name_opl = name_first + sizeof(coff_ptr->name); String8 name = str8_cstring_capped(name_first, name_opl); @@ -3252,7 +3543,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // setup compilation units { PDB_CompUnit **units = comp_units->units; - for (U64 i = 0; i < comp_unit_count; i += 1){ + for(U64 i = 0; i < comp_unit_count; i += 1) + { PDB_CompUnit *unit = units[i]; CV_SymParsed *unit_sym = sym_for_unit[i]; CV_C13Parsed *unit_c13 = c13_for_unit[i]; @@ -3263,8 +3555,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 unit_name = raw_name; { U64 first_after_slashes = 0; - for (S64 i = unit_name.size - 1; i >= 0; i -= 1){ - if (unit_name.str[i] == '/' || unit_name.str[i] == '\\'){ + for(S64 i = unit_name.size - 1; i >= 0; i -= 1) + { + if(unit_name.str[i] == '/' || unit_name.str[i] == '\\') + { first_after_slashes = i + 1; break; } @@ -3274,9 +3568,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } String8 obj_name = raw_name; - if (str8_match(obj_name, str8_lit("* Linker *"), 0) || - str8_match(obj_name, str8_lit("Import:"), - StringMatchFlag_RightSideSloppy)){ + if(str8_match(obj_name, str8_lit("* Linker *"), 0) || + str8_match(obj_name, str8_lit("Import:"), + StringMatchFlag_RightSideSloppy)) + { MemoryZeroStruct(&obj_name); } @@ -3299,9 +3594,9 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ raddbgic_unit_set_info(root, unit_handle, &info); // unit's line info - for (CV_C13SubSectionNode *node = unit_c13->first_sub_section; - node != 0; - node = node->next) + for(CV_C13SubSectionNode *node = unit_c13->first_sub_section; + node != 0; + node = node->next) { if(node->kind == CV_C13_SubSectionKind_Lines) { @@ -3328,8 +3623,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ { PDB_CompUnitContribution *contrib_ptr = comp_unit_contributions->contributions; PDB_CompUnitContribution *contrib_opl = contrib_ptr + comp_unit_contribution_count; - for (;contrib_ptr < contrib_opl; contrib_ptr += 1){ - if (contrib_ptr->mod < root->unit_count){ + for(;contrib_ptr < contrib_opl; contrib_ptr += 1) + { + if(contrib_ptr->mod < root->unit_count) + { RADDBGIC_Unit *unit_handle = raddbgic_unit_handle_from_user_id(root, contrib_ptr->mod, contrib_ptr->mod); raddbgic_unit_vmap_add_range(root, unit_handle, contrib_ptr->voff_first, @@ -3364,21 +3661,25 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // conversion errors - if (!params->hide_errors.converting){ - for (RADDBGIC_Error *error = raddbgic_first_error_from_root(root); - error != 0; - error = error->next){ + if(!params->hide_errors.converting) + { + for(RADDBGIC_Error *error = raddbgic_first_error_from_root(root); + error != 0; + error = error->next) + { str8_list_push(arena, &out->errors, error->msg); } } } // dump - if (params->dump) ProfScope("dump"){ + if(params->dump) ProfScope("dump") + { String8List dump = {0}; // EXE - if (out->good_parse){ + if(out->good_parse) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" @@ -3390,8 +3691,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // MSF - if (params->dump_msf){ - if (msf != 0){ + if(params->dump_msf) + { + if(msf != 0) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" @@ -3403,7 +3706,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 *stream_ptr = msf->streams; U64 stream_count = msf->stream_count; - for (U64 i = 0; i < stream_count; i += 1, stream_ptr += 1){ + for(U64 i = 0; i < stream_count; i += 1, stream_ptr += 1) + { str8_list_pushf(arena, &dump, " stream[%u].size=%llu\n", i, stream_ptr->size); } @@ -3413,8 +3717,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // DBI - if (params->dump_sym){ - if (sym != 0){ + if(params->dump_sym) + { + if(sym != 0) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" @@ -3425,8 +3731,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // TPI - if (params->dump_tpi_hash){ - if (tpi_hash != 0){ + if(params->dump_tpi_hash) + { + if(tpi_hash != 0) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" @@ -3435,7 +3743,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ str8_list_push(arena, &dump, str8_lit("\n")); } - if (ipi_hash != 0){ + if(ipi_hash != 0) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" @@ -3446,8 +3755,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // LEAF - if (params->dump_leaf){ - if (tpi_leaf != 0){ + if(params->dump_leaf) + { + if(tpi_leaf != 0) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" @@ -3456,7 +3767,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ str8_list_push(arena, &dump, str8_lit("\n")); } - if (ipi_leaf != 0){ + if(ipi_leaf != 0) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" @@ -3467,14 +3779,17 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // BINARY SECTIONS - if (params->dump_coff_sections){ - if (coff_sections != 0){ + if(params->dump_coff_sections) + { + if(coff_sections != 0) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" "COFF SECTIONS:\n")); COFF_SectionHeader *section_ptr = coff_sections->sections; - for (U64 i = 0; i < coff_section_count; i += 1, section_ptr += 1){ + for(U64 i = 0; i < coff_section_count; i += 1, section_ptr += 1) + { // TODO(allen): probably should pull this out into a separate stringize path // for the coff section type char *first = (char*)section_ptr->name; @@ -3497,15 +3812,18 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // UNITS - if (comp_units != 0){ + if(comp_units != 0) + { B32 dump_sym = params->dump_sym; B32 dump_c13 = params->dump_c13; B32 dump_units = (dump_sym || dump_c13); - if (dump_units){ + if(dump_units) + { PDB_CompUnit **unit_ptr = comp_units->units; - for (U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1){ + for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n")); @@ -3513,10 +3831,12 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 group_name = (*unit_ptr)->group_name; str8_list_pushf(arena, &dump, "[%llu] %.*s\n(%.*s):\n", i, str8_varg(name), str8_varg(group_name)); - if (dump_sym){ + if(dump_sym) + { cv_stringize_sym_parsed(arena, &dump, sym_for_unit[i]); } - if (dump_c13){ + if(dump_c13) + { cv_stringize_c13_parsed(arena, &dump, c13_for_unit[i]); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -3525,14 +3845,17 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // UNIT CONTRIBUTIONS - if (comp_unit_contributions != 0){ - if (params->dump_contributions){ + if(comp_unit_contributions != 0) + { + if(params->dump_contributions) + { str8_list_push(arena, &dump, str8_lit("################################" "################################\n" "UNIT CONTRIBUTIONS:\n")); PDB_CompUnitContribution *contrib_ptr = comp_unit_contributions->contributions; - for (U64 i = 0; i < comp_unit_contribution_count; i += 1, contrib_ptr += 1){ + for(U64 i = 0; i < comp_unit_contribution_count; i += 1, contrib_ptr += 1) + { str8_list_pushf(arena, &dump, " { mod = %5u; voff_first = %08llx; voff_opl = %08llx; }\n", contrib_ptr->mod, contrib_ptr->voff_first, contrib_ptr->voff_opl); diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h index 094df987..14b8479a 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h @@ -5,18 +5,19 @@ #define RADDBGI_FROM_PDB_H //////////////////////////////// -//~ Program Parameters Type +//~ rjf: Conversion Parameters Type -typedef struct PDBCONV_Params{ +typedef struct PDBCONV_Params PDBCONV_Params; +struct PDBCONV_Params +{ String8 input_pdb_name; String8 input_pdb_data; - String8 input_exe_name; String8 input_exe_data; - String8 output_name; - struct{ + struct + { B8 input; B8 output; B8 parsing; @@ -36,73 +37,95 @@ typedef struct PDBCONV_Params{ B8 dump__last; String8List errors; -} PDBCONV_Params; +}; //////////////////////////////// -//~ Program Parameters Parser +//~ rjf: PDB Type & Symbol Info Translation Helper Types -static PDBCONV_Params *pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline); +//- rjf: typeid forward reference map -//////////////////////////////// -//~ PDB Type & Symbol Info Translation Helpers - -//- translation helper types -typedef struct PDBCONV_FwdNode{ - struct PDBCONV_FwdNode *next; +typedef struct PDBCONV_FwdNode PDBCONV_FwdNode; +struct PDBCONV_FwdNode +{ + PDBCONV_FwdNode *next; CV_TypeId key; CV_TypeId val; -} PDBCONV_FwdNode; +}; -typedef struct PDBCONV_FwdMap{ +typedef struct PDBCONV_FwdMap PDBCONV_FwdMap; +struct PDBCONV_FwdMap +{ PDBCONV_FwdNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 pair_count; -} PDBCONV_FwdMap; +}; -typedef struct PDBCONV_TypeRev{ - struct PDBCONV_TypeRev *next; +//- rjf: type revisit lists + +typedef struct PDBCONV_TypeRev PDBCONV_TypeRev; +struct PDBCONV_TypeRev +{ + PDBCONV_TypeRev *next; RADDBGIC_Type *owner_type; CV_TypeId field_itype; -} PDBCONV_TypeRev; +}; -typedef struct PDBCONV_FrameProcData{ +//- rjf: frame proc maps + +typedef struct PDBCONV_FrameProcData PDBCONV_FrameProcData; +struct PDBCONV_FrameProcData +{ U32 frame_size; CV_FrameprocFlags flags; -} PDBCONV_FrameProcData; +}; -typedef struct PDBCONV_FrameProcNode{ - struct PDBCONV_FrameProcNode *next; +typedef struct PDBCONV_FrameProcNode PDBCONV_FrameProcNode; +struct PDBCONV_FrameProcNode +{ + PDBCONV_FrameProcNode *next; RADDBGIC_Symbol *key; PDBCONV_FrameProcData data; -} PDBCONV_FrameProcNode; +}; -typedef struct PDBCONV_FrameProcMap{ +typedef struct PDBCONV_FrameProcMap PDBCONV_FrameProcMap; +struct PDBCONV_FrameProcMap +{ PDBCONV_FrameProcNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 pair_count; -} PDBCONV_FrameProcMap; +}; -typedef struct PDBCONV_ScopeNode{ - struct PDBCONV_ScopeNode *next; +//- rjf: scopes + +typedef struct PDBCONV_ScopeNode PDBCONV_ScopeNode; +struct PDBCONV_ScopeNode +{ + PDBCONV_ScopeNode *next; RADDBGIC_Scope *scope; RADDBGIC_Symbol *symbol; -} PDBCONV_ScopeNode; +}; -typedef struct PDBCONV_KnownGlobalNode{ - struct PDBCONV_KnownGlobalNode *next; +//- rjf: known global map + +typedef struct PDBCONV_KnownGlobalNode PDBCONV_KnownGlobalNode; +struct PDBCONV_KnownGlobalNode +{ + PDBCONV_KnownGlobalNode *next; String8 key_name; U64 key_voff; U64 hash; -} PDBCONV_KnownGlobalNode; +}; -typedef struct PDBCONV_KnownGlobalSet{ +typedef struct PDBCONV_KnownGlobalSet PDBCONV_KnownGlobalSet; +struct PDBCONV_KnownGlobalSet +{ PDBCONV_KnownGlobalNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 global_count; -} PDBCONV_KnownGlobalSet; +}; typedef struct PDBCONV_CtxParams PDBCONV_CtxParams; struct PDBCONV_CtxParams @@ -117,26 +140,34 @@ struct PDBCONV_CtxParams U64 link_name_map_bucket_count; }; -typedef struct PDBCONV_TypesSymbolsParams{ +typedef struct PDBCONV_TypesSymbolsParams PDBCONV_TypesSymbolsParams; +struct PDBCONV_TypesSymbolsParams +{ CV_SymParsed *sym; CV_SymParsed **sym_for_unit; U64 unit_count; -} PDBCONV_TypesSymbolsParams; +}; -typedef struct PDBCONV_LinkNameNode{ - struct PDBCONV_LinkNameNode *next; +typedef struct PDBCONV_LinkNameNode PDBCONV_LinkNameNode; +struct PDBCONV_LinkNameNode +{ + PDBCONV_LinkNameNode *next; U64 voff; String8 name; -} PDBCONV_LinkNameNode; +}; -typedef struct PDBCONV_LinkNameMap{ +typedef struct PDBCONV_LinkNameMap PDBCONV_LinkNameMap; +struct PDBCONV_LinkNameMap +{ PDBCONV_LinkNameNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 link_name_count; -} PDBCONV_LinkNameMap; +}; -typedef struct PDBCONV_Ctx{ +typedef struct PDBCONV_Ctx PDBCONV_Ctx; +struct PDBCONV_Ctx +{ Arena *arena; // INPUT data @@ -161,115 +192,7 @@ typedef struct PDBCONV_Ctx{ PDBCONV_ScopeNode *scope_node_free; PDBCONV_KnownGlobalSet known_globals; PDBCONV_LinkNameMap link_names; -} PDBCONV_Ctx; - -//- rjf: pdb conversion context creation -static PDBCONV_Ctx *pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root); - -//- pdb types and symbols -static void pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *params); - -//- decoding helpers -static U32 pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num); -static COFF_SectionHeader* pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U32 sec_num); - -//- type info - -// TODO(allen): explain the overarching pattern of PDB type info translation here -// 1. main passes (out of order necessity) & after -// 2. resolve forward -// 3. cons type info -// 4. "resolve itype" -// 5. equipping members & enumerates -// 6. equipping source coordinates - -// type info construction passes -static void pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx); - -static CV_TypeId pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype); -static RADDBGIC_Type* pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype); -static void pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owern_type, - CV_TypeId field_itype); -static void pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, - CV_TypeId field_itype); - -// type info construction helpers -static RADDBGIC_Type* pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype); -static RADDBGIC_Type* pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype); -static RADDBGIC_Type* pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype); -static void pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, - PDBCONV_Ctx *ctx, CV_TypeId arglist_itype); - -// type info resolution helpers -static RADDBGIC_Type* pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name); - -// type fwd map -static void pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, - CV_TypeId key, CV_TypeId val); -static CV_TypeId pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key); - - -//- symbol info - -// symbol info construction -static U64 pdbconv_hash_from_local_user_id(U64 sym_hash, U64 id); -static U64 pdbconv_hash_from_scope_user_id(U64 sym_hash, U64 id); -static U64 pdbconv_hash_from_symbol_user_id(U64 sym_hash, U64 id); -static void pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id); -static void pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym); - -// "frameproc" map -static void pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key, - PDBCONV_FrameProcData *data); -static PDBCONV_FrameProcData* pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key); - -// scope stack -static void pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); -static void pdbconv_symbol_pop_scope(PDBCONV_Ctx *ctx); -static void pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx); - -#define pdbconv_symbol_current_scope(ctx) \ -((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->scope) - -#define pdbconv_symbol_current_symbol(ctx) \ -((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->symbol) - -// PDB/C++ name parsing helper -static U64 pdbconv_end_of_cplusplus_container_name(String8 str); - -// global deduplication -static U64 pdbconv_known_global_hash(String8 name, U64 voff); - -static B32 pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff); -static void pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, - String8 name, U64 voff); - - -// location info helpers -static RADDBGIC_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, - RADDBGI_RegisterCode reg_code, - U32 reg_byte_size, - U32 reg_byte_pos, - S64 offset, - B32 extra_indirection); - -static CV_EncodedFramePtrReg pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, - RADDBGIC_Symbol *proc, - B32 param_base); - -static RADDBGI_RegisterCode pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, - CV_EncodedFramePtrReg encoded_reg); - -static void pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, - RADDBGIC_LocationSet *locset, - RADDBGIC_Location *location, - CV_LvarAddrRange *range, - CV_LvarAddrGap *gaps, U64 gap_count); - -// link names -static void pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, - U64 voff, String8 name); -static String8 pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff); +}; //////////////////////////////// //~ Conversion Output Type @@ -284,8 +207,117 @@ struct PDBCONV_Out }; //////////////////////////////// -//~ Conversion Path +//~ rjf: Command Line -> Conversion Parameters -static PDBCONV_Out *pdbconv_convert(Arena *arena, PDBCONV_Params *params); +internal PDBCONV_Params *pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline); + +//////////////////////////////// +//~ rjf: Conversion Implementation Helpers + +//- rjf: pdb conversion context creation +internal PDBCONV_Ctx *pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root); + +//- rjf: pdb types and symbols +internal void pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *params); + +//- rjf: decoding helpers +internal U32 pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num); +internal COFF_SectionHeader* pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U32 sec_num); + +//- rjf: type info +// +// TODO(allen): explain the overarching pattern of PDB type info translation here +// 1. main passes (out of order necessity) & after +// 2. resolve forward +// 3. cons type info +// 4. "resolve itype" +// 5. equipping members & enumerates +// 6. equipping source coordinates + +// type info construction passes +internal void pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx); +internal CV_TypeId pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype); +internal RADDBGIC_Type* pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype); +internal void pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owern_type, CV_TypeId field_itype); +internal void pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype); + +// type info construction helpers +internal RADDBGIC_Type* pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype); +internal RADDBGIC_Type* pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype); +internal RADDBGIC_Type* pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype); +internal void pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, + PDBCONV_Ctx *ctx, CV_TypeId arglist_itype); + +// type info resolution helpers +internal RADDBGIC_Type* pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name); + +// type fwd map +internal void pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, + CV_TypeId key, CV_TypeId val); +internal CV_TypeId pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key); + +//- rjf: symbol info + +// symbol info construction +internal U64 pdbconv_hash_from_local_user_id(U64 sym_hash, U64 id); +internal U64 pdbconv_hash_from_scope_user_id(U64 sym_hash, U64 id); +internal U64 pdbconv_hash_from_symbol_user_id(U64 sym_hash, U64 id); +internal void pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id); +internal void pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym); + +// "frameproc" map +internal void pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key, + PDBCONV_FrameProcData *data); +internal PDBCONV_FrameProcData* pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key); + +// scope stack +internal void pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); +internal void pdbconv_symbol_pop_scope(PDBCONV_Ctx *ctx); +internal void pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx); + +#define pdbconv_symbol_current_scope(ctx) ((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->scope) +#define pdbconv_symbol_current_symbol(ctx) ((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->symbol) + +// PDB/C++ name parsing helper +internal U64 pdbconv_end_of_cplusplus_container_name(String8 str); + +// global deduplication +internal U64 pdbconv_known_global_hash(String8 name, U64 voff); + +internal B32 pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff); +internal void pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, + String8 name, U64 voff); + + +// location info helpers +internal RADDBGIC_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, + RADDBGI_RegisterCode reg_code, + U32 reg_byte_size, + U32 reg_byte_pos, + S64 offset, + B32 extra_indirection); + +internal CV_EncodedFramePtrReg pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, + RADDBGIC_Symbol *proc, + B32 param_base); + +internal RADDBGI_RegisterCode pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, + CV_EncodedFramePtrReg encoded_reg); + +internal void pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, + RADDBGIC_LocationSet *locset, + RADDBGIC_Location *location, + CV_LvarAddrRange *range, + CV_LvarAddrGap *gaps, U64 gap_count); + +// link names +internal void pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, + U64 voff, String8 name); +internal String8 pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff); + +//////////////////////////////// +//~ rjf: Top-Level Conversion Entry Point + +internal PDBCONV_Out *pdbconv_convert(Arena *arena, PDBCONV_Params *params); #endif // RADDBGI_FROM_PDB_H diff --git a/src/regs/generated/regs.meta.h b/src/regs/generated/regs.meta.h index f1661343..5fa7be6f 100644 --- a/src/regs/generated/regs.meta.h +++ b/src/regs/generated/regs.meta.h @@ -85,7 +85,7 @@ REGS_RegCodeX64_ymm12, REGS_RegCodeX64_ymm13, REGS_RegCodeX64_ymm14, REGS_RegCodeX64_ymm15, -REGS_RegCodeX64_COUNT +REGS_RegCodeX64_COUNT, } REGS_RegCodeX64; typedef enum REGS_AliasCodeX64 @@ -170,7 +170,7 @@ REGS_AliasCodeX64_mm4, REGS_AliasCodeX64_mm5, REGS_AliasCodeX64_mm6, REGS_AliasCodeX64_mm7, -REGS_AliasCodeX64_COUNT +REGS_AliasCodeX64_COUNT, } REGS_AliasCodeX64; typedef enum REGS_RegCodeX86 @@ -236,7 +236,7 @@ REGS_RegCodeX86_ymm4, REGS_RegCodeX86_ymm5, REGS_RegCodeX86_ymm6, REGS_RegCodeX86_ymm7, -REGS_RegCodeX86_COUNT +REGS_RegCodeX86_COUNT, } REGS_RegCodeX86; typedef enum REGS_AliasCodeX86 @@ -277,7 +277,7 @@ REGS_AliasCodeX86_mm4, REGS_AliasCodeX86_mm5, REGS_AliasCodeX86_mm6, REGS_AliasCodeX86_mm7, -REGS_AliasCodeX86_COUNT +REGS_AliasCodeX86_COUNT, } REGS_AliasCodeX86; typedef struct REGS_RegBlockX64 REGS_RegBlockX64; diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index 5c5e7f59..073c1d93 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -299,18 +299,18 @@ REGS_ArchTable: //////////////////////////////// //~ rjf: X64 Generators -@table_gen_enum REGS_RegCodeX64: +@enum REGS_RegCodeX64: { - `REGS_RegCodeX64_NULL,`; - @expand(REGS_RegTableX64 a) `REGS_RegCodeX64_$(a.name),`; - `REGS_RegCodeX64_COUNT`; + NULL, + @expand(REGS_RegTableX64 a) `$(a.name)`, + COUNT, } -@table_gen_enum REGS_AliasCodeX64: +@enum REGS_AliasCodeX64: { - `REGS_AliasCodeX64_NULL,`; - @expand(REGS_AliasTableX64 a) `REGS_AliasCodeX64_$(a.name),`; - `REGS_AliasCodeX64_COUNT`; + NULL, + @expand(REGS_AliasTableX64 a) `$(a.name)`, + COUNT, } @table_gen_struct @@ -364,18 +364,18 @@ regs_g_alias_code_x64_slice_table: //////////////////////////////// //~ rjf: X86 Generators -@table_gen_enum REGS_RegCodeX86: +@enum REGS_RegCodeX86: { - `REGS_RegCodeX86_NULL,`; - @expand(REGS_RegTableX86 a) `REGS_RegCodeX86_$(a.name),`; - `REGS_RegCodeX86_COUNT`; + NULL, + @expand(REGS_RegTableX86 a) `$(a.name)`, + COUNT, } -@table_gen_enum REGS_AliasCodeX86: +@enum REGS_AliasCodeX86: { - `REGS_AliasCodeX86_NULL,`; - @expand(REGS_AliasTableX86 a) `REGS_AliasCodeX86_$(a.name),`; - `REGS_AliasCodeX86_COUNT`; + NULL, + @expand(REGS_AliasTableX86 a) `$(a.name)`, + COUNT, } @table_gen_struct diff --git a/src/render/d3d11/generated/render_d3d11.meta.h b/src/render/d3d11/generated/render_d3d11.meta.h index 8262fed9..2c0260e5 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.h +++ b/src/render/d3d11/generated/render_d3d11.meta.h @@ -13,7 +13,7 @@ R_D3D11_VShadKind_Blur, R_D3D11_VShadKind_Mesh, R_D3D11_VShadKind_Geo3DComposite, R_D3D11_VShadKind_Finalize, -R_D3D11_VShadKind_COUNT +R_D3D11_VShadKind_COUNT, } R_D3D11_VShadKind; typedef enum R_D3D11_PShadKind @@ -23,7 +23,7 @@ R_D3D11_PShadKind_Blur, R_D3D11_PShadKind_Mesh, R_D3D11_PShadKind_Geo3DComposite, R_D3D11_PShadKind_Finalize, -R_D3D11_PShadKind_COUNT +R_D3D11_PShadKind_COUNT, } R_D3D11_PShadKind; typedef enum R_D3D11_UniformTypeKind @@ -31,7 +31,7 @@ typedef enum R_D3D11_UniformTypeKind R_D3D11_UniformTypeKind_Rect, R_D3D11_UniformTypeKind_Blur, R_D3D11_UniformTypeKind_Mesh, -R_D3D11_UniformTypeKind_COUNT +R_D3D11_UniformTypeKind_COUNT, } R_D3D11_UniformTypeKind; read_only global String8 r_d3d11_g_rect_shader_src = diff --git a/src/render/d3d11/render_d3d11.mdesk b/src/render/d3d11/render_d3d11.mdesk index d5eb5317..99812ad9 100644 --- a/src/render/d3d11/render_d3d11.mdesk +++ b/src/render/d3d11/render_d3d11.mdesk @@ -462,25 +462,22 @@ ps_main(Vertex2Pixel v2p) : SV_TARGET //////////////////////////////// //~ rjf: Table Generators -@table_gen_enum -R_D3D11_VShadKind: +@enum R_D3D11_VShadKind: { - @expand(R_D3D11_VShadTable a) `R_D3D11_VShadKind_$(a.name),`; - `R_D3D11_VShadKind_COUNT`; + @expand(R_D3D11_VShadTable a) `$(a.name)`, + COUNT, } -@table_gen_enum -R_D3D11_PShadKind: +@enum R_D3D11_PShadKind: { - @expand(R_D3D11_PShadTable a) `R_D3D11_PShadKind_$(a.name),`; - `R_D3D11_PShadKind_COUNT`; + @expand(R_D3D11_PShadTable a) `$(a.name)`, + COUNT, } -@table_gen_enum -R_D3D11_UniformTypeKind: +@enum R_D3D11_UniformTypeKind: { - @expand(R_D3D11_UniformTypeTable a) `R_D3D11_UniformTypeKind_$(a.name),`; - `R_D3D11_UniformTypeKind_COUNT`; + @expand(R_D3D11_UniformTypeTable a) `$(a.name)`, + COUNT, } @c_file @table_gen_data(type:String8, fallback:`{0}`) diff --git a/src/render/generated/render.meta.h b/src/render/generated/render.meta.h index e2702d56..5daa7729 100644 --- a/src/render/generated/render.meta.h +++ b/src/render/generated/render.meta.h @@ -17,21 +17,21 @@ R_Tex2DFormat_RGBA16, R_Tex2DFormat_R32, R_Tex2DFormat_RG32, R_Tex2DFormat_RGBA32, -R_Tex2DFormat_COUNT +R_Tex2DFormat_COUNT, } R_Tex2DFormat; typedef enum R_Tex2DKind { R_Tex2DKind_Static, R_Tex2DKind_Dynamic, -R_Tex2DKind_COUNT +R_Tex2DKind_COUNT, } R_Tex2DKind; typedef enum R_Tex2DSampleKind { R_Tex2DSampleKind_Nearest, R_Tex2DSampleKind_Linear, -R_Tex2DSampleKind_COUNT +R_Tex2DSampleKind_COUNT, } R_Tex2DSampleKind; typedef enum R_GeoTopologyKind @@ -40,14 +40,14 @@ R_GeoTopologyKind_Lines, R_GeoTopologyKind_LineStrip, R_GeoTopologyKind_Triangles, R_GeoTopologyKind_TriangleStrip, -R_GeoTopologyKind_COUNT +R_GeoTopologyKind_COUNT, } R_GeoTopologyKind; typedef enum R_BufferKind { R_BufferKind_Static, R_BufferKind_Dynamic, -R_BufferKind_COUNT +R_BufferKind_COUNT, } R_BufferKind; typedef enum R_PassKind @@ -55,7 +55,7 @@ typedef enum R_PassKind R_PassKind_UI, R_PassKind_Blur, R_PassKind_Geo3D, -R_PassKind_COUNT +R_PassKind_COUNT, } R_PassKind; String8 r_tex2d_format_display_string_table[] = diff --git a/src/render/render_core.mdesk b/src/render/render_core.mdesk index 4ca54800..ce940922 100644 --- a/src/render/render_core.mdesk +++ b/src/render/render_core.mdesk @@ -59,40 +59,40 @@ R_PassKindTable: //////////////////////////////// //~ rjf: Generators -@table_gen_enum R_Tex2DFormat: +@enum R_Tex2DFormat: { - @expand(R_Tex2DFormatTable a) `R_Tex2DFormat_$(a.name),`; - `R_Tex2DFormat_COUNT`; + @expand(R_Tex2DFormatTable a) `$(a.name)`, + COUNT, } -@table_gen_enum R_Tex2DKind: +@enum R_Tex2DKind: { - @expand(R_Tex2DKindTable a) `R_Tex2DKind_$(a.name),`; - `R_Tex2DKind_COUNT`; + @expand(R_Tex2DKindTable a) `$(a.name)`, + COUNT, } -@table_gen_enum R_Tex2DSampleKind: +@enum R_Tex2DSampleKind: { - @expand(R_Tex2DSampleKindTable a) `R_Tex2DSampleKind_$(a.name),`; - `R_Tex2DSampleKind_COUNT`; + @expand(R_Tex2DSampleKindTable a) `$(a.name)`, + COUNT, } -@table_gen_enum R_GeoTopologyKind: +@enum R_GeoTopologyKind: { - @expand(R_GeoTopologyKindTable a) `R_GeoTopologyKind_$(a.name),`; - `R_GeoTopologyKind_COUNT`; + @expand(R_GeoTopologyKindTable a) `$(a.name)`, + COUNT, } -@table_gen_enum R_BufferKind: +@enum R_BufferKind: { - @expand(R_BufferKindTable a) `R_BufferKind_$(a.name),`; - `R_BufferKind_COUNT`; + @expand(R_BufferKindTable a) `$(a.name)`, + COUNT, } -@table_gen_enum R_PassKind: +@enum R_PassKind: { - @expand(R_PassKindTable a) `R_PassKind_$(a.name),`; - `R_PassKind_COUNT`; + @expand(R_PassKindTable a) `$(a.name)`, + COUNT, } @table_gen_data(type:String8) r_tex2d_format_display_string_table: diff --git a/src/type_graph/generated/type_graph.meta.h b/src/type_graph/generated/type_graph.meta.h index 34bdea1f..9089da71 100644 --- a/src/type_graph/generated/type_graph.meta.h +++ b/src/type_graph/generated/type_graph.meta.h @@ -63,14 +63,14 @@ TG_Kind_IncompleteEnum, TG_Kind_Bitfield, TG_Kind_Variadic, TG_Kind_COUNT, -TG_Kind_FirstBasic = TG_Kind_Void, -TG_Kind_LastBasic = TG_Kind_ComplexF128, -TG_Kind_FirstInteger = TG_Kind_Char8, -TG_Kind_LastInteger = TG_Kind_S512, -TG_Kind_FirstSigned1 = TG_Kind_Char8, -TG_Kind_LastSigned1 = TG_Kind_Char32, -TG_Kind_FirstSigned2 = TG_Kind_S8, -TG_Kind_LastSigned2 = TG_Kind_S512, +TG_Kind_FirstBasic = TG_Kind_Void, +TG_Kind_LastBasic = TG_Kind_ComplexF128, +TG_Kind_FirstInteger = TG_Kind_Char8, +TG_Kind_LastInteger = TG_Kind_S512, +TG_Kind_FirstSigned1 = TG_Kind_Char8, +TG_Kind_LastSigned1 = TG_Kind_Char32, +TG_Kind_FirstSigned2 = TG_Kind_S8, +TG_Kind_LastSigned2 = TG_Kind_S512, TG_Kind_FirstIncomplete = TG_Kind_IncompleteStruct, TG_Kind_LastIncomplete = TG_Kind_IncompleteEnum, } TG_Kind; diff --git a/src/type_graph/type_graph.mdesk b/src/type_graph/type_graph.mdesk index eac88139..7e9a0b83 100644 --- a/src/type_graph/type_graph.mdesk +++ b/src/type_graph/type_graph.mdesk @@ -67,21 +67,20 @@ TG_KindTable: //////////////////////////////// //~ rjf: Generators -@table_gen_enum -TG_Kind: +@enum TG_Kind: { - @expand(TG_KindTable a) `TG_Kind_$(a.name),`; - `TG_Kind_COUNT,`; - `TG_Kind_FirstBasic = TG_Kind_Void,`; - `TG_Kind_LastBasic = TG_Kind_ComplexF128,`; - `TG_Kind_FirstInteger = TG_Kind_Char8,`; - `TG_Kind_LastInteger = TG_Kind_S512,`; - `TG_Kind_FirstSigned1 = TG_Kind_Char8,`; - `TG_Kind_LastSigned1 = TG_Kind_Char32,`; - `TG_Kind_FirstSigned2 = TG_Kind_S8,`; - `TG_Kind_LastSigned2 = TG_Kind_S512,`; - `TG_Kind_FirstIncomplete = TG_Kind_IncompleteStruct,`; - `TG_Kind_LastIncomplete = TG_Kind_IncompleteEnum,`; + @expand(TG_KindTable a) `$(a.name)`, + COUNT, + `FirstBasic = TG_Kind_Void`, + `LastBasic = TG_Kind_ComplexF128`, + `FirstInteger = TG_Kind_Char8`, + `LastInteger = TG_Kind_S512`, + `FirstSigned1 = TG_Kind_Char8`, + `LastSigned1 = TG_Kind_Char32`, + `FirstSigned2 = TG_Kind_S8`, + `LastSigned2 = TG_Kind_S512`, + `FirstIncomplete = TG_Kind_IncompleteStruct`, + `LastIncomplete = TG_Kind_IncompleteEnum`, } @table_gen_data(type:U8, fallback:0) From 742d2387e28a7213e474c5c0e0739aa2282dea05 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 11:00:58 -0800 Subject: [PATCH 048/275] metagen: simplify metacode structs --- src/df/core/df_core.mdesk | 11 +++----- src/df/core/generated/df_core.meta.h | 1 + src/eval/eval.mdesk | 11 +++----- src/eval/generated/eval.meta.h | 38 ++++++++++++++-------------- src/metagen/metagen_main.c | 9 +++---- src/regs/regs.mdesk | 10 +++----- 6 files changed, 34 insertions(+), 46 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 8e69d123..38e533f9 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -1733,15 +1733,10 @@ DF_DevToggleTable: COUNT, } -@table_gen +@struct DF_CmdParams: { - `typedef struct DF_CmdParams DF_CmdParams;`; - `struct DF_CmdParams`; - `{`; - `U64 slot_props[(DF_CmdParamSlot_COUNT + 63) / 64];`; - @expand(DF_CmdParamSlotTable a) - `$(a.c_type) $(a.name_lower);`; - `};`; + `U64 slot_props[(DF_CmdParamSlot_COUNT + 63) / 64]`; + @expand(DF_CmdParamSlotTable a) `$(a.c_type) $(a.name_lower)`; } @table_gen_data(type:Rng1U64, fallback:0) diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index 9179a020..e230ae14 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -409,6 +409,7 @@ B32 prefer_dasm; B32 force_confirm; }; + DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index b285be9d..43656ef4 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -70,15 +70,10 @@ EVAL_ResultCodeTable: { MalformedBytecode "Malformed bytecode." } } -@table_gen +@enum(U32) EVAL_ExprKind: { - `typedef U32 EVAL_ExprKind;`; - `enum`; - `{`; - @expand(EVAL_ExprKindTable a) `EVAL_ExprKind_$(a.name),`; - `EVAL_ExprKind_COUNT`; - `};`; - ``; + @expand(EVAL_ExprKindTable a) `$(a.name)`, + COUNT, } @enum EVAL_ResultCode: diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 66153480..e05fae16 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -6,24 +6,8 @@ #ifndef EVAL_META_H #define EVAL_META_H -typedef enum EVAL_ResultCode -{ -EVAL_ResultCode_Good, -EVAL_ResultCode_DivideByZero, -EVAL_ResultCode_BadOp, -EVAL_ResultCode_BadOpTypes, -EVAL_ResultCode_BadMemRead, -EVAL_ResultCode_BadRegRead, -EVAL_ResultCode_BadFrameBase, -EVAL_ResultCode_BadModuleBase, -EVAL_ResultCode_BadTLSBase, -EVAL_ResultCode_InsufficientStackSpace, -EVAL_ResultCode_MalformedBytecode, -EVAL_ResultCode_COUNT, -} EVAL_ResultCode; - typedef U32 EVAL_ExprKind; -enum +typedef enum EVAL_ExprKindEnum { EVAL_ExprKind_ArrayIndex, EVAL_ExprKind_MemberAccess, @@ -64,8 +48,24 @@ EVAL_ExprKind_Array, EVAL_ExprKind_Func, EVAL_ExprKind_Define, EVAL_ExprKind_LeafIdent, -EVAL_ExprKind_COUNT -}; +EVAL_ExprKind_COUNT, +} EVAL_ExprKindEnum; + +typedef enum EVAL_ResultCode +{ +EVAL_ResultCode_Good, +EVAL_ResultCode_DivideByZero, +EVAL_ResultCode_BadOp, +EVAL_ResultCode_BadOpTypes, +EVAL_ResultCode_BadMemRead, +EVAL_ResultCode_BadRegRead, +EVAL_ResultCode_BadFrameBase, +EVAL_ResultCode_BadModuleBase, +EVAL_ResultCode_BadTLSBase, +EVAL_ResultCode_InsufficientStackSpace, +EVAL_ResultCode_MalformedBytecode, +EVAL_ResultCode_COUNT, +} EVAL_ResultCode; U8 eval_expr_kind_child_counts[] = { diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 1e022dd9..36e60cf7 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -142,7 +142,7 @@ int main(int argument_count, char **arguments) } ////////////////////////////// - //- rjf: generate table enums + //- rjf: generate enums // for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) { @@ -183,14 +183,14 @@ int main(int argument_count, char **arguments) } ////////////////////////////// - //- rjf: generate table structs + //- rjf: generate structs // for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) { MD_Node *file = n->v.root; for(MD_EachNode(node, file->first)) { - if(md_node_has_tag(node, str8_lit("table_gen_struct"), 0)) + if(md_node_has_tag(node, str8_lit("struct"), 0)) { String8 layer_key = mg_layer_key_from_path(file->string); MG_Layer *layer = mg_layer_from_key(layer_key); @@ -200,8 +200,7 @@ int main(int argument_count, char **arguments) for(String8Node *n = gen_strings.first; n != 0; n = n->next) { String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_push(mg_arena, &layer->structs, escaped); - str8_list_push(mg_arena, &layer->structs, str8_lit("\n")); + str8_list_pushf(mg_arena, &layer->structs, "%S;\n", escaped); } str8_list_pushf(mg_arena, &layer->structs, "};\n\n"); } diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index 073c1d93..ea5fbb82 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -313,10 +313,9 @@ REGS_ArchTable: COUNT, } -@table_gen_struct -REGS_RegBlockX64: +@struct REGS_RegBlockX64: { - @expand(REGS_RegTableX64 a) `REGS_Reg$(a.size) $(a.name);`; + @expand(REGS_RegTableX64 a) `REGS_Reg$(a.size) $(a.name)`, } @table_gen_data(type:REGS_UsageKind, fallback:`REGS_UsageKind_Normal`) @@ -378,10 +377,9 @@ regs_g_alias_code_x64_slice_table: COUNT, } -@table_gen_struct -REGS_RegBlockX86: +@struct REGS_RegBlockX86: { - @expand(REGS_RegTableX86 a) `REGS_Reg$(a.size) $(a.name);`; + @expand(REGS_RegTableX86 a) `REGS_Reg$(a.size) $(a.name)`, } @table_gen_data(type:REGS_UsageKind, fallback:`REGS_UsageKind_Normal`) From 1d9dc2b9a9e5a0ed065d83272baf829c7b8d1b5c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 11:16:45 -0800 Subject: [PATCH 049/275] metagen: simplify data tables --- src/ctrl/ctrl.mdesk | 28 +++---- src/df/core/df_core.mdesk | 76 +++++++----------- src/df/core/generated/df_core.meta.h | 1 - src/df/gfx/df_gfx.mdesk | 110 +++++++++++---------------- src/df/gfx/generated/df_gfx.meta.h | 2 +- src/eval/eval.mdesk | 19 ++--- src/metagen/metagen_main.c | 12 ++- src/os/gfx/os_gfx.mdesk | 10 +-- src/regs/regs.mdesk | 82 +++++++++----------- src/render/d3d11/render_d3d11.mdesk | 28 +++---- src/render/render_core.mdesk | 28 +++---- src/type_graph/type_graph.mdesk | 10 +-- 12 files changed, 171 insertions(+), 235 deletions(-) diff --git a/src/ctrl/ctrl.mdesk b/src/ctrl/ctrl.mdesk index c2518c54..af133ebc 100644 --- a/src/ctrl/ctrl.mdesk +++ b/src/ctrl/ctrl.mdesk @@ -56,30 +56,26 @@ CTRL_ExceptionCodeKindTable: COUNT, } -@table_gen_data(type:U32, fallback:0) -ctrl_exception_code_kind_code_table: +@data(U32) ctrl_exception_code_kind_code_table: { - `0,`; - @expand(CTRL_ExceptionCodeKindTable a) `$(a.code),`; + `0`; + @expand(CTRL_ExceptionCodeKindTable a) `$(a.code)`; } -@table_gen_data(type:String8, fallback:`{0}`) -ctrl_exception_code_kind_display_string_table: +@data(String8) ctrl_exception_code_kind_display_string_table: { - `{0},`; - @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)"),`; + `{0}`; + @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)")`; } -@table_gen_data(type:String8, fallback:`{0}`) -ctrl_exception_code_kind_lowercase_code_string_table: +@data(String8) ctrl_exception_code_kind_lowercase_code_string_table: { - `{0},`; - @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)"),`; + `{0}`; + @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)")`; } -@table_gen_data(type:B8, fallback:0) -ctrl_exception_code_kind_default_enable_table: +@data(B8) ctrl_exception_code_kind_default_enable_table: { - `0,`; - @expand(CTRL_ExceptionCodeKindTable a) `$(a.default),`; + `0`; + @expand(CTRL_ExceptionCodeKindTable a) `$(a.default)`; } diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 38e533f9..05ffc66c 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -1739,108 +1739,90 @@ DF_DevToggleTable: @expand(DF_CmdParamSlotTable a) `$(a.c_type) $(a.name_lower)`; } -@table_gen_data(type:Rng1U64, fallback:0) -df_g_cmd_param_slot_range_table: +@data(Rng1U64) df_g_cmd_param_slot_range_table: { - `{0},` - @expand(DF_CmdParamSlotTable a) - `{OffsetOf(DF_CmdParams, $(a.name_lower)), OffsetOf(DF_CmdParams, $(a.name_lower)) + sizeof($(a.c_type))},` + `{0}`, + @expand(DF_CmdParamSlotTable a) `{OffsetOf(DF_CmdParams, $(a.name_lower)), OffsetOf(DF_CmdParams, $(a.name_lower)) + sizeof($(a.c_type))}`, } //- rjf: entity kind tables -@table_gen_data(type: DF_IconKind, fallback: `DF_IconKind_Null`) -df_g_entity_kind_icon_kind_table: +@data(DF_IconKind) df_g_entity_kind_icon_kind_table: { - @expand(DF_EntityKindTable a) `DF_IconKind_$(a.icon_kind),`; + @expand(DF_EntityKindTable a) `DF_IconKind_$(a.icon_kind)`, } -@table_gen_data(type: String8, fallback: `{0}`) -df_g_entity_kind_display_string_table: +@data(String8) df_g_entity_kind_display_string_table: { - @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.display_string)"),`; + @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.display_string)")`, } -@table_gen_data(type: String8, fallback: `{0}`) -df_g_entity_kind_name_label_table: +@data(String8) df_g_entity_kind_name_label_table: { - @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_label)"),`; + @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_label)")`, } -@table_gen_data(type:DF_EntityKindFlags, fallback: `0`) -df_g_entity_kind_flags_table: +@data(DF_EntityKindFlags) df_g_entity_kind_flags_table: { - @expand(DF_EntityKindTable a) `($(a.lf_mut_user_cfg)*DF_EntityKindFlag_LeafMutationUserConfig | $(a.lf_mut_prof_cfg)*DF_EntityKindFlag_LeafMutationProfileConfig | $(a.lf_mut_halt)*DF_EntityKindFlag_LeafMutationSoftHalt | $(a.lf_mut_dbg)*DF_EntityKindFlag_LeafMutationDebugInfoMap | $(a.tr_mut_user_cfg)*DF_EntityKindFlag_TreeMutationUserConfig | $(a.tr_mut_prof_cfg)*DF_EntityKindFlag_TreeMutationProfileConfig | $(a.tr_mut_halt)*DF_EntityKindFlag_TreeMutationSoftHalt | $(a.tr_mut_dbg)*DF_EntityKindFlag_TreeMutationDebugInfoMap | $(a.name_is_code)*DF_EntityKindFlag_NameIsCode | $(a.user_lifetime)*DF_EntityKindFlag_UserDefinedLifetime),`; + @expand(DF_EntityKindTable a) `($(a.lf_mut_user_cfg)*DF_EntityKindFlag_LeafMutationUserConfig | $(a.lf_mut_prof_cfg)*DF_EntityKindFlag_LeafMutationProfileConfig | $(a.lf_mut_halt)*DF_EntityKindFlag_LeafMutationSoftHalt | $(a.lf_mut_dbg)*DF_EntityKindFlag_LeafMutationDebugInfoMap | $(a.tr_mut_user_cfg)*DF_EntityKindFlag_TreeMutationUserConfig | $(a.tr_mut_prof_cfg)*DF_EntityKindFlag_TreeMutationProfileConfig | $(a.tr_mut_halt)*DF_EntityKindFlag_TreeMutationSoftHalt | $(a.tr_mut_dbg)*DF_EntityKindFlag_TreeMutationDebugInfoMap | $(a.name_is_code)*DF_EntityKindFlag_NameIsCode | $(a.user_lifetime)*DF_EntityKindFlag_UserDefinedLifetime)`, } -@table_gen_data(type: DF_EntityOpFlags, fallback: `0`) -df_g_entity_kind_op_flags_table: +@data(DF_EntityOpFlags) df_g_entity_kind_op_flags_table: { - @expand(DF_EntityKindTable a) `($(a.op_delete)*DF_EntityOpFlag_Delete) | ($(a.op_freeze)*DF_EntityOpFlag_Freeze) | ($(a.op_edit)*DF_EntityOpFlag_Edit) | ($(a.op_rename)*DF_EntityOpFlag_Rename) | ($(a.op_enable)*DF_EntityOpFlag_Enable) | ($(a.op_cond)*DF_EntityOpFlag_Condition) | ($(a.op_dup)*DF_EntityOpFlag_Duplicate),`; + @expand(DF_EntityKindTable a) `($(a.op_delete)*DF_EntityOpFlag_Delete) | ($(a.op_freeze)*DF_EntityOpFlag_Freeze) | ($(a.op_edit)*DF_EntityOpFlag_Edit) | ($(a.op_rename)*DF_EntityOpFlag_Rename) | ($(a.op_enable)*DF_EntityOpFlag_Enable) | ($(a.op_cond)*DF_EntityOpFlag_Condition) | ($(a.op_dup)*DF_EntityOpFlag_Duplicate)`, } //- rjf: config source tables -@table_gen_data(type: String8, fallback: DF_CoreCmdKind_Null) -df_g_cfg_src_string_table: +@data(String8) df_g_cfg_src_string_table: { - @expand(DF_CfgSrcTable a) `str8_lit_comp("$(a.string)"),`; + @expand(DF_CfgSrcTable a) `str8_lit_comp("$(a.string)")`, } -@table_gen_data(type: DF_CoreCmdKind, fallback: DF_CoreCmdKind_Null) -df_g_cfg_src_load_cmd_kind_table: +@data(DF_CoreCmdKind) df_g_cfg_src_load_cmd_kind_table: { - @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.load_cmd),`; + @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.load_cmd)`, } -@table_gen_data(type: DF_CoreCmdKind, fallback: DF_CoreCmdKind_Null) -df_g_cfg_src_write_cmd_kind_table: +@data(DF_CoreCmdKind) df_g_cfg_src_write_cmd_kind_table: { - @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.write_cmd),`; + @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.write_cmd)`, } -@table_gen_data(type: DF_CoreCmdKind, fallback: DF_CoreCmdKind_Null) -df_g_cfg_src_apply_cmd_kind_table: +@data(DF_CoreCmdKind) df_g_cfg_src_apply_cmd_kind_table: { - @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.apply_cmd),`; + @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.apply_cmd)`; } //- rjf: core view rule function prototypes @table_gen { - ``; - @expand(DF_CoreViewRuleTable a) - `$(a.er == "x" -> "DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_CoreViewRuleTable a) - `$(a.vb == "x" -> "DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`; + @expand(DF_CoreViewRuleTable a) `$(a.er == "x" -> "DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`; + @expand(DF_CoreViewRuleTable a) `$(a.vb == "x" -> "DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`; } //- rjf: core command kind tables -@table_gen_data(type: DF_CmdSpecInfo, fallback: `{0}`) @c_file -df_g_core_cmd_kind_spec_info_table: +@data(DF_CmdSpecInfo) @c_file df_g_core_cmd_kind_spec_info_table: { @expand(DF_CoreCmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), (DF_CmdSpecFlag_OmitFromLists*$(a.lister_omit)), {DF_CmdParamSlot_$(a.q_slot), DF_EntityKind_$(a.q_ent_kind), (DF_CmdQueryFlag_AllowFiles*$(a.q_allow_files))|(DF_CmdQueryFlag_AllowFolders*$(a.q_allow_folders))|(DF_CmdQueryFlag_CodeInput*$(a.q_is_code))|(DF_CmdQueryFlag_KeepOldInput*$(a.q_keep_oi))|(DF_CmdQueryFlag_SelectOldInput*$(a.q_select_oi))|(DF_CmdQueryFlag_Required*$(a.q_required))}, DF_IconKind_$(a.canonical_icon)},```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), (DF_CmdSpecFlag_OmitFromLists*$(a.lister_omit)), {DF_CmdParamSlot_$(a.q_slot), DF_EntityKind_$(a.q_ent_kind), (DF_CmdQueryFlag_AllowFiles*$(a.q_allow_files))|(DF_CmdQueryFlag_AllowFolders*$(a.q_allow_folders))|(DF_CmdQueryFlag_CodeInput*$(a.q_is_code))|(DF_CmdQueryFlag_KeepOldInput*$(a.q_keep_oi))|(DF_CmdQueryFlag_SelectOldInput*$(a.q_select_oi))|(DF_CmdQueryFlag_Required*$(a.q_required))}, DF_IconKind_$(a.canonical_icon)}```; } //- rjf: core view rule tables -@table_gen_data(type: DF_CoreViewRuleSpecInfo, fallback: `{0}`) @c_file -df_g_core_view_rule_spec_info_table: +@data(DF_CoreViewRuleSpecInfo) @c_file df_g_core_view_rule_spec_info_table: { @expand(DF_CoreViewRuleTable a) - ```{str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.description)"), (DF_CoreViewRuleSpecInfoFlag_Inherited*$(a.ih == "x"))|(DF_CoreViewRuleSpecInfoFlag_Expandable*$(a.ex == "x"))|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*$(a.er == "x"))|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*$(a.vb == "x")), $(a.er == "x" -> "DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.er != "x" -> 0), $(a.vb == "x" -> "DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), },```; + ```{str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.description)"), (DF_CoreViewRuleSpecInfoFlag_Inherited*$(a.ih == "x"))|(DF_CoreViewRuleSpecInfoFlag_Expandable*$(a.ex == "x"))|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*$(a.er == "x"))|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*$(a.vb == "x")), $(a.er == "x" -> "DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.er != "x" -> 0), $(a.vb == "x" -> "DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```; } //- rjf: icon kinds -@table_gen_data(type: String8, fallback: `{0}`) -df_g_icon_kind_text_table: +@data(String8) df_g_icon_kind_text_table: { - @expand(DF_IconTable a) - `str8_lit_comp("$(a.text)"),`; + @expand(DF_IconTable a) `str8_lit_comp("$(a.text)")`; } //- rjf: instruction metadata table diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index e230ae14..9179a020 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -409,7 +409,6 @@ B32 prefer_dasm; B32 force_confirm; }; - DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index b23f55ae..bccbe663 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -420,118 +420,100 @@ DF_ThemePresetColorTable: //- rjf: theme preset color tables -@table_gen_data(type: String8, fallback: `{0}`) -df_g_theme_preset_display_string_table: +@data(String8) df_g_theme_preset_display_string_table: { - @expand(DF_ThemePresetTable a) `str8_lit_comp("$(a.display_string)"),`; + @expand(DF_ThemePresetTable a) `str8_lit_comp("$(a.display_string)")`, } -@table_gen_data(type: String8, fallback: `{0}`) -df_g_theme_preset_code_string_table: +@data(String8) df_g_theme_preset_code_string_table: { - @expand(DF_ThemePresetTable a) `str8_lit_comp("$(a.name_lower)"),`; + @expand(DF_ThemePresetTable a) `str8_lit_comp("$(a.name_lower)")`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__default_dark: +@data(Vec4F32) df_g_theme_preset_colors__default_dark: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.default_dark)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.default_dark))`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__default_light: +@data(Vec4F32) df_g_theme_preset_colors__default_light: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.default_light)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.default_light))`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__vs_dark: +@data(Vec4F32) df_g_theme_preset_colors__vs_dark: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.vs_dark)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.vs_dark))`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__vs_light: +@data(Vec4F32) df_g_theme_preset_colors__vs_light: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.vs_light)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.vs_light))`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__solarized_dark: +@data(Vec4F32) df_g_theme_preset_colors__solarized_dark: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.solarized_dark)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.solarized_dark))`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__solarized_light: +@data(Vec4F32) df_g_theme_preset_colors__solarized_light: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.solarized_light)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.solarized_light))`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__handmade_hero: +@data(Vec4F32) df_g_theme_preset_colors__handmade_hero: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.handmade_hero)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.handmade_hero))`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__four_coder: +@data(Vec4F32) df_g_theme_preset_colors__four_coder: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.four_coder)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.four_coder))`, } -@table_gen_data(type: Vec4F32, fallback: `{1, 0, 1, 1}`) -df_g_theme_preset_colors__far_manager: +@data(Vec4F32) df_g_theme_preset_colors__far_manager: { - @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.far_manager)),`; + @expand(DF_ThemePresetColorTable a) `rgba_from_u32_lit_comp($(a.far_manager))`; } -@table_gen_data(type: `Vec4F32 *`, fallback: `0`) -df_g_theme_preset_colors_table: +@data(`Vec4F32*`) df_g_theme_preset_colors_table: { - @expand(DF_ThemePresetTable a) `df_g_theme_preset_colors__$(a.name_lower),`; + @expand(DF_ThemePresetTable a) `df_g_theme_preset_colors__$(a.name_lower)`, } //- rjf: cmd param slot -> view spec tables -@table_gen_data(type: DF_CmdParamSlot, fallback:`DF_CmdParamSlot_Null`) -df_g_cmd_param_slot_2_view_spec_src_map: +@data(DF_CmdParamSlot) df_g_cmd_param_slot_2_view_spec_src_map: { - @expand(DF_CmdParamSlot2ViewSpecMap a) `DF_CmdParamSlot_$(a.slot),` + @expand(DF_CmdParamSlot2ViewSpecMap a) `DF_CmdParamSlot_$(a.slot)` } -@table_gen_data(type: String8, fallback:`{0}`) -df_g_cmd_param_slot_2_view_spec_dst_map: +@data(String8) df_g_cmd_param_slot_2_view_spec_dst_map: { - @expand(DF_CmdParamSlot2ViewSpecMap a) `str8_lit_comp("$(a.view_spec)"),` + @expand(DF_CmdParamSlot2ViewSpecMap a) `str8_lit_comp("$(a.view_spec)")` } -@table_gen_data(type: String8, fallback:`{0}`) -df_g_cmd_param_slot_2_view_spec_cmd_map: +@data(String8) df_g_cmd_param_slot_2_view_spec_cmd_map: { - @expand(DF_CmdParamSlot2ViewSpecMap a) `str8_lit_comp("$(a.opt_cmd_spec)"),` + @expand(DF_CmdParamSlot2ViewSpecMap a) `str8_lit_comp("$(a.opt_cmd_spec)")` } //- rjf: default bindings table -@table_gen_data(type: DF_StringBindingPair, fallback: `{0}`) -df_g_default_binding_table: +@data(DF_StringBindingPair) df_g_default_binding_table: { - @expand(DF_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_EventFlag_Ctrl`) $(a.shift != 0 -> `|OS_EventFlag_Shift`) $(a.alt != 0 -> `|OS_EventFlag_Alt`)}},```; + @expand(DF_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_EventFlag_Ctrl`) $(a.shift != 0 -> `|OS_EventFlag_Shift`) $(a.alt != 0 -> `|OS_EventFlag_Alt`)}}```; } //- rjf: binding version remap tables -@table_gen_data(type: String8, fallback: `{0}`) -df_g_binding_version_remap_old_name_table: +@data(String8) df_g_binding_version_remap_old_name_table: { - @expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.old_name)"),` + @expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.old_name)")` } -@table_gen_data(type: String8, fallback: `{0}`) -df_g_binding_version_remap_new_name_table: +@data(String8) df_g_binding_version_remap_new_name_table: { - @expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.new_name)"),` + @expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.new_name)")` } //- rjf: view hook forward declares @@ -561,33 +543,29 @@ df_g_binding_version_remap_new_name_table: //- rjf: gfx view rule tables -@table_gen_data(type: DF_GfxViewRuleSpecInfo, fallback: `{0}`) @c_file -df_g_gfx_view_rule_spec_info_table: +@data(DF_GfxViewRuleSpecInfo) @c_file df_g_gfx_view_rule_spec_info_table: { @expand(DF_GfxViewRuleTable a) - ```{ str8_lit_comp("$(a.string)"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*$(a.vr == "x"))|(DF_GfxViewRuleSpecInfoFlag_LineStringize*$(a.ls == "x"))|(DF_GfxViewRuleSpecInfoFlag_RowUI*$(a.ru == "x"))|(DF_GfxViewRuleSpecInfoFlag_BlockUI*$(a.bu == "x")), $(a.vr == "x" -> "DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vr != "x" -> 0), $(a.ls == "x" -> "DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME("..a.name_lower..")") $(a.ls != "x" -> 0), $(a.ru == "x" -> "DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME("..a.name_lower..")") $(a.ru != "x" -> 0), $(a.bu == "x" -> "DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME("..a.name_lower..")") $(a.bu != "x" -> 0), },```; + ```{ str8_lit_comp("$(a.string)"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*$(a.vr == "x"))|(DF_GfxViewRuleSpecInfoFlag_LineStringize*$(a.ls == "x"))|(DF_GfxViewRuleSpecInfoFlag_RowUI*$(a.ru == "x"))|(DF_GfxViewRuleSpecInfoFlag_BlockUI*$(a.bu == "x")), $(a.vr == "x" -> "DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vr != "x" -> 0), $(a.ls == "x" -> "DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME("..a.name_lower..")") $(a.ls != "x" -> 0), $(a.ru == "x" -> "DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME("..a.name_lower..")") $(a.ru != "x" -> 0), $(a.bu == "x" -> "DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME("..a.name_lower..")") $(a.bu != "x" -> 0), }```; } //- rjf: default view spec info table -@table_gen_data(type: DF_ViewSpecInfo, fallback: `{0}`) -df_g_gfx_view_kind_spec_info_table: +@data(DF_ViewSpecInfo) df_g_gfx_view_kind_spec_info_table: { - @expand(DF_GfxViewTable a) ```{(0|$(a.parameterized_by_entity)*DF_ViewSpecFlag_ParameterizedByEntity|$(a.can_serialize)*DF_ViewSpecFlag_CanSerialize|$(a.can_serialize_entity_path)*DF_ViewSpecFlag_CanSerializeEntityPath|$(a.can_filter)*DF_ViewSpecFlag_CanFilter|$(a.filter_is_code)*DF_ViewSpecFlag_FilterIsCode|$(a.typing_automatically_filters)*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.display_string)"), DF_NameKind_$(a.name_kind), DF_IconKind_$(a.icon), DF_VIEW_SETUP_FUNCTION_NAME($(a.name)), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME($(a.name)), DF_VIEW_CMD_FUNCTION_NAME($(a.name)), DF_VIEW_UI_FUNCTION_NAME($(a.name))},```; + @expand(DF_GfxViewTable a) ```{(0|$(a.parameterized_by_entity)*DF_ViewSpecFlag_ParameterizedByEntity|$(a.can_serialize)*DF_ViewSpecFlag_CanSerialize|$(a.can_serialize_entity_path)*DF_ViewSpecFlag_CanSerializeEntityPath|$(a.can_filter)*DF_ViewSpecFlag_CanFilter|$(a.filter_is_code)*DF_ViewSpecFlag_FilterIsCode|$(a.typing_automatically_filters)*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.display_string)"), DF_NameKind_$(a.name_kind), DF_IconKind_$(a.icon), DF_VIEW_SETUP_FUNCTION_NAME($(a.name)), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME($(a.name)), DF_VIEW_CMD_FUNCTION_NAME($(a.name)), DF_VIEW_UI_FUNCTION_NAME($(a.name))}```; } //- rjf: theme color tables -@table_gen_data(type: String8, fallback: `str8_lit_comp("")`) -df_g_theme_color_display_string_table: +@data(String8) df_g_theme_color_display_string_table: { - @expand(DF_ThemeTable a) `str8_lit_comp("$(a.display_name)"),`; + @expand(DF_ThemeTable a) `str8_lit_comp("$(a.display_name)")` } -@table_gen_data(type: String8, fallback: `str8_lit_comp("")`) -df_g_theme_color_cfg_string_table: +@data(String8) df_g_theme_color_cfg_string_table: { - @expand(DF_ThemeTable a) `str8_lit_comp("$(a.name_lower)"),`; + @expand(DF_ThemeTable a) `str8_lit_comp("$(a.name_lower)")` } //////////////////////////////// diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/df/gfx/generated/df_gfx.meta.h index ab8c3b8b..9976841a 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/df/gfx/generated/df_gfx.meta.h @@ -786,7 +786,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 * df_g_theme_preset_colors_table[] = +Vec4F32* df_g_theme_preset_colors_table[] = { df_g_theme_preset_colors__default_dark, df_g_theme_preset_colors__default_light, diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 43656ef4..2c0daa5e 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -82,26 +82,23 @@ EVAL_ResultCodeTable: COUNT, } -@table_gen_data(type:U8, fallback:0) -eval_expr_kind_child_counts: +@data(U8) eval_expr_kind_child_counts: { - @expand(EVAL_ExprKindTable a) `$(a.num_children),`; + @expand(EVAL_ExprKindTable a) `$(a.num_children)` } -@table_gen_data(type:String8, fallback:`{0}`) +@data(String8) eval_expr_kind_strings: { - @expand(EVAL_ExprKindTable a) `str8_lit_comp("$(a.name)"),`; + @expand(EVAL_ExprKindTable a) `str8_lit_comp("$(a.name)")` } -@table_gen_data(type:String8, fallback:`{0}`) -eval_result_code_display_strings: +@data(String8) eval_result_code_display_strings: { - @expand(EVAL_ResultCodeTable a) `str8_lit_comp("$(a.display_string)"),`; + @expand(EVAL_ResultCodeTable a) `str8_lit_comp("$(a.display_string)")` } -@table_gen_data(type:String8, fallback:`{0}`) -eval_expr_op_strings: +@data(String8) eval_expr_op_strings: { - @expand(EVAL_ExprKindTable a) `str8_lit_comp("$(a.op_string)"),`; + @expand(EVAL_ExprKindTable a) `str8_lit_comp("$(a.op_string)")` } diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 36e60cf7..d00d4403 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -215,21 +215,19 @@ int main(int argument_count, char **arguments) MD_Node *file = n->v.root; for(MD_EachNode(node, file->first)) { - MD_Node *tag = md_tag_from_string(node, str8_lit("table_gen_data"), 0); + MD_Node *tag = md_tag_from_string(node, str8_lit("data"), 0); if(!md_node_is_nil(tag)) { + String8 element_type = tag->first->string; String8 layer_key = mg_layer_key_from_path(file->string); MG_Layer *layer = mg_layer_from_key(layer_key); String8List *out = md_node_has_tag(node, str8_lit("c_file"), 0) ? &layer->c_tables : &layer->h_tables; - MD_Node *type = md_child_from_string(tag, str8_lit("type"), 0)->first; - MD_Node *fallback = md_child_from_string(tag, str8_lit("fallback"), 0)->first; - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, fallback->string, node); - str8_list_pushf(mg_arena, out, "%S %S[] =\n{\n", type->string, node->string); + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + str8_list_pushf(mg_arena, out, "%S %S[] =\n{\n", element_type, node->string); for(String8Node *n = gen_strings.first; n != 0; n = n->next) { String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_push(mg_arena, out, escaped); - str8_list_push(mg_arena, out, str8_lit("\n")); + str8_list_pushf(mg_arena, out, "%S,\n", escaped); } str8_list_push(mg_arena, out, str8_lit("};\n\n")); } diff --git a/src/os/gfx/os_gfx.mdesk b/src/os/gfx/os_gfx.mdesk index 532efc51..bb399f3c 100644 --- a/src/os/gfx/os_gfx.mdesk +++ b/src/os/gfx/os_gfx.mdesk @@ -161,14 +161,12 @@ OS_KeyTable: COUNT, } -@table_gen_data(type: String8, fallback:`{0}`) -os_g_key_display_string_table: +@data(String8) os_g_key_display_string_table: { - @expand(OS_KeyTable a) `str8_lit_comp("$(a.display_string)"),`; + @expand(OS_KeyTable a) `str8_lit_comp("$(a.display_string)")`; } -@table_gen_data(type: String8, fallback:`{0}`) -os_g_key_cfg_string_table: +@data(String8) os_g_key_cfg_string_table: { - @expand(OS_KeyTable a) `str8_lit_comp("$(a.cfg_string)"),`; + @expand(OS_KeyTable a) `str8_lit_comp("$(a.cfg_string)")`; } diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index ea5fbb82..2a0499f6 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -318,46 +318,41 @@ REGS_ArchTable: @expand(REGS_RegTableX64 a) `REGS_Reg$(a.size) $(a.name)`, } -@table_gen_data(type:REGS_UsageKind, fallback:`REGS_UsageKind_Normal`) -regs_g_reg_code_x64_usage_kind_table: +@data(REGS_UsageKind) regs_g_reg_code_x64_usage_kind_table: { - `REGS_UsageKind_Normal,`; - @expand(REGS_RegTableX64 a) `REGS_UsageKind_$(a.usage),`; + `REGS_UsageKind_Normal`; + @expand(REGS_RegTableX64 a) `REGS_UsageKind_$(a.usage)`; } -@table_gen_data(type:REGS_UsageKind, fallback:`REGS_UsageKind_Normal`) +@data(REGS_UsageKind) regs_g_alias_code_x64_usage_kind_table: { - `REGS_UsageKind_Normal,`; - @expand(REGS_AliasTableX64 a) `REGS_UsageKind_$(a.usage),`; + `REGS_UsageKind_Normal`; + @expand(REGS_AliasTableX64 a) `REGS_UsageKind_$(a.usage)`; } -@table_gen_data(type:String8, fallback:`{0}`) -regs_g_reg_code_x64_string_table: +@data(String8) regs_g_reg_code_x64_string_table: { - `str8_lit_comp(""),`; - @expand(REGS_RegTableX64 a) `str8_lit_comp("$(a.name)"),`; + `str8_lit_comp("")`; + @expand(REGS_RegTableX64 a) `str8_lit_comp("$(a.name)")`; } -@table_gen_data(type:String8, fallback:`{0}`) -regs_g_alias_code_x64_string_table: +@data(String8) regs_g_alias_code_x64_string_table: { - `str8_lit_comp(""),`; - @expand(REGS_AliasTableX64 a) `str8_lit_comp("$(a.name)"),`; + `str8_lit_comp("")`; + @expand(REGS_AliasTableX64 a) `str8_lit_comp("$(a.name)")`; } -@table_gen_data(type: REGS_Rng, fallback: `{0}`) -regs_g_reg_code_x64_rng_table: +@data(REGS_Rng) regs_g_reg_code_x64_rng_table: { - `{0},`; - @expand(REGS_RegTableX64 a) `{(U16)OffsetOf(REGS_RegBlockX64, $(a.name)), $(a.size/8)},`, + `{0}`; + @expand(REGS_RegTableX64 a) `{(U16)OffsetOf(REGS_RegBlockX64, $(a.name)), $(a.size/8)}`, } -@table_gen_data(type: REGS_Slice, fallback: `{0}`) -regs_g_alias_code_x64_slice_table: +@data(REGS_Slice) regs_g_alias_code_x64_slice_table: { - `{0},`; - @expand(REGS_AliasTableX64 a) `{REGS_RegCodeX64_$(a.base), $(a.off/8), $(a.size/8)},`, + `{0}`; + @expand(REGS_AliasTableX64 a) `{REGS_RegCodeX64_$(a.base), $(a.off/8), $(a.size/8)}`, } //////////////////////////////// @@ -382,46 +377,41 @@ regs_g_alias_code_x64_slice_table: @expand(REGS_RegTableX86 a) `REGS_Reg$(a.size) $(a.name)`, } -@table_gen_data(type:REGS_UsageKind, fallback:`REGS_UsageKind_Normal`) +@data(REGS_UsageKind) regs_g_reg_code_x86_usage_kind_table: { - `REGS_UsageKind_Normal,`; - @expand(REGS_RegTableX86 a) `REGS_UsageKind_$(a.usage),`; + `REGS_UsageKind_Normal`; + @expand(REGS_RegTableX86 a) `REGS_UsageKind_$(a.usage)`; } -@table_gen_data(type:REGS_UsageKind, fallback:`REGS_UsageKind_Normal`) -regs_g_alias_code_x86_usage_kind_table: +@data(REGS_UsageKind) regs_g_alias_code_x86_usage_kind_table: { - `REGS_UsageKind_Normal,`; - @expand(REGS_AliasTableX86 a) `REGS_UsageKind_$(a.usage),`; + `REGS_UsageKind_Normal`; + @expand(REGS_AliasTableX86 a) `REGS_UsageKind_$(a.usage)`; } -@table_gen_data(type:String8, fallback:`{0}`) -regs_g_reg_code_x86_string_table: +@data(String8) regs_g_reg_code_x86_string_table: { - `str8_lit_comp(""),`; - @expand(REGS_RegTableX86 a) `str8_lit_comp("$(a.name)"),`; + `str8_lit_comp("")`; + @expand(REGS_RegTableX86 a) `str8_lit_comp("$(a.name)")`; } -@table_gen_data(type:String8, fallback:`{0}`) -regs_g_alias_code_x86_string_table: +@data(String8) regs_g_alias_code_x86_string_table: { - `str8_lit_comp(""),`; - @expand(REGS_AliasTableX86 a) `str8_lit_comp("$(a.name)"),`; + `str8_lit_comp("")`; + @expand(REGS_AliasTableX86 a) `str8_lit_comp("$(a.name)")`; } -@table_gen_data(type: REGS_Rng, fallback: `{0}`) -regs_g_reg_code_x86_rng_table: +@data(REGS_Rng) regs_g_reg_code_x86_rng_table: { - `{0},`; - @expand(REGS_RegTableX86 a) `{(U16)OffsetOf(REGS_RegBlockX86, $(a.name)), $(a.size/8)},`, + `{0}`; + @expand(REGS_RegTableX86 a) `{(U16)OffsetOf(REGS_RegBlockX86, $(a.name)), $(a.size/8)}`, } -@table_gen_data(type: REGS_Slice, fallback: `{0}`) -regs_g_alias_code_x86_slice_table: +@data(REGS_Slice) regs_g_alias_code_x86_slice_table: { - `{0},`; - @expand(REGS_AliasTableX86 a) `{REGS_RegCodeX86_$(a.base), $(a.off/8), $(a.size/8)},`, + `{0}`; + @expand(REGS_AliasTableX86 a) `{REGS_RegCodeX86_$(a.base), $(a.off/8), $(a.size/8)}`, } //////////////////////////////// diff --git a/src/render/d3d11/render_d3d11.mdesk b/src/render/d3d11/render_d3d11.mdesk index 99812ad9..ac7d953c 100644 --- a/src/render/d3d11/render_d3d11.mdesk +++ b/src/render/d3d11/render_d3d11.mdesk @@ -480,44 +480,44 @@ ps_main(Vertex2Pixel v2p) : SV_TARGET COUNT, } -@c_file @table_gen_data(type:String8, fallback:`{0}`) +@c_file @data(String8) r_d3d11_g_vshad_kind_source_table: { - @expand(R_D3D11_VShadTable a) `$(a.source),`; + @expand(R_D3D11_VShadTable a) `$(a.source)`; } -@c_file @table_gen_data(type:String8, fallback:`{0}`) +@c_file @data(String8) r_d3d11_g_vshad_kind_source_name_table: { - @expand(R_D3D11_VShadTable a) `str8_lit_comp("$(a.source)"),`; + @expand(R_D3D11_VShadTable a) `str8_lit_comp("$(a.source)")`; } -@c_file @table_gen_data(type:`D3D11_INPUT_ELEMENT_DESC *`, fallback:`0`) +@c_file @data(`D3D11_INPUT_ELEMENT_DESC *`) r_d3d11_g_vshad_kind_elements_ptr_table: { - @expand(R_D3D11_VShadTable a) `$(a.ilay_table),`; + @expand(R_D3D11_VShadTable a) `$(a.ilay_table)`; } -@c_file @table_gen_data(type:U64, fallback:`0`) +@c_file @data(U64) r_d3d11_g_vshad_kind_elements_count_table: { - @expand(R_D3D11_VShadTable a) `$(a.ilay_table != 0 -> "ArrayCount("..a.ilay_table..")") $(a.ilay_table == 0 -> "0"),`; + @expand(R_D3D11_VShadTable a) `$(a.ilay_table != 0 -> "ArrayCount("..a.ilay_table..")") $(a.ilay_table == 0 -> "0")`; } -@c_file @table_gen_data(type:String8, fallback:`{0}`) +@c_file @data(String8) r_d3d11_g_pshad_kind_source_table: { - @expand(R_D3D11_PShadTable a) `$(a.source),`; + @expand(R_D3D11_PShadTable a) `$(a.source)`; } -@c_file @table_gen_data(type:String8, fallback:`{0}`) +@c_file @data(String8) r_d3d11_g_pshad_kind_source_name_table: { - @expand(R_D3D11_PShadTable a) `str8_lit_comp("$(a.source)"),`; + @expand(R_D3D11_PShadTable a) `str8_lit_comp("$(a.source)")`; } -@c_file @table_gen_data(type:U64, fallback:`0`) +@c_file @data(U64) r_d3d11_g_uniform_type_kind_size_table: { - @expand(R_D3D11_UniformTypeTable a) `sizeof(R_D3D11_Uniforms_$(a.name)),`; + @expand(R_D3D11_UniformTypeTable a) `sizeof(R_D3D11_Uniforms_$(a.name))`; } diff --git a/src/render/render_core.mdesk b/src/render/render_core.mdesk index ce940922..ba3eff73 100644 --- a/src/render/render_core.mdesk +++ b/src/render/render_core.mdesk @@ -95,37 +95,37 @@ R_PassKindTable: COUNT, } -@table_gen_data(type:String8) r_tex2d_format_display_string_table: +@data(String8) r_tex2d_format_display_string_table: { - @expand(R_Tex2DFormatTable a) `str8_lit_comp("$(a.display_string)"),`; + @expand(R_Tex2DFormatTable a) `str8_lit_comp("$(a.display_string)")`; } -@table_gen_data(type:U8) r_tex2d_format_bytes_per_pixel_table: +@data(U8) r_tex2d_format_bytes_per_pixel_table: { - @expand(R_Tex2DFormatTable a) `$(a.bytes_per_pixel),`; + @expand(R_Tex2DFormatTable a) `$(a.bytes_per_pixel)`; } -@table_gen_data(type:String8) r_tex2d_kind_display_string_table: +@data(String8) r_tex2d_kind_display_string_table: { - @expand(R_Tex2DKindTable a) `str8_lit_comp("$(a.display_string)"),`; + @expand(R_Tex2DKindTable a) `str8_lit_comp("$(a.display_string)")`; } -@table_gen_data(type:String8) r_tex2d_sample_kind_display_string_table: +@data(String8) r_tex2d_sample_kind_display_string_table: { - @expand(R_Tex2DSampleKindTable a) `str8_lit_comp("$(a.display_string)"),`; + @expand(R_Tex2DSampleKindTable a) `str8_lit_comp("$(a.display_string)")`; } -@table_gen_data(type:String8) r_pass_kind_display_string_table: +@data(String8) r_pass_kind_display_string_table: { - @expand(R_PassKindTable a) `str8_lit_comp("$(a.display_string)"),`; + @expand(R_PassKindTable a) `str8_lit_comp("$(a.display_string)")`; } -@table_gen_data(type:U8) r_pass_kind_batch_table: +@data(U8) r_pass_kind_batch_table: { - @expand(R_PassKindTable a) `$(a.batch),`; + @expand(R_PassKindTable a) `$(a.batch)`; } -@table_gen_data(type:U64) @c_file r_pass_kind_params_size_table: +@data(U64) @c_file r_pass_kind_params_size_table: { - @expand(R_PassKindTable a) `sizeof(R_PassParams_$(a.name)),`; + @expand(R_PassKindTable a) `sizeof(R_PassParams_$(a.name))`; } diff --git a/src/type_graph/type_graph.mdesk b/src/type_graph/type_graph.mdesk index 7e9a0b83..ec342cdf 100644 --- a/src/type_graph/type_graph.mdesk +++ b/src/type_graph/type_graph.mdesk @@ -83,14 +83,12 @@ TG_KindTable: `LastIncomplete = TG_Kind_IncompleteEnum`, } -@table_gen_data(type:U8, fallback:0) -tg_kind_basic_byte_size_table: +@data(U8) tg_kind_basic_byte_size_table: { - @expand(TG_KindTable a) `$(a.basic_byte_size),`; + @expand(TG_KindTable a) `$(a.basic_byte_size)`; } -@table_gen_data(type:String8, fallback:`{0}`) -tg_kind_basic_string_table: +@data(String8) tg_kind_basic_string_table: { - @expand(TG_KindTable a) `str8_lit_comp("$(a.basic_string)"),`; + @expand(TG_KindTable a) `str8_lit_comp("$(a.basic_string)")`; } From 348e93162a6ef5da25437b5c3d8de6fe31ce49fc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 11:26:31 -0800 Subject: [PATCH 050/275] metagen: simplify & unify error gathering & printing path --- src/metagen/metagen.c | 12 ++++++++++++ src/metagen/metagen.h | 31 +++++++++++++++++++++++++++++++ src/metagen/metagen_main.c | 28 ++++++++++++++++++++-------- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/metagen/metagen.c b/src/metagen/metagen.c index 73fe8a35..838328c5 100644 --- a/src/metagen/metagen.c +++ b/src/metagen/metagen.c @@ -112,6 +112,18 @@ mg_txt_pt_from_string_off(String8 string, U64 off) return pt; } +//////////////////////////////// +//~ rjf: Message Lists + +internal void +mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg) +{ + MG_MsgNode *n = push_array(arena, MG_MsgNode, 1); + MemoryCopyStruct(&n->v, msg); + SLLQueuePush(msgs->first, msgs->last, n); + msgs->count += 1; +} + //////////////////////////////// //~ rjf: String Escaping diff --git a/src/metagen/metagen.h b/src/metagen/metagen.h index 3c86bce6..d15fbe74 100644 --- a/src/metagen/metagen.h +++ b/src/metagen/metagen.h @@ -4,6 +4,32 @@ #ifndef METAGEN_H #define METAGEN_H +//////////////////////////////// +//~ rjf: Message Type + +typedef struct MG_Msg MG_Msg; +struct MG_Msg +{ + String8 location; + String8 kind; + String8 msg; +}; + +typedef struct MG_MsgNode MG_MsgNode; +struct MG_MsgNode +{ + MG_MsgNode *next; + MG_Msg v; +}; + +typedef struct MG_MsgList MG_MsgList; +struct MG_MsgList +{ + MG_MsgNode *first; + MG_MsgNode *last; + U64 count; +}; + //////////////////////////////// //~ rjf: Parse Artifact Types @@ -230,6 +256,11 @@ read_only global MG_StrExpr mg_str_expr_nil = {&mg_str_expr_nil, &mg_str_expr_ni internal U64 mg_hash_from_string(String8 string); internal TxtPt mg_txt_pt_from_string_off(String8 string, U64 off); +//////////////////////////////// +//~ rjf: Message Lists + +internal void mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg); + //////////////////////////////// //~ rjf: String Escaping diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index d00d4403..36d47408 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -28,6 +28,7 @@ int main(int argument_count, char **arguments) ////////////////////////////// //- rjf: set up state // + MG_MsgList msgs = {0}; mg_arena = arena_alloc__sized(GB(64), MB(64)); mg_state = push_array(mg_arena, MG_State, 1); mg_state->slots_count = 256; @@ -91,15 +92,11 @@ int main(int argument_count, char **arguments) String8 data = os_data_from_file_path(mg_arena, file_path); MD_TokenizeResult tokenize = md_tokenize_from_text(mg_arena, data); MD_ParseResult parse = md_parse_from_text_tokens(mg_arena, file_path, data, tokenize.tokens); - MG_FileParseNode *parse_n = push_array(mg_arena, MG_FileParseNode, 1); - SLLQueuePush(parses.first, parses.last, parse_n); - parse_n->v.root = parse.root; - parses.count += 1; - for(MD_Msg *msg = parse.msgs.first; msg != 0; msg = msg->next) + for(MD_Msg *m = parse.msgs.first; m != 0; m = m->next) { - TxtPt pt = mg_txt_pt_from_string_off(data, msg->node->src_offset); + TxtPt pt = mg_txt_pt_from_string_off(data, m->node->src_offset); String8 msg_kind_string = {0}; - switch(msg->kind) + switch(m->kind) { default:{}break; case MD_MsgKind_Note: {msg_kind_string = str8_lit("note");}break; @@ -107,8 +104,14 @@ int main(int argument_count, char **arguments) case MD_MsgKind_Error: {msg_kind_string = str8_lit("error");}break; case MD_MsgKind_FatalError: {msg_kind_string = str8_lit("fatal error");}break; } - fprintf(stderr, "%.*s:%i:%i: %.*s: %.*s\n", str8_varg(file_path), (int)pt.line, (int)pt.column, str8_varg(msg_kind_string), str8_varg(msg->string)); + String8 location = push_str8f(mg_arena, "%S:%I64d:%I64d", file_path, pt.line, pt.column); + MG_Msg dst_m = {location, msg_kind_string, m->string}; + mg_msg_list_push(mg_arena, &msgs, &dst_m); } + MG_FileParseNode *parse_n = push_array(mg_arena, MG_FileParseNode, 1); + SLLQueuePush(parses.first, parses.last, parse_n); + parse_n->v.root = parse.root; + parses.count += 1; } } } @@ -429,5 +432,14 @@ int main(int argument_count, char **arguments) } } + ////////////////////////////// + //- rjf: write out all messages to stderr + // + for(MG_MsgNode *n = msgs.first; n != 0; n = n->next) + { + MG_Msg *msg = &n->v; + fprintf(stderr, "%.*s: %.*s: %.*s\n", str8_varg(msg->location), str8_varg(msg->kind), str8_varg(msg->msg)); + } + return 0; } From 9c7fd0a4119211b2ff7f7bdd98285100f2eee4c1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 11:38:43 -0800 Subject: [PATCH 051/275] metagen: simplify & straighten out table generation further; raddbgi_cons: fix incorrect str8_list_join --- src/ctrl/ctrl_core.c | 5 + src/ctrl/generated/ctrl.meta.c | 171 ++++ src/ctrl/generated/ctrl.meta.h | 174 +--- src/df/core/generated/df_core.meta.c | 290 +++++- src/df/core/generated/df_core.meta.h | 296 +----- src/df/gfx/generated/df_gfx.meta.c | 852 ++++++++++++++++- src/df/gfx/generated/df_gfx.meta.h | 870 +----------------- src/draw/generated/draw.meta.c | 3 + src/draw/generated/draw.meta.h | 2 + src/eval/eval_core.c | 5 + src/eval/generated/eval.meta.c | 147 +++ src/eval/generated/eval.meta.h | 150 +-- src/lib_raddbgi_cons/raddbgi_cons.c | 6 +- src/metagen/metagen_main.c | 17 +- src/os/gfx/generated/os_gfx.meta.c | 297 ++++++ src/os/gfx/generated/os_gfx.meta.h | 298 +----- src/os/gfx/os_gfx.c | 5 + src/regs/generated/regs.meta.c | 813 ++++++++++++++++ src/regs/generated/regs.meta.h | 824 +---------------- .../raddbgi/generated/regs_raddbgi.meta.c | 3 + .../raddbgi/generated/regs_raddbgi.meta.h | 2 + .../d3d11/generated/render_d3d11.meta.c | 17 +- .../d3d11/generated/render_d3d11.meta.h | 2 + src/render/generated/render.meta.c | 57 +- src/render/generated/render.meta.h | 60 +- src/type_graph/generated/type_graph.meta.c | 119 +++ src/type_graph/generated/type_graph.meta.h | 120 +-- src/type_graph/type_graph.c | 5 + src/ui/generated/ui.meta.c | 3 + src/ui/generated/ui.meta.h | 2 + 30 files changed, 2882 insertions(+), 2733 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 62e303ab..767ec495 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/ctrl.meta.c" + //////////////////////////////// //~ rjf: Main Layer Initialization diff --git a/src/ctrl/generated/ctrl.meta.c b/src/ctrl/generated/ctrl.meta.c index b9d27fe6..e36c61bf 100644 --- a/src/ctrl/generated/ctrl.meta.c +++ b/src/ctrl/generated/ctrl.meta.c @@ -3,3 +3,174 @@ //- GENERATED CODE +C_LINKAGE_BEGIN +U32 ctrl_exception_code_kind_code_table[38] = +{ +0, +0x40010005, +0x40010008, +0x40080201, +0x40080202, +0x0000071a, +0x80000002, +0xc0000005, +0xc0000006, +0xc0000008, +0xc0000017, +0xc000001d, +0xc0000025, +0xc0000026, +0xc000008c, +0xc000008d, +0xc000008e, +0xc000008f, +0xc0000090, +0xc0000091, +0xc0000092, +0xc0000093, +0xc0000094, +0xc0000095, +0xc0000096, +0xc00000fd, +0xc0000135, +0xc0000138, +0xc0000139, +0xc0000142, +0xc00002b4, +0xc00002b5, +0xc0000420, +0xc06d007e, +0xc06d007f, +0xe073616e, +0xe0736171, +0x0000087a, +}; + +String8 ctrl_exception_code_kind_display_string_table[38] = +{ +{0}, +str8_lit_comp("(Win32) Control-C"), +str8_lit_comp("(Win32) Control-Break"), +str8_lit_comp("(Win32) WinRT Originate Error"), +str8_lit_comp("(Win32) WinRT Transform Error"), +str8_lit_comp("(Win32) RPC Call Cancelled"), +str8_lit_comp("(Win32) Data Type Misalignment"), +str8_lit_comp("(Win32) Access Violation"), +str8_lit_comp("(Win32) In Page Error"), +str8_lit_comp("(Win32) Invalid Handle Specified"), +str8_lit_comp("(Win32) Not Enough Quota"), +str8_lit_comp("(Win32) Illegal Instruction"), +str8_lit_comp("(Win32) Cannot Continue From Exception"), +str8_lit_comp("(Win32) Invalid Exception Disposition Returned By Handler"), +str8_lit_comp("(Win32) Array Bounds Exceeded"), +str8_lit_comp("(Win32) Floating-Point Denormal Operand"), +str8_lit_comp("(Win32) Floating-Point Division By Zero"), +str8_lit_comp("(Win32) Floating-Point Inexact Result"), +str8_lit_comp("(Win32) Floating-Point Invalid Operation"), +str8_lit_comp("(Win32) Floating-Point Overflow"), +str8_lit_comp("(Win32) Floating-Point Stack Check"), +str8_lit_comp("(Win32) Floating-Point Underflow"), +str8_lit_comp("(Win32) Integer Division By Zero"), +str8_lit_comp("(Win32) Integer Overflow"), +str8_lit_comp("(Win32) Privileged Instruction"), +str8_lit_comp("(Win32) Stack Overflow"), +str8_lit_comp("(Win32) Unable To Locate DLL"), +str8_lit_comp("(Win32) Ordinal Not Found"), +str8_lit_comp("(Win32) Entry Point Not Found"), +str8_lit_comp("(Win32) DLL Initialization Failed"), +str8_lit_comp("(Win32) Floating Point SSE Multiple Faults"), +str8_lit_comp("(Win32) Floating Point SSE Multiple Traps"), +str8_lit_comp("(Win32) Assertion Failed"), +str8_lit_comp("(Win32) Module Not Found"), +str8_lit_comp("(Win32) Procedure Not Found"), +str8_lit_comp("(Win32) Sanitizer Error Detected"), +str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), +str8_lit_comp("(Win32) DirectX Debug Layer"), +}; + +String8 ctrl_exception_code_kind_lowercase_code_string_table[38] = +{ +{0}, +str8_lit_comp("win32_ctrl_c"), +str8_lit_comp("win32_ctrl_break"), +str8_lit_comp("win32_win_rt_originate_error"), +str8_lit_comp("win32_win_rt_transform_error"), +str8_lit_comp("win32_rpc_call_cancelled"), +str8_lit_comp("win32_datatype_misalignment"), +str8_lit_comp("win32_access_violation"), +str8_lit_comp("win32_in_page_error"), +str8_lit_comp("win32_invalid_handle"), +str8_lit_comp("win32_not_enough_quota"), +str8_lit_comp("win32_illegal_instruction"), +str8_lit_comp("win32_cannot_continue_exception"), +str8_lit_comp("win32_invalid_exception_disposition"), +str8_lit_comp("win32_array_bounds_exceeded"), +str8_lit_comp("win32_floating_point_denormal_operand"), +str8_lit_comp("win32_floating_point_division_by_zero"), +str8_lit_comp("win32_floating_point_inexact_result"), +str8_lit_comp("win32_floating_point_invalid_operation"), +str8_lit_comp("win32_floating_point_overflow"), +str8_lit_comp("win32_floating_point_stack_check"), +str8_lit_comp("win32_floating_point_underflow"), +str8_lit_comp("win32_integer_division_by_zero"), +str8_lit_comp("win32_integer_overflow"), +str8_lit_comp("win32_privileged_instruction"), +str8_lit_comp("win32_stack_overflow"), +str8_lit_comp("win32_unable_to_locate_dll"), +str8_lit_comp("win32_ordinal_not_found"), +str8_lit_comp("win32_entry_point_not_found"), +str8_lit_comp("win32_dll_initialization_failed"), +str8_lit_comp("win32_floating_point_sse_multiple_faults"), +str8_lit_comp("win32_floating_point_sse_multiple_traps"), +str8_lit_comp("win32_assertion_failed"), +str8_lit_comp("win32_module_not_found"), +str8_lit_comp("win32_procedure_not_found"), +str8_lit_comp("win32_sanitizer_error_detected"), +str8_lit_comp("win32_sanitizer_raw_access_violation"), +str8_lit_comp("win32_directx_debug_layer"), +}; + +B8 ctrl_exception_code_kind_default_enable_table[38] = +{ +0, +1, +1, +0, +0, +0, +0, +1, +0, +1, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +1, +0, +0, +1, +0, +1, +}; + +C_LINKAGE_END + diff --git a/src/ctrl/generated/ctrl.meta.h b/src/ctrl/generated/ctrl.meta.h index eb1afc43..2d2abf32 100644 --- a/src/ctrl/generated/ctrl.meta.h +++ b/src/ctrl/generated/ctrl.meta.h @@ -49,173 +49,11 @@ CTRL_ExceptionCodeKind_Win32DirectXDebugLayer, CTRL_ExceptionCodeKind_COUNT, } CTRL_ExceptionCodeKind; -U32 ctrl_exception_code_kind_code_table[] = -{ -0, -0x40010005, -0x40010008, -0x40080201, -0x40080202, -0x0000071a, -0x80000002, -0xc0000005, -0xc0000006, -0xc0000008, -0xc0000017, -0xc000001d, -0xc0000025, -0xc0000026, -0xc000008c, -0xc000008d, -0xc000008e, -0xc000008f, -0xc0000090, -0xc0000091, -0xc0000092, -0xc0000093, -0xc0000094, -0xc0000095, -0xc0000096, -0xc00000fd, -0xc0000135, -0xc0000138, -0xc0000139, -0xc0000142, -0xc00002b4, -0xc00002b5, -0xc0000420, -0xc06d007e, -0xc06d007f, -0xe073616e, -0xe0736171, -0x0000087a, -}; - -String8 ctrl_exception_code_kind_display_string_table[] = -{ -{0}, -str8_lit_comp("(Win32) Control-C"), -str8_lit_comp("(Win32) Control-Break"), -str8_lit_comp("(Win32) WinRT Originate Error"), -str8_lit_comp("(Win32) WinRT Transform Error"), -str8_lit_comp("(Win32) RPC Call Cancelled"), -str8_lit_comp("(Win32) Data Type Misalignment"), -str8_lit_comp("(Win32) Access Violation"), -str8_lit_comp("(Win32) In Page Error"), -str8_lit_comp("(Win32) Invalid Handle Specified"), -str8_lit_comp("(Win32) Not Enough Quota"), -str8_lit_comp("(Win32) Illegal Instruction"), -str8_lit_comp("(Win32) Cannot Continue From Exception"), -str8_lit_comp("(Win32) Invalid Exception Disposition Returned By Handler"), -str8_lit_comp("(Win32) Array Bounds Exceeded"), -str8_lit_comp("(Win32) Floating-Point Denormal Operand"), -str8_lit_comp("(Win32) Floating-Point Division By Zero"), -str8_lit_comp("(Win32) Floating-Point Inexact Result"), -str8_lit_comp("(Win32) Floating-Point Invalid Operation"), -str8_lit_comp("(Win32) Floating-Point Overflow"), -str8_lit_comp("(Win32) Floating-Point Stack Check"), -str8_lit_comp("(Win32) Floating-Point Underflow"), -str8_lit_comp("(Win32) Integer Division By Zero"), -str8_lit_comp("(Win32) Integer Overflow"), -str8_lit_comp("(Win32) Privileged Instruction"), -str8_lit_comp("(Win32) Stack Overflow"), -str8_lit_comp("(Win32) Unable To Locate DLL"), -str8_lit_comp("(Win32) Ordinal Not Found"), -str8_lit_comp("(Win32) Entry Point Not Found"), -str8_lit_comp("(Win32) DLL Initialization Failed"), -str8_lit_comp("(Win32) Floating Point SSE Multiple Faults"), -str8_lit_comp("(Win32) Floating Point SSE Multiple Traps"), -str8_lit_comp("(Win32) Assertion Failed"), -str8_lit_comp("(Win32) Module Not Found"), -str8_lit_comp("(Win32) Procedure Not Found"), -str8_lit_comp("(Win32) Sanitizer Error Detected"), -str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), -str8_lit_comp("(Win32) DirectX Debug Layer"), -}; - -String8 ctrl_exception_code_kind_lowercase_code_string_table[] = -{ -{0}, -str8_lit_comp("win32_ctrl_c"), -str8_lit_comp("win32_ctrl_break"), -str8_lit_comp("win32_win_rt_originate_error"), -str8_lit_comp("win32_win_rt_transform_error"), -str8_lit_comp("win32_rpc_call_cancelled"), -str8_lit_comp("win32_datatype_misalignment"), -str8_lit_comp("win32_access_violation"), -str8_lit_comp("win32_in_page_error"), -str8_lit_comp("win32_invalid_handle"), -str8_lit_comp("win32_not_enough_quota"), -str8_lit_comp("win32_illegal_instruction"), -str8_lit_comp("win32_cannot_continue_exception"), -str8_lit_comp("win32_invalid_exception_disposition"), -str8_lit_comp("win32_array_bounds_exceeded"), -str8_lit_comp("win32_floating_point_denormal_operand"), -str8_lit_comp("win32_floating_point_division_by_zero"), -str8_lit_comp("win32_floating_point_inexact_result"), -str8_lit_comp("win32_floating_point_invalid_operation"), -str8_lit_comp("win32_floating_point_overflow"), -str8_lit_comp("win32_floating_point_stack_check"), -str8_lit_comp("win32_floating_point_underflow"), -str8_lit_comp("win32_integer_division_by_zero"), -str8_lit_comp("win32_integer_overflow"), -str8_lit_comp("win32_privileged_instruction"), -str8_lit_comp("win32_stack_overflow"), -str8_lit_comp("win32_unable_to_locate_dll"), -str8_lit_comp("win32_ordinal_not_found"), -str8_lit_comp("win32_entry_point_not_found"), -str8_lit_comp("win32_dll_initialization_failed"), -str8_lit_comp("win32_floating_point_sse_multiple_faults"), -str8_lit_comp("win32_floating_point_sse_multiple_traps"), -str8_lit_comp("win32_assertion_failed"), -str8_lit_comp("win32_module_not_found"), -str8_lit_comp("win32_procedure_not_found"), -str8_lit_comp("win32_sanitizer_error_detected"), -str8_lit_comp("win32_sanitizer_raw_access_violation"), -str8_lit_comp("win32_directx_debug_layer"), -}; - -B8 ctrl_exception_code_kind_default_enable_table[] = -{ -0, -1, -1, -0, -0, -0, -0, -1, -0, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -0, -0, -1, -0, -1, -}; - +C_LINKAGE_BEGIN +extern U32 ctrl_exception_code_kind_code_table[38]; +extern String8 ctrl_exception_code_kind_display_string_table[38]; +extern String8 ctrl_exception_code_kind_lowercase_code_string_table[38]; +extern B8 ctrl_exception_code_kind_default_enable_table[38]; +C_LINKAGE_END #endif // CTRL_META_H diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index 29aae133..10fde1b9 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -3,7 +3,218 @@ //- GENERATED CODE -DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[] = +C_LINKAGE_BEGIN +Rng1U64 df_g_cmd_param_slot_range_table[19] = +{ +{0}, +{OffsetOf(DF_CmdParams, window), OffsetOf(DF_CmdParams, window) + sizeof(DF_Handle)}, +{OffsetOf(DF_CmdParams, panel), OffsetOf(DF_CmdParams, panel) + sizeof(DF_Handle)}, +{OffsetOf(DF_CmdParams, dest_panel), OffsetOf(DF_CmdParams, dest_panel) + sizeof(DF_Handle)}, +{OffsetOf(DF_CmdParams, prev_view), OffsetOf(DF_CmdParams, prev_view) + sizeof(DF_Handle)}, +{OffsetOf(DF_CmdParams, view), OffsetOf(DF_CmdParams, view) + sizeof(DF_Handle)}, +{OffsetOf(DF_CmdParams, entity), OffsetOf(DF_CmdParams, entity) + sizeof(DF_Handle)}, +{OffsetOf(DF_CmdParams, entity_list), OffsetOf(DF_CmdParams, entity_list) + sizeof(DF_HandleList)}, +{OffsetOf(DF_CmdParams, string), OffsetOf(DF_CmdParams, string) + sizeof(String8)}, +{OffsetOf(DF_CmdParams, file_path), OffsetOf(DF_CmdParams, file_path) + sizeof(String8)}, +{OffsetOf(DF_CmdParams, text_point), OffsetOf(DF_CmdParams, text_point) + sizeof(TxtPt)}, +{OffsetOf(DF_CmdParams, cmd_spec), OffsetOf(DF_CmdParams, cmd_spec) + sizeof(struct DF_CmdSpec *)}, +{OffsetOf(DF_CmdParams, view_spec), OffsetOf(DF_CmdParams, view_spec) + sizeof(struct DF_ViewSpec *)}, +{OffsetOf(DF_CmdParams, vaddr), OffsetOf(DF_CmdParams, vaddr) + sizeof(U64)}, +{OffsetOf(DF_CmdParams, voff), OffsetOf(DF_CmdParams, voff) + sizeof(U64)}, +{OffsetOf(DF_CmdParams, index), OffsetOf(DF_CmdParams, index) + sizeof(U64)}, +{OffsetOf(DF_CmdParams, id), OffsetOf(DF_CmdParams, id) + sizeof(U64)}, +{OffsetOf(DF_CmdParams, prefer_dasm), OffsetOf(DF_CmdParams, prefer_dasm) + sizeof(B32)}, +{OffsetOf(DF_CmdParams, force_confirm), OffsetOf(DF_CmdParams, force_confirm) + sizeof(B32)}, +}; + +DF_IconKind df_g_entity_kind_icon_kind_table[27] = +{ +DF_IconKind_Null, +DF_IconKind_Null, +DF_IconKind_Machine, +DF_IconKind_FileOutline, +DF_IconKind_FileOutline, +DF_IconKind_FileOutline, +DF_IconKind_FileOutline, +DF_IconKind_Null, +DF_IconKind_Pin, +DF_IconKind_CircleFilled, +DF_IconKind_CircleFilled, +DF_IconKind_Target, +DF_IconKind_Null, +DF_IconKind_Null, +DF_IconKind_Null, +DF_IconKind_Null, +DF_IconKind_Null, +DF_IconKind_Null, +DF_IconKind_Null, +DF_IconKind_Threads, +DF_IconKind_Thread, +DF_IconKind_Module, +DF_IconKind_Null, +DF_IconKind_Threads, +DF_IconKind_Null, +DF_IconKind_Null, +DF_IconKind_Null, +}; + +String8 df_g_entity_kind_display_string_table[27] = +{ +str8_lit_comp("Nil"), +str8_lit_comp("Root"), +str8_lit_comp("Machine"), +str8_lit_comp("File"), +str8_lit_comp("Override File Link"), +str8_lit_comp("Pending File Change"), +str8_lit_comp("Diagnostics Log"), +str8_lit_comp("Flash Marker"), +str8_lit_comp("Watch Pin"), +str8_lit_comp("Breakpoint"), +str8_lit_comp("Condition"), +str8_lit_comp("Target"), +str8_lit_comp("Executable"), +str8_lit_comp("Arguments"), +str8_lit_comp("Execution Path"), +str8_lit_comp("Entry Point Name"), +str8_lit_comp("Source"), +str8_lit_comp("Destination"), +str8_lit_comp("Control Request"), +str8_lit_comp("Process"), +str8_lit_comp("Thread"), +str8_lit_comp("Module"), +str8_lit_comp("Debug Info Override"), +str8_lit_comp("Pending Thread Name"), +str8_lit_comp("Conversion Task"), +str8_lit_comp("Conversion Failure"), +str8_lit_comp("EndedProcess"), +}; + +String8 df_g_entity_kind_name_label_table[27] = +{ +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Expression"), +str8_lit_comp("Label"), +str8_lit_comp("Expression"), +str8_lit_comp("Label"), +str8_lit_comp("Executable"), +str8_lit_comp("Arguments"), +str8_lit_comp("Execution Path"), +str8_lit_comp("Symbol Name"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +}; + +DF_EntityKindFlags df_g_entity_kind_flags_table[27] = +{ +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(1*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 1*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 1*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 1*DF_EntityKindFlag_TreeMutationSoftHalt | 1*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), +}; + +DF_EntityOpFlags df_g_entity_kind_op_flags_table[27] = +{ +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), +(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (1*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (1*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), +}; + +String8 df_g_cfg_src_string_table[4] = +{ +str8_lit_comp("user"), +str8_lit_comp("profile"), +str8_lit_comp("command_line"), +str8_lit_comp("transient"), +}; + +DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[4] = +{ +DF_CoreCmdKind_OpenUser, +DF_CoreCmdKind_OpenProfile, +DF_CoreCmdKind_Null, +DF_CoreCmdKind_Null, +}; + +DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[4] = +{ +DF_CoreCmdKind_WriteUserData, +DF_CoreCmdKind_WriteProfileData, +DF_CoreCmdKind_Null, +DF_CoreCmdKind_Null, +}; + +DF_CoreCmdKind df_g_cfg_src_apply_cmd_kind_table[4] = +{ +DF_CoreCmdKind_ApplyUserData, +DF_CoreCmdKind_ApplyProfileData, +DF_CoreCmdKind_Null, +DF_CoreCmdKind_Null, +}; + +DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[206] = { { str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_X}, @@ -213,7 +424,7 @@ DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[] = { str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, }; -DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[] = +DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[16] = { {str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, {str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(array) , 0, }, @@ -233,3 +444,78 @@ DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[] = {str8_lit_comp("geo"), str8_lit_comp("Geometry"), str8_lit_comp("Displays as geometry, interpreting the data as vertex data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(geo) , }, }; +String8 df_g_icon_kind_text_table[69] = +{ +str8_lit_comp(""), +str8_lit_comp("b"), +str8_lit_comp("c"), +str8_lit_comp("B"), +str8_lit_comp("C"), +str8_lit_comp("f"), +str8_lit_comp("F"), +str8_lit_comp("g"), +str8_lit_comp("h"), +str8_lit_comp("r"), +str8_lit_comp("s"), +str8_lit_comp("i"), +str8_lit_comp("w"), +str8_lit_comp("W"), +str8_lit_comp("k"), +str8_lit_comp("K"), +str8_lit_comp("L"), +str8_lit_comp("R"), +str8_lit_comp("U"), +str8_lit_comp("D"), +str8_lit_comp("G"), +str8_lit_comp("P"), +str8_lit_comp("3"), +str8_lit_comp("p"), +str8_lit_comp("O"), +str8_lit_comp("o"), +str8_lit_comp("!"), +str8_lit_comp("1"), +str8_lit_comp("<"), +str8_lit_comp(">"), +str8_lit_comp("^"), +str8_lit_comp("v"), +str8_lit_comp("9"), +str8_lit_comp("0"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("+"), +str8_lit_comp("-"), +str8_lit_comp("'"), +str8_lit_comp("\""), +str8_lit_comp("M"), +str8_lit_comp("."), +str8_lit_comp("x"), +str8_lit_comp("q"), +str8_lit_comp("j"), +str8_lit_comp("u"), +str8_lit_comp("m"), +str8_lit_comp("n"), +str8_lit_comp("l"), +str8_lit_comp("a"), +str8_lit_comp("z"), +str8_lit_comp("y"), +str8_lit_comp("X"), +str8_lit_comp("Y"), +str8_lit_comp("S"), +str8_lit_comp("T"), +str8_lit_comp("Z"), +str8_lit_comp("d"), +str8_lit_comp("N"), +str8_lit_comp("E"), +str8_lit_comp("H"), +str8_lit_comp("e"), +str8_lit_comp("I"), +str8_lit_comp("J"), +str8_lit_comp("A"), +str8_lit_comp("?"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("c"), +}; + +C_LINKAGE_END + diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index 9179a020..a2454b39 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -1515,288 +1515,18 @@ struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = {&DEV_scratch_mouse_draw, str8_lit_comp("scratch_mouse_draw")}, {&DEV_updating_indicator, str8_lit_comp("updating_indicator")}, }; -Rng1U64 df_g_cmd_param_slot_range_table[] = -{ -{0}, -{OffsetOf(DF_CmdParams, window), OffsetOf(DF_CmdParams, window) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, panel), OffsetOf(DF_CmdParams, panel) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, dest_panel), OffsetOf(DF_CmdParams, dest_panel) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, prev_view), OffsetOf(DF_CmdParams, prev_view) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, view), OffsetOf(DF_CmdParams, view) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, entity), OffsetOf(DF_CmdParams, entity) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, entity_list), OffsetOf(DF_CmdParams, entity_list) + sizeof(DF_HandleList)}, -{OffsetOf(DF_CmdParams, string), OffsetOf(DF_CmdParams, string) + sizeof(String8)}, -{OffsetOf(DF_CmdParams, file_path), OffsetOf(DF_CmdParams, file_path) + sizeof(String8)}, -{OffsetOf(DF_CmdParams, text_point), OffsetOf(DF_CmdParams, text_point) + sizeof(TxtPt)}, -{OffsetOf(DF_CmdParams, cmd_spec), OffsetOf(DF_CmdParams, cmd_spec) + sizeof(struct DF_CmdSpec *)}, -{OffsetOf(DF_CmdParams, view_spec), OffsetOf(DF_CmdParams, view_spec) + sizeof(struct DF_ViewSpec *)}, -{OffsetOf(DF_CmdParams, vaddr), OffsetOf(DF_CmdParams, vaddr) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, voff), OffsetOf(DF_CmdParams, voff) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, index), OffsetOf(DF_CmdParams, index) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, id), OffsetOf(DF_CmdParams, id) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, prefer_dasm), OffsetOf(DF_CmdParams, prefer_dasm) + sizeof(B32)}, -{OffsetOf(DF_CmdParams, force_confirm), OffsetOf(DF_CmdParams, force_confirm) + sizeof(B32)}, -}; - -DF_IconKind df_g_entity_kind_icon_kind_table[] = -{ -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Machine, -DF_IconKind_FileOutline, -DF_IconKind_FileOutline, -DF_IconKind_FileOutline, -DF_IconKind_FileOutline, -DF_IconKind_Null, -DF_IconKind_Pin, -DF_IconKind_CircleFilled, -DF_IconKind_CircleFilled, -DF_IconKind_Target, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Threads, -DF_IconKind_Thread, -DF_IconKind_Module, -DF_IconKind_Null, -DF_IconKind_Threads, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -}; - -String8 df_g_entity_kind_display_string_table[] = -{ -str8_lit_comp("Nil"), -str8_lit_comp("Root"), -str8_lit_comp("Machine"), -str8_lit_comp("File"), -str8_lit_comp("Override File Link"), -str8_lit_comp("Pending File Change"), -str8_lit_comp("Diagnostics Log"), -str8_lit_comp("Flash Marker"), -str8_lit_comp("Watch Pin"), -str8_lit_comp("Breakpoint"), -str8_lit_comp("Condition"), -str8_lit_comp("Target"), -str8_lit_comp("Executable"), -str8_lit_comp("Arguments"), -str8_lit_comp("Execution Path"), -str8_lit_comp("Entry Point Name"), -str8_lit_comp("Source"), -str8_lit_comp("Destination"), -str8_lit_comp("Control Request"), -str8_lit_comp("Process"), -str8_lit_comp("Thread"), -str8_lit_comp("Module"), -str8_lit_comp("Debug Info Override"), -str8_lit_comp("Pending Thread Name"), -str8_lit_comp("Conversion Task"), -str8_lit_comp("Conversion Failure"), -str8_lit_comp("EndedProcess"), -}; - -String8 df_g_entity_kind_name_label_table[] = -{ -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Expression"), -str8_lit_comp("Label"), -str8_lit_comp("Expression"), -str8_lit_comp("Label"), -str8_lit_comp("Executable"), -str8_lit_comp("Arguments"), -str8_lit_comp("Execution Path"), -str8_lit_comp("Symbol Name"), -str8_lit_comp("Path"), -str8_lit_comp("Path"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -}; - -DF_EntityKindFlags df_g_entity_kind_flags_table[] = -{ -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(1*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 1*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 1*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 1*DF_EntityKindFlag_TreeMutationSoftHalt | 1*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -}; - -DF_EntityOpFlags df_g_entity_kind_op_flags_table[] = -{ -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), -(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (1*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (1*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -}; - -String8 df_g_cfg_src_string_table[] = -{ -str8_lit_comp("user"), -str8_lit_comp("profile"), -str8_lit_comp("command_line"), -str8_lit_comp("transient"), -}; - -DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[] = -{ -DF_CoreCmdKind_OpenUser, -DF_CoreCmdKind_OpenProfile, -DF_CoreCmdKind_Null, -DF_CoreCmdKind_Null, -}; - -DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[] = -{ -DF_CoreCmdKind_WriteUserData, -DF_CoreCmdKind_WriteProfileData, -DF_CoreCmdKind_Null, -DF_CoreCmdKind_Null, -}; - -DF_CoreCmdKind df_g_cfg_src_apply_cmd_kind_table[] = -{ -DF_CoreCmdKind_ApplyUserData, -DF_CoreCmdKind_ApplyProfileData, -DF_CoreCmdKind_Null, -DF_CoreCmdKind_Null, -}; - -String8 df_g_icon_kind_text_table[] = -{ -str8_lit_comp(""), -str8_lit_comp("b"), -str8_lit_comp("c"), -str8_lit_comp("B"), -str8_lit_comp("C"), -str8_lit_comp("f"), -str8_lit_comp("F"), -str8_lit_comp("g"), -str8_lit_comp("h"), -str8_lit_comp("r"), -str8_lit_comp("s"), -str8_lit_comp("i"), -str8_lit_comp("w"), -str8_lit_comp("W"), -str8_lit_comp("k"), -str8_lit_comp("K"), -str8_lit_comp("L"), -str8_lit_comp("R"), -str8_lit_comp("U"), -str8_lit_comp("D"), -str8_lit_comp("G"), -str8_lit_comp("P"), -str8_lit_comp("3"), -str8_lit_comp("p"), -str8_lit_comp("O"), -str8_lit_comp("o"), -str8_lit_comp("!"), -str8_lit_comp("1"), -str8_lit_comp("<"), -str8_lit_comp(">"), -str8_lit_comp("^"), -str8_lit_comp("v"), -str8_lit_comp("9"), -str8_lit_comp("0"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("+"), -str8_lit_comp("-"), -str8_lit_comp("'"), -str8_lit_comp("\""), -str8_lit_comp("M"), -str8_lit_comp("."), -str8_lit_comp("x"), -str8_lit_comp("q"), -str8_lit_comp("j"), -str8_lit_comp("u"), -str8_lit_comp("m"), -str8_lit_comp("n"), -str8_lit_comp("l"), -str8_lit_comp("a"), -str8_lit_comp("z"), -str8_lit_comp("y"), -str8_lit_comp("X"), -str8_lit_comp("Y"), -str8_lit_comp("S"), -str8_lit_comp("T"), -str8_lit_comp("Z"), -str8_lit_comp("d"), -str8_lit_comp("N"), -str8_lit_comp("E"), -str8_lit_comp("H"), -str8_lit_comp("e"), -str8_lit_comp("I"), -str8_lit_comp("J"), -str8_lit_comp("A"), -str8_lit_comp("?"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("c"), -}; - +C_LINKAGE_BEGIN +extern Rng1U64 df_g_cmd_param_slot_range_table[19]; +extern DF_IconKind df_g_entity_kind_icon_kind_table[27]; +extern String8 df_g_entity_kind_display_string_table[27]; +extern String8 df_g_entity_kind_name_label_table[27]; +extern DF_EntityKindFlags df_g_entity_kind_flags_table[27]; +extern DF_EntityOpFlags df_g_entity_kind_op_flags_table[27]; +extern String8 df_g_cfg_src_string_table[4]; +extern DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[4]; +extern DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[4]; +extern DF_CoreCmdKind df_g_cfg_src_apply_cmd_kind_table[4]; +extern String8 df_g_icon_kind_text_table[69]; +C_LINKAGE_END #endif // DF_CORE_META_H diff --git a/src/df/gfx/generated/df_gfx.meta.c b/src/df/gfx/generated/df_gfx.meta.c index d43cb23e..38a43990 100644 --- a/src/df/gfx/generated/df_gfx.meta.c +++ b/src/df/gfx/generated/df_gfx.meta.c @@ -3,7 +3,708 @@ //- GENERATED CODE -DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[] = +C_LINKAGE_BEGIN +String8 df_g_theme_preset_display_string_table[9] = +{ +str8_lit_comp("Default (Dark)"), +str8_lit_comp("Default (Light)"), +str8_lit_comp("VS (Dark)"), +str8_lit_comp("VS (Light)"), +str8_lit_comp("Solarized (Dark)"), +str8_lit_comp("Solarized (Light)"), +str8_lit_comp("Handmade Hero"), +str8_lit_comp("4coder"), +str8_lit_comp("Far Manager"), +}; + +String8 df_g_theme_preset_code_string_table[9] = +{ +str8_lit_comp("default_dark"), +str8_lit_comp("default_light"), +str8_lit_comp("vs_dark"), +str8_lit_comp("vs_light"), +str8_lit_comp("solarized_dark"), +str8_lit_comp("solarized_light"), +str8_lit_comp("handmade_hero"), +str8_lit_comp("four_coder"), +str8_lit_comp("far_manager"), +}; + +Vec4F32 df_g_theme_preset_colors__default_dark[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x3333337f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x7fcc99ff), +rgba_from_u32_lit_comp(0x66b2e5ff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xf7bf5eff), +rgba_from_u32_lit_comp(0x994c32ff), +rgba_from_u32_lit_comp(0x4ce54cff), +rgba_from_u32_lit_comp(0xe5cc66ff), +rgba_from_u32_lit_comp(0xe54c4cff), +rgba_from_u32_lit_comp(0x7f7f7fff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0xa87a4c99), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0x8e2d4ccc), +rgba_from_u32_lit_comp(0xffffff7f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0x66e566e5), +rgba_from_u32_lit_comp(0xb27219ff), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x32b219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x0000007f), +}; + +Vec4F32 df_g_theme_preset_colors__default_light[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x383838ff), +rgba_from_u32_lit_comp(0xedededfe), +rgba_from_u32_lit_comp(0x0000001d), +rgba_from_u32_lit_comp(0x00000033), +rgba_from_u32_lit_comp(0x282828ff), +rgba_from_u32_lit_comp(0x2a7a45ff), +rgba_from_u32_lit_comp(0x2c688fff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xa47729ff), +rgba_from_u32_lit_comp(0x6c2d18ff), +rgba_from_u32_lit_comp(0x2c7d2cff), +rgba_from_u32_lit_comp(0xcc5a0fff), +rgba_from_u32_lit_comp(0x8a0c0cff), +rgba_from_u32_lit_comp(0x7f7f7fff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x535353ff), +rgba_from_u32_lit_comp(0xfefefebc), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0xc7a27dff), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0xd76489cc), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x7d98b34c), +rgba_from_u32_lit_comp(0x101010ff), +rgba_from_u32_lit_comp(0xb272189b), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x75db61ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xf27961ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xad7c34ff), +rgba_from_u32_lit_comp(0x639b2aff), +rgba_from_u32_lit_comp(0xa94c91ff), +rgba_from_u32_lit_comp(0x305398ff), +rgba_from_u32_lit_comp(0x339574ff), +rgba_from_u32_lit_comp(0xbf7416ff), +rgba_from_u32_lit_comp(0x57238bff), +rgba_from_u32_lit_comp(0x2a7e1cff), +rgba_from_u32_lit_comp(0x236481ff), +rgba_from_u32_lit_comp(0x0000000d), +rgba_from_u32_lit_comp(0x0000003b), +}; + +Vec4F32 df_g_theme_preset_colors__vs_dark[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x1e1e1eff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xd4d4d4ff), +rgba_from_u32_lit_comp(0xdcdcaaff), +rgba_from_u32_lit_comp(0x4ec9b0ff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0x569cd6ff), +rgba_from_u32_lit_comp(0xb4b4b4ff), +rgba_from_u32_lit_comp(0xb5cea8ff), +rgba_from_u32_lit_comp(0xd69d85ff), +rgba_from_u32_lit_comp(0x9b9b9bff), +rgba_from_u32_lit_comp(0x6a9955ff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xf1f1f1ff), +rgba_from_u32_lit_comp(0x1b1b1cff), +rgba_from_u32_lit_comp(0x333337ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0x007accff), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0x8e2d4ccc), +rgba_from_u32_lit_comp(0xffffff7f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0x66e566e5), +rgba_from_u32_lit_comp(0xb27219ff), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x32b219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x0000007f), +}; + +Vec4F32 df_g_theme_preset_colors__vs_light[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x1e1e1eff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0xcccedb1d), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0x74531fff), +rgba_from_u32_lit_comp(0x2b91afff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0x0000ffff), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0xc11515ff), +rgba_from_u32_lit_comp(0x808080ff), +rgba_from_u32_lit_comp(0x008000ff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x535353ff), +rgba_from_u32_lit_comp(0xfefefebc), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0x007accff), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0x8e2d4ccc), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x7d98b34c), +rgba_from_u32_lit_comp(0x101010ff), +rgba_from_u32_lit_comp(0xb27219ff), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x32b219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xad7c34ff), +rgba_from_u32_lit_comp(0x639b2aff), +rgba_from_u32_lit_comp(0xa94c91ff), +rgba_from_u32_lit_comp(0x305398ff), +rgba_from_u32_lit_comp(0x339574ff), +rgba_from_u32_lit_comp(0xbf7416ff), +rgba_from_u32_lit_comp(0x57238bff), +rgba_from_u32_lit_comp(0x2a7e1cff), +rgba_from_u32_lit_comp(0x236481ff), +rgba_from_u32_lit_comp(0x0000000d), +rgba_from_u32_lit_comp(0x0000003b), +}; + +Vec4F32 df_g_theme_preset_colors__solarized_dark[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x002b36ff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x839496ff), +rgba_from_u32_lit_comp(0x1c7dd1ff), +rgba_from_u32_lit_comp(0x1c7dd1ff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0x63980fff), +rgba_from_u32_lit_comp(0x839496ff), +rgba_from_u32_lit_comp(0xcb4b20ff), +rgba_from_u32_lit_comp(0x2aa198ff), +rgba_from_u32_lit_comp(0xe54c4cff), +rgba_from_u32_lit_comp(0x7f7f7fff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x002b36ff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0x28515eff), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0x8e2d4ccc), +rgba_from_u32_lit_comp(0xffffff7f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0x66e566e5), +rgba_from_u32_lit_comp(0xb27219ff), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x32b219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x0000007f), +}; + +Vec4F32 df_g_theme_preset_colors__solarized_light[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x1e1e1eff), +rgba_from_u32_lit_comp(0xfcf6e2ff), +rgba_from_u32_lit_comp(0xcccedb1d), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x74878cff), +rgba_from_u32_lit_comp(0xc39d36ff), +rgba_from_u32_lit_comp(0x66b2e5ff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xc39d36ff), +rgba_from_u32_lit_comp(0x2e5256ff), +rgba_from_u32_lit_comp(0x657b83ff), +rgba_from_u32_lit_comp(0x5ab4a9ff), +rgba_from_u32_lit_comp(0xe54c4cff), +rgba_from_u32_lit_comp(0xadafb2ff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x535353ff), +rgba_from_u32_lit_comp(0xfcf6e2ff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0xa87a4c99), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0x8e2d4ccc), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x7d98b34c), +rgba_from_u32_lit_comp(0x101010ff), +rgba_from_u32_lit_comp(0xb27219ff), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x32b219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xad7c34ff), +rgba_from_u32_lit_comp(0x639b2aff), +rgba_from_u32_lit_comp(0xa94c91ff), +rgba_from_u32_lit_comp(0x305398ff), +rgba_from_u32_lit_comp(0x339574ff), +rgba_from_u32_lit_comp(0xbf7416ff), +rgba_from_u32_lit_comp(0x57238bff), +rgba_from_u32_lit_comp(0x2a7e1cff), +rgba_from_u32_lit_comp(0x236481ff), +rgba_from_u32_lit_comp(0x0000000d), +rgba_from_u32_lit_comp(0x0000003b), +}; + +Vec4F32 df_g_theme_preset_colors__handmade_hero[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0xa08563ff), +rgba_from_u32_lit_comp(0x0c0c0cff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xa08563ff), +rgba_from_u32_lit_comp(0xcc5735ff), +rgba_from_u32_lit_comp(0xd8a51dff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xac7b0bff), +rgba_from_u32_lit_comp(0x994c32ff), +rgba_from_u32_lit_comp(0x6b8e23ff), +rgba_from_u32_lit_comp(0x6b8e23ff), +rgba_from_u32_lit_comp(0xdab98fff), +rgba_from_u32_lit_comp(0x686868ff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xa08563ff), +rgba_from_u32_lit_comp(0x0c0c0cff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0xa87a4c99), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0x8e2d4ccc), +rgba_from_u32_lit_comp(0xa08563af), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0x66e566e5), +rgba_from_u32_lit_comp(0xb27219ff), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x32b219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x0000007f), +}; + +Vec4F32 df_g_theme_preset_colors__four_coder[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x90b080ff), +rgba_from_u32_lit_comp(0x0c0c0cff), +rgba_from_u32_lit_comp(0x181818a0), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x90b080ff), +rgba_from_u32_lit_comp(0x7fcc99ff), +rgba_from_u32_lit_comp(0x66b2e5ff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd08f20ff), +rgba_from_u32_lit_comp(0x994c32ff), +rgba_from_u32_lit_comp(0x50ff30ff), +rgba_from_u32_lit_comp(0x50ff30ff), +rgba_from_u32_lit_comp(0x50ff30ff), +rgba_from_u32_lit_comp(0x2090f0ff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x90b080ff), +rgba_from_u32_lit_comp(0x0c0c0cff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0xa87a4c99), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0x8e2d4ccc), +rgba_from_u32_lit_comp(0x90b080af), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0x66e566e5), +rgba_from_u32_lit_comp(0xb27219ff), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x32b219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x0000007f), +}; + +Vec4F32 df_g_theme_preset_colors__far_manager[53] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x00ffffff), +rgba_from_u32_lit_comp(0x000082ff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x00ffffff), +rgba_from_u32_lit_comp(0x49b2ffff), +rgba_from_u32_lit_comp(0x49b2ffff), +rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xff0000ff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x2cff50ff), +rgba_from_u32_lit_comp(0xe5cc66ff), +rgba_from_u32_lit_comp(0xffff00ff), +rgba_from_u32_lit_comp(0x7f7f7fff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0x008184ff), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0x42474c7f), +rgba_from_u32_lit_comp(0xa87a4c99), +rgba_from_u32_lit_comp(0x4293cc99), +rgba_from_u32_lit_comp(0x8e2d4ccc), +rgba_from_u32_lit_comp(0xffffff7f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0x66e566e5), +rgba_from_u32_lit_comp(0xb27219ff), +rgba_from_u32_lit_comp(0x327f19ff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x32b219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x327fb2ff), +rgba_from_u32_lit_comp(0xffffff33), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x0000007f), +}; + +Vec4F32* df_g_theme_preset_colors_table[9] = +{ +df_g_theme_preset_colors__default_dark, +df_g_theme_preset_colors__default_light, +df_g_theme_preset_colors__vs_dark, +df_g_theme_preset_colors__vs_light, +df_g_theme_preset_colors__solarized_dark, +df_g_theme_preset_colors__solarized_light, +df_g_theme_preset_colors__handmade_hero, +df_g_theme_preset_colors__four_coder, +df_g_theme_preset_colors__far_manager, +}; + +DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[7] = +{ +DF_CmdParamSlot_Entity, +DF_CmdParamSlot_EntityList, +DF_CmdParamSlot_FilePath, +DF_CmdParamSlot_CmdSpec, +DF_CmdParamSlot_ID, +DF_CmdParamSlot_String, +DF_CmdParamSlot_String, +}; + +String8 df_g_cmd_param_slot_2_view_spec_dst_map[7] = +{ +str8_lit_comp("entity_lister"), +str8_lit_comp("entity_lister"), +str8_lit_comp("file_system"), +str8_lit_comp("commands"), +str8_lit_comp("system_processes"), +str8_lit_comp("symbol_lister"), +str8_lit_comp("symbol_lister"), +}; + +String8 df_g_cmd_param_slot_2_view_spec_cmd_map[7] = +{ +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp("goto_name"), +str8_lit_comp("function_breakpoint"), +}; + +DF_StringBindingPair df_g_default_binding_table[97] = +{ +{str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_EventFlag_Alt}}, +{str8_lit_comp("step_over_inst"), {OS_Key_F10, 0 |OS_EventFlag_Alt}}, +{str8_lit_comp("step_out"), {OS_Key_F11, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("halt"), {OS_Key_X, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("halt"), {OS_Key_Pause, 0 }}, +{str8_lit_comp("soft_halt_refresh"), {OS_Key_R, 0 |OS_EventFlag_Alt}}, +{str8_lit_comp("run"), {OS_Key_F5, 0 }}, +{str8_lit_comp("restart"), {OS_Key_F5, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("step_into"), {OS_Key_F11, 0 }}, +{str8_lit_comp("step_over"), {OS_Key_F10, 0 }}, +{str8_lit_comp("run_to_cursor"), {OS_Key_F10, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("set_next_statement"), {OS_Key_F10, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("inc_ui_font_scale"), {OS_Key_Equal, 0 |OS_EventFlag_Alt}}, +{str8_lit_comp("dec_ui_font_scale"), {OS_Key_Minus, 0 |OS_EventFlag_Alt}}, +{str8_lit_comp("inc_code_font_scale"), {OS_Key_Equal, 0 |OS_EventFlag_Shift |OS_EventFlag_Alt}}, +{str8_lit_comp("dec_code_font_scale"), {OS_Key_Minus, 0 |OS_EventFlag_Shift |OS_EventFlag_Alt}}, +{str8_lit_comp("window"), {OS_Key_N, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("toggle_fullscreen"), {OS_Key_Return, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("new_panel_right"), {OS_Key_P, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("new_panel_down"), {OS_Key_Minus, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("rotate_panel_columns"), {OS_Key_2, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("next_panel"), {OS_Key_Comma, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("prev_panel"), {OS_Key_Comma, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("focus_panel_right"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, +{str8_lit_comp("focus_panel_left"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, +{str8_lit_comp("focus_panel_up"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, +{str8_lit_comp("focus_panel_down"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, +{str8_lit_comp("close_panel"), {OS_Key_P, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("next_tab"), {OS_Key_PageDown, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("prev_tab"), {OS_Key_PageUp, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("next_tab"), {OS_Key_Tab, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("prev_tab"), {OS_Key_Tab, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("move_tab_right"), {OS_Key_PageDown, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("move_tab_left"), {OS_Key_PageUp, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("close_tab"), {OS_Key_W, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("tab_bar_top"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, +{str8_lit_comp("tab_bar_bottom"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, +{str8_lit_comp("open"), {OS_Key_O, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("reload_active"), {OS_Key_R, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("switch"), {OS_Key_I, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("switch_to_partner_file"), {OS_Key_O, 0 |OS_EventFlag_Alt}}, +{str8_lit_comp("load_user"), {OS_Key_O, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, +{str8_lit_comp("load_profile"), {OS_Key_O, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, +{str8_lit_comp("move_left"), {OS_Key_Left, 0 }}, +{str8_lit_comp("move_right"), {OS_Key_Right, 0 }}, +{str8_lit_comp("move_up"), {OS_Key_Up, 0 }}, +{str8_lit_comp("move_down"), {OS_Key_Down, 0 }}, +{str8_lit_comp("move_left_select"), {OS_Key_Left, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("move_right_select"), {OS_Key_Right, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("move_up_select"), {OS_Key_Up, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("move_down_select"), {OS_Key_Down, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("move_left_chunk"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("move_right_chunk"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("move_up_chunk"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("move_down_chunk"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("move_up_page"), {OS_Key_PageUp, 0 }}, +{str8_lit_comp("move_down_page"), {OS_Key_PageDown, 0 }}, +{str8_lit_comp("move_up_whole"), {OS_Key_Home, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("move_down_whole"), {OS_Key_End, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("move_left_chunk_select"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("move_right_chunk_select"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("move_up_chunk_select"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("move_down_chunk_select"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("move_up_page_select"), {OS_Key_PageUp, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("move_down_page_select"), {OS_Key_PageDown, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("move_up_whole_select"), {OS_Key_Home, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("move_down_whole_select"), {OS_Key_End, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, +{str8_lit_comp("move_home"), {OS_Key_Home, 0 }}, +{str8_lit_comp("move_end"), {OS_Key_End, 0 }}, +{str8_lit_comp("move_home_select"), {OS_Key_Home, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("move_end_select"), {OS_Key_End, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("select_all"), {OS_Key_A, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("delete_single"), {OS_Key_Delete, 0 }}, +{str8_lit_comp("delete_chunk"), {OS_Key_Delete, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("backspace_single"), {OS_Key_Backspace, 0 }}, +{str8_lit_comp("backspace_chunk"), {OS_Key_Backspace, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("copy"), {OS_Key_C, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("cut"), {OS_Key_X, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("paste"), {OS_Key_V, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("insert_text"), {OS_Key_Null, 0 }}, +{str8_lit_comp("goto_line"), {OS_Key_G, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("goto_address"), {OS_Key_G, 0 |OS_EventFlag_Alt}}, +{str8_lit_comp("find_text_forward"), {OS_Key_F, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("find_text_backward"), {OS_Key_R, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("find_next"), {OS_Key_F3, 0 }}, +{str8_lit_comp("find_prev"), {OS_Key_F3, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("find_selected_thread"), {OS_Key_F4, 0 }}, +{str8_lit_comp("goto_name"), {OS_Key_J, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("goto_name_at_cursor"), {OS_Key_F12, 0 }}, +{str8_lit_comp("toggle_watch_expr_at_cursor"), {OS_Key_W, 0 |OS_EventFlag_Alt}}, +{str8_lit_comp("toggle_watch_pin_at_cursor"), {OS_Key_F9, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("toggle_breakpoint_cursor"), {OS_Key_F9, 0 }}, +{str8_lit_comp("add_target"), {OS_Key_T, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("attach"), {OS_Key_F6, 0 |OS_EventFlag_Shift }}, +{str8_lit_comp("filter"), {OS_Key_Slash, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("run_command"), {OS_Key_F1, 0 }}, +}; + +String8 df_g_binding_version_remap_old_name_table[3] = +{ +str8_lit_comp("commands"), +str8_lit_comp("load_user"), +str8_lit_comp("load_profile"), +}; + +String8 df_g_binding_version_remap_new_name_table[3] = +{ +str8_lit_comp("run_command"), +str8_lit_comp("open_user"), +str8_lit_comp("open_profile"), +}; + +DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[14] = { { str8_lit_comp("array"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, 0, 0, 0, }, { str8_lit_comp("list"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(list) , 0, 0, 0, }, @@ -21,3 +722,152 @@ DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[] = { str8_lit_comp("geo"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(geo) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(geo) , }, }; +DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29] = +{ +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("null"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Null), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null), DF_VIEW_CMD_FUNCTION_NAME(Null), DF_VIEW_UI_FUNCTION_NAME(Null)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("empty"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Empty), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Empty), DF_VIEW_CMD_FUNCTION_NAME(Empty), DF_VIEW_UI_FUNCTION_NAME(Empty)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("commands"), str8_lit_comp("Commands"), DF_NameKind_Null, DF_IconKind_List, DF_VIEW_SETUP_FUNCTION_NAME(Commands), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Commands), DF_VIEW_CMD_FUNCTION_NAME(Commands), DF_VIEW_UI_FUNCTION_NAME(Commands)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("file_system"), str8_lit_comp("File System"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FileSystem), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FileSystem), DF_VIEW_CMD_FUNCTION_NAME(FileSystem), DF_VIEW_UI_FUNCTION_NAME(FileSystem)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("system_processes"), str8_lit_comp("System Processes"), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(SystemProcesses), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(SystemProcesses), DF_VIEW_CMD_FUNCTION_NAME(SystemProcesses), DF_VIEW_UI_FUNCTION_NAME(SystemProcesses)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("entity_lister"), str8_lit_comp("Entity List"), DF_NameKind_EntityKindName, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(EntityLister), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(EntityLister), DF_VIEW_CMD_FUNCTION_NAME(EntityLister), DF_VIEW_UI_FUNCTION_NAME(EntityLister)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("symbol_lister"), str8_lit_comp("Symbols"), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(SymbolLister), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(SymbolLister), DF_VIEW_CMD_FUNCTION_NAME(SymbolLister), DF_VIEW_UI_FUNCTION_NAME(SymbolLister)}, +{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("target"), str8_lit_comp("Target"), DF_NameKind_EntityName, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Target), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Target), DF_VIEW_CMD_FUNCTION_NAME(Target), DF_VIEW_UI_FUNCTION_NAME(Target)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("targets"), str8_lit_comp("Targets"), DF_NameKind_Null, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Targets), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Targets), DF_VIEW_CMD_FUNCTION_NAME(Targets), DF_VIEW_UI_FUNCTION_NAME(Targets)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("file_path_map"), str8_lit_comp("File Path Map"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FilePathMap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FilePathMap), DF_VIEW_CMD_FUNCTION_NAME(FilePathMap), DF_VIEW_UI_FUNCTION_NAME(FilePathMap)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("scheduler"), str8_lit_comp("Scheduler"), DF_NameKind_Null, DF_IconKind_Scheduler, DF_VIEW_SETUP_FUNCTION_NAME(Scheduler), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Scheduler), DF_VIEW_CMD_FUNCTION_NAME(Scheduler), DF_VIEW_UI_FUNCTION_NAME(Scheduler)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("call_stack"), str8_lit_comp("Call Stack"), DF_NameKind_Null, DF_IconKind_Thread, DF_VIEW_SETUP_FUNCTION_NAME(CallStack), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(CallStack), DF_VIEW_CMD_FUNCTION_NAME(CallStack), DF_VIEW_UI_FUNCTION_NAME(CallStack)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("modules"), str8_lit_comp("Modules"), DF_NameKind_Null, DF_IconKind_Module, DF_VIEW_SETUP_FUNCTION_NAME(Modules), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Modules), DF_VIEW_CMD_FUNCTION_NAME(Modules), DF_VIEW_UI_FUNCTION_NAME(Modules)}, +{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("pending_entity"), str8_lit_comp("Pending Entity"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(PendingEntity), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(PendingEntity), DF_VIEW_CMD_FUNCTION_NAME(PendingEntity), DF_VIEW_UI_FUNCTION_NAME(PendingEntity)}, +{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("code"), str8_lit_comp("Code"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(Code), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Code), DF_VIEW_CMD_FUNCTION_NAME(Code), DF_VIEW_UI_FUNCTION_NAME(Code)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("disassembly"), str8_lit_comp("Disassembly"), DF_NameKind_Null, DF_IconKind_Glasses, DF_VIEW_SETUP_FUNCTION_NAME(Disassembly), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Disassembly), DF_VIEW_CMD_FUNCTION_NAME(Disassembly), DF_VIEW_UI_FUNCTION_NAME(Disassembly)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("watch"), str8_lit_comp("Watch"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Watch), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Watch), DF_VIEW_CMD_FUNCTION_NAME(Watch), DF_VIEW_UI_FUNCTION_NAME(Watch)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("locals"), str8_lit_comp("Locals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Locals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Locals), DF_VIEW_CMD_FUNCTION_NAME(Locals), DF_VIEW_UI_FUNCTION_NAME(Locals)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("registers"), str8_lit_comp("Registers"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Registers), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Registers), DF_VIEW_CMD_FUNCTION_NAME(Registers), DF_VIEW_UI_FUNCTION_NAME(Registers)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("globals"), str8_lit_comp("Globals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Globals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Globals), DF_VIEW_CMD_FUNCTION_NAME(Globals), DF_VIEW_UI_FUNCTION_NAME(Globals)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("thread_locals"), str8_lit_comp("Thread Locals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(ThreadLocals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ThreadLocals), DF_VIEW_CMD_FUNCTION_NAME(ThreadLocals), DF_VIEW_UI_FUNCTION_NAME(ThreadLocals)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("types"), str8_lit_comp("Types"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Types), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Types), DF_VIEW_CMD_FUNCTION_NAME(Types), DF_VIEW_UI_FUNCTION_NAME(Types)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("procedures"), str8_lit_comp("Procedures"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Procedures), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Procedures), DF_VIEW_CMD_FUNCTION_NAME(Procedures), DF_VIEW_UI_FUNCTION_NAME(Procedures)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("output"), str8_lit_comp("Output"), DF_NameKind_Null, DF_IconKind_List, DF_VIEW_SETUP_FUNCTION_NAME(Output), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Output), DF_VIEW_CMD_FUNCTION_NAME(Output), DF_VIEW_UI_FUNCTION_NAME(Output)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("memory"), str8_lit_comp("Memory"), DF_NameKind_Null, DF_IconKind_Grid, DF_VIEW_SETUP_FUNCTION_NAME(Memory), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Memory), DF_VIEW_CMD_FUNCTION_NAME(Memory), DF_VIEW_UI_FUNCTION_NAME(Memory)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("breakpoints"), str8_lit_comp("Breakpoints"), DF_NameKind_Null, DF_IconKind_CircleFilled, DF_VIEW_SETUP_FUNCTION_NAME(Breakpoints), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Breakpoints), DF_VIEW_CMD_FUNCTION_NAME(Breakpoints), DF_VIEW_UI_FUNCTION_NAME(Breakpoints)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("watch_pins"), str8_lit_comp("Watch Pins"), DF_NameKind_Null, DF_IconKind_Pin, DF_VIEW_SETUP_FUNCTION_NAME(WatchPins), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(WatchPins), DF_VIEW_CMD_FUNCTION_NAME(WatchPins), DF_VIEW_UI_FUNCTION_NAME(WatchPins)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("exception_filters"), str8_lit_comp("Exception Filters"), DF_NameKind_Null, DF_IconKind_Gear, DF_VIEW_SETUP_FUNCTION_NAME(ExceptionFilters), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ExceptionFilters), DF_VIEW_CMD_FUNCTION_NAME(ExceptionFilters), DF_VIEW_UI_FUNCTION_NAME(ExceptionFilters)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("theme"), str8_lit_comp("Theme"), DF_NameKind_Null, DF_IconKind_Palette, DF_VIEW_SETUP_FUNCTION_NAME(Theme), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Theme), DF_VIEW_CMD_FUNCTION_NAME(Theme), DF_VIEW_UI_FUNCTION_NAME(Theme)}, +}; + +String8 df_g_theme_color_display_string_table[53] = +{ +str8_lit_comp("Null"), +str8_lit_comp("Plain Text"), +str8_lit_comp("Plain Background"), +str8_lit_comp("Plain Border"), +str8_lit_comp("Plain Overlay"), +str8_lit_comp("Code (Default)"), +str8_lit_comp("Code (Function)"), +str8_lit_comp("Code (Type)"), +str8_lit_comp("Code (Local)"), +str8_lit_comp("Code (Keyword)"), +str8_lit_comp("Code (Symbol)"), +str8_lit_comp("Code (Numeric)"), +str8_lit_comp("Code (String)"), +str8_lit_comp("Code (Meta)"), +str8_lit_comp("Code (Comment)"), +str8_lit_comp("Line Info (0)"), +str8_lit_comp("Line Info (1)"), +str8_lit_comp("Line Info (2)"), +str8_lit_comp("Line Info (3)"), +str8_lit_comp("Alt Text"), +str8_lit_comp("Alt Background"), +str8_lit_comp("Alt Border"), +str8_lit_comp("Alt Overlay"), +str8_lit_comp("Inactive Tab"), +str8_lit_comp("Active Tab"), +str8_lit_comp("Entity Background"), +str8_lit_comp("Query Bar"), +str8_lit_comp("Weak Text"), +str8_lit_comp("Text Selection"), +str8_lit_comp("Cursor"), +str8_lit_comp("Highlight (0)"), +str8_lit_comp("Highlight (1)"), +str8_lit_comp("Success Text"), +str8_lit_comp("Success Background"), +str8_lit_comp("Success Border"), +str8_lit_comp("Failure Text"), +str8_lit_comp("Failure Background"), +str8_lit_comp("Failure Border"), +str8_lit_comp("Action Text"), +str8_lit_comp("Action Background"), +str8_lit_comp("Action Border"), +str8_lit_comp("Drop Site Overlay"), +str8_lit_comp("Thread (0)"), +str8_lit_comp("Thread (1)"), +str8_lit_comp("Thread (2)"), +str8_lit_comp("Thread (3)"), +str8_lit_comp("Thread (4)"), +str8_lit_comp("Thread (5)"), +str8_lit_comp("Thread (6)"), +str8_lit_comp("Thread (7)"), +str8_lit_comp("Thread (Unwound)"), +str8_lit_comp("Inactive Panel Overlay"), +str8_lit_comp("Drop Shadow"), +}; + +String8 df_g_theme_color_cfg_string_table[53] = +{ +str8_lit_comp("null"), +str8_lit_comp("plain_text"), +str8_lit_comp("plain_background"), +str8_lit_comp("plain_border"), +str8_lit_comp("plain_overlay"), +str8_lit_comp("code_default"), +str8_lit_comp("code_function"), +str8_lit_comp("code_type"), +str8_lit_comp("code_local"), +str8_lit_comp("code_keyword"), +str8_lit_comp("code_symbol"), +str8_lit_comp("code_numeric"), +str8_lit_comp("code_string"), +str8_lit_comp("code_meta"), +str8_lit_comp("code_comment"), +str8_lit_comp("line_info_0"), +str8_lit_comp("line_info_1"), +str8_lit_comp("line_info_2"), +str8_lit_comp("line_info_3"), +str8_lit_comp("alt_text"), +str8_lit_comp("alt_background"), +str8_lit_comp("alt_border"), +str8_lit_comp("alt_overlay"), +str8_lit_comp("tab_inactive"), +str8_lit_comp("tab_active"), +str8_lit_comp("entity_background"), +str8_lit_comp("query_bar"), +str8_lit_comp("weak_text"), +str8_lit_comp("text_selection"), +str8_lit_comp("cursor"), +str8_lit_comp("highlight_0"), +str8_lit_comp("highlight_1"), +str8_lit_comp("success_text"), +str8_lit_comp("success_background"), +str8_lit_comp("success_border"), +str8_lit_comp("failure_text"), +str8_lit_comp("failure_background"), +str8_lit_comp("failure_border"), +str8_lit_comp("action_text"), +str8_lit_comp("action_background"), +str8_lit_comp("action_border"), +str8_lit_comp("drop_site_overlay"), +str8_lit_comp("thread_0"), +str8_lit_comp("thread_1"), +str8_lit_comp("thread_2"), +str8_lit_comp("thread_3"), +str8_lit_comp("thread_4"), +str8_lit_comp("thread_5"), +str8_lit_comp("thread_6"), +str8_lit_comp("thread_7"), +str8_lit_comp("thread_unwound"), +str8_lit_comp("inactive_panel_overlay"), +str8_lit_comp("drop_shadow"), +}; + +C_LINKAGE_END + diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/df/gfx/generated/df_gfx.meta.h index 9976841a..23ced75c 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/df/gfx/generated/df_gfx.meta.h @@ -247,853 +247,28 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo); -String8 df_g_theme_preset_display_string_table[] = -{ -str8_lit_comp("Default (Dark)"), -str8_lit_comp("Default (Light)"), -str8_lit_comp("VS (Dark)"), -str8_lit_comp("VS (Light)"), -str8_lit_comp("Solarized (Dark)"), -str8_lit_comp("Solarized (Light)"), -str8_lit_comp("Handmade Hero"), -str8_lit_comp("4coder"), -str8_lit_comp("Far Manager"), -}; - -String8 df_g_theme_preset_code_string_table[] = -{ -str8_lit_comp("default_dark"), -str8_lit_comp("default_light"), -str8_lit_comp("vs_dark"), -str8_lit_comp("vs_light"), -str8_lit_comp("solarized_dark"), -str8_lit_comp("solarized_light"), -str8_lit_comp("handmade_hero"), -str8_lit_comp("four_coder"), -str8_lit_comp("far_manager"), -}; - -Vec4F32 df_g_theme_preset_colors__default_dark[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x3333337f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x7fcc99ff), -rgba_from_u32_lit_comp(0x66b2e5ff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0xf7bf5eff), -rgba_from_u32_lit_comp(0x994c32ff), -rgba_from_u32_lit_comp(0x4ce54cff), -rgba_from_u32_lit_comp(0xe5cc66ff), -rgba_from_u32_lit_comp(0xe54c4cff), -rgba_from_u32_lit_comp(0x7f7f7fff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0xa87a4c99), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0x8e2d4ccc), -rgba_from_u32_lit_comp(0xffffff7f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0x66e566e5), -rgba_from_u32_lit_comp(0xb27219ff), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x32b219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x0000007f), -}; - -Vec4F32 df_g_theme_preset_colors__default_light[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x383838ff), -rgba_from_u32_lit_comp(0xedededfe), -rgba_from_u32_lit_comp(0x0000001d), -rgba_from_u32_lit_comp(0x00000033), -rgba_from_u32_lit_comp(0x282828ff), -rgba_from_u32_lit_comp(0x2a7a45ff), -rgba_from_u32_lit_comp(0x2c688fff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0xa47729ff), -rgba_from_u32_lit_comp(0x6c2d18ff), -rgba_from_u32_lit_comp(0x2c7d2cff), -rgba_from_u32_lit_comp(0xcc5a0fff), -rgba_from_u32_lit_comp(0x8a0c0cff), -rgba_from_u32_lit_comp(0x7f7f7fff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x535353ff), -rgba_from_u32_lit_comp(0xfefefebc), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0xc7a27dff), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0xd76489cc), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x7d98b34c), -rgba_from_u32_lit_comp(0x101010ff), -rgba_from_u32_lit_comp(0xb272189b), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x75db61ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xf27961ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xad7c34ff), -rgba_from_u32_lit_comp(0x639b2aff), -rgba_from_u32_lit_comp(0xa94c91ff), -rgba_from_u32_lit_comp(0x305398ff), -rgba_from_u32_lit_comp(0x339574ff), -rgba_from_u32_lit_comp(0xbf7416ff), -rgba_from_u32_lit_comp(0x57238bff), -rgba_from_u32_lit_comp(0x2a7e1cff), -rgba_from_u32_lit_comp(0x236481ff), -rgba_from_u32_lit_comp(0x0000000d), -rgba_from_u32_lit_comp(0x0000003b), -}; - -Vec4F32 df_g_theme_preset_colors__vs_dark[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x1e1e1eff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xd4d4d4ff), -rgba_from_u32_lit_comp(0xdcdcaaff), -rgba_from_u32_lit_comp(0x4ec9b0ff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0x569cd6ff), -rgba_from_u32_lit_comp(0xb4b4b4ff), -rgba_from_u32_lit_comp(0xb5cea8ff), -rgba_from_u32_lit_comp(0xd69d85ff), -rgba_from_u32_lit_comp(0x9b9b9bff), -rgba_from_u32_lit_comp(0x6a9955ff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xf1f1f1ff), -rgba_from_u32_lit_comp(0x1b1b1cff), -rgba_from_u32_lit_comp(0x333337ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0x007accff), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0x8e2d4ccc), -rgba_from_u32_lit_comp(0xffffff7f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0x66e566e5), -rgba_from_u32_lit_comp(0xb27219ff), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x32b219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x0000007f), -}; - -Vec4F32 df_g_theme_preset_colors__vs_light[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x1e1e1eff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0xcccedb1d), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0x74531fff), -rgba_from_u32_lit_comp(0x2b91afff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0x0000ffff), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0xc11515ff), -rgba_from_u32_lit_comp(0x808080ff), -rgba_from_u32_lit_comp(0x008000ff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x535353ff), -rgba_from_u32_lit_comp(0xfefefebc), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0x007accff), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0x8e2d4ccc), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x7d98b34c), -rgba_from_u32_lit_comp(0x101010ff), -rgba_from_u32_lit_comp(0xb27219ff), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x32b219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xad7c34ff), -rgba_from_u32_lit_comp(0x639b2aff), -rgba_from_u32_lit_comp(0xa94c91ff), -rgba_from_u32_lit_comp(0x305398ff), -rgba_from_u32_lit_comp(0x339574ff), -rgba_from_u32_lit_comp(0xbf7416ff), -rgba_from_u32_lit_comp(0x57238bff), -rgba_from_u32_lit_comp(0x2a7e1cff), -rgba_from_u32_lit_comp(0x236481ff), -rgba_from_u32_lit_comp(0x0000000d), -rgba_from_u32_lit_comp(0x0000003b), -}; - -Vec4F32 df_g_theme_preset_colors__solarized_dark[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x002b36ff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x839496ff), -rgba_from_u32_lit_comp(0x1c7dd1ff), -rgba_from_u32_lit_comp(0x1c7dd1ff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0x63980fff), -rgba_from_u32_lit_comp(0x839496ff), -rgba_from_u32_lit_comp(0xcb4b20ff), -rgba_from_u32_lit_comp(0x2aa198ff), -rgba_from_u32_lit_comp(0xe54c4cff), -rgba_from_u32_lit_comp(0x7f7f7fff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x002b36ff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0x28515eff), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0x8e2d4ccc), -rgba_from_u32_lit_comp(0xffffff7f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0x66e566e5), -rgba_from_u32_lit_comp(0xb27219ff), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x32b219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x0000007f), -}; - -Vec4F32 df_g_theme_preset_colors__solarized_light[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x1e1e1eff), -rgba_from_u32_lit_comp(0xfcf6e2ff), -rgba_from_u32_lit_comp(0xcccedb1d), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x74878cff), -rgba_from_u32_lit_comp(0xc39d36ff), -rgba_from_u32_lit_comp(0x66b2e5ff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0xc39d36ff), -rgba_from_u32_lit_comp(0x2e5256ff), -rgba_from_u32_lit_comp(0x657b83ff), -rgba_from_u32_lit_comp(0x5ab4a9ff), -rgba_from_u32_lit_comp(0xe54c4cff), -rgba_from_u32_lit_comp(0xadafb2ff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x535353ff), -rgba_from_u32_lit_comp(0xfcf6e2ff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0xa87a4c99), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0x8e2d4ccc), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x7d98b34c), -rgba_from_u32_lit_comp(0x101010ff), -rgba_from_u32_lit_comp(0xb27219ff), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x32b219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xad7c34ff), -rgba_from_u32_lit_comp(0x639b2aff), -rgba_from_u32_lit_comp(0xa94c91ff), -rgba_from_u32_lit_comp(0x305398ff), -rgba_from_u32_lit_comp(0x339574ff), -rgba_from_u32_lit_comp(0xbf7416ff), -rgba_from_u32_lit_comp(0x57238bff), -rgba_from_u32_lit_comp(0x2a7e1cff), -rgba_from_u32_lit_comp(0x236481ff), -rgba_from_u32_lit_comp(0x0000000d), -rgba_from_u32_lit_comp(0x0000003b), -}; - -Vec4F32 df_g_theme_preset_colors__handmade_hero[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0xa08563ff), -rgba_from_u32_lit_comp(0x0c0c0cff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xa08563ff), -rgba_from_u32_lit_comp(0xcc5735ff), -rgba_from_u32_lit_comp(0xd8a51dff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0xac7b0bff), -rgba_from_u32_lit_comp(0x994c32ff), -rgba_from_u32_lit_comp(0x6b8e23ff), -rgba_from_u32_lit_comp(0x6b8e23ff), -rgba_from_u32_lit_comp(0xdab98fff), -rgba_from_u32_lit_comp(0x686868ff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xa08563ff), -rgba_from_u32_lit_comp(0x0c0c0cff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0xa87a4c99), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0x8e2d4ccc), -rgba_from_u32_lit_comp(0xa08563af), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0x66e566e5), -rgba_from_u32_lit_comp(0xb27219ff), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x32b219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x0000007f), -}; - -Vec4F32 df_g_theme_preset_colors__four_coder[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x90b080ff), -rgba_from_u32_lit_comp(0x0c0c0cff), -rgba_from_u32_lit_comp(0x181818a0), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x90b080ff), -rgba_from_u32_lit_comp(0x7fcc99ff), -rgba_from_u32_lit_comp(0x66b2e5ff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0xd08f20ff), -rgba_from_u32_lit_comp(0x994c32ff), -rgba_from_u32_lit_comp(0x50ff30ff), -rgba_from_u32_lit_comp(0x50ff30ff), -rgba_from_u32_lit_comp(0x50ff30ff), -rgba_from_u32_lit_comp(0x2090f0ff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x90b080ff), -rgba_from_u32_lit_comp(0x0c0c0cff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0xa87a4c99), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0x8e2d4ccc), -rgba_from_u32_lit_comp(0x90b080af), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0x66e566e5), -rgba_from_u32_lit_comp(0xb27219ff), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x32b219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x0000007f), -}; - -Vec4F32 df_g_theme_preset_colors__far_manager[] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x00ffffff), -rgba_from_u32_lit_comp(0x000082ff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x00ffffff), -rgba_from_u32_lit_comp(0x49b2ffff), -rgba_from_u32_lit_comp(0x49b2ffff), -rgba_from_u32_lit_comp(0xfe9548ff), -rgba_from_u32_lit_comp(0xff0000ff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x2cff50ff), -rgba_from_u32_lit_comp(0xe5cc66ff), -rgba_from_u32_lit_comp(0xffff00ff), -rgba_from_u32_lit_comp(0x7f7f7fff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0x008184ff), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0x42474c7f), -rgba_from_u32_lit_comp(0xa87a4c99), -rgba_from_u32_lit_comp(0x4293cc99), -rgba_from_u32_lit_comp(0x8e2d4ccc), -rgba_from_u32_lit_comp(0xffffff7f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0x66e566e5), -rgba_from_u32_lit_comp(0xb27219ff), -rgba_from_u32_lit_comp(0x327f19ff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x32b219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x327fb2ff), -rgba_from_u32_lit_comp(0xffffff33), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x0000007f), -}; - -Vec4F32* df_g_theme_preset_colors_table[] = -{ -df_g_theme_preset_colors__default_dark, -df_g_theme_preset_colors__default_light, -df_g_theme_preset_colors__vs_dark, -df_g_theme_preset_colors__vs_light, -df_g_theme_preset_colors__solarized_dark, -df_g_theme_preset_colors__solarized_light, -df_g_theme_preset_colors__handmade_hero, -df_g_theme_preset_colors__four_coder, -df_g_theme_preset_colors__far_manager, -}; - -DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[] = -{ -DF_CmdParamSlot_Entity, -DF_CmdParamSlot_EntityList, -DF_CmdParamSlot_FilePath, -DF_CmdParamSlot_CmdSpec, -DF_CmdParamSlot_ID, -DF_CmdParamSlot_String, -DF_CmdParamSlot_String, -}; - -String8 df_g_cmd_param_slot_2_view_spec_dst_map[] = -{ -str8_lit_comp("entity_lister"), -str8_lit_comp("entity_lister"), -str8_lit_comp("file_system"), -str8_lit_comp("commands"), -str8_lit_comp("system_processes"), -str8_lit_comp("symbol_lister"), -str8_lit_comp("symbol_lister"), -}; - -String8 df_g_cmd_param_slot_2_view_spec_cmd_map[] = -{ -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp("goto_name"), -str8_lit_comp("function_breakpoint"), -}; - -DF_StringBindingPair df_g_default_binding_table[] = -{ -{str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("step_over_inst"), {OS_Key_F10, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("step_out"), {OS_Key_F11, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("halt"), {OS_Key_X, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("halt"), {OS_Key_Pause, 0 }}, -{str8_lit_comp("soft_halt_refresh"), {OS_Key_R, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("run"), {OS_Key_F5, 0 }}, -{str8_lit_comp("restart"), {OS_Key_F5, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("step_into"), {OS_Key_F11, 0 }}, -{str8_lit_comp("step_over"), {OS_Key_F10, 0 }}, -{str8_lit_comp("run_to_cursor"), {OS_Key_F10, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("set_next_statement"), {OS_Key_F10, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("inc_ui_font_scale"), {OS_Key_Equal, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("dec_ui_font_scale"), {OS_Key_Minus, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("inc_code_font_scale"), {OS_Key_Equal, 0 |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("dec_code_font_scale"), {OS_Key_Minus, 0 |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("window"), {OS_Key_N, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("toggle_fullscreen"), {OS_Key_Return, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("new_panel_right"), {OS_Key_P, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("new_panel_down"), {OS_Key_Minus, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("rotate_panel_columns"), {OS_Key_2, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("next_panel"), {OS_Key_Comma, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("prev_panel"), {OS_Key_Comma, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("focus_panel_right"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("focus_panel_left"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("focus_panel_up"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("focus_panel_down"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("close_panel"), {OS_Key_P, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("next_tab"), {OS_Key_PageDown, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("prev_tab"), {OS_Key_PageUp, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("next_tab"), {OS_Key_Tab, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("prev_tab"), {OS_Key_Tab, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_tab_right"), {OS_Key_PageDown, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_tab_left"), {OS_Key_PageUp, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("close_tab"), {OS_Key_W, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("tab_bar_top"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("tab_bar_bottom"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("open"), {OS_Key_O, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("reload_active"), {OS_Key_R, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("switch"), {OS_Key_I, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("switch_to_partner_file"), {OS_Key_O, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("load_user"), {OS_Key_O, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("load_profile"), {OS_Key_O, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("move_left"), {OS_Key_Left, 0 }}, -{str8_lit_comp("move_right"), {OS_Key_Right, 0 }}, -{str8_lit_comp("move_up"), {OS_Key_Up, 0 }}, -{str8_lit_comp("move_down"), {OS_Key_Down, 0 }}, -{str8_lit_comp("move_left_select"), {OS_Key_Left, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_right_select"), {OS_Key_Right, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_select"), {OS_Key_Up, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_down_select"), {OS_Key_Down, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_left_chunk"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_right_chunk"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_up_chunk"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_down_chunk"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_up_page"), {OS_Key_PageUp, 0 }}, -{str8_lit_comp("move_down_page"), {OS_Key_PageDown, 0 }}, -{str8_lit_comp("move_up_whole"), {OS_Key_Home, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_down_whole"), {OS_Key_End, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_left_chunk_select"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_right_chunk_select"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_chunk_select"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_down_chunk_select"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_page_select"), {OS_Key_PageUp, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_down_page_select"), {OS_Key_PageDown, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_whole_select"), {OS_Key_Home, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_down_whole_select"), {OS_Key_End, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_home"), {OS_Key_Home, 0 }}, -{str8_lit_comp("move_end"), {OS_Key_End, 0 }}, -{str8_lit_comp("move_home_select"), {OS_Key_Home, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_end_select"), {OS_Key_End, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("select_all"), {OS_Key_A, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("delete_single"), {OS_Key_Delete, 0 }}, -{str8_lit_comp("delete_chunk"), {OS_Key_Delete, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("backspace_single"), {OS_Key_Backspace, 0 }}, -{str8_lit_comp("backspace_chunk"), {OS_Key_Backspace, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("copy"), {OS_Key_C, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("cut"), {OS_Key_X, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("paste"), {OS_Key_V, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("insert_text"), {OS_Key_Null, 0 }}, -{str8_lit_comp("goto_line"), {OS_Key_G, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("goto_address"), {OS_Key_G, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("find_text_forward"), {OS_Key_F, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("find_text_backward"), {OS_Key_R, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("find_next"), {OS_Key_F3, 0 }}, -{str8_lit_comp("find_prev"), {OS_Key_F3, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("find_selected_thread"), {OS_Key_F4, 0 }}, -{str8_lit_comp("goto_name"), {OS_Key_J, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("goto_name_at_cursor"), {OS_Key_F12, 0 }}, -{str8_lit_comp("toggle_watch_expr_at_cursor"), {OS_Key_W, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("toggle_watch_pin_at_cursor"), {OS_Key_F9, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("toggle_breakpoint_cursor"), {OS_Key_F9, 0 }}, -{str8_lit_comp("add_target"), {OS_Key_T, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("attach"), {OS_Key_F6, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("filter"), {OS_Key_Slash, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("run_command"), {OS_Key_F1, 0 }}, -}; - -String8 df_g_binding_version_remap_old_name_table[] = -{ -str8_lit_comp("commands"), -str8_lit_comp("load_user"), -str8_lit_comp("load_profile"), -}; - -String8 df_g_binding_version_remap_new_name_table[] = -{ -str8_lit_comp("run_command"), -str8_lit_comp("open_user"), -str8_lit_comp("open_profile"), -}; - -DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[] = -{ -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("null"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Null), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null), DF_VIEW_CMD_FUNCTION_NAME(Null), DF_VIEW_UI_FUNCTION_NAME(Null)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("empty"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Empty), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Empty), DF_VIEW_CMD_FUNCTION_NAME(Empty), DF_VIEW_UI_FUNCTION_NAME(Empty)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("commands"), str8_lit_comp("Commands"), DF_NameKind_Null, DF_IconKind_List, DF_VIEW_SETUP_FUNCTION_NAME(Commands), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Commands), DF_VIEW_CMD_FUNCTION_NAME(Commands), DF_VIEW_UI_FUNCTION_NAME(Commands)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("file_system"), str8_lit_comp("File System"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FileSystem), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FileSystem), DF_VIEW_CMD_FUNCTION_NAME(FileSystem), DF_VIEW_UI_FUNCTION_NAME(FileSystem)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("system_processes"), str8_lit_comp("System Processes"), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(SystemProcesses), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(SystemProcesses), DF_VIEW_CMD_FUNCTION_NAME(SystemProcesses), DF_VIEW_UI_FUNCTION_NAME(SystemProcesses)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("entity_lister"), str8_lit_comp("Entity List"), DF_NameKind_EntityKindName, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(EntityLister), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(EntityLister), DF_VIEW_CMD_FUNCTION_NAME(EntityLister), DF_VIEW_UI_FUNCTION_NAME(EntityLister)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("symbol_lister"), str8_lit_comp("Symbols"), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(SymbolLister), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(SymbolLister), DF_VIEW_CMD_FUNCTION_NAME(SymbolLister), DF_VIEW_UI_FUNCTION_NAME(SymbolLister)}, -{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("target"), str8_lit_comp("Target"), DF_NameKind_EntityName, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Target), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Target), DF_VIEW_CMD_FUNCTION_NAME(Target), DF_VIEW_UI_FUNCTION_NAME(Target)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("targets"), str8_lit_comp("Targets"), DF_NameKind_Null, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Targets), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Targets), DF_VIEW_CMD_FUNCTION_NAME(Targets), DF_VIEW_UI_FUNCTION_NAME(Targets)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("file_path_map"), str8_lit_comp("File Path Map"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FilePathMap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FilePathMap), DF_VIEW_CMD_FUNCTION_NAME(FilePathMap), DF_VIEW_UI_FUNCTION_NAME(FilePathMap)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("scheduler"), str8_lit_comp("Scheduler"), DF_NameKind_Null, DF_IconKind_Scheduler, DF_VIEW_SETUP_FUNCTION_NAME(Scheduler), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Scheduler), DF_VIEW_CMD_FUNCTION_NAME(Scheduler), DF_VIEW_UI_FUNCTION_NAME(Scheduler)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("call_stack"), str8_lit_comp("Call Stack"), DF_NameKind_Null, DF_IconKind_Thread, DF_VIEW_SETUP_FUNCTION_NAME(CallStack), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(CallStack), DF_VIEW_CMD_FUNCTION_NAME(CallStack), DF_VIEW_UI_FUNCTION_NAME(CallStack)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("modules"), str8_lit_comp("Modules"), DF_NameKind_Null, DF_IconKind_Module, DF_VIEW_SETUP_FUNCTION_NAME(Modules), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Modules), DF_VIEW_CMD_FUNCTION_NAME(Modules), DF_VIEW_UI_FUNCTION_NAME(Modules)}, -{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("pending_entity"), str8_lit_comp("Pending Entity"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(PendingEntity), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(PendingEntity), DF_VIEW_CMD_FUNCTION_NAME(PendingEntity), DF_VIEW_UI_FUNCTION_NAME(PendingEntity)}, -{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("code"), str8_lit_comp("Code"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(Code), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Code), DF_VIEW_CMD_FUNCTION_NAME(Code), DF_VIEW_UI_FUNCTION_NAME(Code)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("disassembly"), str8_lit_comp("Disassembly"), DF_NameKind_Null, DF_IconKind_Glasses, DF_VIEW_SETUP_FUNCTION_NAME(Disassembly), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Disassembly), DF_VIEW_CMD_FUNCTION_NAME(Disassembly), DF_VIEW_UI_FUNCTION_NAME(Disassembly)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("watch"), str8_lit_comp("Watch"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Watch), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Watch), DF_VIEW_CMD_FUNCTION_NAME(Watch), DF_VIEW_UI_FUNCTION_NAME(Watch)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("locals"), str8_lit_comp("Locals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Locals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Locals), DF_VIEW_CMD_FUNCTION_NAME(Locals), DF_VIEW_UI_FUNCTION_NAME(Locals)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("registers"), str8_lit_comp("Registers"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Registers), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Registers), DF_VIEW_CMD_FUNCTION_NAME(Registers), DF_VIEW_UI_FUNCTION_NAME(Registers)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("globals"), str8_lit_comp("Globals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Globals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Globals), DF_VIEW_CMD_FUNCTION_NAME(Globals), DF_VIEW_UI_FUNCTION_NAME(Globals)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("thread_locals"), str8_lit_comp("Thread Locals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(ThreadLocals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ThreadLocals), DF_VIEW_CMD_FUNCTION_NAME(ThreadLocals), DF_VIEW_UI_FUNCTION_NAME(ThreadLocals)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("types"), str8_lit_comp("Types"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Types), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Types), DF_VIEW_CMD_FUNCTION_NAME(Types), DF_VIEW_UI_FUNCTION_NAME(Types)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("procedures"), str8_lit_comp("Procedures"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Procedures), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Procedures), DF_VIEW_CMD_FUNCTION_NAME(Procedures), DF_VIEW_UI_FUNCTION_NAME(Procedures)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("output"), str8_lit_comp("Output"), DF_NameKind_Null, DF_IconKind_List, DF_VIEW_SETUP_FUNCTION_NAME(Output), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Output), DF_VIEW_CMD_FUNCTION_NAME(Output), DF_VIEW_UI_FUNCTION_NAME(Output)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("memory"), str8_lit_comp("Memory"), DF_NameKind_Null, DF_IconKind_Grid, DF_VIEW_SETUP_FUNCTION_NAME(Memory), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Memory), DF_VIEW_CMD_FUNCTION_NAME(Memory), DF_VIEW_UI_FUNCTION_NAME(Memory)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("breakpoints"), str8_lit_comp("Breakpoints"), DF_NameKind_Null, DF_IconKind_CircleFilled, DF_VIEW_SETUP_FUNCTION_NAME(Breakpoints), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Breakpoints), DF_VIEW_CMD_FUNCTION_NAME(Breakpoints), DF_VIEW_UI_FUNCTION_NAME(Breakpoints)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("watch_pins"), str8_lit_comp("Watch Pins"), DF_NameKind_Null, DF_IconKind_Pin, DF_VIEW_SETUP_FUNCTION_NAME(WatchPins), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(WatchPins), DF_VIEW_CMD_FUNCTION_NAME(WatchPins), DF_VIEW_UI_FUNCTION_NAME(WatchPins)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("exception_filters"), str8_lit_comp("Exception Filters"), DF_NameKind_Null, DF_IconKind_Gear, DF_VIEW_SETUP_FUNCTION_NAME(ExceptionFilters), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ExceptionFilters), DF_VIEW_CMD_FUNCTION_NAME(ExceptionFilters), DF_VIEW_UI_FUNCTION_NAME(ExceptionFilters)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("theme"), str8_lit_comp("Theme"), DF_NameKind_Null, DF_IconKind_Palette, DF_VIEW_SETUP_FUNCTION_NAME(Theme), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Theme), DF_VIEW_CMD_FUNCTION_NAME(Theme), DF_VIEW_UI_FUNCTION_NAME(Theme)}, -}; - -String8 df_g_theme_color_display_string_table[] = -{ -str8_lit_comp("Null"), -str8_lit_comp("Plain Text"), -str8_lit_comp("Plain Background"), -str8_lit_comp("Plain Border"), -str8_lit_comp("Plain Overlay"), -str8_lit_comp("Code (Default)"), -str8_lit_comp("Code (Function)"), -str8_lit_comp("Code (Type)"), -str8_lit_comp("Code (Local)"), -str8_lit_comp("Code (Keyword)"), -str8_lit_comp("Code (Symbol)"), -str8_lit_comp("Code (Numeric)"), -str8_lit_comp("Code (String)"), -str8_lit_comp("Code (Meta)"), -str8_lit_comp("Code (Comment)"), -str8_lit_comp("Line Info (0)"), -str8_lit_comp("Line Info (1)"), -str8_lit_comp("Line Info (2)"), -str8_lit_comp("Line Info (3)"), -str8_lit_comp("Alt Text"), -str8_lit_comp("Alt Background"), -str8_lit_comp("Alt Border"), -str8_lit_comp("Alt Overlay"), -str8_lit_comp("Inactive Tab"), -str8_lit_comp("Active Tab"), -str8_lit_comp("Entity Background"), -str8_lit_comp("Query Bar"), -str8_lit_comp("Weak Text"), -str8_lit_comp("Text Selection"), -str8_lit_comp("Cursor"), -str8_lit_comp("Highlight (0)"), -str8_lit_comp("Highlight (1)"), -str8_lit_comp("Success Text"), -str8_lit_comp("Success Background"), -str8_lit_comp("Success Border"), -str8_lit_comp("Failure Text"), -str8_lit_comp("Failure Background"), -str8_lit_comp("Failure Border"), -str8_lit_comp("Action Text"), -str8_lit_comp("Action Background"), -str8_lit_comp("Action Border"), -str8_lit_comp("Drop Site Overlay"), -str8_lit_comp("Thread (0)"), -str8_lit_comp("Thread (1)"), -str8_lit_comp("Thread (2)"), -str8_lit_comp("Thread (3)"), -str8_lit_comp("Thread (4)"), -str8_lit_comp("Thread (5)"), -str8_lit_comp("Thread (6)"), -str8_lit_comp("Thread (7)"), -str8_lit_comp("Thread (Unwound)"), -str8_lit_comp("Inactive Panel Overlay"), -str8_lit_comp("Drop Shadow"), -}; - -String8 df_g_theme_color_cfg_string_table[] = -{ -str8_lit_comp("null"), -str8_lit_comp("plain_text"), -str8_lit_comp("plain_background"), -str8_lit_comp("plain_border"), -str8_lit_comp("plain_overlay"), -str8_lit_comp("code_default"), -str8_lit_comp("code_function"), -str8_lit_comp("code_type"), -str8_lit_comp("code_local"), -str8_lit_comp("code_keyword"), -str8_lit_comp("code_symbol"), -str8_lit_comp("code_numeric"), -str8_lit_comp("code_string"), -str8_lit_comp("code_meta"), -str8_lit_comp("code_comment"), -str8_lit_comp("line_info_0"), -str8_lit_comp("line_info_1"), -str8_lit_comp("line_info_2"), -str8_lit_comp("line_info_3"), -str8_lit_comp("alt_text"), -str8_lit_comp("alt_background"), -str8_lit_comp("alt_border"), -str8_lit_comp("alt_overlay"), -str8_lit_comp("tab_inactive"), -str8_lit_comp("tab_active"), -str8_lit_comp("entity_background"), -str8_lit_comp("query_bar"), -str8_lit_comp("weak_text"), -str8_lit_comp("text_selection"), -str8_lit_comp("cursor"), -str8_lit_comp("highlight_0"), -str8_lit_comp("highlight_1"), -str8_lit_comp("success_text"), -str8_lit_comp("success_background"), -str8_lit_comp("success_border"), -str8_lit_comp("failure_text"), -str8_lit_comp("failure_background"), -str8_lit_comp("failure_border"), -str8_lit_comp("action_text"), -str8_lit_comp("action_background"), -str8_lit_comp("action_border"), -str8_lit_comp("drop_site_overlay"), -str8_lit_comp("thread_0"), -str8_lit_comp("thread_1"), -str8_lit_comp("thread_2"), -str8_lit_comp("thread_3"), -str8_lit_comp("thread_4"), -str8_lit_comp("thread_5"), -str8_lit_comp("thread_6"), -str8_lit_comp("thread_7"), -str8_lit_comp("thread_unwound"), -str8_lit_comp("inactive_panel_overlay"), -str8_lit_comp("drop_shadow"), -}; - +C_LINKAGE_BEGIN +extern String8 df_g_theme_preset_display_string_table[9]; +extern String8 df_g_theme_preset_code_string_table[9]; +extern Vec4F32 df_g_theme_preset_colors__default_dark[53]; +extern Vec4F32 df_g_theme_preset_colors__default_light[53]; +extern Vec4F32 df_g_theme_preset_colors__vs_dark[53]; +extern Vec4F32 df_g_theme_preset_colors__vs_light[53]; +extern Vec4F32 df_g_theme_preset_colors__solarized_dark[53]; +extern Vec4F32 df_g_theme_preset_colors__solarized_light[53]; +extern Vec4F32 df_g_theme_preset_colors__handmade_hero[53]; +extern Vec4F32 df_g_theme_preset_colors__four_coder[53]; +extern Vec4F32 df_g_theme_preset_colors__far_manager[53]; +extern Vec4F32* df_g_theme_preset_colors_table[9]; +extern DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[7]; +extern String8 df_g_cmd_param_slot_2_view_spec_dst_map[7]; +extern String8 df_g_cmd_param_slot_2_view_spec_cmd_map[7]; +extern DF_StringBindingPair df_g_default_binding_table[97]; +extern String8 df_g_binding_version_remap_old_name_table[3]; +extern String8 df_g_binding_version_remap_new_name_table[3]; +extern DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29]; +extern String8 df_g_theme_color_display_string_table[53]; +extern String8 df_g_theme_color_cfg_string_table[53]; read_only global U8 df_g_icon_font_bytes__data[] = { 0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x80,0x00,0x03,0x00,0x70,0x47,0x53,0x55,0x42,0x20,0x8b,0x25,0x7a,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x4f,0x53,0x2f,0x32,0x56,0x44,0x49,0xa0,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0x2a,0x09,0xe2,0xc2,0x00,0x00,0x01,0xb0,0x00,0x00,0x05,0xec,0x63,0x76,0x74,0x20, @@ -5674,5 +4849,6 @@ read_only global U8 df_g_default_code_font_bytes__data[] = }; read_only global String8 df_g_default_code_font_bytes = {df_g_default_code_font_bytes__data, sizeof(df_g_default_code_font_bytes__data)}; +C_LINKAGE_END #endif // DF_GFX_META_H diff --git a/src/draw/generated/draw.meta.c b/src/draw/generated/draw.meta.c index 50ed1be1..eee3e601 100644 --- a/src/draw/generated/draw.meta.c +++ b/src/draw/generated/draw.meta.c @@ -15,3 +15,6 @@ internal R_Tex2DSampleKind d_top_tex2d_sample_kind(void) {D_StackTopImp internal Mat3x3F32 d_top_xform2d(void) {D_StackTopImpl(XForm2D, xform2d, Mat3x3F32);} internal Rng2F32 d_top_clip(void) {D_StackTopImpl(Clip, clip, Rng2F32);} internal F32 d_top_transparency(void) {D_StackTopImpl(Transparency, transparency, F32);} +C_LINKAGE_BEGIN +C_LINKAGE_END + diff --git a/src/draw/generated/draw.meta.h b/src/draw/generated/draw.meta.h index 0cf4f6d9..e465899d 100644 --- a/src/draw/generated/draw.meta.h +++ b/src/draw/generated/draw.meta.h @@ -46,5 +46,7 @@ internal F32 d_top_transparency(void); #define D_ClipScope(v) DeferLoop(d_push_clip(v), d_pop_clip()) #define D_TransparencyScope(v) DeferLoop(d_push_transparency(v), d_pop_transparency()) #endif +C_LINKAGE_BEGIN +C_LINKAGE_END #endif // DRAW_META_H diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 6c26e6e3..791579bf 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/eval.meta.c" + //////////////////////////////// //~ rjf: Basic Functions diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index b9d27fe6..e962686e 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -3,3 +3,150 @@ //- GENERATED CODE +C_LINKAGE_BEGIN +U8 eval_expr_kind_child_counts[39] = +{ +2, +2, +1, +1, +2, +1, +1, +1, +1, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +2, +3, +0, +0, +0, +0, +0, +0, +1, +2, +1, +2, +0, +}; + +String8 eval_expr_kind_strings[39] = +{ +str8_lit_comp("ArrayIndex"), +str8_lit_comp("MemberAccess"), +str8_lit_comp("Deref"), +str8_lit_comp("Address"), +str8_lit_comp("Cast"), +str8_lit_comp("Sizeof"), +str8_lit_comp("Neg"), +str8_lit_comp("LogNot"), +str8_lit_comp("BitNot"), +str8_lit_comp("Mul"), +str8_lit_comp("Div"), +str8_lit_comp("Mod"), +str8_lit_comp("Add"), +str8_lit_comp("Sub"), +str8_lit_comp("LShift"), +str8_lit_comp("RShift"), +str8_lit_comp("Less"), +str8_lit_comp("LsEq"), +str8_lit_comp("Grtr"), +str8_lit_comp("GrEq"), +str8_lit_comp("EqEq"), +str8_lit_comp("NtEq"), +str8_lit_comp("BitAnd"), +str8_lit_comp("BitXor"), +str8_lit_comp("BitOr"), +str8_lit_comp("LogAnd"), +str8_lit_comp("LogOr"), +str8_lit_comp("Ternary"), +str8_lit_comp("LeafBytecode"), +str8_lit_comp("LeafMember"), +str8_lit_comp("LeafU64"), +str8_lit_comp("LeafF64"), +str8_lit_comp("LeafF32"), +str8_lit_comp("TypeIdent"), +str8_lit_comp("Ptr"), +str8_lit_comp("Array"), +str8_lit_comp("Func"), +str8_lit_comp("Define"), +str8_lit_comp("LeafIdent"), +}; + +String8 eval_result_code_display_strings[11] = +{ +str8_lit_comp(""), +str8_lit_comp("Cannot divide by zero."), +str8_lit_comp("Invalid operation."), +str8_lit_comp("Invalid operation types."), +str8_lit_comp("Failed memory read."), +str8_lit_comp("Failed register read."), +str8_lit_comp("Invalid frame base address."), +str8_lit_comp("Invalid module base address."), +str8_lit_comp("Invalid thread-local storage base address."), +str8_lit_comp("Insufficient evaluation machine stack space."), +str8_lit_comp("Malformed bytecode."), +}; + +String8 eval_expr_op_strings[39] = +{ +str8_lit_comp("[]"), +str8_lit_comp("."), +str8_lit_comp("*"), +str8_lit_comp("&"), +str8_lit_comp("cast"), +str8_lit_comp("sizeof"), +str8_lit_comp("-"), +str8_lit_comp("!"), +str8_lit_comp("~"), +str8_lit_comp("*"), +str8_lit_comp("/"), +str8_lit_comp("%"), +str8_lit_comp("+"), +str8_lit_comp("-"), +str8_lit_comp("<<"), +str8_lit_comp(">>"), +str8_lit_comp("<"), +str8_lit_comp("<="), +str8_lit_comp(">"), +str8_lit_comp(">="), +str8_lit_comp("=="), +str8_lit_comp("!="), +str8_lit_comp("&"), +str8_lit_comp("^"), +str8_lit_comp("|"), +str8_lit_comp("&&"), +str8_lit_comp("||"), +str8_lit_comp("? "), +str8_lit_comp("bytecode"), +str8_lit_comp("member"), +str8_lit_comp("U64"), +str8_lit_comp("F64"), +str8_lit_comp("F32"), +str8_lit_comp("type_ident"), +str8_lit_comp("ptr"), +str8_lit_comp("array"), +str8_lit_comp("function"), +str8_lit_comp("="), +str8_lit_comp("leaf_ident"), +}; + +C_LINKAGE_END + diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index e05fae16..0527136d 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -67,149 +67,11 @@ EVAL_ResultCode_MalformedBytecode, EVAL_ResultCode_COUNT, } EVAL_ResultCode; -U8 eval_expr_kind_child_counts[] = -{ -2, -2, -1, -1, -2, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -3, -0, -0, -0, -0, -0, -0, -1, -2, -1, -2, -0, -}; - -String8 eval_expr_kind_strings[] = -{ -str8_lit_comp("ArrayIndex"), -str8_lit_comp("MemberAccess"), -str8_lit_comp("Deref"), -str8_lit_comp("Address"), -str8_lit_comp("Cast"), -str8_lit_comp("Sizeof"), -str8_lit_comp("Neg"), -str8_lit_comp("LogNot"), -str8_lit_comp("BitNot"), -str8_lit_comp("Mul"), -str8_lit_comp("Div"), -str8_lit_comp("Mod"), -str8_lit_comp("Add"), -str8_lit_comp("Sub"), -str8_lit_comp("LShift"), -str8_lit_comp("RShift"), -str8_lit_comp("Less"), -str8_lit_comp("LsEq"), -str8_lit_comp("Grtr"), -str8_lit_comp("GrEq"), -str8_lit_comp("EqEq"), -str8_lit_comp("NtEq"), -str8_lit_comp("BitAnd"), -str8_lit_comp("BitXor"), -str8_lit_comp("BitOr"), -str8_lit_comp("LogAnd"), -str8_lit_comp("LogOr"), -str8_lit_comp("Ternary"), -str8_lit_comp("LeafBytecode"), -str8_lit_comp("LeafMember"), -str8_lit_comp("LeafU64"), -str8_lit_comp("LeafF64"), -str8_lit_comp("LeafF32"), -str8_lit_comp("TypeIdent"), -str8_lit_comp("Ptr"), -str8_lit_comp("Array"), -str8_lit_comp("Func"), -str8_lit_comp("Define"), -str8_lit_comp("LeafIdent"), -}; - -String8 eval_result_code_display_strings[] = -{ -str8_lit_comp(""), -str8_lit_comp("Cannot divide by zero."), -str8_lit_comp("Invalid operation."), -str8_lit_comp("Invalid operation types."), -str8_lit_comp("Failed memory read."), -str8_lit_comp("Failed register read."), -str8_lit_comp("Invalid frame base address."), -str8_lit_comp("Invalid module base address."), -str8_lit_comp("Invalid thread-local storage base address."), -str8_lit_comp("Insufficient evaluation machine stack space."), -str8_lit_comp("Malformed bytecode."), -}; - -String8 eval_expr_op_strings[] = -{ -str8_lit_comp("[]"), -str8_lit_comp("."), -str8_lit_comp("*"), -str8_lit_comp("&"), -str8_lit_comp("cast"), -str8_lit_comp("sizeof"), -str8_lit_comp("-"), -str8_lit_comp("!"), -str8_lit_comp("~"), -str8_lit_comp("*"), -str8_lit_comp("/"), -str8_lit_comp("%"), -str8_lit_comp("+"), -str8_lit_comp("-"), -str8_lit_comp("<<"), -str8_lit_comp(">>"), -str8_lit_comp("<"), -str8_lit_comp("<="), -str8_lit_comp(">"), -str8_lit_comp(">="), -str8_lit_comp("=="), -str8_lit_comp("!="), -str8_lit_comp("&"), -str8_lit_comp("^"), -str8_lit_comp("|"), -str8_lit_comp("&&"), -str8_lit_comp("||"), -str8_lit_comp("? "), -str8_lit_comp("bytecode"), -str8_lit_comp("member"), -str8_lit_comp("U64"), -str8_lit_comp("F64"), -str8_lit_comp("F32"), -str8_lit_comp("type_ident"), -str8_lit_comp("ptr"), -str8_lit_comp("array"), -str8_lit_comp("function"), -str8_lit_comp("="), -str8_lit_comp("leaf_ident"), -}; - +C_LINKAGE_BEGIN +extern U8 eval_expr_kind_child_counts[39]; +extern String8 eval_expr_kind_strings[39]; +extern String8 eval_result_code_display_strings[11]; +extern String8 eval_expr_op_strings[39]; +C_LINKAGE_END #endif // EVAL_META_H diff --git a/src/lib_raddbgi_cons/raddbgi_cons.c b/src/lib_raddbgi_cons/raddbgi_cons.c index 8eaed41e..51fddf42 100644 --- a/src/lib_raddbgi_cons/raddbgi_cons.c +++ b/src/lib_raddbgi_cons/raddbgi_cons.c @@ -211,8 +211,8 @@ raddbgic_str8_list_join(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDB RADDBGIC_String8 result; raddbgic_memzero_struct(&result); RADDBGI_U64 sep_count = (list->RADDBGIC_String8List_NodeCountMember > 1) ? (list->RADDBGIC_String8List_NodeCountMember-1) : 0; - result.RADDBGIC_String8_SizeMember = list->RADDBGIC_String8List_TotalSizeMember; - result.RADDBGIC_String8_BaseMember = raddbgic_push_array_no_zero(arena, RADDBGI_U8, result.RADDBGIC_String8_SizeMember+sep_count*sep.RADDBGIC_String8_SizeMember+1); + result.RADDBGIC_String8_SizeMember = list->RADDBGIC_String8List_TotalSizeMember+sep_count*sep.RADDBGIC_String8_SizeMember; + result.RADDBGIC_String8_BaseMember = raddbgic_push_array_no_zero(arena, RADDBGI_U8, result.RADDBGIC_String8_SizeMember+1); RADDBGI_U64 off = 0; for(RADDBGIC_String8Node *node = list->RADDBGIC_String8List_FirstMember; node != 0; @@ -230,7 +230,7 @@ raddbgic_str8_list_join(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDB off += sep.RADDBGIC_String8_SizeMember; } } - result.RADDBGIC_String8_BaseMember[result.RADDBGIC_String8_SizeMember] = 0; + result.RADDBGIC_String8_BaseMember[off] = 0; return result; } diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 36d47408..077cca34 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -224,15 +224,18 @@ int main(int argument_count, char **arguments) String8 element_type = tag->first->string; String8 layer_key = mg_layer_key_from_path(file->string); MG_Layer *layer = mg_layer_from_key(layer_key); - String8List *out = md_node_has_tag(node, str8_lit("c_file"), 0) ? &layer->c_tables : &layer->h_tables; String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - str8_list_pushf(mg_arena, out, "%S %S[] =\n{\n", element_type, node->string); + if(!md_node_has_tag(node, str8_lit("c_file"), 0)) + { + str8_list_pushf(mg_arena, &layer->h_tables, "extern %S %S[%I64u];\n", element_type, node->string, gen_strings.node_count); + } + str8_list_pushf(mg_arena, &layer->c_tables, "%S %S[%I64u] =\n{\n", element_type, node->string, gen_strings.node_count); for(String8Node *n = gen_strings.first; n != 0; n = n->next) { String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_pushf(mg_arena, out, "%S,\n", escaped); + str8_list_pushf(mg_arena, &layer->c_tables, "%S,\n", escaped); } - str8_list_push(mg_arena, out, str8_lit("};\n\n")); + str8_list_push(mg_arena, &layer->c_tables, str8_lit("};\n\n")); } } } @@ -401,11 +404,13 @@ int main(int argument_count, char **arguments) { fwrite(n->string.str, n->string.size, 1, h); } + fprintf(h, "C_LINKAGE_BEGIN\n"); for(String8Node *n = layer->h_tables.first; n != 0; n = n->next) { fwrite(n->string.str, n->string.size, 1, h); } - fprintf(h, "\n#endif // %.*s_META_H\n", str8_varg(layer_key_filename_upper)); + fprintf(h, "C_LINKAGE_END\n\n"); + fprintf(h, "#endif // %.*s_META_H\n", str8_varg(layer_key_filename_upper)); fclose(h); } { @@ -421,10 +426,12 @@ int main(int argument_count, char **arguments) { fwrite(n->string.str, n->string.size, 1, c); } + fprintf(c, "C_LINKAGE_BEGIN\n"); for(String8Node *n = layer->c_tables.first; n != 0; n = n->next) { fwrite(n->string.str, n->string.size, 1, c); } + fprintf(c, "C_LINKAGE_END\n\n"); fclose(c); } } diff --git a/src/os/gfx/generated/os_gfx.meta.c b/src/os/gfx/generated/os_gfx.meta.c index b9d27fe6..04e5dc17 100644 --- a/src/os/gfx/generated/os_gfx.meta.c +++ b/src/os/gfx/generated/os_gfx.meta.c @@ -3,3 +3,300 @@ //- GENERATED CODE +C_LINKAGE_BEGIN +String8 os_g_key_display_string_table[143] = +{ +str8_lit_comp("Invalid Key"), +str8_lit_comp("Escape"), +str8_lit_comp("F1"), +str8_lit_comp("F2"), +str8_lit_comp("F3"), +str8_lit_comp("F4"), +str8_lit_comp("F5"), +str8_lit_comp("F6"), +str8_lit_comp("F7"), +str8_lit_comp("F8"), +str8_lit_comp("F9"), +str8_lit_comp("F10"), +str8_lit_comp("F11"), +str8_lit_comp("F12"), +str8_lit_comp("F13"), +str8_lit_comp("F14"), +str8_lit_comp("F15"), +str8_lit_comp("F16"), +str8_lit_comp("F17"), +str8_lit_comp("F18"), +str8_lit_comp("F19"), +str8_lit_comp("F20"), +str8_lit_comp("F21"), +str8_lit_comp("F22"), +str8_lit_comp("F23"), +str8_lit_comp("F24"), +str8_lit_comp("Tick"), +str8_lit_comp("0"), +str8_lit_comp("1"), +str8_lit_comp("2"), +str8_lit_comp("3"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("6"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("9"), +str8_lit_comp("Minus"), +str8_lit_comp("Equal"), +str8_lit_comp("Backspace"), +str8_lit_comp("Tab"), +str8_lit_comp("Q"), +str8_lit_comp("W"), +str8_lit_comp("E"), +str8_lit_comp("R"), +str8_lit_comp("T"), +str8_lit_comp("Y"), +str8_lit_comp("U"), +str8_lit_comp("I"), +str8_lit_comp("O"), +str8_lit_comp("P"), +str8_lit_comp("Left Bracket"), +str8_lit_comp("Right Bracket"), +str8_lit_comp("Back Slash"), +str8_lit_comp("Caps Lock"), +str8_lit_comp("A"), +str8_lit_comp("S"), +str8_lit_comp("D"), +str8_lit_comp("F"), +str8_lit_comp("G"), +str8_lit_comp("H"), +str8_lit_comp("J"), +str8_lit_comp("K"), +str8_lit_comp("L"), +str8_lit_comp("Semicolon"), +str8_lit_comp("Quote"), +str8_lit_comp("Return"), +str8_lit_comp("Shift"), +str8_lit_comp("Z"), +str8_lit_comp("X"), +str8_lit_comp("C"), +str8_lit_comp("V"), +str8_lit_comp("B"), +str8_lit_comp("N"), +str8_lit_comp("M"), +str8_lit_comp("Comma"), +str8_lit_comp("Period"), +str8_lit_comp("Slash"), +str8_lit_comp("Ctrl"), +str8_lit_comp("Alt"), +str8_lit_comp("Space"), +str8_lit_comp("Menu"), +str8_lit_comp("Scroll Lock"), +str8_lit_comp("Pause"), +str8_lit_comp("Insert"), +str8_lit_comp("Home"), +str8_lit_comp("Page Up"), +str8_lit_comp("Delete"), +str8_lit_comp("End"), +str8_lit_comp("Page Down"), +str8_lit_comp("Up"), +str8_lit_comp("Left"), +str8_lit_comp("Down"), +str8_lit_comp("Right"), +str8_lit_comp("Ex0"), +str8_lit_comp("Ex1"), +str8_lit_comp("Ex2"), +str8_lit_comp("Ex3"), +str8_lit_comp("Ex4"), +str8_lit_comp("Ex5"), +str8_lit_comp("Ex6"), +str8_lit_comp("Ex7"), +str8_lit_comp("Ex8"), +str8_lit_comp("Ex9"), +str8_lit_comp("Ex10"), +str8_lit_comp("Ex11"), +str8_lit_comp("Ex12"), +str8_lit_comp("Ex13"), +str8_lit_comp("Ex14"), +str8_lit_comp("Ex15"), +str8_lit_comp("Ex16"), +str8_lit_comp("Ex17"), +str8_lit_comp("Ex18"), +str8_lit_comp("Ex19"), +str8_lit_comp("Ex20"), +str8_lit_comp("Ex21"), +str8_lit_comp("Ex22"), +str8_lit_comp("Ex23"), +str8_lit_comp("Ex24"), +str8_lit_comp("Ex25"), +str8_lit_comp("Ex26"), +str8_lit_comp("Ex27"), +str8_lit_comp("Ex28"), +str8_lit_comp("Ex29"), +str8_lit_comp("Num Lock"), +str8_lit_comp("Numpad Slash"), +str8_lit_comp("Numpad Star"), +str8_lit_comp("Numpad Minus"), +str8_lit_comp("Numpad Plus"), +str8_lit_comp("Numpad Period"), +str8_lit_comp("Numpad 0"), +str8_lit_comp("Numpad 1"), +str8_lit_comp("Numpad 2"), +str8_lit_comp("Numpad 3"), +str8_lit_comp("Numpad 4"), +str8_lit_comp("Numpad 5"), +str8_lit_comp("Numpad 6"), +str8_lit_comp("Numpad 7"), +str8_lit_comp("Numpad 8"), +str8_lit_comp("Numpad 9"), +str8_lit_comp("Left Mouse Button"), +str8_lit_comp("Middle Mouse Button"), +str8_lit_comp("Right Mouse Button"), +}; + +String8 os_g_key_cfg_string_table[143] = +{ +str8_lit_comp("null"), +str8_lit_comp("esc"), +str8_lit_comp("f1"), +str8_lit_comp("f2"), +str8_lit_comp("f3"), +str8_lit_comp("f4"), +str8_lit_comp("f5"), +str8_lit_comp("f6"), +str8_lit_comp("f7"), +str8_lit_comp("f8"), +str8_lit_comp("f9"), +str8_lit_comp("f10"), +str8_lit_comp("f11"), +str8_lit_comp("f12"), +str8_lit_comp("f13"), +str8_lit_comp("f14"), +str8_lit_comp("f15"), +str8_lit_comp("f16"), +str8_lit_comp("f17"), +str8_lit_comp("f18"), +str8_lit_comp("f19"), +str8_lit_comp("f20"), +str8_lit_comp("f21"), +str8_lit_comp("f22"), +str8_lit_comp("f23"), +str8_lit_comp("f24"), +str8_lit_comp("tick"), +str8_lit_comp("0"), +str8_lit_comp("1"), +str8_lit_comp("2"), +str8_lit_comp("3"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("6"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("9"), +str8_lit_comp("minus"), +str8_lit_comp("equal"), +str8_lit_comp("backspace"), +str8_lit_comp("tab"), +str8_lit_comp("q"), +str8_lit_comp("w"), +str8_lit_comp("e"), +str8_lit_comp("r"), +str8_lit_comp("t"), +str8_lit_comp("y"), +str8_lit_comp("u"), +str8_lit_comp("i"), +str8_lit_comp("o"), +str8_lit_comp("p"), +str8_lit_comp("left_bracket"), +str8_lit_comp("right_bracket"), +str8_lit_comp("backslash"), +str8_lit_comp("caps_lock"), +str8_lit_comp("a"), +str8_lit_comp("s"), +str8_lit_comp("d"), +str8_lit_comp("f"), +str8_lit_comp("g"), +str8_lit_comp("h"), +str8_lit_comp("j"), +str8_lit_comp("k"), +str8_lit_comp("l"), +str8_lit_comp("semicolon"), +str8_lit_comp("quote"), +str8_lit_comp("return"), +str8_lit_comp("shift"), +str8_lit_comp("z"), +str8_lit_comp("x"), +str8_lit_comp("c"), +str8_lit_comp("v"), +str8_lit_comp("b"), +str8_lit_comp("n"), +str8_lit_comp("m"), +str8_lit_comp("comma"), +str8_lit_comp("period"), +str8_lit_comp("slash"), +str8_lit_comp("ctrl"), +str8_lit_comp("alt"), +str8_lit_comp("space"), +str8_lit_comp("menu"), +str8_lit_comp("scroll_lock"), +str8_lit_comp("pause"), +str8_lit_comp("insert"), +str8_lit_comp("home"), +str8_lit_comp("page_up"), +str8_lit_comp("delete"), +str8_lit_comp("end"), +str8_lit_comp("page_down"), +str8_lit_comp("up"), +str8_lit_comp("left"), +str8_lit_comp("down"), +str8_lit_comp("right"), +str8_lit_comp("ex0"), +str8_lit_comp("ex1"), +str8_lit_comp("ex2"), +str8_lit_comp("ex3"), +str8_lit_comp("ex4"), +str8_lit_comp("ex5"), +str8_lit_comp("ex6"), +str8_lit_comp("ex7"), +str8_lit_comp("ex8"), +str8_lit_comp("ex9"), +str8_lit_comp("ex10"), +str8_lit_comp("ex11"), +str8_lit_comp("ex12"), +str8_lit_comp("ex13"), +str8_lit_comp("ex14"), +str8_lit_comp("ex15"), +str8_lit_comp("ex16"), +str8_lit_comp("ex17"), +str8_lit_comp("ex18"), +str8_lit_comp("ex19"), +str8_lit_comp("ex20"), +str8_lit_comp("ex21"), +str8_lit_comp("ex22"), +str8_lit_comp("ex23"), +str8_lit_comp("ex24"), +str8_lit_comp("ex25"), +str8_lit_comp("ex26"), +str8_lit_comp("ex27"), +str8_lit_comp("ex28"), +str8_lit_comp("ex29"), +str8_lit_comp("num_lock"), +str8_lit_comp("numpad_slash"), +str8_lit_comp("numpad_star"), +str8_lit_comp("numpad_minus"), +str8_lit_comp("numpad_plus"), +str8_lit_comp("numpad_period"), +str8_lit_comp("numpad_0"), +str8_lit_comp("numpad_1"), +str8_lit_comp("numpad_2"), +str8_lit_comp("numpad_3"), +str8_lit_comp("numpad_4"), +str8_lit_comp("numpad_5"), +str8_lit_comp("numpad_6"), +str8_lit_comp("numpad_7"), +str8_lit_comp("numpad_8"), +str8_lit_comp("numpad_9"), +str8_lit_comp("left_mouse"), +str8_lit_comp("middle_mouse"), +str8_lit_comp("right_mouse"), +}; + +C_LINKAGE_END + diff --git a/src/os/gfx/generated/os_gfx.meta.h b/src/os/gfx/generated/os_gfx.meta.h index 5485576e..ffa90e62 100644 --- a/src/os/gfx/generated/os_gfx.meta.h +++ b/src/os/gfx/generated/os_gfx.meta.h @@ -154,299 +154,9 @@ OS_Key_RightMouseButton, OS_Key_COUNT, } OS_Key; -String8 os_g_key_display_string_table[] = -{ -str8_lit_comp("Invalid Key"), -str8_lit_comp("Escape"), -str8_lit_comp("F1"), -str8_lit_comp("F2"), -str8_lit_comp("F3"), -str8_lit_comp("F4"), -str8_lit_comp("F5"), -str8_lit_comp("F6"), -str8_lit_comp("F7"), -str8_lit_comp("F8"), -str8_lit_comp("F9"), -str8_lit_comp("F10"), -str8_lit_comp("F11"), -str8_lit_comp("F12"), -str8_lit_comp("F13"), -str8_lit_comp("F14"), -str8_lit_comp("F15"), -str8_lit_comp("F16"), -str8_lit_comp("F17"), -str8_lit_comp("F18"), -str8_lit_comp("F19"), -str8_lit_comp("F20"), -str8_lit_comp("F21"), -str8_lit_comp("F22"), -str8_lit_comp("F23"), -str8_lit_comp("F24"), -str8_lit_comp("Tick"), -str8_lit_comp("0"), -str8_lit_comp("1"), -str8_lit_comp("2"), -str8_lit_comp("3"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("6"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("9"), -str8_lit_comp("Minus"), -str8_lit_comp("Equal"), -str8_lit_comp("Backspace"), -str8_lit_comp("Tab"), -str8_lit_comp("Q"), -str8_lit_comp("W"), -str8_lit_comp("E"), -str8_lit_comp("R"), -str8_lit_comp("T"), -str8_lit_comp("Y"), -str8_lit_comp("U"), -str8_lit_comp("I"), -str8_lit_comp("O"), -str8_lit_comp("P"), -str8_lit_comp("Left Bracket"), -str8_lit_comp("Right Bracket"), -str8_lit_comp("Back Slash"), -str8_lit_comp("Caps Lock"), -str8_lit_comp("A"), -str8_lit_comp("S"), -str8_lit_comp("D"), -str8_lit_comp("F"), -str8_lit_comp("G"), -str8_lit_comp("H"), -str8_lit_comp("J"), -str8_lit_comp("K"), -str8_lit_comp("L"), -str8_lit_comp("Semicolon"), -str8_lit_comp("Quote"), -str8_lit_comp("Return"), -str8_lit_comp("Shift"), -str8_lit_comp("Z"), -str8_lit_comp("X"), -str8_lit_comp("C"), -str8_lit_comp("V"), -str8_lit_comp("B"), -str8_lit_comp("N"), -str8_lit_comp("M"), -str8_lit_comp("Comma"), -str8_lit_comp("Period"), -str8_lit_comp("Slash"), -str8_lit_comp("Ctrl"), -str8_lit_comp("Alt"), -str8_lit_comp("Space"), -str8_lit_comp("Menu"), -str8_lit_comp("Scroll Lock"), -str8_lit_comp("Pause"), -str8_lit_comp("Insert"), -str8_lit_comp("Home"), -str8_lit_comp("Page Up"), -str8_lit_comp("Delete"), -str8_lit_comp("End"), -str8_lit_comp("Page Down"), -str8_lit_comp("Up"), -str8_lit_comp("Left"), -str8_lit_comp("Down"), -str8_lit_comp("Right"), -str8_lit_comp("Ex0"), -str8_lit_comp("Ex1"), -str8_lit_comp("Ex2"), -str8_lit_comp("Ex3"), -str8_lit_comp("Ex4"), -str8_lit_comp("Ex5"), -str8_lit_comp("Ex6"), -str8_lit_comp("Ex7"), -str8_lit_comp("Ex8"), -str8_lit_comp("Ex9"), -str8_lit_comp("Ex10"), -str8_lit_comp("Ex11"), -str8_lit_comp("Ex12"), -str8_lit_comp("Ex13"), -str8_lit_comp("Ex14"), -str8_lit_comp("Ex15"), -str8_lit_comp("Ex16"), -str8_lit_comp("Ex17"), -str8_lit_comp("Ex18"), -str8_lit_comp("Ex19"), -str8_lit_comp("Ex20"), -str8_lit_comp("Ex21"), -str8_lit_comp("Ex22"), -str8_lit_comp("Ex23"), -str8_lit_comp("Ex24"), -str8_lit_comp("Ex25"), -str8_lit_comp("Ex26"), -str8_lit_comp("Ex27"), -str8_lit_comp("Ex28"), -str8_lit_comp("Ex29"), -str8_lit_comp("Num Lock"), -str8_lit_comp("Numpad Slash"), -str8_lit_comp("Numpad Star"), -str8_lit_comp("Numpad Minus"), -str8_lit_comp("Numpad Plus"), -str8_lit_comp("Numpad Period"), -str8_lit_comp("Numpad 0"), -str8_lit_comp("Numpad 1"), -str8_lit_comp("Numpad 2"), -str8_lit_comp("Numpad 3"), -str8_lit_comp("Numpad 4"), -str8_lit_comp("Numpad 5"), -str8_lit_comp("Numpad 6"), -str8_lit_comp("Numpad 7"), -str8_lit_comp("Numpad 8"), -str8_lit_comp("Numpad 9"), -str8_lit_comp("Left Mouse Button"), -str8_lit_comp("Middle Mouse Button"), -str8_lit_comp("Right Mouse Button"), -}; - -String8 os_g_key_cfg_string_table[] = -{ -str8_lit_comp("null"), -str8_lit_comp("esc"), -str8_lit_comp("f1"), -str8_lit_comp("f2"), -str8_lit_comp("f3"), -str8_lit_comp("f4"), -str8_lit_comp("f5"), -str8_lit_comp("f6"), -str8_lit_comp("f7"), -str8_lit_comp("f8"), -str8_lit_comp("f9"), -str8_lit_comp("f10"), -str8_lit_comp("f11"), -str8_lit_comp("f12"), -str8_lit_comp("f13"), -str8_lit_comp("f14"), -str8_lit_comp("f15"), -str8_lit_comp("f16"), -str8_lit_comp("f17"), -str8_lit_comp("f18"), -str8_lit_comp("f19"), -str8_lit_comp("f20"), -str8_lit_comp("f21"), -str8_lit_comp("f22"), -str8_lit_comp("f23"), -str8_lit_comp("f24"), -str8_lit_comp("tick"), -str8_lit_comp("0"), -str8_lit_comp("1"), -str8_lit_comp("2"), -str8_lit_comp("3"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("6"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("9"), -str8_lit_comp("minus"), -str8_lit_comp("equal"), -str8_lit_comp("backspace"), -str8_lit_comp("tab"), -str8_lit_comp("q"), -str8_lit_comp("w"), -str8_lit_comp("e"), -str8_lit_comp("r"), -str8_lit_comp("t"), -str8_lit_comp("y"), -str8_lit_comp("u"), -str8_lit_comp("i"), -str8_lit_comp("o"), -str8_lit_comp("p"), -str8_lit_comp("left_bracket"), -str8_lit_comp("right_bracket"), -str8_lit_comp("backslash"), -str8_lit_comp("caps_lock"), -str8_lit_comp("a"), -str8_lit_comp("s"), -str8_lit_comp("d"), -str8_lit_comp("f"), -str8_lit_comp("g"), -str8_lit_comp("h"), -str8_lit_comp("j"), -str8_lit_comp("k"), -str8_lit_comp("l"), -str8_lit_comp("semicolon"), -str8_lit_comp("quote"), -str8_lit_comp("return"), -str8_lit_comp("shift"), -str8_lit_comp("z"), -str8_lit_comp("x"), -str8_lit_comp("c"), -str8_lit_comp("v"), -str8_lit_comp("b"), -str8_lit_comp("n"), -str8_lit_comp("m"), -str8_lit_comp("comma"), -str8_lit_comp("period"), -str8_lit_comp("slash"), -str8_lit_comp("ctrl"), -str8_lit_comp("alt"), -str8_lit_comp("space"), -str8_lit_comp("menu"), -str8_lit_comp("scroll_lock"), -str8_lit_comp("pause"), -str8_lit_comp("insert"), -str8_lit_comp("home"), -str8_lit_comp("page_up"), -str8_lit_comp("delete"), -str8_lit_comp("end"), -str8_lit_comp("page_down"), -str8_lit_comp("up"), -str8_lit_comp("left"), -str8_lit_comp("down"), -str8_lit_comp("right"), -str8_lit_comp("ex0"), -str8_lit_comp("ex1"), -str8_lit_comp("ex2"), -str8_lit_comp("ex3"), -str8_lit_comp("ex4"), -str8_lit_comp("ex5"), -str8_lit_comp("ex6"), -str8_lit_comp("ex7"), -str8_lit_comp("ex8"), -str8_lit_comp("ex9"), -str8_lit_comp("ex10"), -str8_lit_comp("ex11"), -str8_lit_comp("ex12"), -str8_lit_comp("ex13"), -str8_lit_comp("ex14"), -str8_lit_comp("ex15"), -str8_lit_comp("ex16"), -str8_lit_comp("ex17"), -str8_lit_comp("ex18"), -str8_lit_comp("ex19"), -str8_lit_comp("ex20"), -str8_lit_comp("ex21"), -str8_lit_comp("ex22"), -str8_lit_comp("ex23"), -str8_lit_comp("ex24"), -str8_lit_comp("ex25"), -str8_lit_comp("ex26"), -str8_lit_comp("ex27"), -str8_lit_comp("ex28"), -str8_lit_comp("ex29"), -str8_lit_comp("num_lock"), -str8_lit_comp("numpad_slash"), -str8_lit_comp("numpad_star"), -str8_lit_comp("numpad_minus"), -str8_lit_comp("numpad_plus"), -str8_lit_comp("numpad_period"), -str8_lit_comp("numpad_0"), -str8_lit_comp("numpad_1"), -str8_lit_comp("numpad_2"), -str8_lit_comp("numpad_3"), -str8_lit_comp("numpad_4"), -str8_lit_comp("numpad_5"), -str8_lit_comp("numpad_6"), -str8_lit_comp("numpad_7"), -str8_lit_comp("numpad_8"), -str8_lit_comp("numpad_9"), -str8_lit_comp("left_mouse"), -str8_lit_comp("middle_mouse"), -str8_lit_comp("right_mouse"), -}; - +C_LINKAGE_BEGIN +extern String8 os_g_key_display_string_table[143]; +extern String8 os_g_key_cfg_string_table[143]; +C_LINKAGE_END #endif // OS_GFX_META_H diff --git a/src/os/gfx/os_gfx.c b/src/os/gfx/os_gfx.c index d7962d84..4e957a88 100644 --- a/src/os/gfx/os_gfx.c +++ b/src/os/gfx/os_gfx.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/os_gfx.meta.c" + //////////////////////////////// //~ rjf: Event Functions (Helpers, Implemented Once) diff --git a/src/regs/generated/regs.meta.c b/src/regs/generated/regs.meta.c index ee37e616..6e8d2707 100644 --- a/src/regs/generated/regs.meta.c +++ b/src/regs/generated/regs.meta.c @@ -102,3 +102,816 @@ case Architecture_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break; } return result; } +C_LINKAGE_BEGIN +REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[77] = +{ +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +}; + +REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[80] = +{ +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +}; + +String8 regs_g_reg_code_x64_string_table[77] = +{ +str8_lit_comp(""), +str8_lit_comp("rax"), +str8_lit_comp("rcx"), +str8_lit_comp("rdx"), +str8_lit_comp("rbx"), +str8_lit_comp("rsp"), +str8_lit_comp("rbp"), +str8_lit_comp("rsi"), +str8_lit_comp("rdi"), +str8_lit_comp("r8"), +str8_lit_comp("r9"), +str8_lit_comp("r10"), +str8_lit_comp("r11"), +str8_lit_comp("r12"), +str8_lit_comp("r13"), +str8_lit_comp("r14"), +str8_lit_comp("r15"), +str8_lit_comp("fsbase"), +str8_lit_comp("gsbase"), +str8_lit_comp("rip"), +str8_lit_comp("rflags"), +str8_lit_comp("dr0"), +str8_lit_comp("dr1"), +str8_lit_comp("dr2"), +str8_lit_comp("dr3"), +str8_lit_comp("dr4"), +str8_lit_comp("dr5"), +str8_lit_comp("dr6"), +str8_lit_comp("dr7"), +str8_lit_comp("fpr0"), +str8_lit_comp("fpr1"), +str8_lit_comp("fpr2"), +str8_lit_comp("fpr3"), +str8_lit_comp("fpr4"), +str8_lit_comp("fpr5"), +str8_lit_comp("fpr6"), +str8_lit_comp("fpr7"), +str8_lit_comp("st0"), +str8_lit_comp("st1"), +str8_lit_comp("st2"), +str8_lit_comp("st3"), +str8_lit_comp("st4"), +str8_lit_comp("st5"), +str8_lit_comp("st6"), +str8_lit_comp("st7"), +str8_lit_comp("fcw"), +str8_lit_comp("fsw"), +str8_lit_comp("ftw"), +str8_lit_comp("fop"), +str8_lit_comp("fcs"), +str8_lit_comp("fds"), +str8_lit_comp("fip"), +str8_lit_comp("fdp"), +str8_lit_comp("mxcsr"), +str8_lit_comp("mxcsr_mask"), +str8_lit_comp("ss"), +str8_lit_comp("cs"), +str8_lit_comp("ds"), +str8_lit_comp("es"), +str8_lit_comp("fs"), +str8_lit_comp("gs"), +str8_lit_comp("ymm0"), +str8_lit_comp("ymm1"), +str8_lit_comp("ymm2"), +str8_lit_comp("ymm3"), +str8_lit_comp("ymm4"), +str8_lit_comp("ymm5"), +str8_lit_comp("ymm6"), +str8_lit_comp("ymm7"), +str8_lit_comp("ymm8"), +str8_lit_comp("ymm9"), +str8_lit_comp("ymm10"), +str8_lit_comp("ymm11"), +str8_lit_comp("ymm12"), +str8_lit_comp("ymm13"), +str8_lit_comp("ymm14"), +str8_lit_comp("ymm15"), +}; + +String8 regs_g_alias_code_x64_string_table[80] = +{ +str8_lit_comp(""), +str8_lit_comp("eax"), +str8_lit_comp("ecx"), +str8_lit_comp("edx"), +str8_lit_comp("ebx"), +str8_lit_comp("esp"), +str8_lit_comp("ebp"), +str8_lit_comp("esi"), +str8_lit_comp("edi"), +str8_lit_comp("r8d"), +str8_lit_comp("r9d"), +str8_lit_comp("r10d"), +str8_lit_comp("r11d"), +str8_lit_comp("r12d"), +str8_lit_comp("r13d"), +str8_lit_comp("r14d"), +str8_lit_comp("r15d"), +str8_lit_comp("eip"), +str8_lit_comp("eflags"), +str8_lit_comp("ax"), +str8_lit_comp("cx"), +str8_lit_comp("dx"), +str8_lit_comp("bx"), +str8_lit_comp("si"), +str8_lit_comp("di"), +str8_lit_comp("sp"), +str8_lit_comp("bp"), +str8_lit_comp("ip"), +str8_lit_comp("r8w"), +str8_lit_comp("r9w"), +str8_lit_comp("r10w"), +str8_lit_comp("r11w"), +str8_lit_comp("r12w"), +str8_lit_comp("r13w"), +str8_lit_comp("r14w"), +str8_lit_comp("r15w"), +str8_lit_comp("al"), +str8_lit_comp("cl"), +str8_lit_comp("dl"), +str8_lit_comp("bl"), +str8_lit_comp("sil"), +str8_lit_comp("dil"), +str8_lit_comp("bpl"), +str8_lit_comp("spl"), +str8_lit_comp("r8b"), +str8_lit_comp("r9b"), +str8_lit_comp("r10b"), +str8_lit_comp("r11b"), +str8_lit_comp("r12b"), +str8_lit_comp("r13b"), +str8_lit_comp("r14b"), +str8_lit_comp("r15b"), +str8_lit_comp("ah"), +str8_lit_comp("ch"), +str8_lit_comp("dh"), +str8_lit_comp("bh"), +str8_lit_comp("xmm0"), +str8_lit_comp("xmm1"), +str8_lit_comp("xmm2"), +str8_lit_comp("xmm3"), +str8_lit_comp("xmm4"), +str8_lit_comp("xmm5"), +str8_lit_comp("xmm6"), +str8_lit_comp("xmm7"), +str8_lit_comp("xmm8"), +str8_lit_comp("xmm9"), +str8_lit_comp("xmm10"), +str8_lit_comp("xmm11"), +str8_lit_comp("xmm12"), +str8_lit_comp("xmm13"), +str8_lit_comp("xmm14"), +str8_lit_comp("xmm15"), +str8_lit_comp("mm0"), +str8_lit_comp("mm1"), +str8_lit_comp("mm2"), +str8_lit_comp("mm3"), +str8_lit_comp("mm4"), +str8_lit_comp("mm5"), +str8_lit_comp("mm6"), +str8_lit_comp("mm7"), +}; + +REGS_Rng regs_g_reg_code_x64_rng_table[77] = +{ +{0}, +{(U16)OffsetOf(REGS_RegBlockX64, rax), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rcx), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rdx), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rbx), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rsp), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rbp), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rsi), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rdi), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r8), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r9), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r10), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r11), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r12), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r13), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r14), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r15), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, fsbase), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, gsbase), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rip), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rflags), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, dr0), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr1), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr2), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr3), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr4), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr5), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr6), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr7), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr0), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr1), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr2), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr3), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr4), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr5), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr6), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr7), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st0), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st1), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st2), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st3), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st4), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st5), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st6), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st7), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fcw), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fsw), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, ftw), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fop), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fcs), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fds), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fip), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, fdp), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, mxcsr), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, mxcsr_mask), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, ss), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, cs), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, ds), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, es), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fs), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, gs), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm0), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm1), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm2), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm3), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm4), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm5), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm6), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm7), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm8), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm9), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm10), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm11), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm12), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm13), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm14), 32}, +{(U16)OffsetOf(REGS_RegBlockX64, ymm15), 32}, +}; + +REGS_Slice regs_g_alias_code_x64_slice_table[80] = +{ +{0}, +{REGS_RegCodeX64_rax, 0, 4}, +{REGS_RegCodeX64_rcx, 0, 4}, +{REGS_RegCodeX64_rdx, 0, 4}, +{REGS_RegCodeX64_rbx, 0, 4}, +{REGS_RegCodeX64_rsp, 0, 4}, +{REGS_RegCodeX64_rbp, 0, 4}, +{REGS_RegCodeX64_rsi, 0, 4}, +{REGS_RegCodeX64_rdi, 0, 4}, +{REGS_RegCodeX64_r8, 0, 4}, +{REGS_RegCodeX64_r9, 0, 4}, +{REGS_RegCodeX64_r10, 0, 4}, +{REGS_RegCodeX64_r11, 0, 4}, +{REGS_RegCodeX64_r12, 0, 4}, +{REGS_RegCodeX64_r13, 0, 4}, +{REGS_RegCodeX64_r14, 0, 4}, +{REGS_RegCodeX64_r15, 0, 4}, +{REGS_RegCodeX64_rip, 0, 4}, +{REGS_RegCodeX64_rflags, 0, 4}, +{REGS_RegCodeX64_rax, 0, 2}, +{REGS_RegCodeX64_rcx, 0, 2}, +{REGS_RegCodeX64_rdx, 0, 2}, +{REGS_RegCodeX64_rbx, 0, 2}, +{REGS_RegCodeX64_rsi, 0, 2}, +{REGS_RegCodeX64_rdi, 0, 2}, +{REGS_RegCodeX64_rsp, 0, 2}, +{REGS_RegCodeX64_rbp, 0, 2}, +{REGS_RegCodeX64_rip, 0, 2}, +{REGS_RegCodeX64_r8, 0, 2}, +{REGS_RegCodeX64_r9, 0, 2}, +{REGS_RegCodeX64_r10, 0, 2}, +{REGS_RegCodeX64_r11, 0, 2}, +{REGS_RegCodeX64_r12, 0, 2}, +{REGS_RegCodeX64_r13, 0, 2}, +{REGS_RegCodeX64_r14, 0, 2}, +{REGS_RegCodeX64_r15, 0, 2}, +{REGS_RegCodeX64_rax, 0, 1}, +{REGS_RegCodeX64_rcx, 0, 1}, +{REGS_RegCodeX64_rdx, 0, 1}, +{REGS_RegCodeX64_rbx, 0, 1}, +{REGS_RegCodeX64_rsi, 0, 1}, +{REGS_RegCodeX64_rdi, 0, 1}, +{REGS_RegCodeX64_rbp, 0, 1}, +{REGS_RegCodeX64_rsp, 0, 1}, +{REGS_RegCodeX64_r8, 0, 1}, +{REGS_RegCodeX64_r9, 0, 1}, +{REGS_RegCodeX64_r10, 0, 1}, +{REGS_RegCodeX64_r11, 0, 1}, +{REGS_RegCodeX64_r12, 0, 1}, +{REGS_RegCodeX64_r13, 0, 1}, +{REGS_RegCodeX64_r14, 0, 1}, +{REGS_RegCodeX64_r15, 0, 1}, +{REGS_RegCodeX64_rax, 1, 1}, +{REGS_RegCodeX64_rcx, 1, 1}, +{REGS_RegCodeX64_rdx, 1, 1}, +{REGS_RegCodeX64_rbx, 1, 1}, +{REGS_RegCodeX64_ymm0, 0, 16}, +{REGS_RegCodeX64_ymm1, 0, 16}, +{REGS_RegCodeX64_ymm2, 0, 16}, +{REGS_RegCodeX64_ymm3, 0, 16}, +{REGS_RegCodeX64_ymm4, 0, 16}, +{REGS_RegCodeX64_ymm5, 0, 16}, +{REGS_RegCodeX64_ymm6, 0, 16}, +{REGS_RegCodeX64_ymm7, 0, 16}, +{REGS_RegCodeX64_ymm8, 0, 16}, +{REGS_RegCodeX64_ymm9, 0, 16}, +{REGS_RegCodeX64_ymm10, 0, 16}, +{REGS_RegCodeX64_ymm11, 0, 16}, +{REGS_RegCodeX64_ymm12, 0, 16}, +{REGS_RegCodeX64_ymm13, 0, 16}, +{REGS_RegCodeX64_ymm14, 0, 16}, +{REGS_RegCodeX64_ymm15, 0, 16}, +{REGS_RegCodeX64_fpr0, 0, 8}, +{REGS_RegCodeX64_fpr1, 0, 8}, +{REGS_RegCodeX64_fpr2, 0, 8}, +{REGS_RegCodeX64_fpr3, 0, 8}, +{REGS_RegCodeX64_fpr4, 0, 8}, +{REGS_RegCodeX64_fpr5, 0, 8}, +{REGS_RegCodeX64_fpr6, 0, 8}, +{REGS_RegCodeX64_fpr7, 0, 8}, +}; + +REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[61] = +{ +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +}; + +REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36] = +{ +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +}; + +String8 regs_g_reg_code_x86_string_table[61] = +{ +str8_lit_comp(""), +str8_lit_comp("eax"), +str8_lit_comp("ecx"), +str8_lit_comp("edx"), +str8_lit_comp("ebx"), +str8_lit_comp("esp"), +str8_lit_comp("ebp"), +str8_lit_comp("esi"), +str8_lit_comp("edi"), +str8_lit_comp("fsbase"), +str8_lit_comp("gsbase"), +str8_lit_comp("eflags"), +str8_lit_comp("eip"), +str8_lit_comp("dr0"), +str8_lit_comp("dr1"), +str8_lit_comp("dr2"), +str8_lit_comp("dr3"), +str8_lit_comp("dr4"), +str8_lit_comp("dr5"), +str8_lit_comp("dr6"), +str8_lit_comp("dr7"), +str8_lit_comp("fpr0"), +str8_lit_comp("fpr1"), +str8_lit_comp("fpr2"), +str8_lit_comp("fpr3"), +str8_lit_comp("fpr4"), +str8_lit_comp("fpr5"), +str8_lit_comp("fpr6"), +str8_lit_comp("fpr7"), +str8_lit_comp("st0"), +str8_lit_comp("st1"), +str8_lit_comp("st2"), +str8_lit_comp("st3"), +str8_lit_comp("st4"), +str8_lit_comp("st5"), +str8_lit_comp("st6"), +str8_lit_comp("st7"), +str8_lit_comp("fcw"), +str8_lit_comp("fsw"), +str8_lit_comp("ftw"), +str8_lit_comp("fop"), +str8_lit_comp("fcs"), +str8_lit_comp("fds"), +str8_lit_comp("fip"), +str8_lit_comp("fdp"), +str8_lit_comp("mxcsr"), +str8_lit_comp("mxcsr_mask"), +str8_lit_comp("ss"), +str8_lit_comp("cs"), +str8_lit_comp("ds"), +str8_lit_comp("es"), +str8_lit_comp("fs"), +str8_lit_comp("gs"), +str8_lit_comp("ymm0"), +str8_lit_comp("ymm1"), +str8_lit_comp("ymm2"), +str8_lit_comp("ymm3"), +str8_lit_comp("ymm4"), +str8_lit_comp("ymm5"), +str8_lit_comp("ymm6"), +str8_lit_comp("ymm7"), +}; + +String8 regs_g_alias_code_x86_string_table[36] = +{ +str8_lit_comp(""), +str8_lit_comp("ax"), +str8_lit_comp("cx"), +str8_lit_comp("bx"), +str8_lit_comp("dx"), +str8_lit_comp("sp"), +str8_lit_comp("bp"), +str8_lit_comp("si"), +str8_lit_comp("di"), +str8_lit_comp("ip"), +str8_lit_comp("ah"), +str8_lit_comp("ch"), +str8_lit_comp("dh"), +str8_lit_comp("bh"), +str8_lit_comp("al"), +str8_lit_comp("cl"), +str8_lit_comp("dl"), +str8_lit_comp("bl"), +str8_lit_comp("bpl"), +str8_lit_comp("spl"), +str8_lit_comp("xmm0"), +str8_lit_comp("xmm1"), +str8_lit_comp("xmm2"), +str8_lit_comp("xmm3"), +str8_lit_comp("xmm4"), +str8_lit_comp("xmm5"), +str8_lit_comp("xmm6"), +str8_lit_comp("xmm7"), +str8_lit_comp("mm0"), +str8_lit_comp("mm1"), +str8_lit_comp("mm2"), +str8_lit_comp("mm3"), +str8_lit_comp("mm4"), +str8_lit_comp("mm5"), +str8_lit_comp("mm6"), +str8_lit_comp("mm7"), +}; + +REGS_Rng regs_g_reg_code_x86_rng_table[61] = +{ +{0}, +{(U16)OffsetOf(REGS_RegBlockX86, eax), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, ecx), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, edx), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, ebx), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, esp), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, ebp), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, esi), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, edi), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, fsbase), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, gsbase), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, eflags), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, eip), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr0), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr1), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr2), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr3), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr4), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr5), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr6), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr7), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr0), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr1), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr2), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr3), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr4), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr5), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr6), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr7), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st0), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st1), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st2), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st3), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st4), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st5), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st6), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st7), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fcw), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fsw), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, ftw), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fop), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fcs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fds), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fip), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, fdp), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, mxcsr), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, mxcsr_mask), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, ss), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, cs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, ds), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, es), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, gs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm0), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm1), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm2), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm3), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm4), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm5), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm6), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm7), 32}, +}; + +REGS_Slice regs_g_alias_code_x86_slice_table[36] = +{ +{0}, +{REGS_RegCodeX86_eax, 0, 2}, +{REGS_RegCodeX86_ecx, 0, 2}, +{REGS_RegCodeX86_ebx, 0, 2}, +{REGS_RegCodeX86_edx, 0, 2}, +{REGS_RegCodeX86_esp, 0, 2}, +{REGS_RegCodeX86_ebp, 0, 2}, +{REGS_RegCodeX86_esi, 0, 2}, +{REGS_RegCodeX86_edi, 0, 2}, +{REGS_RegCodeX86_eip, 0, 2}, +{REGS_RegCodeX86_eax, 1, 1}, +{REGS_RegCodeX86_ecx, 1, 1}, +{REGS_RegCodeX86_edx, 1, 1}, +{REGS_RegCodeX86_ebx, 1, 1}, +{REGS_RegCodeX86_eax, 0, 1}, +{REGS_RegCodeX86_ecx, 0, 1}, +{REGS_RegCodeX86_edx, 0, 1}, +{REGS_RegCodeX86_ebx, 0, 1}, +{REGS_RegCodeX86_ebp, 0, 1}, +{REGS_RegCodeX86_esp, 0, 1}, +{REGS_RegCodeX86_ymm0, 0, 16}, +{REGS_RegCodeX86_ymm1, 0, 16}, +{REGS_RegCodeX86_ymm2, 0, 16}, +{REGS_RegCodeX86_ymm3, 0, 16}, +{REGS_RegCodeX86_ymm4, 0, 16}, +{REGS_RegCodeX86_ymm5, 0, 16}, +{REGS_RegCodeX86_ymm6, 0, 16}, +{REGS_RegCodeX86_ymm7, 0, 16}, +{REGS_RegCodeX86_fpr0, 0, 8}, +{REGS_RegCodeX86_fpr1, 0, 8}, +{REGS_RegCodeX86_fpr2, 0, 8}, +{REGS_RegCodeX86_fpr3, 0, 8}, +{REGS_RegCodeX86_fpr4, 0, 8}, +{REGS_RegCodeX86_fpr5, 0, 8}, +{REGS_RegCodeX86_fpr6, 0, 8}, +{REGS_RegCodeX86_fpr7, 0, 8}, +}; + +C_LINKAGE_END + diff --git a/src/regs/generated/regs.meta.h b/src/regs/generated/regs.meta.h index 5fa7be6f..88eb256a 100644 --- a/src/regs/generated/regs.meta.h +++ b/src/regs/generated/regs.meta.h @@ -426,815 +426,19 @@ REGS_Reg256 ymm6; REGS_Reg256 ymm7; }; -REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -String8 regs_g_reg_code_x64_string_table[] = -{ -str8_lit_comp(""), -str8_lit_comp("rax"), -str8_lit_comp("rcx"), -str8_lit_comp("rdx"), -str8_lit_comp("rbx"), -str8_lit_comp("rsp"), -str8_lit_comp("rbp"), -str8_lit_comp("rsi"), -str8_lit_comp("rdi"), -str8_lit_comp("r8"), -str8_lit_comp("r9"), -str8_lit_comp("r10"), -str8_lit_comp("r11"), -str8_lit_comp("r12"), -str8_lit_comp("r13"), -str8_lit_comp("r14"), -str8_lit_comp("r15"), -str8_lit_comp("fsbase"), -str8_lit_comp("gsbase"), -str8_lit_comp("rip"), -str8_lit_comp("rflags"), -str8_lit_comp("dr0"), -str8_lit_comp("dr1"), -str8_lit_comp("dr2"), -str8_lit_comp("dr3"), -str8_lit_comp("dr4"), -str8_lit_comp("dr5"), -str8_lit_comp("dr6"), -str8_lit_comp("dr7"), -str8_lit_comp("fpr0"), -str8_lit_comp("fpr1"), -str8_lit_comp("fpr2"), -str8_lit_comp("fpr3"), -str8_lit_comp("fpr4"), -str8_lit_comp("fpr5"), -str8_lit_comp("fpr6"), -str8_lit_comp("fpr7"), -str8_lit_comp("st0"), -str8_lit_comp("st1"), -str8_lit_comp("st2"), -str8_lit_comp("st3"), -str8_lit_comp("st4"), -str8_lit_comp("st5"), -str8_lit_comp("st6"), -str8_lit_comp("st7"), -str8_lit_comp("fcw"), -str8_lit_comp("fsw"), -str8_lit_comp("ftw"), -str8_lit_comp("fop"), -str8_lit_comp("fcs"), -str8_lit_comp("fds"), -str8_lit_comp("fip"), -str8_lit_comp("fdp"), -str8_lit_comp("mxcsr"), -str8_lit_comp("mxcsr_mask"), -str8_lit_comp("ss"), -str8_lit_comp("cs"), -str8_lit_comp("ds"), -str8_lit_comp("es"), -str8_lit_comp("fs"), -str8_lit_comp("gs"), -str8_lit_comp("ymm0"), -str8_lit_comp("ymm1"), -str8_lit_comp("ymm2"), -str8_lit_comp("ymm3"), -str8_lit_comp("ymm4"), -str8_lit_comp("ymm5"), -str8_lit_comp("ymm6"), -str8_lit_comp("ymm7"), -str8_lit_comp("ymm8"), -str8_lit_comp("ymm9"), -str8_lit_comp("ymm10"), -str8_lit_comp("ymm11"), -str8_lit_comp("ymm12"), -str8_lit_comp("ymm13"), -str8_lit_comp("ymm14"), -str8_lit_comp("ymm15"), -}; - -String8 regs_g_alias_code_x64_string_table[] = -{ -str8_lit_comp(""), -str8_lit_comp("eax"), -str8_lit_comp("ecx"), -str8_lit_comp("edx"), -str8_lit_comp("ebx"), -str8_lit_comp("esp"), -str8_lit_comp("ebp"), -str8_lit_comp("esi"), -str8_lit_comp("edi"), -str8_lit_comp("r8d"), -str8_lit_comp("r9d"), -str8_lit_comp("r10d"), -str8_lit_comp("r11d"), -str8_lit_comp("r12d"), -str8_lit_comp("r13d"), -str8_lit_comp("r14d"), -str8_lit_comp("r15d"), -str8_lit_comp("eip"), -str8_lit_comp("eflags"), -str8_lit_comp("ax"), -str8_lit_comp("cx"), -str8_lit_comp("dx"), -str8_lit_comp("bx"), -str8_lit_comp("si"), -str8_lit_comp("di"), -str8_lit_comp("sp"), -str8_lit_comp("bp"), -str8_lit_comp("ip"), -str8_lit_comp("r8w"), -str8_lit_comp("r9w"), -str8_lit_comp("r10w"), -str8_lit_comp("r11w"), -str8_lit_comp("r12w"), -str8_lit_comp("r13w"), -str8_lit_comp("r14w"), -str8_lit_comp("r15w"), -str8_lit_comp("al"), -str8_lit_comp("cl"), -str8_lit_comp("dl"), -str8_lit_comp("bl"), -str8_lit_comp("sil"), -str8_lit_comp("dil"), -str8_lit_comp("bpl"), -str8_lit_comp("spl"), -str8_lit_comp("r8b"), -str8_lit_comp("r9b"), -str8_lit_comp("r10b"), -str8_lit_comp("r11b"), -str8_lit_comp("r12b"), -str8_lit_comp("r13b"), -str8_lit_comp("r14b"), -str8_lit_comp("r15b"), -str8_lit_comp("ah"), -str8_lit_comp("ch"), -str8_lit_comp("dh"), -str8_lit_comp("bh"), -str8_lit_comp("xmm0"), -str8_lit_comp("xmm1"), -str8_lit_comp("xmm2"), -str8_lit_comp("xmm3"), -str8_lit_comp("xmm4"), -str8_lit_comp("xmm5"), -str8_lit_comp("xmm6"), -str8_lit_comp("xmm7"), -str8_lit_comp("xmm8"), -str8_lit_comp("xmm9"), -str8_lit_comp("xmm10"), -str8_lit_comp("xmm11"), -str8_lit_comp("xmm12"), -str8_lit_comp("xmm13"), -str8_lit_comp("xmm14"), -str8_lit_comp("xmm15"), -str8_lit_comp("mm0"), -str8_lit_comp("mm1"), -str8_lit_comp("mm2"), -str8_lit_comp("mm3"), -str8_lit_comp("mm4"), -str8_lit_comp("mm5"), -str8_lit_comp("mm6"), -str8_lit_comp("mm7"), -}; - -REGS_Rng regs_g_reg_code_x64_rng_table[] = -{ -{0}, -{(U16)OffsetOf(REGS_RegBlockX64, rax), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rcx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rdx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rbx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rsp), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rbp), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rsi), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rdi), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r8), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r9), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r10), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r11), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r12), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r13), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r14), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r15), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, fsbase), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, gsbase), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rip), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rflags), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr0), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr1), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr2), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr3), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr4), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr5), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr6), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr7), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr0), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr1), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr2), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr3), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr4), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr5), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr6), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr7), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st0), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st1), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st2), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st3), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st4), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st5), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st6), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st7), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fcw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fsw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ftw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fop), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fcs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fds), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fip), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, fdp), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, mxcsr), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, mxcsr_mask), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, ss), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, cs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ds), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, es), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, gs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm0), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm1), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm2), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm3), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm4), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm5), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm6), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm7), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm8), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm9), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm10), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm11), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm12), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm13), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm14), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm15), 32}, -}; - -REGS_Slice regs_g_alias_code_x64_slice_table[] = -{ -{0}, -{REGS_RegCodeX64_rax, 0, 4}, -{REGS_RegCodeX64_rcx, 0, 4}, -{REGS_RegCodeX64_rdx, 0, 4}, -{REGS_RegCodeX64_rbx, 0, 4}, -{REGS_RegCodeX64_rsp, 0, 4}, -{REGS_RegCodeX64_rbp, 0, 4}, -{REGS_RegCodeX64_rsi, 0, 4}, -{REGS_RegCodeX64_rdi, 0, 4}, -{REGS_RegCodeX64_r8, 0, 4}, -{REGS_RegCodeX64_r9, 0, 4}, -{REGS_RegCodeX64_r10, 0, 4}, -{REGS_RegCodeX64_r11, 0, 4}, -{REGS_RegCodeX64_r12, 0, 4}, -{REGS_RegCodeX64_r13, 0, 4}, -{REGS_RegCodeX64_r14, 0, 4}, -{REGS_RegCodeX64_r15, 0, 4}, -{REGS_RegCodeX64_rip, 0, 4}, -{REGS_RegCodeX64_rflags, 0, 4}, -{REGS_RegCodeX64_rax, 0, 2}, -{REGS_RegCodeX64_rcx, 0, 2}, -{REGS_RegCodeX64_rdx, 0, 2}, -{REGS_RegCodeX64_rbx, 0, 2}, -{REGS_RegCodeX64_rsi, 0, 2}, -{REGS_RegCodeX64_rdi, 0, 2}, -{REGS_RegCodeX64_rsp, 0, 2}, -{REGS_RegCodeX64_rbp, 0, 2}, -{REGS_RegCodeX64_rip, 0, 2}, -{REGS_RegCodeX64_r8, 0, 2}, -{REGS_RegCodeX64_r9, 0, 2}, -{REGS_RegCodeX64_r10, 0, 2}, -{REGS_RegCodeX64_r11, 0, 2}, -{REGS_RegCodeX64_r12, 0, 2}, -{REGS_RegCodeX64_r13, 0, 2}, -{REGS_RegCodeX64_r14, 0, 2}, -{REGS_RegCodeX64_r15, 0, 2}, -{REGS_RegCodeX64_rax, 0, 1}, -{REGS_RegCodeX64_rcx, 0, 1}, -{REGS_RegCodeX64_rdx, 0, 1}, -{REGS_RegCodeX64_rbx, 0, 1}, -{REGS_RegCodeX64_rsi, 0, 1}, -{REGS_RegCodeX64_rdi, 0, 1}, -{REGS_RegCodeX64_rbp, 0, 1}, -{REGS_RegCodeX64_rsp, 0, 1}, -{REGS_RegCodeX64_r8, 0, 1}, -{REGS_RegCodeX64_r9, 0, 1}, -{REGS_RegCodeX64_r10, 0, 1}, -{REGS_RegCodeX64_r11, 0, 1}, -{REGS_RegCodeX64_r12, 0, 1}, -{REGS_RegCodeX64_r13, 0, 1}, -{REGS_RegCodeX64_r14, 0, 1}, -{REGS_RegCodeX64_r15, 0, 1}, -{REGS_RegCodeX64_rax, 1, 1}, -{REGS_RegCodeX64_rcx, 1, 1}, -{REGS_RegCodeX64_rdx, 1, 1}, -{REGS_RegCodeX64_rbx, 1, 1}, -{REGS_RegCodeX64_ymm0, 0, 16}, -{REGS_RegCodeX64_ymm1, 0, 16}, -{REGS_RegCodeX64_ymm2, 0, 16}, -{REGS_RegCodeX64_ymm3, 0, 16}, -{REGS_RegCodeX64_ymm4, 0, 16}, -{REGS_RegCodeX64_ymm5, 0, 16}, -{REGS_RegCodeX64_ymm6, 0, 16}, -{REGS_RegCodeX64_ymm7, 0, 16}, -{REGS_RegCodeX64_ymm8, 0, 16}, -{REGS_RegCodeX64_ymm9, 0, 16}, -{REGS_RegCodeX64_ymm10, 0, 16}, -{REGS_RegCodeX64_ymm11, 0, 16}, -{REGS_RegCodeX64_ymm12, 0, 16}, -{REGS_RegCodeX64_ymm13, 0, 16}, -{REGS_RegCodeX64_ymm14, 0, 16}, -{REGS_RegCodeX64_ymm15, 0, 16}, -{REGS_RegCodeX64_fpr0, 0, 8}, -{REGS_RegCodeX64_fpr1, 0, 8}, -{REGS_RegCodeX64_fpr2, 0, 8}, -{REGS_RegCodeX64_fpr3, 0, 8}, -{REGS_RegCodeX64_fpr4, 0, 8}, -{REGS_RegCodeX64_fpr5, 0, 8}, -{REGS_RegCodeX64_fpr6, 0, 8}, -{REGS_RegCodeX64_fpr7, 0, 8}, -}; - -REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -String8 regs_g_reg_code_x86_string_table[] = -{ -str8_lit_comp(""), -str8_lit_comp("eax"), -str8_lit_comp("ecx"), -str8_lit_comp("edx"), -str8_lit_comp("ebx"), -str8_lit_comp("esp"), -str8_lit_comp("ebp"), -str8_lit_comp("esi"), -str8_lit_comp("edi"), -str8_lit_comp("fsbase"), -str8_lit_comp("gsbase"), -str8_lit_comp("eflags"), -str8_lit_comp("eip"), -str8_lit_comp("dr0"), -str8_lit_comp("dr1"), -str8_lit_comp("dr2"), -str8_lit_comp("dr3"), -str8_lit_comp("dr4"), -str8_lit_comp("dr5"), -str8_lit_comp("dr6"), -str8_lit_comp("dr7"), -str8_lit_comp("fpr0"), -str8_lit_comp("fpr1"), -str8_lit_comp("fpr2"), -str8_lit_comp("fpr3"), -str8_lit_comp("fpr4"), -str8_lit_comp("fpr5"), -str8_lit_comp("fpr6"), -str8_lit_comp("fpr7"), -str8_lit_comp("st0"), -str8_lit_comp("st1"), -str8_lit_comp("st2"), -str8_lit_comp("st3"), -str8_lit_comp("st4"), -str8_lit_comp("st5"), -str8_lit_comp("st6"), -str8_lit_comp("st7"), -str8_lit_comp("fcw"), -str8_lit_comp("fsw"), -str8_lit_comp("ftw"), -str8_lit_comp("fop"), -str8_lit_comp("fcs"), -str8_lit_comp("fds"), -str8_lit_comp("fip"), -str8_lit_comp("fdp"), -str8_lit_comp("mxcsr"), -str8_lit_comp("mxcsr_mask"), -str8_lit_comp("ss"), -str8_lit_comp("cs"), -str8_lit_comp("ds"), -str8_lit_comp("es"), -str8_lit_comp("fs"), -str8_lit_comp("gs"), -str8_lit_comp("ymm0"), -str8_lit_comp("ymm1"), -str8_lit_comp("ymm2"), -str8_lit_comp("ymm3"), -str8_lit_comp("ymm4"), -str8_lit_comp("ymm5"), -str8_lit_comp("ymm6"), -str8_lit_comp("ymm7"), -}; - -String8 regs_g_alias_code_x86_string_table[] = -{ -str8_lit_comp(""), -str8_lit_comp("ax"), -str8_lit_comp("cx"), -str8_lit_comp("bx"), -str8_lit_comp("dx"), -str8_lit_comp("sp"), -str8_lit_comp("bp"), -str8_lit_comp("si"), -str8_lit_comp("di"), -str8_lit_comp("ip"), -str8_lit_comp("ah"), -str8_lit_comp("ch"), -str8_lit_comp("dh"), -str8_lit_comp("bh"), -str8_lit_comp("al"), -str8_lit_comp("cl"), -str8_lit_comp("dl"), -str8_lit_comp("bl"), -str8_lit_comp("bpl"), -str8_lit_comp("spl"), -str8_lit_comp("xmm0"), -str8_lit_comp("xmm1"), -str8_lit_comp("xmm2"), -str8_lit_comp("xmm3"), -str8_lit_comp("xmm4"), -str8_lit_comp("xmm5"), -str8_lit_comp("xmm6"), -str8_lit_comp("xmm7"), -str8_lit_comp("mm0"), -str8_lit_comp("mm1"), -str8_lit_comp("mm2"), -str8_lit_comp("mm3"), -str8_lit_comp("mm4"), -str8_lit_comp("mm5"), -str8_lit_comp("mm6"), -str8_lit_comp("mm7"), -}; - -REGS_Rng regs_g_reg_code_x86_rng_table[] = -{ -{0}, -{(U16)OffsetOf(REGS_RegBlockX86, eax), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ecx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, edx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ebx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, esp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ebp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, esi), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, edi), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fsbase), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, gsbase), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, eflags), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, eip), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr0), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr1), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr2), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr3), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr4), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr5), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr6), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr7), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr0), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr1), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr2), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr3), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr4), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr5), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr6), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr7), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st0), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st1), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st2), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st3), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st4), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st5), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st6), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st7), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fcw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fsw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ftw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fop), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fcs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fds), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fip), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fdp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, mxcsr), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, mxcsr_mask), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ss), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, cs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ds), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, es), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, gs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm0), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm1), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm2), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm3), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm4), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm5), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm6), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm7), 32}, -}; - -REGS_Slice regs_g_alias_code_x86_slice_table[] = -{ -{0}, -{REGS_RegCodeX86_eax, 0, 2}, -{REGS_RegCodeX86_ecx, 0, 2}, -{REGS_RegCodeX86_ebx, 0, 2}, -{REGS_RegCodeX86_edx, 0, 2}, -{REGS_RegCodeX86_esp, 0, 2}, -{REGS_RegCodeX86_ebp, 0, 2}, -{REGS_RegCodeX86_esi, 0, 2}, -{REGS_RegCodeX86_edi, 0, 2}, -{REGS_RegCodeX86_eip, 0, 2}, -{REGS_RegCodeX86_eax, 1, 1}, -{REGS_RegCodeX86_ecx, 1, 1}, -{REGS_RegCodeX86_edx, 1, 1}, -{REGS_RegCodeX86_ebx, 1, 1}, -{REGS_RegCodeX86_eax, 0, 1}, -{REGS_RegCodeX86_ecx, 0, 1}, -{REGS_RegCodeX86_edx, 0, 1}, -{REGS_RegCodeX86_ebx, 0, 1}, -{REGS_RegCodeX86_ebp, 0, 1}, -{REGS_RegCodeX86_esp, 0, 1}, -{REGS_RegCodeX86_ymm0, 0, 16}, -{REGS_RegCodeX86_ymm1, 0, 16}, -{REGS_RegCodeX86_ymm2, 0, 16}, -{REGS_RegCodeX86_ymm3, 0, 16}, -{REGS_RegCodeX86_ymm4, 0, 16}, -{REGS_RegCodeX86_ymm5, 0, 16}, -{REGS_RegCodeX86_ymm6, 0, 16}, -{REGS_RegCodeX86_ymm7, 0, 16}, -{REGS_RegCodeX86_fpr0, 0, 8}, -{REGS_RegCodeX86_fpr1, 0, 8}, -{REGS_RegCodeX86_fpr2, 0, 8}, -{REGS_RegCodeX86_fpr3, 0, 8}, -{REGS_RegCodeX86_fpr4, 0, 8}, -{REGS_RegCodeX86_fpr5, 0, 8}, -{REGS_RegCodeX86_fpr6, 0, 8}, -{REGS_RegCodeX86_fpr7, 0, 8}, -}; - +C_LINKAGE_BEGIN +extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[77]; +extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[80]; +extern String8 regs_g_reg_code_x64_string_table[77]; +extern String8 regs_g_alias_code_x64_string_table[80]; +extern REGS_Rng regs_g_reg_code_x64_rng_table[77]; +extern REGS_Slice regs_g_alias_code_x64_slice_table[80]; +extern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[61]; +extern REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36]; +extern String8 regs_g_reg_code_x86_string_table[61]; +extern String8 regs_g_alias_code_x86_string_table[36]; +extern REGS_Rng regs_g_reg_code_x86_rng_table[61]; +extern REGS_Slice regs_g_alias_code_x86_slice_table[36]; +C_LINKAGE_END #endif // REGS_META_H diff --git a/src/regs/raddbgi/generated/regs_raddbgi.meta.c b/src/regs/raddbgi/generated/regs_raddbgi.meta.c index 19d272d1..bc4c0d55 100644 --- a/src/regs/raddbgi/generated/regs_raddbgi.meta.c +++ b/src/regs/raddbgi/generated/regs_raddbgi.meta.c @@ -321,3 +321,6 @@ case RADDBGI_RegisterCode_X86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; } return result; } +C_LINKAGE_BEGIN +C_LINKAGE_END + diff --git a/src/regs/raddbgi/generated/regs_raddbgi.meta.h b/src/regs/raddbgi/generated/regs_raddbgi.meta.h index 43dafbdd..4082c723 100644 --- a/src/regs/raddbgi/generated/regs_raddbgi.meta.h +++ b/src/regs/raddbgi/generated/regs_raddbgi.meta.h @@ -6,5 +6,7 @@ #ifndef REGS_RADDBGI_META_H #define REGS_RADDBGI_META_H +C_LINKAGE_BEGIN +C_LINKAGE_END #endif // REGS_RADDBGI_META_H diff --git a/src/render/d3d11/generated/render_d3d11.meta.c b/src/render/d3d11/generated/render_d3d11.meta.c index 8969f2d6..08a2c9e0 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.c +++ b/src/render/d3d11/generated/render_d3d11.meta.c @@ -3,7 +3,8 @@ //- GENERATED CODE -String8 r_d3d11_g_vshad_kind_source_table[] = +C_LINKAGE_BEGIN +String8 r_d3d11_g_vshad_kind_source_table[5] = { r_d3d11_g_rect_shader_src, r_d3d11_g_blur_shader_src, @@ -12,7 +13,7 @@ r_d3d11_g_geo3dcomposite_shader_src, r_d3d11_g_finalize_shader_src, }; -String8 r_d3d11_g_vshad_kind_source_name_table[] = +String8 r_d3d11_g_vshad_kind_source_name_table[5] = { str8_lit_comp("r_d3d11_g_rect_shader_src"), str8_lit_comp("r_d3d11_g_blur_shader_src"), @@ -21,7 +22,7 @@ str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), str8_lit_comp("r_d3d11_g_finalize_shader_src"), }; -D3D11_INPUT_ELEMENT_DESC * r_d3d11_g_vshad_kind_elements_ptr_table[] = +D3D11_INPUT_ELEMENT_DESC * r_d3d11_g_vshad_kind_elements_ptr_table[5] = { r_d3d11_g_rect_ilay_elements, 0, @@ -30,7 +31,7 @@ r_d3d11_g_mesh_ilay_elements, 0, }; -U64 r_d3d11_g_vshad_kind_elements_count_table[] = +U64 r_d3d11_g_vshad_kind_elements_count_table[5] = { ArrayCount(r_d3d11_g_rect_ilay_elements) , 0, @@ -39,7 +40,7 @@ ArrayCount(r_d3d11_g_mesh_ilay_elements) , 0, }; -String8 r_d3d11_g_pshad_kind_source_table[] = +String8 r_d3d11_g_pshad_kind_source_table[5] = { r_d3d11_g_rect_shader_src, r_d3d11_g_blur_shader_src, @@ -48,7 +49,7 @@ r_d3d11_g_geo3dcomposite_shader_src, r_d3d11_g_finalize_shader_src, }; -String8 r_d3d11_g_pshad_kind_source_name_table[] = +String8 r_d3d11_g_pshad_kind_source_name_table[5] = { str8_lit_comp("r_d3d11_g_rect_shader_src"), str8_lit_comp("r_d3d11_g_blur_shader_src"), @@ -57,10 +58,12 @@ str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), str8_lit_comp("r_d3d11_g_finalize_shader_src"), }; -U64 r_d3d11_g_uniform_type_kind_size_table[] = +U64 r_d3d11_g_uniform_type_kind_size_table[3] = { sizeof(R_D3D11_Uniforms_Rect), sizeof(R_D3D11_Uniforms_Blur), sizeof(R_D3D11_Uniforms_Mesh), }; +C_LINKAGE_END + diff --git a/src/render/d3d11/generated/render_d3d11.meta.h b/src/render/d3d11/generated/render_d3d11.meta.h index 2c0260e5..b56b7e29 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.h +++ b/src/render/d3d11/generated/render_d3d11.meta.h @@ -34,6 +34,7 @@ R_D3D11_UniformTypeKind_Mesh, R_D3D11_UniformTypeKind_COUNT, } R_D3D11_UniformTypeKind; +C_LINKAGE_BEGIN read_only global String8 r_d3d11_g_rect_shader_src = str8_lit_comp( "" @@ -461,5 +462,6 @@ str8_lit_comp( "" ); +C_LINKAGE_END #endif // RENDER_D3D11_META_H diff --git a/src/render/generated/render.meta.c b/src/render/generated/render.meta.c index 3c6ec07e..ca405579 100644 --- a/src/render/generated/render.meta.c +++ b/src/render/generated/render.meta.c @@ -3,10 +3,65 @@ //- GENERATED CODE -U64 r_pass_kind_params_size_table[] = +C_LINKAGE_BEGIN +String8 r_tex2d_format_display_string_table[9] = +{ +str8_lit_comp("R8"), +str8_lit_comp("RG8"), +str8_lit_comp("RGBA8"), +str8_lit_comp("BGRA8"), +str8_lit_comp("R16"), +str8_lit_comp("RGBA16"), +str8_lit_comp("R32"), +str8_lit_comp("RG32"), +str8_lit_comp("RGBA32"), +}; + +U8 r_tex2d_format_bytes_per_pixel_table[9] = +{ +1, +2, +4, +4, +2, +8, +4, +8, +16, +}; + +String8 r_tex2d_kind_display_string_table[2] = +{ +str8_lit_comp("Static"), +str8_lit_comp("Dynamic"), +}; + +String8 r_tex2d_sample_kind_display_string_table[2] = +{ +str8_lit_comp("Nearest"), +str8_lit_comp("Linear"), +}; + +String8 r_pass_kind_display_string_table[3] = +{ +str8_lit_comp("UI"), +str8_lit_comp("Blur"), +str8_lit_comp("Geo3D"), +}; + +U8 r_pass_kind_batch_table[3] = +{ +1, +0, +1, +}; + +U64 r_pass_kind_params_size_table[3] = { sizeof(R_PassParams_UI), sizeof(R_PassParams_Blur), sizeof(R_PassParams_Geo3D), }; +C_LINKAGE_END + diff --git a/src/render/generated/render.meta.h b/src/render/generated/render.meta.h index 5daa7729..5ab27d47 100644 --- a/src/render/generated/render.meta.h +++ b/src/render/generated/render.meta.h @@ -58,57 +58,13 @@ R_PassKind_Geo3D, R_PassKind_COUNT, } R_PassKind; -String8 r_tex2d_format_display_string_table[] = -{ -str8_lit_comp("R8"), -str8_lit_comp("RG8"), -str8_lit_comp("RGBA8"), -str8_lit_comp("BGRA8"), -str8_lit_comp("R16"), -str8_lit_comp("RGBA16"), -str8_lit_comp("R32"), -str8_lit_comp("RG32"), -str8_lit_comp("RGBA32"), -}; - -U8 r_tex2d_format_bytes_per_pixel_table[] = -{ -1, -2, -4, -4, -2, -8, -4, -8, -16, -}; - -String8 r_tex2d_kind_display_string_table[] = -{ -str8_lit_comp("Static"), -str8_lit_comp("Dynamic"), -}; - -String8 r_tex2d_sample_kind_display_string_table[] = -{ -str8_lit_comp("Nearest"), -str8_lit_comp("Linear"), -}; - -String8 r_pass_kind_display_string_table[] = -{ -str8_lit_comp("UI"), -str8_lit_comp("Blur"), -str8_lit_comp("Geo3D"), -}; - -U8 r_pass_kind_batch_table[] = -{ -1, -0, -1, -}; - +C_LINKAGE_BEGIN +extern String8 r_tex2d_format_display_string_table[9]; +extern U8 r_tex2d_format_bytes_per_pixel_table[9]; +extern String8 r_tex2d_kind_display_string_table[2]; +extern String8 r_tex2d_sample_kind_display_string_table[2]; +extern String8 r_pass_kind_display_string_table[3]; +extern U8 r_pass_kind_batch_table[3]; +C_LINKAGE_END #endif // RENDER_META_H diff --git a/src/type_graph/generated/type_graph.meta.c b/src/type_graph/generated/type_graph.meta.c index b9d27fe6..23e43829 100644 --- a/src/type_graph/generated/type_graph.meta.c +++ b/src/type_graph/generated/type_graph.meta.c @@ -3,3 +3,122 @@ //- GENERATED CODE +C_LINKAGE_BEGIN +U8 tg_kind_basic_byte_size_table[54] = +{ +0, +0, +0xFF, +1, +2, +4, +1, +2, +4, +1, +2, +4, +8, +16, +32, +64, +1, +2, +4, +8, +16, +32, +64, +1, +2, +4, +4, +6, +8, +10, +16, +8, +16, +20, +32, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +}; + +String8 tg_kind_basic_string_table[54] = +{ +str8_lit_comp(""), +str8_lit_comp("void"), +str8_lit_comp("HANDLE"), +str8_lit_comp("char8"), +str8_lit_comp("char16"), +str8_lit_comp("char32"), +str8_lit_comp("uchar8"), +str8_lit_comp("uchar16"), +str8_lit_comp("uchar32"), +str8_lit_comp("U8"), +str8_lit_comp("U16"), +str8_lit_comp("U32"), +str8_lit_comp("U64"), +str8_lit_comp("U128"), +str8_lit_comp("U256"), +str8_lit_comp("U512"), +str8_lit_comp("S8"), +str8_lit_comp("S16"), +str8_lit_comp("S32"), +str8_lit_comp("S64"), +str8_lit_comp("S128"), +str8_lit_comp("S256"), +str8_lit_comp("S512"), +str8_lit_comp("bool"), +str8_lit_comp("F16"), +str8_lit_comp("F32"), +str8_lit_comp("F32PP"), +str8_lit_comp("F48"), +str8_lit_comp("F64"), +str8_lit_comp("F80"), +str8_lit_comp("F128"), +str8_lit_comp("ComplexF32"), +str8_lit_comp("ComplexF64"), +str8_lit_comp("ComplexF80"), +str8_lit_comp("ComplexF128"), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp("struct"), +str8_lit_comp("class"), +str8_lit_comp("union"), +str8_lit_comp("enum"), +str8_lit_comp("typedef"), +str8_lit_comp("struct"), +str8_lit_comp("union"), +str8_lit_comp("class"), +str8_lit_comp("enum"), +str8_lit_comp(""), +str8_lit_comp(""), +}; + +C_LINKAGE_END + diff --git a/src/type_graph/generated/type_graph.meta.h b/src/type_graph/generated/type_graph.meta.h index 9089da71..8a4021b2 100644 --- a/src/type_graph/generated/type_graph.meta.h +++ b/src/type_graph/generated/type_graph.meta.h @@ -75,121 +75,9 @@ TG_Kind_FirstIncomplete = TG_Kind_IncompleteStruct, TG_Kind_LastIncomplete = TG_Kind_IncompleteEnum, } TG_Kind; -U8 tg_kind_basic_byte_size_table[] = -{ -0, -0, -0xFF, -1, -2, -4, -1, -2, -4, -1, -2, -4, -8, -16, -32, -64, -1, -2, -4, -8, -16, -32, -64, -1, -2, -4, -4, -6, -8, -10, -16, -8, -16, -20, -32, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -}; - -String8 tg_kind_basic_string_table[] = -{ -str8_lit_comp(""), -str8_lit_comp("void"), -str8_lit_comp("HANDLE"), -str8_lit_comp("char8"), -str8_lit_comp("char16"), -str8_lit_comp("char32"), -str8_lit_comp("uchar8"), -str8_lit_comp("uchar16"), -str8_lit_comp("uchar32"), -str8_lit_comp("U8"), -str8_lit_comp("U16"), -str8_lit_comp("U32"), -str8_lit_comp("U64"), -str8_lit_comp("U128"), -str8_lit_comp("U256"), -str8_lit_comp("U512"), -str8_lit_comp("S8"), -str8_lit_comp("S16"), -str8_lit_comp("S32"), -str8_lit_comp("S64"), -str8_lit_comp("S128"), -str8_lit_comp("S256"), -str8_lit_comp("S512"), -str8_lit_comp("bool"), -str8_lit_comp("F16"), -str8_lit_comp("F32"), -str8_lit_comp("F32PP"), -str8_lit_comp("F48"), -str8_lit_comp("F64"), -str8_lit_comp("F80"), -str8_lit_comp("F128"), -str8_lit_comp("ComplexF32"), -str8_lit_comp("ComplexF64"), -str8_lit_comp("ComplexF80"), -str8_lit_comp("ComplexF128"), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp("struct"), -str8_lit_comp("class"), -str8_lit_comp("union"), -str8_lit_comp("enum"), -str8_lit_comp("typedef"), -str8_lit_comp("struct"), -str8_lit_comp("union"), -str8_lit_comp("class"), -str8_lit_comp("enum"), -str8_lit_comp(""), -str8_lit_comp(""), -}; - +C_LINKAGE_BEGIN +extern U8 tg_kind_basic_byte_size_table[54]; +extern String8 tg_kind_basic_string_table[54]; +C_LINKAGE_END #endif // TYPE_GRAPH_META_H diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c index 0500ac74..63c12784 100644 --- a/src/type_graph/type_graph.c +++ b/src/type_graph/type_graph.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/type_graph.meta.c" + //////////////////////////////// //~ rjf: Basic Helpers diff --git a/src/ui/generated/ui.meta.c b/src/ui/generated/ui.meta.c index 8a81693b..cb7ca0aa 100644 --- a/src/ui/generated/ui.meta.c +++ b/src/ui/generated/ui.meta.c @@ -185,3 +185,6 @@ internal F32 ui_set_next_corner_radius_11(F32 v) { UI_StackSetNextImpl(ui_state, internal F32 ui_set_next_blur_size(F32 v) { UI_StackSetNextImpl(ui_state, BlurSize, blur_size, F32, v) } internal F32 ui_set_next_text_padding(F32 v) { UI_StackSetNextImpl(ui_state, TextPadding, text_padding, F32, v) } internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v) { UI_StackSetNextImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } +C_LINKAGE_BEGIN +C_LINKAGE_END + diff --git a/src/ui/generated/ui.meta.h b/src/ui/generated/ui.meta.h index e901b86e..bd3a2bc4 100644 --- a/src/ui/generated/ui.meta.h +++ b/src/ui/generated/ui.meta.h @@ -350,5 +350,7 @@ internal F32 ui_set_next_corner_radius_11(F32 v); internal F32 ui_set_next_blur_size(F32 v); internal F32 ui_set_next_text_padding(F32 v); internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v); +C_LINKAGE_BEGIN +C_LINKAGE_END #endif // UI_META_H From 66a24a226a7d7ac7f89a80d74922b7adf68c6944 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 11:42:20 -0800 Subject: [PATCH 052/275] adjust contain -> center cursor threshold --- src/df/gfx/df_views.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index c32fe086..808ebd2d 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5429,7 +5429,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) tv->goto_line_num = 0; line_num = Clamp(1, line_num, txti_buffer_info.total_line_count); tv->cursor = tv->mark = txt_pt(line_num, 1); - tv->center_cursor = !tv->contain_cursor || (line_num < target_visible_line_num_range.min+8 || target_visible_line_num_range.max-8 < line_num); + tv->center_cursor = !tv->contain_cursor || (line_num < target_visible_line_num_range.min+4 || target_visible_line_num_range.max-4 < line_num); } ////////////////////////////// @@ -7232,7 +7232,7 @@ DF_VIEW_UI_FUNCTION_DEF(Output) tv->goto_line_num = 0; line_num = Clamp(1, line_num, txti_buffer_info.total_line_count); tv->cursor = tv->mark = txt_pt(line_num, 1); - tv->center_cursor = !tv->contain_cursor || (line_num < target_visible_line_num_range.min+8 || target_visible_line_num_range.max-8 < line_num); + tv->center_cursor = !tv->contain_cursor || (line_num < target_visible_line_num_range.min+4 || target_visible_line_num_range.max-4 < line_num); } ////////////////////////////// From 608055e44795958f2e8e1735ff77a453ca6013bc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 13:27:02 -0800 Subject: [PATCH 053/275] metagen: simplify catchall generations; move some codeview enums into metacode; generate enum->string code --- src/base/base_ins.h | 4 +- src/codeview/codeview.c | 5 + src/codeview/codeview.h | 1745 ++++++++++++------------ src/codeview/codeview.mdesk | 478 +++++++ src/codeview/codeview_stringize.c | 55 +- src/codeview/codeview_stringize.h | 4 - src/codeview/generated/codeview.meta.c | 454 ++++++ src/codeview/generated/codeview.meta.h | 461 +++++++ src/df/core/df_core.mdesk | 8 +- src/df/gfx/df_gfx.mdesk | 4 +- src/draw/draw.mdesk | 14 +- src/metagen/metagen_main.c | 47 +- src/regs/raddbgi/regs_raddbgi.mdesk | 4 +- src/regs/regs.mdesk | 18 +- src/ui/ui.mdesk | 18 +- 15 files changed, 2323 insertions(+), 996 deletions(-) create mode 100644 src/codeview/generated/codeview.meta.c create mode 100644 src/codeview/generated/codeview.meta.h diff --git a/src/base/base_ins.h b/src/base/base_ins.h index 9f8d3202..6908e7cd 100644 --- a/src/base/base_ins.h +++ b/src/base/base_ins.h @@ -15,11 +15,11 @@ # include # if ARCH_X64 -# define ins_atomic_u64_eval(x) InterlockedAdd((volatile LONG *)(x), 0) +# define ins_atomic_u64_eval(x) InterlockedAdd64((volatile __int64 *)(x), 0) # define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) # define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) # define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) -# define ins_atomic_u64_add_eval(x,c) InterlockedAdd((volatile LONG *)(x), c) +# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((volatile __int64 *)(x), c) # define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) # define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) # define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile __int64 *)(x), (__int64)(c)) diff --git a/src/codeview/codeview.c b/src/codeview/codeview.c index e7425434..ad1b528e 100644 --- a/src/codeview/codeview.c +++ b/src/codeview/codeview.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ Generated Code + +#include "generated/codeview.meta.c" + //////////////////////////////// //~ CodeView Common Functions diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index 1e4a1d37..5aedc31a 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -9,7 +9,7 @@ // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h //////////////////////////////// -//~ CodeView Format Shared Types +//~ rjf: CodeView Format Shared Types typedef U32 CV_TypeId; typedef U32 CV_ItemId; @@ -19,139 +19,13 @@ typedef U16 CV_Reg; read_only global CV_TypeId cv_type_id_variadic = 0xFFFFFFFF; -#define CV_NumericKindXList(X) \ -X(CHAR, 0x8000)\ -X(SHORT, 0x8001)\ -X(USHORT, 0x8002)\ -X(LONG, 0x8003)\ -X(ULONG, 0x8004)\ -X(FLOAT32, 0x8005)\ -X(FLOAT64, 0x8006)\ -X(FLOAT80, 0x8007)\ -X(FLOAT128, 0x8008)\ -X(QUADWORD, 0x8009)\ -X(UQUADWORD, 0x800a)\ -X(FLOAT48, 0x800b)\ -X(COMPLEX32, 0x800c)\ -X(COMPLEX64, 0x800d)\ -X(COMPLEX80, 0x800e)\ -X(COMPLEX128, 0x800f)\ -X(VARSTRING, 0x8010)\ -X(OCTWORD, 0x8017)\ -X(UOCTWORD, 0x8018)\ -X(DECIMAL, 0x8019)\ -X(DATE, 0x801a)\ -X(UTF8STRING, 0x801b)\ -X(FLOAT16, 0x801c) +//////////////////////////////// +//~ rjf: Generated Code -typedef U16 CV_NumericKind; -typedef enum{ -#define X(N,c) CV_NumericKind_##N = c, - CV_NumericKindXList(X) -#undef X -} CV_NumericKindEnum; - -#define CV_ArchXList(X) \ -X(8080, 0x00)\ -X(8086, 0x01)\ -X(80286, 0x02)\ -X(80386, 0x03)\ -X(80486, 0x04)\ -X(PENTIUM, 0x05)\ -X(PENTIUMII, 0x06)\ -X(PENTIUMIII, 0x07)\ -X(MIPS, 0x10)\ -X(MIPS16, 0x11)\ -X(MIPS32, 0x12)\ -X(MIPS64, 0x13)\ -X(MIPSI, 0x14)\ -X(MIPSII, 0x15)\ -X(MIPSIII, 0x16)\ -X(MIPSIV, 0x17)\ -X(MIPSV, 0x18)\ -X(M68000, 0x20)\ -X(M68010, 0x21)\ -X(M68020, 0x22)\ -X(M68030, 0x23)\ -X(M68040, 0x24)\ -X(ALPHA, 0x30)\ -X(ALPHA_21164, 0x31)\ -X(ALPHA_21164A, 0x32)\ -X(ALPHA_21264, 0x33)\ -X(ALPHA_21364, 0x34)\ -X(PPC601, 0x40)\ -X(PPC603, 0x41)\ -X(PPC604, 0x42)\ -X(PPC620, 0x43)\ -X(PPCFP, 0x44)\ -X(PPCBE, 0x45)\ -X(SH3, 0x50)\ -X(SH3E, 0x51)\ -X(SH3DSP, 0x52)\ -X(SH4, 0x53)\ -X(SHMEDIA, 0x54)\ -X(ARM3, 0x60)\ -X(ARM4, 0x61)\ -X(ARM4T, 0x62)\ -X(ARM5, 0x63)\ -X(ARM5T, 0x64)\ -X(ARM6, 0x65)\ -X(ARM_XMAC, 0x66)\ -X(ARM_WMMX, 0x67)\ -X(ARM7, 0x68)\ -X(OMNI, 0x70)\ -X(IA64_1, 0x80)\ -X(IA64_2, 0x81)\ -X(CEE, 0x90)\ -X(AM33, 0xA0)\ -X(M32R, 0xB0)\ -X(TRICORE, 0xC0)\ -X(X64, 0xD0)\ -X(EBC, 0xE0)\ -X(THUMB, 0xF0)\ -X(ARMNT, 0xF4)\ -X(ARM64, 0xF6)\ -X(D3D11_SHADER, 0x100) - -#define CV_Arch_IA64 CV_Arch_IA64_1 - -typedef U16 CV_Arch; -typedef enum{ -#define X(N,c) CV_Arch_##N = c, - CV_ArchXList(X) -#undef X -} CV_ArchEnum; -#define CV_Arch_PENTIUMPRO CV_Arch_PENTIUMII -#define CV_Arch_MIPSR4000 CV_Arch_MIPS -#define CV_Arch_ALPHA_21064 CV_Arch_ALPHA -#define CV_Arch_AMD64 CV_Arch_X64 - - -typedef U16 CV_Reg; - - -#define CV_AllRegXList(X) \ -X(ERR, 30000)\ -X(TEB, 30001)\ -X(TIMER, 30002)\ -X(EFAD1, 30003)\ -X(EFAD2, 30004)\ -X(EFAD3, 30005)\ -X(VFRAME, 30006)\ -X(HANDLE, 30007)\ -X(PARAMS, 30008)\ -X(LOCALS, 30009)\ -X(TID, 30010)\ -X(ENV, 30011)\ -X(CMDLN, 30012) - -typedef U16 CV_AllReg; -typedef enum{ -#define X(N,c) CV_AllReg_##N = c, - CV_AllRegXList(X) -#undef X -} CV_AllRegEnum; +#include "generated/codeview.meta.h" +//////////////////////////////// +//~ rjf: Registers // X(NAME, CODE, (RADDBGI_RegsiterCode_X86) NAME, BYTE_POS, BYTE_SIZE) #define CV_Reg_X86_XList(X) \ @@ -400,11 +274,13 @@ X(YMM7D2, 394, ymm7, 16, 8)\ X(YMM7D3, 395, ymm7, 24, 8) typedef U16 CV_Regx86; -typedef enum{ +typedef enum CV_Regx86Enum +{ #define X(CVN,C,RDN,BP,BZ) CV_Regx86_##CVN = C, CV_Reg_X86_XList(X) #undef X -} CV_Regx86Enum; +} +CV_Regx86Enum; // X(NAME, CODE, (RADDBGI_RegsiterCode_X64) NAME, BYTE_POS, BYTE_SIZE) #define CV_Reg_X64_XList(X) \ @@ -1027,11 +903,13 @@ X(YMM15D2, 686, ymm15, 16, 8)\ X(YMM15D3, 687, ymm15, 24, 8) typedef U16 CV_Regx64; -typedef enum{ +typedef enum CV_Regx64Enum +{ #define X(CVN,C,RDN,BP,BZ) CV_Regx64_##CVN = C, CV_Reg_X64_XList(X) #undef X -} CV_Regx64Enum; +} +CV_Regx64Enum; #define CV_SignatureXList(X) \ @@ -1042,11 +920,13 @@ X(C13, 4)\ X(RESERVED, 5) typedef U16 CV_Signature; -typedef enum{ +typedef enum CV_SignatureEnum +{ #define X(N,c) CV_Signature_##N = c, CV_SignatureXList(X) #undef X -} CV_SignatureEnum; +} +CV_SignatureEnum; #define CV_LanguageXList(X) \ @@ -1069,231 +949,31 @@ X(MSIL, 0x0F)\ X(HLSL, 0x10) typedef U16 CV_Language; -typedef enum{ +typedef enum CV_LanguageEnum +{ #define X(N,c) CV_Language_##N = c, CV_LanguageXList(X) #undef X -} CV_LanguageEnum; - - +} +CV_LanguageEnum; //////////////////////////////// -//~ CodeView Format "Sym" and "Leaf" Header Type +//~ rjf: CodeView Format "Sym" and "Leaf" Header Type -typedef struct CV_RecHeader{ +typedef struct CV_RecHeader CV_RecHeader; +struct CV_RecHeader +{ U16 size; U16 kind; -} CV_RecHeader; - +}; //////////////////////////////// -//~ CodeView Format "Sym" Types -// (per-compilation-unit info, variables, procedures, etc.) - -#define CV_SymKindXList(X) \ -X(COMPILE, 0x0001)\ -X(REGISTER_16t, 0x0002)\ -X(CONSTANT_16t, 0x0003)\ -X(UDT_16t, 0x0004)\ -X(SSEARCH, 0x0005)\ -X(END, 0x0006)\ -X(SKIP, 0x0007)\ -X(CVRESERVE, 0x0008)\ -X(OBJNAME_ST, 0x0009)\ -X(ENDARG, 0x000a)\ -X(COBOLUDT_16t, 0x000b)\ -X(MANYREG_16t, 0x000c)\ -X(RETURN, 0x000d)\ -X(ENTRYTHIS, 0x000e)\ -X(BPREL16, 0x0100)\ -X(LDATA16, 0x0101)\ -X(GDATA16, 0x0102)\ -X(PUB16, 0x0103)\ -X(LPROC16, 0x0104)\ -X(GPROC16, 0x0105)\ -X(THUNK16, 0x0106)\ -X(BLOCK16, 0x0107)\ -X(WITH16, 0x0108)\ -X(LABEL16, 0x0109)\ -X(CEXMODEL16, 0x010a)\ -X(VFTABLE16, 0x010b)\ -X(REGREL16, 0x010c)\ -X(BPREL32_16t, 0x0200)\ -X(LDATA32_16t, 0x0201)\ -X(GDATA32_16t, 0x0202)\ -X(PUB32_16t, 0x0203)\ -X(LPROC32_16t, 0x0204)\ -X(GPROC32_16t, 0x0205)\ -X(THUNK32_ST, 0x0206)\ -X(BLOCK32_ST, 0x0207)\ -X(WITH32_ST, 0x0208)\ -X(LABEL32_ST, 0x0209)\ -X(CEXMODEL32, 0x020a)\ -X(VFTABLE32_16t, 0x020b)\ -X(REGREL32_16t, 0x020c)\ -X(LTHREAD32_16t, 0x020d)\ -X(GTHREAD32_16t, 0x020e)\ -X(SLINK32, 0x020f)\ -X(LPROCMIPS_16t, 0x0300)\ -X(GPROCMIPS_16t, 0x0301)\ -X(PROCREF_ST, 0x0400)\ -X(DATAREF_ST, 0x0401)\ -X(ALIGN, 0x0402)\ -X(LPROCREF_ST, 0x0403)\ -X(OEM, 0x0404)\ -X(TI16_MAX, 0x1000)\ -X(CONSTANT_ST, 0x1002)\ -X(UDT_ST, 0x1003)\ -X(COBOLUDT_ST, 0x1004)\ -X(MANYREG_ST, 0x1005)\ -X(BPREL32_ST, 0x1006)\ -X(LDATA32_ST, 0x1007)\ -X(GDATA32_ST, 0x1008)\ -X(PUB32_ST, 0x1009)\ -X(LPROC32_ST, 0x100a)\ -X(GPROC32_ST, 0x100b)\ -X(VFTABLE32, 0x100c)\ -X(REGREL32_ST, 0x100d)\ -X(LTHREAD32_ST, 0x100e)\ -X(GTHREAD32_ST, 0x100f)\ -X(LPROCMIPS_ST, 0x1010)\ -X(GPROCMIPS_ST, 0x1011)\ -X(FRAMEPROC, 0x1012)\ -X(COMPILE2_ST, 0x1013)\ -X(MANYREG2_ST, 0x1014)\ -X(LPROCIA64_ST, 0x1015)\ -X(GPROCIA64_ST, 0x1016)\ -X(LOCALSLOT_ST, 0x1017)\ -X(PARAMSLOT_ST, 0x1018)\ -X(ANNOTATION, 0x1019)\ -X(GMANPROC_ST, 0x101a)\ -X(LMANPROC_ST, 0x101b)\ -X(RESERVED1, 0x101c)\ -X(RESERVED2, 0x101d)\ -X(RESERVED3, 0x101e)\ -X(RESERVED4, 0x101f)\ -X(LMANDATA_ST, 0x1020)\ -X(GMANDATA_ST, 0x1021)\ -X(MANFRAMEREL_ST, 0x1022)\ -X(MANREGISTER_ST, 0x1023)\ -X(MANSLOT_ST, 0x1024)\ -X(MANMANYREG_ST, 0x1025)\ -X(MANREGREL_ST, 0x1026)\ -X(MANMANYREG2_ST, 0x1027)\ -X(MANTYPREF, 0x1028)\ -X(UNAMESPACE_ST, 0x1029)\ -X(ST_MAX, 0x1100)\ -X(OBJNAME, 0x1101)\ -X(THUNK32, 0x1102)\ -X(BLOCK32, 0x1103)\ -X(WITH32, 0x1104)\ -X(LABEL32, 0x1105)\ -X(REGISTER, 0x1106)\ -X(CONSTANT, 0x1107)\ -X(UDT, 0x1108)\ -X(COBOLUDT, 0x1109)\ -X(MANYREG, 0x110a)\ -X(BPREL32, 0x110b)\ -X(LDATA32, 0x110c)\ -X(GDATA32, 0x110d)\ -X(PUB32, 0x110e)\ -X(LPROC32, 0x110f)\ -X(GPROC32, 0x1110)\ -X(REGREL32, 0x1111)\ -X(LTHREAD32, 0x1112)\ -X(GTHREAD32, 0x1113)\ -X(LPROCMIPS, 0x1114)\ -X(GPROCMIPS, 0x1115)\ -X(COMPILE2, 0x1116)\ -X(MANYREG2, 0x1117)\ -X(LPROCIA64, 0x1118)\ -X(GPROCIA64, 0x1119)\ -X(LOCALSLOT, 0x111a)\ -X(PARAMSLOT, 0x111b)\ -X(LMANDATA, 0x111c)\ -X(GMANDATA, 0x111d)\ -X(MANFRAMEREL, 0x111e)\ -X(MANREGISTER, 0x111f)\ -X(MANSLOT, 0x1120)\ -X(MANMANYREG, 0x1121)\ -X(MANREGREL, 0x1122)\ -X(MANMANYREG2, 0x1123)\ -X(UNAMESPACE, 0x1124)\ -X(PROCREF, 0x1125)\ -X(DATAREF, 0x1126)\ -X(LPROCREF, 0x1127)\ -X(ANNOTATIONREF, 0x1128)\ -X(TOKENREF, 0x1129)\ -X(GMANPROC, 0x112a)\ -X(LMANPROC, 0x112b)\ -X(TRAMPOLINE, 0x112c)\ -X(MANCONSTANT, 0x112d)\ -X(ATTR_FRAMEREL, 0x112e)\ -X(ATTR_REGISTER, 0x112f)\ -X(ATTR_REGREL, 0x1130)\ -X(ATTR_MANYREG, 0x1131)\ -X(SEPCODE, 0x1132)\ -X(DEFRANGE_2005, 0x1134)\ -X(DEFRANGE2_2005, 0x1135)\ -X(SECTION, 0x1136)\ -X(COFFGROUP, 0x1137)\ -X(EXPORT, 0x1138)\ -X(CALLSITEINFO, 0x1139)\ -X(FRAMECOOKIE, 0x113a)\ -X(DISCARDED, 0x113b)\ -X(COMPILE3, 0x113c)\ -X(ENVBLOCK, 0x113d)\ -X(LOCAL, 0x113e)\ -X(DEFRANGE, 0x113f)\ -X(DEFRANGE_SUBFIELD, 0x1140)\ -X(DEFRANGE_REGISTER, 0x1141)\ -X(DEFRANGE_FRAMEPOINTER_REL, 0x1142)\ -X(DEFRANGE_SUBFIELD_REGISTER, 0x1143)\ -X(DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE, 0x1144)\ -X(DEFRANGE_REGISTER_REL, 0x1145)\ -X(LPROC32_ID, 0x1146)\ -X(GPROC32_ID, 0x1147)\ -X(LPROCMIPS_ID, 0x1148)\ -X(GPROCMIPS_ID, 0x1149)\ -X(LPROCIA64_ID, 0x114a)\ -X(GPROCIA64_ID, 0x114b)\ -X(BUILDINFO, 0x114c)\ -X(INLINESITE, 0x114d)\ -X(INLINESITE_END, 0x114e)\ -X(PROC_ID_END, 0x114f)\ -X(DEFRANGE_HLSL, 0x1150)\ -X(GDATA_HLSL, 0x1151)\ -X(LDATA_HLSL, 0x1152)\ -X(FILESTATIC, 0x1153)\ -X(LPROC32_DPC, 0x1155)\ -X(LPROC32_DPC_ID, 0x1156)\ -X(DEFRANGE_DPC_PTR_TAG, 0x1157)\ -X(DPC_SYM_TAG_MAP, 0x1158)\ -X(ARMSWITCHTABLE, 0x1159)\ -X(CALLEES, 0x115a)\ -X(CALLERS, 0x115b)\ -X(POGODATA, 0x115c)\ -X(INLINESITE2, 0x115d)\ -X(HEAPALLOCSITE, 0x115e)\ -X(MOD_TYPEREF, 0x115f)\ -X(REF_MINIPDB, 0x1160)\ -X(PDBMAP, 0x1161)\ -X(GDATA_HLSL32, 0x1162)\ -X(LDATA_HLSL32, 0x1163)\ -X(GDATA_HLSL32_EX, 0x1164)\ -X(LDATA_HLSL32_EX, 0x1165)\ -X(FASTLINK, 0x1167)\ -X(INLINEES, 0x1168) - -typedef U16 CV_SymKind; -typedef enum{ -#define X(N,c) CV_SymKind_##N = c, - CV_SymKindXList(X) -#undef X -} CV_SymKindEnum; +//~ rjf: CodeView Format "Sym" Types +// (per-compilation-unit info, variables, procedures, etc.) typedef U8 CV_ProcFlags; -enum{ +enum +{ CV_ProcFlag_NoFPO = (1 << 0), CV_ProcFlag_IntReturn = (1 << 1), CV_ProcFlag_FarReturn = (1 << 2), @@ -1305,7 +985,8 @@ enum{ }; typedef U16 CV_LocalFlags; -enum{ +enum +{ CV_LocalFlag_Param = (1 << 0), CV_LocalFlag_AddrTaken = (1 << 1), CV_LocalFlag_Compgen = (1 << 2), @@ -1319,13 +1000,16 @@ enum{ CV_LocalFlag_Static = (1 << 10), }; -typedef struct CV_LocalVarAttr{ +typedef struct CV_LocalVarAttr CV_LocalVarAttr; +struct CV_LocalVarAttr +{ U32 off; U16 seg; CV_LocalFlags flags; -} CV_LocalVarAttr; +}; + +//- (SymKind: COMPILE) -// (SymKind: COMPILE) typedef U32 CV_CompileFlags; #define CV_CompileFlags_ExtractLanguage(f) (((f) )&0xFF) #define CV_CompileFlags_ExtractFloatPrec(f) (((f)>> 8)&0x03) @@ -1334,23 +1018,30 @@ typedef U32 CV_CompileFlags; #define CV_CompileFlags_ExtractAmbientCode(f) (((f)>>15)&0x07) #define CV_CompileFlags_ExtractMode(f) (((f)>>18)&0x01) -typedef struct CV_SymCompile{ +typedef struct CV_SymCompile CV_SymCompile; +struct CV_SymCompile +{ U8 machine; CV_CompileFlags flags; // U8[] ver_str (null terminated) -} CV_SymCompile; +}; -// (SymKind: SSEARCH) -typedef struct CV_SymStartSearch{ +//- (SymKind: SSEARCH) + +typedef struct CV_SymStartSearch CV_SymStartSearch; +struct CV_SymStartSearch +{ U32 start_symbol; U16 segment; -} CV_SymStartSearch; +}; -// (SymKind: END) (empty) +//- (SymKind: END) (empty) + +//- (SymKind: RETURN) -// (SymKind: RETURN) typedef U8 CV_GenericStyle; -typedef enum{ +typedef enum CV_GenericStyleEnum +{ CV_GenericStyle_VOID, CV_GenericStyle_REG, // "return data is in register" CV_GenericStyle_ICAN, // "indirect caller allocated near" @@ -1358,52 +1049,69 @@ typedef enum{ CV_GenericStyle_IRAN, // "indirect returnee allocated near" CV_GenericStyle_IRAF, // "indirect returnee allocated far" CV_GenericStyle_UNUSED, -} CV_GenericStyleEnum; +} +CV_GenericStyleEnum; typedef U16 CV_GenericFlags; -enum{ +enum +{ CV_GenericFlags_CSTYLE = (1 << 0), CV_GenericFlags_RSCLEAN = (1 << 1), // "returnee stack cleanup" }; -typedef struct CV_Return{ +typedef struct CV_Return CV_Return; +struct CV_Return +{ CV_GenericFlags flags; CV_GenericStyle style; -} CV_Return; +}; -// (SymKind: SLINK32) -typedef struct CV_SymSLink32{ +//- (SymKind: SLINK32) + +typedef struct CV_SymSLink32 CV_SymSLink32; +struct CV_SymSLink32 +{ U32 frame_size; U32 offset; U16 reg; -} CV_SymSLink32; +}; -// (SymKind: OEM) -typedef struct CV_SymOEM{ +//- (SymKind: OEM) + +typedef struct CV_SymOEM CV_SymOEM; +struct CV_SymOEM +{ COFF_Guid id; CV_TypeId itype; // padding align(4) -} CV_SymOEM; +}; -// (SymKind: VFTABLE32) -typedef struct CV_SymVPath32{ +//- (SymKind: VFTABLE32) + +typedef struct CV_SymVPath32 CV_SymVPath32; +struct CV_SymVPath32 +{ CV_TypeId root; CV_TypeId path; U32 off; U16 seg; } CV_SymVPath32; -// (SymKind: FRAMEPROC) +//- (SymKind: FRAMEPROC) + typedef U8 CV_EncodedFramePtrReg; -typedef enum{ +typedef enum CV_EncodedFramePtrRegEnum +{ CV_EncodedFramePtrReg_None, CV_EncodedFramePtrReg_StackPtr, CV_EncodedFramePtrReg_FramePtr, CV_EncodedFramePtrReg_BasePtr, -} CV_EncodedFramePtrRegEnum; +} +CV_EncodedFramePtrRegEnum; typedef U32 CV_FrameprocFlags; -enum{ +enum +{ CV_FrameprocFlag_UsesAlloca = (1 << 0), CV_FrameprocFlag_UsesSetJmp = (1 << 1), CV_FrameprocFlag_UsesLongJmp = (1 << 2), @@ -1426,11 +1134,12 @@ enum{ CV_FrameprocFlag_HasCFG = (1 << 21), CV_FrameprocFlag_HasCFW = (1 << 22), }; - #define CV_FrameprocFlags_ExtractLocalBasePointer(f) (((f) >> 14)&3) #define CV_FrameprocFlags_ExtractParamBasePointer(f) (((f) >> 16)&3) -typedef struct CV_SymFrameproc{ +typedef struct CV_SymFrameproc CV_SymFrameproc; +struct CV_SymFrameproc +{ U32 frame_size; U32 pad_size; U32 pad_off; @@ -1438,25 +1147,32 @@ typedef struct CV_SymFrameproc{ U32 eh_off; CV_SectionIndex eh_sec; CV_FrameprocFlags flags; -} CV_SymFrameproc; +}; -// (SymKind: ANNOTATION) -typedef struct CV_SymAnnotation{ +//- (SymKind: ANNOTATION) +typedef struct CV_SymAnnotation CV_SymAnnotation; +struct CV_SymAnnotation +{ U32 off; U16 seg; U16 count; // U8[] annotation (null terminated) -} CV_SymAnnotation; +}; -// (SymKind: OBJNAME) -typedef struct CV_SymObjname{ +//- (SymKind: OBJNAME) + +typedef struct CV_SymObjname CV_SymObjname; +struct CV_SymObjname +{ U32 sig; // U8[] name (null terminated) -} CV_SymObjname; +}; + +//- (SymKind: THUNK32) -// (SymKind: THUNK32) typedef U8 CV_ThunkOrdinal; -typedef enum{ +typedef enum CV_ThunkOrdinalEnum +{ CV_ThunkOrdinal_NoType, CV_ThunkOrdinal_Adjustor, CV_ThunkOrdinal_VCall, @@ -1464,9 +1180,12 @@ typedef enum{ CV_ThunkOrdinal_Load, CV_ThunkOrdinal_TrampIncremental, CV_ThunkOrdinal_TrampBranchIsland, -} CV_ThunkOrdinalEnum; +} +CV_ThunkOrdinalEnum; -typedef struct CV_SymThunk32{ +typedef struct CV_SymThunk32 CV_SymThunk32; +struct CV_SymThunk32 +{ U32 parent; U32 end; U32 next; @@ -1476,86 +1195,117 @@ typedef struct CV_SymThunk32{ CV_ThunkOrdinal ord; // U8[] name (null terminated) // U8[] variant (null terminated) -} CV_SymThunk32; +}; -// (SymKind: BLOCK32) -typedef struct CV_SymBlock32{ +//- (SymKind: BLOCK32) + +typedef struct CV_SymBlock32 CV_SymBlock32; +struct CV_SymBlock32 +{ U32 parent; U32 end; U32 len; U32 off; U16 sec; // U8[] name (null terminated) -} CV_SymBlock32; +}; -// (SymKind: LABEL32) -typedef struct CV_SymLabel32{ +//- (SymKind: LABEL32) + +typedef struct CV_SymLabel32 CV_SymLabel32; +struct CV_SymLabel32 +{ U32 off; U16 sec; CV_ProcFlags flags; // U8[] name (null terminated) -} CV_SymLabel32; +}; -// (SymKind: REGISTER) -typedef struct CV_SymRegister{ +//- (SymKind: REGISTER) + +typedef struct CV_SymRegister CV_SymRegister; +struct CV_SymRegister +{ CV_TypeId itype; U16 reg; // U8[] name (null terminated) -} CV_SymRegister; +}; -// (SymKind: CONSTANT) -typedef struct CV_SymConstant{ +//- (SymKind: CONSTANT) + +typedef struct CV_SymConstant CV_SymConstant; +struct CV_SymConstant +{ CV_TypeId itype; // CV_Numeric num // U8[] name (null terminated) -} CV_SymConstant; +}; -// (SymKind: UDT) -typedef struct CV_SymUDT{ +//- (SymKind: UDT) + +typedef struct CV_SymUDT CV_SymUDT; +struct CV_SymUDT +{ CV_TypeId itype; // U8[] name (null terminated) -} CV_SymUDT; +}; -// (SymKind: MANYREG) -typedef struct CV_SymManyreg{ +//- (SymKind: MANYREG) + +typedef struct CV_SymManyreg CV_SymManyreg; +struct CV_SymManyreg +{ CV_TypeId itype; U8 count; // U8[count] regs; -} CV_SymManyreg; +}; -// (SymKind: BPREL32) -typedef struct CV_SymBPRel32{ +//- (SymKind: BPREL32) + +typedef struct CV_SymBPRel32 CV_SymBPRel32; +struct CV_SymBPRel32 +{ U32 off; CV_TypeId itype; // U8[] name (null terminated) -} CV_SymBPRel32; +}; -// (SymKind: LDATA32, GDATA32) -typedef struct CV_SymData32{ +//- (SymKind: LDATA32, GDATA32) + +typedef struct CV_SymData32 CV_SymData32; +struct CV_SymData32 +{ CV_TypeId itype; U32 off; CV_SectionIndex sec; // U8[] name (null terminated) -} CV_SymData32; - -// (SymKind: PUB32) -typedef U32 CV_PubFlags; -enum{ - CV_PubFlag_Code = (1 << 0), - CV_PubFlag_Function = (1 << 1), - CV_PubFlag_ManagedCode = (1 << 2), - CV_PubFlag_MSIL = (1 << 3), }; -typedef struct CV_SymPub32{ +//- (SymKind: PUB32) + +typedef U32 CV_PubFlags; +enum +{ + CV_PubFlag_Code = (1 << 0), + CV_PubFlag_Function = (1 << 1), + CV_PubFlag_ManagedCode = (1 << 2), + CV_PubFlag_MSIL = (1 << 3), +}; + +typedef struct CV_SymPub32 CV_SymPub32; +struct CV_SymPub32 +{ CV_PubFlags flags; U32 off; CV_SectionIndex sec; // U8[] name (null terminated) -} CV_SymPub32; +}; -// (SymKind: LPROC32, GPROC32) -typedef struct CV_SymProc32{ +//- (SymKind: LPROC32, GPROC32) + +typedef struct CV_SymProc32 CV_SymProc32; +struct CV_SymProc32 +{ U32 parent; U32 end; U32 next; @@ -1567,25 +1317,32 @@ typedef struct CV_SymProc32{ U16 sec; CV_ProcFlags flags; // U8[] name (null terminated) -} CV_SymProc32; +}; -// (SymKind: REGREL32) -typedef struct CV_SymRegrel32{ +//- (SymKind: REGREL32) + +typedef struct CV_SymRegrel32 CV_SymRegrel32; +struct CV_SymRegrel32 +{ U32 reg_off; CV_TypeId itype; CV_Reg reg; // U8[] name (null terminated) -} CV_SymRegrel32; +}; -// (SymKind: LTHREAD32, GTHREAD32) -typedef struct CV_SymThread32{ +//- (SymKind: LTHREAD32, GTHREAD32) + +typedef struct CV_SymThread32 CV_SymThread32; +struct CV_SymThread32 +{ CV_TypeId itype; U32 tls_off; U16 tls_seg; // U8[] name (null terminated) -} CV_SymThread32; +}; + +//- (SymKind: COMPILE2) -// (SymKind: COMPILE2) typedef U32 CV_Compile2Flags; #define CV_Compile2Flags_ExtractLanguage(f) (((f) )&0xFF) #define CV_Compile2Flags_ExtractEditAndContinue(f) (((f)>> 8)&0x01) @@ -1598,7 +1355,9 @@ typedef U32 CV_Compile2Flags; #define CV_Compile2Flags_ExtractCVTCIL(f) (((f)>>15)&0x01) #define CV_Compile2Flags_ExtractMSILModule(f) (((f)>>16)&0x01) -typedef struct CV_SymCompile2{ +typedef struct CV_SymCompile2 CV_SymCompile2; +struct CV_SymCompile2 +{ CV_Compile2Flags flags; CV_Arch machine; U16 ver_fe_major; @@ -1608,58 +1367,80 @@ typedef struct CV_SymCompile2{ U16 ver_minor; U16 ver_build; // U8[] ver_str (null terminated) -} CV_SymCompile2; +}; -// (SymKind: MANYREG2) -typedef struct CV_SymManyreg2{ +//- (SymKind: MANYREG2) + +typedef struct CV_SymManyreg2 CV_SymManyreg2; +struct CV_SymManyreg2 +{ CV_TypeId itype; U16 count; // U16[count] regs; -} CV_SymManyreg2; +}; -// (SymKind: LOCALSLOT) -typedef struct CV_SymSlot{ +//- (SymKind: LOCALSLOT) + +typedef struct CV_SymSlot CV_SymSlot; +struct CV_SymSlot +{ U32 slot_index; CV_TypeId itype; // U8[] name (null terminated) -} CV_SymSlot; +}; -// (SymKind: MANFRAMEREL, ATTR_FRAMEREL) -typedef struct CV_SymAttrFrameRel{ +//- (SymKind: MANFRAMEREL, ATTR_FRAMEREL) + +typedef struct CV_SymAttrFrameRel CV_SymAttrFrameRel; +struct CV_SymAttrFrameRel +{ U32 off; CV_TypeId itype; CV_LocalVarAttr attr; // U8[] name (null terminated) -} CV_SymAttrFrameRel; +}; -// (SymKind: MANREGISTER, ATTR_REGISTER) -typedef struct CV_SymAttrReg{ +//- (SymKind: MANREGISTER, ATTR_REGISTER) + +typedef struct CV_SymAttrReg CV_SymAttrReg; +struct CV_SymAttrReg +{ CV_TypeId itype; CV_LocalVarAttr attr; U16 reg; // U8[] name (null terminated) -} CV_SymAttrReg; +}; -// (SymKind: MANMANYREG, ATTR_MANYREG) -typedef struct CV_SymAttrManyReg{ +//- (SymKind: MANMANYREG, ATTR_MANYREG) + + +typedef struct CV_SymAttrManyReg CV_SymAttrManyReg; +struct CV_SymAttrManyReg +{ CV_TypeId itype; CV_LocalVarAttr attr; U8 count; // U8[count] regs // U8[] name (null terminated) -} CV_SymAttrManyReg; +}; -// (SymKind: MANREGREL, ATTR_REGREL) -typedef struct CV_SymAttrRegRel{ +//- (SymKind: MANREGREL, ATTR_REGREL) + +typedef struct CV_SymAttrRegRel CV_SymAttrRegRel; +struct CV_SymAttrRegRel +{ U32 off; CV_TypeId itype; U16 reg; CV_LocalVarAttr attr; // U8[] name (null terminated) -} CV_SymAttrRegRel; +}; -// (SymKind: UNAMESPACE) -typedef struct CV_SymUNamespace{ +//- (SymKind: UNAMESPACE) + +typedef struct CV_SymUNamespace CV_SymUNamespace; +struct CV_SymUNamespace +{ // *** "dummy" is the first character of name - it should not be skipped! // *** It is placed here so the C compiler will accept this struct. // *** The actual fixed size part of this record has a size of zero. @@ -1667,40 +1448,52 @@ typedef struct CV_SymUNamespace{ U8 dummy; // U8[] name (null terminated) -} CV_SymUNamespace; +}; -// (SymKind: PROCREF, DATAREF, LPROCREF) -typedef struct CV_SymRef2{ +//- (SymKind: PROCREF, DATAREF, LPROCREF) + +typedef struct CV_SymRef2 CV_SymRef2; +struct CV_SymRef2 +{ U32 suc_name; U32 sym_off; CV_ModIndex imod; // U8[] name (null terminated) -} CV_SymRef2; +}; + +//- (SymKind: TRAMPOLINE) -// (SymKind: TRAMPOLINE) typedef U16 CV_TrampolineKind; -typedef enum{ +typedef enum CV_TrampolineKindEnum +{ CV_TrampolineKind_Incremental, CV_TrampolineKind_BranchIsland, -} CV_TrampolineKindEnum; +} +CV_TrampolineKindEnum; -typedef struct CV_SymTrampoline{ +typedef struct CV_SymTrampoline CV_SymTrampoline; +struct CV_SymTrampoline +{ CV_TrampolineKind kind; U16 thunk_size; U32 thunk_sec_off; U32 target_sec_off; CV_SectionIndex thunk_sec; CV_SectionIndex target_sec; -} CV_SymTrampoline; +}; + +//- (SymKind: SEPCODE) -// (SymKind: SEPCODE) typedef U32 CV_SepcodeFlags; -enum{ +enum +{ CV_SepcodeFlag_IsLexicalScope = (1 << 0), CV_SepcodeFlag_ReturnsToParent = (1 << 1), }; -typedef struct CV_SymSepcode{ +typedef struct CV_SymSepcode CV_SymSepcode; +struct CV_SymSepcode +{ U32 parent; U32 end; U32 len; @@ -1709,10 +1502,13 @@ typedef struct CV_SymSepcode{ U32 sec_parent_off; U16 sec; U16 sec_parent; -} CV_SymSepcode; +}; -// (SymKind: SECTION) -typedef struct CV_SymSection{ +//- (SymKind: SECTION) + +typedef struct CV_SymSection CV_SymSection; +struct CV_SymSection +{ U16 sec_index; U8 align; U8 pad; @@ -1720,20 +1516,25 @@ typedef struct CV_SymSection{ U32 size; U32 characteristics; // U8[] name (null terminated) -} CV_SymSection; +}; -// (SymKind: COFFGROUP) -typedef struct CV_SymCoffGroup{ +//- (SymKind: COFFGROUP) + +typedef struct CV_SymCoffGroup CV_SymCoffGroup; +struct CV_SymCoffGroup +{ U32 size; U32 characteristics; U32 off; U16 sec; // U8[] name (null terminated) -} CV_SymCoffGroup; +}; + +//- (SymKind: EXPORT) -// (SymKind: EXPORT) typedef U16 CV_ExportFlags; -enum{ +enum +{ CV_ExportFlag_Constant = (1 << 0), CV_ExportFlag_Data = (1 << 1), CV_ExportFlag_Private = (1 << 2), @@ -1742,52 +1543,68 @@ enum{ CV_ExportFlag_Forwarder = (1 << 5), }; -typedef struct CV_SymExport{ +typedef struct CV_SymExport CV_SymExport; +struct CV_SymExport +{ U16 ordinal; CV_ExportFlags flags; // U8[] name (null terminated) -} CV_SymExport; +}; -// (SymKind: CALLSITEINFO) -typedef struct CV_SymCallSiteInfo{ +//- (SymKind: CALLSITEINFO) + +typedef struct CV_SymCallSiteInfo CV_SymCallSiteInfo; +struct CV_SymCallSiteInfo +{ U32 off; U16 sec; U16 pad; CV_TypeId itype; -} CV_SymCallSiteInfo; +}; + +//- (SymKind: FRAMECOOKIE) -// (SymKind: FRAMECOOKIE) typedef U8 CV_FrameCookieKind; -typedef enum{ +typedef enum CV_FrameCookieKindEnum +{ CV_FrameCookieKind_Copy, CV_FrameCookieKind_XorSP, CV_FrameCookieKind_XorBP, CV_FrameCookieKind_XorR13, -} CV_FrameCookieKindEnum; +} +CV_FrameCookieKindEnum; -typedef struct CV_SymFrameCookie{ +typedef struct CV_SymFrameCookie CV_SymFrameCookie; +struct CV_SymFrameCookie +{ U32 off; CV_Reg reg; CV_FrameCookieKind kind; U8 flags; -} CV_SymFrameCookie; +}; + +//- (SymKind: DISCARDED) -// (SymKind: DISCARDED) typedef U8 CV_DiscardedKind; -typedef enum{ +typedef enum CV_DiscardedKindEnum +{ CV_DiscardedKind_Unknown, CV_DiscardedKind_NotSelected, CV_DiscardedKind_NotReferenced, -} CV_DiscardedKindEnum; +} +CV_DiscardedKindEnum; -typedef struct CV_SymDiscarded{ +typedef struct CV_SymDiscarded CV_SymDiscarded; +struct CV_SymDiscarded +{ CV_DiscardedKind kind; U32 file_id; U32 file_ln; // U8[] data (rest of data) -} CV_SymDiscarded; +}; + +//- (SymKind: COMPILE3) -// (SymKind: COMPILE3) typedef U32 CV_Compile3Flags; #define CV_Compile3Flags_ExtractLanguage(f) (((f) )&0xFF) #define CV_Compile3Flags_ExtractEditAndContinue(f) (((f)>> 9)&0x01) @@ -1803,7 +1620,9 @@ typedef U32 CV_Compile3Flags; #define CV_Compile3Flags_ExtractPGO(f) (((f)>>19)&0x01) #define CV_Compile3Flags_ExtractEXP(f) (((f)>>20)&0x01) -typedef struct CV_SymCompile3{ +typedef struct CV_SymCompile3 CV_SymCompile3; +struct CV_SymCompile3 +{ CV_Compile3Flags flags; CV_Arch machine; U16 ver_fe_major; @@ -1815,117 +1634,158 @@ typedef struct CV_SymCompile3{ U16 ver_build; U16 ver_qfe; // U8[] ver_str (null terminated) -} CV_SymCompile3; +}; -// (SymKind: ENVBLOCK) -typedef struct CV_SymEnvBlock{ +//- (SymKind: ENVBLOCK) + +typedef struct CV_SymEnvBlock CV_SymEnvBlock; +struct CV_SymEnvBlock +{ U8 flags; // U8[][] rgsz (sequence null terminated strings) -} CV_SymEnvBlock; +}; -// (SymKind: LOCAL) -typedef struct CV_SymLocal{ +//- (SymKind: LOCAL) + +typedef struct CV_SymLocal CV_SymLocal; +struct CV_SymLocal +{ CV_TypeId itype; CV_LocalFlags flags; // U8[] name (null terminated) -} CV_SymLocal; +}; //- DEFRANGE -typedef struct CV_LvarAddrRange{ +typedef struct CV_LvarAddrRange CV_LvarAddrRange; +struct CV_LvarAddrRange +{ U32 off; U16 sec; U16 len; -} CV_LvarAddrRange; +}; -typedef struct CV_LvarAddrGap{ +typedef struct CV_LvarAddrGap CV_LvarAddrGap; +struct CV_LvarAddrGap +{ U16 off; U16 len; -} CV_LvarAddrGap; +}; typedef U16 CV_RangeAttribs; -enum{ +enum +{ CV_RangeAttrib_Maybe = (1 << 0), }; -// (SymKind: DEFRANGE_SUBFIELD) -typedef struct CV_SymDefrangeSubfield{ +//- (SymKind: DEFRANGE_SUBFIELD) + +typedef struct CV_SymDefrangeSubfield CV_SymDefrangeSubfield; +struct CV_SymDefrangeSubfield +{ U32 program; U32 off_in_parent; CV_LvarAddrRange range; // CV_LvarAddrGap[] gaps (rest of data) -} CV_SymDefrangeSubfield; +}; -// (SymKind: DEFRANGE_REGISTER) -typedef struct CV_SymDefrangeRegister{ +//- (SymKind: DEFRANGE_REGISTER) + +typedef struct CV_SymDefrangeRegister CV_SymDefrangeRegister; +struct CV_SymDefrangeRegister +{ CV_Reg reg; CV_RangeAttribs attribs; CV_LvarAddrRange range; // CV_LvarAddrGap[] gaps (rest of data) -} CV_SymDefrangeRegister; +}; -// (SymKind: DEFRANGE_FRAMEPOINTER_REL) -typedef struct CV_SymDefrangeFramepointerRel{ +//- (SymKind: DEFRANGE_FRAMEPOINTER_REL) + +typedef struct CV_SymDefrangeFramepointerRel CV_SymDefrangeFramepointerRel; +struct CV_SymDefrangeFramepointerRel +{ S32 off; CV_LvarAddrRange range; // CV_LvarAddrGap[] gaps (rest of data) -} CV_SymDefrangeFramepointerRel; +}; -// (SymKind: DEFRANGE_SUBFIELD_REGISTER) -typedef struct CV_SymDefrangeSubfieldRegister{ +//- (SymKind: DEFRANGE_SUBFIELD_REGISTER) + +typedef struct CV_SymDefrangeSubfieldRegister CV_SymDefrangeSubfieldRegister; +struct CV_SymDefrangeSubfieldRegister +{ CV_Reg reg; CV_RangeAttribs attribs; U32 field_offset; CV_LvarAddrRange range; // CV_LvarAddrGap[] gaps (rest of data) -} CV_SymDefrangeSubfieldRegister; +}; -// (SymKind: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE) -typedef struct CV_SymDefrangeFramepointerRelFullScope{ +//- (SymKind: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE) + +typedef struct CV_SymDefrangeFramepointerRelFullScope CV_SymDefrangeFramepointerRelFullScope; +struct CV_SymDefrangeFramepointerRelFullScope +{ S32 off; -} CV_SymDefrangeFramepointerRelFullScope; +}; + +//- (SymKind: DEFRANGE_REGISTER_REL) -// (SymKind: DEFRANGE_REGISTER_REL) typedef U16 CV_DefrangeRegisterRelFlags; -enum{ +enum +{ CV_DefrangeRegisterRelFlag_SpilledOutUDTMember = (1 << 0), }; #define CV_DefrangeRegisterRelFlag_ExtractOffsetParent(f) (((f)>>4)&0xFFF) -typedef struct CV_SymDefrangeRegisterRel{ +typedef struct CV_SymDefrangeRegisterRel CV_SymDefrangeRegisterRel; +struct CV_SymDefrangeRegisterRel +{ CV_Reg reg; CV_DefrangeRegisterRelFlags flags; S32 reg_off; CV_LvarAddrRange range; // CV_LvarAddGap[] gaps (rest of data) -} CV_SymDefrangeRegisterRel; +}; -// (SymKind: BUILDINFO) -typedef struct CV_SymBuildInfo{ +//- (SymKind: BUILDINFO) + +typedef struct CV_SymBuildInfo CV_SymBuildInfo; +struct CV_SymBuildInfo +{ CV_ItemId id; -} CV_SymBuildInfo; +}; -// (SymKind: INLINESITE) -typedef struct CV_SymInlineSite{ +//- (SymKind: INLINESITE) + +typedef struct CV_SymInlineSite CV_SymInlineSite; +struct CV_SymInlineSite +{ U32 parent; U32 end; CV_ItemId inlinee; // CV_BinaryAnnotation annotations (rest of data) -} CV_SymInlineSite; +}; -// (SymKind: INLINESITE_END) (empty) +//- (SymKind: INLINESITE_END) (empty) -// (SymKind: FILESTATIC) -typedef struct CV_SymFileStatic{ +//- (SymKind: FILESTATIC) + +typedef struct CV_SymFileStatic CV_SymFileStatic; +struct CV_SymFileStatic +{ CV_TypeId itype; U32 mod_offset; CV_LocalFlags flags; // U8[] name (null terminated) -} CV_SymFileStatic; +}; + +//- (SymKind: ARMSWITCHTABLE) -// (SymKind: ARMSWITCHTABLE) typedef U16 CV_ArmSwitchKind; -typedef enum{ +typedef enum +{ CV_ArmSwitchKind_INT1, CV_ArmSwitchKind_UINT1, CV_ArmSwitchKind_INT2, @@ -1939,7 +1799,9 @@ typedef enum{ CV_ArmSwitchKind_INT2SSHL1, } CV_ArmSwitchKindEnum; -typedef struct CV_SymArmSwitchTable{ +typedef struct CV_SymArmSwitchTable CV_SymArmSwitchTable; +struct CV_SymArmSwitchTable +{ U32 off_base; U16 sec_base; CV_ArmSwitchKind kind; @@ -1948,43 +1810,57 @@ typedef struct CV_SymArmSwitchTable{ U16 sec_branch; U16 sec_table; U32 entry_count; -} CV_SymArmSwitchTable; +}; -// (SymKind: CALLEES, CALLERS) -typedef struct CV_SymFunctionList{ +//- (SymKind: CALLEES, CALLERS) + +typedef struct CV_SymFunctionList CV_SymFunctionList; +struct CV_SymFunctionList +{ U32 count; // CV_TypeId[count] funcs // U32[clamp(count, rest_of_data/4)] invocations -} CV_SymFunctionList; +}; -// (SymKind: POGODATA) -typedef struct CV_SymPogoInfo{ +//- (SymKind: POGODATA) + +typedef struct CV_SymPogoInfo CV_SymPogoInfo; +struct CV_SymPogoInfo +{ U32 invocations; U64 dynamic_inst_count; U32 static_inst_count; U32 post_inline_static_inst_count; -} CV_SymPogoInfo; +}; -// (SymKind: INLINESITE2) -typedef struct CV_SymInlineSite2{ +//- (SymKind: INLINESITE2) + +typedef struct CV_SymInlineSite2 CV_SymInlineSite2; +struct CV_SymInlineSite2 +{ U32 parent_off; U32 end_off; CV_ItemId inlinee; U32 invocations; // CV_BinaryAnnotation annotations (rest of data) -} CV_SymInlineSite2; +}; -// (SymKind: HEAPALLOCSITE) -typedef struct CV_SymHeapAllocSite{ +//- (SymKind: HEAPALLOCSITE) + +typedef struct CV_SymHeapAllocSite CV_SymHeapAllocSite; +struct CV_SymHeapAllocSite +{ U32 off; U16 sec; U16 call_inst_len; CV_TypeId itype; -} CV_SymHeapAllocSite; +}; + +//- (SymKind: MOD_TYPEREF) -// (SymKind: MOD_TYPEREF) typedef U32 CV_ModTypeRefFlags; -enum{ +enum +{ CV_ModTypeRefFlag_None = (1 << 0), CV_ModTypeRefFlag_RefTMPCT = (1 << 1), CV_ModTypeRefFlag_OwnTMPCT = (1 << 2), @@ -1993,16 +1869,20 @@ enum{ CV_ModTypeRefFlag_RefTM = (1 << 5), }; -typedef struct CV_SymModTypeRef{ +typedef struct CV_SymModTypeRef CV_SymModTypeRef; +struct CV_SymModTypeRef +{ CV_ModTypeRefFlags flags; // contain stream number or module index depending on flags (undocumented) U32 word0; U32 word1; -} CV_SymModTypeRef; +}; + +//- (SymKind: REF_MINIPDB) -// (SymKind: REF_MINIPDB) typedef U16 CV_RefMiniPdbFlags; -enum{ +enum +{ CV_RefMiniPdbFlag_Local = (1 << 0), CV_RefMiniPdbFlag_Data = (1 << 1), CV_RefMiniPdbFlag_UDT = (1 << 2), @@ -2010,16 +1890,20 @@ enum{ CV_RefMiniPdbFlag_Const = (1 << 4), }; -typedef struct CV_SymRefMiniPdb{ +typedef struct CV_SymRefMiniPdb CV_SymRefMiniPdb; +struct CV_SymRefMiniPdb +{ U32 data; CV_ModIndex imod; CV_RefMiniPdbFlags flags; // U8[] name (null terminated) -} CV_SymRefMiniPdb; +}; + +//- (SymKind: FASTLINK) -// (SymKind: FASTLINK) typedef U16 CV_FastLinkFlags; -enum{ +enum +{ CV_FastLinkFlag_IsGlobalData = (1 << 0), CV_FastLinkFlag_IsData = (1 << 1), CV_FastLinkFlag_IsUDT = (1 << 2), @@ -2029,159 +1913,27 @@ enum{ CV_FastLinkFlag_IsNamespace = (1 << 6), }; -typedef struct CV_SymFastLink{ +typedef struct CV_SymFastLink CV_SymFastLink; +struct CV_SymFastLink +{ CV_TypeId itype; CV_FastLinkFlags flags; // U8[] name (null terminated) -} CV_SymFastLink; +}; -// (SymKind: INLINEES) -typedef struct CV_SymInlinees{ +//- (SymKind: INLINEES) + +typedef struct CV_SymInlinees CV_SymInlinees; +struct CV_SymInlinees +{ U32 count; // U32[count] desc; -} CV_SymInlinees; - +}; //////////////////////////////// //~ CodeView Format "Leaf" Types // (type info) -#define CV_LeafKindXList(X) \ -X(MODIFIER_16t, 0x0001)\ -X(POINTER_16t, 0x0002)\ -X(ARRAY_16t, 0x0003)\ -X(CLASS_16t, 0x0004)\ -X(STRUCTURE_16t, 0x0005)\ -X(UNION_16t, 0x0006)\ -X(ENUM_16t, 0x0007)\ -X(PROCEDURE_16t, 0x0008)\ -X(MFUNCTION_16t, 0x0009)\ -X(VTSHAPE, 0x000a)\ -X(COBOL0_16t, 0x000b)\ -X(COBOL1, 0x000c)\ -X(BARRAY_16t, 0x000d)\ -X(LABEL, 0x000e)\ -X(NULL, 0x000f)\ -X(NOTTRAN, 0x0010)\ -X(DIMARRAY_16t, 0x0011)\ -X(VFTPATH_16t, 0x0012)\ -X(PRECOMP_16t, 0x0013)\ -X(ENDPRECOMP, 0x0014)\ -X(OEM_16t, 0x0015)\ -X(TYPESERVER_ST, 0x0016)\ -X(SKIP_16t, 0x0200)\ -X(ARGLIST_16t, 0x0201)\ -X(DEFARG_16t, 0x0202)\ -X(LIST, 0x0203)\ -X(FIELDLIST_16t, 0x0204)\ -X(DERIVED_16t, 0x0205)\ -X(BITFIELD_16t, 0x0206)\ -X(METHODLIST_16t, 0x0207)\ -X(DIMCONU_16t, 0x0208)\ -X(DIMCONLU_16t, 0x0209)\ -X(DIMVARU_16t, 0x020a)\ -X(DIMVARLU_16t, 0x020b)\ -X(REFSYM, 0x020c)\ -X(BCLASS_16t, 0x0400)\ -X(VBCLASS_16t, 0x0401)\ -X(IVBCLASS_16t, 0x0402)\ -X(ENUMERATE_ST, 0x0403)\ -X(FRIENDFCN_16t, 0x0404)\ -X(INDEX_16t, 0x0405)\ -X(MEMBER_16t, 0x0406)\ -X(STMEMBER_16t, 0x0407)\ -X(METHOD_16t, 0x0408)\ -X(NESTTYPE_16t, 0x0409)\ -X(VFUNCTAB_16t, 0x040a)\ -X(FRIENDCLS_16t, 0x040b)\ -X(ONEMETHOD_16t, 0x040c)\ -X(VFUNCOFF_16t, 0x040d)\ -X(TI16_MAX, 0x1000)\ -X(MODIFIER, 0x1001)\ -X(POINTER, 0x1002)\ -X(ARRAY_ST, 0x1003)\ -X(CLASS_ST, 0x1004)\ -X(STRUCTURE_ST, 0x1005)\ -X(UNION_ST, 0x1006)\ -X(ENUM_ST, 0x1007)\ -X(PROCEDURE, 0x1008)\ -X(MFUNCTION, 0x1009)\ -X(COBOL0, 0x100a)\ -X(BARRAY, 0x100b)\ -X(DIMARRAY_ST, 0x100c)\ -X(VFTPATH, 0x100d)\ -X(PRECOMP_ST, 0x100e)\ -X(OEM, 0x100f)\ -X(ALIAS_ST, 0x1010)\ -X(OEM2, 0x1011)\ -X(SKIP, 0x1200)\ -X(ARGLIST, 0x1201)\ -X(DEFARG_ST, 0x1202)\ -X(FIELDLIST, 0x1203)\ -X(DERIVED, 0x1204)\ -X(BITFIELD, 0x1205)\ -X(METHODLIST, 0x1206)\ -X(DIMCONU, 0x1207)\ -X(DIMCONLU, 0x1208)\ -X(DIMVARU, 0x1209)\ -X(DIMVARLU, 0x120a)\ -X(BCLASS, 0x1400)\ -X(VBCLASS, 0x1401)\ -X(IVBCLASS, 0x1402)\ -X(FRIENDFCN_ST, 0x1403)\ -X(INDEX, 0x1404)\ -X(MEMBER_ST, 0x1405)\ -X(STMEMBER_ST, 0x1406)\ -X(METHOD_ST, 0x1407)\ -X(NESTTYPE_ST, 0x1408)\ -X(VFUNCTAB, 0x1409)\ -X(FRIENDCLS, 0x140a)\ -X(ONEMETHOD_ST, 0x140b)\ -X(VFUNCOFF, 0x140c)\ -X(NESTTYPEEX_ST, 0x140d)\ -X(MEMBERMODIFY_ST, 0x140e)\ -X(MANAGED_ST, 0x140f)\ -X(ST_MAX, 0x1500)\ -X(TYPESERVER, 0x1501)\ -X(ENUMERATE, 0x1502)\ -X(ARRAY, 0x1503)\ -X(CLASS, 0x1504)\ -X(STRUCTURE, 0x1505)\ -X(UNION, 0x1506)\ -X(ENUM, 0x1507)\ -X(DIMARRAY, 0x1508)\ -X(PRECOMP, 0x1509)\ -X(ALIAS, 0x150a)\ -X(DEFARG, 0x150b)\ -X(FRIENDFCN, 0x150c)\ -X(MEMBER, 0x150d)\ -X(STMEMBER, 0x150e)\ -X(METHOD, 0x150f)\ -X(NESTTYPE, 0x1510)\ -X(ONEMETHOD, 0x1511)\ -X(NESTTYPEEX, 0x1512)\ -X(MEMBERMODIFY, 0x1513)\ -X(MANAGED, 0x1514)\ -X(TYPESERVER2, 0x1515)\ -X(STRIDED_ARRAY, 0x1516)\ -X(HLSL, 0x1517)\ -X(MODIFIER_EX, 0x1518)\ -X(INTERFACE, 0x1519)\ -X(BINTERFACE, 0x151a)\ -X(VECTOR, 0x151b)\ -X(MATRIX, 0x151c)\ -X(VFTABLE, 0x151d)\ -/* ONGOING REVERSE ENGINEERING */ \ -X(CLASS2, 0x1608)\ -X(STRUCT2, 0x1609) - -typedef U16 CV_LeafKind; -typedef enum{ -#define X(N,c) CV_LeafKind_##N = c, - CV_LeafKindXList(X) -#undef X -} CV_LeafKindEnum; - #define CV_LeafIDKindXList(X) \ X(FUNC_ID, 0x1601)\ X(MFUNC_ID, 0x1602)\ @@ -2192,11 +1944,13 @@ X(UDT_SRC_LINE, 0x1606)\ X(UDT_MOD_SRC_LINE, 0x1607) typedef U16 CV_LeafIDKind; -typedef enum{ +typedef enum CV_LeafIDKindEnum +{ #define X(N,c) CV_LeafIDKind_##N = c, CV_LeafIDKindXList(X) #undef X -} CV_LeafIDKindEnum; +} +CV_LeafIDKindEnum; #define CV_BasicTypeXList(X) \ X(NOTYPE, 0x00)\ @@ -2254,11 +2008,13 @@ X(CHAR8, 0x7c)\ X(PTR, 0xf0) typedef U8 CV_BasicType; -typedef enum{ +typedef enum CV_BasicTypeEnum +{ #define X(N,c) CV_BasicType_##N = c, CV_BasicTypeXList(X) #undef X -} CV_BasicTypeEnum; +} +CV_BasicTypeEnum; #define CV_TypeId_Variadic 0 @@ -2272,7 +2028,8 @@ X(16_32BIT, 0x5)\ X(64BIT, 0x6) typedef U8 CV_BasicPointerKind; -typedef enum{ +typedef enum +{ #define X(N,c) CV_BasicPointerKind_##N = c, CV_BasicPointerKindXList(X) #undef X @@ -2282,23 +2039,28 @@ typedef enum{ #define CV_BasicPointerKindFromTypeId(x) (((x)>>8)&0xFF) typedef U8 CV_HFAKind; -typedef enum{ +typedef enum CV_HFAKindEnum +{ CV_HFAKind_None, CV_HFAKind_Float, CV_HFAKind_Double, CV_HFAKind_Other -} CV_HFAKindEnum; +} +CV_HFAKindEnum; typedef U8 CV_MoComUDTKind; -typedef enum{ +typedef enum CV_MoComUDTKindEnum +{ CV_MoComUDTKind_None, CV_MoComUDTKind_Ref, CV_MoComUDTKind_Value, CV_MoComUDTKind_Interface -} CV_MoComUDTKindEnum; +} +CV_MoComUDTKindEnum; typedef U16 CV_TypeProps; -enum{ +enum +{ CV_TypeProp_Packed = (1 << 0), CV_TypeProp_HasConstructorsDestructors = (1 << 1), CV_TypeProp_OverloadedOperators = (1 << 2), @@ -2319,7 +2081,8 @@ enum{ #define CV_TypeProps_ExtractMOCOM(f) (((f)>>14)&0x3) typedef U8 CV_PointerKind; -typedef enum{ +typedef enum CV_PointerKindEnum +{ CV_PointerKind_Near, // 16 bit CV_PointerKind_Far, // 16:16 bit CV_PointerKind_Huge, // 16:16 bit @@ -2333,19 +2096,23 @@ typedef enum{ CV_PointerKind_Near32, // 32 bit CV_PointerKind_Far32, // 16:32 bit CV_PointerKind_64, // 64 bit -} CV_PointerKindEnum; +} +CV_PointerKindEnum; typedef U8 CV_PointerMode; -typedef enum{ +typedef enum CV_PointerModeEnum +{ CV_PointerMode_Ptr, CV_PointerMode_LRef, CV_PointerMode_PtrMem, CV_PointerMode_PtrMethod, CV_PointerMode_RRef, -} CV_PointerModeEnum; +} +CV_PointerModeEnum; typedef U16 CV_MemberPointerKind; -typedef enum{ +typedef enum CV_MemberPointerKindEnum +{ CV_MemberPointerKind_Undef, CV_MemberPointerKind_DataSingle, CV_MemberPointerKind_DataMultiple, @@ -2355,10 +2122,12 @@ typedef enum{ CV_MemberPointerKind_FuncMultiple, CV_MemberPointerKind_FuncVirtual, CV_MemberPointerKind_FuncGeneral, -} CV_MemberPointerKindEnum; +} +CV_MemberPointerKindEnum; typedef U32 CV_VirtualTableShape; -typedef enum{ +typedef enum CV_VirtualTableShapeEnum +{ CV_VirtualTableShape_Near, // 16 bit ptr CV_VirtualTableShape_Far, // 16:16 bit ptr CV_VirtualTableShape_Thin, // ??? @@ -2366,10 +2135,12 @@ typedef enum{ CV_VirtualTableShape_Meta, // far pointer to metaclass descriptor entry[-2] CV_VirtualTableShape_Near32, // 32 bit ptr CV_VirtualTableShape_Far32, // ??? -} CV_VirtualTableShapeEnum; +} +CV_VirtualTableShapeEnum; typedef U8 CV_MethodProp; -enum{ +enum +{ CV_MethodProp_Vanilla, CV_MethodProp_Virtual, CV_MethodProp_Static, @@ -2380,15 +2151,18 @@ enum{ }; typedef U8 CV_MemberAccess; -typedef enum{ +typedef enum CV_MemberAccessEnum +{ CV_MemberAccess_Null, CV_MemberAccess_Private, CV_MemberAccess_Protected, CV_MemberAccess_Public -} CV_MemberAccessEnum; +} +CV_MemberAccessEnum; typedef U16 CV_FieldAttribs; -enum{ +enum +{ // Access: 0,1 // MethodProp: [2:4] CV_FieldAttrib_Pseudo = (1 << 5), @@ -2401,20 +2175,24 @@ enum{ #define CV_FieldAttribs_ExtractMethodProp(f) (((f)>>2)&0x7) typedef U16 CV_LabelKind; -typedef enum{ +typedef enum CV_LabelKindEnum +{ CV_LabelKind_Near = 0, CV_LabelKind_Far = 4, -} CV_LabelKindEnum; +} +CV_LabelKindEnum; typedef U8 CV_FunctionAttribs; -enum{ +enum +{ CV_FunctionAttrib_CxxReturnUDT = (1 << 0), CV_FunctionAttrib_Constructor = (1 << 1), CV_FunctionAttrib_ConstructorVBase = (1 << 2), }; typedef U8 CV_CallKind; -typedef enum{ +typedef enum CV_CallKindEnum +{ CV_CallKind_NearC, CV_CallKind_FarC, CV_CallKind_NearPascal, @@ -2440,62 +2218,87 @@ typedef enum{ CV_CallKind_Clr, CV_CallKind_Inline, CV_CallKind_NearVector, -} CV_CallKindEnum; +} +CV_CallKindEnum; -// (LeafKind: PRECOMP) -typedef struct CV_LeafPreComp{ +//- (LeafKind: PRECOMP) + +typedef struct CV_LeafPreComp CV_LeafPreComp; +struct CV_LeafPreComp +{ U32 start_index; U32 count; U32 signature; // U8[] name (null terminated) -} CV_LeafPreComp; +}; -// (LeafKind: TYPESERVER) -typedef struct CV_LeafTypeServer{ +//- (LeafKind: TYPESERVER) + +typedef struct CV_LeafTypeServer CV_LeafTypeServer; +struct CV_LeafTypeServer +{ U32 sig; U32 age; // U8[] name (null terminated) -} CV_LeafTypeServer; +}; -// (LeafKind: TYPESERVER2) -typedef struct CV_LeafTypeServer2{ +//- (LeafKind: TYPESERVER2) + +typedef struct CV_LeafTypeServer2 CV_LeafTypeServer2; +struct CV_LeafTypeServer2 +{ COFF_Guid sig70; U32 age; // U8[] name (null terminated) -} CV_LeafTypeServer2; +}; -// (LeafKind: SKIP) -typedef struct CV_LeafSkip{ +//- (LeafKind: SKIP) + +typedef struct CV_LeafSkip CV_LeafSkip; +struct CV_LeafSkip +{ CV_TypeId itype; -} CV_LeafSkip; +}; -// (LeafKind: VTSHAPE) -typedef struct CV_LeafVTShape{ +//- (LeafKind: VTSHAPE) + +typedef struct CV_LeafVTShape CV_LeafVTShape; +struct CV_LeafVTShape +{ U16 count; // U4[count] shapes (CV_VirtualTableShape) -} CV_LeafVTShape; +}; -// (LeafKind: LABEL) -typedef struct CV_LeafLabel{ +//- (LeafKind: LABEL) + +typedef struct CV_LeafLabel CV_LeafLabel; +struct CV_LeafLabel +{ CV_LabelKind kind; -} CV_LeafLabel; +}; + +//- (LeafKind: MODIFIER) -// (LeafKind: MODIFIER) typedef U16 CV_ModifierFlags; -enum{ +enum +{ CV_ModifierFlag_Const = (1 << 0), CV_ModifierFlag_Volatile = (1 << 1), CV_ModifierFlag_Unaligned = (1 << 2), }; -typedef struct CV_LeafModifier{ +typedef struct CV_LeafModifier CV_LeafModifier; +struct CV_LeafModifier +{ CV_TypeId itype; CV_ModifierFlags flags; -} CV_LeafModifier; +}; + +//- (LeafKind: POINTER) -// (LeafKind: POINTER) typedef U32 CV_PointerAttribs; -enum{ +enum +{ // Kind: [0:4] // Mode: [5:7] CV_PointerAttrib_IsFlat = (1 << 8), @@ -2513,22 +2316,30 @@ enum{ #define CV_PointerAttribs_ExtractMode(a) (((a)>>5)&0x7) #define CV_PointerAttribs_ExtractSize(a) (((a)>>13)&0x3F) -typedef struct CV_LeafPointer{ +typedef struct CV_LeafPointer CV_LeafPointer; +struct CV_LeafPointer +{ CV_TypeId itype; CV_PointerAttribs attribs; -} CV_LeafPointer; +}; -// (LeafKind: PROCEDURE) -typedef struct CV_LeafProcedure{ +//- (LeafKind: PROCEDURE) + +typedef struct CV_LeafProcedure CV_LeafProcedure; +struct CV_LeafProcedure +{ CV_TypeId ret_itype; CV_CallKind call_kind; CV_FunctionAttribs attribs; U16 arg_count; CV_TypeId arg_itype; -} CV_LeafProcedure; +}; -// (LeafKind: MFUNCTION) -typedef struct CV_LeafMFunction{ +//- (LeafKind: MFUNCTION) + +typedef struct CV_LeafMFunction CV_LeafMFunction; +struct CV_LeafMFunction +{ CV_TypeId ret_itype; CV_TypeId class_itype; CV_TypeId this_itype; @@ -2537,45 +2348,63 @@ typedef struct CV_LeafMFunction{ U16 arg_count; CV_TypeId arg_itype; S32 this_adjust; -} CV_LeafMFunction; +}; -// (LeafKind: ARGLIST) -typedef struct CV_LeafArgList{ +//- (LeafKind: ARGLIST) + +typedef struct CV_LeafArgList CV_LeafArgList; +struct CV_LeafArgList +{ U32 count; // CV_TypeId[count] itypes; -} CV_LeafArgList; +}; -// (LeafKind: BITFIELD) -typedef struct CV_LeafBitField{ +//- (LeafKind: BITFIELD) + +typedef struct CV_LeafBitField CV_LeafBitField; +struct CV_LeafBitField +{ CV_TypeId itype; U8 len; U8 pos; -} CV_LeafBitField; +}; + +//- (LeafKind: METHODLIST) -// (LeafKind: METHODLIST) // ("jagged" array of these vvvvvvvv) -typedef struct CV_LeafMethodListMember{ +typedef struct CV_LeafMethodListMember CV_LeafMethodListMember; +struct CV_LeafMethodListMember +{ CV_FieldAttribs attribs; U16 pad; CV_TypeId itype; // U32 vbaseoff (when Intro or PureIntro) -} CV_LeafMethodListMember; +}; -// (LeafKind: INDEX) -typedef struct CV_LeafIndex{ +//- (LeafKind: INDEX) + +typedef struct CV_LeafIndex CV_LeafIndex; +struct CV_LeafIndex +{ U16 pad; CV_TypeId itype; -} CV_LeafIndex; +}; -// (LeafKind: ARRAY) -typedef struct CV_LeafArray{ +//- (LeafKind: ARRAY) + +typedef struct CV_LeafArray CV_LeafArray; +struct CV_LeafArray +{ CV_TypeId entry_itype; CV_TypeId index_itype; // CV_Numeric count -} CV_LeafArray; +}; -// (LeafKind: CLASS, STRUCTURE, INTERFACE) -typedef struct CV_LeafStruct{ +//- (LeafKind: CLASS, STRUCTURE, INTERFACE) + +typedef struct CV_LeafStruct CV_LeafStruct; +struct CV_LeafStruct +{ U16 count; CV_TypeProps props; CV_TypeId field_itype; @@ -2584,131 +2413,182 @@ typedef struct CV_LeafStruct{ // CV_Numeric size // U8[] name (null terminated) // U8[] unique_name (null terminated) -} CV_LeafStruct; +}; -// (LeafKind: UNION) -typedef struct CV_LeafUnion{ +//- (LeafKind: UNION) + +typedef struct CV_LeafUnion CV_LeafUnion; +struct CV_LeafUnion +{ U16 count; CV_TypeProps props; CV_TypeId field_itype; // CV_Numeric size // U8[] name (null terminated) // U8[] unique_name (null terminated) -} CV_LeafUnion; +}; -// (LeafKind: ENUM) -typedef struct CV_LeafEnum{ +//- (LeafKind: ENUM) + +typedef struct CV_LeafEnum CV_LeafEnum; +struct CV_LeafEnum +{ U16 count; CV_TypeProps props; CV_TypeId base_itype; CV_TypeId field_itype; // U8[] name (null terminated) // U8[] unique_name (null terminated) -} CV_LeafEnum; +}; -// (LeafKind: ALIAS) -typedef struct CV_LeafAlias{ +//- (LeafKind: ALIAS) + +typedef struct CV_LeafAlias CV_LeafAlias; +struct CV_LeafAlias +{ CV_TypeId itype; // U8[] name (null terminated) -} CV_LeafAlias; +}; -// (LeafKind: MEMBER) -typedef struct CV_LeafMember{ +//- (LeafKind: MEMBER) + +typedef struct CV_LeafMember CV_LeafMember; +struct CV_LeafMember +{ CV_FieldAttribs attribs; CV_TypeId itype; // CV_Numeric offset // U8[] name (null terminated) -} CV_LeafMember; +}; -// (LeafKind: STMEMBER) -typedef struct CV_LeafStMember{ +//- (LeafKind: STMEMBER) + +typedef struct CV_LeafStMember CV_LeafStMember; +struct CV_LeafStMember +{ CV_FieldAttribs attribs; CV_TypeId itype; // U8[] name (null terminated) -} CV_LeafStMember; +}; -// (LeafKind: METHOD) -typedef struct CV_LeafMethod{ +//- (LeafKind: METHOD) + +typedef struct CV_LeafMethod CV_LeafMethod; +struct CV_LeafMethod +{ U16 count; CV_TypeId list_itype; // U8[] name (null terminated) -} CV_LeafMethod; +}; -// (LeafKind: ONEMETHOD) -typedef struct CV_LeafOneMethod{ +//- (LeafKind: ONEMETHOD) + +typedef struct CV_LeafOneMethod CV_LeafOneMethod; +struct CV_LeafOneMethod +{ CV_FieldAttribs attribs; CV_TypeId itype; // U32 vbaseoff (when Intro or PureIntro) // U8[] name (null terminated) -} CV_LeafOneMethod; +}; -// (LeafKind: ENUMERATE) -typedef struct CV_LeafEnumerate{ +//- (LeafKind: ENUMERATE) + +typedef struct CV_LeafEnumerate CV_LeafEnumerate; +struct CV_LeafEnumerate +{ CV_FieldAttribs attribs; // CV_Numeric val // U8[] name (null terminated) -} CV_LeafEnumerate; +}; -// (LeafKind: NESTTYPE) -typedef struct CV_LeafNestType{ +//- (LeafKind: NESTTYPE) + +typedef struct CV_LeafNestType CV_LeafNestType; +struct CV_LeafNestType +{ U16 pad; CV_TypeId itype; // U8[] name (null terminated) -} CV_LeafNestType; +}; -// (LeafKind: NESTTYPEEX) -typedef struct CV_LeafNestTypeEx{ +//- (LeafKind: NESTTYPEEX) + +typedef struct CV_LeafNestTypeEx CV_LeafNestTypeEx; +struct CV_LeafNestTypeEx +{ CV_FieldAttribs attribs; CV_TypeId itype; // U8[] name (null terminated) -} CV_LeafNestTypeEx; +}; -// (LeafKind: BCLASS) -typedef struct CV_LeafBClass{ +//- (LeafKind: BCLASS) + +typedef struct CV_LeafBClass CV_LeafBClass; +struct CV_LeafBClass +{ CV_FieldAttribs attribs; CV_TypeId itype; // CV_Numeric offset -} CV_LeafBClass; +}; -// (LeafKind: VBCLASS, IVBCLASS) -typedef struct CV_LeafVBClass{ +//- (LeafKind: VBCLASS, IVBCLASS) + +typedef struct CV_LeafVBClass CV_LeafVBClass; +struct CV_LeafVBClass +{ CV_FieldAttribs attribs; CV_TypeId itype; CV_TypeId vbptr_itype; // CV_Numeric vbptr_off // CV_Numeric vtable_off -} CV_LeafVBClass; +}; -// (LeafKind: VFUNCTAB) -typedef struct CV_LeafVFuncTab{ +//- (LeafKind: VFUNCTAB) + +typedef struct CV_LeafVFuncTab CV_LeafVFuncTab; +struct CV_LeafVFuncTab +{ U16 pad; CV_TypeId itype; -} CV_LeafVFuncTab; +}; -// (LeafKind: VFUNCOFF) -typedef struct CV_LeafVFuncOff{ +//- (LeafKind: VFUNCOFF) + +typedef struct CV_LeafVFuncOff CV_LeafVFuncOff; +struct CV_LeafVFuncOff +{ U16 pad; CV_TypeId itype; U32 off; -} CV_LeafVFuncOff; +}; -// (LeafKind: VFTABLE) -typedef struct CV_LeafVFTable{ +//- (LeafKind: VFTABLE) + +typedef struct CV_LeafVFTable CV_LeafVFTable; +struct CV_LeafVFTable +{ CV_TypeId owner_itype; CV_TypeId base_table_itype; U32 offset_in_object_layout; U32 names_len; // U8[] names (multiple null terminated strings) -} CV_LeafVFTable; +}; -// (LeafKind: VFTPATH) -typedef struct CV_LeafVFPath{ +//- (LeafKind: VFTPATH) + +typedef struct CV_LeafVFPath CV_LeafVFPath; +struct CV_LeafVFPath +{ U32 count; // CV_TypeId[count] base; -} CV_LeafVFPath; +}; -// (LeafKind: CLASS2, STRUCT2) -typedef struct CV_LeafStruct2{ +//- (LeafKind: CLASS2, STRUCT2) + +typedef struct CV_LeafStruct2 CV_LeafStruct2; +struct CV_LeafStruct2 +{ // NOTE: still reverse engineering this - if you find docs please help! CV_TypeProps props; U16 unknown1; @@ -2719,63 +2599,85 @@ typedef struct CV_LeafStruct2{ // CV_Numeric size // U8[] name (null terminated) // U8[] unique_name (null terminated) -} CV_LeafStruct2; +}; -// (LeafIDKind: FUNC_ID) -typedef struct CV_LeafFuncId{ +//- (LeafIDKind: FUNC_ID) + +typedef struct CV_LeafFuncId CV_LeafFuncId; +struct CV_LeafFuncId +{ CV_ItemId scope_string_id; CV_TypeId itype; // U8[] name (null terminated) -} CV_LeafFuncId; +}; -// (LeafIDKind: MFUNC_ID) -typedef struct CV_LeafMFuncId{ +//- (LeafIDKind: MFUNC_ID) + +typedef struct CV_LeafMFuncId CV_LeafMFuncId; +struct CV_LeafMFuncId +{ CV_TypeId owner_itype; CV_TypeId itype; // U8[] name (null terminated) -} CV_LeafMFuncId; +}; -// (LeafIDKind: STRING_ID) -typedef struct CV_LeafStringId{ +//- (LeafIDKind: STRING_ID) + +typedef struct CV_LeafStringId CV_LeafStringId; +struct CV_LeafStringId +{ CV_ItemId substr_list_id; // U8[] string (null terminated) -} CV_LeafStringId; +}; -// (LeafIDKind: BUILDINFO) -typedef enum{ +//- (LeafIDKind: BUILDINFO) + +typedef enum CV_BuildInfoIndexEnum +{ CV_BuildInfoIndex_BuildDirectory = 0, CV_BuildInfoIndex_CompilerExecutable = 1, CV_BuildInfoIndex_TargetSourceFile = 2, CV_BuildInfoIndex_CombinedPdb = 3, CV_BuildInfoIndex_CompileArguments = 4, -} CV_BuildInfoIndexEnum; +} +CV_BuildInfoIndexEnum; -typedef struct CV_LeafBuildInfo{ +typedef struct CV_LeafBuildInfo CV_LeafBuildInfo; +struct CV_LeafBuildInfo +{ U16 count; // CV_ItemId[count] items -} CV_LeafBuildInfo; +}; -// (LeafIDKind: SUBSTR_LIST) -typedef struct CV_LeafSubstrList{ +//- (LeafIDKind: SUBSTR_LIST) + +typedef struct CV_LeafSubstrList CV_LeafSubstrList; +struct CV_LeafSubstrList +{ U32 count; // CV_ItemId[count] items -} CV_LeafSubstrList; +}; -// (LeafIDKind: UDT_SRC_LINE) -typedef struct CV_LeafUDTSrcLine{ +//- (LeafIDKind: UDT_SRC_LINE) + +typedef struct CV_LeafUDTSrcLine CV_LeafUDTSrcLine; +struct CV_LeafUDTSrcLine +{ CV_TypeId udt_itype; CV_ItemId src_string_id; U32 line; -} CV_LeafUDTSrcLine; +}; -// (LeafIDKind: UDT_MOD_SRC_LINE) -typedef struct CV_LeafUDTModSrcLine{ +//- (LeafIDKind: UDT_MOD_SRC_LINE) + +typedef struct CV_LeafUDTModSrcLine CV_LeafUDTModSrcLine; +struct CV_LeafUDTModSrcLine +{ CV_TypeId udt_itype; CV_ItemId src_string_id; U32 line; CV_ModIndex imod; -} CV_LeafUDTModSrcLine; - +}; //////////////////////////////// //~ CodeView Format C13 Line Info Types @@ -2798,80 +2700,98 @@ X(MergedAssemblyInput, 0xFC)\ X(CoffSymbolRVA, 0xFD) typedef U32 CV_C13_SubSectionKind; -typedef enum{ +typedef enum +{ #define X(N,c) CV_C13_SubSectionKind_##N = c, CV_C13_SubSectionKindXList(X) #undef X } CV_C13_SubSectionKindEnum; -typedef struct CV_C13_SubSectionHeader{ +typedef struct CV_C13_SubSectionHeader CV_C13_SubSectionHeader; +struct CV_C13_SubSectionHeader +{ CV_C13_SubSectionKind kind; U32 size; -} CV_C13_SubSectionHeader; +}; //- FileChksms sub-section typedef U8 CV_C13_ChecksumKind; -typedef enum{ +typedef enum +{ CV_C13_ChecksumKind_Null, CV_C13_ChecksumKind_MD5, CV_C13_ChecksumKind_SHA1, CV_C13_ChecksumKind_SHA256, } CV_C13_ChecksumKindEnum; -typedef struct CV_C13_Checksum{ +typedef struct CV_C13_Checksum CV_C13_Checksum; +struct CV_C13_Checksum +{ U32 name_off; U8 len; CV_C13_ChecksumKind kind; -} CV_C13_Checksum; +}; //- Lines sub-section typedef U16 CV_C13_SubSecLinesFlags; -enum{ +enum +{ CV_C13_SubSecLinesFlag_HasColumns = (1 << 0) }; -typedef struct CV_C13_SubSecLinesHeader{ +typedef struct CV_C13_SubSecLinesHeader CV_C13_SubSecLinesHeader; +struct CV_C13_SubSecLinesHeader +{ U32 sec_off; CV_SectionIndex sec; CV_C13_SubSecLinesFlags flags; U32 len; -} CV_C13_SubSecLinesHeader; +}; -typedef struct CV_C13_File{ +typedef struct CV_C13_File CV_C13_File; +struct CV_C13_File +{ U32 file_off; U32 num_lines; U32 block_size; // CV_C13_Line[num_lines] lines; // CV_C13_Column[num_lines] columns; (if HasColumns) -} CV_C13_File; +}; typedef U32 CV_C13_LineFlags; #define CV_C13_LineFlags_ExtractLineNumber(f) ((f)&0xFFFFFF) #define CV_C13_LineFlags_ExtractDeltaToEnd(f) (((f)>>24)&0x7F) #define CV_C13_LineFlags_ExtractStatement(f) (((f)>>31)&0x1) -typedef struct CV_C13_Line{ +typedef struct CV_C13_Line CV_C13_Line; +struct CV_C13_Line +{ U32 off; CV_C13_LineFlags flags; -} CV_C13_Line; +}; -typedef struct CV_C13_Column{ +typedef struct CV_C13_Column CV_C13_Column; +struct CV_C13_Column +{ U16 start; U16 end; -} CV_C13_Column; +}; //- FrameData sub-section typedef U32 CV_C13_FrameDataFlags; -enum{ +enum +{ CV_C13_FrameDataFlag_HasStructuredExceptionHandling = (1 << 0), CV_C13_FrameDataFlag_HasExceptionHandling = (1 << 1), CV_C13_FrameDataFlag_HasIsFuncStart = (1 << 2), }; -typedef struct CV_C13_FrameData{ +typedef struct CV_C13_FrameData CV_C13_FrameData; +struct CV_C13_FrameData +{ U32 start_voff; U32 code_size; U32 local_size; @@ -2881,7 +2801,7 @@ typedef struct CV_C13_FrameData{ U16 prolog_size; U16 saved_reg_size; CV_C13_FrameDataFlags flags; -} CV_C13_FrameData; +}; #pragma pack(pop) @@ -2894,45 +2814,59 @@ typedef struct CV_C13_FrameData{ // case (x < 0x8000): kind=U16 val=x // case (x >= 0x8000): kind=x val=buf -typedef struct CV_NumericParsed{ +typedef struct CV_NumericParsed CV_NumericParsed; +struct CV_NumericParsed +{ CV_NumericKind kind; U8 *val; U64 encoded_size; -} CV_NumericParsed; +}; -typedef struct CV_RecRange{ +typedef struct CV_RecRange CV_RecRange; +struct CV_RecRange +{ U32 off; CV_RecHeader hdr; -} CV_RecRange; +}; #define CV_REC_RANGE_CHUNK_SIZE 511 -typedef struct CV_RecRangeChunk{ +typedef struct CV_RecRangeChunk CV_RecRangeChunk; +struct CV_RecRangeChunk +{ struct CV_RecRangeChunk *next; CV_RecRange ranges[CV_REC_RANGE_CHUNK_SIZE]; -} CV_RecRangeChunk; +}; -typedef struct CV_RecRangeStream{ +typedef struct CV_RecRangeStream CV_RecRangeStream; +struct CV_RecRangeStream +{ CV_RecRangeChunk *first_chunk; CV_RecRangeChunk *last_chunk; U64 total_count; -} CV_RecRangeStream; +}; -typedef struct CV_RecRangeArray{ +typedef struct CV_RecRangeArray CV_RecRangeArray; +struct CV_RecRangeArray +{ CV_RecRange *ranges; U64 count; -} CV_RecRangeArray; +}; //////////////////////////////// //~ CodeView Sym Parser Types -typedef struct CV_SymTopLevelInfo{ +typedef struct CV_SymTopLevelInfo CV_SymTopLevelInfo; +struct CV_SymTopLevelInfo +{ CV_Arch arch; CV_Language language; String8 compiler_name; -} CV_SymTopLevelInfo; +}; -typedef struct CV_SymParsed{ +typedef struct CV_SymParsed CV_SymParsed; +struct CV_SymParsed +{ // source information String8 data; U64 sym_align; @@ -2942,13 +2876,15 @@ typedef struct CV_SymParsed{ // top-level info derived from the syms CV_SymTopLevelInfo info; -} CV_SymParsed; +}; //////////////////////////////// //~ CodeView Leaf Parser Types -typedef struct CV_LeafParsed{ +typedef struct CV_LeafParsed CV_LeafParsed; +struct CV_LeafParsed +{ // source information String8 data; CV_TypeId itype_first; @@ -2956,12 +2892,14 @@ typedef struct CV_LeafParsed{ // leaf index derived from source CV_RecRangeArray leaf_ranges; -} CV_LeafParsed; +}; //////////////////////////////// //~ CodeView C13 Info Parser Types -typedef struct CV_C13LinesParsed{ +typedef struct CV_C13LinesParsed CV_C13LinesParsed; +struct CV_C13LinesParsed +{ // raw info U32 sec_idx; U32 file_off; @@ -2973,7 +2911,7 @@ typedef struct CV_C13LinesParsed{ U32 *line_nums; // [line_count] U16 *col_nums; // [2*line_count] U32 line_count; -} CV_C13LinesParsed; +}; typedef struct CV_C13LinesParsedNode CV_C13LinesParsedNode; struct CV_C13LinesParsedNode @@ -2982,32 +2920,37 @@ struct CV_C13LinesParsedNode CV_C13LinesParsed v; }; -typedef struct CV_C13SubSectionNode{ +typedef struct CV_C13SubSectionNode CV_C13SubSectionNode; +struct CV_C13SubSectionNode +{ struct CV_C13SubSectionNode *next; CV_C13_SubSectionKind kind; U32 off; U32 size; CV_C13LinesParsedNode *lines_first; CV_C13LinesParsedNode *lines_last; -} CV_C13SubSectionNode; +}; -typedef struct CV_C13Parsed{ +typedef struct CV_C13Parsed CV_C13Parsed; +struct CV_C13Parsed +{ CV_C13SubSectionNode *first_sub_section; CV_C13SubSectionNode *last_sub_section; U64 sub_section_count; // accelerator CV_C13SubSectionNode *file_chksms_sub_section; -} CV_C13Parsed; - +}; //////////////////////////////// //~ CodeView Compound Types -typedef struct CV_TypeIdArray{ +typedef struct CV_TypeIdArray CV_TypeIdArray; +struct CV_TypeIdArray +{ CV_TypeId *itypes; U64 count; -} CV_TypeIdArray; +}; //////////////////////////////// diff --git a/src/codeview/codeview.mdesk b/src/codeview/codeview.mdesk index e4864c5b..f05316c3 100644 --- a/src/codeview/codeview.mdesk +++ b/src/codeview/codeview.mdesk @@ -1,3 +1,5 @@ +//////////////////////////////// +//~ rjf: CV Numerics @table(name val) CV_NumericKindTable: @@ -26,3 +28,479 @@ CV_NumericKindTable: {UTF8STRING 0x801b} {FLOAT16 0x801c} } + +@enum(U16) CV_NumericKind: +{ + @expand(CV_NumericKindTable a) `$(a.name) = $(a.val)` +} + +@enum2string_switch(CV_NumericKind) +cv_string_from_numeric_kind: +{ + @expand(CV_NumericKindTable a) `case CV_NumericKind_$(a.name):{result = str8_lit("$(a.name)");}break`; +} + +//////////////////////////////// +//~ rjf: CV Architectures + +@table(name val) +CV_ArchTable: +{ + {8080 0x00} + {8086 0x01} + {80286 0x02} + {80386 0x03} + {80486 0x04} + {PENTIUM 0x05} + {PENTIUMII 0x06} + {PENTIUMIII 0x07} + {MIPS 0x10} + {MIPS16 0x11} + {MIPS32 0x12} + {MIPS64 0x13} + {MIPSI 0x14} + {MIPSII 0x15} + {MIPSIII 0x16} + {MIPSIV 0x17} + {MIPSV 0x18} + {M68000 0x20} + {M68010 0x21} + {M68020 0x22} + {M68030 0x23} + {M68040 0x24} + {ALPHA 0x30} + {ALPHA_21164 0x31} + {ALPHA_21164A 0x32} + {ALPHA_21264 0x33} + {ALPHA_21364 0x34} + {PPC601 0x40} + {PPC603 0x41} + {PPC604 0x42} + {PPC620 0x43} + {PPCFP 0x44} + {PPCBE 0x45} + {SH3 0x50} + {SH3E 0x51} + {SH3DSP 0x52} + {SH4 0x53} + {SHMEDIA 0x54} + {ARM3 0x60} + {ARM4 0x61} + {ARM4T 0x62} + {ARM5 0x63} + {ARM5T 0x64} + {ARM6 0x65} + {ARM_XMAC 0x66} + {ARM_WMMX 0x67} + {ARM7 0x68} + {OMNI 0x70} + {IA64_1 0x80} + {IA64_2 0x81} + {CEE 0x90} + {AM33 0xA0} + {M32R 0xB0} + {TRICORE 0xC0} + {X64 0xD0} + {EBC 0xE0} + {THUMB 0xF0} + {ARMNT 0xF4} + {ARM64 0xF6} + {D3D11_SHADER 0x100} +} + +@enum(U16) CV_Arch: +{ + @expand(CV_ArchTable a) `$(a.name) = $(a.val)`, + `IA64 = CV_Arch_IA64_1`, + `PENTIUMPRO = CV_Arch_PENTIUMII`, + `MIPSR4000 = CV_Arch_MIPS`, + `ALPHA_21064 = CV_Arch_ALPHA`, + `AMD64 = CV_Arch_X64`, +} + +@enum2string_switch(CV_Arch) +cv_string_from_arch: +{ + @expand(CV_ArchTable a) `case CV_Arch_$(a.name):{result = str8_lit("$(a.name)");}break`; +} + +//////////////////////////////// +//~ rjf: CV Registers + +@table(name val) CV_AllRegTable: +{ + {ERR 30000} + {TEB 30001} + {TIMER 30002} + {EFAD1 30003} + {EFAD2 30004} + {EFAD3 30005} + {VFRAME 30006} + {HANDLE 30007} + {PARAMS 30008} + {LOCALS 30009} + {TID 30010} + {ENV 30011} + {CMDLN 30012} +} + +@enum(U16) CV_AllReg: +{ + @expand(CV_AllRegTable a) `$(a.name) = $(a.val)` +} + +//////////////////////////////// +//~ rjf: CV Sym Kinds + +@table(name val) CV_SymKindTable: +{ + {COMPILE 0x0001} + {REGISTER_16t 0x0002} + {CONSTANT_16t 0x0003} + {UDT_16t 0x0004} + {SSEARCH 0x0005} + {END 0x0006} + {SKIP 0x0007} + {CVRESERVE 0x0008} + {OBJNAME_ST 0x0009} + {ENDARG 0x000a} + {COBOLUDT_16t 0x000b} + {MANYREG_16t 0x000c} + {RETURN 0x000d} + {ENTRYTHIS 0x000e} + {BPREL16 0x0100} + {LDATA16 0x0101} + {GDATA16 0x0102} + {PUB16 0x0103} + {LPROC16 0x0104} + {GPROC16 0x0105} + {THUNK16 0x0106} + {BLOCK16 0x0107} + {WITH16 0x0108} + {LABEL16 0x0109} + {CEXMODEL16 0x010a} + {VFTABLE16 0x010b} + {REGREL16 0x010c} + {BPREL32_16t 0x0200} + {LDATA32_16t 0x0201} + {GDATA32_16t 0x0202} + {PUB32_16t 0x0203} + {LPROC32_16t 0x0204} + {GPROC32_16t 0x0205} + {THUNK32_ST 0x0206} + {BLOCK32_ST 0x0207} + {WITH32_ST 0x0208} + {LABEL32_ST 0x0209} + {CEXMODEL32 0x020a} + {VFTABLE32_16t 0x020b} + {REGREL32_16t 0x020c} + {LTHREAD32_16t 0x020d} + {GTHREAD32_16t 0x020e} + {SLINK32 0x020f} + {LPROCMIPS_16t 0x0300} + {GPROCMIPS_16t 0x0301} + {PROCREF_ST 0x0400} + {DATAREF_ST 0x0401} + {ALIGN 0x0402} + {LPROCREF_ST 0x0403} + {OEM 0x0404} + {TI16_MAX 0x1000} + {CONSTANT_ST 0x1002} + {UDT_ST 0x1003} + {COBOLUDT_ST 0x1004} + {MANYREG_ST 0x1005} + {BPREL32_ST 0x1006} + {LDATA32_ST 0x1007} + {GDATA32_ST 0x1008} + {PUB32_ST 0x1009} + {LPROC32_ST 0x100a} + {GPROC32_ST 0x100b} + {VFTABLE32 0x100c} + {REGREL32_ST 0x100d} + {LTHREAD32_ST 0x100e} + {GTHREAD32_ST 0x100f} + {LPROCMIPS_ST 0x1010} + {GPROCMIPS_ST 0x1011} + {FRAMEPROC 0x1012} + {COMPILE2_ST 0x1013} + {MANYREG2_ST 0x1014} + {LPROCIA64_ST 0x1015} + {GPROCIA64_ST 0x1016} + {LOCALSLOT_ST 0x1017} + {PARAMSLOT_ST 0x1018} + {ANNOTATION 0x1019} + {GMANPROC_ST 0x101a} + {LMANPROC_ST 0x101b} + {RESERVED1 0x101c} + {RESERVED2 0x101d} + {RESERVED3 0x101e} + {RESERVED4 0x101f} + {LMANDATA_ST 0x1020} + {GMANDATA_ST 0x1021} + {MANFRAMEREL_ST 0x1022} + {MANREGISTER_ST 0x1023} + {MANSLOT_ST 0x1024} + {MANMANYREG_ST 0x1025} + {MANREGREL_ST 0x1026} + {MANMANYREG2_ST 0x1027} + {MANTYPREF 0x1028} + {UNAMESPACE_ST 0x1029} + {ST_MAX 0x1100} + {OBJNAME 0x1101} + {THUNK32 0x1102} + {BLOCK32 0x1103} + {WITH32 0x1104} + {LABEL32 0x1105} + {REGISTER 0x1106} + {CONSTANT 0x1107} + {UDT 0x1108} + {COBOLUDT 0x1109} + {MANYREG 0x110a} + {BPREL32 0x110b} + {LDATA32 0x110c} + {GDATA32 0x110d} + {PUB32 0x110e} + {LPROC32 0x110f} + {GPROC32 0x1110} + {REGREL32 0x1111} + {LTHREAD32 0x1112} + {GTHREAD32 0x1113} + {LPROCMIPS 0x1114} + {GPROCMIPS 0x1115} + {COMPILE2 0x1116} + {MANYREG2 0x1117} + {LPROCIA64 0x1118} + {GPROCIA64 0x1119} + {LOCALSLOT 0x111a} + {PARAMSLOT 0x111b} + {LMANDATA 0x111c} + {GMANDATA 0x111d} + {MANFRAMEREL 0x111e} + {MANREGISTER 0x111f} + {MANSLOT 0x1120} + {MANMANYREG 0x1121} + {MANREGREL 0x1122} + {MANMANYREG2 0x1123} + {UNAMESPACE 0x1124} + {PROCREF 0x1125} + {DATAREF 0x1126} + {LPROCREF 0x1127} + {ANNOTATIONREF 0x1128} + {TOKENREF 0x1129} + {GMANPROC 0x112a} + {LMANPROC 0x112b} + {TRAMPOLINE 0x112c} + {MANCONSTANT 0x112d} + {ATTR_FRAMEREL 0x112e} + {ATTR_REGISTER 0x112f} + {ATTR_REGREL 0x1130} + {ATTR_MANYREG 0x1131} + {SEPCODE 0x1132} + {DEFRANGE_2005 0x1134} + {DEFRANGE2_2005 0x1135} + {SECTION 0x1136} + {COFFGROUP 0x1137} + {EXPORT 0x1138} + {CALLSITEINFO 0x1139} + {FRAMECOOKIE 0x113a} + {DISCARDED 0x113b} + {COMPILE3 0x113c} + {ENVBLOCK 0x113d} + {LOCAL 0x113e} + {DEFRANGE 0x113f} + {DEFRANGE_SUBFIELD 0x1140} + {DEFRANGE_REGISTER 0x1141} + {DEFRANGE_FRAMEPOINTER_REL 0x1142} + {DEFRANGE_SUBFIELD_REGISTER 0x1143} + {DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE 0x1144} + {DEFRANGE_REGISTER_REL 0x1145} + {LPROC32_ID 0x1146} + {GPROC32_ID 0x1147} + {LPROCMIPS_ID 0x1148} + {GPROCMIPS_ID 0x1149} + {LPROCIA64_ID 0x114a} + {GPROCIA64_ID 0x114b} + {BUILDINFO 0x114c} + {INLINESITE 0x114d} + {INLINESITE_END 0x114e} + {PROC_ID_END 0x114f} + {DEFRANGE_HLSL 0x1150} + {GDATA_HLSL 0x1151} + {LDATA_HLSL 0x1152} + {FILESTATIC 0x1153} + {LPROC32_DPC 0x1155} + {LPROC32_DPC_ID 0x1156} + {DEFRANGE_DPC_PTR_TAG 0x1157} + {DPC_SYM_TAG_MAP 0x1158} + {ARMSWITCHTABLE 0x1159} + {CALLEES 0x115a} + {CALLERS 0x115b} + {POGODATA 0x115c} + {INLINESITE2 0x115d} + {HEAPALLOCSITE 0x115e} + {MOD_TYPEREF 0x115f} + {REF_MINIPDB 0x1160} + {PDBMAP 0x1161} + {GDATA_HLSL32 0x1162} + {LDATA_HLSL32 0x1163} + {GDATA_HLSL32_EX 0x1164} + {LDATA_HLSL32_EX 0x1165} + {FASTLINK 0x1167} + {INLINEES 0x1168} +} + +@enum(U16) CV_SymKind: +{ + @expand(CV_SymKindTable a) `$(a.name) = $(a.val)` +} + +@enum2string_switch(CV_SymKind) +cv_string_from_sym_kind: +{ + @expand(CV_SymKindTable a) `case CV_SymKind_$(a.name):{result = str8_lit("$(a.name)");}break`; +} + +//////////////////////////////// +//~ rjf: CV Leaf + +@table(name val) +CV_LeafKindTable: +{ + {MODIFIER_16t 0x0001} + {POINTER_16t 0x0002} + {ARRAY_16t 0x0003} + {CLASS_16t 0x0004} + {STRUCTURE_16t 0x0005} + {UNION_16t 0x0006} + {ENUM_16t 0x0007} + {PROCEDURE_16t 0x0008} + {MFUNCTION_16t 0x0009} + {VTSHAPE 0x000a} + {COBOL0_16t 0x000b} + {COBOL1 0x000c} + {BARRAY_16t 0x000d} + {LABEL 0x000e} + {NULL 0x000f} + {NOTTRAN 0x0010} + {DIMARRAY_16t 0x0011} + {VFTPATH_16t 0x0012} + {PRECOMP_16t 0x0013} + {ENDPRECOMP 0x0014} + {OEM_16t 0x0015} + {TYPESERVER_ST 0x0016} + {SKIP_16t 0x0200} + {ARGLIST_16t 0x0201} + {DEFARG_16t 0x0202} + {LIST 0x0203} + {FIELDLIST_16t 0x0204} + {DERIVED_16t 0x0205} + {BITFIELD_16t 0x0206} + {METHODLIST_16t 0x0207} + {DIMCONU_16t 0x0208} + {DIMCONLU_16t 0x0209} + {DIMVARU_16t 0x020a} + {DIMVARLU_16t 0x020b} + {REFSYM 0x020c} + {BCLASS_16t 0x0400} + {VBCLASS_16t 0x0401} + {IVBCLASS_16t 0x0402} + {ENUMERATE_ST 0x0403} + {FRIENDFCN_16t 0x0404} + {INDEX_16t 0x0405} + {MEMBER_16t 0x0406} + {STMEMBER_16t 0x0407} + {METHOD_16t 0x0408} + {NESTTYPE_16t 0x0409} + {VFUNCTAB_16t 0x040a} + {FRIENDCLS_16t 0x040b} + {ONEMETHOD_16t 0x040c} + {VFUNCOFF_16t 0x040d} + {TI16_MAX 0x1000} + {MODIFIER 0x1001} + {POINTER 0x1002} + {ARRAY_ST 0x1003} + {CLASS_ST 0x1004} + {STRUCTURE_ST 0x1005} + {UNION_ST 0x1006} + {ENUM_ST 0x1007} + {PROCEDURE 0x1008} + {MFUNCTION 0x1009} + {COBOL0 0x100a} + {BARRAY 0x100b} + {DIMARRAY_ST 0x100c} + {VFTPATH 0x100d} + {PRECOMP_ST 0x100e} + {OEM 0x100f} + {ALIAS_ST 0x1010} + {OEM2 0x1011} + {SKIP 0x1200} + {ARGLIST 0x1201} + {DEFARG_ST 0x1202} + {FIELDLIST 0x1203} + {DERIVED 0x1204} + {BITFIELD 0x1205} + {METHODLIST 0x1206} + {DIMCONU 0x1207} + {DIMCONLU 0x1208} + {DIMVARU 0x1209} + {DIMVARLU 0x120a} + {BCLASS 0x1400} + {VBCLASS 0x1401} + {IVBCLASS 0x1402} + {FRIENDFCN_ST 0x1403} + {INDEX 0x1404} + {MEMBER_ST 0x1405} + {STMEMBER_ST 0x1406} + {METHOD_ST 0x1407} + {NESTTYPE_ST 0x1408} + {VFUNCTAB 0x1409} + {FRIENDCLS 0x140a} + {ONEMETHOD_ST 0x140b} + {VFUNCOFF 0x140c} + {NESTTYPEEX_ST 0x140d} + {MEMBERMODIFY_ST 0x140e} + {MANAGED_ST 0x140f} + {ST_MAX 0x1500} + {TYPESERVER 0x1501} + {ENUMERATE 0x1502} + {ARRAY 0x1503} + {CLASS 0x1504} + {STRUCTURE 0x1505} + {UNION 0x1506} + {ENUM 0x1507} + {DIMARRAY 0x1508} + {PRECOMP 0x1509} + {ALIAS 0x150a} + {DEFARG 0x150b} + {FRIENDFCN 0x150c} + {MEMBER 0x150d} + {STMEMBER 0x150e} + {METHOD 0x150f} + {NESTTYPE 0x1510} + {ONEMETHOD 0x1511} + {NESTTYPEEX 0x1512} + {MEMBERMODIFY 0x1513} + {MANAGED 0x1514} + {TYPESERVER2 0x1515} + {STRIDED_ARRAY 0x1516} + {HLSL 0x1517} + {MODIFIER_EX 0x1518} + {INTERFACE 0x1519} + {BINTERFACE 0x151a} + {VECTOR 0x151b} + {MATRIX 0x151c} + {VFTABLE 0x151d} + {CLASS2 0x1608} + {STRUCT2 0x1609} +} + +@enum(U16) CV_LeafKind: +{ + @expand(CV_LeafKindTable a) `$(a.name) = $(a.val)`; +} + +@enum2string_switch(CV_LeafKind) +cv_string_from_leaf_kind: +{ + @expand(CV_LeafKindTable a) `case CV_LeafKind_$(a.name):{result = str8_lit("$(a.name)");}break`; +} diff --git a/src/codeview/codeview_stringize.c b/src/codeview/codeview_stringize.c index 70ee4628..983b078e 100644 --- a/src/codeview/codeview_stringize.c +++ b/src/codeview/codeview_stringize.c @@ -48,17 +48,6 @@ cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, void *first, voi } } -internal String8 -cv_string_from_sym_kind(CV_SymKind kind){ - String8 result = str8_lit("UNRECOGNIZED_SYM_KIND"); - switch (kind){ -#define X(N,c) case CV_SymKind_##N: result = str8_lit(#N); break; - CV_SymKindXList(X) -#undef X - } - return(result); -} - internal String8 cv_string_from_basic_type(CV_BasicType basic_type){ String8 result = str8_lit("UNRECOGNIZED_BASIC_TYPE"); @@ -70,33 +59,6 @@ cv_string_from_basic_type(CV_BasicType basic_type){ return(result); } -internal String8 -cv_string_from_leaf_kind(CV_LeafKind kind){ - String8 result = str8_lit("UNRECOGNIZED_LEAF_KIND"); - switch (kind){ -#define X(N,c) case CV_LeafKind_##N: result = str8_lit(#N); break; - CV_LeafKindXList(X) -#undef X - -#define X(N,c) case CV_LeafIDKind_##N: result = str8_lit(#N); break; - CV_LeafIDKindXList(X) -#undef X - } - return(result); -} - -internal String8 -cv_string_from_numeric_kind(CV_NumericKind kind){ - String8 result = str8_lit("UNRECOGNIZED_NUMERIC_KIND"); - switch (kind){ - case 0: str8_lit("PARSE_ERROR"); break; -#define X(N,c) case CV_NumericKind_##N: result = str8_lit(#N); break; - CV_NumericKindXList(X) -#undef X - } - return(result); -} - internal String8 cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind){ String8 result = str8_lit("UNRECOGNIZED_C13_SUB_SECTION_KIND"); @@ -109,17 +71,6 @@ cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind){ return(result); } -internal String8 -cv_string_from_machine(CV_Arch arch){ - String8 result = {0}; - switch (arch){ -#define X(N,c) case CV_Arch_##N: result = str8_lit(#N); break; - CV_ArchXList(X) -#undef X - } - return(result); -} - internal String8 cv_string_from_reg(CV_Arch arch, CV_Reg reg){ String8 result = {0}; @@ -417,7 +368,7 @@ cv_stringize_sym_range(Arena *arena, String8List *out, CV_SymCompile *compile = (CV_SymCompile*)first; // machine - String8 machine = cv_string_from_machine(compile->machine); + String8 machine = cv_string_from_arch(compile->machine); str8_list_pushf(arena, out, " machine=%.*s\n", str8_varg(machine)); @@ -742,7 +693,7 @@ cv_stringize_sym_range(Arena *arena, String8List *out, str8_list_pushf(arena, out, " flags=%x\n", compile2->flags); // machine - String8 machine = cv_string_from_machine(compile2->machine); + String8 machine = cv_string_from_arch(compile2->machine); str8_list_pushf(arena, out, " machine=%.*s\n", str8_varg(machine)); @@ -906,7 +857,7 @@ cv_stringize_sym_range(Arena *arena, String8List *out, str8_list_pushf(arena, out, " flags=%x\n", compile3->flags); // machine - String8 machine = cv_string_from_machine(compile3->machine); + String8 machine = cv_string_from_arch(compile3->machine); str8_list_pushf(arena, out, " machine=%.*s\n", str8_varg(machine)); diff --git a/src/codeview/codeview_stringize.h b/src/codeview/codeview_stringize.h index 4e3d3ce3..b37cd904 100644 --- a/src/codeview/codeview_stringize.h +++ b/src/codeview/codeview_stringize.h @@ -26,12 +26,8 @@ internal void cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_Lvar 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); diff --git a/src/codeview/generated/codeview.meta.c b/src/codeview/generated/codeview.meta.c new file mode 100644 index 00000000..6db9136c --- /dev/null +++ b/src/codeview/generated/codeview.meta.c @@ -0,0 +1,454 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +internal String8 +cv_string_from_numeric_kind(CV_NumericKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_NumericKind_CHAR:{result = str8_lit("CHAR");}break; +case CV_NumericKind_SHORT:{result = str8_lit("SHORT");}break; +case CV_NumericKind_USHORT:{result = str8_lit("USHORT");}break; +case CV_NumericKind_LONG:{result = str8_lit("LONG");}break; +case CV_NumericKind_ULONG:{result = str8_lit("ULONG");}break; +case CV_NumericKind_FLOAT32:{result = str8_lit("FLOAT32");}break; +case CV_NumericKind_FLOAT64:{result = str8_lit("FLOAT64");}break; +case CV_NumericKind_FLOAT80:{result = str8_lit("FLOAT80");}break; +case CV_NumericKind_FLOAT128:{result = str8_lit("FLOAT128");}break; +case CV_NumericKind_QUADWORD:{result = str8_lit("QUADWORD");}break; +case CV_NumericKind_UQUADWORD:{result = str8_lit("UQUADWORD");}break; +case CV_NumericKind_FLOAT48:{result = str8_lit("FLOAT48");}break; +case CV_NumericKind_COMPLEX32:{result = str8_lit("COMPLEX32");}break; +case CV_NumericKind_COMPLEX64:{result = str8_lit("COMPLEX64");}break; +case CV_NumericKind_COMPLEX80:{result = str8_lit("COMPLEX80");}break; +case CV_NumericKind_COMPLEX128:{result = str8_lit("COMPLEX128");}break; +case CV_NumericKind_VARSTRING:{result = str8_lit("VARSTRING");}break; +case CV_NumericKind_OCTWORD:{result = str8_lit("OCTWORD");}break; +case CV_NumericKind_UOCTWORD:{result = str8_lit("UOCTWORD");}break; +case CV_NumericKind_DECIMAL:{result = str8_lit("DECIMAL");}break; +case CV_NumericKind_DATE:{result = str8_lit("DATE");}break; +case CV_NumericKind_UTF8STRING:{result = str8_lit("UTF8STRING");}break; +case CV_NumericKind_FLOAT16:{result = str8_lit("FLOAT16");}break; +} +return result; +} + +internal String8 +cv_string_from_arch(CV_Arch v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_Arch_8080:{result = str8_lit("8080");}break; +case CV_Arch_8086:{result = str8_lit("8086");}break; +case CV_Arch_80286:{result = str8_lit("80286");}break; +case CV_Arch_80386:{result = str8_lit("80386");}break; +case CV_Arch_80486:{result = str8_lit("80486");}break; +case CV_Arch_PENTIUM:{result = str8_lit("PENTIUM");}break; +case CV_Arch_PENTIUMII:{result = str8_lit("PENTIUMII");}break; +case CV_Arch_PENTIUMIII:{result = str8_lit("PENTIUMIII");}break; +case CV_Arch_MIPS:{result = str8_lit("MIPS");}break; +case CV_Arch_MIPS16:{result = str8_lit("MIPS16");}break; +case CV_Arch_MIPS32:{result = str8_lit("MIPS32");}break; +case CV_Arch_MIPS64:{result = str8_lit("MIPS64");}break; +case CV_Arch_MIPSI:{result = str8_lit("MIPSI");}break; +case CV_Arch_MIPSII:{result = str8_lit("MIPSII");}break; +case CV_Arch_MIPSIII:{result = str8_lit("MIPSIII");}break; +case CV_Arch_MIPSIV:{result = str8_lit("MIPSIV");}break; +case CV_Arch_MIPSV:{result = str8_lit("MIPSV");}break; +case CV_Arch_M68000:{result = str8_lit("M68000");}break; +case CV_Arch_M68010:{result = str8_lit("M68010");}break; +case CV_Arch_M68020:{result = str8_lit("M68020");}break; +case CV_Arch_M68030:{result = str8_lit("M68030");}break; +case CV_Arch_M68040:{result = str8_lit("M68040");}break; +case CV_Arch_ALPHA:{result = str8_lit("ALPHA");}break; +case CV_Arch_ALPHA_21164:{result = str8_lit("ALPHA_21164");}break; +case CV_Arch_ALPHA_21164A:{result = str8_lit("ALPHA_21164A");}break; +case CV_Arch_ALPHA_21264:{result = str8_lit("ALPHA_21264");}break; +case CV_Arch_ALPHA_21364:{result = str8_lit("ALPHA_21364");}break; +case CV_Arch_PPC601:{result = str8_lit("PPC601");}break; +case CV_Arch_PPC603:{result = str8_lit("PPC603");}break; +case CV_Arch_PPC604:{result = str8_lit("PPC604");}break; +case CV_Arch_PPC620:{result = str8_lit("PPC620");}break; +case CV_Arch_PPCFP:{result = str8_lit("PPCFP");}break; +case CV_Arch_PPCBE:{result = str8_lit("PPCBE");}break; +case CV_Arch_SH3:{result = str8_lit("SH3");}break; +case CV_Arch_SH3E:{result = str8_lit("SH3E");}break; +case CV_Arch_SH3DSP:{result = str8_lit("SH3DSP");}break; +case CV_Arch_SH4:{result = str8_lit("SH4");}break; +case CV_Arch_SHMEDIA:{result = str8_lit("SHMEDIA");}break; +case CV_Arch_ARM3:{result = str8_lit("ARM3");}break; +case CV_Arch_ARM4:{result = str8_lit("ARM4");}break; +case CV_Arch_ARM4T:{result = str8_lit("ARM4T");}break; +case CV_Arch_ARM5:{result = str8_lit("ARM5");}break; +case CV_Arch_ARM5T:{result = str8_lit("ARM5T");}break; +case CV_Arch_ARM6:{result = str8_lit("ARM6");}break; +case CV_Arch_ARM_XMAC:{result = str8_lit("ARM_XMAC");}break; +case CV_Arch_ARM_WMMX:{result = str8_lit("ARM_WMMX");}break; +case CV_Arch_ARM7:{result = str8_lit("ARM7");}break; +case CV_Arch_OMNI:{result = str8_lit("OMNI");}break; +case CV_Arch_IA64_1:{result = str8_lit("IA64_1");}break; +case CV_Arch_IA64_2:{result = str8_lit("IA64_2");}break; +case CV_Arch_CEE:{result = str8_lit("CEE");}break; +case CV_Arch_AM33:{result = str8_lit("AM33");}break; +case CV_Arch_M32R:{result = str8_lit("M32R");}break; +case CV_Arch_TRICORE:{result = str8_lit("TRICORE");}break; +case CV_Arch_X64:{result = str8_lit("X64");}break; +case CV_Arch_EBC:{result = str8_lit("EBC");}break; +case CV_Arch_THUMB:{result = str8_lit("THUMB");}break; +case CV_Arch_ARMNT:{result = str8_lit("ARMNT");}break; +case CV_Arch_ARM64:{result = str8_lit("ARM64");}break; +case CV_Arch_D3D11_SHADER:{result = str8_lit("D3D11_SHADER");}break; +} +return result; +} + +internal String8 +cv_string_from_sym_kind(CV_SymKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_SymKind_COMPILE:{result = str8_lit("COMPILE");}break; +case CV_SymKind_REGISTER_16t:{result = str8_lit("REGISTER_16t");}break; +case CV_SymKind_CONSTANT_16t:{result = str8_lit("CONSTANT_16t");}break; +case CV_SymKind_UDT_16t:{result = str8_lit("UDT_16t");}break; +case CV_SymKind_SSEARCH:{result = str8_lit("SSEARCH");}break; +case CV_SymKind_END:{result = str8_lit("END");}break; +case CV_SymKind_SKIP:{result = str8_lit("SKIP");}break; +case CV_SymKind_CVRESERVE:{result = str8_lit("CVRESERVE");}break; +case CV_SymKind_OBJNAME_ST:{result = str8_lit("OBJNAME_ST");}break; +case CV_SymKind_ENDARG:{result = str8_lit("ENDARG");}break; +case CV_SymKind_COBOLUDT_16t:{result = str8_lit("COBOLUDT_16t");}break; +case CV_SymKind_MANYREG_16t:{result = str8_lit("MANYREG_16t");}break; +case CV_SymKind_RETURN:{result = str8_lit("RETURN");}break; +case CV_SymKind_ENTRYTHIS:{result = str8_lit("ENTRYTHIS");}break; +case CV_SymKind_BPREL16:{result = str8_lit("BPREL16");}break; +case CV_SymKind_LDATA16:{result = str8_lit("LDATA16");}break; +case CV_SymKind_GDATA16:{result = str8_lit("GDATA16");}break; +case CV_SymKind_PUB16:{result = str8_lit("PUB16");}break; +case CV_SymKind_LPROC16:{result = str8_lit("LPROC16");}break; +case CV_SymKind_GPROC16:{result = str8_lit("GPROC16");}break; +case CV_SymKind_THUNK16:{result = str8_lit("THUNK16");}break; +case CV_SymKind_BLOCK16:{result = str8_lit("BLOCK16");}break; +case CV_SymKind_WITH16:{result = str8_lit("WITH16");}break; +case CV_SymKind_LABEL16:{result = str8_lit("LABEL16");}break; +case CV_SymKind_CEXMODEL16:{result = str8_lit("CEXMODEL16");}break; +case CV_SymKind_VFTABLE16:{result = str8_lit("VFTABLE16");}break; +case CV_SymKind_REGREL16:{result = str8_lit("REGREL16");}break; +case CV_SymKind_BPREL32_16t:{result = str8_lit("BPREL32_16t");}break; +case CV_SymKind_LDATA32_16t:{result = str8_lit("LDATA32_16t");}break; +case CV_SymKind_GDATA32_16t:{result = str8_lit("GDATA32_16t");}break; +case CV_SymKind_PUB32_16t:{result = str8_lit("PUB32_16t");}break; +case CV_SymKind_LPROC32_16t:{result = str8_lit("LPROC32_16t");}break; +case CV_SymKind_GPROC32_16t:{result = str8_lit("GPROC32_16t");}break; +case CV_SymKind_THUNK32_ST:{result = str8_lit("THUNK32_ST");}break; +case CV_SymKind_BLOCK32_ST:{result = str8_lit("BLOCK32_ST");}break; +case CV_SymKind_WITH32_ST:{result = str8_lit("WITH32_ST");}break; +case CV_SymKind_LABEL32_ST:{result = str8_lit("LABEL32_ST");}break; +case CV_SymKind_CEXMODEL32:{result = str8_lit("CEXMODEL32");}break; +case CV_SymKind_VFTABLE32_16t:{result = str8_lit("VFTABLE32_16t");}break; +case CV_SymKind_REGREL32_16t:{result = str8_lit("REGREL32_16t");}break; +case CV_SymKind_LTHREAD32_16t:{result = str8_lit("LTHREAD32_16t");}break; +case CV_SymKind_GTHREAD32_16t:{result = str8_lit("GTHREAD32_16t");}break; +case CV_SymKind_SLINK32:{result = str8_lit("SLINK32");}break; +case CV_SymKind_LPROCMIPS_16t:{result = str8_lit("LPROCMIPS_16t");}break; +case CV_SymKind_GPROCMIPS_16t:{result = str8_lit("GPROCMIPS_16t");}break; +case CV_SymKind_PROCREF_ST:{result = str8_lit("PROCREF_ST");}break; +case CV_SymKind_DATAREF_ST:{result = str8_lit("DATAREF_ST");}break; +case CV_SymKind_ALIGN:{result = str8_lit("ALIGN");}break; +case CV_SymKind_LPROCREF_ST:{result = str8_lit("LPROCREF_ST");}break; +case CV_SymKind_OEM:{result = str8_lit("OEM");}break; +case CV_SymKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; +case CV_SymKind_CONSTANT_ST:{result = str8_lit("CONSTANT_ST");}break; +case CV_SymKind_UDT_ST:{result = str8_lit("UDT_ST");}break; +case CV_SymKind_COBOLUDT_ST:{result = str8_lit("COBOLUDT_ST");}break; +case CV_SymKind_MANYREG_ST:{result = str8_lit("MANYREG_ST");}break; +case CV_SymKind_BPREL32_ST:{result = str8_lit("BPREL32_ST");}break; +case CV_SymKind_LDATA32_ST:{result = str8_lit("LDATA32_ST");}break; +case CV_SymKind_GDATA32_ST:{result = str8_lit("GDATA32_ST");}break; +case CV_SymKind_PUB32_ST:{result = str8_lit("PUB32_ST");}break; +case CV_SymKind_LPROC32_ST:{result = str8_lit("LPROC32_ST");}break; +case CV_SymKind_GPROC32_ST:{result = str8_lit("GPROC32_ST");}break; +case CV_SymKind_VFTABLE32:{result = str8_lit("VFTABLE32");}break; +case CV_SymKind_REGREL32_ST:{result = str8_lit("REGREL32_ST");}break; +case CV_SymKind_LTHREAD32_ST:{result = str8_lit("LTHREAD32_ST");}break; +case CV_SymKind_GTHREAD32_ST:{result = str8_lit("GTHREAD32_ST");}break; +case CV_SymKind_LPROCMIPS_ST:{result = str8_lit("LPROCMIPS_ST");}break; +case CV_SymKind_GPROCMIPS_ST:{result = str8_lit("GPROCMIPS_ST");}break; +case CV_SymKind_FRAMEPROC:{result = str8_lit("FRAMEPROC");}break; +case CV_SymKind_COMPILE2_ST:{result = str8_lit("COMPILE2_ST");}break; +case CV_SymKind_MANYREG2_ST:{result = str8_lit("MANYREG2_ST");}break; +case CV_SymKind_LPROCIA64_ST:{result = str8_lit("LPROCIA64_ST");}break; +case CV_SymKind_GPROCIA64_ST:{result = str8_lit("GPROCIA64_ST");}break; +case CV_SymKind_LOCALSLOT_ST:{result = str8_lit("LOCALSLOT_ST");}break; +case CV_SymKind_PARAMSLOT_ST:{result = str8_lit("PARAMSLOT_ST");}break; +case CV_SymKind_ANNOTATION:{result = str8_lit("ANNOTATION");}break; +case CV_SymKind_GMANPROC_ST:{result = str8_lit("GMANPROC_ST");}break; +case CV_SymKind_LMANPROC_ST:{result = str8_lit("LMANPROC_ST");}break; +case CV_SymKind_RESERVED1:{result = str8_lit("RESERVED1");}break; +case CV_SymKind_RESERVED2:{result = str8_lit("RESERVED2");}break; +case CV_SymKind_RESERVED3:{result = str8_lit("RESERVED3");}break; +case CV_SymKind_RESERVED4:{result = str8_lit("RESERVED4");}break; +case CV_SymKind_LMANDATA_ST:{result = str8_lit("LMANDATA_ST");}break; +case CV_SymKind_GMANDATA_ST:{result = str8_lit("GMANDATA_ST");}break; +case CV_SymKind_MANFRAMEREL_ST:{result = str8_lit("MANFRAMEREL_ST");}break; +case CV_SymKind_MANREGISTER_ST:{result = str8_lit("MANREGISTER_ST");}break; +case CV_SymKind_MANSLOT_ST:{result = str8_lit("MANSLOT_ST");}break; +case CV_SymKind_MANMANYREG_ST:{result = str8_lit("MANMANYREG_ST");}break; +case CV_SymKind_MANREGREL_ST:{result = str8_lit("MANREGREL_ST");}break; +case CV_SymKind_MANMANYREG2_ST:{result = str8_lit("MANMANYREG2_ST");}break; +case CV_SymKind_MANTYPREF:{result = str8_lit("MANTYPREF");}break; +case CV_SymKind_UNAMESPACE_ST:{result = str8_lit("UNAMESPACE_ST");}break; +case CV_SymKind_ST_MAX:{result = str8_lit("ST_MAX");}break; +case CV_SymKind_OBJNAME:{result = str8_lit("OBJNAME");}break; +case CV_SymKind_THUNK32:{result = str8_lit("THUNK32");}break; +case CV_SymKind_BLOCK32:{result = str8_lit("BLOCK32");}break; +case CV_SymKind_WITH32:{result = str8_lit("WITH32");}break; +case CV_SymKind_LABEL32:{result = str8_lit("LABEL32");}break; +case CV_SymKind_REGISTER:{result = str8_lit("REGISTER");}break; +case CV_SymKind_CONSTANT:{result = str8_lit("CONSTANT");}break; +case CV_SymKind_UDT:{result = str8_lit("UDT");}break; +case CV_SymKind_COBOLUDT:{result = str8_lit("COBOLUDT");}break; +case CV_SymKind_MANYREG:{result = str8_lit("MANYREG");}break; +case CV_SymKind_BPREL32:{result = str8_lit("BPREL32");}break; +case CV_SymKind_LDATA32:{result = str8_lit("LDATA32");}break; +case CV_SymKind_GDATA32:{result = str8_lit("GDATA32");}break; +case CV_SymKind_PUB32:{result = str8_lit("PUB32");}break; +case CV_SymKind_LPROC32:{result = str8_lit("LPROC32");}break; +case CV_SymKind_GPROC32:{result = str8_lit("GPROC32");}break; +case CV_SymKind_REGREL32:{result = str8_lit("REGREL32");}break; +case CV_SymKind_LTHREAD32:{result = str8_lit("LTHREAD32");}break; +case CV_SymKind_GTHREAD32:{result = str8_lit("GTHREAD32");}break; +case CV_SymKind_LPROCMIPS:{result = str8_lit("LPROCMIPS");}break; +case CV_SymKind_GPROCMIPS:{result = str8_lit("GPROCMIPS");}break; +case CV_SymKind_COMPILE2:{result = str8_lit("COMPILE2");}break; +case CV_SymKind_MANYREG2:{result = str8_lit("MANYREG2");}break; +case CV_SymKind_LPROCIA64:{result = str8_lit("LPROCIA64");}break; +case CV_SymKind_GPROCIA64:{result = str8_lit("GPROCIA64");}break; +case CV_SymKind_LOCALSLOT:{result = str8_lit("LOCALSLOT");}break; +case CV_SymKind_PARAMSLOT:{result = str8_lit("PARAMSLOT");}break; +case CV_SymKind_LMANDATA:{result = str8_lit("LMANDATA");}break; +case CV_SymKind_GMANDATA:{result = str8_lit("GMANDATA");}break; +case CV_SymKind_MANFRAMEREL:{result = str8_lit("MANFRAMEREL");}break; +case CV_SymKind_MANREGISTER:{result = str8_lit("MANREGISTER");}break; +case CV_SymKind_MANSLOT:{result = str8_lit("MANSLOT");}break; +case CV_SymKind_MANMANYREG:{result = str8_lit("MANMANYREG");}break; +case CV_SymKind_MANREGREL:{result = str8_lit("MANREGREL");}break; +case CV_SymKind_MANMANYREG2:{result = str8_lit("MANMANYREG2");}break; +case CV_SymKind_UNAMESPACE:{result = str8_lit("UNAMESPACE");}break; +case CV_SymKind_PROCREF:{result = str8_lit("PROCREF");}break; +case CV_SymKind_DATAREF:{result = str8_lit("DATAREF");}break; +case CV_SymKind_LPROCREF:{result = str8_lit("LPROCREF");}break; +case CV_SymKind_ANNOTATIONREF:{result = str8_lit("ANNOTATIONREF");}break; +case CV_SymKind_TOKENREF:{result = str8_lit("TOKENREF");}break; +case CV_SymKind_GMANPROC:{result = str8_lit("GMANPROC");}break; +case CV_SymKind_LMANPROC:{result = str8_lit("LMANPROC");}break; +case CV_SymKind_TRAMPOLINE:{result = str8_lit("TRAMPOLINE");}break; +case CV_SymKind_MANCONSTANT:{result = str8_lit("MANCONSTANT");}break; +case CV_SymKind_ATTR_FRAMEREL:{result = str8_lit("ATTR_FRAMEREL");}break; +case CV_SymKind_ATTR_REGISTER:{result = str8_lit("ATTR_REGISTER");}break; +case CV_SymKind_ATTR_REGREL:{result = str8_lit("ATTR_REGREL");}break; +case CV_SymKind_ATTR_MANYREG:{result = str8_lit("ATTR_MANYREG");}break; +case CV_SymKind_SEPCODE:{result = str8_lit("SEPCODE");}break; +case CV_SymKind_DEFRANGE_2005:{result = str8_lit("DEFRANGE_2005");}break; +case CV_SymKind_DEFRANGE2_2005:{result = str8_lit("DEFRANGE2_2005");}break; +case CV_SymKind_SECTION:{result = str8_lit("SECTION");}break; +case CV_SymKind_COFFGROUP:{result = str8_lit("COFFGROUP");}break; +case CV_SymKind_EXPORT:{result = str8_lit("EXPORT");}break; +case CV_SymKind_CALLSITEINFO:{result = str8_lit("CALLSITEINFO");}break; +case CV_SymKind_FRAMECOOKIE:{result = str8_lit("FRAMECOOKIE");}break; +case CV_SymKind_DISCARDED:{result = str8_lit("DISCARDED");}break; +case CV_SymKind_COMPILE3:{result = str8_lit("COMPILE3");}break; +case CV_SymKind_ENVBLOCK:{result = str8_lit("ENVBLOCK");}break; +case CV_SymKind_LOCAL:{result = str8_lit("LOCAL");}break; +case CV_SymKind_DEFRANGE:{result = str8_lit("DEFRANGE");}break; +case CV_SymKind_DEFRANGE_SUBFIELD:{result = str8_lit("DEFRANGE_SUBFIELD");}break; +case CV_SymKind_DEFRANGE_REGISTER:{result = str8_lit("DEFRANGE_REGISTER");}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL");}break; +case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = str8_lit("DEFRANGE_SUBFIELD_REGISTER");}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE");}break; +case CV_SymKind_DEFRANGE_REGISTER_REL:{result = str8_lit("DEFRANGE_REGISTER_REL");}break; +case CV_SymKind_LPROC32_ID:{result = str8_lit("LPROC32_ID");}break; +case CV_SymKind_GPROC32_ID:{result = str8_lit("GPROC32_ID");}break; +case CV_SymKind_LPROCMIPS_ID:{result = str8_lit("LPROCMIPS_ID");}break; +case CV_SymKind_GPROCMIPS_ID:{result = str8_lit("GPROCMIPS_ID");}break; +case CV_SymKind_LPROCIA64_ID:{result = str8_lit("LPROCIA64_ID");}break; +case CV_SymKind_GPROCIA64_ID:{result = str8_lit("GPROCIA64_ID");}break; +case CV_SymKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; +case CV_SymKind_INLINESITE:{result = str8_lit("INLINESITE");}break; +case CV_SymKind_INLINESITE_END:{result = str8_lit("INLINESITE_END");}break; +case CV_SymKind_PROC_ID_END:{result = str8_lit("PROC_ID_END");}break; +case CV_SymKind_DEFRANGE_HLSL:{result = str8_lit("DEFRANGE_HLSL");}break; +case CV_SymKind_GDATA_HLSL:{result = str8_lit("GDATA_HLSL");}break; +case CV_SymKind_LDATA_HLSL:{result = str8_lit("LDATA_HLSL");}break; +case CV_SymKind_FILESTATIC:{result = str8_lit("FILESTATIC");}break; +case CV_SymKind_LPROC32_DPC:{result = str8_lit("LPROC32_DPC");}break; +case CV_SymKind_LPROC32_DPC_ID:{result = str8_lit("LPROC32_DPC_ID");}break; +case CV_SymKind_DEFRANGE_DPC_PTR_TAG:{result = str8_lit("DEFRANGE_DPC_PTR_TAG");}break; +case CV_SymKind_DPC_SYM_TAG_MAP:{result = str8_lit("DPC_SYM_TAG_MAP");}break; +case CV_SymKind_ARMSWITCHTABLE:{result = str8_lit("ARMSWITCHTABLE");}break; +case CV_SymKind_CALLEES:{result = str8_lit("CALLEES");}break; +case CV_SymKind_CALLERS:{result = str8_lit("CALLERS");}break; +case CV_SymKind_POGODATA:{result = str8_lit("POGODATA");}break; +case CV_SymKind_INLINESITE2:{result = str8_lit("INLINESITE2");}break; +case CV_SymKind_HEAPALLOCSITE:{result = str8_lit("HEAPALLOCSITE");}break; +case CV_SymKind_MOD_TYPEREF:{result = str8_lit("MOD_TYPEREF");}break; +case CV_SymKind_REF_MINIPDB:{result = str8_lit("REF_MINIPDB");}break; +case CV_SymKind_PDBMAP:{result = str8_lit("PDBMAP");}break; +case CV_SymKind_GDATA_HLSL32:{result = str8_lit("GDATA_HLSL32");}break; +case CV_SymKind_LDATA_HLSL32:{result = str8_lit("LDATA_HLSL32");}break; +case CV_SymKind_GDATA_HLSL32_EX:{result = str8_lit("GDATA_HLSL32_EX");}break; +case CV_SymKind_LDATA_HLSL32_EX:{result = str8_lit("LDATA_HLSL32_EX");}break; +case CV_SymKind_FASTLINK:{result = str8_lit("FASTLINK");}break; +case CV_SymKind_INLINEES:{result = str8_lit("INLINEES");}break; +} +return result; +} + +internal String8 +cv_string_from_leaf_kind(CV_LeafKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_LeafKind_MODIFIER_16t:{result = str8_lit("MODIFIER_16t");}break; +case CV_LeafKind_POINTER_16t:{result = str8_lit("POINTER_16t");}break; +case CV_LeafKind_ARRAY_16t:{result = str8_lit("ARRAY_16t");}break; +case CV_LeafKind_CLASS_16t:{result = str8_lit("CLASS_16t");}break; +case CV_LeafKind_STRUCTURE_16t:{result = str8_lit("STRUCTURE_16t");}break; +case CV_LeafKind_UNION_16t:{result = str8_lit("UNION_16t");}break; +case CV_LeafKind_ENUM_16t:{result = str8_lit("ENUM_16t");}break; +case CV_LeafKind_PROCEDURE_16t:{result = str8_lit("PROCEDURE_16t");}break; +case CV_LeafKind_MFUNCTION_16t:{result = str8_lit("MFUNCTION_16t");}break; +case CV_LeafKind_VTSHAPE:{result = str8_lit("VTSHAPE");}break; +case CV_LeafKind_COBOL0_16t:{result = str8_lit("COBOL0_16t");}break; +case CV_LeafKind_COBOL1:{result = str8_lit("COBOL1");}break; +case CV_LeafKind_BARRAY_16t:{result = str8_lit("BARRAY_16t");}break; +case CV_LeafKind_LABEL:{result = str8_lit("LABEL");}break; +case CV_LeafKind_NULL:{result = str8_lit("NULL");}break; +case CV_LeafKind_NOTTRAN:{result = str8_lit("NOTTRAN");}break; +case CV_LeafKind_DIMARRAY_16t:{result = str8_lit("DIMARRAY_16t");}break; +case CV_LeafKind_VFTPATH_16t:{result = str8_lit("VFTPATH_16t");}break; +case CV_LeafKind_PRECOMP_16t:{result = str8_lit("PRECOMP_16t");}break; +case CV_LeafKind_ENDPRECOMP:{result = str8_lit("ENDPRECOMP");}break; +case CV_LeafKind_OEM_16t:{result = str8_lit("OEM_16t");}break; +case CV_LeafKind_TYPESERVER_ST:{result = str8_lit("TYPESERVER_ST");}break; +case CV_LeafKind_SKIP_16t:{result = str8_lit("SKIP_16t");}break; +case CV_LeafKind_ARGLIST_16t:{result = str8_lit("ARGLIST_16t");}break; +case CV_LeafKind_DEFARG_16t:{result = str8_lit("DEFARG_16t");}break; +case CV_LeafKind_LIST:{result = str8_lit("LIST");}break; +case CV_LeafKind_FIELDLIST_16t:{result = str8_lit("FIELDLIST_16t");}break; +case CV_LeafKind_DERIVED_16t:{result = str8_lit("DERIVED_16t");}break; +case CV_LeafKind_BITFIELD_16t:{result = str8_lit("BITFIELD_16t");}break; +case CV_LeafKind_METHODLIST_16t:{result = str8_lit("METHODLIST_16t");}break; +case CV_LeafKind_DIMCONU_16t:{result = str8_lit("DIMCONU_16t");}break; +case CV_LeafKind_DIMCONLU_16t:{result = str8_lit("DIMCONLU_16t");}break; +case CV_LeafKind_DIMVARU_16t:{result = str8_lit("DIMVARU_16t");}break; +case CV_LeafKind_DIMVARLU_16t:{result = str8_lit("DIMVARLU_16t");}break; +case CV_LeafKind_REFSYM:{result = str8_lit("REFSYM");}break; +case CV_LeafKind_BCLASS_16t:{result = str8_lit("BCLASS_16t");}break; +case CV_LeafKind_VBCLASS_16t:{result = str8_lit("VBCLASS_16t");}break; +case CV_LeafKind_IVBCLASS_16t:{result = str8_lit("IVBCLASS_16t");}break; +case CV_LeafKind_ENUMERATE_ST:{result = str8_lit("ENUMERATE_ST");}break; +case CV_LeafKind_FRIENDFCN_16t:{result = str8_lit("FRIENDFCN_16t");}break; +case CV_LeafKind_INDEX_16t:{result = str8_lit("INDEX_16t");}break; +case CV_LeafKind_MEMBER_16t:{result = str8_lit("MEMBER_16t");}break; +case CV_LeafKind_STMEMBER_16t:{result = str8_lit("STMEMBER_16t");}break; +case CV_LeafKind_METHOD_16t:{result = str8_lit("METHOD_16t");}break; +case CV_LeafKind_NESTTYPE_16t:{result = str8_lit("NESTTYPE_16t");}break; +case CV_LeafKind_VFUNCTAB_16t:{result = str8_lit("VFUNCTAB_16t");}break; +case CV_LeafKind_FRIENDCLS_16t:{result = str8_lit("FRIENDCLS_16t");}break; +case CV_LeafKind_ONEMETHOD_16t:{result = str8_lit("ONEMETHOD_16t");}break; +case CV_LeafKind_VFUNCOFF_16t:{result = str8_lit("VFUNCOFF_16t");}break; +case CV_LeafKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; +case CV_LeafKind_MODIFIER:{result = str8_lit("MODIFIER");}break; +case CV_LeafKind_POINTER:{result = str8_lit("POINTER");}break; +case CV_LeafKind_ARRAY_ST:{result = str8_lit("ARRAY_ST");}break; +case CV_LeafKind_CLASS_ST:{result = str8_lit("CLASS_ST");}break; +case CV_LeafKind_STRUCTURE_ST:{result = str8_lit("STRUCTURE_ST");}break; +case CV_LeafKind_UNION_ST:{result = str8_lit("UNION_ST");}break; +case CV_LeafKind_ENUM_ST:{result = str8_lit("ENUM_ST");}break; +case CV_LeafKind_PROCEDURE:{result = str8_lit("PROCEDURE");}break; +case CV_LeafKind_MFUNCTION:{result = str8_lit("MFUNCTION");}break; +case CV_LeafKind_COBOL0:{result = str8_lit("COBOL0");}break; +case CV_LeafKind_BARRAY:{result = str8_lit("BARRAY");}break; +case CV_LeafKind_DIMARRAY_ST:{result = str8_lit("DIMARRAY_ST");}break; +case CV_LeafKind_VFTPATH:{result = str8_lit("VFTPATH");}break; +case CV_LeafKind_PRECOMP_ST:{result = str8_lit("PRECOMP_ST");}break; +case CV_LeafKind_OEM:{result = str8_lit("OEM");}break; +case CV_LeafKind_ALIAS_ST:{result = str8_lit("ALIAS_ST");}break; +case CV_LeafKind_OEM2:{result = str8_lit("OEM2");}break; +case CV_LeafKind_SKIP:{result = str8_lit("SKIP");}break; +case CV_LeafKind_ARGLIST:{result = str8_lit("ARGLIST");}break; +case CV_LeafKind_DEFARG_ST:{result = str8_lit("DEFARG_ST");}break; +case CV_LeafKind_FIELDLIST:{result = str8_lit("FIELDLIST");}break; +case CV_LeafKind_DERIVED:{result = str8_lit("DERIVED");}break; +case CV_LeafKind_BITFIELD:{result = str8_lit("BITFIELD");}break; +case CV_LeafKind_METHODLIST:{result = str8_lit("METHODLIST");}break; +case CV_LeafKind_DIMCONU:{result = str8_lit("DIMCONU");}break; +case CV_LeafKind_DIMCONLU:{result = str8_lit("DIMCONLU");}break; +case CV_LeafKind_DIMVARU:{result = str8_lit("DIMVARU");}break; +case CV_LeafKind_DIMVARLU:{result = str8_lit("DIMVARLU");}break; +case CV_LeafKind_BCLASS:{result = str8_lit("BCLASS");}break; +case CV_LeafKind_VBCLASS:{result = str8_lit("VBCLASS");}break; +case CV_LeafKind_IVBCLASS:{result = str8_lit("IVBCLASS");}break; +case CV_LeafKind_FRIENDFCN_ST:{result = str8_lit("FRIENDFCN_ST");}break; +case CV_LeafKind_INDEX:{result = str8_lit("INDEX");}break; +case CV_LeafKind_MEMBER_ST:{result = str8_lit("MEMBER_ST");}break; +case CV_LeafKind_STMEMBER_ST:{result = str8_lit("STMEMBER_ST");}break; +case CV_LeafKind_METHOD_ST:{result = str8_lit("METHOD_ST");}break; +case CV_LeafKind_NESTTYPE_ST:{result = str8_lit("NESTTYPE_ST");}break; +case CV_LeafKind_VFUNCTAB:{result = str8_lit("VFUNCTAB");}break; +case CV_LeafKind_FRIENDCLS:{result = str8_lit("FRIENDCLS");}break; +case CV_LeafKind_ONEMETHOD_ST:{result = str8_lit("ONEMETHOD_ST");}break; +case CV_LeafKind_VFUNCOFF:{result = str8_lit("VFUNCOFF");}break; +case CV_LeafKind_NESTTYPEEX_ST:{result = str8_lit("NESTTYPEEX_ST");}break; +case CV_LeafKind_MEMBERMODIFY_ST:{result = str8_lit("MEMBERMODIFY_ST");}break; +case CV_LeafKind_MANAGED_ST:{result = str8_lit("MANAGED_ST");}break; +case CV_LeafKind_ST_MAX:{result = str8_lit("ST_MAX");}break; +case CV_LeafKind_TYPESERVER:{result = str8_lit("TYPESERVER");}break; +case CV_LeafKind_ENUMERATE:{result = str8_lit("ENUMERATE");}break; +case CV_LeafKind_ARRAY:{result = str8_lit("ARRAY");}break; +case CV_LeafKind_CLASS:{result = str8_lit("CLASS");}break; +case CV_LeafKind_STRUCTURE:{result = str8_lit("STRUCTURE");}break; +case CV_LeafKind_UNION:{result = str8_lit("UNION");}break; +case CV_LeafKind_ENUM:{result = str8_lit("ENUM");}break; +case CV_LeafKind_DIMARRAY:{result = str8_lit("DIMARRAY");}break; +case CV_LeafKind_PRECOMP:{result = str8_lit("PRECOMP");}break; +case CV_LeafKind_ALIAS:{result = str8_lit("ALIAS");}break; +case CV_LeafKind_DEFARG:{result = str8_lit("DEFARG");}break; +case CV_LeafKind_FRIENDFCN:{result = str8_lit("FRIENDFCN");}break; +case CV_LeafKind_MEMBER:{result = str8_lit("MEMBER");}break; +case CV_LeafKind_STMEMBER:{result = str8_lit("STMEMBER");}break; +case CV_LeafKind_METHOD:{result = str8_lit("METHOD");}break; +case CV_LeafKind_NESTTYPE:{result = str8_lit("NESTTYPE");}break; +case CV_LeafKind_ONEMETHOD:{result = str8_lit("ONEMETHOD");}break; +case CV_LeafKind_NESTTYPEEX:{result = str8_lit("NESTTYPEEX");}break; +case CV_LeafKind_MEMBERMODIFY:{result = str8_lit("MEMBERMODIFY");}break; +case CV_LeafKind_MANAGED:{result = str8_lit("MANAGED");}break; +case CV_LeafKind_TYPESERVER2:{result = str8_lit("TYPESERVER2");}break; +case CV_LeafKind_STRIDED_ARRAY:{result = str8_lit("STRIDED_ARRAY");}break; +case CV_LeafKind_HLSL:{result = str8_lit("HLSL");}break; +case CV_LeafKind_MODIFIER_EX:{result = str8_lit("MODIFIER_EX");}break; +case CV_LeafKind_INTERFACE:{result = str8_lit("INTERFACE");}break; +case CV_LeafKind_BINTERFACE:{result = str8_lit("BINTERFACE");}break; +case CV_LeafKind_VECTOR:{result = str8_lit("VECTOR");}break; +case CV_LeafKind_MATRIX:{result = str8_lit("MATRIX");}break; +case CV_LeafKind_VFTABLE:{result = str8_lit("VFTABLE");}break; +case CV_LeafKind_CLASS2:{result = str8_lit("CLASS2");}break; +case CV_LeafKind_STRUCT2:{result = str8_lit("STRUCT2");}break; +} +return result; +} + +C_LINKAGE_BEGIN +C_LINKAGE_END + diff --git a/src/codeview/generated/codeview.meta.h b/src/codeview/generated/codeview.meta.h new file mode 100644 index 00000000..a04b4f8c --- /dev/null +++ b/src/codeview/generated/codeview.meta.h @@ -0,0 +1,461 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef CODEVIEW_META_H +#define CODEVIEW_META_H + +typedef U16 CV_NumericKind; +typedef enum CV_NumericKindEnum +{ +CV_NumericKind_CHAR = 0x8000, +CV_NumericKind_SHORT = 0x8001, +CV_NumericKind_USHORT = 0x8002, +CV_NumericKind_LONG = 0x8003, +CV_NumericKind_ULONG = 0x8004, +CV_NumericKind_FLOAT32 = 0x8005, +CV_NumericKind_FLOAT64 = 0x8006, +CV_NumericKind_FLOAT80 = 0x8007, +CV_NumericKind_FLOAT128 = 0x8008, +CV_NumericKind_QUADWORD = 0x8009, +CV_NumericKind_UQUADWORD = 0x800a, +CV_NumericKind_FLOAT48 = 0x800b, +CV_NumericKind_COMPLEX32 = 0x800c, +CV_NumericKind_COMPLEX64 = 0x800d, +CV_NumericKind_COMPLEX80 = 0x800e, +CV_NumericKind_COMPLEX128 = 0x800f, +CV_NumericKind_VARSTRING = 0x8010, +CV_NumericKind_OCTWORD = 0x8017, +CV_NumericKind_UOCTWORD = 0x8018, +CV_NumericKind_DECIMAL = 0x8019, +CV_NumericKind_DATE = 0x801a, +CV_NumericKind_UTF8STRING = 0x801b, +CV_NumericKind_FLOAT16 = 0x801c, +} CV_NumericKindEnum; + +typedef U16 CV_Arch; +typedef enum CV_ArchEnum +{ +CV_Arch_8080 = 0x00, +CV_Arch_8086 = 0x01, +CV_Arch_80286 = 0x02, +CV_Arch_80386 = 0x03, +CV_Arch_80486 = 0x04, +CV_Arch_PENTIUM = 0x05, +CV_Arch_PENTIUMII = 0x06, +CV_Arch_PENTIUMIII = 0x07, +CV_Arch_MIPS = 0x10, +CV_Arch_MIPS16 = 0x11, +CV_Arch_MIPS32 = 0x12, +CV_Arch_MIPS64 = 0x13, +CV_Arch_MIPSI = 0x14, +CV_Arch_MIPSII = 0x15, +CV_Arch_MIPSIII = 0x16, +CV_Arch_MIPSIV = 0x17, +CV_Arch_MIPSV = 0x18, +CV_Arch_M68000 = 0x20, +CV_Arch_M68010 = 0x21, +CV_Arch_M68020 = 0x22, +CV_Arch_M68030 = 0x23, +CV_Arch_M68040 = 0x24, +CV_Arch_ALPHA = 0x30, +CV_Arch_ALPHA_21164 = 0x31, +CV_Arch_ALPHA_21164A = 0x32, +CV_Arch_ALPHA_21264 = 0x33, +CV_Arch_ALPHA_21364 = 0x34, +CV_Arch_PPC601 = 0x40, +CV_Arch_PPC603 = 0x41, +CV_Arch_PPC604 = 0x42, +CV_Arch_PPC620 = 0x43, +CV_Arch_PPCFP = 0x44, +CV_Arch_PPCBE = 0x45, +CV_Arch_SH3 = 0x50, +CV_Arch_SH3E = 0x51, +CV_Arch_SH3DSP = 0x52, +CV_Arch_SH4 = 0x53, +CV_Arch_SHMEDIA = 0x54, +CV_Arch_ARM3 = 0x60, +CV_Arch_ARM4 = 0x61, +CV_Arch_ARM4T = 0x62, +CV_Arch_ARM5 = 0x63, +CV_Arch_ARM5T = 0x64, +CV_Arch_ARM6 = 0x65, +CV_Arch_ARM_XMAC = 0x66, +CV_Arch_ARM_WMMX = 0x67, +CV_Arch_ARM7 = 0x68, +CV_Arch_OMNI = 0x70, +CV_Arch_IA64_1 = 0x80, +CV_Arch_IA64_2 = 0x81, +CV_Arch_CEE = 0x90, +CV_Arch_AM33 = 0xA0, +CV_Arch_M32R = 0xB0, +CV_Arch_TRICORE = 0xC0, +CV_Arch_X64 = 0xD0, +CV_Arch_EBC = 0xE0, +CV_Arch_THUMB = 0xF0, +CV_Arch_ARMNT = 0xF4, +CV_Arch_ARM64 = 0xF6, +CV_Arch_D3D11_SHADER = 0x100, +CV_Arch_IA64 = CV_Arch_IA64_1, +CV_Arch_PENTIUMPRO = CV_Arch_PENTIUMII, +CV_Arch_MIPSR4000 = CV_Arch_MIPS, +CV_Arch_ALPHA_21064 = CV_Arch_ALPHA, +CV_Arch_AMD64 = CV_Arch_X64, +} CV_ArchEnum; + +typedef U16 CV_AllReg; +typedef enum CV_AllRegEnum +{ +CV_AllReg_ERR = 30000, +CV_AllReg_TEB = 30001, +CV_AllReg_TIMER = 30002, +CV_AllReg_EFAD1 = 30003, +CV_AllReg_EFAD2 = 30004, +CV_AllReg_EFAD3 = 30005, +CV_AllReg_VFRAME = 30006, +CV_AllReg_HANDLE = 30007, +CV_AllReg_PARAMS = 30008, +CV_AllReg_LOCALS = 30009, +CV_AllReg_TID = 30010, +CV_AllReg_ENV = 30011, +CV_AllReg_CMDLN = 30012, +} CV_AllRegEnum; + +typedef U16 CV_SymKind; +typedef enum CV_SymKindEnum +{ +CV_SymKind_COMPILE = 0x0001, +CV_SymKind_REGISTER_16t = 0x0002, +CV_SymKind_CONSTANT_16t = 0x0003, +CV_SymKind_UDT_16t = 0x0004, +CV_SymKind_SSEARCH = 0x0005, +CV_SymKind_END = 0x0006, +CV_SymKind_SKIP = 0x0007, +CV_SymKind_CVRESERVE = 0x0008, +CV_SymKind_OBJNAME_ST = 0x0009, +CV_SymKind_ENDARG = 0x000a, +CV_SymKind_COBOLUDT_16t = 0x000b, +CV_SymKind_MANYREG_16t = 0x000c, +CV_SymKind_RETURN = 0x000d, +CV_SymKind_ENTRYTHIS = 0x000e, +CV_SymKind_BPREL16 = 0x0100, +CV_SymKind_LDATA16 = 0x0101, +CV_SymKind_GDATA16 = 0x0102, +CV_SymKind_PUB16 = 0x0103, +CV_SymKind_LPROC16 = 0x0104, +CV_SymKind_GPROC16 = 0x0105, +CV_SymKind_THUNK16 = 0x0106, +CV_SymKind_BLOCK16 = 0x0107, +CV_SymKind_WITH16 = 0x0108, +CV_SymKind_LABEL16 = 0x0109, +CV_SymKind_CEXMODEL16 = 0x010a, +CV_SymKind_VFTABLE16 = 0x010b, +CV_SymKind_REGREL16 = 0x010c, +CV_SymKind_BPREL32_16t = 0x0200, +CV_SymKind_LDATA32_16t = 0x0201, +CV_SymKind_GDATA32_16t = 0x0202, +CV_SymKind_PUB32_16t = 0x0203, +CV_SymKind_LPROC32_16t = 0x0204, +CV_SymKind_GPROC32_16t = 0x0205, +CV_SymKind_THUNK32_ST = 0x0206, +CV_SymKind_BLOCK32_ST = 0x0207, +CV_SymKind_WITH32_ST = 0x0208, +CV_SymKind_LABEL32_ST = 0x0209, +CV_SymKind_CEXMODEL32 = 0x020a, +CV_SymKind_VFTABLE32_16t = 0x020b, +CV_SymKind_REGREL32_16t = 0x020c, +CV_SymKind_LTHREAD32_16t = 0x020d, +CV_SymKind_GTHREAD32_16t = 0x020e, +CV_SymKind_SLINK32 = 0x020f, +CV_SymKind_LPROCMIPS_16t = 0x0300, +CV_SymKind_GPROCMIPS_16t = 0x0301, +CV_SymKind_PROCREF_ST = 0x0400, +CV_SymKind_DATAREF_ST = 0x0401, +CV_SymKind_ALIGN = 0x0402, +CV_SymKind_LPROCREF_ST = 0x0403, +CV_SymKind_OEM = 0x0404, +CV_SymKind_TI16_MAX = 0x1000, +CV_SymKind_CONSTANT_ST = 0x1002, +CV_SymKind_UDT_ST = 0x1003, +CV_SymKind_COBOLUDT_ST = 0x1004, +CV_SymKind_MANYREG_ST = 0x1005, +CV_SymKind_BPREL32_ST = 0x1006, +CV_SymKind_LDATA32_ST = 0x1007, +CV_SymKind_GDATA32_ST = 0x1008, +CV_SymKind_PUB32_ST = 0x1009, +CV_SymKind_LPROC32_ST = 0x100a, +CV_SymKind_GPROC32_ST = 0x100b, +CV_SymKind_VFTABLE32 = 0x100c, +CV_SymKind_REGREL32_ST = 0x100d, +CV_SymKind_LTHREAD32_ST = 0x100e, +CV_SymKind_GTHREAD32_ST = 0x100f, +CV_SymKind_LPROCMIPS_ST = 0x1010, +CV_SymKind_GPROCMIPS_ST = 0x1011, +CV_SymKind_FRAMEPROC = 0x1012, +CV_SymKind_COMPILE2_ST = 0x1013, +CV_SymKind_MANYREG2_ST = 0x1014, +CV_SymKind_LPROCIA64_ST = 0x1015, +CV_SymKind_GPROCIA64_ST = 0x1016, +CV_SymKind_LOCALSLOT_ST = 0x1017, +CV_SymKind_PARAMSLOT_ST = 0x1018, +CV_SymKind_ANNOTATION = 0x1019, +CV_SymKind_GMANPROC_ST = 0x101a, +CV_SymKind_LMANPROC_ST = 0x101b, +CV_SymKind_RESERVED1 = 0x101c, +CV_SymKind_RESERVED2 = 0x101d, +CV_SymKind_RESERVED3 = 0x101e, +CV_SymKind_RESERVED4 = 0x101f, +CV_SymKind_LMANDATA_ST = 0x1020, +CV_SymKind_GMANDATA_ST = 0x1021, +CV_SymKind_MANFRAMEREL_ST = 0x1022, +CV_SymKind_MANREGISTER_ST = 0x1023, +CV_SymKind_MANSLOT_ST = 0x1024, +CV_SymKind_MANMANYREG_ST = 0x1025, +CV_SymKind_MANREGREL_ST = 0x1026, +CV_SymKind_MANMANYREG2_ST = 0x1027, +CV_SymKind_MANTYPREF = 0x1028, +CV_SymKind_UNAMESPACE_ST = 0x1029, +CV_SymKind_ST_MAX = 0x1100, +CV_SymKind_OBJNAME = 0x1101, +CV_SymKind_THUNK32 = 0x1102, +CV_SymKind_BLOCK32 = 0x1103, +CV_SymKind_WITH32 = 0x1104, +CV_SymKind_LABEL32 = 0x1105, +CV_SymKind_REGISTER = 0x1106, +CV_SymKind_CONSTANT = 0x1107, +CV_SymKind_UDT = 0x1108, +CV_SymKind_COBOLUDT = 0x1109, +CV_SymKind_MANYREG = 0x110a, +CV_SymKind_BPREL32 = 0x110b, +CV_SymKind_LDATA32 = 0x110c, +CV_SymKind_GDATA32 = 0x110d, +CV_SymKind_PUB32 = 0x110e, +CV_SymKind_LPROC32 = 0x110f, +CV_SymKind_GPROC32 = 0x1110, +CV_SymKind_REGREL32 = 0x1111, +CV_SymKind_LTHREAD32 = 0x1112, +CV_SymKind_GTHREAD32 = 0x1113, +CV_SymKind_LPROCMIPS = 0x1114, +CV_SymKind_GPROCMIPS = 0x1115, +CV_SymKind_COMPILE2 = 0x1116, +CV_SymKind_MANYREG2 = 0x1117, +CV_SymKind_LPROCIA64 = 0x1118, +CV_SymKind_GPROCIA64 = 0x1119, +CV_SymKind_LOCALSLOT = 0x111a, +CV_SymKind_PARAMSLOT = 0x111b, +CV_SymKind_LMANDATA = 0x111c, +CV_SymKind_GMANDATA = 0x111d, +CV_SymKind_MANFRAMEREL = 0x111e, +CV_SymKind_MANREGISTER = 0x111f, +CV_SymKind_MANSLOT = 0x1120, +CV_SymKind_MANMANYREG = 0x1121, +CV_SymKind_MANREGREL = 0x1122, +CV_SymKind_MANMANYREG2 = 0x1123, +CV_SymKind_UNAMESPACE = 0x1124, +CV_SymKind_PROCREF = 0x1125, +CV_SymKind_DATAREF = 0x1126, +CV_SymKind_LPROCREF = 0x1127, +CV_SymKind_ANNOTATIONREF = 0x1128, +CV_SymKind_TOKENREF = 0x1129, +CV_SymKind_GMANPROC = 0x112a, +CV_SymKind_LMANPROC = 0x112b, +CV_SymKind_TRAMPOLINE = 0x112c, +CV_SymKind_MANCONSTANT = 0x112d, +CV_SymKind_ATTR_FRAMEREL = 0x112e, +CV_SymKind_ATTR_REGISTER = 0x112f, +CV_SymKind_ATTR_REGREL = 0x1130, +CV_SymKind_ATTR_MANYREG = 0x1131, +CV_SymKind_SEPCODE = 0x1132, +CV_SymKind_DEFRANGE_2005 = 0x1134, +CV_SymKind_DEFRANGE2_2005 = 0x1135, +CV_SymKind_SECTION = 0x1136, +CV_SymKind_COFFGROUP = 0x1137, +CV_SymKind_EXPORT = 0x1138, +CV_SymKind_CALLSITEINFO = 0x1139, +CV_SymKind_FRAMECOOKIE = 0x113a, +CV_SymKind_DISCARDED = 0x113b, +CV_SymKind_COMPILE3 = 0x113c, +CV_SymKind_ENVBLOCK = 0x113d, +CV_SymKind_LOCAL = 0x113e, +CV_SymKind_DEFRANGE = 0x113f, +CV_SymKind_DEFRANGE_SUBFIELD = 0x1140, +CV_SymKind_DEFRANGE_REGISTER = 0x1141, +CV_SymKind_DEFRANGE_FRAMEPOINTER_REL = 0x1142, +CV_SymKind_DEFRANGE_SUBFIELD_REGISTER = 0x1143, +CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE = 0x1144, +CV_SymKind_DEFRANGE_REGISTER_REL = 0x1145, +CV_SymKind_LPROC32_ID = 0x1146, +CV_SymKind_GPROC32_ID = 0x1147, +CV_SymKind_LPROCMIPS_ID = 0x1148, +CV_SymKind_GPROCMIPS_ID = 0x1149, +CV_SymKind_LPROCIA64_ID = 0x114a, +CV_SymKind_GPROCIA64_ID = 0x114b, +CV_SymKind_BUILDINFO = 0x114c, +CV_SymKind_INLINESITE = 0x114d, +CV_SymKind_INLINESITE_END = 0x114e, +CV_SymKind_PROC_ID_END = 0x114f, +CV_SymKind_DEFRANGE_HLSL = 0x1150, +CV_SymKind_GDATA_HLSL = 0x1151, +CV_SymKind_LDATA_HLSL = 0x1152, +CV_SymKind_FILESTATIC = 0x1153, +CV_SymKind_LPROC32_DPC = 0x1155, +CV_SymKind_LPROC32_DPC_ID = 0x1156, +CV_SymKind_DEFRANGE_DPC_PTR_TAG = 0x1157, +CV_SymKind_DPC_SYM_TAG_MAP = 0x1158, +CV_SymKind_ARMSWITCHTABLE = 0x1159, +CV_SymKind_CALLEES = 0x115a, +CV_SymKind_CALLERS = 0x115b, +CV_SymKind_POGODATA = 0x115c, +CV_SymKind_INLINESITE2 = 0x115d, +CV_SymKind_HEAPALLOCSITE = 0x115e, +CV_SymKind_MOD_TYPEREF = 0x115f, +CV_SymKind_REF_MINIPDB = 0x1160, +CV_SymKind_PDBMAP = 0x1161, +CV_SymKind_GDATA_HLSL32 = 0x1162, +CV_SymKind_LDATA_HLSL32 = 0x1163, +CV_SymKind_GDATA_HLSL32_EX = 0x1164, +CV_SymKind_LDATA_HLSL32_EX = 0x1165, +CV_SymKind_FASTLINK = 0x1167, +CV_SymKind_INLINEES = 0x1168, +} CV_SymKindEnum; + +typedef U16 CV_LeafKind; +typedef enum CV_LeafKindEnum +{ +CV_LeafKind_MODIFIER_16t = 0x0001, +CV_LeafKind_POINTER_16t = 0x0002, +CV_LeafKind_ARRAY_16t = 0x0003, +CV_LeafKind_CLASS_16t = 0x0004, +CV_LeafKind_STRUCTURE_16t = 0x0005, +CV_LeafKind_UNION_16t = 0x0006, +CV_LeafKind_ENUM_16t = 0x0007, +CV_LeafKind_PROCEDURE_16t = 0x0008, +CV_LeafKind_MFUNCTION_16t = 0x0009, +CV_LeafKind_VTSHAPE = 0x000a, +CV_LeafKind_COBOL0_16t = 0x000b, +CV_LeafKind_COBOL1 = 0x000c, +CV_LeafKind_BARRAY_16t = 0x000d, +CV_LeafKind_LABEL = 0x000e, +CV_LeafKind_NULL = 0x000f, +CV_LeafKind_NOTTRAN = 0x0010, +CV_LeafKind_DIMARRAY_16t = 0x0011, +CV_LeafKind_VFTPATH_16t = 0x0012, +CV_LeafKind_PRECOMP_16t = 0x0013, +CV_LeafKind_ENDPRECOMP = 0x0014, +CV_LeafKind_OEM_16t = 0x0015, +CV_LeafKind_TYPESERVER_ST = 0x0016, +CV_LeafKind_SKIP_16t = 0x0200, +CV_LeafKind_ARGLIST_16t = 0x0201, +CV_LeafKind_DEFARG_16t = 0x0202, +CV_LeafKind_LIST = 0x0203, +CV_LeafKind_FIELDLIST_16t = 0x0204, +CV_LeafKind_DERIVED_16t = 0x0205, +CV_LeafKind_BITFIELD_16t = 0x0206, +CV_LeafKind_METHODLIST_16t = 0x0207, +CV_LeafKind_DIMCONU_16t = 0x0208, +CV_LeafKind_DIMCONLU_16t = 0x0209, +CV_LeafKind_DIMVARU_16t = 0x020a, +CV_LeafKind_DIMVARLU_16t = 0x020b, +CV_LeafKind_REFSYM = 0x020c, +CV_LeafKind_BCLASS_16t = 0x0400, +CV_LeafKind_VBCLASS_16t = 0x0401, +CV_LeafKind_IVBCLASS_16t = 0x0402, +CV_LeafKind_ENUMERATE_ST = 0x0403, +CV_LeafKind_FRIENDFCN_16t = 0x0404, +CV_LeafKind_INDEX_16t = 0x0405, +CV_LeafKind_MEMBER_16t = 0x0406, +CV_LeafKind_STMEMBER_16t = 0x0407, +CV_LeafKind_METHOD_16t = 0x0408, +CV_LeafKind_NESTTYPE_16t = 0x0409, +CV_LeafKind_VFUNCTAB_16t = 0x040a, +CV_LeafKind_FRIENDCLS_16t = 0x040b, +CV_LeafKind_ONEMETHOD_16t = 0x040c, +CV_LeafKind_VFUNCOFF_16t = 0x040d, +CV_LeafKind_TI16_MAX = 0x1000, +CV_LeafKind_MODIFIER = 0x1001, +CV_LeafKind_POINTER = 0x1002, +CV_LeafKind_ARRAY_ST = 0x1003, +CV_LeafKind_CLASS_ST = 0x1004, +CV_LeafKind_STRUCTURE_ST = 0x1005, +CV_LeafKind_UNION_ST = 0x1006, +CV_LeafKind_ENUM_ST = 0x1007, +CV_LeafKind_PROCEDURE = 0x1008, +CV_LeafKind_MFUNCTION = 0x1009, +CV_LeafKind_COBOL0 = 0x100a, +CV_LeafKind_BARRAY = 0x100b, +CV_LeafKind_DIMARRAY_ST = 0x100c, +CV_LeafKind_VFTPATH = 0x100d, +CV_LeafKind_PRECOMP_ST = 0x100e, +CV_LeafKind_OEM = 0x100f, +CV_LeafKind_ALIAS_ST = 0x1010, +CV_LeafKind_OEM2 = 0x1011, +CV_LeafKind_SKIP = 0x1200, +CV_LeafKind_ARGLIST = 0x1201, +CV_LeafKind_DEFARG_ST = 0x1202, +CV_LeafKind_FIELDLIST = 0x1203, +CV_LeafKind_DERIVED = 0x1204, +CV_LeafKind_BITFIELD = 0x1205, +CV_LeafKind_METHODLIST = 0x1206, +CV_LeafKind_DIMCONU = 0x1207, +CV_LeafKind_DIMCONLU = 0x1208, +CV_LeafKind_DIMVARU = 0x1209, +CV_LeafKind_DIMVARLU = 0x120a, +CV_LeafKind_BCLASS = 0x1400, +CV_LeafKind_VBCLASS = 0x1401, +CV_LeafKind_IVBCLASS = 0x1402, +CV_LeafKind_FRIENDFCN_ST = 0x1403, +CV_LeafKind_INDEX = 0x1404, +CV_LeafKind_MEMBER_ST = 0x1405, +CV_LeafKind_STMEMBER_ST = 0x1406, +CV_LeafKind_METHOD_ST = 0x1407, +CV_LeafKind_NESTTYPE_ST = 0x1408, +CV_LeafKind_VFUNCTAB = 0x1409, +CV_LeafKind_FRIENDCLS = 0x140a, +CV_LeafKind_ONEMETHOD_ST = 0x140b, +CV_LeafKind_VFUNCOFF = 0x140c, +CV_LeafKind_NESTTYPEEX_ST = 0x140d, +CV_LeafKind_MEMBERMODIFY_ST = 0x140e, +CV_LeafKind_MANAGED_ST = 0x140f, +CV_LeafKind_ST_MAX = 0x1500, +CV_LeafKind_TYPESERVER = 0x1501, +CV_LeafKind_ENUMERATE = 0x1502, +CV_LeafKind_ARRAY = 0x1503, +CV_LeafKind_CLASS = 0x1504, +CV_LeafKind_STRUCTURE = 0x1505, +CV_LeafKind_UNION = 0x1506, +CV_LeafKind_ENUM = 0x1507, +CV_LeafKind_DIMARRAY = 0x1508, +CV_LeafKind_PRECOMP = 0x1509, +CV_LeafKind_ALIAS = 0x150a, +CV_LeafKind_DEFARG = 0x150b, +CV_LeafKind_FRIENDFCN = 0x150c, +CV_LeafKind_MEMBER = 0x150d, +CV_LeafKind_STMEMBER = 0x150e, +CV_LeafKind_METHOD = 0x150f, +CV_LeafKind_NESTTYPE = 0x1510, +CV_LeafKind_ONEMETHOD = 0x1511, +CV_LeafKind_NESTTYPEEX = 0x1512, +CV_LeafKind_MEMBERMODIFY = 0x1513, +CV_LeafKind_MANAGED = 0x1514, +CV_LeafKind_TYPESERVER2 = 0x1515, +CV_LeafKind_STRIDED_ARRAY = 0x1516, +CV_LeafKind_HLSL = 0x1517, +CV_LeafKind_MODIFIER_EX = 0x1518, +CV_LeafKind_INTERFACE = 0x1519, +CV_LeafKind_BINTERFACE = 0x151a, +CV_LeafKind_VECTOR = 0x151b, +CV_LeafKind_MATRIX = 0x151c, +CV_LeafKind_VFTABLE = 0x151d, +CV_LeafKind_CLASS2 = 0x1608, +CV_LeafKind_STRUCT2 = 0x1609, +} CV_LeafKindEnum; + +internal String8 cv_string_from_numeric_kind(CV_NumericKind v); +internal String8 cv_string_from_arch(CV_Arch v); +internal String8 cv_string_from_sym_kind(CV_SymKind v); +internal String8 cv_string_from_leaf_kind(CV_LeafKind v); +C_LINKAGE_BEGIN +C_LINKAGE_END + +#endif // CODEVIEW_META_H diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 05ffc66c..c34dcd9a 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -1796,7 +1796,7 @@ DF_DevToggleTable: //- rjf: core view rule function prototypes -@table_gen +@gen { @expand(DF_CoreViewRuleTable a) `$(a.er == "x" -> "DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`; @expand(DF_CoreViewRuleTable a) `$(a.vb == "x" -> "DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`; @@ -1827,7 +1827,7 @@ DF_DevToggleTable: //- rjf: instruction metadata table -@table_gen +@gen { ``; `struct{String8 mnemonic; String8 summary;} df_g_inst_table_x64[] =`; @@ -1839,12 +1839,12 @@ DF_DevToggleTable: //- rjf: developer toggles -@table_gen +@gen { @expand(DF_DevToggleTable a) `global B32 DEV_$(a.name) = 0;` } -@table_gen +@gen { `struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] =`; `{`; diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index bccbe663..ba56a42d 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -518,7 +518,7 @@ DF_ThemePresetColorTable: //- rjf: view hook forward declares -@table_gen +@gen { @expand(DF_GfxViewTable a) `DF_VIEW_SETUP_FUNCTION_DEF($(a.name));`; @expand(DF_GfxViewTable a) `DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF($(a.name));`; @@ -528,7 +528,7 @@ DF_ThemePresetColorTable: //- rjf: gfx view rule function forward declares -@table_gen +@gen { ``; @expand(DF_GfxViewRuleTable a) diff --git a/src/draw/draw.mdesk b/src/draw/draw.mdesk index bba9861e..cc4be4f2 100644 --- a/src/draw/draw.mdesk +++ b/src/draw/draw.mdesk @@ -10,31 +10,31 @@ D_StackTable: {Transparency transparency F32 `0` } } -@table_gen +@gen { @expand(D_StackTable a) `typedef struct D_$(a.name)Node D_$(a.name)Node; struct D_$(a.name)Node {D_$(a.name)Node *next; $(a.type) v;};`; } -@table_gen +@gen { `#define D_BucketStackDecls struct{\\`; @expand(D_StackTable a) `D_$(a.name)Node *top_$(a.name_lower);\\`; `}`; } -@table_gen +@gen { @expand(D_StackTable a) `read_only global D_$(a.name)Node d_nil_$(a.name_lower) = {0, $(a.default_init)};`; } -@table_gen +@gen { `#define D_BucketStackInits(b) do{\\`; @expand(D_StackTable a) `(b)->top_$(a.name_lower) = &d_nil_$(a.name_lower);\\`; `}while(0)`; } -@table_gen +@gen { `#if 0`; @expand(D_StackTable a) `internal $(a.type) $(=>35) d_push_$(a.name_lower)($(a.type) v);`; @@ -43,14 +43,14 @@ D_StackTable: `#endif`; } -@table_gen @c_file +@gen @c_file { @expand(D_StackTable a) `internal $(a.type) $(=>35) d_push_$(a.name_lower)($(a.type) v) {D_StackPushImpl($(a.name), $(a.name_lower), $(a.type), v);}`; @expand(D_StackTable a) `internal $(a.type) $(=>35) d_pop_$(a.name_lower)(void) {D_StackPopImpl($(a.name), $(a.name_lower), $(a.type));}`; @expand(D_StackTable a) `internal $(a.type) $(=>35) d_top_$(a.name_lower)(void) {D_StackTopImpl($(a.name), $(a.name_lower), $(a.type));}`; } -@table_gen +@gen { `#if 0`; @expand(D_StackTable a) `#define D_$(a.name)Scope(v) $(=>35) DeferLoop(d_push_$(a.name_lower)(v), d_pop_$(a.name_lower)())`; diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 077cca34..1ab89502 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -211,7 +211,7 @@ int main(int argument_count, char **arguments) } ////////////////////////////// - //- rjf: generate table data tables + //- rjf: generate data tables // for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) { @@ -241,19 +241,58 @@ int main(int argument_count, char **arguments) } ////////////////////////////// - //- rjf: generate table catch-all generations + //- rjf: generate enum -> string mapping functions // for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) { MD_Node *file = n->v.root; for(MD_EachNode(node, file->first)) { - MD_Node *tag = md_tag_from_string(node, str8_lit("table_gen"), 0); + MD_Node *tag = md_tag_from_string(node, str8_lit("enum2string_switch"), 0); + if(!md_node_is_nil(tag)) + { + String8 enum_type = tag->first->string; + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + str8_list_pushf(mg_arena, &layer->h_functions, "internal String8 %S(%S v);\n", node->string, enum_type); + str8_list_pushf(mg_arena, &layer->c_functions, "internal String8\n%S(%S v)\n{\n", node->string, enum_type); + str8_list_pushf(mg_arena, &layer->c_functions, "String8 result = str8_lit(\"\");\n", enum_type); + str8_list_pushf(mg_arena, &layer->c_functions, "switch(v)\n"); + str8_list_pushf(mg_arena, &layer->c_functions, "{\n"); + str8_list_pushf(mg_arena, &layer->c_functions, "default:{}break;\n"); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + String8 escaped = mg_escaped_from_str8(mg_arena, n->string); + str8_list_pushf(mg_arena, &layer->c_functions, "%S;\n", escaped); + } + str8_list_pushf(mg_arena, &layer->c_functions, "}\n"); + str8_list_pushf(mg_arena, &layer->c_functions, "return result;\n"); + str8_list_pushf(mg_arena, &layer->c_functions, "}\n\n"); + } + } + } + + ////////////////////////////// + //- rjf: generate catch-all generations + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for(MD_EachNode(node, file->first)) + { + MD_Node *tag = md_tag_from_string(node, str8_lit("gen"), 0); if(!md_node_is_nil(tag)) { String8 layer_key = mg_layer_key_from_path(file->string); MG_Layer *layer = mg_layer_from_key(layer_key); - String8List *out = md_node_has_tag(node, str8_lit("c_file"), 0) ? &layer->c_catchall : &layer->h_catchall; + B32 prefer_c_file = md_node_has_tag(node, str8_lit("c_file"), 0); + String8List *out = prefer_c_file ? &layer->c_catchall : &layer->h_catchall; + if(tag->first->string.size == 0){} + else if(str8_match(tag->first->string, str8_lit("enums"), 0)) { out = &layer->enums; } + else if(str8_match(tag->first->string, str8_lit("structs"), 0)) { out = &layer->structs; } + else if(str8_match(tag->first->string, str8_lit("functions"), 0)) { out = prefer_c_file ? &layer->c_functions : &layer->h_functions; } + else if(str8_match(tag->first->string, str8_lit("tables"), 0)) { out = prefer_c_file ? &layer->c_tables : &layer->h_tables; } String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); for(String8Node *n = gen_strings.first; n != 0; n = n->next) { diff --git a/src/regs/raddbgi/regs_raddbgi.mdesk b/src/regs/raddbgi/regs_raddbgi.mdesk index a70a5011..1059f06f 100644 --- a/src/regs/raddbgi/regs_raddbgi.mdesk +++ b/src/regs/raddbgi/regs_raddbgi.mdesk @@ -4,7 +4,7 @@ //////////////////////////////// //~ rjf: RADDBG Converter Helper Implementation Generators -@table_gen @c_file +@gen @c_file { `internal RADDBGI_RegisterCode regs_raddbgi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code)`; `{`; @@ -33,7 +33,7 @@ `}`; } -@table_gen @c_file +@gen @c_file { `internal REGS_RegCode regs_reg_code_from_arch_raddbgi_code(Architecture arch, RADDBGI_RegisterCode code)`; `{`; diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index 2a0499f6..6370a1d4 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -417,7 +417,7 @@ regs_g_reg_code_x86_usage_kind_table: //////////////////////////////// //~ rjf: Architecture-Dynamic Helper Implementation Generators -@c_file @table_gen +@c_file @gen { `internal U64 regs_block_size_from_architecture(Architecture arch)`; `{`; @@ -431,7 +431,7 @@ regs_g_reg_code_x86_usage_kind_table: `}`; } -@c_file @table_gen +@c_file @gen { `internal U64 regs_reg_code_count_from_architecture(Architecture arch)`; `{`; @@ -445,7 +445,7 @@ regs_g_reg_code_x86_usage_kind_table: `}`; } -@c_file @table_gen +@c_file @gen { `internal U64 regs_alias_code_count_from_architecture(Architecture arch)`; `{`; @@ -459,7 +459,7 @@ regs_g_reg_code_x86_usage_kind_table: `}`; } -@c_file @table_gen +@c_file @gen { `internal String8 *regs_reg_code_string_table_from_architecture(Architecture arch)`; `{`; @@ -473,7 +473,7 @@ regs_g_reg_code_x86_usage_kind_table: `}`; } -@c_file @table_gen +@c_file @gen { `internal String8 *regs_alias_code_string_table_from_architecture(Architecture arch)`; `{`; @@ -487,7 +487,7 @@ regs_g_reg_code_x86_usage_kind_table: `}`; } -@c_file @table_gen +@c_file @gen { `internal REGS_Rng *regs_reg_code_rng_table_from_architecture(Architecture arch)`; `{`; @@ -501,7 +501,7 @@ regs_g_reg_code_x86_usage_kind_table: `}`; } -@c_file @table_gen +@c_file @gen { `internal REGS_Slice *regs_alias_code_slice_table_from_architecture(Architecture arch)`; `{`; @@ -515,7 +515,7 @@ regs_g_reg_code_x86_usage_kind_table: `}`; } -@c_file @table_gen +@c_file @gen { `internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_architecture(Architecture arch)`; `{`; @@ -529,7 +529,7 @@ regs_g_reg_code_x86_usage_kind_table: `}`; } -@c_file @table_gen +@c_file @gen { `internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_architecture(Architecture arch)`; `{`; diff --git a/src/ui/ui.mdesk b/src/ui/ui.mdesk index 61c179fb..f94bfdaf 100644 --- a/src/ui/ui.mdesk +++ b/src/ui/ui.mdesk @@ -63,14 +63,14 @@ UI_StackTable: //- rjf: declaring stack node types -@table_gen +@gen { @expand(UI_StackTable a) `typedef struct UI_$(a.name)Node UI_$(a.name)Node; struct UI_$(a.name)Node{UI_$(a.name)Node *next; $(a.type) v;};` } //- rjf: declaring all default stack tops -@table_gen +@gen { `#define UI_DeclStackNils \\`; `struct\\`; @@ -81,7 +81,7 @@ UI_StackTable: //- rjf: initializing all default stack tops -@table_gen +@gen { `#define UI_InitStackNils(state) \\`; @expand(UI_StackTable a) `state->$(a.name_lower)_nil_stack_top.v = $(a.default);\\`; @@ -90,7 +90,7 @@ UI_StackTable: //- rjf: declaring all stack nodes & free lists -@table_gen +@gen { `#define UI_DeclStacks \\`; `struct\\`; @@ -101,7 +101,7 @@ UI_StackTable: //- rjf: initing all stack nodes -@table_gen +@gen { `#define UI_InitStacks(state) \\`; @expand(UI_StackTable a) `state->$(a.name_lower)_stack.top = &state->$(a.name_lower)_nil_stack_top; state->$(a.name_lower)_stack.bottom_val = $(a.default); state->$(a.name_lower)_stack.free = 0; state->$(a.name_lower)_stack.auto_pop = 0;\\`; @@ -110,7 +110,7 @@ UI_StackTable: //- rjf: auto-popping all stacks -@table_gen +@gen { `#define UI_AutoPopStacks(state) \\` @expand(UI_StackTable a) @@ -120,7 +120,7 @@ UI_StackTable: //- rjf: decls for the stack function operation headers -@table_gen +@gen { @expand(UI_StackTable a) `internal $(a.type) $(=>35) ui_top_$(a.name_lower)(void);` @@ -136,7 +136,7 @@ UI_StackTable: //- rjf: defer-loop helpers -@table_gen @c_file +@gen @c_file { `#if 0`; @expand(UI_StackTable a) @@ -146,7 +146,7 @@ UI_StackTable: //- rjf: decls for the stack operation implementations -@table_gen @c_file +@gen @c_file { @expand(UI_StackTable a) `internal $(a.type) ui_top_$(a.name_lower)(void) { UI_StackTopImpl(ui_state, $(a.name), $(a.name_lower)) }`; From 725481fcc77b43051dae033e116435bd1496eef8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 13:36:15 -0800 Subject: [PATCH 054/275] fix codeview struct --- src/codeview/codeview.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index 5aedc31a..b6a0778f 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -1095,7 +1095,7 @@ struct CV_SymVPath32 CV_TypeId path; U32 off; U16 seg; -} CV_SymVPath32; +}; //- (SymKind: FRAMEPROC) From 348034a490d74b5a79438c7f82f69461292d6857 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 14:26:01 -0800 Subject: [PATCH 055/275] reading/cleanup/organization pass over main symbol conversion pass in raddbgi_from_pdb; automate & table-drive a few pieces via metacode tables --- src/codeview/codeview.h | 4 +- src/codeview/codeview.mdesk | 408 +++---- src/codeview/generated/codeview.meta.c | 79 ++ src/codeview/generated/codeview.meta.h | 1 + src/raddbgi_convert/pdb/raddbgi_from_pdb.c | 1116 +++++++++----------- 5 files changed, 787 insertions(+), 821 deletions(-) diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index b6a0778f..07d60867 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -1059,8 +1059,8 @@ enum CV_GenericFlags_RSCLEAN = (1 << 1), // "returnee stack cleanup" }; -typedef struct CV_Return CV_Return; -struct CV_Return +typedef struct CV_SymReturn CV_SymReturn; +struct CV_SymReturn { CV_GenericFlags flags; CV_GenericStyle style; diff --git a/src/codeview/codeview.mdesk b/src/codeview/codeview.mdesk index f05316c3..5b57fd39 100644 --- a/src/codeview/codeview.mdesk +++ b/src/codeview/codeview.mdesk @@ -152,201 +152,201 @@ cv_string_from_arch: //////////////////////////////// //~ rjf: CV Sym Kinds -@table(name val) CV_SymKindTable: +@table(name header_type_name val) CV_SymKindTable: { - {COMPILE 0x0001} - {REGISTER_16t 0x0002} - {CONSTANT_16t 0x0003} - {UDT_16t 0x0004} - {SSEARCH 0x0005} - {END 0x0006} - {SKIP 0x0007} - {CVRESERVE 0x0008} - {OBJNAME_ST 0x0009} - {ENDARG 0x000a} - {COBOLUDT_16t 0x000b} - {MANYREG_16t 0x000c} - {RETURN 0x000d} - {ENTRYTHIS 0x000e} - {BPREL16 0x0100} - {LDATA16 0x0101} - {GDATA16 0x0102} - {PUB16 0x0103} - {LPROC16 0x0104} - {GPROC16 0x0105} - {THUNK16 0x0106} - {BLOCK16 0x0107} - {WITH16 0x0108} - {LABEL16 0x0109} - {CEXMODEL16 0x010a} - {VFTABLE16 0x010b} - {REGREL16 0x010c} - {BPREL32_16t 0x0200} - {LDATA32_16t 0x0201} - {GDATA32_16t 0x0202} - {PUB32_16t 0x0203} - {LPROC32_16t 0x0204} - {GPROC32_16t 0x0205} - {THUNK32_ST 0x0206} - {BLOCK32_ST 0x0207} - {WITH32_ST 0x0208} - {LABEL32_ST 0x0209} - {CEXMODEL32 0x020a} - {VFTABLE32_16t 0x020b} - {REGREL32_16t 0x020c} - {LTHREAD32_16t 0x020d} - {GTHREAD32_16t 0x020e} - {SLINK32 0x020f} - {LPROCMIPS_16t 0x0300} - {GPROCMIPS_16t 0x0301} - {PROCREF_ST 0x0400} - {DATAREF_ST 0x0401} - {ALIGN 0x0402} - {LPROCREF_ST 0x0403} - {OEM 0x0404} - {TI16_MAX 0x1000} - {CONSTANT_ST 0x1002} - {UDT_ST 0x1003} - {COBOLUDT_ST 0x1004} - {MANYREG_ST 0x1005} - {BPREL32_ST 0x1006} - {LDATA32_ST 0x1007} - {GDATA32_ST 0x1008} - {PUB32_ST 0x1009} - {LPROC32_ST 0x100a} - {GPROC32_ST 0x100b} - {VFTABLE32 0x100c} - {REGREL32_ST 0x100d} - {LTHREAD32_ST 0x100e} - {GTHREAD32_ST 0x100f} - {LPROCMIPS_ST 0x1010} - {GPROCMIPS_ST 0x1011} - {FRAMEPROC 0x1012} - {COMPILE2_ST 0x1013} - {MANYREG2_ST 0x1014} - {LPROCIA64_ST 0x1015} - {GPROCIA64_ST 0x1016} - {LOCALSLOT_ST 0x1017} - {PARAMSLOT_ST 0x1018} - {ANNOTATION 0x1019} - {GMANPROC_ST 0x101a} - {LMANPROC_ST 0x101b} - {RESERVED1 0x101c} - {RESERVED2 0x101d} - {RESERVED3 0x101e} - {RESERVED4 0x101f} - {LMANDATA_ST 0x1020} - {GMANDATA_ST 0x1021} - {MANFRAMEREL_ST 0x1022} - {MANREGISTER_ST 0x1023} - {MANSLOT_ST 0x1024} - {MANMANYREG_ST 0x1025} - {MANREGREL_ST 0x1026} - {MANMANYREG2_ST 0x1027} - {MANTYPREF 0x1028} - {UNAMESPACE_ST 0x1029} - {ST_MAX 0x1100} - {OBJNAME 0x1101} - {THUNK32 0x1102} - {BLOCK32 0x1103} - {WITH32 0x1104} - {LABEL32 0x1105} - {REGISTER 0x1106} - {CONSTANT 0x1107} - {UDT 0x1108} - {COBOLUDT 0x1109} - {MANYREG 0x110a} - {BPREL32 0x110b} - {LDATA32 0x110c} - {GDATA32 0x110d} - {PUB32 0x110e} - {LPROC32 0x110f} - {GPROC32 0x1110} - {REGREL32 0x1111} - {LTHREAD32 0x1112} - {GTHREAD32 0x1113} - {LPROCMIPS 0x1114} - {GPROCMIPS 0x1115} - {COMPILE2 0x1116} - {MANYREG2 0x1117} - {LPROCIA64 0x1118} - {GPROCIA64 0x1119} - {LOCALSLOT 0x111a} - {PARAMSLOT 0x111b} - {LMANDATA 0x111c} - {GMANDATA 0x111d} - {MANFRAMEREL 0x111e} - {MANREGISTER 0x111f} - {MANSLOT 0x1120} - {MANMANYREG 0x1121} - {MANREGREL 0x1122} - {MANMANYREG2 0x1123} - {UNAMESPACE 0x1124} - {PROCREF 0x1125} - {DATAREF 0x1126} - {LPROCREF 0x1127} - {ANNOTATIONREF 0x1128} - {TOKENREF 0x1129} - {GMANPROC 0x112a} - {LMANPROC 0x112b} - {TRAMPOLINE 0x112c} - {MANCONSTANT 0x112d} - {ATTR_FRAMEREL 0x112e} - {ATTR_REGISTER 0x112f} - {ATTR_REGREL 0x1130} - {ATTR_MANYREG 0x1131} - {SEPCODE 0x1132} - {DEFRANGE_2005 0x1134} - {DEFRANGE2_2005 0x1135} - {SECTION 0x1136} - {COFFGROUP 0x1137} - {EXPORT 0x1138} - {CALLSITEINFO 0x1139} - {FRAMECOOKIE 0x113a} - {DISCARDED 0x113b} - {COMPILE3 0x113c} - {ENVBLOCK 0x113d} - {LOCAL 0x113e} - {DEFRANGE 0x113f} - {DEFRANGE_SUBFIELD 0x1140} - {DEFRANGE_REGISTER 0x1141} - {DEFRANGE_FRAMEPOINTER_REL 0x1142} - {DEFRANGE_SUBFIELD_REGISTER 0x1143} - {DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE 0x1144} - {DEFRANGE_REGISTER_REL 0x1145} - {LPROC32_ID 0x1146} - {GPROC32_ID 0x1147} - {LPROCMIPS_ID 0x1148} - {GPROCMIPS_ID 0x1149} - {LPROCIA64_ID 0x114a} - {GPROCIA64_ID 0x114b} - {BUILDINFO 0x114c} - {INLINESITE 0x114d} - {INLINESITE_END 0x114e} - {PROC_ID_END 0x114f} - {DEFRANGE_HLSL 0x1150} - {GDATA_HLSL 0x1151} - {LDATA_HLSL 0x1152} - {FILESTATIC 0x1153} - {LPROC32_DPC 0x1155} - {LPROC32_DPC_ID 0x1156} - {DEFRANGE_DPC_PTR_TAG 0x1157} - {DPC_SYM_TAG_MAP 0x1158} - {ARMSWITCHTABLE 0x1159} - {CALLEES 0x115a} - {CALLERS 0x115b} - {POGODATA 0x115c} - {INLINESITE2 0x115d} - {HEAPALLOCSITE 0x115e} - {MOD_TYPEREF 0x115f} - {REF_MINIPDB 0x1160} - {PDBMAP 0x1161} - {GDATA_HLSL32 0x1162} - {LDATA_HLSL32 0x1163} - {GDATA_HLSL32_EX 0x1164} - {LDATA_HLSL32_EX 0x1165} - {FASTLINK 0x1167} - {INLINEES 0x1168} + {COMPILE Compile 0x0001} + {REGISTER_16t - 0x0002} + {CONSTANT_16t - 0x0003} + {UDT_16t - 0x0004} + {SSEARCH StartSearch 0x0005} + {END - 0x0006} + {SKIP - 0x0007} + {CVRESERVE - 0x0008} + {OBJNAME_ST - 0x0009} + {ENDARG - 0x000a} + {COBOLUDT_16t - 0x000b} + {MANYREG_16t - 0x000c} + {RETURN Return 0x000d} + {ENTRYTHIS - 0x000e} + {BPREL16 - 0x0100} + {LDATA16 - 0x0101} + {GDATA16 - 0x0102} + {PUB16 - 0x0103} + {LPROC16 - 0x0104} + {GPROC16 - 0x0105} + {THUNK16 - 0x0106} + {BLOCK16 - 0x0107} + {WITH16 - 0x0108} + {LABEL16 - 0x0109} + {CEXMODEL16 - 0x010a} + {VFTABLE16 - 0x010b} + {REGREL16 - 0x010c} + {BPREL32_16t - 0x0200} + {LDATA32_16t - 0x0201} + {GDATA32_16t - 0x0202} + {PUB32_16t - 0x0203} + {LPROC32_16t - 0x0204} + {GPROC32_16t - 0x0205} + {THUNK32_ST - 0x0206} + {BLOCK32_ST - 0x0207} + {WITH32_ST - 0x0208} + {LABEL32_ST - 0x0209} + {CEXMODEL32 - 0x020a} + {VFTABLE32_16t - 0x020b} + {REGREL32_16t - 0x020c} + {LTHREAD32_16t - 0x020d} + {GTHREAD32_16t - 0x020e} + {SLINK32 SLink32 0x020f} + {LPROCMIPS_16t - 0x0300} + {GPROCMIPS_16t - 0x0301} + {PROCREF_ST - 0x0400} + {DATAREF_ST - 0x0401} + {ALIGN - 0x0402} + {LPROCREF_ST - 0x0403} + {OEM OEM 0x0404} + {TI16_MAX - 0x1000} + {CONSTANT_ST - 0x1002} + {UDT_ST - 0x1003} + {COBOLUDT_ST - 0x1004} + {MANYREG_ST - 0x1005} + {BPREL32_ST - 0x1006} + {LDATA32_ST - 0x1007} + {GDATA32_ST - 0x1008} + {PUB32_ST - 0x1009} + {LPROC32_ST - 0x100a} + {GPROC32_ST - 0x100b} + {VFTABLE32 VPath32 0x100c} + {REGREL32_ST - 0x100d} + {LTHREAD32_ST - 0x100e} + {GTHREAD32_ST - 0x100f} + {LPROCMIPS_ST - 0x1010} + {GPROCMIPS_ST - 0x1011} + {FRAMEPROC Frameproc 0x1012} + {COMPILE2_ST - 0x1013} + {MANYREG2_ST - 0x1014} + {LPROCIA64_ST - 0x1015} + {GPROCIA64_ST - 0x1016} + {LOCALSLOT_ST - 0x1017} + {PARAMSLOT_ST - 0x1018} + {ANNOTATION Annotation 0x1019} + {GMANPROC_ST - 0x101a} + {LMANPROC_ST - 0x101b} + {RESERVED1 - 0x101c} + {RESERVED2 - 0x101d} + {RESERVED3 - 0x101e} + {RESERVED4 - 0x101f} + {LMANDATA_ST - 0x1020} + {GMANDATA_ST - 0x1021} + {MANFRAMEREL_ST - 0x1022} + {MANREGISTER_ST - 0x1023} + {MANSLOT_ST - 0x1024} + {MANMANYREG_ST - 0x1025} + {MANREGREL_ST - 0x1026} + {MANMANYREG2_ST - 0x1027} + {MANTYPREF - 0x1028} + {UNAMESPACE_ST - 0x1029} + {ST_MAX - 0x1100} + {OBJNAME Objname 0x1101} + {THUNK32 Thunk32 0x1102} + {BLOCK32 Block32 0x1103} + {WITH32 - 0x1104} + {LABEL32 Label32 0x1105} + {REGISTER Register 0x1106} + {CONSTANT Constant 0x1107} + {UDT UDT 0x1108} + {COBOLUDT - 0x1109} + {MANYREG Manyreg 0x110a} + {BPREL32 BPRel32 0x110b} + {LDATA32 Data32 0x110c} + {GDATA32 Data32 0x110d} + {PUB32 Pub32 0x110e} + {LPROC32 Proc32 0x110f} + {GPROC32 Proc32 0x1110} + {REGREL32 Regrel32 0x1111} + {LTHREAD32 Thread32 0x1112} + {GTHREAD32 Thread32 0x1113} + {LPROCMIPS - 0x1114} + {GPROCMIPS - 0x1115} + {COMPILE2 Compile2 0x1116} + {MANYREG2 Manyreg2 0x1117} + {LPROCIA64 - 0x1118} + {GPROCIA64 - 0x1119} + {LOCALSLOT Slot 0x111a} + {PARAMSLOT - 0x111b} + {LMANDATA - 0x111c} + {GMANDATA - 0x111d} + {MANFRAMEREL AttrFrameRel 0x111e} + {MANREGISTER AttrReg 0x111f} + {MANSLOT - 0x1120} + {MANMANYREG AttrManyReg 0x1121} + {MANREGREL AttrRegRel 0x1122} + {MANMANYREG2 - 0x1123} + {UNAMESPACE UNamespace 0x1124} + {PROCREF Ref2 0x1125} + {DATAREF Ref2 0x1126} + {LPROCREF Ref2 0x1127} + {ANNOTATIONREF - 0x1128} + {TOKENREF - 0x1129} + {GMANPROC - 0x112a} + {LMANPROC - 0x112b} + {TRAMPOLINE Trampoline 0x112c} + {MANCONSTANT - 0x112d} + {ATTR_FRAMEREL AttrFrameRel 0x112e} + {ATTR_REGISTER AttrReg 0x112f} + {ATTR_REGREL AttrRegRel 0x1130} + {ATTR_MANYREG AttrManyReg 0x1131} + {SEPCODE Sepcode 0x1132} + {DEFRANGE_2005 - 0x1134} + {DEFRANGE2_2005 - 0x1135} + {SECTION Section 0x1136} + {COFFGROUP CoffGroup 0x1137} + {EXPORT Export 0x1138} + {CALLSITEINFO CallSiteInfo 0x1139} + {FRAMECOOKIE FrameCookie 0x113a} + {DISCARDED Discarded 0x113b} + {COMPILE3 Compile3 0x113c} + {ENVBLOCK EnvBlock 0x113d} + {LOCAL Local 0x113e} + {DEFRANGE - 0x113f} + {DEFRANGE_SUBFIELD DefrangeSubfield 0x1140} + {DEFRANGE_REGISTER DefrangeRegister 0x1141} + {DEFRANGE_FRAMEPOINTER_REL DefrangeFramepointerRel 0x1142} + {DEFRANGE_SUBFIELD_REGISTER DefrangeSubfieldRegister 0x1143} + {DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE DefrangeFramepointerRelFullScope 0x1144} + {DEFRANGE_REGISTER_REL DefrangeRegisterRel 0x1145} + {LPROC32_ID - 0x1146} + {GPROC32_ID - 0x1147} + {LPROCMIPS_ID - 0x1148} + {GPROCMIPS_ID - 0x1149} + {LPROCIA64_ID - 0x114a} + {GPROCIA64_ID - 0x114b} + {BUILDINFO BuildInfo 0x114c} + {INLINESITE InlineSite 0x114d} + {INLINESITE_END - 0x114e} + {PROC_ID_END - 0x114f} + {DEFRANGE_HLSL - 0x1150} + {GDATA_HLSL - 0x1151} + {LDATA_HLSL - 0x1152} + {FILESTATIC FileStatic 0x1153} + {LPROC32_DPC - 0x1155} + {LPROC32_DPC_ID - 0x1156} + {DEFRANGE_DPC_PTR_TAG - 0x1157} + {DPC_SYM_TAG_MAP - 0x1158} + {ARMSWITCHTABLE - 0x1159} + {CALLEES FunctionList 0x115a} + {CALLERS FunctionList 0x115b} + {POGODATA PogoInfo 0x115c} + {INLINESITE2 InlineSite2 0x115d} + {HEAPALLOCSITE HeapAllocSite 0x115e} + {MOD_TYPEREF ModTypeRef 0x115f} + {REF_MINIPDB RefMiniPdb 0x1160} + {PDBMAP - 0x1161} + {GDATA_HLSL32 - 0x1162} + {LDATA_HLSL32 - 0x1163} + {GDATA_HLSL32_EX - 0x1164} + {LDATA_HLSL32_EX - 0x1165} + {FASTLINK FastLink 0x1167} + {INLINEES Inlinees 0x1168} } @enum(U16) CV_SymKind: @@ -360,6 +360,26 @@ cv_string_from_sym_kind: @expand(CV_SymKindTable a) `case CV_SymKind_$(a.name):{result = str8_lit("$(a.name)");}break`; } +@gen(functions) +{ + `internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v);`; +} + +@gen(functions) @c_file +{ + `internal U64`; + `cv_header_struct_size_from_sym_kind(CV_SymKind v)`; + `{`; + `U64 result = 0;`; + `switch(v)`; + `{`; + `default:{}break;`; + @expand(CV_SymKindTable a) `$(a.header_type_name != "-" -> "case CV_SymKind_"..a.name..":{result = sizeof(CV_Sym"..a.header_type_name..");}break;")`; + `}`; + `return result;`; + `}`; +} + //////////////////////////////// //~ rjf: CV Leaf diff --git a/src/codeview/generated/codeview.meta.c b/src/codeview/generated/codeview.meta.c index 6db9136c..b65dc4fc 100644 --- a/src/codeview/generated/codeview.meta.c +++ b/src/codeview/generated/codeview.meta.c @@ -449,6 +449,85 @@ case CV_LeafKind_STRUCT2:{result = str8_lit("STRUCT2");}break; return result; } +internal U64 +cv_header_struct_size_from_sym_kind(CV_SymKind v) +{ +U64 result = 0; +switch(v) +{ +default:{}break; +case CV_SymKind_COMPILE:{result = sizeof(CV_SymCompile);}break; +case CV_SymKind_SSEARCH:{result = sizeof(CV_SymStartSearch);}break; +case CV_SymKind_RETURN:{result = sizeof(CV_SymReturn);}break; +case CV_SymKind_SLINK32:{result = sizeof(CV_SymSLink32);}break; +case CV_SymKind_OEM:{result = sizeof(CV_SymOEM);}break; +case CV_SymKind_VFTABLE32:{result = sizeof(CV_SymVPath32);}break; +case CV_SymKind_FRAMEPROC:{result = sizeof(CV_SymFrameproc);}break; +case CV_SymKind_ANNOTATION:{result = sizeof(CV_SymAnnotation);}break; +case CV_SymKind_OBJNAME:{result = sizeof(CV_SymObjname);}break; +case CV_SymKind_THUNK32:{result = sizeof(CV_SymThunk32);}break; +case CV_SymKind_BLOCK32:{result = sizeof(CV_SymBlock32);}break; +case CV_SymKind_LABEL32:{result = sizeof(CV_SymLabel32);}break; +case CV_SymKind_REGISTER:{result = sizeof(CV_SymRegister);}break; +case CV_SymKind_CONSTANT:{result = sizeof(CV_SymConstant);}break; +case CV_SymKind_UDT:{result = sizeof(CV_SymUDT);}break; +case CV_SymKind_MANYREG:{result = sizeof(CV_SymManyreg);}break; +case CV_SymKind_BPREL32:{result = sizeof(CV_SymBPRel32);}break; +case CV_SymKind_LDATA32:{result = sizeof(CV_SymData32);}break; +case CV_SymKind_GDATA32:{result = sizeof(CV_SymData32);}break; +case CV_SymKind_PUB32:{result = sizeof(CV_SymPub32);}break; +case CV_SymKind_LPROC32:{result = sizeof(CV_SymProc32);}break; +case CV_SymKind_GPROC32:{result = sizeof(CV_SymProc32);}break; +case CV_SymKind_REGREL32:{result = sizeof(CV_SymRegrel32);}break; +case CV_SymKind_LTHREAD32:{result = sizeof(CV_SymThread32);}break; +case CV_SymKind_GTHREAD32:{result = sizeof(CV_SymThread32);}break; +case CV_SymKind_COMPILE2:{result = sizeof(CV_SymCompile2);}break; +case CV_SymKind_MANYREG2:{result = sizeof(CV_SymManyreg2);}break; +case CV_SymKind_LOCALSLOT:{result = sizeof(CV_SymSlot);}break; +case CV_SymKind_MANFRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; +case CV_SymKind_MANREGISTER:{result = sizeof(CV_SymAttrReg);}break; +case CV_SymKind_MANMANYREG:{result = sizeof(CV_SymAttrManyReg);}break; +case CV_SymKind_MANREGREL:{result = sizeof(CV_SymAttrRegRel);}break; +case CV_SymKind_UNAMESPACE:{result = sizeof(CV_SymUNamespace);}break; +case CV_SymKind_PROCREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_DATAREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_LPROCREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_TRAMPOLINE:{result = sizeof(CV_SymTrampoline);}break; +case CV_SymKind_ATTR_FRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; +case CV_SymKind_ATTR_REGISTER:{result = sizeof(CV_SymAttrReg);}break; +case CV_SymKind_ATTR_REGREL:{result = sizeof(CV_SymAttrRegRel);}break; +case CV_SymKind_ATTR_MANYREG:{result = sizeof(CV_SymAttrManyReg);}break; +case CV_SymKind_SEPCODE:{result = sizeof(CV_SymSepcode);}break; +case CV_SymKind_SECTION:{result = sizeof(CV_SymSection);}break; +case CV_SymKind_COFFGROUP:{result = sizeof(CV_SymCoffGroup);}break; +case CV_SymKind_EXPORT:{result = sizeof(CV_SymExport);}break; +case CV_SymKind_CALLSITEINFO:{result = sizeof(CV_SymCallSiteInfo);}break; +case CV_SymKind_FRAMECOOKIE:{result = sizeof(CV_SymFrameCookie);}break; +case CV_SymKind_DISCARDED:{result = sizeof(CV_SymDiscarded);}break; +case CV_SymKind_COMPILE3:{result = sizeof(CV_SymCompile3);}break; +case CV_SymKind_ENVBLOCK:{result = sizeof(CV_SymEnvBlock);}break; +case CV_SymKind_LOCAL:{result = sizeof(CV_SymLocal);}break; +case CV_SymKind_DEFRANGE_SUBFIELD:{result = sizeof(CV_SymDefrangeSubfield);}break; +case CV_SymKind_DEFRANGE_REGISTER:{result = sizeof(CV_SymDefrangeRegister);}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = sizeof(CV_SymDefrangeFramepointerRel);}break; +case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = sizeof(CV_SymDefrangeSubfieldRegister);}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = sizeof(CV_SymDefrangeFramepointerRelFullScope);}break; +case CV_SymKind_DEFRANGE_REGISTER_REL:{result = sizeof(CV_SymDefrangeRegisterRel);}break; +case CV_SymKind_BUILDINFO:{result = sizeof(CV_SymBuildInfo);}break; +case CV_SymKind_INLINESITE:{result = sizeof(CV_SymInlineSite);}break; +case CV_SymKind_FILESTATIC:{result = sizeof(CV_SymFileStatic);}break; +case CV_SymKind_CALLEES:{result = sizeof(CV_SymFunctionList);}break; +case CV_SymKind_CALLERS:{result = sizeof(CV_SymFunctionList);}break; +case CV_SymKind_POGODATA:{result = sizeof(CV_SymPogoInfo);}break; +case CV_SymKind_INLINESITE2:{result = sizeof(CV_SymInlineSite2);}break; +case CV_SymKind_HEAPALLOCSITE:{result = sizeof(CV_SymHeapAllocSite);}break; +case CV_SymKind_MOD_TYPEREF:{result = sizeof(CV_SymModTypeRef);}break; +case CV_SymKind_REF_MINIPDB:{result = sizeof(CV_SymRefMiniPdb);}break; +case CV_SymKind_FASTLINK:{result = sizeof(CV_SymFastLink);}break; +case CV_SymKind_INLINEES:{result = sizeof(CV_SymInlinees);}break; +} +return result; +} C_LINKAGE_BEGIN C_LINKAGE_END diff --git a/src/codeview/generated/codeview.meta.h b/src/codeview/generated/codeview.meta.h index a04b4f8c..fe61870e 100644 --- a/src/codeview/generated/codeview.meta.h +++ b/src/codeview/generated/codeview.meta.h @@ -455,6 +455,7 @@ internal String8 cv_string_from_numeric_kind(CV_NumericKind v); internal String8 cv_string_from_arch(CV_Arch v); internal String8 cv_string_from_sym_kind(CV_SymKind v); internal String8 cv_string_from_leaf_kind(CV_LeafKind v); +internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v); C_LINKAGE_BEGIN C_LINKAGE_END diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c index b85ee234..a992ee85 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c @@ -1940,65 +1940,70 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - - // extract important values from parameters String8 data = sym->data; U64 user_id_base = (((U64)sym_unique_id) << 32); U64 sym_unique_id_hash = raddbgi_hash((U8*)&sym_unique_id, sizeof(sym_unique_id)); - // PASS 1: map out data associations + ////////////////////////////// + //- rjf: PASS 1: map out data associations + // ProfScope("map out data associations") { - // state variables RADDBGIC_Symbol *current_proc = 0; - - // loop - CV_RecRange *rec_range = sym->sym_ranges.ranges; - CV_RecRange *opl = rec_range + sym->sym_ranges.count; - for(;rec_range < opl; rec_range += 1) + CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) { - // symbol data range - U64 opl_off_raw = rec_range->off + rec_range->hdr.size; - U64 opl_off = ClampTop(opl_off_raw, data.size); + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - U64 off_raw = rec_range->off + 2; - U64 off = ClampTop(off_raw, opl_off); + //- rjf: skip invalid ranges + if(sym_off_opl > data.size || sym_off_first > data.size || sym_off_first > sym_off_opl) + { + continue; + } - U8 *first = data.str + off; - U64 cap = (opl_off - off); + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = data.str + sym_off_first; - CV_SymKind kind = rec_range->hdr.kind; + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind switch(kind) { default:{}break; + //- rjf: FRAMEPROC case CV_SymKind_FRAMEPROC: { - if(sizeof(CV_SymFrameproc) > cap) + CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; + if(current_proc == 0) { // TODO(allen): error } else { - CV_SymFrameproc *frameproc = (CV_SymFrameproc*)first; - if(current_proc == 0) - { - // TODO(allen): error - } - else - { - PDBCONV_FrameProcData data = {0}; - data.frame_size = frameproc->frame_size; - data.flags = frameproc->flags; - pdbconv_symbol_frame_proc_write(ctx, current_proc, &data); - } + PDBCONV_FrameProcData data = {0}; + data.frame_size = frameproc->frame_size; + data.flags = frameproc->flags; + pdbconv_symbol_frame_proc_write(ctx, current_proc, &data); } }break; + //- rjf: LPROC32/GPROC32 case CV_SymKind_LPROC32: case CV_SymKind_GPROC32: { - U64 symbol_id = user_id_base + off; + U64 symbol_id = user_id_base + sym_off_first; U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); current_proc = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); }break; @@ -2006,31 +2011,44 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } } - // PASS 2: main symbol construction pass + ////////////////////////////// + //- rjf: PASS 2: main symbol construction pass + // ProfScope("main symbol construction pass") { - // state variables RADDBGIC_LocationSet *defrange_target = 0; B32 defrange_target_is_param = 0; - - // loop - CV_RecRange *rec_range = sym->sym_ranges.ranges; - CV_RecRange *opl = rec_range + sym->sym_ranges.count; U64 local_num = 1; U64 scope_num = 1; - for(;rec_range < opl; rec_range += 1) + CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) { - // symbol data range - U64 opl_off_raw = rec_range->off + rec_range->hdr.size; - U64 opl_off = ClampTop(opl_off_raw, data.size); + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - U64 off_raw = rec_range->off + 2; - U64 off = ClampTop(off_raw, opl_off); + //- rjf: skip invalid ranges + if(sym_off_opl > data.size || sym_off_first > data.size || sym_off_first > sym_off_opl) + { + continue; + } - U8 *first = data.str + off; - U64 cap = (opl_off - off); + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = data.str + sym_off_first; + void *sym_data_opl = data.str + sym_off_opl; - // current state + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: unpack current state RADDBGIC_Scope *current_scope = pdbconv_symbol_current_scope(ctx); RADDBGIC_Symbol *current_procedure = 0; if(current_scope != 0) @@ -2038,148 +2056,63 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) current_procedure = current_scope->symbol; } - CV_SymKind kind = rec_range->hdr.kind; + //- rjf: consume symbol based on kind switch(kind) { default:{}break; + //- rjf: END case CV_SymKind_END: - //ProfScope("CV_SymKind_END") { - // pop scope stack pdbconv_symbol_pop_scope(ctx); defrange_target = 0; defrange_target_is_param = 0; }break; - case CV_SymKind_FRAMEPROC: - //ProfScope("CV_SymKind_FRAMEPROC") - { - if(sizeof(CV_SymFrameproc) > cap) - { - // TODO(allen): error - } - else - { - // do nothing (handled in 'association map' pass) - } - }break; - + //- rjf: BLOCK32 case CV_SymKind_BLOCK32: - //ProfScope("CV_SymKind_BLOCK32") { - if(sizeof(CV_SymBlock32) > cap) + CV_SymBlock32 *block32 = (CV_SymBlock32*)sym_header_struct_base; + + // scope + U64 scope_id = user_id_base + scope_num; + scope_num += 1; + U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); + RADDBGIC_Scope *block_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); + raddbgic_scope_set_parent(ctx->root, block_scope, current_scope); + pdbconv_symbol_push_scope(ctx, block_scope, current_procedure); + + // set voff range + COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, block32->sec); + if(section != 0) { - // TODO(allen): error - } - else - { - CV_SymBlock32 *block32 = (CV_SymBlock32*)first; - - // scope - U64 scope_id = user_id_base + scope_num; - U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); - scope_num += 1; - RADDBGIC_Scope *block_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); - raddbgic_scope_set_parent(ctx->root, block_scope, current_scope); - pdbconv_symbol_push_scope(ctx, block_scope, current_procedure); - - // set voff range - COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, block32->sec); - if(section != 0) - { - U64 voff_first = section->voff + block32->off; - U64 voff_last = voff_first + block32->len; - raddbgic_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last); - } + U64 voff_first = section->voff + block32->off; + U64 voff_last = voff_first + block32->len; + raddbgic_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last); } }break; + //- rjf: LDATA32/GDATA32 case CV_SymKind_LDATA32: case CV_SymKind_GDATA32: - //ProfScope("CV_SymKind_LDATA32/CV_SymKind_GDATA32") { - if(sizeof(CV_SymData32) > cap) + CV_SymData32 *data32 = (CV_SymData32*)sym_header_struct_base; + String8 name = str8_cstring_capped(data32+1, sym_data_opl); + + // determine voff + COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, data32->sec); + U64 voff = ((section != 0)?section->voff:0) + data32->off; + + // deduplicate global variable symbols with the same name & offset + // * PDB likes to have duplicates of these spread across + // * different symbol streams so we deduplicate across the + // * entire translation context. + if(!pdbconv_known_global_lookup(&ctx->known_globals, name, voff)) { - // TODO(allen): error - } - else - { - CV_SymData32 *data32 = (CV_SymData32*)first; + pdbconv_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); - // name - String8 name = str8_cstring_capped((char*)(data32 + 1), first + cap); - - // determine voff - COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, data32->sec); - U64 voff = ((section != 0)?section->voff:0) + data32->off; - - // deduplicate global variable symbols with the same name & offset - // * PDB likes to have duplicates of these spread across - // * different symbol streams so we deduplicate across the - // * entire translation context. - if(!pdbconv_known_global_lookup(&ctx->known_globals, name, voff)) - { - pdbconv_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); - - // type of variable - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, data32->itype); - - // container type - RADDBGIC_Type *container_type = 0; - U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - container_type = pdbconv_type_from_name(ctx, container_name); - } - - // container symbol - RADDBGIC_Symbol *container_symbol = 0; - if(container_type == 0) - { - container_symbol = current_procedure; - } - - // determine link kind - B32 is_extern = (kind == CV_SymKind_GDATA32); - - // cons this symbol - U64 symbol_id = user_id_base + off; - U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - - RADDBGIC_SymbolInfo info = zero_struct; - info.kind = RADDBGIC_SymbolKind_GlobalVariable; - info.name = name; - info.type = type; - info.is_extern = is_extern; - info.offset = voff; - info.container_type = container_type; - info.container_symbol = container_symbol; - - raddbgic_symbol_set_info(ctx->root, symbol, &info); - } - } - }break; - - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - //ProfScope("CV_SymKind_LPROC32/CV_SymKind_GPROC32") - { - if(sizeof(CV_SymProc32) > cap) - { - // TODO(allen): error - } - else - { - CV_SymProc32 *proc32 = (CV_SymProc32*)first; - - // name - String8 name = str8_cstring_capped((char*)(proc32 + 1), first + cap); - - // type of procedure - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, proc32->itype); + // type of variable + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, data32->itype); // container type RADDBGIC_Type *container_type = 0; @@ -2197,119 +2130,288 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) container_symbol = current_procedure; } - // get this symbol handle - U64 symbol_id = user_id_base + off; - U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RADDBGIC_Symbol *proc_symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - - // scope - - // NOTE: even if there could be a containing scope at this point (which should be - // illegal in C/C++ but not necessarily in another language) we would not pass - // it here because these scopes refer to the ranges of code that make up a - // procedure *not* the namespaces, so a procedure's root scope always has - // no parent. - U64 scope_id = user_id_base + scope_num; - U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); - RADDBGIC_Scope *root_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); - pdbconv_symbol_push_scope(ctx, root_scope, proc_symbol); - scope_num += 1; - - // set voff range - U64 voff = 0; - COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, proc32->sec); - if(section != 0) - { - U64 voff_first = section->voff + proc32->off; - U64 voff_last = voff_first + proc32->len; - raddbgic_scope_add_voff_range(ctx->root, root_scope, voff_first, voff_last); - - voff = voff_first; - } - - // link name - String8 link_name = {0}; - if(voff != 0) - { - link_name = pdbconv_link_name_find(&ctx->link_names, voff); - } - // determine link kind - B32 is_extern = (kind == CV_SymKind_GPROC32); + B32 is_extern = (kind == CV_SymKind_GDATA32); + + // cons this symbol + U64 symbol_id = user_id_base + sym_off_first; + U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - // set symbol info RADDBGIC_SymbolInfo info = zero_struct; - info.kind = RADDBGIC_SymbolKind_Procedure; + info.kind = RADDBGIC_SymbolKind_GlobalVariable; info.name = name; - info.link_name = link_name; info.type = type; info.is_extern = is_extern; + info.offset = voff; info.container_type = container_type; info.container_symbol = container_symbol; - info.root_scope = root_scope; - raddbgic_symbol_set_info(ctx->root, proc_symbol, &info); + raddbgic_symbol_set_info(ctx->root, symbol, &info); } }break; - case CV_SymKind_REGREL32: - ProfScope("CV_SymKind_REGREL32") + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: { - if(sizeof(CV_SymRegrel32) > cap) + CV_SymProc32 *proc32 = (CV_SymProc32*)sym_header_struct_base; + String8 name = str8_cstring_capped(proc32+1, sym_data_opl); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, proc32->itype); + + // container type + RADDBGIC_Type *container_type = 0; + U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) { - // TODO(allen): error + String8 container_name = str8(name.str, container_name_opl - 2); + container_type = pdbconv_type_from_name(ctx, container_name); } + + // container symbol + RADDBGIC_Symbol *container_symbol = 0; + if(container_type == 0) + { + container_symbol = current_procedure; + } + + // get this symbol handle + U64 symbol_id = user_id_base + sym_off_first; + U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + RADDBGIC_Symbol *proc_symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + + // scope + + // NOTE: even if there could be a containing scope at this point (which should be + // illegal in C/C++ but not necessarily in another language) we would not pass + // it here because these scopes refer to the ranges of code that make up a + // procedure *not* the namespaces, so a procedure's root scope always has + // no parent. + U64 scope_id = user_id_base + scope_num; + U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); + RADDBGIC_Scope *root_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); + pdbconv_symbol_push_scope(ctx, root_scope, proc_symbol); + scope_num += 1; + + // set voff range + U64 voff = 0; + COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, proc32->sec); + if(section != 0) + { + U64 voff_first = section->voff + proc32->off; + U64 voff_last = voff_first + proc32->len; + raddbgic_scope_add_voff_range(ctx->root, root_scope, voff_first, voff_last); + + voff = voff_first; + } + + // link name + String8 link_name = {0}; + if(voff != 0) + { + link_name = pdbconv_link_name_find(&ctx->link_names, voff); + } + + // determine link kind + B32 is_extern = (kind == CV_SymKind_GPROC32); + + // set symbol info + RADDBGIC_SymbolInfo info = zero_struct; + info.kind = RADDBGIC_SymbolKind_Procedure; + info.name = name; + info.link_name = link_name; + info.type = type; + info.is_extern = is_extern; + info.container_type = container_type; + info.container_symbol = container_symbol; + info.root_scope = root_scope; + + raddbgic_symbol_set_info(ctx->root, proc_symbol, &info); + }break; + + //- rjf: REGREL32 + case CV_SymKind_REGREL32: + { + // TODO(allen): hide this when it's redundant with better information + // from a CV_SymKind_LOCAL record. + + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)sym_header_struct_base; + String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, regrel32->itype); + + // extract regrel's info + CV_Reg cv_reg = regrel32->reg; + U32 var_off = regrel32->reg_off; + + // need arch for analyzing register stuff + RADDBGI_Arch arch = ctx->arch; + U64 addr_size = ctx->addr_size; + + // determine if this is a parameter + RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; + { + B32 is_stack_reg = 0; + switch (arch) + { + case RADDBGI_Arch_X86: is_stack_reg = (cv_reg == CV_Regx86_ESP); break; + case RADDBGI_Arch_X64: is_stack_reg = (cv_reg == CV_Regx64_RSP); break; + } + if(is_stack_reg) + { + U32 frame_size = 0xFFFFFFFF; + if(current_procedure != 0) + { + PDBCONV_FrameProcData *frameproc = + pdbconv_symbol_frame_proc_read(ctx, current_procedure); + frame_size = frameproc->frame_size; + } + if(var_off > frame_size) + { + local_kind = RADDBGI_LocalKind_Parameter; + } + } + } + + // emit local + U64 local_id = user_id_base + local_num;; + U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); + RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); + local_num += 1; + + RADDBGIC_LocalInfo info = {0}; + info.kind = local_kind; + info.scope = current_scope; + info.name = name; + info.type = type; + raddbgic_local_set_basic_info(ctx->root, local_var, &info); + + // add location to local + { + // will there be an extra indirection to the value + B32 extra_indirection_to_value = 0; + switch (arch) + { + case RADDBGI_Arch_X86: + { + if(local_kind == RADDBGI_LocalKind_Parameter && + (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))) + { + extra_indirection_to_value = 1; + } + }break; + + case RADDBGI_Arch_X64: + { + if(local_kind == RADDBGI_LocalKind_Parameter && + (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))) + { + extra_indirection_to_value = 1; + } + }break; + } + + // get raddbg register code + RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); + // TODO(allen): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // set location case + RADDBGIC_Location *loc = + pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, + (S64)(S32)var_off, extra_indirection_to_value); + + RADDBGIC_LocationSet *locset = raddbgic_location_set_from_local(ctx->root, local_var); + raddbgic_location_set_add_case(ctx->root, locset, 0, max_U64, loc); + } + }break; + + //- rjf: LTHREAD32/GTHREAD32 + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + { + CV_SymThread32 *thread32 = (CV_SymThread32*)sym_header_struct_base; + String8 name = str8_cstring_capped(thread32+1, sym_data_opl); + U32 tls_off = thread32->tls_off; + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, thread32->itype); + + // container type + RADDBGIC_Type *container_type = 0; + U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + container_type = pdbconv_type_from_name(ctx, container_name); + } + + // container symbol + RADDBGIC_Symbol *container_symbol = 0; + if(container_type == 0) + { + container_symbol = current_procedure; + } + + // determine link kind + B32 is_extern = (kind == CV_SymKind_GTHREAD32); + + // setup symbol + U64 symbol_id = user_id_base + sym_off_first; + U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + + RADDBGIC_SymbolInfo info = zero_struct; + info.kind = RADDBGIC_SymbolKind_ThreadVariable; + info.name = name; + info.type = type; + info.is_extern = is_extern; + info.offset = tls_off; + info.container_type = container_type; + info.container_symbol = container_symbol; + + raddbgic_symbol_set_info(ctx->root, symbol, &info); + }break; + + //- rjf: LOCAL + case CV_SymKind_LOCAL: + { + CV_SymLocal *slocal = (CV_SymLocal*)sym_header_struct_base; + String8 name = str8_cstring_capped(slocal+1, sym_data_opl); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, slocal->itype); + + // determine how to handle + B32 begin_a_global_modification = 0; + if((slocal->flags & CV_LocalFlag_Global) || + (slocal->flags & CV_LocalFlag_Static)) + { + begin_a_global_modification = 1; + } + + // emit a global modification + if(begin_a_global_modification) + { + // TODO(allen): add global modification symbols + defrange_target = 0; + defrange_target_is_param = 0; + } + + // emit a local variable else { - // TODO(allen): hide this when it's redundant with better information - // from a CV_SymKind_LOCAL record. - - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)first; - - // name - String8 name = str8_cstring_capped((char*)(regrel32 + 1), first + cap); - - // type of variable - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, regrel32->itype); - - // extract regrel's info - CV_Reg cv_reg = regrel32->reg; - U32 var_off = regrel32->reg_off; - - // need arch for analyzing register stuff - RADDBGI_Arch arch = ctx->arch; - U64 addr_size = ctx->addr_size; - - // determine if this is a parameter + // local kind RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; + if(slocal->flags & CV_LocalFlag_Param) { - B32 is_stack_reg = 0; - switch (arch) - { - case RADDBGI_Arch_X86: is_stack_reg = (cv_reg == CV_Regx86_ESP); break; - case RADDBGI_Arch_X64: is_stack_reg = (cv_reg == CV_Regx64_RSP); break; - } - if(is_stack_reg) - { - U32 frame_size = 0xFFFFFFFF; - if(current_procedure != 0) - { - PDBCONV_FrameProcData *frameproc = - pdbconv_symbol_frame_proc_read(ctx, current_procedure); - frame_size = frameproc->frame_size; - } - if(var_off > frame_size) - { - local_kind = RADDBGI_LocalKind_Parameter; - } - } + local_kind = RADDBGI_LocalKind_Parameter; } // emit local - U64 local_id = user_id_base + local_num;; + U64 local_id = user_id_base + local_num; U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; + local_var->kind = local_kind; + local_var->name = name; + local_var->type = type; RADDBGIC_LocalInfo info = {0}; info.kind = local_kind; @@ -2318,415 +2420,179 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) info.type = type; raddbgic_local_set_basic_info(ctx->root, local_var, &info); - // add location to local - { - // will there be an extra indirection to the value - B32 extra_indirection_to_value = 0; - switch (arch) - { - case RADDBGI_Arch_X86: - { - if(local_kind == RADDBGI_LocalKind_Parameter && - (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))) - { - extra_indirection_to_value = 1; - } - }break; - - case RADDBGI_Arch_X64: - { - if(local_kind == RADDBGI_LocalKind_Parameter && - (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))) - { - extra_indirection_to_value = 1; - } - }break; - } - - // get raddbg register code - RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); - // TODO(allen): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; - - // set location case - RADDBGIC_Location *loc = - pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, - (S64)(S32)var_off, extra_indirection_to_value); - - RADDBGIC_LocationSet *locset = raddbgic_location_set_from_local(ctx->root, local_var); - raddbgic_location_set_add_case(ctx->root, locset, 0, max_U64, loc); - } - } - }break; - - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - //ProfScope("CV_SymKind_LTHREAD32/CV_SymKind_GTHREAD32") - { - if(sizeof(CV_SymThread32) > cap) - { - // TODO(allen): error - } - else - { - CV_SymThread32 *thread32 = (CV_SymThread32*)first; - - // name - String8 name = str8_cstring_capped((char*)(thread32 + 1), first + cap); - - // determine tls off - U32 tls_off = thread32->tls_off; - - // type of variable - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, thread32->itype); - - // container type - RADDBGIC_Type *container_type = 0; - U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - container_type = pdbconv_type_from_name(ctx, container_name); - } - - // container symbol - RADDBGIC_Symbol *container_symbol = 0; - if(container_type == 0) - { - container_symbol = current_procedure; - } - - // determine link kind - B32 is_extern = (kind == CV_SymKind_GTHREAD32); - - // setup symbol - U64 symbol_id = user_id_base + off; - U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - - RADDBGIC_SymbolInfo info = zero_struct; - info.kind = RADDBGIC_SymbolKind_ThreadVariable; - info.name = name; - info.type = type; - info.is_extern = is_extern; - info.offset = tls_off; - info.container_type = container_type; - info.container_symbol = container_symbol; - - raddbgic_symbol_set_info(ctx->root, symbol, &info); - } - }break; - - case CV_SymKind_LOCAL: - //ProfScope("CV_SymKind_LOCAL") - { - if(sizeof(CV_SymLocal) > cap) - { - // TODO(allen): error - } - else - { - CV_SymLocal *slocal = (CV_SymLocal*)first; - - // name - String8 name = str8_cstring_capped((char*)(slocal + 1), first + cap); - - // type of variable - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, slocal->itype); - - // determine how to handle - B32 begin_a_global_modification = 0; - if((slocal->flags & CV_LocalFlag_Global) || - (slocal->flags & CV_LocalFlag_Static)) - { - begin_a_global_modification = 1; - } - - // emit a global modification - if(begin_a_global_modification) - { - // TODO(allen): add global modification symbols - defrange_target = 0; - defrange_target_is_param = 0; - } - - // emit a local variable - else - { - // local kind - RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; - if(slocal->flags & CV_LocalFlag_Param) - { - local_kind = RADDBGI_LocalKind_Parameter; - } - - // emit local - U64 local_id = user_id_base + local_num; - U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); - RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); - local_num += 1; - local_var->kind = local_kind; - local_var->name = name; - local_var->type = type; - - RADDBGIC_LocalInfo info = {0}; - info.kind = local_kind; - info.scope = current_scope; - info.name = name; - info.type = type; - raddbgic_local_set_basic_info(ctx->root, local_var, &info); - - defrange_target = raddbgic_location_set_from_local(ctx->root, local_var); - defrange_target_is_param = (local_kind == RADDBGI_LocalKind_Parameter); - } + defrange_target = raddbgic_location_set_from_local(ctx->root, local_var); + defrange_target_is_param = (local_kind == RADDBGI_LocalKind_Parameter); } }break; + //- rjf: DEFRANGE_REGISTESR case CV_SymKind_DEFRANGE_REGISTER: - //ProfScope("CV_SymKind_DEFRANGE_REGISTER") { - if(sizeof(CV_SymDefrangeRegister) > cap) - { - // TODO(allen): error - } - else - { - if(defrange_target == 0) - { - // TODO(allen): error - } - else - { - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)first; - - // TODO(allen): offset & size from cv_reg code - RADDBGI_Arch arch = ctx->arch; - CV_Reg cv_reg = defrange_register->reg; - RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); - - // setup location - RADDBGIC_Location *location = raddbgic_location_val_reg(ctx->root, register_code); - - // extract range info - CV_LvarAddrRange *range = &defrange_register->range; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register + 1); - U64 gap_count = ((first + cap) - (U8*)gaps)/sizeof(*gaps); - - // emit locations - pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); - } - } + if(defrange_target == 0) { break; } + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; + + // TODO(allen): offset & size from cv_reg code + RADDBGI_Arch arch = ctx->arch; + CV_Reg cv_reg = defrange_register->reg; + RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); + + // setup location + RADDBGIC_Location *location = raddbgic_location_val_reg(ctx->root, register_code); + + // extract range info + CV_LvarAddrRange *range = &defrange_register->range; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // emit locations + pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, + range, gaps, gap_count); }break; + //- rjf: DEFRANGE_FRAMEPOINTER_REL case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - //ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL") { - if(sizeof(CV_SymDefrangeFramepointerRel) > cap) - { - // TODO(allen): error - } - else - { - if(defrange_target == 0) - { - // TODO(allen): error - } - else - { - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)first; - - // select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = - pdbconv_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); - RADDBGI_RegisterCode fp_register_code = - pdbconv_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); - - // setup location - B32 extra_indirection = 0; - U32 byte_size = ctx->addr_size; - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel->off; - RADDBGIC_Location *location = - pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, - var_off, extra_indirection); - - // extract range info - CV_LvarAddrRange *range = &defrange_fprel->range; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); - U64 gap_count = ((first + cap) - (U8*)gaps)/sizeof(*gaps); - - // emit locations - pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); - } - } + if(defrange_target == 0) { break; } + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; + + // select frame pointer register + CV_EncodedFramePtrReg encoded_fp_reg = + pdbconv_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); + RADDBGI_RegisterCode fp_register_code = + pdbconv_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); + + // setup location + B32 extra_indirection = 0; + U32 byte_size = ctx->addr_size; + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel->off; + RADDBGIC_Location *location = + pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, + var_off, extra_indirection); + + // extract range info + CV_LvarAddrRange *range = &defrange_fprel->range; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // emit locations + pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, + range, gaps, gap_count); }break; + //- rjf: DEFRANGE_SUBFIELD_REGISTER case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - //ProfScope("CV_SymKind_DEFRANGE_SUBFIELD_REGISTER") { - if(sizeof(CV_SymDefrangeSubfieldRegister) > cap) + if(defrange_target == 0) { break; } + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; + + // TODO(allen): full "subfield" location system + if(defrange_subfield_register->field_offset == 0) { - // TODO(allen): error - } - else - { - if(defrange_target == 0) - { - // TODO(allen): error - } - else - { - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)first; - - // TODO(allen): full "subfield" location system - if(defrange_subfield_register->field_offset == 0) - { - - // TODO(allen): offset & size from cv_reg code - RADDBGI_Arch arch = ctx->arch; - CV_Reg cv_reg = defrange_subfield_register->reg; - RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); - - // setup location - RADDBGIC_Location *location = raddbgic_location_val_reg(ctx->root, register_code); - - // extract range info - CV_LvarAddrRange *range = &defrange_subfield_register->range; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); - U64 gap_count = ((first + cap) - (U8*)gaps)/sizeof(*gaps); - - // emit locations - pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); - } - } + + // TODO(allen): offset & size from cv_reg code + RADDBGI_Arch arch = ctx->arch; + CV_Reg cv_reg = defrange_subfield_register->reg; + RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); + + // setup location + RADDBGIC_Location *location = raddbgic_location_val_reg(ctx->root, register_code); + + // extract range info + CV_LvarAddrRange *range = &defrange_subfield_register->range; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // emit locations + pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, + range, gaps, gap_count); } }break; + //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - //ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE") { - if(sizeof(CV_SymDefrangeFramepointerRelFullScope) > cap) - { - // TODO(allen): error - } - else - { - if(defrange_target == 0) - { - // TODO(allen): error - } - else - { - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = - (CV_SymDefrangeFramepointerRelFullScope*)first; - - // select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = - pdbconv_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); - RADDBGI_RegisterCode fp_register_code = - pdbconv_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); - - // setup location - B32 extra_indirection = 0; - U32 byte_size = ctx->addr_size; - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel_full_scope->off; - RADDBGIC_Location *location = - pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, - var_off, extra_indirection); - - - // emit location - raddbgic_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location); - } - } + if(defrange_target == 0) { break; } + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = + (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; + + // select frame pointer register + CV_EncodedFramePtrReg encoded_fp_reg = + pdbconv_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); + RADDBGI_RegisterCode fp_register_code = + pdbconv_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); + + // setup location + B32 extra_indirection = 0; + U32 byte_size = ctx->addr_size; + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel_full_scope->off; + RADDBGIC_Location *location = + pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, + var_off, extra_indirection); + + + // emit location + raddbgic_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location); }break; + //- rjf: DEFRANGE_REGISTER_REL case CV_SymKind_DEFRANGE_REGISTER_REL: - //ProfScope("CV_SymKind_DEFRANGE_REGISTER_REL") { - if(sizeof(CV_SymDefrangeRegisterRel) > cap) - { - // TODO(allen): error - } - else - { - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)first; - if(defrange_target == 0) - { - // TODO(rjf): error - } - else - { - // TODO(allen): offset & size from cv_reg code - RADDBGI_Arch arch = ctx->arch; - CV_Reg cv_reg = defrange_register_rel->reg; - RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); - U32 byte_size = ctx->addr_size; - U32 byte_pos = 0; - - B32 extra_indirection_to_value = 0; - S64 var_off = defrange_register_rel->reg_off; - - // setup location - RADDBGIC_Location *location = - pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, - var_off, extra_indirection_to_value); - - // extract range info - CV_LvarAddrRange *range = &defrange_register_rel->range; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); - U64 gap_count = ((first + cap) - (U8*)gaps)/sizeof(*gaps); - - - // emit locations - pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); - } - } + if(defrange_target == 0) { break; } + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; + + // TODO(allen): offset & size from cv_reg code + RADDBGI_Arch arch = ctx->arch; + CV_Reg cv_reg = defrange_register_rel->reg; + RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); + U32 byte_size = ctx->addr_size; + U32 byte_pos = 0; + + B32 extra_indirection_to_value = 0; + S64 var_off = defrange_register_rel->reg_off; + + // setup location + RADDBGIC_Location *location = + pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, + var_off, extra_indirection_to_value); + + // extract range info + CV_LvarAddrRange *range = &defrange_register_rel->range; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // emit locations + pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, + range, gaps, gap_count); }break; + //- rjf: FILESTATIC case CV_SymKind_FILESTATIC: - //ProfScope("CV_SymKind_FILESTATIC") { - if(sizeof(CV_SymFileStatic) > cap) - { - // TODO(allen): error - } - else - { - CV_SymFileStatic *file_static = (CV_SymFileStatic*)first; - - // name - String8 name = str8_cstring_capped((char*)(file_static + 1), first + cap); - - // type of variable - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, file_static->itype); - - // TODO(allen): emit a global modifier symbol - - // defrange records from this point attach to this location information - defrange_target = 0; - defrange_target_is_param = 0; - } + CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; + String8 name = str8_cstring_capped(file_static+1, sym_data_opl); + RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, file_static->itype); + + // TODO(allen): emit a global modifier symbol + + // defrange records from this point attach to this location information + defrange_target = 0; + defrange_target_is_param = 0; }break; } } - // if scope stack isn't empty emit an error + //- rjf: non-empty scope stack? -> error { - RADDBGIC_Scope* scope = pdbconv_symbol_current_scope(ctx); + RADDBGIC_Scope *scope = pdbconv_symbol_current_scope(ctx); if(scope != 0) { // TODO(allen): emit error } } - // clear the scope stack + //- rjf: clear scope stack pdbconv_symbol_clear_scope_stack(ctx); } From 67859f228b510b02f04bb0e25cb183c2f0965982 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 14:37:59 -0800 Subject: [PATCH 056/275] fix parse error checks in raddbgi_from_pdb --- src/raddbgi_convert/pdb/raddbgi_from_pdb.c | 24 ++++++++-------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c index a992ee85..7ac7e73b 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c @@ -1985,18 +1985,12 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) //- rjf: FRAMEPROC case CV_SymKind_FRAMEPROC: { + if(current_proc == 0) { break; } CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; - if(current_proc == 0) - { - // TODO(allen): error - } - else - { - PDBCONV_FrameProcData data = {0}; - data.frame_size = frameproc->frame_size; - data.flags = frameproc->flags; - pdbconv_symbol_frame_proc_write(ctx, current_proc, &data); - } + PDBCONV_FrameProcData data = {0}; + data.frame_size = frameproc->frame_size; + data.flags = frameproc->flags; + pdbconv_symbol_frame_proc_write(ctx, current_proc, &data); }break; //- rjf: LPROC32/GPROC32 @@ -3185,7 +3179,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 leaf_data = pdb_leaf_data_from_tpi(tpi); tpi_leaf = cv_leaf_from_data(arena, leaf_data, tpi->itype_first); - PARSE_CHECK_ERROR(tpi_hash, "TPI leaf data"); + PARSE_CHECK_ERROR(tpi_leaf, "TPI leaf data"); } // parse ipi hash @@ -3196,7 +3190,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); ipi_hash = pdb_tpi_hash_from_data(arena, strtbl, ipi, hash_data, aux_data); - PARSE_CHECK_ERROR(tpi_hash, "IPI hash table"); + PARSE_CHECK_ERROR(ipi_hash, "IPI hash table"); } // parse ipi leaves @@ -3206,7 +3200,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 leaf_data = pdb_leaf_data_from_tpi(ipi); ipi_leaf = cv_leaf_from_data(arena, leaf_data, ipi->itype_first); - PARSE_CHECK_ERROR(tpi_hash, "IPI leaf data"); + PARSE_CHECK_ERROR(ipi_leaf, "IPI leaf data"); } // parse sym @@ -3216,7 +3210,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 sym_data = msf_data_from_stream(msf, dbi->sym_sn); sym = cv_sym_from_data(arena, sym_data, 4); - PARSE_CHECK_ERROR(tpi_hash, "public SYM data"); + PARSE_CHECK_ERROR(sym, "public SYM data"); } // parse compilation units From ecd21d0c1b473639abb9bec8f1199f5406066baa Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 15:05:46 -0800 Subject: [PATCH 057/275] pdbconv -> p2r --- README.md | 2 +- src/raddbg/raddbg.c | 6 +- src/raddbgi_convert/pdb/raddbgi_from_pdb.c | 390 +++++++++--------- src/raddbgi_convert/pdb/raddbgi_from_pdb.h | 220 +++++----- .../pdb/raddbgi_from_pdb_main.c | 6 +- 5 files changed, 312 insertions(+), 312 deletions(-) diff --git a/README.md b/README.md index 64ece646..a6cb64c5 100644 --- a/README.md +++ b/README.md @@ -315,7 +315,7 @@ A list of the layers in the codebase and their associated namespaces is below: - `raddbg` (no namespace): The layer which ties everything together for the main graphical debugger. Not much "meat", just drives `df`, implements command line options, and so on. -- `raddbgi_convert` (`PDBCONV_`): Our implementation of PDB-to-RADDBGI and +- `raddbgi_convert` (`P2R_`): Our implementation of PDB-to-RADDBGI and DWARF-to-RADDBGI conversion. - `raddbgi_dump` (`RADDBGIDUMP_`): A dumper utility program for dumping textualizations of RADDBGI debug info files. diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 6ced157b..3f5a43ee 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -616,7 +616,7 @@ entry_point(int argc, char **argv) Temp scratch = scratch_begin(0, 0); //- rjf: parse arguments - PDBCONV_Params *params = pdb_convert_params_from_cmd_line(scratch.arena, &cmdln); + P2R_Params *params = p2r_params_from_cmd_line(scratch.arena, &cmdln); //- rjf: open output file String8 output_name = push_str8_copy(scratch.arena, params->output_name); @@ -624,10 +624,10 @@ entry_point(int argc, char **argv) B32 out_file_is_good = !os_handle_match(out_file, os_handle_zero()); //- rjf: convert - PDBCONV_Out *out = 0; + P2R_Out *out = 0; if(out_file_is_good) { - out = pdbconv_convert(scratch.arena, params); + out = p2r_convert(scratch.arena, params); } //- rjf: bake file diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c index 7ac7e73b..82fc6b1c 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.c @@ -4,10 +4,10 @@ //////////////////////////////// //~ rjf: Command Line -> Conversion Parameters -internal PDBCONV_Params* -pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline) +internal P2R_Params* +p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline) { - PDBCONV_Params *result = push_array(arena, PDBCONV_Params, 1); + P2R_Params *result = push_array(arena, P2R_Params, 1); // get input pdb { @@ -153,11 +153,11 @@ pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline) //- rjf: pdb conversion context creation -internal PDBCONV_Ctx * -pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root) +internal P2R_Ctx * +p2r_ctx_alloc(P2R_CtxParams *params, RADDBGIC_Root *out_root) { Arena *arena = arena_alloc(); - PDBCONV_Ctx *pdb_ctx = push_array(arena, PDBCONV_Ctx, 1); + P2R_Ctx *pdb_ctx = push_array(arena, P2R_Ctx, 1); pdb_ctx->arena = arena; pdb_ctx->arch = params->arch; pdb_ctx->addr_size = raddbgi_addr_size_from_arch(pdb_ctx->arch); @@ -172,32 +172,32 @@ pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root) pdb_ctx->known_globals.buckets_count = BKTCOUNT(params->known_global_map_bucket_count); pdb_ctx->link_names.buckets_count = BKTCOUNT(params->link_name_map_bucket_count); #undef BKTCOUNT - pdb_ctx->fwd_map.buckets = push_array(pdb_ctx->arena, PDBCONV_FwdNode *, pdb_ctx->fwd_map.buckets_count); - pdb_ctx->frame_proc_map.buckets = push_array(pdb_ctx->arena, PDBCONV_FrameProcNode *, pdb_ctx->frame_proc_map.buckets_count); - pdb_ctx->known_globals.buckets = push_array(pdb_ctx->arena, PDBCONV_KnownGlobalNode *, pdb_ctx->known_globals.buckets_count); - pdb_ctx->link_names.buckets = push_array(pdb_ctx->arena, PDBCONV_LinkNameNode *, pdb_ctx->link_names.buckets_count); + pdb_ctx->fwd_map.buckets = push_array(pdb_ctx->arena, P2R_FwdNode *, pdb_ctx->fwd_map.buckets_count); + pdb_ctx->frame_proc_map.buckets = push_array(pdb_ctx->arena, P2R_FrameProcNode *, pdb_ctx->frame_proc_map.buckets_count); + pdb_ctx->known_globals.buckets = push_array(pdb_ctx->arena, P2R_KnownGlobalNode *, pdb_ctx->known_globals.buckets_count); + pdb_ctx->link_names.buckets = push_array(pdb_ctx->arena, P2R_LinkNameNode *, pdb_ctx->link_names.buckets_count); return pdb_ctx; } //- rjf: pdb types and symbols internal void -pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *params) +p2r_types_and_symbols(P2R_Ctx *pdb_ctx, P2R_TypesSymbolsParams *params) { ProfBeginFunction(); // convert types - pdbconv_type_cons_main_passes(pdb_ctx); + p2r_type_cons_main_passes(pdb_ctx); if(params->sym != 0) { - pdbconv_gather_link_names(pdb_ctx, params->sym); - pdbconv_symbol_cons(pdb_ctx, params->sym, 0); + p2r_gather_link_names(pdb_ctx, params->sym); + p2r_symbol_cons(pdb_ctx, params->sym, 0); } U64 unit_count = params->unit_count; for(U64 i = 0; i < unit_count; i += 1) { CV_SymParsed *unit_sym = params->sym_for_unit[i]; - pdbconv_symbol_cons(pdb_ctx, unit_sym, 1 + i); + p2r_symbol_cons(pdb_ctx, unit_sym, 1 + i); } ProfEnd(); @@ -206,7 +206,7 @@ pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *para //- rjf: decoding helpers internal U32 -pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num) +p2r_u32_from_numeric(P2R_Ctx *ctx, CV_NumericParsed *num) { U64 n_u64 = cv_u64_from_numeric(num); U32 n_u32 = (U32)n_u64; @@ -219,7 +219,7 @@ pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num) } internal COFF_SectionHeader * -pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U32 sec_num) +p2r_sec_header_from_sec_num(P2R_Ctx *ctx, U32 sec_num) { COFF_SectionHeader *result = 0; if(0 < sec_num && sec_num <= ctx->section_count) @@ -232,7 +232,7 @@ pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U32 sec_num) //- rjf: type info internal void -pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx) +p2r_type_cons_main_passes(P2R_Ctx *ctx) { ProfBeginFunction(); CV_TypeId itype_first = ctx->leaf->itype_first; @@ -251,7 +251,7 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx) { for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) { - pdbconv_type_resolve_fwd(ctx, itype); + p2r_type_resolve_fwd(ctx, itype); } } @@ -260,29 +260,29 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx) { for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) { - pdbconv_type_resolve_itype(ctx, itype); + p2r_type_resolve_itype(ctx, itype); } } // construct member info ProfScope("construct member info") { - for(PDBCONV_TypeRev *rev = ctx->member_revisit_first; + for(P2R_TypeRev *rev = ctx->member_revisit_first; rev != 0; rev = rev->next) { - pdbconv_type_equip_members(ctx, rev->owner_type, rev->field_itype); + p2r_type_equip_members(ctx, rev->owner_type, rev->field_itype); } } // construct enum info ProfScope("construct enum info") { - for(PDBCONV_TypeRev *rev = ctx->enum_revisit_first; + for(P2R_TypeRev *rev = ctx->enum_revisit_first; rev != 0; rev = rev->next) { - pdbconv_type_equip_enumerates(ctx, rev->owner_type, rev->field_itype); + p2r_type_equip_enumerates(ctx, rev->owner_type, rev->field_itype); } } @@ -291,7 +291,7 @@ pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx) } internal CV_TypeId -pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype) +p2r_type_resolve_fwd(P2R_Ctx *ctx, CV_TypeId itype) { ProfBeginFunction(); Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); @@ -453,7 +453,7 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype) // save in map if(result != 0) { - pdbconv_type_fwd_map_set(ctx->arena, &ctx->fwd_map, itype, result); + p2r_type_fwd_map_set(ctx->arena, &ctx->fwd_map, itype, result); } ProfEnd(); @@ -461,14 +461,14 @@ pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype) } internal RADDBGIC_Type* -pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype) +p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype) { B32 is_basic = (itype < 0x1000); // convert fwd references to real types if(!is_basic) { - CV_TypeId resolved_itype = pdbconv_type_fwd_map_get(&ctx->fwd_map, itype); + CV_TypeId resolved_itype = p2r_type_fwd_map_get(&ctx->fwd_map, itype); if(resolved_itype != 0) { itype = resolved_itype; @@ -481,13 +481,13 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype) // basic type if(result == 0 && is_basic) { - result = pdbconv_type_cons_basic(ctx, itype); + result = p2r_type_cons_basic(ctx, itype); } // leaf decode if(result == 0 && (ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl)) { - result = pdbconv_type_cons_leaf_record(ctx, itype); + result = p2r_type_cons_leaf_record(ctx, itype); } // never return null, return "nil" instead @@ -500,7 +500,7 @@ pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype) } internal void -pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype) +p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype) { Temp scratch = scratch_begin(0, 0); @@ -613,8 +613,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI list_item_opl_off = name_off + name.size + 1; // emit member - RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, member->itype); - U32 offset_u32 = pdbconv_u32_from_numeric(ctx, &offset); + RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, member->itype); + U32 offset_u32 = p2r_u32_from_numeric(ctx, &offset); raddbgic_type_add_member_data_field(ctx->root, owner_type, name, mem_type, offset_u32); } }break; @@ -635,7 +635,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // TODO(allen): handle attribs // emit member - RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, stmember->itype); + RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, stmember->itype); raddbgic_type_add_member_static_data(ctx->root, owner_type, name, mem_type); } }break; @@ -720,7 +720,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // TODO(allen): handle attribs // emit - RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, method->itype); + RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, method->itype); switch (prop) { @@ -774,7 +774,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // TODO(allen): handle attribs // emit - RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, one_method->itype); + RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, one_method->itype); switch (prop) { @@ -813,7 +813,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI list_item_opl_off = name_off + name.size + 1; // emit member - RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, nest_type->itype); + RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, nest_type->itype); raddbgic_type_add_member_nested_type(ctx->root, owner_type, mem_type); } }break; @@ -834,7 +834,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // TODO(allen): handle attribs // emit member - RADDBGIC_Type *mem_type = pdbconv_type_resolve_itype(ctx, nest_type->itype); + RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, nest_type->itype); raddbgic_type_add_member_nested_type(ctx->root, owner_type, mem_type); } }break; @@ -855,8 +855,8 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // TODO(allen): handle attribs // emit member - RADDBGIC_Type *base_type = pdbconv_type_resolve_itype(ctx, bclass->itype); - U32 offset_u32 = pdbconv_u32_from_numeric(ctx, &offset); + RADDBGIC_Type *base_type = p2r_type_resolve_itype(ctx, bclass->itype); + U32 offset_u32 = p2r_u32_from_numeric(ctx, &offset); raddbgic_type_add_member_base(ctx->root, owner_type, base_type, offset_u32); } }break; @@ -881,9 +881,9 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI // TODO(allen): handle attribs // emit member - RADDBGIC_Type *base_type = pdbconv_type_resolve_itype(ctx, vbclass->itype); - U32 vbptr_offset_u32 = pdbconv_u32_from_numeric(ctx, &num1); - U32 vtable_offset_u32 = pdbconv_u32_from_numeric(ctx, &num2); + RADDBGIC_Type *base_type = p2r_type_resolve_itype(ctx, vbclass->itype); + U32 vbptr_offset_u32 = p2r_u32_from_numeric(ctx, &num1); + U32 vtable_offset_u32 = p2r_u32_from_numeric(ctx, &num2); raddbgic_type_add_member_virtual_base(ctx->root, owner_type, base_type, vbptr_offset_u32, vtable_offset_u32); } @@ -918,7 +918,7 @@ pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeI } internal void -pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype) +p2r_type_equip_enumerates(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype) { Temp scratch = scratch_begin(0, 0); @@ -1053,7 +1053,7 @@ pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_Ty } internal RADDBGIC_Type* -pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype) +p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype) { Assert(itype < 0x1000); @@ -1266,7 +1266,7 @@ pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype) } internal RADDBGIC_Type* -pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) +p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) { Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); @@ -1300,7 +1300,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) flags |= RADDBGI_TypeModifierFlag_Volatile; } - RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, modifier->itype); + RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, modifier->itype); if(flags != 0) { result = raddbgic_type_modifier(ctx->root, direct_type, flags); @@ -1355,7 +1355,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) type_kind = RADDBGI_TypeKind_RRef; } - RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, pointer->itype); + RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, pointer->itype); RADDBGIC_Type *ptr_type = raddbgic_type_pointer(ctx->root, direct_type, type_kind); result = ptr_type; @@ -1377,10 +1377,10 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) // TODO(allen): handle call_kind & attribs - RADDBGIC_Type *ret_type = pdbconv_type_resolve_and_check(ctx, procedure->ret_itype); + RADDBGIC_Type *ret_type = p2r_type_resolve_and_check(ctx, procedure->ret_itype); RADDBGIC_TypeList param_list = {0}; - pdbconv_type_resolve_arglist(scratch.arena, ¶m_list, ctx, procedure->arg_itype); + p2r_type_resolve_arglist(scratch.arena, ¶m_list, ctx, procedure->arg_itype); result = raddbgic_type_proc(ctx->root, ret_type, ¶m_list); @@ -1400,15 +1400,15 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) // TODO(allen): handle call_kind & attribs // TODO(allen): preserve "this_adjust" - RADDBGIC_Type *ret_type = pdbconv_type_resolve_and_check(ctx, mfunction->ret_itype); + RADDBGIC_Type *ret_type = p2r_type_resolve_and_check(ctx, mfunction->ret_itype); RADDBGIC_TypeList param_list = {0}; - pdbconv_type_resolve_arglist(scratch.arena, ¶m_list, ctx, mfunction->arg_itype); + p2r_type_resolve_arglist(scratch.arena, ¶m_list, ctx, mfunction->arg_itype); RADDBGIC_Type *this_type = 0; if(mfunction->this_itype != 0) { - this_type = pdbconv_type_resolve_and_check(ctx, mfunction->this_itype); + this_type = p2r_type_resolve_and_check(ctx, mfunction->this_itype); result = raddbgic_type_method(ctx->root, this_type, ret_type, ¶m_list); } else @@ -1426,7 +1426,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) if(sizeof(CV_LeafBitField) <= cap) { CV_LeafBitField *bit_field = (CV_LeafBitField*)first; - RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, bit_field->itype); + RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, bit_field->itype); result = raddbgic_type_bitfield(ctx->root, direct_type, bit_field->pos, bit_field->len); } }break; @@ -1444,7 +1444,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) U64 full_size = cv_u64_from_numeric(&array_count); - RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, array->entry_itype); + RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, array->entry_itype); U64 count = full_size; if(direct_type != 0 && direct_type->byte_size != 0) { @@ -1498,7 +1498,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) // remember to revisit this for members { - PDBCONV_TypeRev *rev = push_array(ctx->arena, PDBCONV_TypeRev, 1); + P2R_TypeRev *rev = push_array(ctx->arena, P2R_TypeRev, 1); rev->owner_type = result; rev->field_itype = lf_struct->field_itype; SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); @@ -1549,7 +1549,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) // remember to revisit this for members { - PDBCONV_TypeRev *rev = push_array(ctx->arena, PDBCONV_TypeRev, 1); + P2R_TypeRev *rev = push_array(ctx->arena, P2R_TypeRev, 1); rev->owner_type = result; rev->field_itype = lf_struct->field_itype; SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); @@ -1590,7 +1590,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) // remember to revisit this for members { - PDBCONV_TypeRev *rev = push_array(ctx->arena, PDBCONV_TypeRev, 1); + P2R_TypeRev *rev = push_array(ctx->arena, P2R_TypeRev, 1); rev->owner_type = result; rev->field_itype = lf_union->field_itype; SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); @@ -1621,12 +1621,12 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) // complete type else { - RADDBGIC_Type *direct_type = pdbconv_type_resolve_and_check(ctx, lf_enum->base_itype); + RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, lf_enum->base_itype); result = raddbgic_type_enum(ctx->root, direct_type, name); // remember to revisit this for enumerates { - PDBCONV_TypeRev *rev = push_array(ctx->arena, PDBCONV_TypeRev, 1); + P2R_TypeRev *rev = push_array(ctx->arena, P2R_TypeRev, 1); rev->owner_type = result; rev->field_itype = lf_enum->field_itype; SLLQueuePush(ctx->enum_revisit_first, ctx->enum_revisit_last, rev); @@ -1794,9 +1794,9 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype) } internal RADDBGIC_Type* -pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype) +p2r_type_resolve_and_check(P2R_Ctx *ctx, CV_TypeId itype) { - RADDBGIC_Type *result = pdbconv_type_resolve_itype(ctx, itype); + RADDBGIC_Type *result = p2r_type_resolve_itype(ctx, itype); if(raddbgic_type_is_unhandled_nil(ctx->root, result)) { raddbgic_push_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); @@ -1805,8 +1805,8 @@ pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype) } internal void -pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, - PDBCONV_Ctx *ctx, CV_TypeId arglist_itype) +p2r_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, + P2R_Ctx *ctx, CV_TypeId arglist_itype) { ProfBeginFunction(); @@ -1832,7 +1832,7 @@ pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, U32 clamped_count = ClampTop(arglist->count, max_count); for(U32 i = 0; i < clamped_count; i += 1) { - RADDBGIC_Type *param_type = pdbconv_type_resolve_and_check(ctx, itypes[i]); + RADDBGIC_Type *param_type = p2r_type_resolve_and_check(ctx, itypes[i]); raddbgic_type_list_push(arena, out, param_type); } @@ -1844,7 +1844,7 @@ pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, } internal RADDBGIC_Type* -pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name) +p2r_type_from_name(P2R_Ctx *ctx, String8 name) { // TODO(rjf): no idea if this is correct CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); @@ -1853,13 +1853,13 @@ pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name) } internal void -pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_TypeId val) +p2r_type_fwd_map_set(Arena *arena, P2R_FwdMap *map, CV_TypeId key, CV_TypeId val) { U64 bucket_idx = key%map->buckets_count; // search for an existing match - PDBCONV_FwdNode *match = 0; - for(PDBCONV_FwdNode *node = map->buckets[bucket_idx]; + P2R_FwdNode *match = 0; + for(P2R_FwdNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) { @@ -1873,7 +1873,7 @@ pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_Ty // create a new node if no match if(match == 0) { - match = push_array(arena, PDBCONV_FwdNode, 1); + match = push_array(arena, P2R_FwdNode, 1); SLLStackPush(map->buckets[bucket_idx], match); match->key = key; map->pair_count += 1; @@ -1885,13 +1885,13 @@ pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, CV_TypeId key, CV_Ty } internal CV_TypeId -pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key) +p2r_type_fwd_map_get(P2R_FwdMap *map, CV_TypeId key) { U64 bucket_idx = key%map->buckets_count; // search for an existing match - PDBCONV_FwdNode *match = 0; - for(PDBCONV_FwdNode *node = map->buckets[bucket_idx]; + P2R_FwdNode *match = 0; + for(P2R_FwdNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) { @@ -1915,28 +1915,28 @@ pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key) //- symbols internal U64 -pdbconv_hash_from_local_user_id(U64 sym_hash, U64 id) +p2r_hash_from_local_user_id(U64 sym_hash, U64 id) { U64 hash = id ^ (sym_hash<<1) ^ (sym_hash<<4); return hash; } internal U64 -pdbconv_hash_from_scope_user_id(U64 sym_hash, U64 id) +p2r_hash_from_scope_user_id(U64 sym_hash, U64 id) { U64 hash = id ^ (sym_hash<<1) ^ (sym_hash<<4); return hash; } internal U64 -pdbconv_hash_from_symbol_user_id(U64 sym_hash, U64 id) +p2r_hash_from_symbol_user_id(U64 sym_hash, U64 id) { U64 hash = id/8 + id ^ (sym_hash<<1) ^ (sym_hash<<4); return hash; } internal void -pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) +p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -1987,10 +1987,10 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { if(current_proc == 0) { break; } CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; - PDBCONV_FrameProcData data = {0}; + P2R_FrameProcData data = {0}; data.frame_size = frameproc->frame_size; data.flags = frameproc->flags; - pdbconv_symbol_frame_proc_write(ctx, current_proc, &data); + p2r_symbol_frame_proc_write(ctx, current_proc, &data); }break; //- rjf: LPROC32/GPROC32 @@ -1998,7 +1998,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) case CV_SymKind_GPROC32: { U64 symbol_id = user_id_base + sym_off_first; - U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); current_proc = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); }break; } @@ -2043,7 +2043,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } //- rjf: unpack current state - RADDBGIC_Scope *current_scope = pdbconv_symbol_current_scope(ctx); + RADDBGIC_Scope *current_scope = p2r_symbol_current_scope(ctx); RADDBGIC_Symbol *current_procedure = 0; if(current_scope != 0) { @@ -2058,7 +2058,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) //- rjf: END case CV_SymKind_END: { - pdbconv_symbol_pop_scope(ctx); + p2r_symbol_pop_scope(ctx); defrange_target = 0; defrange_target_is_param = 0; }break; @@ -2071,13 +2071,13 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // scope U64 scope_id = user_id_base + scope_num; scope_num += 1; - U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); + U64 scope_hash = p2r_hash_from_scope_user_id(sym_unique_id_hash, scope_id); RADDBGIC_Scope *block_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); raddbgic_scope_set_parent(ctx->root, block_scope, current_scope); - pdbconv_symbol_push_scope(ctx, block_scope, current_procedure); + p2r_symbol_push_scope(ctx, block_scope, current_procedure); // set voff range - COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, block32->sec); + COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, block32->sec); if(section != 0) { U64 voff_first = section->voff + block32->off; @@ -2094,27 +2094,27 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) String8 name = str8_cstring_capped(data32+1, sym_data_opl); // determine voff - COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, data32->sec); + COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, data32->sec); U64 voff = ((section != 0)?section->voff:0) + data32->off; // deduplicate global variable symbols with the same name & offset // * PDB likes to have duplicates of these spread across // * different symbol streams so we deduplicate across the // * entire translation context. - if(!pdbconv_known_global_lookup(&ctx->known_globals, name, voff)) + if(!p2r_known_global_lookup(&ctx->known_globals, name, voff)) { - pdbconv_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); + p2r_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); // type of variable - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, data32->itype); + RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, data32->itype); // container type RADDBGIC_Type *container_type = 0; - U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); if(container_name_opl > 2) { String8 container_name = str8(name.str, container_name_opl - 2); - container_type = pdbconv_type_from_name(ctx, container_name); + container_type = p2r_type_from_name(ctx, container_name); } // container symbol @@ -2129,7 +2129,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // cons this symbol U64 symbol_id = user_id_base + sym_off_first; - U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); RADDBGIC_SymbolInfo info = zero_struct; @@ -2151,15 +2151,15 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { CV_SymProc32 *proc32 = (CV_SymProc32*)sym_header_struct_base; String8 name = str8_cstring_capped(proc32+1, sym_data_opl); - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, proc32->itype); + RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, proc32->itype); // container type RADDBGIC_Type *container_type = 0; - U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); if(container_name_opl > 2) { String8 container_name = str8(name.str, container_name_opl - 2); - container_type = pdbconv_type_from_name(ctx, container_name); + container_type = p2r_type_from_name(ctx, container_name); } // container symbol @@ -2171,7 +2171,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // get this symbol handle U64 symbol_id = user_id_base + sym_off_first; - U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); RADDBGIC_Symbol *proc_symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); // scope @@ -2182,14 +2182,14 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // procedure *not* the namespaces, so a procedure's root scope always has // no parent. U64 scope_id = user_id_base + scope_num; - U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id); + U64 scope_hash = p2r_hash_from_scope_user_id(sym_unique_id_hash, scope_id); RADDBGIC_Scope *root_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); - pdbconv_symbol_push_scope(ctx, root_scope, proc_symbol); + p2r_symbol_push_scope(ctx, root_scope, proc_symbol); scope_num += 1; // set voff range U64 voff = 0; - COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, proc32->sec); + COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, proc32->sec); if(section != 0) { U64 voff_first = section->voff + proc32->off; @@ -2203,7 +2203,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) String8 link_name = {0}; if(voff != 0) { - link_name = pdbconv_link_name_find(&ctx->link_names, voff); + link_name = p2r_link_name_find(&ctx->link_names, voff); } // determine link kind @@ -2231,7 +2231,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)sym_header_struct_base; String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, regrel32->itype); + RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, regrel32->itype); // extract regrel's info CV_Reg cv_reg = regrel32->reg; @@ -2255,8 +2255,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U32 frame_size = 0xFFFFFFFF; if(current_procedure != 0) { - PDBCONV_FrameProcData *frameproc = - pdbconv_symbol_frame_proc_read(ctx, current_procedure); + P2R_FrameProcData *frameproc = + p2r_symbol_frame_proc_read(ctx, current_procedure); frame_size = frameproc->frame_size; } if(var_off > frame_size) @@ -2268,7 +2268,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // emit local U64 local_id = user_id_base + local_num;; - U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); + U64 local_id_hash = p2r_hash_from_local_user_id(sym_unique_id_hash, local_id); RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; @@ -2312,8 +2312,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // set location case RADDBGIC_Location *loc = - pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, - (S64)(S32)var_off, extra_indirection_to_value); + p2r_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, + (S64)(S32)var_off, extra_indirection_to_value); RADDBGIC_LocationSet *locset = raddbgic_location_set_from_local(ctx->root, local_var); raddbgic_location_set_add_case(ctx->root, locset, 0, max_U64, loc); @@ -2327,15 +2327,15 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) CV_SymThread32 *thread32 = (CV_SymThread32*)sym_header_struct_base; String8 name = str8_cstring_capped(thread32+1, sym_data_opl); U32 tls_off = thread32->tls_off; - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, thread32->itype); + RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, thread32->itype); // container type RADDBGIC_Type *container_type = 0; - U64 container_name_opl = pdbconv_end_of_cplusplus_container_name(name); + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); if(container_name_opl > 2) { String8 container_name = str8(name.str, container_name_opl - 2); - container_type = pdbconv_type_from_name(ctx, container_name); + container_type = p2r_type_from_name(ctx, container_name); } // container symbol @@ -2350,7 +2350,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // setup symbol U64 symbol_id = user_id_base + sym_off_first; - U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); + U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); RADDBGIC_SymbolInfo info = zero_struct; @@ -2370,7 +2370,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { CV_SymLocal *slocal = (CV_SymLocal*)sym_header_struct_base; String8 name = str8_cstring_capped(slocal+1, sym_data_opl); - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, slocal->itype); + RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, slocal->itype); // determine how to handle B32 begin_a_global_modification = 0; @@ -2400,7 +2400,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // emit local U64 local_id = user_id_base + local_num; - U64 local_id_hash = pdbconv_hash_from_local_user_id(sym_unique_id_hash, local_id); + U64 local_id_hash = p2r_hash_from_local_user_id(sym_unique_id_hash, local_id); RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; local_var->kind = local_kind; @@ -2439,8 +2439,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); // emit locations - pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); + p2r_location_over_lvar_addr_range(ctx, defrange_target, location, + range, gaps, gap_count); }break; //- rjf: DEFRANGE_FRAMEPOINTER_REL @@ -2451,9 +2451,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // select frame pointer register CV_EncodedFramePtrReg encoded_fp_reg = - pdbconv_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); + p2r_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); RADDBGI_RegisterCode fp_register_code = - pdbconv_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); + p2r_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); // setup location B32 extra_indirection = 0; @@ -2461,8 +2461,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel->off; RADDBGIC_Location *location = - pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, - var_off, extra_indirection); + p2r_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, + var_off, extra_indirection); // extract range info CV_LvarAddrRange *range = &defrange_fprel->range; @@ -2470,8 +2470,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); // emit locations - pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); + p2r_location_over_lvar_addr_range(ctx, defrange_target, location, + range, gaps, gap_count); }break; //- rjf: DEFRANGE_SUBFIELD_REGISTER @@ -2498,8 +2498,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); // emit locations - pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); + p2r_location_over_lvar_addr_range(ctx, defrange_target, location, + range, gaps, gap_count); } }break; @@ -2512,9 +2512,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // select frame pointer register CV_EncodedFramePtrReg encoded_fp_reg = - pdbconv_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); + p2r_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); RADDBGI_RegisterCode fp_register_code = - pdbconv_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); + p2r_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); // setup location B32 extra_indirection = 0; @@ -2522,8 +2522,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel_full_scope->off; RADDBGIC_Location *location = - pdbconv_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, - var_off, extra_indirection); + p2r_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, + var_off, extra_indirection); // emit location @@ -2548,8 +2548,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // setup location RADDBGIC_Location *location = - pdbconv_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, - var_off, extra_indirection_to_value); + p2r_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, + var_off, extra_indirection_to_value); // extract range info CV_LvarAddrRange *range = &defrange_register_rel->range; @@ -2557,8 +2557,8 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); // emit locations - pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); + p2r_location_over_lvar_addr_range(ctx, defrange_target, location, + range, gaps, gap_count); }break; //- rjf: FILESTATIC @@ -2566,7 +2566,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; String8 name = str8_cstring_capped(file_static+1, sym_data_opl); - RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, file_static->itype); + RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, file_static->itype); // TODO(allen): emit a global modifier symbol @@ -2579,7 +2579,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) //- rjf: non-empty scope stack? -> error { - RADDBGIC_Scope *scope = pdbconv_symbol_current_scope(ctx); + RADDBGIC_Scope *scope = p2r_symbol_current_scope(ctx); if(scope != 0) { // TODO(allen): emit error @@ -2587,7 +2587,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } //- rjf: clear scope stack - pdbconv_symbol_clear_scope_stack(ctx); + p2r_symbol_clear_scope_stack(ctx); } scratch_end(scratch); @@ -2595,7 +2595,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } internal void -pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym) +p2r_gather_link_names(P2R_Ctx *ctx, CV_SymParsed *sym) { ProfBeginFunction(); // extract important values from parameters @@ -2636,14 +2636,14 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym) // calculate voff U64 voff = 0; - COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, pub32->sec); + COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, pub32->sec); if(section != 0) { voff = section->voff + pub32->off; } // save link name - pdbconv_link_name_save(ctx->arena, &ctx->link_names, voff, name); + p2r_link_name_save(ctx->arena, &ctx->link_names, voff, name); } }break; } @@ -2654,16 +2654,16 @@ pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym) // "frameproc" map internal void -pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key,PDBCONV_FrameProcData *data) +p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RADDBGIC_Symbol *key,P2R_FrameProcData *data) { ProfBeginFunction(); U64 key_int = IntFromPtr(key); - PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; + P2R_FrameProcMap *map = &ctx->frame_proc_map; U32 bucket_idx = key_int%map->buckets_count; // find match - PDBCONV_FrameProcNode *match = 0; - for(PDBCONV_FrameProcNode *node = map->buckets[bucket_idx]; + P2R_FrameProcNode *match = 0; + for(P2R_FrameProcNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) { @@ -2683,7 +2683,7 @@ pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key,PDBCONV_Fr // insert new association if no match if(match == 0) { - match = push_array(ctx->arena, PDBCONV_FrameProcNode, 1); + match = push_array(ctx->arena, P2R_FrameProcNode, 1); SLLStackPush(map->buckets[bucket_idx], match); match->key = key; MemoryCopyStruct(&match->data, data); @@ -2693,16 +2693,16 @@ pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key,PDBCONV_Fr ProfEnd(); } -internal PDBCONV_FrameProcData* -pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key) +internal P2R_FrameProcData* +p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RADDBGIC_Symbol *key) { U64 key_int = IntFromPtr(key); - PDBCONV_FrameProcMap *map = &ctx->frame_proc_map; + P2R_FrameProcMap *map = &ctx->frame_proc_map; U32 bucket_idx = key_int%map->buckets_count; // find match - PDBCONV_FrameProcData *result = 0; - for(PDBCONV_FrameProcNode *node = map->buckets[bucket_idx]; + P2R_FrameProcData *result = 0; + for(P2R_FrameProcNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) { @@ -2718,12 +2718,12 @@ pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key) // scope stack internal void -pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol) +p2r_symbol_push_scope(P2R_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol) { - PDBCONV_ScopeNode *node = ctx->scope_node_free; + P2R_ScopeNode *node = ctx->scope_node_free; if(node == 0) { - node = push_array(ctx->arena, PDBCONV_ScopeNode, 1); + node = push_array(ctx->arena, P2R_ScopeNode, 1); } else { @@ -2735,9 +2735,9 @@ pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symb } internal void -pdbconv_symbol_pop_scope(PDBCONV_Ctx *ctx) +p2r_symbol_pop_scope(P2R_Ctx *ctx) { - PDBCONV_ScopeNode *node = ctx->scope_stack; + P2R_ScopeNode *node = ctx->scope_stack; if(node != 0) { SLLStackPop(ctx->scope_stack); @@ -2746,11 +2746,11 @@ pdbconv_symbol_pop_scope(PDBCONV_Ctx *ctx) } internal void -pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx) +p2r_symbol_clear_scope_stack(P2R_Ctx *ctx) { for(;;) { - PDBCONV_ScopeNode *node = ctx->scope_stack; + P2R_ScopeNode *node = ctx->scope_stack; if(node == 0) { break; @@ -2763,7 +2763,7 @@ pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx) // PDB/C++ name parsing helper internal U64 -pdbconv_end_of_cplusplus_container_name(String8 str) +p2r_end_of_cplusplus_container_name(String8 str) { // NOTE: This finds the index one past the last "::" contained in str. // if no "::" is contained in str, then the returned index is 0. @@ -2787,7 +2787,7 @@ pdbconv_end_of_cplusplus_container_name(String8 str) // known global set internal U64 -pdbconv_known_global_hash(String8 name, U64 voff) +p2r_known_global_hash(String8 name, U64 voff) { U64 result = 5381 ^ voff; U8 *ptr = name.str; @@ -2800,13 +2800,13 @@ pdbconv_known_global_hash(String8 name, U64 voff) } internal B32 -pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff) +p2r_known_global_lookup(P2R_KnownGlobalSet *set, String8 name, U64 voff) { - U64 hash = pdbconv_known_global_hash(name, voff); + U64 hash = p2r_known_global_hash(name, voff); U64 bucket_idx = hash%set->buckets_count; - PDBCONV_KnownGlobalNode *match = 0; - for(PDBCONV_KnownGlobalNode *node = set->buckets[bucket_idx]; + P2R_KnownGlobalNode *match = 0; + for(P2R_KnownGlobalNode *node = set->buckets[bucket_idx]; node != 0; node = node->next) { @@ -2824,13 +2824,13 @@ pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff) } internal void -pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 name, U64 voff) +p2r_known_global_insert(Arena *arena, P2R_KnownGlobalSet *set, String8 name, U64 voff) { - U64 hash = pdbconv_known_global_hash(name, voff); + U64 hash = p2r_known_global_hash(name, voff); U64 bucket_idx = hash%set->buckets_count; - PDBCONV_KnownGlobalNode *match = 0; - for(PDBCONV_KnownGlobalNode *node = set->buckets[bucket_idx]; + P2R_KnownGlobalNode *match = 0; + for(P2R_KnownGlobalNode *node = set->buckets[bucket_idx]; node != 0; node = node->next) { @@ -2845,7 +2845,7 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n if(match == 0) { - PDBCONV_KnownGlobalNode *node = push_array(arena, PDBCONV_KnownGlobalNode, 1); + P2R_KnownGlobalNode *node = push_array(arena, P2R_KnownGlobalNode, 1); SLLStackPush(set->buckets[bucket_idx], node); node->key_name = push_str8_copy(arena, name); node->key_voff = voff; @@ -2858,12 +2858,12 @@ pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, String8 n // location info helpers internal RADDBGIC_Location* -pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, - RADDBGI_RegisterCode reg_code, - U32 reg_byte_size, - U32 reg_byte_pos, - S64 offset, - B32 extra_indirection) +p2r_location_from_addr_reg_off(P2R_Ctx *ctx, + RADDBGI_RegisterCode reg_code, + U32 reg_byte_size, + U32 reg_byte_pos, + S64 offset, + B32 extra_indirection) { RADDBGIC_Location *result = 0; if(0 <= offset && offset <= (S64)max_U16) @@ -2898,12 +2898,12 @@ pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, } internal CV_EncodedFramePtrReg -pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *proc, B32 param_base) +p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, RADDBGIC_Symbol *proc, B32 param_base) { CV_EncodedFramePtrReg result = 0; if(proc != 0) { - PDBCONV_FrameProcData *frame_proc = pdbconv_symbol_frame_proc_read(ctx, proc); + P2R_FrameProcData *frame_proc = p2r_symbol_frame_proc_read(ctx, proc); CV_FrameprocFlags flags = frame_proc->flags; if(param_base) { @@ -2918,7 +2918,7 @@ pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *proc, B32 } internal RADDBGI_RegisterCode -pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg encoded_reg) +p2r_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg encoded_reg) { RADDBGI_RegisterCode result = 0; @@ -2968,17 +2968,17 @@ pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrR } internal void -pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, - RADDBGIC_LocationSet *locset, - RADDBGIC_Location *location, - CV_LvarAddrRange *range, - CV_LvarAddrGap *gaps, U64 gap_count) +p2r_location_over_lvar_addr_range(P2R_Ctx *ctx, + RADDBGIC_LocationSet *locset, + RADDBGIC_Location *location, + CV_LvarAddrRange *range, + CV_LvarAddrGap *gaps, U64 gap_count) { // extract range info U64 voff_first = 0; U64 voff_opl = 0; { - COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, range->sec); + COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, range->sec); if(section != 0) { voff_first = section->voff + range->off; @@ -3009,12 +3009,12 @@ pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, // link names internal void -pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, U64 voff, String8 name) +p2r_link_name_save(Arena *arena, P2R_LinkNameMap *map, U64 voff, String8 name) { U64 hash = (voff >> 3) ^ ((7 & voff) << 6); U64 bucket_idx = hash%map->buckets_count; - PDBCONV_LinkNameNode *node = push_array(arena, PDBCONV_LinkNameNode, 1); + P2R_LinkNameNode *node = push_array(arena, P2R_LinkNameNode, 1); SLLStackPush(map->buckets[bucket_idx], node); node->voff = voff; node->name = push_str8_copy(arena, name); @@ -3023,13 +3023,13 @@ pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, U64 voff, String8 } internal String8 -pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff) +p2r_link_name_find(P2R_LinkNameMap *map, U64 voff) { U64 hash = (voff >> 3) ^ ((7 & voff) << 6); U64 bucket_idx = hash%map->buckets_count; String8 result = {0}; - for(PDBCONV_LinkNameNode *node = map->buckets[bucket_idx]; + for(P2R_LinkNameNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) { @@ -3046,10 +3046,10 @@ pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff) //////////////////////////////// //~ Conversion Path -internal PDBCONV_Out * -pdbconv_convert(Arena *arena, PDBCONV_Params *params) +internal P2R_Out * +p2r_convert(Arena *arena, P2R_Params *params) { - PDBCONV_Out *out = push_array(arena, PDBCONV_Out, 1); + P2R_Out *out = push_array(arena, P2R_Out, 1); out->good_parse = 1; // will we try to parse an input file? @@ -3289,7 +3289,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // output generation - PDBCONV_Ctx *pdbconv_ctx = 0; + P2R_Ctx *p2r_ctx = 0; if(params->output_name.size > 0) { @@ -3497,7 +3497,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // rjf: produce pdb conversion context { - PDBCONV_CtxParams p = {0}; + P2R_CtxParams p = {0}; { p.arch = architecture; p.tpi_hash = tpi_hash; @@ -3508,16 +3508,16 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ p.known_global_map_bucket_count = symbol_count_prediction; p.link_name_map_bucket_count = symbol_count_prediction; } - pdbconv_ctx = pdbconv_ctx_alloc(&p, root); + p2r_ctx = p2r_ctx_alloc(&p, root); } // types & symbols { - PDBCONV_TypesSymbolsParams p = {0}; + P2R_TypesSymbolsParams p = {0}; p.sym = sym; p.sym_for_unit = sym_for_unit; p.unit_count = comp_unit_count; - pdbconv_types_and_symbols(pdbconv_ctx, &p); + p2r_types_and_symbols(p2r_ctx, &p); } // conversion errors @@ -3740,10 +3740,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } table_info[] = { - {str8_lit("pdbconv_ctx fwd_map"), pdbconv_ctx?pdbconv_ctx->fwd_map.buckets_count:0, pdbconv_ctx?pdbconv_ctx->fwd_map.pair_count:0, pdbconv_ctx?pdbconv_ctx->fwd_map.bucket_collision_count:0}, - {str8_lit("pdbconv_ctx frame_proc_map"), pdbconv_ctx?pdbconv_ctx->frame_proc_map.buckets_count:0, pdbconv_ctx?pdbconv_ctx->frame_proc_map.pair_count:0, pdbconv_ctx?pdbconv_ctx->frame_proc_map.bucket_collision_count:0}, - {str8_lit("pdbconv_ctx known_globals"), pdbconv_ctx?pdbconv_ctx->known_globals.buckets_count:0, pdbconv_ctx?pdbconv_ctx->known_globals.global_count:0, pdbconv_ctx?pdbconv_ctx->known_globals.bucket_collision_count:0}, - {str8_lit("pdbconv_ctx link_names"), pdbconv_ctx?pdbconv_ctx->link_names.buckets_count:0, pdbconv_ctx?pdbconv_ctx->link_names.link_name_count:0, pdbconv_ctx?pdbconv_ctx->link_names.bucket_collision_count:0}, + {str8_lit("p2r_ctx fwd_map"), p2r_ctx?p2r_ctx->fwd_map.buckets_count:0, p2r_ctx?p2r_ctx->fwd_map.pair_count:0, p2r_ctx?p2r_ctx->fwd_map.bucket_collision_count:0}, + {str8_lit("p2r_ctx frame_proc_map"), p2r_ctx?p2r_ctx->frame_proc_map.buckets_count:0, p2r_ctx?p2r_ctx->frame_proc_map.pair_count:0, p2r_ctx?p2r_ctx->frame_proc_map.bucket_collision_count:0}, + {str8_lit("p2r_ctx known_globals"), p2r_ctx?p2r_ctx->known_globals.buckets_count:0, p2r_ctx?p2r_ctx->known_globals.global_count:0, p2r_ctx?p2r_ctx->known_globals.bucket_collision_count:0}, + {str8_lit("p2r_ctx link_names"), p2r_ctx?p2r_ctx->link_names.buckets_count:0, p2r_ctx?p2r_ctx->link_names.link_name_count:0, p2r_ctx?p2r_ctx->link_names.bucket_collision_count:0}, {str8_lit("raddbgic_root unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count, out->root->unit_map.bucket_collision_count}, {str8_lit("raddbgic_root symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count, out->root->symbol_map.bucket_collision_count}, {str8_lit("raddbgic_root scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count, out->root->scope_map.bucket_collision_count}, diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h index 14b8479a..eb96d79d 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb.h @@ -7,8 +7,8 @@ //////////////////////////////// //~ rjf: Conversion Parameters Type -typedef struct PDBCONV_Params PDBCONV_Params; -struct PDBCONV_Params +typedef struct P2R_Params P2R_Params; +struct P2R_Params { String8 input_pdb_name; String8 input_pdb_data; @@ -44,18 +44,18 @@ struct PDBCONV_Params //- rjf: typeid forward reference map -typedef struct PDBCONV_FwdNode PDBCONV_FwdNode; -struct PDBCONV_FwdNode +typedef struct P2R_FwdNode P2R_FwdNode; +struct P2R_FwdNode { - PDBCONV_FwdNode *next; + P2R_FwdNode *next; CV_TypeId key; CV_TypeId val; }; -typedef struct PDBCONV_FwdMap PDBCONV_FwdMap; -struct PDBCONV_FwdMap +typedef struct P2R_FwdMap P2R_FwdMap; +struct P2R_FwdMap { - PDBCONV_FwdNode **buckets; + P2R_FwdNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 pair_count; @@ -63,35 +63,35 @@ struct PDBCONV_FwdMap //- rjf: type revisit lists -typedef struct PDBCONV_TypeRev PDBCONV_TypeRev; -struct PDBCONV_TypeRev +typedef struct P2R_TypeRev P2R_TypeRev; +struct P2R_TypeRev { - PDBCONV_TypeRev *next; + P2R_TypeRev *next; RADDBGIC_Type *owner_type; CV_TypeId field_itype; }; //- rjf: frame proc maps -typedef struct PDBCONV_FrameProcData PDBCONV_FrameProcData; -struct PDBCONV_FrameProcData +typedef struct P2R_FrameProcData P2R_FrameProcData; +struct P2R_FrameProcData { U32 frame_size; CV_FrameprocFlags flags; }; -typedef struct PDBCONV_FrameProcNode PDBCONV_FrameProcNode; -struct PDBCONV_FrameProcNode +typedef struct P2R_FrameProcNode P2R_FrameProcNode; +struct P2R_FrameProcNode { - PDBCONV_FrameProcNode *next; + P2R_FrameProcNode *next; RADDBGIC_Symbol *key; - PDBCONV_FrameProcData data; + P2R_FrameProcData data; }; -typedef struct PDBCONV_FrameProcMap PDBCONV_FrameProcMap; -struct PDBCONV_FrameProcMap +typedef struct P2R_FrameProcMap P2R_FrameProcMap; +struct P2R_FrameProcMap { - PDBCONV_FrameProcNode **buckets; + P2R_FrameProcNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 pair_count; @@ -99,36 +99,36 @@ struct PDBCONV_FrameProcMap //- rjf: scopes -typedef struct PDBCONV_ScopeNode PDBCONV_ScopeNode; -struct PDBCONV_ScopeNode +typedef struct P2R_ScopeNode P2R_ScopeNode; +struct P2R_ScopeNode { - PDBCONV_ScopeNode *next; + P2R_ScopeNode *next; RADDBGIC_Scope *scope; RADDBGIC_Symbol *symbol; }; //- rjf: known global map -typedef struct PDBCONV_KnownGlobalNode PDBCONV_KnownGlobalNode; -struct PDBCONV_KnownGlobalNode +typedef struct P2R_KnownGlobalNode P2R_KnownGlobalNode; +struct P2R_KnownGlobalNode { - PDBCONV_KnownGlobalNode *next; + P2R_KnownGlobalNode *next; String8 key_name; U64 key_voff; U64 hash; }; -typedef struct PDBCONV_KnownGlobalSet PDBCONV_KnownGlobalSet; -struct PDBCONV_KnownGlobalSet +typedef struct P2R_KnownGlobalSet P2R_KnownGlobalSet; +struct P2R_KnownGlobalSet { - PDBCONV_KnownGlobalNode **buckets; + P2R_KnownGlobalNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 global_count; }; -typedef struct PDBCONV_CtxParams PDBCONV_CtxParams; -struct PDBCONV_CtxParams +typedef struct P2R_CtxParams P2R_CtxParams; +struct P2R_CtxParams { RADDBGI_Arch arch; PDB_TpiHashParsed *tpi_hash; @@ -140,33 +140,33 @@ struct PDBCONV_CtxParams U64 link_name_map_bucket_count; }; -typedef struct PDBCONV_TypesSymbolsParams PDBCONV_TypesSymbolsParams; -struct PDBCONV_TypesSymbolsParams +typedef struct P2R_TypesSymbolsParams P2R_TypesSymbolsParams; +struct P2R_TypesSymbolsParams { CV_SymParsed *sym; CV_SymParsed **sym_for_unit; U64 unit_count; }; -typedef struct PDBCONV_LinkNameNode PDBCONV_LinkNameNode; -struct PDBCONV_LinkNameNode +typedef struct P2R_LinkNameNode P2R_LinkNameNode; +struct P2R_LinkNameNode { - PDBCONV_LinkNameNode *next; + P2R_LinkNameNode *next; U64 voff; String8 name; }; -typedef struct PDBCONV_LinkNameMap PDBCONV_LinkNameMap; -struct PDBCONV_LinkNameMap +typedef struct P2R_LinkNameMap P2R_LinkNameMap; +struct P2R_LinkNameMap { - PDBCONV_LinkNameNode **buckets; + P2R_LinkNameNode **buckets; U64 buckets_count; U64 bucket_collision_count; U64 link_name_count; }; -typedef struct PDBCONV_Ctx PDBCONV_Ctx; -struct PDBCONV_Ctx +typedef struct P2R_Ctx P2R_Ctx; +struct P2R_Ctx { Arena *arena; @@ -182,23 +182,23 @@ struct PDBCONV_Ctx RADDBGIC_Root *root; // TEMPORARY STATE - PDBCONV_FwdMap fwd_map; - PDBCONV_TypeRev *member_revisit_first; - PDBCONV_TypeRev *member_revisit_last; - PDBCONV_TypeRev *enum_revisit_first; - PDBCONV_TypeRev *enum_revisit_last; - PDBCONV_FrameProcMap frame_proc_map; - PDBCONV_ScopeNode *scope_stack; - PDBCONV_ScopeNode *scope_node_free; - PDBCONV_KnownGlobalSet known_globals; - PDBCONV_LinkNameMap link_names; + P2R_FwdMap fwd_map; + P2R_TypeRev *member_revisit_first; + P2R_TypeRev *member_revisit_last; + P2R_TypeRev *enum_revisit_first; + P2R_TypeRev *enum_revisit_last; + P2R_FrameProcMap frame_proc_map; + P2R_ScopeNode *scope_stack; + P2R_ScopeNode *scope_node_free; + P2R_KnownGlobalSet known_globals; + P2R_LinkNameMap link_names; }; //////////////////////////////// //~ Conversion Output Type -typedef struct PDBCONV_Out PDBCONV_Out; -struct PDBCONV_Out +typedef struct P2R_Out P2R_Out; +struct P2R_Out { B32 good_parse; RADDBGIC_Root *root; @@ -209,20 +209,20 @@ struct PDBCONV_Out //////////////////////////////// //~ rjf: Command Line -> Conversion Parameters -internal PDBCONV_Params *pdb_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline); +internal P2R_Params *p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline); //////////////////////////////// //~ rjf: Conversion Implementation Helpers //- rjf: pdb conversion context creation -internal PDBCONV_Ctx *pdbconv_ctx_alloc(PDBCONV_CtxParams *params, RADDBGIC_Root *out_root); +internal P2R_Ctx *p2r_ctx_alloc(P2R_CtxParams *params, RADDBGIC_Root *out_root); //- rjf: pdb types and symbols -internal void pdbconv_types_and_symbols(PDBCONV_Ctx *pdb_ctx, PDBCONV_TypesSymbolsParams *params); +internal void p2r_types_and_symbols(P2R_Ctx *pdb_ctx, P2R_TypesSymbolsParams *params); //- rjf: decoding helpers -internal U32 pdbconv_u32_from_numeric(PDBCONV_Ctx *ctx, CV_NumericParsed *num); -internal COFF_SectionHeader* pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U32 sec_num); +internal U32 p2r_u32_from_numeric(P2R_Ctx *ctx, CV_NumericParsed *num); +internal COFF_SectionHeader* p2r_sec_header_from_sec_num(P2R_Ctx *ctx, U32 sec_num); //- rjf: type info // @@ -235,89 +235,89 @@ internal COFF_SectionHeader* pdbconv_sec_header_from_sec_num(PDBCONV_Ctx *ctx, U // 6. equipping source coordinates // type info construction passes -internal void pdbconv_type_cons_main_passes(PDBCONV_Ctx *ctx); -internal CV_TypeId pdbconv_type_resolve_fwd(PDBCONV_Ctx *ctx, CV_TypeId itype); -internal RADDBGIC_Type* pdbconv_type_resolve_itype(PDBCONV_Ctx *ctx, CV_TypeId itype); -internal void pdbconv_type_equip_members(PDBCONV_Ctx *ctx, RADDBGIC_Type *owern_type, CV_TypeId field_itype); -internal void pdbconv_type_equip_enumerates(PDBCONV_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype); +internal void p2r_type_cons_main_passes(P2R_Ctx *ctx); +internal CV_TypeId p2r_type_resolve_fwd(P2R_Ctx *ctx, CV_TypeId itype); +internal RADDBGIC_Type* p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype); +internal void p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owern_type, CV_TypeId field_itype); +internal void p2r_type_equip_enumerates(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype); // type info construction helpers -internal RADDBGIC_Type* pdbconv_type_cons_basic(PDBCONV_Ctx *ctx, CV_TypeId itype); -internal RADDBGIC_Type* pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype); -internal RADDBGIC_Type* pdbconv_type_resolve_and_check(PDBCONV_Ctx *ctx, CV_TypeId itype); -internal void pdbconv_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, - PDBCONV_Ctx *ctx, CV_TypeId arglist_itype); +internal RADDBGIC_Type* p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype); +internal RADDBGIC_Type* p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype); +internal RADDBGIC_Type* p2r_type_resolve_and_check(P2R_Ctx *ctx, CV_TypeId itype); +internal void p2r_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, + P2R_Ctx *ctx, CV_TypeId arglist_itype); // type info resolution helpers -internal RADDBGIC_Type* pdbconv_type_from_name(PDBCONV_Ctx *ctx, String8 name); +internal RADDBGIC_Type* p2r_type_from_name(P2R_Ctx *ctx, String8 name); // type fwd map -internal void pdbconv_type_fwd_map_set(Arena *arena, PDBCONV_FwdMap *map, - CV_TypeId key, CV_TypeId val); -internal CV_TypeId pdbconv_type_fwd_map_get(PDBCONV_FwdMap *map, CV_TypeId key); +internal void p2r_type_fwd_map_set(Arena *arena, P2R_FwdMap *map, + CV_TypeId key, CV_TypeId val); +internal CV_TypeId p2r_type_fwd_map_get(P2R_FwdMap *map, CV_TypeId key); //- rjf: symbol info // symbol info construction -internal U64 pdbconv_hash_from_local_user_id(U64 sym_hash, U64 id); -internal U64 pdbconv_hash_from_scope_user_id(U64 sym_hash, U64 id); -internal U64 pdbconv_hash_from_symbol_user_id(U64 sym_hash, U64 id); -internal void pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id); -internal void pdbconv_gather_link_names(PDBCONV_Ctx *ctx, CV_SymParsed *sym); +internal U64 p2r_hash_from_local_user_id(U64 sym_hash, U64 id); +internal U64 p2r_hash_from_scope_user_id(U64 sym_hash, U64 id); +internal U64 p2r_hash_from_symbol_user_id(U64 sym_hash, U64 id); +internal void p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id); +internal void p2r_gather_link_names(P2R_Ctx *ctx, CV_SymParsed *sym); // "frameproc" map -internal void pdbconv_symbol_frame_proc_write(PDBCONV_Ctx *ctx,RADDBGIC_Symbol *key, - PDBCONV_FrameProcData *data); -internal PDBCONV_FrameProcData* pdbconv_symbol_frame_proc_read(PDBCONV_Ctx *ctx, RADDBGIC_Symbol *key); +internal void p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RADDBGIC_Symbol *key, + P2R_FrameProcData *data); +internal P2R_FrameProcData* p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RADDBGIC_Symbol *key); // scope stack -internal void pdbconv_symbol_push_scope(PDBCONV_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); -internal void pdbconv_symbol_pop_scope(PDBCONV_Ctx *ctx); -internal void pdbconv_symbol_clear_scope_stack(PDBCONV_Ctx *ctx); +internal void p2r_symbol_push_scope(P2R_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); +internal void p2r_symbol_pop_scope(P2R_Ctx *ctx); +internal void p2r_symbol_clear_scope_stack(P2R_Ctx *ctx); -#define pdbconv_symbol_current_scope(ctx) ((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->scope) -#define pdbconv_symbol_current_symbol(ctx) ((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->symbol) +#define p2r_symbol_current_scope(ctx) ((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->scope) +#define p2r_symbol_current_symbol(ctx) ((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->symbol) // PDB/C++ name parsing helper -internal U64 pdbconv_end_of_cplusplus_container_name(String8 str); +internal U64 p2r_end_of_cplusplus_container_name(String8 str); // global deduplication -internal U64 pdbconv_known_global_hash(String8 name, U64 voff); +internal U64 p2r_known_global_hash(String8 name, U64 voff); -internal B32 pdbconv_known_global_lookup(PDBCONV_KnownGlobalSet *set, String8 name, U64 voff); -internal void pdbconv_known_global_insert(Arena *arena, PDBCONV_KnownGlobalSet *set, - String8 name, U64 voff); +internal B32 p2r_known_global_lookup(P2R_KnownGlobalSet *set, String8 name, U64 voff); +internal void p2r_known_global_insert(Arena *arena, P2R_KnownGlobalSet *set, + String8 name, U64 voff); // location info helpers -internal RADDBGIC_Location* pdbconv_location_from_addr_reg_off(PDBCONV_Ctx *ctx, - RADDBGI_RegisterCode reg_code, - U32 reg_byte_size, - U32 reg_byte_pos, - S64 offset, - B32 extra_indirection); +internal RADDBGIC_Location* p2r_location_from_addr_reg_off(P2R_Ctx *ctx, + RADDBGI_RegisterCode reg_code, + U32 reg_byte_size, + U32 reg_byte_pos, + S64 offset, + B32 extra_indirection); -internal CV_EncodedFramePtrReg pdbconv_cv_encoded_fp_reg_from_proc(PDBCONV_Ctx *ctx, - RADDBGIC_Symbol *proc, - B32 param_base); +internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, + RADDBGIC_Symbol *proc, + B32 param_base); -internal RADDBGI_RegisterCode pdbconv_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, - CV_EncodedFramePtrReg encoded_reg); +internal RADDBGI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, + CV_EncodedFramePtrReg encoded_reg); -internal void pdbconv_location_over_lvar_addr_range(PDBCONV_Ctx *ctx, - RADDBGIC_LocationSet *locset, - RADDBGIC_Location *location, - CV_LvarAddrRange *range, - CV_LvarAddrGap *gaps, U64 gap_count); +internal void p2r_location_over_lvar_addr_range(P2R_Ctx *ctx, + RADDBGIC_LocationSet *locset, + RADDBGIC_Location *location, + CV_LvarAddrRange *range, + CV_LvarAddrGap *gaps, U64 gap_count); // link names -internal void pdbconv_link_name_save(Arena *arena, PDBCONV_LinkNameMap *map, - U64 voff, String8 name); -internal String8 pdbconv_link_name_find(PDBCONV_LinkNameMap *map, U64 voff); +internal void p2r_link_name_save(Arena *arena, P2R_LinkNameMap *map, + U64 voff, String8 name); +internal String8 p2r_link_name_find(P2R_LinkNameMap *map, U64 voff); //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point -internal PDBCONV_Out *pdbconv_convert(Arena *arena, PDBCONV_Params *params); +internal P2R_Out *p2r_convert(Arena *arena, P2R_Params *params); #endif // RADDBGI_FROM_PDB_H diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c index dbe2cbe1..06aa1bbe 100644 --- a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c @@ -54,7 +54,7 @@ main(int argc, char **argv){ ProfBeginCapture("raddbgi_from_pdb"); //- rjf: parse arguments - PDBCONV_Params *params = pdb_convert_params_from_cmd_line(arena, &cmdline); + P2R_Params *params = p2r_params_from_cmd_line(arena, &cmdline); //- rjf: show input errors if (params->errors.node_count > 0 && @@ -75,10 +75,10 @@ main(int argc, char **argv){ } //- rjf: convert - PDBCONV_Out *out = 0; + P2R_Out *out = 0; if(out_file != 0) { - out = pdbconv_convert(arena, params); + out = p2r_convert(arena, params); } //- rjf: print dump From fb569512640bbf4dbcef9e467355317dfe9c1934 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 15:12:40 -0800 Subject: [PATCH 058/275] collapse raddbgi_convert folder into just being separate from_pdb and from_dwarf layers --- README.md | 13 +++++++------ build.bat | 4 ++-- src/raddbg/raddbg_main.cpp | 12 ++++++------ .../dwarf => raddbgi_from_dwarf}/raddbgi_dwarf.c | 0 .../dwarf => raddbgi_from_dwarf}/raddbgi_dwarf.h | 0 .../raddbgi_dwarf_stringize.c | 0 .../raddbgi_dwarf_stringize.h | 0 .../dwarf => raddbgi_from_dwarf}/raddbgi_elf.c | 0 .../dwarf => raddbgi_from_dwarf}/raddbgi_elf.h | 0 .../raddbgi_from_dwarf.c | 0 .../raddbgi_from_dwarf.h | 0 .../raddbgi_codeview_conversion.c | 0 .../raddbgi_codeview_conversion.h | 0 .../raddbgi_coff_conversion.c | 0 .../raddbgi_coff_conversion.h | 0 .../pdb => raddbgi_from_pdb}/raddbgi_from_pdb.c | 0 .../pdb => raddbgi_from_pdb}/raddbgi_from_pdb.h | 0 .../raddbgi_from_pdb_main.c | 0 18 files changed, 15 insertions(+), 14 deletions(-) rename src/{raddbgi_convert/dwarf => raddbgi_from_dwarf}/raddbgi_dwarf.c (100%) rename src/{raddbgi_convert/dwarf => raddbgi_from_dwarf}/raddbgi_dwarf.h (100%) rename src/{raddbgi_convert/dwarf => raddbgi_from_dwarf}/raddbgi_dwarf_stringize.c (100%) rename src/{raddbgi_convert/dwarf => raddbgi_from_dwarf}/raddbgi_dwarf_stringize.h (100%) rename src/{raddbgi_convert/dwarf => raddbgi_from_dwarf}/raddbgi_elf.c (100%) rename src/{raddbgi_convert/dwarf => raddbgi_from_dwarf}/raddbgi_elf.h (100%) rename src/{raddbgi_convert/dwarf => raddbgi_from_dwarf}/raddbgi_from_dwarf.c (100%) rename src/{raddbgi_convert/dwarf => raddbgi_from_dwarf}/raddbgi_from_dwarf.h (100%) rename src/{raddbgi_convert/pdb => raddbgi_from_pdb}/raddbgi_codeview_conversion.c (100%) rename src/{raddbgi_convert/pdb => raddbgi_from_pdb}/raddbgi_codeview_conversion.h (100%) rename src/{raddbgi_convert/pdb => raddbgi_from_pdb}/raddbgi_coff_conversion.c (100%) rename src/{raddbgi_convert/pdb => raddbgi_from_pdb}/raddbgi_coff_conversion.h (100%) rename src/{raddbgi_convert/pdb => raddbgi_from_pdb}/raddbgi_from_pdb.c (100%) rename src/{raddbgi_convert/pdb => raddbgi_from_pdb}/raddbgi_from_pdb.h (100%) rename src/{raddbgi_convert/pdb => raddbgi_from_pdb}/raddbgi_from_pdb_main.c (100%) diff --git a/README.md b/README.md index a6cb64c5..fb4013f8 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,10 @@ the format are: - `lib_raddbgi_cons`: The RADDBGI construction library, for making RADDBGI debug info. -- `raddbgi_convert`: Our legacy-debug-info-to-RADDBGI converters. Right now -this includes a working PDB-to-RADDBGI converter, and an in-progress DWARF-to- -RADDBGI converter. These converters can be built both as helper codebase layers -or with a command line interface frontend. +- `raddbgi_from_pdb`: Our PDB-to-RADDBGI converter. Can be used as a helper +codebase layer, or built as an executable with a command line interface +frontend. +- `raddbgi_from_dwarf`: Our in-progress DWARF-to-RADDBGI converter. - `raddbgi_dump`: Our RADDBGI textual dumping utility. ## Development Setup Instructions @@ -156,7 +156,7 @@ abstraction API. is only an x64 PE unwinding implementation). - Creating a DWARF-to-RADDBGI converter (in the same way that we've built a PDB-to-RADDBGI converter). A partial implementation of this is in -`src/raddbgi_convert/dwarf`. +`src/raddbgi_from_dwarf`. - Porting the `src/render` layer to implement all of the rendering features the frontend needs on a Linux-compatible API (the backend used on Windows is D3D11). - Porting the `src/font_provider` layer to a Linux-compatible font @@ -315,7 +315,8 @@ A list of the layers in the codebase and their associated namespaces is below: - `raddbg` (no namespace): The layer which ties everything together for the main graphical debugger. Not much "meat", just drives `df`, implements command line options, and so on. -- `raddbgi_convert` (`P2R_`): Our implementation of PDB-to-RADDBGI and +- `raddbgi_from_pdb` (`P2R_`): Our implementation of PDB-to-RADDBGI conversion. +- `raddbgi_from_dwarf` (`D2R_`): Our in-progress implementation of DWARF-to-RADDBGI conversion. - `raddbgi_dump` (`RADDBGIDUMP_`): A dumper utility program for dumping textualizations of RADDBGI debug info files. diff --git a/build.bat b/build.bat index 7fdf96ad..153e1fb9 100644 --- a/build.bat +++ b/build.bat @@ -99,8 +99,8 @@ if not "%no_meta%"=="1" ( :: --- Build Everything (@build_targets) -------------------------------------- pushd build if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg_main.cpp %compile_link% %out%raddbg.exe || exit /b 1 -if "%raddbgi_from_pdb%"=="1" %compile% ..\src\raddbgi_convert\pdb\raddbgi_from_pdb_main.c %compile_link% %out%raddbgi_from_pdb.exe || exit /b 1 -if "%raddbgi_from_dwarf%"=="1" %compile% ..\src\raddbgi_convert\dwarf\raddbgi_from_dwarf.c %compile_link% %out%raddbgi_from_dwarf.exe || exit /b 1 +if "%raddbgi_from_pdb%"=="1" %compile% ..\src\raddbgi_from_pdb\raddbgi_from_pdb_main.c %compile_link% %out%raddbgi_from_pdb.exe || exit /b 1 +if "%raddbgi_from_dwarf%"=="1" %compile% ..\src\raddbgi_from_dwarf\raddbgi_from_dwarf.c %compile_link% %out%raddbgi_from_dwarf.exe || exit /b 1 if "%raddbgi_dump%"=="1" %compile% ..\src\raddbgi_dump\raddbgi_dump.c %compile_link% %out%raddbgi_dump.exe || exit /b 1 if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe || exit /b 1 diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 479a6de7..2295916b 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -27,9 +27,9 @@ #include "msf/msf.h" #include "pdb/pdb.h" #include "pdb/pdb_stringize.h" -#include "raddbgi_convert/pdb/raddbgi_coff_conversion.h" -#include "raddbgi_convert/pdb/raddbgi_codeview_conversion.h" -#include "raddbgi_convert/pdb/raddbgi_from_pdb.h" +#include "raddbgi_from_pdb/raddbgi_coff_conversion.h" +#include "raddbgi_from_pdb/raddbgi_codeview_conversion.h" +#include "raddbgi_from_pdb/raddbgi_from_pdb.h" #include "regs/regs.h" #include "regs/raddbgi/regs_raddbgi.h" #include "type_graph/type_graph.h" @@ -66,9 +66,9 @@ #include "msf/msf.c" #include "pdb/pdb.c" #include "pdb/pdb_stringize.c" -#include "raddbgi_convert/pdb/raddbgi_coff_conversion.c" -#include "raddbgi_convert/pdb/raddbgi_codeview_conversion.c" -#include "raddbgi_convert/pdb/raddbgi_from_pdb.c" +#include "raddbgi_from_pdb/raddbgi_coff_conversion.c" +#include "raddbgi_from_pdb/raddbgi_codeview_conversion.c" +#include "raddbgi_from_pdb/raddbgi_from_pdb.c" #include "regs/regs.c" #include "regs/raddbgi/regs_raddbgi.c" #include "type_graph/type_graph.c" diff --git a/src/raddbgi_convert/dwarf/raddbgi_dwarf.c b/src/raddbgi_from_dwarf/raddbgi_dwarf.c similarity index 100% rename from src/raddbgi_convert/dwarf/raddbgi_dwarf.c rename to src/raddbgi_from_dwarf/raddbgi_dwarf.c diff --git a/src/raddbgi_convert/dwarf/raddbgi_dwarf.h b/src/raddbgi_from_dwarf/raddbgi_dwarf.h similarity index 100% rename from src/raddbgi_convert/dwarf/raddbgi_dwarf.h rename to src/raddbgi_from_dwarf/raddbgi_dwarf.h diff --git a/src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.c b/src/raddbgi_from_dwarf/raddbgi_dwarf_stringize.c similarity index 100% rename from src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.c rename to src/raddbgi_from_dwarf/raddbgi_dwarf_stringize.c diff --git a/src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h b/src/raddbgi_from_dwarf/raddbgi_dwarf_stringize.h similarity index 100% rename from src/raddbgi_convert/dwarf/raddbgi_dwarf_stringize.h rename to src/raddbgi_from_dwarf/raddbgi_dwarf_stringize.h diff --git a/src/raddbgi_convert/dwarf/raddbgi_elf.c b/src/raddbgi_from_dwarf/raddbgi_elf.c similarity index 100% rename from src/raddbgi_convert/dwarf/raddbgi_elf.c rename to src/raddbgi_from_dwarf/raddbgi_elf.c diff --git a/src/raddbgi_convert/dwarf/raddbgi_elf.h b/src/raddbgi_from_dwarf/raddbgi_elf.h similarity index 100% rename from src/raddbgi_convert/dwarf/raddbgi_elf.h rename to src/raddbgi_from_dwarf/raddbgi_elf.h diff --git a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c b/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c similarity index 100% rename from src/raddbgi_convert/dwarf/raddbgi_from_dwarf.c rename to src/raddbgi_from_dwarf/raddbgi_from_dwarf.c diff --git a/src/raddbgi_convert/dwarf/raddbgi_from_dwarf.h b/src/raddbgi_from_dwarf/raddbgi_from_dwarf.h similarity index 100% rename from src/raddbgi_convert/dwarf/raddbgi_from_dwarf.h rename to src/raddbgi_from_dwarf/raddbgi_from_dwarf.h diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c b/src/raddbgi_from_pdb/raddbgi_codeview_conversion.c similarity index 100% rename from src/raddbgi_convert/pdb/raddbgi_codeview_conversion.c rename to src/raddbgi_from_pdb/raddbgi_codeview_conversion.c diff --git a/src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h b/src/raddbgi_from_pdb/raddbgi_codeview_conversion.h similarity index 100% rename from src/raddbgi_convert/pdb/raddbgi_codeview_conversion.h rename to src/raddbgi_from_pdb/raddbgi_codeview_conversion.h diff --git a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.c b/src/raddbgi_from_pdb/raddbgi_coff_conversion.c similarity index 100% rename from src/raddbgi_convert/pdb/raddbgi_coff_conversion.c rename to src/raddbgi_from_pdb/raddbgi_coff_conversion.c diff --git a/src/raddbgi_convert/pdb/raddbgi_coff_conversion.h b/src/raddbgi_from_pdb/raddbgi_coff_conversion.h similarity index 100% rename from src/raddbgi_convert/pdb/raddbgi_coff_conversion.h rename to src/raddbgi_from_pdb/raddbgi_coff_conversion.h diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c similarity index 100% rename from src/raddbgi_convert/pdb/raddbgi_from_pdb.c rename to src/raddbgi_from_pdb/raddbgi_from_pdb.c diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h similarity index 100% rename from src/raddbgi_convert/pdb/raddbgi_from_pdb.h rename to src/raddbgi_from_pdb/raddbgi_from_pdb.h diff --git a/src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c similarity index 100% rename from src/raddbgi_convert/pdb/raddbgi_from_pdb_main.c rename to src/raddbgi_from_pdb/raddbgi_from_pdb_main.c From 90dce510ccdab6f7b296a3fd409758c2e6a3bdb8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 15:16:42 -0800 Subject: [PATCH 059/275] raddbgi_from_pdb: eliminate unnecessary files --- src/raddbg/raddbg_main.cpp | 4 - .../raddbgi_codeview_conversion.c | 124 --------------- .../raddbgi_codeview_conversion.h | 14 -- .../raddbgi_coff_conversion.c | 22 --- .../raddbgi_coff_conversion.h | 12 -- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 150 ++++++++++++++++++ src/raddbgi_from_pdb/raddbgi_from_pdb.h | 12 ++ src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 4 - 8 files changed, 162 insertions(+), 180 deletions(-) delete mode 100644 src/raddbgi_from_pdb/raddbgi_codeview_conversion.c delete mode 100644 src/raddbgi_from_pdb/raddbgi_codeview_conversion.h delete mode 100644 src/raddbgi_from_pdb/raddbgi_coff_conversion.c delete mode 100644 src/raddbgi_from_pdb/raddbgi_coff_conversion.h diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 2295916b..4e72888d 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -27,8 +27,6 @@ #include "msf/msf.h" #include "pdb/pdb.h" #include "pdb/pdb_stringize.h" -#include "raddbgi_from_pdb/raddbgi_coff_conversion.h" -#include "raddbgi_from_pdb/raddbgi_codeview_conversion.h" #include "raddbgi_from_pdb/raddbgi_from_pdb.h" #include "regs/regs.h" #include "regs/raddbgi/regs_raddbgi.h" @@ -66,8 +64,6 @@ #include "msf/msf.c" #include "pdb/pdb.c" #include "pdb/pdb_stringize.c" -#include "raddbgi_from_pdb/raddbgi_coff_conversion.c" -#include "raddbgi_from_pdb/raddbgi_codeview_conversion.c" #include "raddbgi_from_pdb/raddbgi_from_pdb.c" #include "regs/regs.c" #include "regs/raddbgi/regs_raddbgi.c" diff --git a/src/raddbgi_from_pdb/raddbgi_codeview_conversion.c b/src/raddbgi_from_pdb/raddbgi_codeview_conversion.c deleted file mode 100644 index fc920d85..00000000 --- a/src/raddbgi_from_pdb/raddbgi_codeview_conversion.c +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ CodeView Conversion Functions - -internal RADDBGI_Arch -raddbgi_arch_from_cv_arch(CV_Arch cv_arch){ - RADDBGI_Arch result = 0; - switch (cv_arch){ - case CV_Arch_8086: result = RADDBGI_Arch_X86; break; - case CV_Arch_X64: result = RADDBGI_Arch_X64; break; - - //case CV_Arch_8080: break; - //case CV_Arch_80286: break; - //case CV_Arch_80386: break; - //case CV_Arch_80486: break; - //case CV_Arch_PENTIUM: break; - //case CV_Arch_PENTIUMII: break; - //case CV_Arch_PENTIUMIII: break; - //case CV_Arch_MIPS: break; - //case CV_Arch_MIPS16: break; - //case CV_Arch_MIPS32: break; - //case CV_Arch_MIPS64: break; - //case CV_Arch_MIPSI: break; - //case CV_Arch_MIPSII: break; - //case CV_Arch_MIPSIII: break; - //case CV_Arch_MIPSIV: break; - //case CV_Arch_MIPSV: break; - //case CV_Arch_M68000: break; - //case CV_Arch_M68010: break; - //case CV_Arch_M68020: break; - //case CV_Arch_M68030: break; - //case CV_Arch_M68040: break; - //case CV_Arch_ALPHA: break; - //case CV_Arch_ALPHA_21164: break; - //case CV_Arch_ALPHA_21164A: break; - //case CV_Arch_ALPHA_21264: break; - //case CV_Arch_ALPHA_21364: break; - //case CV_Arch_PPC601: break; - //case CV_Arch_PPC603: break; - //case CV_Arch_PPC604: break; - //case CV_Arch_PPC620: break; - //case CV_Arch_PPCFP: break; - //case CV_Arch_PPCBE: break; - //case CV_Arch_SH3: break; - //case CV_Arch_SH3E: break; - //case CV_Arch_SH3DSP: break; - //case CV_Arch_SH4: break; - //case CV_Arch_SHMEDIA: break; - //case CV_Arch_ARM3: break; - //case CV_Arch_ARM4: break; - //case CV_Arch_ARM4T: break; - //case CV_Arch_ARM5: break; - //case CV_Arch_ARM5T: break; - //case CV_Arch_ARM6: break; - //case CV_Arch_ARM_XMAC: break; - //case CV_Arch_ARM_WMMX: break; - //case CV_Arch_ARM7: break; - //case CV_Arch_OMNI: break; - //case CV_Arch_IA64_1: break; - //case CV_Arch_IA64_2: break; - //case CV_Arch_CEE: break; - //case CV_Arch_AM33: break; - //case CV_Arch_M32R: break; - //case CV_Arch_TRICORE: break; - //case CV_Arch_EBC: break; - //case CV_Arch_THUMB: break; - //case CV_Arch_ARMNT: break; - //case CV_Arch_ARM64: break; - //case CV_Arch_D3D11_SHADER: break; - } - return(result); -} - -internal RADDBGI_RegisterCode -raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code){ - RADDBGI_RegisterCode result = 0; - switch (arch){ - case RADDBGI_Arch_X86: - { - switch (reg_code){ -#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBGI_RegisterCode_X86_##RDN; break; - CV_Reg_X86_XList(X) -#undef X - } - }break; - - case RADDBGI_Arch_X64: - { - switch (reg_code){ -#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBGI_RegisterCode_X64_##RDN; break; - CV_Reg_X64_XList(X) -#undef X - } - }break; - } - return(result); -} - -internal RADDBGI_Language -raddbgi_language_from_cv_language(CV_Language cv_language){ - RADDBGI_Language result = 0; - switch (cv_language){ - case CV_Language_C: result = RADDBGI_Language_C; break; - case CV_Language_CXX: result = RADDBGI_Language_CPlusPlus; break; - //case CV_Language_FORTRAN: result = ; break; - //case CV_Language_MASM: result = ; break; - //case CV_Language_PASCAL: result = ; break; - //case CV_Language_BASIC: result = ; break; - //case CV_Language_COBOL: result = ; break; - //case CV_Language_LINK: result = ; break; - //case CV_Language_CVTRES: result = ; break; - //case CV_Language_CVTPGD: result = ; break; - //case CV_Language_CSHARP: result = ; break; - //case CV_Language_VB: result = ; break; - //case CV_Language_ILASM: result = ; break; - //case CV_Language_JAVA: result = ; break; - //case CV_Language_JSCRIPT: result = ; break; - //case CV_Language_MSIL: result = ; break; - //case CV_Language_HLSL: result = ; break; - } - return(result); -} diff --git a/src/raddbgi_from_pdb/raddbgi_codeview_conversion.h b/src/raddbgi_from_pdb/raddbgi_codeview_conversion.h deleted file mode 100644 index 318e9134..00000000 --- a/src/raddbgi_from_pdb/raddbgi_codeview_conversion.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RADDBGI_CODEVIEW_CONVERSION_H -#define RADDBGI_CODEVIEW_CONVERSION_H - -//////////////////////////////// -//~ CodeView Conversion Functions - -internal RADDBGI_Arch raddbgi_arch_from_cv_arch(CV_Arch arch); -internal RADDBGI_RegisterCode raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code); -internal RADDBGI_Language raddbgi_language_from_cv_language(CV_Language language); - -#endif //RADDBGI_CODEVIEW_CONVERSION_H diff --git a/src/raddbgi_from_pdb/raddbgi_coff_conversion.c b/src/raddbgi_from_pdb/raddbgi_coff_conversion.c deleted file mode 100644 index b04b1118..00000000 --- a/src/raddbgi_from_pdb/raddbgi_coff_conversion.c +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ COFF Conversion Functions - -internal RADDBGI_BinarySectionFlags -raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags){ - RADDBGI_BinarySectionFlags result = 0; - - if (flags & COFF_SectionFlag_MEM_READ){ - result |= RADDBGI_BinarySectionFlag_Read; - } - if (flags & COFF_SectionFlag_MEM_WRITE){ - result |= RADDBGI_BinarySectionFlag_Write; - } - if (flags & COFF_SectionFlag_MEM_EXECUTE){ - result |= RADDBGI_BinarySectionFlag_Execute; - } - - return(result); -} diff --git a/src/raddbgi_from_pdb/raddbgi_coff_conversion.h b/src/raddbgi_from_pdb/raddbgi_coff_conversion.h deleted file mode 100644 index d25bf34f..00000000 --- a/src/raddbgi_from_pdb/raddbgi_coff_conversion.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RADDBGI_COFF_CONVERSION_H -#define RADDBGI_COFF_CONVERSION_H - -//////////////////////////////// -//~ COFF Conversion Functions - -internal RADDBGI_BinarySectionFlags raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); - -#endif //RADDBGI_COFF_CONVERSION_H diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 82fc6b1c..bcfeecbb 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -148,6 +148,156 @@ p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline) return(result); } +//////////////////////////////// +//~ rjf: COFF <-> RADDBGI Canonical Conversions + +internal RADDBGI_BinarySectionFlags +raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) +{ + RADDBGI_BinarySectionFlags result = 0; + if(flags & COFF_SectionFlag_MEM_READ) + { + result |= RADDBGI_BinarySectionFlag_Read; + } + if(flags & COFF_SectionFlag_MEM_WRITE) + { + result |= RADDBGI_BinarySectionFlag_Write; + } + if(flags & COFF_SectionFlag_MEM_EXECUTE) + { + result |= RADDBGI_BinarySectionFlag_Execute; + } + return(result); +} + +//////////////////////////////// +//~ rjf: CodeView <-> RADDBGI Canonical Conversions + +internal RADDBGI_Arch +raddbgi_arch_from_cv_arch(CV_Arch cv_arch) +{ + RADDBGI_Arch result = 0; + switch(cv_arch) + { + case CV_Arch_8086: result = RADDBGI_Arch_X86; break; + case CV_Arch_X64: result = RADDBGI_Arch_X64; break; + //case CV_Arch_8080: break; + //case CV_Arch_80286: break; + //case CV_Arch_80386: break; + //case CV_Arch_80486: break; + //case CV_Arch_PENTIUM: break; + //case CV_Arch_PENTIUMII: break; + //case CV_Arch_PENTIUMIII: break; + //case CV_Arch_MIPS: break; + //case CV_Arch_MIPS16: break; + //case CV_Arch_MIPS32: break; + //case CV_Arch_MIPS64: break; + //case CV_Arch_MIPSI: break; + //case CV_Arch_MIPSII: break; + //case CV_Arch_MIPSIII: break; + //case CV_Arch_MIPSIV: break; + //case CV_Arch_MIPSV: break; + //case CV_Arch_M68000: break; + //case CV_Arch_M68010: break; + //case CV_Arch_M68020: break; + //case CV_Arch_M68030: break; + //case CV_Arch_M68040: break; + //case CV_Arch_ALPHA: break; + //case CV_Arch_ALPHA_21164: break; + //case CV_Arch_ALPHA_21164A: break; + //case CV_Arch_ALPHA_21264: break; + //case CV_Arch_ALPHA_21364: break; + //case CV_Arch_PPC601: break; + //case CV_Arch_PPC603: break; + //case CV_Arch_PPC604: break; + //case CV_Arch_PPC620: break; + //case CV_Arch_PPCFP: break; + //case CV_Arch_PPCBE: break; + //case CV_Arch_SH3: break; + //case CV_Arch_SH3E: break; + //case CV_Arch_SH3DSP: break; + //case CV_Arch_SH4: break; + //case CV_Arch_SHMEDIA: break; + //case CV_Arch_ARM3: break; + //case CV_Arch_ARM4: break; + //case CV_Arch_ARM4T: break; + //case CV_Arch_ARM5: break; + //case CV_Arch_ARM5T: break; + //case CV_Arch_ARM6: break; + //case CV_Arch_ARM_XMAC: break; + //case CV_Arch_ARM_WMMX: break; + //case CV_Arch_ARM7: break; + //case CV_Arch_OMNI: break; + //case CV_Arch_IA64_1: break; + //case CV_Arch_IA64_2: break; + //case CV_Arch_CEE: break; + //case CV_Arch_AM33: break; + //case CV_Arch_M32R: break; + //case CV_Arch_TRICORE: break; + //case CV_Arch_EBC: break; + //case CV_Arch_THUMB: break; + //case CV_Arch_ARMNT: break; + //case CV_Arch_ARM64: break; + //case CV_Arch_D3D11_SHADER: break; + } + return(result); +} + +internal RADDBGI_RegisterCode +raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code) +{ + RADDBGI_RegisterCode result = 0; + switch(arch) + { + case RADDBGI_Arch_X86: + { + switch(reg_code) + { +#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBGI_RegisterCode_X86_##RDN; break; + CV_Reg_X86_XList(X) +#undef X + } + }break; + case RADDBGI_Arch_X64: + { + switch(reg_code) + { +#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBGI_RegisterCode_X64_##RDN; break; + CV_Reg_X64_XList(X) +#undef X + } + }break; + } + return(result); +} + +internal RADDBGI_Language +raddbgi_language_from_cv_language(CV_Language cv_language) +{ + RADDBGI_Language result = 0; + switch(cv_language) + { + case CV_Language_C: result = RADDBGI_Language_C; break; + case CV_Language_CXX: result = RADDBGI_Language_CPlusPlus; break; + //case CV_Language_FORTRAN: result = ; break; + //case CV_Language_MASM: result = ; break; + //case CV_Language_PASCAL: result = ; break; + //case CV_Language_BASIC: result = ; break; + //case CV_Language_COBOL: result = ; break; + //case CV_Language_LINK: result = ; break; + //case CV_Language_CVTRES: result = ; break; + //case CV_Language_CVTPGD: result = ; break; + //case CV_Language_CSHARP: result = ; break; + //case CV_Language_VB: result = ; break; + //case CV_Language_ILASM: result = ; break; + //case CV_Language_JAVA: result = ; break; + //case CV_Language_JSCRIPT: result = ; break; + //case CV_Language_MSIL: result = ; break; + //case CV_Language_HLSL: result = ; break; + } + return(result); +} + //////////////////////////////// //~ rjf: Conversion Implementation Helpers diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index eb96d79d..6a2b4050 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -211,6 +211,18 @@ struct P2R_Out internal P2R_Params *p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline); +//////////////////////////////// +//~ rjf: COFF => RADDBGI Canonical Conversions + +internal RADDBGI_BinarySectionFlags raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); + +//////////////////////////////// +//~ rjf: CodeView => RADDBGI Canonical Conversions + +internal RADDBGI_Arch raddbgi_arch_from_cv_arch(CV_Arch arch); +internal RADDBGI_RegisterCode raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code); +internal RADDBGI_Language raddbgi_language_from_cv_language(CV_Language language); + //////////////////////////////// //~ rjf: Conversion Implementation Helpers diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 06aa1bbe..5b2891d8 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -13,8 +13,6 @@ #include "pdb/pdb.h" #include "pdb/pdb_stringize.h" #include "raddbgi_cons_local/raddbgi_cons_local.h" -#include "raddbgi_coff_conversion.h" -#include "raddbgi_codeview_conversion.h" #include "raddbgi_from_pdb.h" @@ -27,8 +25,6 @@ #include "pdb/pdb.c" #include "pdb/pdb_stringize.c" #include "raddbgi_cons_local/raddbgi_cons_local.c" -#include "raddbgi_coff_conversion.c" -#include "raddbgi_codeview_conversion.c" #include "raddbgi_from_pdb.c" From db35e09629d98d5ba983a43f42e25ad8f82adb17 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 15:36:06 -0800 Subject: [PATCH 060/275] raddbgic -> rdim (rad debug info make) --- src/lib_raddbgi_cons/raddbgi_cons.c | 3673 ----------------- src/lib_raddbgi_cons/raddbgi_cons.h | 1303 ------ src/lib_raddbgi_make/raddbgi_make.c | 3673 +++++++++++++++++ src/lib_raddbgi_make/raddbgi_make.h | 1303 ++++++ src/raddbg/raddbg.c | 2 +- src/raddbg/raddbg_main.cpp | 4 +- src/raddbgi_cons_local/raddbgi_cons_local.h | 46 - src/raddbgi_from_pdb/raddbgi_from_pdb.c | 416 +- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 54 +- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 2 +- .../raddbgi_make_local.c} | 2 +- src/raddbgi_make_local/raddbgi_make_local.h | 46 + 12 files changed, 5262 insertions(+), 5262 deletions(-) delete mode 100644 src/lib_raddbgi_cons/raddbgi_cons.c delete mode 100644 src/lib_raddbgi_cons/raddbgi_cons.h create mode 100644 src/lib_raddbgi_make/raddbgi_make.c create mode 100644 src/lib_raddbgi_make/raddbgi_make.h delete mode 100644 src/raddbgi_cons_local/raddbgi_cons_local.h rename src/{raddbgi_cons_local/raddbgi_cons_local.c => raddbgi_make_local/raddbgi_make_local.c} (72%) create mode 100644 src/raddbgi_make_local/raddbgi_make_local.h diff --git a/src/lib_raddbgi_cons/raddbgi_cons.c b/src/lib_raddbgi_cons/raddbgi_cons.c deleted file mode 100644 index 51fddf42..00000000 --- a/src/lib_raddbgi_cons/raddbgi_cons.c +++ /dev/null @@ -1,3673 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: API Implementation Helper Macros - -#define raddbgic_require(root, b32, else_code, error_msg) do { if(!(b32)) {raddbgic_push_error((root), (error_msg)); else_code;} }while(0) -#define raddbgic_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {raddbgic_push_errorf((root), (fmt), __VA_ARGS__); else_code;} }while(0) - -//////////////////////////////// -//~ rjf: Basic Helpers - -//- rjf: memory set - -#if !defined(RADDBGIC_MEMSET_OVERRIDE) -RADDBGI_PROC void * -raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size) -{ - for(RADDBGI_U64 idx = 0; idx < size; idx += 1) - { - ((RADDBGI_U8 *)dst)[idx] = c; - } - return dst; -} -#endif - -#if !defined(RADDBGIC_MEMCPY_OVERRIDE) -RADDBGI_PROC void * -raddbgic_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size) -{ - for(RADDBGI_U64 idx = 0; idx < size; idx += 1) - { - ((RADDBGI_U8 *)dst)[idx] = ((RADDBGI_U8 *)src)[idx]; - } - return dst; -} -#endif - -//- rjf: arenas - -#if !defined (RADDBGIC_ARENA_OVERRIDE) - -RADDBGI_PROC RADDBGIC_Arena * -raddbgic_arena_alloc_fallback(void) -{ - RADDBGIC_Arena *arena = 0; - return arena; -} - -RADDBGI_PROC void -raddbgic_arena_release_fallback(RADDBGIC_Arena *arena) -{ - -} - -RADDBGI_PROC RADDBGI_U64 -raddbgic_arena_pos_fallback(RADDBGIC_Arena *arena) -{ - return 0; -} - -RADDBGI_PROC void * -raddbgic_arena_push_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 size) -{ - return 0; -} - -RADDBGI_PROC void -raddbgic_arena_pop_to_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 pos) -{ - -} - -#endif - -//- rjf: thread-local scratch arenas - -#if !defined (RADDBGIC_SCRATCH_OVERRIDE) -static RADDBGIC_THREAD_LOCAL RADDBGIC_Arena *raddbgic_thread_scratches[2]; - -RADDBGI_PROC RADDBGIC_Temp -raddbgic_scratch_begin_fallback(RADDBGIC_Arena **conflicts, RADDBGI_U64 conflicts_count) -{ - if(raddbgic_thread_scratches[0] == 0) - { - raddbgic_thread_scratches[0] = raddbgic_arena_alloc(); - raddbgic_thread_scratches[1] = raddbgic_arena_alloc(); - } - RADDBGIC_Arena *arena = 0; - for(RADDBGI_U64 scratch_idx = 0; - scratch_idx < sizeof(raddbgic_thread_scratches)/sizeof(raddbgic_thread_scratches[0]); - scratch_idx += 1) - { - RADDBGI_S32 scratch_conflicts = 0; - for(RADDBGI_U64 conflict_idx = 0; conflict_idx < conflicts_count; conflict_idx += 1) - { - if(conflicts[conflict_idx] == raddbgic_thread_scratches[scratch_idx]) - { - scratch_conflicts = 1; - break; - } - } - if(!scratch_conflicts) - { - arena = raddbgic_thread_scratches[scratch_idx]; - } - } - RADDBGIC_Temp temp; - temp.arena = arena; - temp.pos = raddbgic_arena_pos(arena); - return temp; -} - -RADDBGI_PROC void -raddbgic_scratch_end_fallback(RADDBGIC_Temp temp) -{ - raddbgic_arena_pop_to(temp.arena, temp.pos); -} - -#endif - -//- rjf: strings - -RADDBGI_PROC RADDBGIC_String8 -raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size) -{ - RADDBGIC_String8 result; - result.RADDBGIC_String8_BaseMember = str; - result.RADDBGIC_String8_SizeMember = size; - return result; -} - -RADDBGI_PROC RADDBGIC_String8 -raddbgic_str8_copy(RADDBGIC_Arena *arena, RADDBGIC_String8 src) -{ - RADDBGIC_String8 dst; - dst.RADDBGIC_String8_SizeMember = src.RADDBGIC_String8_SizeMember; - dst.RADDBGIC_String8_BaseMember = raddbgic_push_array_no_zero(arena, RADDBGI_U8, dst.RADDBGIC_String8_SizeMember+1); - raddbgic_memcpy(dst.RADDBGIC_String8_BaseMember, src.RADDBGIC_String8_BaseMember, src.RADDBGIC_String8_SizeMember); - dst.RADDBGIC_String8_BaseMember[dst.RADDBGIC_String8_SizeMember] = 0; - return dst; -} - -RADDBGI_PROC RADDBGIC_String8 -raddbgic_str8f(RADDBGIC_Arena *arena, char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - RADDBGIC_String8 result = raddbgic_str8fv(arena, fmt, args); - va_end(args); - return(result); -} - -RADDBGI_PROC RADDBGIC_String8 -raddbgic_str8fv(RADDBGIC_Arena *arena, char *fmt, va_list args) -{ - va_list args2; - va_copy(args2, args); - RADDBGI_U32 needed_bytes = raddbgic_vsnprintf(0, 0, fmt, args) + 1; - RADDBGIC_String8 result = {0}; - result.RADDBGIC_String8_BaseMember = raddbgic_push_array_no_zero(arena, RADDBGI_U8, needed_bytes); - result.RADDBGIC_String8_SizeMember = raddbgic_vsnprintf((char*)result.str, needed_bytes, fmt, args2); - result.RADDBGIC_String8_BaseMember[result.RADDBGIC_String8_SizeMember] = 0; - va_end(args2); - return(result); -} - -RADDBGI_PROC RADDBGI_S32 -raddbgic_str8_match(RADDBGIC_String8 a, RADDBGIC_String8 b, RADDBGIC_StringMatchFlags flags) -{ - RADDBGI_S32 result = 0; - if(a.RADDBGIC_String8_SizeMember == b.RADDBGIC_String8_SizeMember) - { - RADDBGI_S32 case_insensitive = (flags & RADDBGIC_StringMatchFlag_CaseInsensitive); - RADDBGI_U64 size = a.RADDBGIC_String8_SizeMember; - result = 1; - for(RADDBGI_U64 idx = 0; idx < size; idx += 1) - { - RADDBGI_U8 at = a.RADDBGIC_String8_BaseMember[idx]; - RADDBGI_U8 bt = b.RADDBGIC_String8_BaseMember[idx]; - if(case_insensitive) - { - at = ('a' <= at && at <= 'z') ? at-('a'-'A') : at; - bt = ('a' <= bt && bt <= 'z') ? bt-('a'-'A') : bt; - } - if(at != bt) - { - result = 0; - break; - } - } - } - return result; -} - -//- rjf: string lists - -RADDBGI_PROC void -raddbgic_str8_list_push(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDBGIC_String8 string) -{ - RADDBGIC_String8Node *n = raddbgic_push_array(arena, RADDBGIC_String8Node, 1); - n->RADDBGIC_String8Node_StringMember = string; - RADDBGIC_SLLQueuePush_N(list->RADDBGIC_String8List_FirstMember, list->RADDBGIC_String8List_LastMember, n, RADDBGIC_String8Node_NextPtrMember); - list->RADDBGIC_String8List_NodeCountMember += 1; - list->RADDBGIC_String8List_TotalSizeMember += string.RADDBGIC_String8_SizeMember; -} - -RADDBGI_PROC RADDBGIC_String8 -raddbgic_str8_list_join(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDBGIC_String8 sep) -{ - RADDBGIC_String8 result; - raddbgic_memzero_struct(&result); - RADDBGI_U64 sep_count = (list->RADDBGIC_String8List_NodeCountMember > 1) ? (list->RADDBGIC_String8List_NodeCountMember-1) : 0; - result.RADDBGIC_String8_SizeMember = list->RADDBGIC_String8List_TotalSizeMember+sep_count*sep.RADDBGIC_String8_SizeMember; - result.RADDBGIC_String8_BaseMember = raddbgic_push_array_no_zero(arena, RADDBGI_U8, result.RADDBGIC_String8_SizeMember+1); - RADDBGI_U64 off = 0; - for(RADDBGIC_String8Node *node = list->RADDBGIC_String8List_FirstMember; - node != 0; - node = node->RADDBGIC_String8Node_NextPtrMember) - { - raddbgic_memcpy((RADDBGI_U8*)result.RADDBGIC_String8_BaseMember+off, - node->RADDBGIC_String8Node_StringMember.RADDBGIC_String8_BaseMember, - node->RADDBGIC_String8Node_StringMember.RADDBGIC_String8_SizeMember); - off += node->RADDBGIC_String8Node_StringMember.RADDBGIC_String8_SizeMember; - if(sep.RADDBGIC_String8_SizeMember != 0 && node->RADDBGIC_String8Node_NextPtrMember != 0) - { - raddbgic_memcpy((RADDBGI_U8*)result.RADDBGIC_String8_BaseMember+off, - sep.RADDBGIC_String8_BaseMember, - sep.RADDBGIC_String8_SizeMember); - off += sep.RADDBGIC_String8_SizeMember; - } - } - result.RADDBGIC_String8_BaseMember[off] = 0; - return result; -} - -//- rjf: type lists - -RADDBGI_PROC void -raddbgic_type_list_push(RADDBGIC_Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type) -{ - RADDBGIC_TypeNode *node = raddbgic_push_array(arena, RADDBGIC_TypeNode, 1); - RADDBGIC_SLLQueuePush(list->first, list->last, node); - list->count += 1; - node->type = type; -} - -//- rjf: bytecode lists - -RADDBGI_PROC void -raddbgic_bytecode_push_op(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_EvalOp op, RADDBGI_U64 p) -{ - RADDBGI_U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; - RADDBGI_U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); - - RADDBGIC_EvalBytecodeOp *node = raddbgic_push_array(arena, RADDBGIC_EvalBytecodeOp, 1); - node->op = op; - node->p_size = p_size; - node->p = p; - - RADDBGIC_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); - bytecode->op_count += 1; - bytecode->encoded_size += 1 + p_size; -} - -RADDBGI_PROC void -raddbgic_bytecode_push_uconst(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_U64 x) -{ - if(x <= 0xFF) - { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, x); - } - else if(x <= 0xFFFF) - { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, x); - } - else if(x <= 0xFFFFFFFF) - { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, x); - } - else - { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, x); - } -} - -RADDBGI_PROC void -raddbgic_bytecode_push_sconst(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_S64 x) -{ - if(-0x80 <= x && x <= 0x7F) - { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, (RADDBGI_U64)x); - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 8); - } - else if(-0x8000 <= x && x <= 0x7FFF) - { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, (RADDBGI_U64)x); - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 16); - } - else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) - { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, (RADDBGI_U64)x); - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 32); - } - else - { - raddbgic_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, (RADDBGI_U64)x); - } -} - -RADDBGI_PROC void -raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_EvalBytecode *right_destroyed) -{ - if(right_destroyed->first_op != 0) - { - if(left_dst->first_op == 0) - { - raddbgic_memcpy_struct(left_dst, right_destroyed); - } - else - { - left_dst->last_op = right_destroyed->last_op; - left_dst->op_count += right_destroyed->op_count; - left_dst->encoded_size += right_destroyed->encoded_size; - } - raddbgic_memzero_struct(right_destroyed); - } -} - -//- rjf: sortable range sorting - -RADDBGI_PROC RADDBGIC_SortKey* -raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U64 count) -{ - // This sort is designed to take advantage of lots of pre-existing sorted ranges. - // Most line info is already sorted or close to already sorted. - // Similarly most vmap data has lots of pre-sorted ranges. etc. etc. - // Also - this sort should be a "stable" sort. In the use case of sorting vmap - // ranges, we want to be able to rely on order, so it needs to be preserved here. - - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - RADDBGIC_SortKey *result = 0; - - if(count <= 1) - { - result = keys; - } - else - { - RADDBGIC_OrderedRange *ranges_first = 0; - RADDBGIC_OrderedRange *ranges_last = 0; - RADDBGI_U64 range_count = 0; - { - RADDBGI_U64 pos = 0; - for(;pos < count;) - { - // identify ordered range - RADDBGI_U64 first = pos; - RADDBGI_U64 opl = pos + 1; - for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); - - // generate an ordered range node - RADDBGIC_OrderedRange *new_range = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGIC_OrderedRange, 1); - SLLQueuePush(ranges_first, ranges_last, new_range); - range_count += 1; - new_range->first = first; - new_range->opl = opl; - - // update pos - pos = opl; - } - } - - if(range_count == 1) - { - result = keys; - } - else - { - RADDBGIC_SortKey *keys_swap = raddbgic_push_array_no_zero(arena, RADDBGIC_SortKey, count); - RADDBGIC_SortKey *src = keys; - RADDBGIC_SortKey *dst = keys_swap; - RADDBGIC_OrderedRange *src_ranges = ranges_first; - RADDBGIC_OrderedRange *dst_ranges = 0; - RADDBGIC_OrderedRange *dst_ranges_last = 0; - - for(;;) - { - // begin a pass - for(;;) - { - // end pass when out of ranges - if(src_ranges == 0) - { - break; - } - - // get first range - RADDBGIC_OrderedRange *range1 = src_ranges; - SLLStackPop(src_ranges); - - // if this range is the whole array, we are done - if(range1->first == 0 && range1->opl == count) - { - result = src; - goto sort_done; - } - - // if there is not a second range, save this range for next time and end this pass - if(src_ranges == 0) - { - RADDBGI_U64 first = range1->first; - raddbgic_memcpy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); - SLLQueuePush(dst_ranges, dst_ranges_last, range1); - break; - } - - // get second range - RADDBGIC_OrderedRange *range2 = src_ranges; - SLLStackPop(src_ranges); - - raddbgic_assert(range1->opl == range2->first); - - // merge these ranges - RADDBGI_U64 jd = range1->first; - RADDBGI_U64 j1 = range1->first; - RADDBGI_U64 j1_opl = range1->opl; - RADDBGI_U64 j2 = range2->first; - RADDBGI_U64 j2_opl = range2->opl; - for(;;) - { - if(src[j1].key <= src[j2].key) - { - raddbgic_memcpy(dst + jd, src + j1, sizeof(*src)); - j1 += 1; - jd += 1; - if(j1 >= j1_opl) - { - break; - } - } - else - { - raddbgic_memcpy(dst + jd, src + j2, sizeof(*src)); - j2 += 1; - jd += 1; - if(j2 >= j2_opl) - { - break; - } - } - } - if(j1 < j1_opl) - { - raddbgic_memcpy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1)); - } - else - { - raddbgic_memcpy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2)); - } - - // save this as one range - range1->opl = range2->opl; - SLLQueuePush(dst_ranges, dst_ranges_last, range1); - } - - // end pass by swapping buffers and range nodes - { - RADDBGIC_SortKey *temp = src; - src = dst; - dst = temp; - } - src_ranges = dst_ranges; - dst_ranges = 0; - dst_ranges_last = 0; - } - } - } - sort_done:; - -#if 0 - // assert sortedness - for(RADDBGI_U64 i = 1; i < count; i += 1){ - raddbgic_assert(result[i - 1].key <= result[i].key); - } -#endif - - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Auxiliary Data Structure Functions - -//- rjf: u64 -> ptr map - -RADDBGI_PROC void -raddbgic_u64toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 bucket_count) -{ - raddbgic_assert(IsPow2OrZero(bucket_count) && bucket_count > 0); - map->buckets = raddbgic_push_array(arena, RADDBGIC_U64ToPtrNode*, bucket_count); - map->buckets_count = bucket_count; -} - -RADDBGI_PROC void -raddbgic_u64toptr_map_lookup(RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RADDBGIC_U64ToPtrLookup *lookup_out) -{ - RADDBGI_U64 bucket_idx = hash&(map->buckets_count - 1); - RADDBGIC_U64ToPtrNode *check_node = map->buckets[bucket_idx]; - for(;check_node != 0; check_node = check_node->next){ - for(RADDBGI_U32 k = 0; k < ArrayCount(check_node->key); k += 1){ - if(check_node->ptr[k] == 0){ - lookup_out->fill_node = check_node; - lookup_out->fill_k = k; - break; - } - else if(check_node->key[k] == key){ - lookup_out->match = check_node->ptr[k]; - break; - } - } - } -} - -RADDBGI_PROC void -raddbgic_u64toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RADDBGIC_U64ToPtrLookup *lookup, void *ptr) -{ - if(lookup->fill_node != 0) - { - RADDBGIC_U64ToPtrNode *node = lookup->fill_node; - RADDBGI_U32 k = lookup->fill_k; - node->key[k] = key; - node->ptr[k] = ptr; - } - else - { - RADDBGI_U64 bucket_idx = hash&(map->buckets_count - 1); - - RADDBGIC_U64ToPtrNode *node = raddbgic_push_array(arena, RADDBGIC_U64ToPtrNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - node->key[0] = key; - node->ptr[0] = ptr; - - lookup->fill_node = node; - lookup->fill_k = 0; - - map->pair_count += 1; - map->bucket_collision_count += (node->next != 0); - } -} - -//- rjf: string8 -> ptr map - -RADDBGI_PROC void -raddbgic_str8toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGI_U64 bucket_count) -{ - map->buckets_count = bucket_count; - map->buckets = raddbgic_push_array(arena, RADDBGIC_Str8ToPtrNode*, map->buckets_count); -} - -RADDBGI_PROC void* -raddbgic_str8toptr_map_lookup(RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, RADDBGI_U64 hash) -{ - void *result = 0; - RADDBGI_U64 bucket_idx = hash%map->buckets_count; - for(RADDBGIC_Str8ToPtrNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->hash == hash && raddbgic_str8_match(node->key, key, 0)) - { - result = node->ptr; - break; - } - } - return result; -} - -RADDBGI_PROC void -raddbgic_str8toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, RADDBGI_U64 hash, void *ptr) -{ - RADDBGI_U64 bucket_idx = hash%map->buckets_count; - RADDBGIC_Str8ToPtrNode *node = raddbgic_push_array(arena, RADDBGIC_Str8ToPtrNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - - node->key = raddbgic_str8_copy(arena, key); - node->hash = hash; - node->ptr = ptr; - map->bucket_collision_count += (node->next != 0); - map->pair_count += 1; -} - -//////////////////////////////// -//~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions - -//- rjf: root creation - -RADDBGI_PROC RADDBGIC_Root* -raddbgic_root_alloc(RADDBGIC_RootParams *params) -{ - RADDBGIC_Arena *arena = raddbgic_arena_alloc(); - RADDBGIC_Root *result = raddbgic_push_array(arena, RADDBGIC_Root, 1); - result->arena = arena; - - // fill in root parameters - { - result->addr_size = params->addr_size; - } - - // setup singular types - { - result->nil_type = raddbgic_type_new(result); - result->variadic_type = raddbgic_type_new(result); - result->variadic_type->kind = RADDBGI_TypeKind_Variadic; - - // references to "handled nil type" should be emitted as - // references to nil - but should not generate error - // messages when they are detected - they are expected! - raddbgic_assert(result->nil_type->idx == result->handled_nil_type.idx); - } - - // setup a null scope - { - RADDBGIC_Scope *scope = raddbgic_push_array(result->arena, RADDBGIC_Scope, 1); - RADDBGIC_SLLQueuePush_N(result->first_scope, result->last_scope, scope, next_order); - result->scope_count += 1; - } - - // rjf: setup null UDT - { - raddbgic_type_udt_from_any_type(result, result->nil_type); - } - - // initialize maps - { -#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128)) - - raddbgic_u64toptr_map_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); - raddbgic_u64toptr_map_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); - raddbgic_u64toptr_map_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); - raddbgic_u64toptr_map_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); - raddbgic_u64toptr_map_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); - raddbgic_str8toptr_map_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); - -#undef BKTCOUNT - } - - return result; -} - -RADDBGI_PROC void -raddbgic_root_release(RADDBGIC_Root *root) -{ - arena_release(root->arena); -} - -//- rjf: error accumulation - -RADDBGI_PROC void -raddbgic_push_error(RADDBGIC_Root *root, RADDBGIC_String8 string) -{ - RADDBGIC_Error *error = raddbgic_push_array(root->arena, RADDBGIC_Error, 1); - SLLQueuePush(root->errors.first, root->errors.last, error); - root->errors.count += 1; - error->msg = string; -} - -RADDBGI_PROC void -raddbgic_push_errorf(RADDBGIC_Root *root, char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - RADDBGIC_String8 str = raddbgic_str8fv(root->arena, fmt, args); - raddbgic_push_error(root, str); - va_end(args); -} - -RADDBGI_PROC RADDBGIC_Error* -raddbgic_first_error_from_root(RADDBGIC_Root *root) -{ - return root->errors.first; -} - -//- rjf: top-level info specification - -RADDBGI_PROC void -raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli) -{ - raddbgic_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); - raddbgic_memcpy_struct(&root->top_level_info, tli); - root->top_level_info_is_set = 1; -} - -//- rjf: binary section building - -RADDBGI_PROC void -raddbgic_add_binary_section(RADDBGIC_Root *root, RADDBGIC_String8 name, RADDBGI_BinarySectionFlags flags, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, RADDBGI_U64 foff_opl) -{ - RADDBGIC_BinarySection *sec = raddbgic_push_array(root->arena, RADDBGIC_BinarySection, 1); - SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); - root->binary_section_count += 1; - sec->name = name; - sec->flags = flags; - sec->voff_first = voff_first; - sec->voff_opl = voff_opl; - sec->foff_first = foff_first; - sec->foff_opl = foff_opl; -} - -//- rjf: unit info building - -RADDBGI_PROC RADDBGIC_Unit* -raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 unit_user_id, RADDBGI_U64 unit_user_id_hash) -{ - RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_map_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); - RADDBGIC_Unit *result = 0; - if(lookup.match != 0) - { - result = (RADDBGIC_Unit*)lookup.match; - } - else - { - result = raddbgic_push_array(root->arena, RADDBGIC_Unit, 1); - result->idx = root->unit_count; - RADDBGIC_SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); - root->unit_count += 1; - raddbgic_u64toptr_map_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); - } - return result; -} - -RADDBGI_PROC void -raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitInfo *info) -{ - raddbgic_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); - unit->info_is_set = 1; - unit->unit_name = raddbgic_str8_copy(root->arena, info->unit_name); - unit->compiler_name = raddbgic_str8_copy(root->arena, info->compiler_name); - unit->source_file = raddbgic_str8_copy(root->arena, info->source_file); - unit->object_file = raddbgic_str8_copy(root->arena, info->object_file); - unit->archive_file = raddbgic_str8_copy(root->arena, info->archive_file); - unit->build_path = raddbgic_str8_copy(root->arena, info->build_path); - unit->language = info->language; -} - -RADDBGI_PROC void -raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_LineSequence *line_sequence) -{ - RADDBGIC_LineSequenceNode *node = raddbgic_push_array(root->arena, RADDBGIC_LineSequenceNode, 1); - SLLQueuePush(unit->line_seq_first, unit->line_seq_last, node); - unit->line_seq_count += 1; - - node->line_seq.file_name = raddbgic_str8_copy(root->arena, line_sequence->file_name); - - node->line_seq.voffs = raddbgic_push_array(root->arena, RADDBGI_U64, line_sequence->line_count + 1); - raddbgic_memcpy(node->line_seq.voffs, line_sequence->voffs, sizeof(RADDBGI_U64)*(line_sequence->line_count + 1)); - - node->line_seq.line_nums = raddbgic_push_array(root->arena, RADDBGI_U32, line_sequence->line_count); - raddbgic_memcpy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(RADDBGI_U32)*line_sequence->line_count); - - if(line_sequence->col_nums != 0) - { - node->line_seq.col_nums = raddbgic_push_array(root->arena, RADDBGI_U16, line_sequence->line_count); - raddbgic_memcpy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(RADDBGI_U16)*line_sequence->line_count); - } - - node->line_seq.line_count = line_sequence->line_count; -} - -RADDBGI_PROC void -raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGI_U64 first, RADDBGI_U64 opl) -{ - RADDBGIC_UnitVMapRange *node = raddbgic_push_array(root->arena, RADDBGIC_UnitVMapRange, 1); - SLLQueuePush(root->unit_vmap_range_first, root->unit_vmap_range_last, node); - root->unit_vmap_range_count += 1; - node->unit = unit; - node->first = first; - node->opl = opl; -} - -//- rjf: type info lookups/reservations - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_from_id(RADDBGIC_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash) -{ - RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); - RADDBGIC_Type *result = (RADDBGIC_Type*)lookup.match; - return result; -} - -RADDBGI_PROC RADDBGIC_Reservation* -raddbgic_type_reserve_id(RADDBGIC_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash) -{ - RADDBGIC_Reservation *result = 0; - RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); - if(lookup.match == 0) - { - raddbgic_u64toptr_map_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); - void **slot = &lookup.fill_node->ptr[lookup.fill_k]; - result = (RADDBGIC_Reservation*)slot; - } - return result; -} - -RADDBGI_PROC void -raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_Type *type) -{ - if(res != 0 && type != 0) - { - *(void**)res = type; - } -} - -//- rjf: nil/singleton types - -RADDBGI_PROC RADDBGI_S32 -raddbgic_type_is_unhandled_nil(RADDBGIC_Root *root, RADDBGIC_Type *type) -{ - RADDBGI_S32 result = (type->kind == RADDBGI_TypeKind_NULL && type != &root->handled_nil_type); - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_handled_nil(RADDBGIC_Root *root) -{ - return &root->handled_nil_type; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_nil(RADDBGIC_Root *root) -{ - return root->nil_type; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_variadic(RADDBGIC_Root *root) -{ - return root->variadic_type; -} - -//- rjf: base type info constructors - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_new(RADDBGIC_Root *root) -{ - RADDBGIC_Type *result = raddbgic_push_array(root->arena, RADDBGIC_Type, 1); - result->idx = root->type_count; - RADDBGIC_SLLQueuePush_N(root->first_type, root->last_type, result, next_order); - root->type_count += 1; - return result; -} - -RADDBGI_PROC RADDBGIC_TypeUDT* -raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type) -{ - if(type->udt == 0) - { - RADDBGIC_TypeUDT *new_udt = raddbgic_push_array(root->arena, RADDBGIC_TypeUDT, 1); - new_udt->idx = root->type_udt_count; - RADDBGIC_SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); - root->type_udt_count += 1; - new_udt->self_type = type; - type->udt = new_udt; - } - RADDBGIC_TypeUDT *result = type->udt; - return result; -} - -RADDBGI_PROC RADDBGIC_TypeUDT* -raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type) -{ - raddbgic_requiref(root, (type->kind == RADDBGI_TypeKind_Struct || - type->kind == RADDBGI_TypeKind_Class || - type->kind == RADDBGI_TypeKind_Union), - return 0, - "Tried to use non-user-defined-type-kind to create user-defined-type."); - RADDBGIC_TypeUDT *result = 0; - result = raddbgic_type_udt_from_any_type(root, type); - return result; -} - -//- rjf: basic/operator type construction helpers - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_String8 name) -{ - raddbgic_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); - RADDBGIC_Type *result = root->nil_type; - RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); - - // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(type_kind) + name.size; - RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); - { - RADDBGI_U8 *ptr = buf; - // "basic" - *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Basic; - ptr += sizeof(RADDBGIC_TypeConstructKind); - // type_kind - raddbgic_memcpy(ptr, &type_kind, sizeof(type_kind)); - ptr += sizeof(type_kind); - // name - raddbgic_memcpy(ptr, name.str, name.size); - ptr += name.size; - } - - // check for duplicate construct - RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RADDBGIC_Type*)lookup_ptr; - if(result == 0) - { - // calculate size - RADDBGI_U32 byte_size = raddbgi_size_from_basic_type_kind(type_kind); - if(byte_size == 0xFFFFFFFF) - { - byte_size = root->addr_size; - } - - // setup new node - result = raddbgic_type_new(root); - result->kind = type_kind; - result->name = raddbgic_str8_copy(root->arena, name); - result->byte_size = byte_size; - - // save in construct map - raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - - // save in name map - { - RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - raddbgic_name_map_add_pair(root, map, result->name, result->idx); - } - } - - scratch_end(scratch); - raddbgic_assert(result != 0); - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeModifierFlags flags) -{ - RADDBGIC_Type *result = root->nil_type; - RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); - - // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); - RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); - { - RADDBGI_U8 *ptr = buf; - // "modifier" - *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Modifier; - ptr += sizeof(RADDBGIC_TypeConstructKind); - // flags - raddbgic_memcpy(ptr, &flags, sizeof(flags)); - ptr += sizeof(flags); - // direct_type->idx - raddbgic_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - } - - // check for duplicate construct - RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RADDBGIC_Type*)lookup_ptr; - if(result == 0){ - - // setup new node - result = raddbgic_type_new(root); - result->kind = RADDBGI_TypeKind_Modifier; - result->flags = flags; - result->byte_size = direct_type->byte_size; - result->direct_type = direct_type; - - // save in construct map - raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - raddbgic_scratch_end(scratch); - raddbgic_assert(result != 0); - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count) -{ - RADDBGIC_Type *result = root->nil_type; - RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); - - // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(RADDBGI_U32)*2; - RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); - { - RADDBGI_U8 *ptr = buf; - // "bitfield" - *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Bitfield; - ptr += sizeof(RADDBGIC_TypeConstructKind); - // direct_type->idx - raddbgic_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - // bit_off - raddbgic_memcpy(ptr, &bit_off, sizeof(bit_off)); - ptr += sizeof(bit_off); - // bit_count - raddbgic_memcpy(ptr, &bit_count, sizeof(bit_count)); - ptr += sizeof(bit_count); - } - - // check for duplicate construct - RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RADDBGIC_Type*)lookup_ptr; - if(result == 0) - { - // setup new node - result = raddbgic_type_new(root); - result->kind = RADDBGI_TypeKind_Bitfield; - result->byte_size = direct_type->byte_size; - result->off = bit_off; - result->count = bit_count; - result->direct_type = direct_type; - - // save in construct map - raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - raddbgic_scratch_end(scratch); - raddbgic_assert(result != 0); - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeKind ptr_type_kind) -{ - raddbgic_requiref(root, (ptr_type_kind == RADDBGI_TypeKind_Ptr || - ptr_type_kind == RADDBGI_TypeKind_LRef || - ptr_type_kind == RADDBGI_TypeKind_RRef), - return root->nil_type, - "Non-pointer type kind used to construct pointer type."); - RADDBGIC_Type *result = root->nil_type; - RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); - - // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); - RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); - { - RADDBGI_U8 *ptr = buf; - // "pointer" - *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Pointer; - ptr += sizeof(RADDBGIC_TypeConstructKind); - // type_kind - raddbgic_memcpy(ptr, &ptr_type_kind, sizeof(ptr_type_kind)); - ptr += sizeof(ptr_type_kind); - // direct_type->idx - raddbgic_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - } - - // check for duplicate construct - RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RADDBGIC_Type*)lookup_ptr; - if(result == 0) - { - // setup new node - result = raddbgic_type_new(root); - result->kind = ptr_type_kind; - result->byte_size = root->addr_size; - result->direct_type = direct_type; - - // save in construct map - raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - raddbgic_scratch_end(scratch); - raddbgic_assert(result != 0); - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U64 count) -{ - RADDBGIC_Type *result = root->nil_type; - RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); - - // setup construct buffer - RADDBGI_U64 buf_size = - sizeof(RADDBGIC_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); - RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); - { - RADDBGI_U8 *ptr = buf; - // "array" - *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Array; - ptr += sizeof(RADDBGIC_TypeConstructKind); - // direct_type->idx - raddbgic_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - // count - raddbgic_memcpy(ptr, &count, sizeof(count)); - ptr += sizeof(count); - } - - // check for duplicate construct - RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RADDBGIC_Type*)lookup_ptr; - if(result == 0) - { - // setup new node - result = raddbgic_type_new(root); - result->kind = RADDBGI_TypeKind_Array; - result->count = count; - result->direct_type = direct_type; - result->byte_size = direct_type->byte_size*count; - - // save in construct map - raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - scratch_end(scratch); - raddbgic_assert(result != 0); - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params) -{ - RADDBGIC_Type *result = root->nil_type; - RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); - - // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); - RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); - { - RADDBGI_U8 *ptr = buf; - // "procedure" - *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Procedure; - ptr += sizeof(RADDBGIC_TypeConstructKind); - // ret_type->idx - raddbgic_memcpy(ptr, &return_type->idx, sizeof(return_type->idx)); - ptr += sizeof(return_type->idx); - // (params ...)->idx - for(RADDBGIC_TypeNode *node = params->first; - node != 0; - node = node->next) - { - raddbgic_memcpy(ptr, &node->type->idx, sizeof(node->type->idx)); - ptr += sizeof(node->type->idx); - } - } - - // check for duplicate construct - RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RADDBGIC_Type*)lookup_ptr; - if(result == 0) - { - // setup param buffer - RADDBGIC_Type **param_types = raddbgic_push_array(root->arena, RADDBGIC_Type*, params->count); - { - RADDBGIC_Type **ptr = param_types; - for(RADDBGIC_TypeNode *node = params->first; - node != 0; - node = node->next) - { - *ptr = node->type; - ptr += 1; - } - } - - // setup new node - result = raddbgic_type_new(root); - result->kind = RADDBGI_TypeKind_Function; - result->byte_size = root->addr_size; - result->count = params->count; - result->direct_type = return_type; - result->param_types = param_types; - - // save in construct map - raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - raddbgic_scratch_end(scratch); - raddbgic_assert(result != 0); - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params) -{ - RADDBGIC_Type *result = root->nil_type; - RADDBGIC_Temp scratch = raddbgic_scratch_begin(0, 0); - - // setup construct buffer - RADDBGI_U64 buf_size = - sizeof(RADDBGIC_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); - RADDBGI_U8 *buf = raddbgic_push_array(raddbgic_temp_arena(scratch), RADDBGI_U8, buf_size); - { - RADDBGI_U8 *ptr = buf; - // "method" - *(RADDBGIC_TypeConstructKind*)ptr = RADDBGIC_TypeConstructKind_Method; - ptr += sizeof(RADDBGIC_TypeConstructKind); - // ret_type->idx - raddbgic_memcpy(ptr, &return_type->idx, sizeof(return_type->idx)); - ptr += sizeof(return_type->idx); - // this_type->idx - raddbgic_memcpy(ptr, &this_type->idx, sizeof(this_type->idx)); - ptr += sizeof(this_type->idx); - // (params ...)->idx - for(RADDBGIC_TypeNode *node = params->first; - node != 0; - node = node->next) - { - raddbgic_memcpy(ptr, &node->type->idx, sizeof(node->type->idx)); - ptr += sizeof(node->type->idx); - } - } - - // check for duplicate construct - RADDBGIC_String8 blob = raddbgic_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); - void *lookup_ptr = raddbgic_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RADDBGIC_Type*)lookup_ptr; - if(result == 0) - { - // setup param buffer - RADDBGIC_Type **param_types = raddbgic_push_array(root->arena, RADDBGIC_Type*, params->count + 1); - { - RADDBGIC_Type **ptr = param_types; - { - *ptr = this_type; - ptr += 1; - } - for(RADDBGIC_TypeNode *node = params->first; - node != 0; - node = node->next) - { - *ptr = node->type; - ptr += 1; - } - } - - // setup new node - result = raddbgic_type_new(root); - result->kind = RADDBGI_TypeKind_Method; - result->byte_size = root->addr_size; - result->count = params->count; - result->direct_type = return_type; - result->param_types = param_types; - - // save in construct map - raddbgic_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - raddbgic_scratch_end(scratch); - raddbgic_assert(result != 0); - return result; -} - -//- rjf: udt type constructors - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, RADDBGIC_String8 name, RADDBGI_U64 size) -{ - raddbgic_requiref(root, (record_type_kind == RADDBGI_TypeKind_Struct || - record_type_kind == RADDBGI_TypeKind_Class || - record_type_kind == RADDBGI_TypeKind_Union), - return root->nil_type, - "Non-user-defined-type-kind used to create user-defined type."); - - // rjf: make type - RADDBGIC_Type *result = raddbgic_type_new(root); - result->kind = record_type_kind; - result->byte_size = size; - result->name = raddbgic_str8_copy(root->arena, name); - - // rjf: save in name map - { - RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - raddbgic_name_map_add_pair(root, map, result->name, result->idx); - } - - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGIC_String8 name) -{ - // rjf: make type - RADDBGIC_Type *result = raddbgic_type_new(root); - result->kind = RADDBGI_TypeKind_Enum; - result->byte_size = direct_type->byte_size; - result->name = raddbgic_str8_copy(root->arena, name); - result->direct_type = direct_type; - - // rjf: save in name map - { - RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - raddbgic_name_map_add_pair(root, map, result->name, result->idx); - } - - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGIC_String8 name) -{ - // rjf: make type - RADDBGIC_Type *result = raddbgic_type_new(root); - result->kind = RADDBGI_TypeKind_Alias; - result->byte_size = direct_type->byte_size; - result->name = raddbgic_str8_copy(root->arena, name); - result->direct_type = direct_type; - - // rjf: save in name map - { - RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - raddbgic_name_map_add_pair(root, map, result->name, result->idx); - } - - return result; -} - -RADDBGI_PROC RADDBGIC_Type* -raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_String8 name) -{ - raddbgic_requiref(root, (type_kind == RADDBGI_TypeKind_IncompleteStruct || - type_kind == RADDBGI_TypeKind_IncompleteClass || - type_kind == RADDBGI_TypeKind_IncompleteUnion || - type_kind == RADDBGI_TypeKind_IncompleteEnum), - return root->nil_type, - "Non-incomplete-type-kind used to create incomplete type."); - - // rjf: make type - RADDBGIC_Type *result = raddbgic_type_new(root); - result->kind = type_kind; - result->name = raddbgic_str8_copy(root->arena, name); - - // save in name map - { - RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Types); - raddbgic_name_map_add_pair(root, map, result->name, result->idx); - } - - return result; -} - -//- rjf: type member building - -RADDBGI_PROC void -raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type, RADDBGI_U32 off) -{ - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_DataField; - member->name = raddbgic_str8_copy(root->arena, name); - member->type = mem_type; - member->off = off; - } -} - -RADDBGI_PROC void -raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type) -{ - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_StaticData; - member->name = raddbgic_str8_copy(root->arena, name); - member->type = mem_type; - } -} - -RADDBGI_PROC void -raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type) -{ - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_Method; - member->name = raddbgic_str8_copy(root->arena, name); - member->type = mem_type; - } -} - -RADDBGI_PROC void -raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type) -{ - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - - root->total_member_count += 1; - - member->kind = RADDBGI_MemberKind_StaticMethod; - member->name = raddbgic_str8_copy(root->arena, name); - member->type = mem_type; - } -} - -RADDBGI_PROC void -raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type) -{ - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_VirtualMethod; - member->name = raddbgic_str8_copy(root->arena, name); - member->type = mem_type; - } -} - -RADDBGI_PROC void -raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, RADDBGI_U32 off) -{ - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_Base; - member->type = base_type; - member->off = off; - } -} - -RADDBGI_PROC void -raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, RADDBGI_U32 vptr_off, RADDBGI_U32 vtable_off) -{ - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_VirtualBase; - member->type = base_type; - // TODO(allen): what to do with the two offsets in this case? - } -} - -RADDBGI_PROC void -raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *nested_type) -{ - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RADDBGIC_TypeMember *member = raddbgic_push_array(root->arena, RADDBGIC_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_NestedType; - member->type = nested_type; - } -} - -RADDBGI_PROC void -raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, RADDBGIC_String8 name, RADDBGI_U64 val) -{ - raddbgic_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_any_type(root, enum_type); - if(udt != 0) - { - RADDBGIC_TypeEnumVal *enum_val = raddbgic_push_array(root->arena, RADDBGIC_TypeEnumVal, 1); - SLLQueuePush(udt->first_enum_val, udt->last_enum_val, enum_val); - udt->enum_val_count += 1; - root->total_enum_val_count += 1; - enum_val->name = raddbgic_str8_copy(root->arena, name); - enum_val->val = val; - } -} - -//- rjf: type source coordinate specifications -RADDBGI_PROC void -raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, RADDBGIC_String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col) -{ - raddbgic_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), - return, "Tried to add source coordinates to non-user-defined type."); - RADDBGIC_TypeUDT *udt = raddbgic_type_udt_from_any_type(root, defined_type); - if(udt != 0) - { - udt->source_path = raddbgic_str8_copy(root->arena, source_path); - udt->line = line; - udt->col = col; - } -} - -//- rjf: symbol info building - -RADDBGI_PROC RADDBGIC_Symbol* -raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 symbol_user_id, RADDBGI_U64 symbol_user_id_hash) -{ - RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_map_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); - RADDBGIC_Symbol *result = 0; - if(lookup.match != 0) - { - result = (RADDBGIC_Symbol*)lookup.match; - } - else - { - result = raddbgic_push_array(root->arena, RADDBGIC_Symbol, 1); - RADDBGIC_SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); - root->symbol_count += 1; - raddbgic_u64toptr_map_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); - } - return result; -} - -RADDBGI_PROC void -raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_SymbolInfo *info) -{ - // rjf: unpack - RADDBGIC_SymbolKind kind = info->kind; - RADDBGIC_Symbol *container_symbol = info->container_symbol; - RADDBGIC_Type *container_type = info->container_type; - - // rjf: requirements - raddbgic_requiref(root, RADDBGIC_SymbolKind_NULL == symbol->kind, return, "Symbol information set multiple times."); - raddbgic_requiref(root, RADDBGIC_SymbolKind_NULL < info->kind && info->kind < RADDBGIC_SymbolKind_COUNT, return, "Invalid symbol kind used to initialize symbol."); - raddbgic_requiref(root, info->type != 0, return, "Invalid type used to initialize symbol."); - raddbgic_requiref(root, info->container_symbol == 0 || info->container_type == 0, container_type = 0, "Symbol initialized with both a containing symbol and containing type, when only one is allowed."); - - // rjf: fill - root->symbol_kind_counts[kind] += 1; - symbol->idx = root->symbol_kind_counts[kind]; - symbol->kind = kind; - symbol->name = raddbgic_str8_copy(root->arena, info->name); - symbol->link_name = raddbgic_str8_copy(root->arena, info->link_name); - symbol->type = info->type; - symbol->is_extern = info->is_extern; - symbol->offset = info->offset; - symbol->container_symbol = container_symbol; - symbol->container_type = container_type; - - // rjf: set root scope - switch(kind) - { - default:{}break; - case RADDBGIC_SymbolKind_GlobalVariable: - case RADDBGIC_SymbolKind_ThreadVariable: - { - raddbgic_requiref(root, info->root_scope == 0, raddbgic_noop, "Global or thread variable initialized with root scope."); - }break; - case RADDBGIC_SymbolKind_Procedure: - { - raddbgic_requiref(root, info->root_scope != 0, raddbgic_noop, "Procedure symbol initialized without root scope."); - symbol->root_scope = info->root_scope; - raddbgic_scope_recursive_set_symbol(info->root_scope, symbol); - }break; - } - - // save name map - { - RADDBGIC_NameMap *map = 0; - switch(kind) - { - default:{}break; - case RADDBGIC_SymbolKind_GlobalVariable: - { - map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_GlobalVariables); - }break; - case RADDBGIC_SymbolKind_ThreadVariable: - { - map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_ThreadVariables); - }break; - case RADDBGIC_SymbolKind_Procedure: - { - map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_Procedures); - }break; - } - if(map != 0) - { - raddbgic_name_map_add_pair(root, map, symbol->name, symbol->idx); - } - } - - // save link name map - if(kind == RADDBGIC_SymbolKind_Procedure && symbol->link_name.size > 0) - { - RADDBGIC_NameMap *map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_LinkNameProcedures); - raddbgic_name_map_add_pair(root, map, symbol->link_name, symbol->idx); - } -} - -//- rjf: scope info building - -RADDBGI_PROC RADDBGIC_Scope * -raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 scope_user_id, RADDBGI_U64 scope_user_id_hash) -{ - RADDBGIC_Scope *result = 0; - RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_map_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); - if(lookup.match != 0) - { - result = (RADDBGIC_Scope*)lookup.match; - } - else - { - result = raddbgic_push_array(root->arena, RADDBGIC_Scope, 1); - result->idx = root->scope_count; - RADDBGIC_SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); - root->scope_count += 1; - raddbgic_u64toptr_map_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); - } - return result; -} - -RADDBGI_PROC void -raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_Scope *parent) -{ - raddbgic_requiref(root, scope->parent_scope == 0, return, "Scope parent set multiple times."); - raddbgic_requiref(root, parent != 0, return, "Tried to set invalid parent as scope parent."); - scope->symbol = parent->symbol; - scope->parent_scope = parent; - RADDBGIC_SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); -} - -RADDBGI_PROC void -raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl) -{ - RADDBGIC_VOffRange *range = raddbgic_push_array(root->arena, RADDBGIC_VOffRange, 1); - SLLQueuePush(scope->first_range, scope->last_range, range); - scope->range_count += 1; - range->voff_first = voff_first; - range->voff_opl = voff_opl; - scope->voff_base = Min(scope->voff_base, voff_first); - root->scope_voff_count += 2; -} - -RADDBGI_PROC void -raddbgic_scope_recursive_set_symbol(RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol) -{ - scope->symbol = symbol; - for(RADDBGIC_Scope *node = scope->first_child; - node != 0; - node = node->next_sibling) - { - raddbgic_scope_recursive_set_symbol(node, symbol); - } -} - -//- rjf: local info building - -RADDBGI_PROC RADDBGIC_Local* -raddbgic_local_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 local_user_id, RADDBGI_U64 local_user_id_hash) -{ - RADDBGIC_Local *result = 0; - RADDBGIC_U64ToPtrLookup lookup = {0}; - raddbgic_u64toptr_map_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); - if(lookup.match != 0) - { - result = (RADDBGIC_Local*)lookup.match; - } - else - { - result = raddbgic_push_array(root->arena, RADDBGIC_Local, 1); - raddbgic_u64toptr_map_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); - } - return result; -} - -RADDBGI_PROC void -raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBGIC_LocalInfo *info) -{ - raddbgic_requiref(root, local->kind == RADDBGI_LocalKind_NULL, return, "Local information set multiple times."); - raddbgic_requiref(root, info->scope != 0, return, "Tried to set invalid scope as local's containing scope."); - raddbgic_requiref(root, RADDBGI_LocalKind_NULL < info->kind && info->kind < RADDBGI_LocalKind_COUNT, return, "Invalid local kind."); - raddbgic_requiref(root, info->type != 0, return, "Tried to set invalid type as local's type."); - RADDBGIC_Scope *scope = info->scope; - SLLQueuePush(scope->first_local, scope->last_local, local); - scope->local_count += 1; - root->local_count += 1; - local->kind = info->kind; - local->name = raddbgic_str8_copy(root->arena, info->name); - local->type = info->type; -} - -RADDBGI_PROC RADDBGIC_LocationSet* -raddbgic_location_set_from_local(RADDBGIC_Root *root, RADDBGIC_Local *local) -{ - RADDBGIC_LocationSet *result = local->locset; - if(result == 0) - { - local->locset = raddbgic_push_array(root->arena, RADDBGIC_LocationSet, 1); - result = local->locset; - } - return result; -} - -//- rjf: location info building - -RADDBGI_PROC void -raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGIC_Location *location) -{ - RADDBGIC_LocationCase *location_case = raddbgic_push_array(root->arena, RADDBGIC_LocationCase, 1); - SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); - locset->location_case_count += 1; - root->location_count += 1; - location_case->voff_first = voff_first; - location_case->voff_opl = voff_opl; - location_case->location = location; -} - -RADDBGI_PROC RADDBGIC_Location* -raddbgic_location_addr_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode) -{ - RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); - result->kind = RADDBGI_LocationKind_AddrBytecodeStream; - result->bytecode = *bytecode; - return result; -} - -RADDBGI_PROC RADDBGIC_Location* -raddbgic_location_val_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode) -{ - RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); - result->kind = RADDBGI_LocationKind_ValBytecodeStream; - result->bytecode = *bytecode; - return result; -} - -RADDBGI_PROC RADDBGIC_Location* -raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset) -{ - RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); - result->kind = RADDBGI_LocationKind_AddrRegisterPlusU16; - result->register_code = reg_code; - result->offset = offset; - return result; -} - -RADDBGI_PROC RADDBGIC_Location* -raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset) -{ - RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); - result->kind = RADDBGI_LocationKind_AddrAddrRegisterPlusU16; - result->register_code = reg_code; - result->offset = offset; - return result; -} - -RADDBGI_PROC RADDBGIC_Location* -raddbgic_location_val_reg(RADDBGIC_Root *root, RADDBGI_U8 reg_code) -{ - RADDBGIC_Location *result = raddbgic_push_array(root->arena, RADDBGIC_Location, 1); - result->kind = RADDBGI_LocationKind_ValRegister; - result->register_code = reg_code; - return result; -} - -//- rjf: name map building - -RADDBGI_PROC RADDBGIC_NameMap* -raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind) -{ - RADDBGIC_NameMap *result = 0; - if(kind < RADDBGI_NameMapKind_COUNT) - { - if(root->name_maps[kind] == 0) - { - root->name_maps[kind] = raddbgic_push_array(root->arena, RADDBGIC_NameMap, 1); - root->name_maps[kind]->buckets_count = 16384; - root->name_maps[kind]->buckets = raddbgic_push_array(root->arena, RADDBGIC_NameMapNode *, root->name_maps[kind]->buckets_count); - } - result = root->name_maps[kind]; - } - return result; -} - -RADDBGI_PROC void -raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, RADDBGIC_String8 string, RADDBGI_U32 idx) -{ - // hash - RADDBGI_U64 hash = raddbgi_hash(string.str, string.size); - RADDBGI_U64 bucket_idx = hash%map->buckets_count; - - // find existing name node - RADDBGIC_NameMapNode *match = 0; - for(RADDBGIC_NameMapNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->bucket_next) - { - if(raddbgic_str8_match(string, node->string, 0)) - { - match = node; - break; - } - } - - // make name node if necessary - if(match == 0) - { - match = raddbgic_push_array(root->arena, RADDBGIC_NameMapNode, 1); - match->string = raddbgic_str8_copy(root->arena, string); - RADDBGIC_SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); - RADDBGIC_SLLQueuePush_N(map->first, map->last, match, order_next); - map->name_count += 1; - map->bucket_collision_count += (match->bucket_next != 0); - } - - // find existing idx - RADDBGI_S32 existing_idx = 0; - for(RADDBGIC_NameMapIdxNode *node = match->idx_first; - node != 0; - node = node->next) - { - for(RADDBGI_U32 i = 0; i < ArrayCount(node->idx); i += 1) - { - if(node->idx[i] == 0) - { - break; - } - if(node->idx[i] == idx) - { - existing_idx = 1; - break; - } - } - } - - // insert new idx if necessary - if(!existing_idx) - { - RADDBGIC_NameMapIdxNode *idx_node = match->idx_last; - RADDBGI_U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); - if(insert_i == 0) - { - idx_node = raddbgic_push_array(root->arena, RADDBGIC_NameMapIdxNode, 1); - SLLQueuePush(match->idx_first, match->idx_last, idx_node); - } - - idx_node->idx[insert_i] = idx; - match->idx_count += 1; - } -} - -//////////////////////////////// -//~ rjf: Debug Info Baking (Loose -> Tight) Functions - -//- rjf: bake context construction - -RADDBGI_PROC RADDBGIC_BakeCtx* -raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params) -{ - RADDBGIC_Arena *arena = raddbgic_arena_alloc(); - RADDBGIC_BakeCtx *result = raddbgic_push_array(arena, RADDBGIC_BakeCtx, 1); - result->arena = arena; -#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) - result->strs.buckets_count = BKTCOUNT(params->strings_bucket_count); - result->idxs.buckets_count = BKTCOUNT(params->idx_runs_bucket_count); -#undef BKTCOUNT - result->strs.buckets = raddbgic_push_array(arena, RADDBGIC_StringNode *, result->strs.buckets_count); - result->idxs.buckets = raddbgic_push_array(arena, RADDBGIC_IdxRunNode *, result->idxs.buckets_count); - - raddbgic_string(result, raddbgic_str8_lit("")); - raddbgic_idx_run(result, 0, 0); - - result->tree = raddbgic_push_array(arena, RADDBGIC_PathTree, 1); - { - RADDBGIC_PathNode *nil_path_node = raddbgic_paths_new_node(result); - nil_path_node->name = raddbgic_str8_lit(""); - RADDBGIC_SrcNode *nil_src_node = raddbgic_paths_new_src_node(result); - nil_src_node->path_node = nil_path_node; - nil_src_node->normal_full_path = raddbgic_str8_lit(""); - nil_path_node->src_file = nil_src_node; - } - - return result; -} - -RADDBGI_PROC void -raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx) -{ - arena_release(bake_ctx->arena); -} - -//- rjf: string baking - -RADDBGI_PROC RADDBGI_U32 -raddbgic_string(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 str) -{ - RADDBGIC_Arena *arena = bctx->arena; - RADDBGIC_Strings *strs = &bctx->strs; - RADDBGI_U64 hash = raddbgi_hash(str.str, str.size); - RADDBGI_U64 bucket_idx = hash%strs->buckets_count; - - // look for a match - RADDBGIC_StringNode *match = 0; - for(RADDBGIC_StringNode *node = strs->buckets[bucket_idx]; - node != 0; - node = node->bucket_next) - { - if(node->hash == hash && raddbgic_str8_match(node->str, str, 0)) - { - match = node; - break; - } - } - - // insert new node if no match - if(match == 0) - { - RADDBGIC_StringNode *node = raddbgic_push_array_no_zero(arena, RADDBGIC_StringNode, 1); - node->str = raddbgic_str8_copy(arena, str); - node->hash = hash; - node->idx = strs->count; - strs->count += 1; - RADDBGIC_SLLQueuePush_N(strs->order_first, strs->order_last, node, order_next); - RADDBGIC_SLLStackPush_N(strs->buckets[bucket_idx], node, bucket_next); - match = node; - strs->bucket_collision_count += (node->bucket_next != 0); - } - - // extract idx to return - raddbgic_assert(match != 0); - RADDBGI_U32 result = match->idx; - return result; -} - -//- rjf: idx run baking - -RADDBGI_PROC RADDBGI_U64 -raddbgic_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count) -{ - RADDBGI_U64 hash = 5381; - RADDBGI_U32 *ptr = idx_run; - RADDBGI_U32 *opl = idx_run + count; - for(;ptr < opl; ptr += 1) - { - hash = ((hash << 5) + hash) + (*ptr); - } - return(hash); -} - -RADDBGI_PROC RADDBGI_U32 -raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count) -{ - RADDBGIC_Arena *arena = bctx->arena; - RADDBGIC_IdxRuns *idxs = &bctx->idxs; - - RADDBGI_U64 hash = raddbgic_idx_run_hash(idx_run, count); - RADDBGI_U64 bucket_idx = hash%idxs->buckets_count; - - // look for a match - RADDBGIC_IdxRunNode *match = 0; - for(RADDBGIC_IdxRunNode *node = idxs->buckets[bucket_idx]; - node != 0; - node = node->bucket_next) - { - if(node->hash == hash) - { - RADDBGI_S32 is_match = 1; - RADDBGI_U32 *node_idx = node->idx_run; - for(RADDBGI_U32 i = 0; i < count; i += 1) - { - if(node_idx[i] != idx_run[i]) - { - is_match = 0; - break; - } - } - if(is_match) - { - match = node; - break; - } - } - } - - // insert new node if no match - if(match == 0) - { - RADDBGIC_IdxRunNode *node = raddbgic_push_array_no_zero(arena, RADDBGIC_IdxRunNode, 1); - RADDBGI_U32 *idx_run_copy = raddbgic_push_array_no_zero(arena, RADDBGI_U32, count); - for(RADDBGI_U32 i = 0; i < count; i += 1) - { - idx_run_copy[i] = idx_run[i]; - } - node->idx_run = idx_run_copy; - node->hash = hash; - node->count = count; - node->first_idx = idxs->idx_count; - idxs->count += 1; - idxs->idx_count += count; - RADDBGIC_SLLQueuePush_N(idxs->order_first, idxs->order_last, node, order_next); - RADDBGIC_SLLStackPush_N(idxs->buckets[bucket_idx], node, bucket_next); - match = node; - idxs->bucket_collision_count += (node->bucket_next != 0); - } - - // extract idx to return - raddbgic_assert(match != 0); - RADDBGI_U32 result = match->first_idx; - return result; -} - -//- rjf: data section baking - -RADDBGI_PROC RADDBGI_U32 -raddbgic_dsection(RADDBGIC_Arena *arena, RADDBGIC_DSections *dss, void *data, RADDBGI_U64 size, RADDBGI_DataSectionTag tag) -{ - RADDBGI_U32 result = dss->count; - RADDBGIC_DSectionNode *node = raddbgic_push_array(arena, RADDBGIC_DSectionNode, 1); - SLLQueuePush(dss->first, dss->last, node); - node->data = data; - node->size = size; - node->tag = tag; - dss->count += 1; - return result; -} - -//- rjf: paths baking - -RADDBGI_PROC RADDBGIC_String8 -raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node) -{ - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - RADDBGIC_String8List list = {0}; - if(node != 0) - { - raddbgic_normal_string_from_path_node_build(scratch.arena, node, &list); - } - RADDBGIC_String8 result = raddbgic_str8_list_join(arena, &list, raddbgic_str8_lit("/")); - { - RADDBGI_U8 *ptr = result.str; - RADDBGI_U8 *opl = result.str + result.size; - for(; ptr < opl; ptr += 1) - { - RADDBGI_U8 c = *ptr; - if('A' <= c && c <= 'Z') { c += 'a' - 'A'; } - *ptr = c; - } - } - scratch_end(scratch); - return result; -} - -RADDBGI_PROC void -raddbgic_normal_string_from_path_node_build(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node, RADDBGIC_String8List *out) -{ - // TODO(rjf): why is this recursive... - if(node->parent != 0) - { - raddbgic_normal_string_from_path_node_build(arena, node->parent, out); - } - if(node->name.size > 0) - { - raddbgic_str8_list_push(arena, out, node->name); - } -} - -RADDBGI_PROC RADDBGIC_PathNode* -raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx) -{ - RADDBGIC_PathTree *tree = bctx->tree; - RADDBGIC_PathNode *result = raddbgic_push_array(bctx->arena, RADDBGIC_PathNode, 1); - RADDBGIC_SLLQueuePush_N(tree->first, tree->last, result, next_order); - result->idx = tree->count; - tree->count += 1; - return result; -} - -RADDBGI_PROC RADDBGIC_PathNode* -raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, RADDBGIC_String8 sub_dir) -{ - // look for existing match - RADDBGIC_PathNode *match = 0; - for(RADDBGIC_PathNode *node = dir->first_child; - node != 0; - node = node->next_sibling) - { - if(raddbgic_str8_match(node->name, sub_dir, RADDBGIC_StringMatchFlag_CaseInsensitive)) - { - match = node; - break; - } - } - - // construct new node if no match - RADDBGIC_PathNode *new_node = 0; - if(match == 0){ - new_node = raddbgic_paths_new_node(bctx); - new_node->parent = dir; - RADDBGIC_SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); - new_node->name = raddbgic_str8_copy(bctx->arena, sub_dir); - } - - // select result from the two paths - RADDBGIC_PathNode *result = match; - if(match == 0){ - result = new_node; - } - - return result; -} - -RADDBGI_PROC RADDBGIC_PathNode* -raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path) -{ - RADDBGIC_PathNode *node_cursor = &bctx->tree->root; - - RADDBGI_U8 *ptr = path.str; - RADDBGI_U8 *opl = path.str + path.size; - for(;ptr < opl;){ - // skip past slashes - for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); - - // save beginning of non-slash range - RADDBGI_U8 *range_first = ptr; - - // skip past non-slashes - for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); - - // if range is non-empty advance the node cursor - if(range_first < ptr){ - RADDBGIC_String8 sub_dir = raddbgic_str8(range_first, (RADDBGI_U64)(ptr-range_first)); - node_cursor = raddbgic_paths_sub_path(bctx, node_cursor, sub_dir); - } - } - - RADDBGIC_PathNode *result = node_cursor; - return result; -} - -RADDBGI_PROC RADDBGI_U32 -raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path) -{ - RADDBGIC_PathNode *node = raddbgic_paths_node_from_path(bctx, path); - RADDBGI_U32 result = node->idx; - return result; -} - -RADDBGI_PROC RADDBGIC_SrcNode* -raddbgic_paths_new_src_node(RADDBGIC_BakeCtx *bctx) -{ - RADDBGIC_PathTree *tree = bctx->tree; - RADDBGIC_SrcNode *result = raddbgic_push_array(bctx->arena, RADDBGIC_SrcNode, 1); - SLLQueuePush(tree->src_first, tree->src_last, result); - result->idx = tree->src_count; - tree->src_count += 1; - return result; -} - -RADDBGI_PROC RADDBGIC_SrcNode* -raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *path_node) -{ - RADDBGIC_SrcNode *result = path_node->src_file; - if(result == 0) - { - RADDBGIC_SrcNode *new_node = raddbgic_paths_new_src_node(bctx); - new_node->path_node = path_node; - new_node->normal_full_path = raddbgic_normal_string_from_path_node(bctx->arena, path_node); - result = path_node->src_file = new_node; - } - return result; -} - -//- rjf: per-unit line info baking - -RADDBGI_PROC RADDBGIC_UnitLinesCombined* -raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq) -{ - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - - // gather up all line info into two arrays - // keys: sortable array; pairs voffs with line info records; null records are sequence enders - // recs: contains all the source coordinates for a range of voffs - RADDBGI_U64 line_count = 0; - RADDBGI_U64 seq_count = 0; - for(RADDBGIC_LineSequenceNode *node = first_seq; - node != 0; - node = node->next) - { - seq_count += 1; - line_count += node->line_seq.line_count; - } - - RADDBGI_U64 key_count = line_count + seq_count; - RADDBGIC_SortKey *line_keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, key_count); - RADDBGIC_LineRec *line_recs = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_LineRec, line_count); - - { - RADDBGIC_SortKey *key_ptr = line_keys; - RADDBGIC_LineRec *rec_ptr = line_recs; - - for(RADDBGIC_LineSequenceNode *node = first_seq; - node != 0; - node = node->next) - { - RADDBGIC_PathNode *src_path = - raddbgic_paths_node_from_path(bctx, node->line_seq.file_name); - RADDBGIC_SrcNode *src_file = raddbgic_paths_src_node_from_path_node(bctx, src_path); - RADDBGI_U32 file_id = src_file->idx; - - RADDBGI_U64 node_line_count = node->line_seq.line_count; - for(RADDBGI_U64 i = 0; i < node_line_count; i += 1){ - key_ptr->key = node->line_seq.voffs[i]; - key_ptr->val = rec_ptr; - key_ptr += 1; - - rec_ptr->file_id = file_id; - rec_ptr->line_num = node->line_seq.line_nums[i]; - if(node->line_seq.col_nums != 0){ - rec_ptr->col_first = node->line_seq.col_nums[i*2]; - rec_ptr->col_opl = node->line_seq.col_nums[i*2 + 1]; - } - rec_ptr += 1; - } - - key_ptr->key = node->line_seq.voffs[node_line_count]; - key_ptr->val = 0; - key_ptr += 1; - - RADDBGIC_LineMapFragment *fragment = raddbgic_push_array(arena, RADDBGIC_LineMapFragment, 1); - RADDBGIC_SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); - fragment->sequence = node; - } - } - - // sort - RADDBGIC_SortKey *sorted_line_keys = raddbgic_sort_key_array(scratch.arena, line_keys, key_count); - - // TODO(allen): do a pass over sorted keys to make sure duplicate keys are sorted with - // null record first, and no more than one null record and one non-null record - - // arrange output - RADDBGI_U64 *arranged_voffs = raddbgic_push_array_no_zero(arena, RADDBGI_U64, key_count + 1); - RADDBGI_Line *arranged_lines = raddbgic_push_array_no_zero(arena, RADDBGI_Line, key_count); - - for(RADDBGI_U64 i = 0; i < key_count; i += 1){ - arranged_voffs[i] = sorted_line_keys[i].key; - } - arranged_voffs[key_count] = ~0ull; - for(RADDBGI_U64 i = 0; i < key_count; i += 1){ - RADDBGIC_LineRec *rec = (RADDBGIC_LineRec*)sorted_line_keys[i].val; - if(rec != 0){ - arranged_lines[i].file_idx = rec->file_id; - arranged_lines[i].line_num = rec->line_num; - } - else{ - arranged_lines[i].file_idx = 0; - arranged_lines[i].line_num = 0; - } - } - - RADDBGIC_UnitLinesCombined *result = raddbgic_push_array(arena, RADDBGIC_UnitLinesCombined, 1); - result->voffs = arranged_voffs; - result->lines = arranged_lines; - result->cols = 0; - result->line_count = key_count; - - scratch_end(scratch); - return result; -} - -//- rjf: per-src line info baking - -RADDBGI_PROC RADDBGIC_SrcLinesCombined* -raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *first) -{ - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - - // gather line number map - RADDBGIC_SrcLineMapBucket *first_bucket = 0; - RADDBGIC_SrcLineMapBucket *last_bucket = 0; - RADDBGI_U64 line_hash_slots_count = 1024; - RADDBGIC_SrcLineMapBucket **line_hash_slots = raddbgic_push_array(scratch.arena, RADDBGIC_SrcLineMapBucket *, line_hash_slots_count); - RADDBGI_U64 line_count = 0; - RADDBGI_U64 voff_count = 0; - RADDBGI_U64 max_line_num = 0; - { - for(RADDBGIC_LineMapFragment *map_fragment = first; - map_fragment != 0; - map_fragment = map_fragment->next) - { - RADDBGIC_LineSequence *sequence = &map_fragment->sequence->line_seq; - - RADDBGI_U64 *seq_voffs = sequence->voffs; - RADDBGI_U32 *seq_line_nums = sequence->line_nums; - RADDBGI_U64 seq_line_count = sequence->line_count; - for(RADDBGI_U64 i = 0; i < seq_line_count; i += 1){ - RADDBGI_U32 line_num = seq_line_nums[i]; - RADDBGI_U64 voff = seq_voffs[i]; - RADDBGI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; - - // update unique voff counter & max line number - voff_count += 1; - max_line_num = Max(max_line_num, line_num); - - // find match - RADDBGIC_SrcLineMapBucket *match = 0; - { - for(RADDBGIC_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; - node != 0; - node = node->hash_next){ - if(node->line_num == line_num){ - match = node; - break; - } - } - } - - // introduce new line if no match - if(match == 0){ - match = raddbgic_push_array(scratch.arena, RADDBGIC_SrcLineMapBucket, 1); - RADDBGIC_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); - RADDBGIC_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); - match->line_num = line_num; - line_count += 1; - } - - // insert new voff - { - RADDBGIC_SrcLineMapVoffBlock *block = raddbgic_push_array(scratch.arena, RADDBGIC_SrcLineMapVoffBlock, 1); - RADDBGIC_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); - match->voff_count += 1; - block->voff = voff; - } - } - } - } - - // bake sortable keys array - RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, line_count); - { - RADDBGIC_SortKey *key_ptr = keys; - for(RADDBGIC_SrcLineMapBucket *node = first_bucket; - node != 0; - node = node->order_next, key_ptr += 1){ - key_ptr->key = node->line_num; - key_ptr->val = node; - } - } - - // sort - RADDBGIC_SortKey *sorted_keys = raddbgic_sort_key_array(scratch.arena, keys, line_count); - - // bake result - RADDBGI_U32 *line_nums = raddbgic_push_array_no_zero(arena, RADDBGI_U32, line_count); - RADDBGI_U32 *line_ranges = raddbgic_push_array_no_zero(arena, RADDBGI_U32, line_count + 1); - RADDBGI_U64 *voffs = raddbgic_push_array_no_zero(arena, RADDBGI_U64, voff_count); - { - RADDBGI_U64 *voff_ptr = voffs; - for(RADDBGI_U32 i = 0; i < line_count; i += 1){ - line_nums[i] = sorted_keys[i].key; - line_ranges[i] = (RADDBGI_U32)(voff_ptr - voffs); - RADDBGIC_SrcLineMapBucket *bucket = (RADDBGIC_SrcLineMapBucket*)sorted_keys[i].val; - for(RADDBGIC_SrcLineMapVoffBlock *node = bucket->first_voff_block; - node != 0; - node = node->next){ - *voff_ptr = node->voff; - voff_ptr += 1; - } - } - line_ranges[line_count] = voff_count; - } - - RADDBGIC_SrcLinesCombined *result = raddbgic_push_array(arena, RADDBGIC_SrcLinesCombined, 1); - result->line_nums = line_nums; - result->line_ranges = line_ranges; - result->line_count = line_count; - result->voffs = voffs; - result->voff_count = voff_count; - - scratch_end(scratch); - return result; -} - -//- rjf: vmap baking -RADDBGI_PROC RADDBGIC_VMap* -raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, RADDBGI_U64 marker_count) -{ - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - - // sort markers - RADDBGIC_SortKey *sorted_keys = raddbgic_sort_key_array(scratch.arena, keys, marker_count); - - // determine if an extra vmap entry for zero is needed - RADDBGI_U32 extra_vmap_entry = 0; - if(marker_count > 0 && sorted_keys[0].key != 0){ - extra_vmap_entry = 1; - } - - // fill output vmap entries - RADDBGI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; - RADDBGI_VMapEntry *vmap = raddbgic_push_array_no_zero(arena, RADDBGI_VMapEntry, vmap_count_raw + 1); - RADDBGI_U32 vmap_entry_count_pass_1 = 0; - - { - RADDBGI_VMapEntry *vmap_ptr = vmap; - - if(extra_vmap_entry){ - vmap_ptr->voff = 0; - vmap_ptr->idx = 0; - vmap_ptr += 1; - } - - RADDBGIC_VMapRangeTracker *tracker_stack = 0; - RADDBGIC_VMapRangeTracker *tracker_free = 0; - - RADDBGIC_SortKey *key_ptr = sorted_keys; - RADDBGIC_SortKey *key_opl = sorted_keys + marker_count; - for(;key_ptr < key_opl;){ - // get initial map state from tracker stack - RADDBGI_U32 initial_idx = (RADDBGI_U32)0xffffffff; - if(tracker_stack != 0){ - initial_idx = tracker_stack->idx; - } - - // update tracker stack - // * we must process _all_ of the changes that apply at this voff before moving on - RADDBGI_U64 voff = key_ptr->key; - - for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ - RADDBGIC_VMapMarker *marker = (RADDBGIC_VMapMarker*)key_ptr->val; - RADDBGI_U32 idx = marker->idx; - - // push to stack - if(marker->begin_range){ - RADDBGIC_VMapRangeTracker *new_tracker = tracker_free; - if(new_tracker != 0){ - RADDBGIC_SLLStackPop(tracker_free); - } - else{ - new_tracker = raddbgic_push_array(scratch.arena, RADDBGIC_VMapRangeTracker, 1); - } - RADDBGIC_SLLStackPush(tracker_stack, new_tracker); - new_tracker->idx = idx; - } - - // pop matching node from stack (not always the top) - else{ - RADDBGIC_VMapRangeTracker **ptr_in = &tracker_stack; - RADDBGIC_VMapRangeTracker *match = 0; - for(RADDBGIC_VMapRangeTracker *node = tracker_stack; - node != 0;){ - if(node->idx == idx){ - match = node; - break; - } - ptr_in = &node->next; - node = node->next; - } - if(match != 0){ - *ptr_in = match->next; - RADDBGIC_SLLStackPush(tracker_free, match); - } - } - } - - // get final map state from tracker stack - RADDBGI_U32 final_idx = 0; - if(tracker_stack != 0){ - final_idx = tracker_stack->idx; - } - - // if final is different from initial - emit new vmap entry - if(final_idx != initial_idx){ - vmap_ptr->voff = voff; - vmap_ptr->idx = final_idx; - vmap_ptr += 1; - } - } - - vmap_entry_count_pass_1 = (RADDBGI_U32)(vmap_ptr - vmap); - } - - // replace zero unit indexes that follow a non-zero - // TODO(rjf): 0 *is* a real unit index right now - if(0) - { - // (the last entry is not replaced because it acts as a terminator) - RADDBGI_U32 last = vmap_entry_count_pass_1 - 1; - - RADDBGI_VMapEntry *vmap_ptr = vmap; - RADDBGI_U64 real_idx = 0; - - for(RADDBGI_U32 i = 0; i < last; i += 1, vmap_ptr += 1){ - // is this a zero after a real index? - if(vmap_ptr->idx == 0){ - vmap_ptr->idx = real_idx; - } - - // remember a real index - else{ - real_idx = vmap_ptr->idx; - } - } - } - - // combine duplicate neighbors - RADDBGI_U32 vmap_entry_count = 0; - { - RADDBGI_VMapEntry *vmap_ptr = vmap; - RADDBGI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; - RADDBGI_VMapEntry *vmap_out = vmap; - - for(;vmap_ptr < vmap_opl;){ - RADDBGI_VMapEntry *vmap_range_first = vmap_ptr; - RADDBGI_U64 idx = vmap_ptr->idx; - vmap_ptr += 1; - for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; - raddbgic_memcpy_struct(vmap_out, vmap_range_first); - vmap_out += 1; - } - - vmap_entry_count = (RADDBGI_U32)(vmap_out - vmap); - } - - // fill result - RADDBGIC_VMap *result = raddbgic_push_array(arena, RADDBGIC_VMap, 1); - result->vmap = vmap; - result->count = vmap_entry_count - 1; - - raddbgic_scratch_end(scratch); - - return result; -} - -RADDBGI_PROC RADDBGIC_VMap* -raddbgic_vmap_from_unit_ranges(RADDBGIC_Arena *arena, RADDBGIC_UnitVMapRange *first, RADDBGI_U64 count) -{ - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - - // count necessary markers - RADDBGI_U64 marker_count = count*2; - - // fill markers - RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); - RADDBGIC_VMapMarker *markers = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); - - { - RADDBGIC_SortKey *key_ptr = keys; - RADDBGIC_VMapMarker *marker_ptr = markers; - for(RADDBGIC_UnitVMapRange *range = first; - range != 0; - range = range->next){ - if(range->first < range->opl){ - RADDBGI_U32 unit_idx = range->unit->idx; - - key_ptr->key = range->first; - key_ptr->val = marker_ptr; - marker_ptr->idx = unit_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = range->opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = unit_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - } - - // construct vmap - RADDBGIC_VMap *result = raddbgic_vmap_from_markers(arena, markers, keys, marker_count); - raddbgic_scratch_end(scratch); - return result; -} - -//- rjf: type info baking - -RADDBGI_PROC RADDBGI_U32* -raddbgic_idx_run_from_types(RADDBGIC_Arena *arena, RADDBGIC_Type **types, RADDBGI_U32 count) -{ - RADDBGI_U32 *result = raddbgic_push_array(arena, RADDBGI_U32, count); - for(RADDBGI_U32 i = 0; i < count; i += 1){ - result[i] = types[i]->idx; - } - return result; -} - -RADDBGI_PROC RADDBGIC_TypeData* -raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) -{ - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - - // fill type nodes - RADDBGI_U32 type_count = root->type_count; - RADDBGI_TypeNode *type_nodes = raddbgic_push_array_no_zero(arena, RADDBGI_TypeNode, type_count); - - { - RADDBGI_TypeNode *ptr = type_nodes; - RADDBGI_TypeNode *opl = ptr + type_count; - RADDBGIC_Type *loose_type = root->first_type; - for(;loose_type != 0 && ptr < opl; - loose_type = loose_type->next_order, ptr += 1){ - - RADDBGI_TypeKind kind = loose_type->kind; - - // shared - ptr->kind = kind; - ptr->flags = loose_type->flags; - ptr->byte_size = loose_type->byte_size; - - // built-in - if(RADDBGI_TypeKind_FirstBuiltIn <= kind && kind <= RADDBGI_TypeKind_LastBuiltIn){ - ptr->built_in.name_string_idx = raddbgic_string(bctx, loose_type->name); - } - - // constructed - else if(RADDBGI_TypeKind_FirstConstructed <= kind && kind <= RADDBGI_TypeKind_LastConstructed){ - ptr->constructed.direct_type_idx = loose_type->direct_type->idx; - - switch (kind){ - case RADDBGI_TypeKind_Array: - { - ptr->constructed.count = loose_type->count; - }break; - - case RADDBGI_TypeKind_Function: - { - // parameters - RADDBGI_U32 count = loose_type->count; - RADDBGI_U32 *idx_run = raddbgic_idx_run_from_types(scratch.arena, loose_type->param_types, count); - ptr->constructed.param_idx_run_first = raddbgic_idx_run(bctx, idx_run, count); - ptr->constructed.count = count; - }break; - - case RADDBGI_TypeKind_Method: - { - // parameters - RADDBGI_U32 count = loose_type->count; - RADDBGI_U32 *idx_run = raddbgic_idx_run_from_types(scratch.arena, loose_type->param_types, count); - ptr->constructed.param_idx_run_first = raddbgic_idx_run(bctx, idx_run, count); - ptr->constructed.count = count; - }break; - } - } - - // user-defined - else if(RADDBGI_TypeKind_FirstUserDefined <= kind && kind <= RADDBGI_TypeKind_LastUserDefined){ - ptr->user_defined.name_string_idx = raddbgic_string(bctx, loose_type->name); - if(loose_type->udt != 0){ - ptr->user_defined.udt_idx = loose_type->udt->idx; - } - if(loose_type->direct_type != 0){ - ptr->user_defined.direct_type_idx = loose_type->direct_type->idx; - } - } - - // bitfield - else if(kind == RADDBGI_TypeKind_Bitfield){ - ptr->bitfield.off = loose_type->off; - ptr->bitfield.size = loose_type->count; - } - - raddbgic_scratch_end(scratch); - } - - // both iterators should end at the same time - raddbgic_assert(loose_type == 0); - raddbgic_assert(ptr == opl); - } - - - // fill udts - RADDBGI_U32 udt_count = root->type_udt_count; - RADDBGI_UDT *udts = raddbgic_push_array_no_zero(arena, RADDBGI_UDT, udt_count); - - RADDBGI_U32 member_count = root->total_member_count; - RADDBGI_Member *members = raddbgic_push_array_no_zero(arena, RADDBGI_Member, member_count); - - RADDBGI_U32 enum_member_count = root->total_enum_val_count; - RADDBGI_EnumMember *enum_members = raddbgic_push_array_no_zero(arena, RADDBGI_EnumMember, enum_member_count); - - { - RADDBGI_UDT *ptr = udts; - RADDBGI_UDT *opl = ptr + udt_count; - - RADDBGI_Member *member_ptr = members; - RADDBGI_Member *member_opl = members + member_count; - - RADDBGI_EnumMember *enum_member_ptr = enum_members; - RADDBGI_EnumMember *enum_member_opl = enum_members + enum_member_count; - - RADDBGIC_TypeUDT *loose_udt = root->first_udt; - for(;loose_udt != 0 && ptr < opl; - loose_udt = loose_udt->next_order, ptr += 1){ - ptr->self_type_idx = loose_udt->self_type->idx; - - raddbgic_assert(loose_udt->member_count == 0 || - loose_udt->enum_val_count == 0); - - // enum members - if(loose_udt->enum_val_count != 0){ - ptr->flags |= RADDBGI_UserDefinedTypeFlag_EnumMembers; - - ptr->member_first = (RADDBGI_U32)(enum_member_ptr - enum_members); - ptr->member_count = loose_udt->enum_val_count; - - RADDBGI_U32 local_enum_val_count = loose_udt->enum_val_count; - RADDBGIC_TypeEnumVal *loose_enum_val = loose_udt->first_enum_val; - for(RADDBGI_U32 i = 0; - i < local_enum_val_count; - i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ - enum_member_ptr->name_string_idx = raddbgic_string(bctx, loose_enum_val->name); - enum_member_ptr->val = loose_enum_val->val; - } - } - - // struct/class/union members - else{ - ptr->member_first = (RADDBGI_U32)(member_ptr - members); - ptr->member_count = loose_udt->member_count; - - RADDBGI_U32 local_member_count = loose_udt->member_count; - RADDBGIC_TypeMember *loose_member = loose_udt->first_member; - for(RADDBGI_U32 i = 0; - i < local_member_count; - i += 1, member_ptr += 1, loose_member = loose_member->next){ - member_ptr->kind = loose_member->kind; - // TODO(allen): member_ptr->visibility = ; - member_ptr->name_string_idx = raddbgic_string(bctx, loose_member->name); - member_ptr->off = loose_member->off; - member_ptr->type_idx = loose_member->type->idx; - - // TODO(allen): - if(loose_member->kind == RADDBGI_MemberKind_Method){ - //loose_member_ptr->unit_idx = ; - //loose_member_ptr->proc_symbol_idx = ; - } - } - - } - - RADDBGI_U32 file_idx = 0; - if(loose_udt->source_path.size > 0){ - RADDBGIC_PathNode *path_node = raddbgic_paths_node_from_path(bctx, loose_udt->source_path); - RADDBGIC_SrcNode *src_node = raddbgic_paths_src_node_from_path_node(bctx, path_node); - file_idx = src_node->idx; - } - - ptr->file_idx = file_idx; - ptr->line = loose_udt->line; - ptr->col = loose_udt->col; - } - - // all iterators should end at the same time - raddbgic_assert(loose_udt == 0); - raddbgic_assert(ptr == opl); - raddbgic_assert(member_ptr == member_opl); - raddbgic_assert(enum_member_ptr == enum_member_opl); - } - - - // fill result - RADDBGIC_TypeData *result = raddbgic_push_array(arena, RADDBGIC_TypeData, 1); - result->type_nodes = type_nodes; - result->type_node_count = type_count; - result->udts = udts; - result->udt_count = udt_count; - result->members = members; - result->member_count = member_count; - result->enum_members = enum_members; - result->enum_member_count = enum_member_count; - - raddbgic_scratch_end(scratch); - return result; -} - -//- rjf: symbol data baking - -RADDBGI_PROC RADDBGIC_SymbolData* -raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx) -{ - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - - // count symbol kinds - RADDBGI_U32 globalvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_GlobalVariable]; - RADDBGI_U32 threadvar_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_ThreadVariable]; - RADDBGI_U32 procedure_count = 1 + root->symbol_kind_counts[RADDBGIC_SymbolKind_Procedure]; - - // allocate symbol arrays - RADDBGI_GlobalVariable *global_variables = - raddbgic_push_array(arena, RADDBGI_GlobalVariable, globalvar_count); - - RADDBGI_ThreadVariable *thread_variables = - raddbgic_push_array(arena, RADDBGI_ThreadVariable, threadvar_count); - - RADDBGI_Procedure *procedures = raddbgic_push_array(arena, RADDBGI_Procedure, procedure_count); - - // fill symbol arrays - { - RADDBGI_GlobalVariable *global_ptr = global_variables; - RADDBGI_ThreadVariable *thread_local_ptr = thread_variables; - RADDBGI_Procedure *procedure_ptr = procedures; - - // nils - global_ptr += 1; - thread_local_ptr += 1; - procedure_ptr += 1; - - // symbol nodes - for(RADDBGIC_Symbol *node = root->first_symbol; - node != 0; - node = node->next_order){ - RADDBGI_U32 name_string_idx = raddbgic_string(bctx, node->name); - RADDBGI_U32 link_name_string_idx = raddbgic_string(bctx, node->link_name); - RADDBGI_U32 type_idx = node->type->idx; - - RADDBGI_LinkFlags link_flags = 0; - RADDBGI_U32 container_idx = 0; - { - if(node->is_extern){ - link_flags |= RADDBGI_LinkFlag_External; - } - if(node->container_symbol != 0){ - container_idx = node->container_symbol->idx; - link_flags |= RADDBGI_LinkFlag_ProcScoped; - } - else if(node->container_type != 0 && node->container_type->udt != 0){ - container_idx = node->container_type->udt->idx; - link_flags |= RADDBGI_LinkFlag_TypeScoped; - } - } - - switch (node->kind){ - default:{}break; - - case RADDBGIC_SymbolKind_GlobalVariable: - { - global_ptr->name_string_idx = name_string_idx; - global_ptr->link_flags = link_flags; - global_ptr->voff = node->offset; - global_ptr->type_idx = type_idx; - global_ptr->container_idx = container_idx; - global_ptr += 1; - }break; - - case RADDBGIC_SymbolKind_ThreadVariable: - { - thread_local_ptr->name_string_idx = name_string_idx; - thread_local_ptr->link_flags = link_flags; - thread_local_ptr->tls_off = (RADDBGI_U32)node->offset; - thread_local_ptr->type_idx = type_idx; - thread_local_ptr->container_idx = container_idx; - thread_local_ptr += 1; - }break; - - case RADDBGIC_SymbolKind_Procedure: - { - procedure_ptr->name_string_idx = name_string_idx; - procedure_ptr->link_name_string_idx = link_name_string_idx; - procedure_ptr->link_flags = link_flags; - procedure_ptr->type_idx = type_idx; - procedure_ptr->root_scope_idx = node->root_scope->idx; - procedure_ptr->container_idx = container_idx; - procedure_ptr += 1; - }break; - } - } - - raddbgic_assert(global_ptr - global_variables == globalvar_count); - raddbgic_assert(thread_local_ptr - thread_variables == threadvar_count); - raddbgic_assert(procedure_ptr - procedures == procedure_count); - } - - // global vmap - RADDBGIC_VMap *global_vmap = 0; - { - // count necessary markers - RADDBGI_U32 marker_count = globalvar_count*2; - - // fill markers - RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); - RADDBGIC_VMapMarker *markers = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); - - RADDBGIC_SortKey *key_ptr = keys; - RADDBGIC_VMapMarker *marker_ptr = markers; - - // real globals - for(RADDBGIC_Symbol *node = root->first_symbol; - node != 0; - node = node->next_order){ - if(node->kind == RADDBGIC_SymbolKind_GlobalVariable){ - RADDBGI_U32 global_idx = node->idx; - - RADDBGI_U64 first = node->offset; - RADDBGI_U64 opl = first + node->type->byte_size; - - key_ptr->key = first; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - - // nil global - { - RADDBGI_U32 global_idx = 0; - - RADDBGI_U64 first = 0; - RADDBGI_U64 opl = (RADDBGI_U64)0xffffffffffffffffull; - - key_ptr->key = first; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - - // assert we filled all the markers - raddbgic_assert(key_ptr - keys == marker_count && - marker_ptr - markers == marker_count); - - // construct vmap - global_vmap = raddbgic_vmap_from_markers(arena, markers, keys, marker_count); - } - - // allocate scope array - - // (assert there is a nil scope) - raddbgic_assert(root->first_scope != 0 && - root->first_scope->symbol == 0 && - root->first_scope->first_child == 0 && - root->first_scope->next_sibling == 0 && - root->first_scope->range_count == 0); - - RADDBGI_U32 scope_count = root->scope_count; - RADDBGI_Scope *scopes = raddbgic_push_array(arena, RADDBGI_Scope, scope_count); - - RADDBGI_U32 scope_voff_count = root->scope_voff_count; - RADDBGI_U64 *scope_voffs = raddbgic_push_array(arena, RADDBGI_U64, scope_voff_count); - - RADDBGI_U32 local_count = root->local_count; - RADDBGI_Local *locals = raddbgic_push_array(arena, RADDBGI_Local, local_count); - - RADDBGI_U32 location_block_count = root->location_count; - RADDBGI_LocationBlock *location_blocks = - raddbgic_push_array(arena, RADDBGI_LocationBlock, location_block_count); - - RADDBGIC_String8List location_data = {0}; - - // iterate scopes, locals, and locations - // fill scope voffs, locals, and location information - { - RADDBGI_Scope *scope_ptr = scopes; - RADDBGI_U64 *scope_voff_ptr = scope_voffs; - RADDBGI_Local *local_ptr = locals; - RADDBGI_LocationBlock *location_block_ptr = location_blocks; - - for(RADDBGIC_Scope *node = root->first_scope; - node != 0; - node = node->next_order, scope_ptr += 1){ - - // emit voffs - RADDBGI_U32 voff_first = (RADDBGI_U32)(scope_voff_ptr - scope_voffs); - for(RADDBGIC_VOffRange *range = node->first_range; - range != 0; - range = range->next){ - *scope_voff_ptr = range->voff_first; - scope_voff_ptr += 1; - *scope_voff_ptr = range->voff_opl; - scope_voff_ptr += 1; - } - RADDBGI_U32 voff_opl = (RADDBGI_U32)(scope_voff_ptr - scope_voffs); - - // emit locals - RADDBGI_U32 scope_local_count = node->local_count; - RADDBGI_U32 scope_local_first = (RADDBGI_U32)(local_ptr - locals); - for(RADDBGIC_Local *slocal = node->first_local; - slocal != 0; - slocal = slocal->next, local_ptr += 1){ - local_ptr->kind = slocal->kind; - local_ptr->name_string_idx = raddbgic_string(bctx, slocal->name); - local_ptr->type_idx = slocal->type->idx; - - RADDBGIC_LocationSet *locset = slocal->locset; - if(locset != 0){ - RADDBGI_U32 location_first = (RADDBGI_U32)(location_block_ptr - location_blocks); - RADDBGI_U32 location_opl = location_first + locset->location_case_count; - local_ptr->location_first = location_first; - local_ptr->location_opl = location_opl; - - for(RADDBGIC_LocationCase *location_case = locset->first_location_case; - location_case != 0; - location_case = location_case->next){ - location_block_ptr->scope_off_first = location_case->voff_first; - location_block_ptr->scope_off_opl = location_case->voff_opl; - location_block_ptr->location_data_off = location_data.total_size; - location_block_ptr += 1; - - RADDBGIC_Location *location = location_case->location; - if(location == 0){ - RADDBGI_U64 data = 0; - str8_serial_push_align(scratch.arena, &location_data, 8); - str8_serial_push_data(scratch.arena, &location_data, &data, 1); - } - else{ - switch (location->kind){ - default: - { - RADDBGI_U64 data = 0; - str8_serial_push_align(scratch.arena, &location_data, 8); - str8_serial_push_data(scratch.arena, &location_data, &data, 1); - }break; - - case RADDBGI_LocationKind_AddrBytecodeStream: - case RADDBGI_LocationKind_ValBytecodeStream: - { - raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, raddbgic_str8_struct(&location->kind))); - for(RADDBGIC_EvalBytecodeOp *op_node = location->bytecode.first_op; - op_node != 0; - op_node = op_node->next){ - RADDBGI_U8 op_data[9]; - op_data[0] = op_node->op; - raddbgic_memcpy(op_data + 1, &op_node->p, op_node->p_size); - RADDBGIC_String8 op_data_str = raddbgic_str8(op_data, 1 + op_node->p_size); - raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, op_data_str)); - } - { - RADDBGI_U64 data = 0; - RADDBGIC_String8 data_str = raddbgic_str8((RADDBGI_U8 *)&data, 1); - raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, data_str)); - } - }break; - - case RADDBGI_LocationKind_AddrRegisterPlusU16: - case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: - { - RADDBGI_LocationRegisterPlusU16 loc = {0}; - loc.kind = location->kind; - loc.register_code = location->register_code; - loc.offset = location->offset; - raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, raddbgic_str8_struct(&loc))); - }break; - - case RADDBGI_LocationKind_ValRegister: - { - RADDBGI_LocationRegister loc = {0}; - loc.kind = location->kind; - loc.register_code = location->register_code; - raddbgic_str8_list_push(scratch.arena, &location_data, raddbgic_str8_copy(scratch.arena, raddbgic_str8_struct(&loc))); - }break; - } - } - } - - raddbgic_assert(location_block_ptr - location_blocks == location_opl); - } - } - - raddbgic_assert(local_ptr - locals == scope_local_first + scope_local_count); - - // emit scope - scope_ptr->proc_idx = (node->symbol == 0)?0:node->symbol->idx; - scope_ptr->parent_scope_idx = (node->parent_scope == 0)?0:node->parent_scope->idx; - scope_ptr->first_child_scope_idx = (node->first_child == 0)?0:node->first_child->idx; - scope_ptr->next_sibling_scope_idx = (node->next_sibling == 0)?0:node->next_sibling->idx; - scope_ptr->voff_range_first = voff_first; - scope_ptr->voff_range_opl = voff_opl; - scope_ptr->local_first = scope_local_first; - scope_ptr->local_count = scope_local_count; - - // TODO(allen): - //scope_ptr->static_local_idx_run_first = ; - //scope_ptr->static_local_count = ; - } - - raddbgic_assert(scope_ptr - scopes == scope_count); - raddbgic_assert(local_ptr - locals == local_count); - } - - // flatten location data - RADDBGIC_String8 location_data_str = raddbgic_str8_list_join(arena, &location_data, raddbgic_str8_lit("")); - - // scope vmap - RADDBGIC_VMap *scope_vmap = 0; - { - // count necessary markers - RADDBGI_U32 marker_count = scope_voff_count; - - // fill markers - RADDBGIC_SortKey *keys = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_SortKey, marker_count); - RADDBGIC_VMapMarker *markers = raddbgic_push_array_no_zero(scratch.arena, RADDBGIC_VMapMarker, marker_count); - - RADDBGIC_SortKey *key_ptr = keys; - RADDBGIC_VMapMarker *marker_ptr = markers; - - for(RADDBGIC_Scope *node = root->first_scope; - node != 0; - node = node->next_order){ - RADDBGI_U32 scope_idx = node->idx; - - for(RADDBGIC_VOffRange *range = node->first_range; - range != 0; - range = range->next){ - key_ptr->key = range->voff_first; - key_ptr->val = marker_ptr; - marker_ptr->idx = scope_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = range->voff_opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = scope_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - - scope_vmap = raddbgic_vmap_from_markers(arena, markers, keys, marker_count); - } - - // fill result - RADDBGIC_SymbolData *result = raddbgic_push_array(arena, RADDBGIC_SymbolData, 1); - result->global_variables = global_variables; - result->global_variable_count = globalvar_count; - result->global_vmap = global_vmap; - result->thread_variables = thread_variables; - result->thread_variable_count = threadvar_count; - result->procedures = procedures; - result->procedure_count = procedure_count; - result->scopes = scopes; - result->scope_count = scope_count; - result->scope_voffs = scope_voffs; - result->scope_voff_count = scope_voff_count; - result->scope_vmap = scope_vmap; - result->locals = locals; - result->local_count = local_count; - result->location_blocks = location_blocks; - result->location_block_count = location_block_count; - result->location_data = location_data_str.str; - result->location_data_size = location_data_str.size; - - raddbgic_scratch_end(scratch); - return result; -} - -//- rjf: name map baking - -RADDBGI_PROC RADDBGIC_NameMapBaked* -raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map) -{ - RADDBGIC_Temp scratch = raddbgic_scratch_begin(&arena, 1); - - RADDBGI_U32 bucket_count = map->name_count; - RADDBGI_U32 node_count = map->name_count; - - // setup the final bucket layouts - RADDBGIC_NameMapSemiBucket *sbuckets = raddbgic_push_array(scratch.arena, RADDBGIC_NameMapSemiBucket, bucket_count); - for(RADDBGIC_NameMapNode *node = map->first; - node != 0; - node = node->order_next){ - RADDBGI_U64 hash = raddbgi_hash(node->string.str, node->string.size); - RADDBGI_U64 bi = hash%bucket_count; - RADDBGIC_NameMapSemiNode *snode = raddbgic_push_array(scratch.arena, RADDBGIC_NameMapSemiNode, 1); - SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); - snode->node = node; - sbuckets[bi].count += 1; - } - - // allocate tables - RADDBGI_NameMapBucket *buckets = raddbgic_push_array(arena, RADDBGI_NameMapBucket, bucket_count); - RADDBGI_NameMapNode *nodes = raddbgic_push_array_no_zero(arena, RADDBGI_NameMapNode, node_count); - - // convert to serialized buckets & nodes - { - RADDBGI_NameMapBucket *bucket_ptr = buckets; - RADDBGI_NameMapNode *node_ptr = nodes; - for(RADDBGI_U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ - bucket_ptr->first_node = (RADDBGI_U32)(node_ptr - nodes); - bucket_ptr->node_count = sbuckets[i].count; - - for(RADDBGIC_NameMapSemiNode *snode = sbuckets[i].first; - snode != 0; - snode = snode->next){ - RADDBGIC_NameMapNode *node = snode->node; - - // cons name and index(es) - RADDBGI_U32 string_idx = raddbgic_string(bctx, node->string); - RADDBGI_U32 match_count = node->idx_count; - RADDBGI_U32 idx = 0; - if(match_count == 1){ - idx = node->idx_first->idx[0]; - } - else{ - RADDBGI_U64 temp_pos = raddbgic_arena_pos(scratch.arena); - RADDBGI_U32 *idx_run = raddbgic_push_array_no_zero(scratch.arena, RADDBGI_U32, match_count); - RADDBGI_U32 *idx_ptr = idx_run; - for(RADDBGIC_NameMapIdxNode *idxnode = node->idx_first; - idxnode != 0; - idxnode = idxnode->next){ - for(RADDBGI_U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ - if(idxnode->idx[i] == 0){ - goto dblbreak; - } - *idx_ptr = idxnode->idx[i]; - idx_ptr += 1; - } - } - dblbreak:; - raddbgic_assert(idx_ptr == idx_run + match_count); - idx = raddbgic_idx_run(bctx, idx_run, match_count); - raddbgic_arena_pop_to(scratch.arena, temp_pos); - } - - // write to node - node_ptr->string_idx = string_idx; - node_ptr->match_count = match_count; - node_ptr->match_idx_or_idx_run_first = idx; - node_ptr += 1; - } - } - raddbgic_assert(node_ptr - nodes == node_count); - } - - raddbgic_scratch_end(scratch); - - RADDBGIC_NameMapBaked *result = raddbgic_push_array(arena, RADDBGIC_NameMapBaked, 1); - result->buckets = buckets; - result->nodes = nodes; - result->bucket_count = bucket_count; - result->node_count = node_count; - return result; -} - -//- rjf: top-level baking entry point - -RADDBGI_PROC void -raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8List *out) -{ - str8_serial_begin(arena, out); - - // setup cons helpers - RADDBGIC_DSections dss = {0}; - raddbgic_dsection(arena, &dss, 0, 0, RADDBGI_DataSectionTag_NULL); - - RADDBGIC_BakeParams bctx_params = {0}; - { - bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); - bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); - } - RADDBGIC_BakeCtx *bctx = raddbgic_bake_ctx_begin(&bctx_params); - - //////////////////////////////// - // MAIN PART: allocating and filling out sections of the file - - // top level info - RADDBGI_TopLevelInfo *tli = raddbgic_push_array(arena, RADDBGI_TopLevelInfo, 1); - { - RADDBGIC_TopLevelInfo *raddbgic_tli = &root->top_level_info; - tli->architecture = raddbgic_tli->architecture; - tli->exe_name_string_idx = raddbgic_string(bctx, raddbgic_tli->exe_name); - tli->exe_hash = raddbgic_tli->exe_hash; - tli->voff_max = raddbgic_tli->voff_max; - } - raddbgic_dsection(arena, &dss, tli, sizeof(*tli), RADDBGI_DataSectionTag_TopLevelInfo); - - // binary sections array - { - RADDBGI_U32 count = root->binary_section_count; - RADDBGI_BinarySection *sections = raddbgic_push_array(arena, RADDBGI_BinarySection, count); - RADDBGI_BinarySection *dsec = sections; - for(RADDBGIC_BinarySection *ssec = root->binary_section_first; - ssec != 0; - ssec = ssec->next, dsec += 1){ - dsec->name_string_idx = raddbgic_string(bctx, ssec->name); - dsec->flags = ssec->flags; - dsec->voff_first = ssec->voff_first; - dsec->voff_opl = ssec->voff_opl; - dsec->foff_first = ssec->foff_first; - dsec->foff_opl = ssec->foff_opl; - } - raddbgic_dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBGI_DataSectionTag_BinarySections); - } - - // units array - // * pass for per-unit information including: - // * top-level unit information - // * combining line info for whole unit - { - RADDBGI_U32 count = root->unit_count; - RADDBGI_Unit *units = raddbgic_push_array(arena, RADDBGI_Unit, count); - RADDBGI_Unit *dunit = units; - for(RADDBGIC_Unit *sunit = root->unit_first; - sunit != 0; - sunit = sunit->next_order, dunit += 1){ - // strings & paths - RADDBGI_U32 unit_name = raddbgic_string(bctx, sunit->unit_name); - RADDBGI_U32 cmp_name = raddbgic_string(bctx, sunit->compiler_name); - - RADDBGI_U32 src_path = raddbgic_paths_idx_from_path(bctx, sunit->source_file); - RADDBGI_U32 obj_path = raddbgic_paths_idx_from_path(bctx, sunit->object_file); - RADDBGI_U32 archive_path = raddbgic_paths_idx_from_path(bctx, sunit->archive_file); - RADDBGI_U32 build_path = raddbgic_paths_idx_from_path(bctx, sunit->build_path); - - dunit->unit_name_string_idx = unit_name; - dunit->compiler_name_string_idx = cmp_name; - dunit->source_file_path_node = src_path; - dunit->object_file_path_node = obj_path; - dunit->archive_file_path_node = archive_path; - dunit->build_path_node = build_path; - dunit->language = sunit->language; - - // line info (voff -> file*line*col) - RADDBGIC_LineSequenceNode *first_seq = sunit->line_seq_first; - RADDBGIC_UnitLinesCombined *lines = raddbgic_unit_combine_lines(arena, bctx, first_seq); - - RADDBGI_U32 line_count = lines->line_count; - if(line_count > 0){ - dunit->line_info_voffs_data_idx = - raddbgic_dsection(arena, &dss, lines->voffs, sizeof(RADDBGI_U64)*(line_count + 1), - RADDBGI_DataSectionTag_LineInfoVoffs); - dunit->line_info_data_idx = - raddbgic_dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, - RADDBGI_DataSectionTag_LineInfoData); - if(lines->cols != 0){ - dunit->line_info_col_data_idx = - raddbgic_dsection(arena, &dss, lines->cols, sizeof(RADDBGI_Column)*line_count, - RADDBGI_DataSectionTag_LineInfoColumns); - } - dunit->line_info_count = line_count; - } - } - - raddbgic_dsection(arena, &dss, units, sizeof(*units)*count, RADDBGI_DataSectionTag_Units); - } - - // source file line info baking - // * pass for "source_combine_line" for each source file - - // * can only be run after a pass that does "unit_combine_lines" for each unit. - for(RADDBGIC_SrcNode *src_node = bctx->tree->src_first; - src_node != 0; - src_node = src_node->next){ - RADDBGIC_LineMapFragment *first_fragment = src_node->first_fragment; - RADDBGIC_SrcLinesCombined *lines = raddbgic_source_combine_lines(arena, first_fragment); - RADDBGI_U32 line_count = lines->line_count; - - if(line_count > 0){ - src_node->line_map_count = line_count; - - src_node->line_map_nums_data_idx = - raddbgic_dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, - RADDBGI_DataSectionTag_LineMapNumbers); - - src_node->line_map_range_data_idx = - raddbgic_dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), - RADDBGI_DataSectionTag_LineMapRanges); - - src_node->line_map_voff_data_idx = - raddbgic_dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, - RADDBGI_DataSectionTag_LineMapVoffs); - } - } - - // source file name mapping - { - RADDBGIC_NameMap* map = raddbgic_name_map_for_kind(root, RADDBGI_NameMapKind_NormalSourcePaths); - for(RADDBGIC_SrcNode *src_node = bctx->tree->src_first; - src_node != 0; - src_node = src_node->next){ - if(src_node->idx != 0){ - raddbgic_name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); - } - } - } - - // unit vmap baking - { - RADDBGIC_VMap *vmap = raddbgic_vmap_from_unit_ranges(arena, - root->unit_vmap_range_first, - root->unit_vmap_range_count); - - RADDBGI_U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); - raddbgic_dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); - } - - // type info baking - { - RADDBGIC_TypeData *types = raddbgic_type_data_combine(arena, root, bctx); - - RADDBGI_U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; - raddbgic_dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); - - RADDBGI_U64 udt_size = sizeof(*types->udts)*types->udt_count; - raddbgic_dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); - - RADDBGI_U64 member_size = sizeof(*types->members)*types->member_count; - raddbgic_dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); - - RADDBGI_U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; - raddbgic_dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); - } - - // symbol info baking - { - RADDBGIC_SymbolData *symbol_data = raddbgic_symbol_data_combine(arena, root, bctx); - - RADDBGI_U64 global_variables_size = - sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; - raddbgic_dsection(arena, &dss, symbol_data->global_variables, global_variables_size, - RADDBGI_DataSectionTag_GlobalVariables); - - RADDBGIC_VMap *global_vmap = symbol_data->global_vmap; - RADDBGI_U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); - raddbgic_dsection(arena, &dss, global_vmap->vmap, global_vmap_size, - RADDBGI_DataSectionTag_GlobalVmap); - - RADDBGI_U64 thread_variables_size = - sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; - raddbgic_dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, - RADDBGI_DataSectionTag_ThreadVariables); - - RADDBGI_U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; - raddbgic_dsection(arena, &dss, symbol_data->procedures, procedures_size, - RADDBGI_DataSectionTag_Procedures); - - RADDBGI_U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; - raddbgic_dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); - - RADDBGI_U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; - raddbgic_dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, - RADDBGI_DataSectionTag_ScopeVoffData); - - RADDBGIC_VMap *scope_vmap = symbol_data->scope_vmap; - RADDBGI_U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); - raddbgic_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); - - RADDBGI_U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; - raddbgic_dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); - - RADDBGI_U64 location_blocks_size = - sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; - raddbgic_dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, - RADDBGI_DataSectionTag_LocationBlocks); - - RADDBGI_U64 location_data_size = symbol_data->location_data_size; - raddbgic_dsection(arena, &dss, symbol_data->location_data, location_data_size, - RADDBGI_DataSectionTag_LocationData); - } - - // name map baking - { - RADDBGI_U32 name_map_count = 0; - for(RADDBGI_U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ - if(root->name_maps[i] != 0){ - name_map_count += 1; - } - } - - RADDBGI_NameMap *name_maps = raddbgic_push_array(arena, RADDBGI_NameMap, name_map_count); - - RADDBGI_NameMap *name_map_ptr = name_maps; - for(RADDBGI_U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ - RADDBGIC_NameMap *map = root->name_maps[i]; - if(map != 0){ - RADDBGIC_NameMapBaked *baked = raddbgic_name_map_bake(arena, root, bctx, map); - - name_map_ptr->kind = i; - name_map_ptr->bucket_data_idx = - raddbgic_dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, - RADDBGI_DataSectionTag_NameMapBuckets); - name_map_ptr->node_data_idx = - raddbgic_dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, - RADDBGI_DataSectionTag_NameMapNodes); - name_map_ptr += 1; - } - } - - raddbgic_dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, - RADDBGI_DataSectionTag_NameMaps); - } - - //////////////////////////////// - // LATE PART: baking loose structures and creating final layout - - // generate data sections for file paths - { - RADDBGI_U32 count = bctx->tree->count; - RADDBGI_FilePathNode *nodes = raddbgic_push_array(arena, RADDBGI_FilePathNode, count); - - RADDBGI_FilePathNode *out_node = nodes; - for(RADDBGIC_PathNode *node = bctx->tree->first; - node != 0; - node = node->next_order, out_node += 1){ - out_node->name_string_idx = raddbgic_string(bctx, node->name); - if(node->parent != 0){ - out_node->parent_path_node = node->parent->idx; - } - if(node->first_child != 0){ - out_node->first_child = node->first_child->idx; - } - if(node->next_sibling != 0){ - out_node->next_sibling = node->next_sibling->idx; - } - if(node->src_file != 0){ - out_node->source_file_idx = node->src_file->idx; - } - } - - raddbgic_dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBGI_DataSectionTag_FilePathNodes); - } - - // generate data sections for files - { - RADDBGI_U32 count = bctx->tree->src_count; - RADDBGI_SourceFile *src_files = raddbgic_push_array(arena, RADDBGI_SourceFile, count); - - RADDBGI_SourceFile *out_src_file = src_files; - for(RADDBGIC_SrcNode *node = bctx->tree->src_first; - node != 0; - node = node->next, out_src_file += 1){ - out_src_file->file_path_node_idx = node->path_node->idx; - out_src_file->normal_full_path_string_idx = raddbgic_string(bctx, node->normal_full_path); - out_src_file->line_map_nums_data_idx = node->line_map_nums_data_idx; - out_src_file->line_map_range_data_idx = node->line_map_range_data_idx; - out_src_file->line_map_count = node->line_map_count; - out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; - } - - raddbgic_dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBGI_DataSectionTag_SourceFiles); - } - - // generate data sections for strings - { - RADDBGI_U32 *str_offs = raddbgic_push_array_no_zero(arena, RADDBGI_U32, bctx->strs.count + 1); - - RADDBGI_U32 off_cursor = 0; - { - RADDBGI_U32 *off_ptr = str_offs; - *off_ptr = 0; - off_ptr += 1; - for(RADDBGIC_StringNode *node = bctx->strs.order_first; - node != 0; - node = node->order_next){ - off_cursor += node->str.size; - *off_ptr = off_cursor; - off_ptr += 1; - } - } - - RADDBGI_U8 *buf = raddbgic_push_array(arena, RADDBGI_U8, off_cursor); - { - RADDBGI_U8 *ptr = buf; - for(RADDBGIC_StringNode *node = bctx->strs.order_first; - node != 0; - node = node->order_next){ - raddbgic_memcpy(ptr, node->str.str, node->str.size); - ptr += node->str.size; - } - } - - raddbgic_dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), - RADDBGI_DataSectionTag_StringTable); - raddbgic_dsection(arena, &dss, buf, off_cursor, RADDBGI_DataSectionTag_StringData); - } - - // generate data sections for index runs - { - RADDBGI_U32 *idx_data = raddbgic_push_array_no_zero(arena, RADDBGI_U32, bctx->idxs.idx_count); - - { - RADDBGI_U32 *out_ptr = idx_data; - RADDBGI_U32 *opl = out_ptr + bctx->idxs.idx_count; - RADDBGIC_IdxRunNode *node = bctx->idxs.order_first; - for(;node != 0 && out_ptr < opl; - node = node->order_next){ - raddbgic_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); - out_ptr += node->count; - } - raddbgic_assert(out_ptr == opl); - } - - raddbgic_dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, - RADDBGI_DataSectionTag_IndexRuns); - } - - // layout - // * the header and data section table have to be initialized "out of order" - // * so that the rest of the system can avoid this tricky order-layout interdependence stuff - RADDBGI_Header *header = raddbgic_push_array(arena, RADDBGI_Header, 1); - RADDBGI_DataSection *dstable = raddbgic_push_array(arena, RADDBGI_DataSection, dss.count); - str8_serial_push_align(arena, out, 8); - RADDBGI_U64 header_off = out->total_size; - str8_list_push(arena, out, str8_struct(header)); - str8_serial_push_align(arena, out, 8); - RADDBGI_U64 data_section_off = out->total_size; - str8_list_push(arena, out, str8((RADDBGI_U8 *)dstable, sizeof(*dstable)*dss.count)); - { - header->magic = RADDBGI_MAGIC_CONSTANT; - header->encoding_version = RADDBGI_ENCODING_VERSION; - header->data_section_off = data_section_off; - header->data_section_count = dss.count; - } - { - RADDBGI_U64 test_dss_count = 0; - for(RADDBGIC_DSectionNode *node = dss.first; - node != 0; - node = node->next){ - test_dss_count += 1; - } - raddbgic_assert(test_dss_count == dss.count); - - RADDBGI_DataSection *ptr = dstable; - for(RADDBGIC_DSectionNode *node = dss.first; - node != 0; - node = node->next, ptr += 1){ - RADDBGI_U64 data_section_offset = 0; - if(node->size != 0) - { - str8_serial_push_align(arena, out, 8); - data_section_offset = out->total_size; - str8_list_push(arena, out, str8((RADDBGI_U8 *)node->data, node->size)); - } - ptr->tag = node->tag; - ptr->encoding = RADDBGI_DataSectionEncoding_Unpacked; - ptr->off = data_section_offset; - ptr->encoded_size = node->size; - ptr->unpacked_size = node->size; - } - raddbgic_assert(ptr == dstable + dss.count); - } - - raddbgic_bake_ctx_release(bctx); -} diff --git a/src/lib_raddbgi_cons/raddbgi_cons.h b/src/lib_raddbgi_cons/raddbgi_cons.h deleted file mode 100644 index 5c35fe62..00000000 --- a/src/lib_raddbgi_cons/raddbgi_cons.h +++ /dev/null @@ -1,1303 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RADDBGI_CONS_H -#define RADDBGI_CONS_H - -//////////////////////////////// -//~ rjf: Overrideable Memory Operations - -// To override the slow/default memset implementation used by the library, -// do the following: -// -// #define RADDBGIC_MEMSET_OVERRIDE -// #define raddbgic_memset - -#if !defined(raddbgic_memset) -# define raddbgic_memset raddbgic_memset_fallback -#endif - -// To override the slow/default memcpy implementation used by the library, -// do the following: -// -// #define RADDBGIC_MEMCPY_OVERRIDE -// #define raddbgic_memcpy - -#if !defined(raddbgic_memset) -# define raddbgic_memset raddbgic_memset_fallback -#endif - -#if !defined(raddbgic_memcpy) -# define raddbgic_memcpy raddbgic_memcpy_fallback -#endif - -//////////////////////////////// -//~ rjf: Overrideable sprintf Functions - -#if !defined(raddbgic_vsnprintf) -# include -# define raddbgic_vsnprintf vsnprintf -#endif - -//////////////////////////////// -//~ rjf: Overrideable String View Types - -// To override the string view type used by the library, do the following: -// -// #define RADDBGIC_STRING8_OVERRIDE -// #define RADDBGIC_String8 -// #define RADDBGIC_String8_BaseMember -// #define RADDBGIC_String8_SizeMember - -// To override the string view list type used by the library, do the following: -// -// #define RADDBGIC_STRING8LIST_OVERRIDE -// #define RADDBGIC_String8Node -// #define RADDBGIC_String8_NextPtrMember -// #define RADDBGIC_String8_StringMember -// #define RADDBGIC_String8List -// #define RADDBGIC_String8_FirstMember -// #define RADDBGIC_String8_LastMember -// #define RADDBGIC_String8_NodeCount -// #define RADDBGIC_String8_TotalSizeMember - -#if !defined(RADDBGIC_String8) -#define RADDBGIC_String8 RADDBGIC_String8 -#define RADDBGIC_String8_BaseMember str -#define RADDBGIC_String8_SizeMember size -typedef struct RADDBGIC_String8 RADDBGIC_String8; -struct RADDBGIC_String8 -{ - RADDBGI_U8 *str; - RADDBGI_U64 size; -}; -#endif - -#if !defined(RADDBGIC_String8Node) -#define RADDBGIC_String8Node RADDBGIC_String8Node -#define RADDBGIC_String8Node_NextPtrMember next -#define RADDBGIC_String8Node_StringMember string -typedef struct RADDBGIC_String8Node RADDBGIC_String8Node; -struct RADDBGIC_String8Node -{ - RADDBGIC_String8Node *next; - RADDBGIC_String8 string; -}; -#endif - -#if !defined(RADDBGIC_String8List) -#define RADDBGIC_String8List RADDBGIC_String8List -#define RADDBGIC_String8List_FirstMember first -#define RADDBGIC_String8List_LastMember last -#define RADDBGIC_String8List_NodeCountMember node_count -#define RADDBGIC_String8List_TotalSizeMember total_size -typedef struct RADDBGIC_String8List RADDBGIC_String8List; -struct RADDBGIC_String8List -{ - RADDBGIC_String8Node *first; - RADDBGIC_String8Node *last; - RADDBGI_U64 node_count; - RADDBGI_U64 total_size; -}; -#endif - -typedef RADDBGI_U32 RADDBGIC_StringMatchFlags; -enum -{ - RADDBGIC_StringMatchFlag_CaseInsensitive = (1<<0), -}; - -//////////////////////////////// -//~ rjf: Overrideable Arena Allocator Types - -// To override the arena allocator type used by the library, do the following: -// -// #define RADDBGIC_ARENA_OVERRIDE -// #define RADDBGIC_Arena -// #define raddbgic_arena_alloc Arena*> -// #define raddbgic_arena_release void> -// #define raddbgic_arena_pos U64> -// #define raddbgic_arena_push void*> -// #define raddbgic_arena_pop_to void> - -#if !defined(RADDBGIC_Arena) -# define RADDBGIC_Arena RADDBGIC_Arena -typedef struct RADDBGIC_Arena RADDBGIC_Arena; -struct RADDBGIC_Arena -{ - RADDBGIC_Arena *prev; - RADDBGIC_Arena *current; - RADDBGI_U64 base_pos; - RADDBGI_U64 pos; - RADDBGI_U64 cmt; - RADDBGI_U64 res; - RADDBGI_U64 align; - RADDBGI_S8 grow; -}; -#endif - -#if !defined(raddbgic_arena_alloc) -# define raddbgic_arena_alloc raddbgic_arena_alloc_fallback -#endif -#if !defined(raddbgic_arena_release) -# define raddbgic_arena_release raddbgic_arena_release_fallback -#endif -#if !defined(raddbgic_arena_pos) -# define raddbgic_arena_pos raddbgic_arena_pos_fallback -#endif -#if !defined(raddbgic_arena_push) -# define raddbgic_arena_push raddbgic_arena_push_fallback -#endif - -//////////////////////////////// -//~ rjf: Overrideable Thread-Local Scratch Arenas - -// To override the default thread-local scratch arenas used b yhe library, -// do the following: -// -// #define RADDBGIC_SCRATCH_OVERRIDE -// #define RADDBGIC_Temp arena implementation - must be (Temp) -> (Arena*)> -// #define raddbgic_scratch_begin Temp> -// #define raddbgic_scratch_end void - -#if !defined(RADDBGIC_Temp) -# define RADDBGIC_Temp RADDBGIC_Temp -typedef struct RADDBGIC_Temp RADDBGIC_Temp; -struct RADDBGIC_Temp -{ - RADDBGIC_Arena *arena; - RADDBGI_U64 pos; -}; -#define raddbgic_temp_arena(t) ((t).arena) -#endif - -#if !defined(raddbgic_scratch_begin) -# define raddbgic_scratch_begin raddbgic_scratch_begin_fallback -#endif -#if !defined(raddbgic_scratch_end) -# define raddbgic_scratch_end raddbgic_scratch_end_fallback -#endif - -//////////////////////////////// -//~ rjf: Linked List Helpers - -#define RADDBGIC_CheckNil(nil,p) ((p) == 0 || (p) == nil) -#define RADDBGIC_SetNil(nil,p) ((p) = nil) - -//- rjf: Base Doubly-Linked-List Macros -#define RADDBGIC_DLLInsert_NPZ(nil,f,l,p,n,next,prev) (RADDBGIC_CheckNil(nil,f) ? \ -((f) = (l) = (n), RADDBGIC_SetNil(nil,(n)->next), RADDBGIC_SetNil(nil,(n)->prev)) :\ -RADDBGIC_CheckNil(nil,p) ? \ -((n)->next = (f), (f)->prev = (n), (f) = (n), RADDBGIC_SetNil(nil,(n)->prev)) :\ -((p)==(l)) ? \ -((l)->next = (n), (n)->prev = (l), (l) = (n), RADDBGIC_SetNil(nil, (n)->next)) :\ -(((!RADDBGIC_CheckNil(nil,p) && RADDBGIC_CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) -#define RADDBGIC_DLLPushBack_NPZ(nil,f,l,n,next,prev) RADDBGIC_DLLInsert_NPZ(nil,f,l,l,n,next,prev) -#define RADDBGIC_DLLPushFront_NPZ(nil,f,l,n,next,prev) RADDBGIC_DLLInsert_NPZ(nil,l,f,f,n,prev,next) -#define RADDBGIC_DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ -((n) == (l) ? (l) = (l)->prev : (0)),\ -(RADDBGIC_CheckNil(nil,(n)->prev) ? (0) :\ -((n)->prev->next = (n)->next)),\ -(RADDBGIC_CheckNil(nil,(n)->next) ? (0) :\ -((n)->next->prev = (n)->prev))) - -//- rjf: Base Singly-Linked-List Queue Macros -#define RADDBGIC_SLLQueuePush_NZ(nil,f,l,n,next) (RADDBGIC_CheckNil(nil,f)?\ -((f)=(l)=(n),RADDBGIC_SetNil(nil,(n)->next)):\ -((l)->next=(n),(l)=(n),RADDBGIC_SetNil(nil,(n)->next))) -#define RADDBGIC_SLLQueuePushFront_NZ(nil,f,l,n,next) (RADDBGIC_CheckNil(nil,f)?\ -((f)=(l)=(n),RADDBGIC_SetNil(nil,(n)->next)):\ -((n)->next=(f),(f)=(n))) -#define RADDBGIC_SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ -(RADDBGIC_SetNil(nil,f), RADDBGIC_SetNil(nil,l)):\ -((f)=(f)->next)) - -//- rjf: Base Singly-Linked-List Stack Macros -#define RADDBGIC_SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) -#define RADDBGIC_SLLStackPop_N(f,next) ((f)=(f)->next) - -//////////////////////////////// -//~ rjf: Convenience Wrappers - -//- rjf: Doubly-Linked-List Wrappers -#define RADDBGIC_DLLInsert_NP(f,l,p,n,next,prev) RADDBGIC_DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define RADDBGIC_DLLPushBack_NP(f,l,n,next,prev) RADDBGIC_DLLPushBack_NPZ(0,f,l,n,next,prev) -#define RADDBGIC_DLLPushFront_NP(f,l,n,next,prev) RADDBGIC_DLLPushFront_NPZ(0,f,l,n,next,prev) -#define RADDBGIC_DLLRemove_NP(f,l,n,next,prev) RADDBGIC_DLLRemove_NPZ(0,f,l,n,next,prev) -#define RADDBGIC_DLLInsert(f,l,p,n) RADDBGIC_DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define RADDBGIC_DLLPushBack(f,l,n) RADDBGIC_DLLPushBack_NPZ(0,f,l,n,next,prev) -#define RADDBGIC_DLLPushFront(f,l,n) RADDBGIC_DLLPushFront_NPZ(0,f,l,n,next,prev) -#define RADDBGIC_DLLRemove(f,l,n) RADDBGIC_DLLRemove_NPZ(0,f,l,n,next,prev) - -//- rjf: Singly-Linked-List Queue Wrappers -#define RADDBGIC_SLLQueuePush_N(f,l,n,next) RADDBGIC_SLLQueuePush_NZ(0,f,l,n,next) -#define RADDBGIC_SLLQueuePushFront_N(f,l,n,next) RADDBGIC_SLLQueuePushFront_NZ(0,f,l,n,next) -#define RADDBGIC_SLLQueuePop_N(f,l,next) RADDBGIC_SLLQueuePop_NZ(0,f,l,next) -#define RADDBGIC_SLLQueuePush(f,l,n) RADDBGIC_SLLQueuePush_NZ(0,f,l,n,next) -#define RADDBGIC_SLLQueuePushFront(f,l,n) RADDBGIC_SLLQueuePushFront_NZ(0,f,l,n,next) -#define RADDBGIC_SLLQueuePop(f,l) RADDBGIC_SLLQueuePop_NZ(0,f,l,next) - -//- rjf: Singly-Linked-List Stack Wrappers -#define RADDBGIC_SLLStackPush(f,n) RADDBGIC_SLLStackPush_N(f,n,next) -#define RADDBGIC_SLLStackPop(f) RADDBGIC_SLLStackPop_N(f,next) - -//////////////////////////////// -//~ rjf: Helper Macros - -#if defined(_MSC_VER) -# define RADDBGIC_THREAD_LOCAL __declspec(thread) -#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) -# define RADDBGIC_THREAD_LOCAL __thread -#else -# error RADDBGIC_THREAD_LOCAL not defined for this compiler. -#endif - -#if defined(_MSC_VER) -# define raddbgic_trap() __debugbreak() -#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) -# define raddbgic_trap() __builtin_trap() -#else -# error "raddbgic_trap not defined for this compiler." -#endif - -#define raddbgic_assert_always(x) do{if(!(x)) {raddbgic_trap();}}while(0) -#if !defined(NDEBUG) -# define raddbgic_assert(x) raddbgic_assert_always(x) -#else -# define raddbgic_assert(x) (void)(x) -#endif -#define raddbgic_noop ((void)0) - -//////////////////////////////// -//~ rjf: Error Types - -typedef struct RADDBGIC_Error RADDBGIC_Error; -struct RADDBGIC_Error -{ - RADDBGIC_Error *next; - RADDBGIC_String8 msg; -}; - -typedef struct RADDBGIC_ErrorList RADDBGIC_ErrorList; -struct RADDBGIC_ErrorList -{ - RADDBGIC_Error *first; - RADDBGIC_Error *last; - RADDBGI_U64 count; -}; - -//////////////////////////////// -//~ rjf: Auxiliary Data Structure Types - -//- rjf: u64 -> pointer map - -typedef struct RADDBGIC_U64ToPtrNode RADDBGIC_U64ToPtrNode; -struct RADDBGIC_U64ToPtrNode -{ - RADDBGIC_U64ToPtrNode *next; - RADDBGI_U64 _padding_; - RADDBGI_U64 key[1]; - void *ptr[1]; -}; - -typedef struct RADDBGIC_U64ToPtrMap RADDBGIC_U64ToPtrMap; -struct RADDBGIC_U64ToPtrMap -{ - RADDBGIC_U64ToPtrNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGI_U64 pair_count; -}; - -typedef struct RADDBGIC_U64ToPtrLookup RADDBGIC_U64ToPtrLookup; -struct RADDBGIC_U64ToPtrLookup -{ - void *match; - RADDBGIC_U64ToPtrNode *fill_node; - RADDBGI_U32 fill_k; -}; - -//- rjf: string8 -> pointer map - -typedef struct RADDBGIC_Str8ToPtrNode RADDBGIC_Str8ToPtrNode; -struct RADDBGIC_Str8ToPtrNode -{ - struct RADDBGIC_Str8ToPtrNode *next; - RADDBGIC_String8 key; - RADDBGI_U64 hash; - void *ptr; -}; - -typedef struct RADDBGIC_Str8ToPtrMap RADDBGIC_Str8ToPtrMap; -struct RADDBGIC_Str8ToPtrMap -{ - RADDBGIC_Str8ToPtrNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGI_U64 pair_count; -}; - -//- rjf: sortable range data structure - -typedef struct RADDBGIC_SortKey RADDBGIC_SortKey; -struct RADDBGIC_SortKey -{ - RADDBGI_U64 key; - void *val; -}; - -typedef struct RADDBGIC_OrderedRange RADDBGIC_OrderedRange; -struct RADDBGIC_OrderedRange -{ - RADDBGIC_OrderedRange *next; - RADDBGI_U64 first; - RADDBGI_U64 opl; -}; - -//////////////////////////////// -//~ rjf: Binary Section Types - -typedef struct RADDBGIC_BinarySection RADDBGIC_BinarySection; -struct RADDBGIC_BinarySection -{ - RADDBGIC_BinarySection *next; - RADDBGIC_String8 name; - RADDBGI_BinarySectionFlags flags; - RADDBGI_U64 voff_first; - RADDBGI_U64 voff_opl; - RADDBGI_U64 foff_first; - RADDBGI_U64 foff_opl; -}; - -//////////////////////////////// -//~ rjf: Per-Compilation-Unit Info Types - -typedef struct RADDBGIC_LineSequence RADDBGIC_LineSequence; -struct RADDBGIC_LineSequence -{ - RADDBGIC_String8 file_name; - RADDBGI_U64 *voffs; // [line_count + 1] (sorted) - RADDBGI_U32 *line_nums; // [line_count] - RADDBGI_U16 *col_nums; // [2*line_count] - RADDBGI_U64 line_count; -}; - -typedef struct RADDBGIC_LineSequenceNode RADDBGIC_LineSequenceNode; -struct RADDBGIC_LineSequenceNode -{ - RADDBGIC_LineSequenceNode *next; - RADDBGIC_LineSequence line_seq; -}; - -typedef struct RADDBGIC_UnitInfo RADDBGIC_UnitInfo; -struct RADDBGIC_UnitInfo -{ - RADDBGIC_String8 unit_name; - RADDBGIC_String8 compiler_name; - RADDBGIC_String8 source_file; - RADDBGIC_String8 object_file; - RADDBGIC_String8 archive_file; - RADDBGIC_String8 build_path; - RADDBGI_Language language; -}; - -typedef struct RADDBGIC_Unit RADDBGIC_Unit; -struct RADDBGIC_Unit -{ - RADDBGIC_Unit *next_order; - RADDBGI_U32 idx; - RADDBGI_S32 info_is_set; - RADDBGIC_String8 unit_name; - RADDBGIC_String8 compiler_name; - RADDBGIC_String8 source_file; - RADDBGIC_String8 object_file; - RADDBGIC_String8 archive_file; - RADDBGIC_String8 build_path; - RADDBGI_Language language; - RADDBGIC_LineSequenceNode *line_seq_first; - RADDBGIC_LineSequenceNode *line_seq_last; - RADDBGI_U64 line_seq_count; -}; - -typedef struct RADDBGIC_UnitVMapRange RADDBGIC_UnitVMapRange; -struct RADDBGIC_UnitVMapRange -{ - RADDBGIC_UnitVMapRange *next; - RADDBGIC_Unit *unit; - RADDBGI_U64 first; - RADDBGI_U64 opl; -}; - -//////////////////////////////// -//~ rjf: Type Info Types - -typedef RADDBGI_U8 RADDBGIC_TypeConstructKind; -enum -{ - RADDBGIC_TypeConstructKind_Basic, - RADDBGIC_TypeConstructKind_Modifier, - RADDBGIC_TypeConstructKind_Bitfield, - RADDBGIC_TypeConstructKind_Pointer, - RADDBGIC_TypeConstructKind_Array, - RADDBGIC_TypeConstructKind_Procedure, - RADDBGIC_TypeConstructKind_Method, -}; - -typedef struct RADDBGIC_Reservation RADDBGIC_Reservation; - -typedef struct RADDBGIC_TypeMember RADDBGIC_TypeMember; -struct RADDBGIC_TypeMember -{ - RADDBGIC_TypeMember *next; - RADDBGI_MemberKind kind; - RADDBGIC_String8 name; - struct RADDBGIC_Type *type; - RADDBGI_U32 off; -}; - -typedef struct RADDBGIC_TypeEnumVal RADDBGIC_TypeEnumVal; -struct RADDBGIC_TypeEnumVal -{ - RADDBGIC_TypeEnumVal *next; - RADDBGIC_String8 name; - RADDBGI_U64 val; -}; - -typedef struct RADDBGIC_Type RADDBGIC_Type; -struct RADDBGIC_Type -{ - RADDBGIC_Type *next_order; - RADDBGI_TypeKind kind; - RADDBGI_U32 idx; - RADDBGI_U32 byte_size; - RADDBGI_U32 flags; - RADDBGI_U32 off; - RADDBGI_U32 count; - RADDBGIC_String8 name; - RADDBGIC_Type *direct_type; - RADDBGIC_Type **param_types; - struct RADDBGIC_TypeUDT *udt; -}; - -typedef struct RADDBGIC_TypeUDT RADDBGIC_TypeUDT; -struct RADDBGIC_TypeUDT -{ - RADDBGIC_TypeUDT *next_order; - RADDBGI_U32 idx; - RADDBGIC_Type *self_type; - RADDBGIC_TypeMember *first_member; - RADDBGIC_TypeMember *last_member; - RADDBGI_U64 member_count; - RADDBGIC_TypeEnumVal *first_enum_val; - RADDBGIC_TypeEnumVal *last_enum_val; - RADDBGI_U64 enum_val_count; - RADDBGIC_String8 source_path; - RADDBGI_U32 line; - RADDBGI_U32 col; -}; - -typedef struct RADDBGIC_TypeNode RADDBGIC_TypeNode; -struct RADDBGIC_TypeNode -{ - RADDBGIC_TypeNode *next; - RADDBGIC_Type *type; -}; - -typedef struct RADDBGIC_TypeList RADDBGIC_TypeList; -struct RADDBGIC_TypeList -{ - RADDBGIC_TypeNode *first; - RADDBGIC_TypeNode *last; - RADDBGI_U64 count; -}; - -//////////////////////////////// -//~ rjf: Symbol Info Types - -typedef enum RADDBGIC_SymbolKind -{ - RADDBGIC_SymbolKind_NULL, - RADDBGIC_SymbolKind_GlobalVariable, - RADDBGIC_SymbolKind_ThreadVariable, - RADDBGIC_SymbolKind_Procedure, - RADDBGIC_SymbolKind_COUNT -} -RADDBGIC_SymbolKind; - -typedef struct RADDBGIC_SymbolInfo RADDBGIC_SymbolInfo; -struct RADDBGIC_SymbolInfo -{ - RADDBGIC_SymbolKind kind; - RADDBGIC_String8 name; - RADDBGIC_String8 link_name; - RADDBGIC_Type *type; - RADDBGI_S32 is_extern; - RADDBGI_U64 offset; - // TODO(allen): should this actually be "container scope"? - struct RADDBGIC_Symbol *container_symbol; - RADDBGIC_Type *container_type; - struct RADDBGIC_Scope *root_scope; -}; - -typedef struct RADDBGIC_Symbol RADDBGIC_Symbol; -struct RADDBGIC_Symbol -{ - RADDBGIC_Symbol *next_order; - RADDBGI_U32 idx; - RADDBGIC_SymbolKind kind; - RADDBGIC_String8 name; - RADDBGIC_String8 link_name; - RADDBGIC_Type *type; - RADDBGI_S32 is_extern; - RADDBGI_S8 offset_is_set; - RADDBGI_U64 offset; - RADDBGIC_Symbol *container_symbol; - RADDBGIC_Type *container_type; - struct RADDBGIC_Scope *root_scope; -}; - -//////////////////////////////// -//~ rjf: Scope Info Types - -typedef struct RADDBGIC_LocalInfo RADDBGIC_LocalInfo; -struct RADDBGIC_LocalInfo -{ - RADDBGI_LocalKind kind; - struct RADDBGIC_Scope *scope; - RADDBGIC_String8 name; - RADDBGIC_Type *type; -}; - -typedef struct RADDBGIC_Local RADDBGIC_Local; -struct RADDBGIC_Local -{ - RADDBGIC_Local *next; - RADDBGI_LocalKind kind; - RADDBGIC_String8 name; - RADDBGIC_Type *type; - struct RADDBGIC_LocationSet *locset; -}; - -typedef struct RADDBGIC_VOffRange RADDBGIC_VOffRange; -struct RADDBGIC_VOffRange -{ - RADDBGIC_VOffRange *next; - RADDBGI_U64 voff_first; - RADDBGI_U64 voff_opl; -}; - -typedef struct RADDBGIC_Scope RADDBGIC_Scope; -struct RADDBGIC_Scope -{ - RADDBGIC_Scope *next_order; - RADDBGIC_Symbol *symbol; - RADDBGIC_Scope *parent_scope; - RADDBGIC_Scope *first_child; - RADDBGIC_Scope *last_child; - RADDBGIC_Scope *next_sibling; - RADDBGI_U64 voff_base; - RADDBGIC_VOffRange *first_range; - RADDBGIC_VOffRange *last_range; - RADDBGI_U32 range_count; - RADDBGI_U32 idx; - RADDBGIC_Local *first_local; - RADDBGIC_Local *last_local; - RADDBGI_U32 local_count; -}; - -//////////////////////////////// -//~ rjf: Location Info Types - -typedef struct RADDBGIC_EvalBytecodeOp RADDBGIC_EvalBytecodeOp; -struct RADDBGIC_EvalBytecodeOp -{ - RADDBGIC_EvalBytecodeOp *next; - RADDBGI_EvalOp op; - RADDBGI_U32 p_size; - RADDBGI_U64 p; -}; - -typedef struct RADDBGIC_EvalBytecode RADDBGIC_EvalBytecode; -struct RADDBGIC_EvalBytecode -{ - RADDBGIC_EvalBytecodeOp *first_op; - RADDBGIC_EvalBytecodeOp *last_op; - RADDBGI_U32 op_count; - RADDBGI_U32 encoded_size; -}; - -typedef struct RADDBGIC_Location RADDBGIC_Location; -struct RADDBGIC_Location -{ - RADDBGI_LocationKind kind; - RADDBGI_U8 register_code; - RADDBGI_U16 offset; - RADDBGIC_EvalBytecode bytecode; -}; - -typedef struct RADDBGIC_LocationCase RADDBGIC_LocationCase; -struct RADDBGIC_LocationCase -{ - RADDBGIC_LocationCase *next; - RADDBGI_U64 voff_first; - RADDBGI_U64 voff_opl; - RADDBGIC_Location *location; -}; - -typedef struct RADDBGIC_LocationSet RADDBGIC_LocationSet; -struct RADDBGIC_LocationSet -{ - RADDBGIC_LocationCase *first_location_case; - RADDBGIC_LocationCase *last_location_case; - RADDBGI_U64 location_case_count; -}; - -//////////////////////////////// -//~ rjf: Name Map Types - -typedef struct RADDBGIC_NameMapIdxNode RADDBGIC_NameMapIdxNode; -struct RADDBGIC_NameMapIdxNode -{ - RADDBGIC_NameMapIdxNode *next; - RADDBGI_U32 idx[8]; -}; - -typedef struct RADDBGIC_NameMapNode RADDBGIC_NameMapNode; -struct RADDBGIC_NameMapNode -{ - RADDBGIC_NameMapNode *bucket_next; - RADDBGIC_NameMapNode *order_next; - RADDBGIC_String8 string; - RADDBGIC_NameMapIdxNode *idx_first; - RADDBGIC_NameMapIdxNode *idx_last; - RADDBGI_U64 idx_count; -}; - -typedef struct RADDBGIC_NameMap RADDBGIC_NameMap; -struct RADDBGIC_NameMap -{ - RADDBGIC_NameMapNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGIC_NameMapNode *first; - RADDBGIC_NameMapNode *last; - RADDBGI_U64 name_count; -}; - -//////////////////////////////// -//~ rjf: Top-Level Debug Info Types - -typedef struct RADDBGIC_TopLevelInfo RADDBGIC_TopLevelInfo; -struct RADDBGIC_TopLevelInfo -{ - RADDBGI_Arch architecture; - RADDBGIC_String8 exe_name; - RADDBGI_U64 exe_hash; - RADDBGI_U64 voff_max; -}; - -//////////////////////////////// -//~ rjf: Root Construction Bundle Types - -typedef struct RADDBGIC_RootParams RADDBGIC_RootParams; -struct RADDBGIC_RootParams -{ - RADDBGI_U64 addr_size; - RADDBGI_U32 bucket_count_units; // optional; default chosen if 0 - RADDBGI_U32 bucket_count_symbols; // optional; default chosen if 0 - RADDBGI_U32 bucket_count_scopes; // optional; default chosen if 0 - RADDBGI_U32 bucket_count_locals; // optional; default chosen if 0 - RADDBGI_U32 bucket_count_types; // optional; default chosen if 0 - RADDBGI_U64 bucket_count_type_constructs; // optional; default chosen if 0 -}; - -typedef struct RADDBGIC_Root RADDBGIC_Root; -struct RADDBGIC_Root -{ - RADDBGIC_Arena *arena; - RADDBGIC_ErrorList errors; - - //////// Contextual Information - - RADDBGI_U64 addr_size; - - //////// Info Declared By User - - // top level info - RADDBGI_S32 top_level_info_is_set; - RADDBGIC_TopLevelInfo top_level_info; - - // binary layout - RADDBGIC_BinarySection *binary_section_first; - RADDBGIC_BinarySection *binary_section_last; - RADDBGI_U64 binary_section_count; - - // compilation units - RADDBGIC_Unit *unit_first; - RADDBGIC_Unit *unit_last; - RADDBGI_U64 unit_count; - - RADDBGIC_UnitVMapRange *unit_vmap_range_first; - RADDBGIC_UnitVMapRange *unit_vmap_range_last; - RADDBGI_U64 unit_vmap_range_count; - - // types - RADDBGIC_Type *first_type; - RADDBGIC_Type *last_type; - RADDBGI_U64 type_count; - - RADDBGIC_Type *nil_type; - RADDBGIC_Type *variadic_type; - - RADDBGIC_Type handled_nil_type; - - RADDBGIC_TypeUDT *first_udt; - RADDBGIC_TypeUDT *last_udt; - RADDBGI_U64 type_udt_count; - - RADDBGI_U64 total_member_count; - RADDBGI_U64 total_enum_val_count; - - // symbols - RADDBGIC_Symbol *first_symbol; - RADDBGIC_Symbol *last_symbol; - union - { - RADDBGI_U64 symbol_count; - RADDBGI_U64 symbol_kind_counts[RADDBGIC_SymbolKind_COUNT]; - }; - - RADDBGIC_Scope *first_scope; - RADDBGIC_Scope *last_scope; - RADDBGI_U64 scope_count; - RADDBGI_U64 scope_voff_count; - - RADDBGIC_Local *first_local; - RADDBGIC_Local *last_local; - RADDBGI_U64 local_count; - RADDBGI_U64 location_count; - - // name maps - RADDBGIC_NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; - - //////// Handle Relationship Maps - - RADDBGIC_U64ToPtrMap unit_map; - RADDBGIC_U64ToPtrMap symbol_map; - RADDBGIC_U64ToPtrMap scope_map; - RADDBGIC_U64ToPtrMap local_map; - RADDBGIC_U64ToPtrMap type_from_id_map; - RADDBGIC_Str8ToPtrMap construct_map; -}; - -//////////////////////////////// -//~ rjf: Baking Phase Types - -//- rjf: bake data section data structure - -typedef struct RADDBGIC_DSectionNode RADDBGIC_DSectionNode; -struct RADDBGIC_DSectionNode -{ - RADDBGIC_DSectionNode *next; - void *data; - RADDBGI_U64 size; - RADDBGI_DataSectionTag tag; -}; - -typedef struct RADDBGIC_DSections RADDBGIC_DSections; -struct RADDBGIC_DSections -{ - RADDBGIC_DSectionNode *first; - RADDBGIC_DSectionNode *last; - RADDBGI_U32 count; -}; - -//- rjf: bake string data structure - -typedef struct RADDBGIC_StringNode RADDBGIC_StringNode; -struct RADDBGIC_StringNode -{ - RADDBGIC_StringNode *order_next; - RADDBGIC_StringNode *bucket_next; - RADDBGIC_String8 str; - RADDBGI_U64 hash; - RADDBGI_U32 idx; -}; - -typedef struct RADDBGIC_Strings RADDBGIC_Strings; -struct RADDBGIC_Strings -{ - RADDBGIC_StringNode *order_first; - RADDBGIC_StringNode *order_last; - RADDBGIC_StringNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGI_U32 count; -}; - -//- rjf: index run baking data structure - -typedef struct RADDBGIC_IdxRunNode RADDBGIC_IdxRunNode; -struct RADDBGIC_IdxRunNode -{ - RADDBGIC_IdxRunNode *order_next; - RADDBGIC_IdxRunNode *bucket_next; - RADDBGI_U32 *idx_run; - RADDBGI_U64 hash; - RADDBGI_U32 count; - RADDBGI_U32 first_idx; -}; - -typedef struct RADDBGIC_IdxRuns RADDBGIC_IdxRuns; -struct RADDBGIC_IdxRuns -{ - RADDBGIC_IdxRunNode *order_first; - RADDBGIC_IdxRunNode *order_last; - RADDBGIC_IdxRunNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGI_U32 count; - RADDBGI_U32 idx_count; -}; - -//- rjf: source file & file path baking data structures - -typedef struct RADDBGIC_PathNode RADDBGIC_PathNode; -struct RADDBGIC_PathNode -{ - RADDBGIC_PathNode *next_order; - RADDBGIC_PathNode *parent; - RADDBGIC_PathNode *first_child; - RADDBGIC_PathNode *last_child; - RADDBGIC_PathNode *next_sibling; - RADDBGIC_String8 name; - struct RADDBGIC_SrcNode *src_file; - RADDBGI_U32 idx; -}; - -typedef struct RADDBGIC_LineMapFragment RADDBGIC_LineMapFragment; -struct RADDBGIC_LineMapFragment -{ - RADDBGIC_LineMapFragment *next; - RADDBGIC_LineSequenceNode *sequence; -}; - -typedef struct RADDBGIC_SrcNode RADDBGIC_SrcNode; -struct RADDBGIC_SrcNode -{ - RADDBGIC_SrcNode *next; - RADDBGIC_PathNode *path_node; - RADDBGI_U32 idx; - - RADDBGIC_String8 normal_full_path; - - // place to gather the line info attached to this src file - RADDBGIC_LineMapFragment *first_fragment; - RADDBGIC_LineMapFragment *last_fragment; - - // place to put the final baked version of this file's line map - RADDBGI_U32 line_map_nums_data_idx; - RADDBGI_U32 line_map_range_data_idx; - RADDBGI_U32 line_map_count; - RADDBGI_U32 line_map_voff_data_idx; -}; - -typedef struct RADDBGIC_PathTree RADDBGIC_PathTree; -struct RADDBGIC_PathTree -{ - RADDBGIC_PathNode *first; - RADDBGIC_PathNode *last; - RADDBGI_U32 count; - RADDBGIC_PathNode root; - RADDBGIC_SrcNode *src_first; - RADDBGIC_SrcNode *src_last; - RADDBGI_U32 src_count; -}; - -//- rjf: line info baking data structures - -typedef struct RADDBGIC_LineRec RADDBGIC_LineRec; -struct RADDBGIC_LineRec -{ - RADDBGI_U32 file_id; - RADDBGI_U32 line_num; - RADDBGI_U16 col_first; - RADDBGI_U16 col_opl; -}; - -typedef struct RADDBGIC_UnitLinesCombined RADDBGIC_UnitLinesCombined; -struct RADDBGIC_UnitLinesCombined -{ - RADDBGI_U64 *voffs; - RADDBGI_Line *lines; - RADDBGI_U16 *cols; - RADDBGI_U32 line_count; -}; - -typedef struct RADDBGIC_SrcLinesCombined RADDBGIC_SrcLinesCombined; -struct RADDBGIC_SrcLinesCombined -{ - RADDBGI_U32 *line_nums; - RADDBGI_U32 *line_ranges; - RADDBGI_U64 *voffs; - RADDBGI_U32 line_count; - RADDBGI_U32 voff_count; -}; - -typedef struct RADDBGIC_SrcLineMapVoffBlock RADDBGIC_SrcLineMapVoffBlock; -struct RADDBGIC_SrcLineMapVoffBlock -{ - RADDBGIC_SrcLineMapVoffBlock *next; - RADDBGI_U64 voff; -}; - -typedef struct RADDBGIC_SrcLineMapBucket RADDBGIC_SrcLineMapBucket; -struct RADDBGIC_SrcLineMapBucket -{ - RADDBGIC_SrcLineMapBucket *order_next; - RADDBGIC_SrcLineMapBucket *hash_next; - RADDBGI_U32 line_num; - RADDBGIC_SrcLineMapVoffBlock *first_voff_block; - RADDBGIC_SrcLineMapVoffBlock *last_voff_block; - RADDBGI_U64 voff_count; -}; - -//- rjf: vmap baking data structure - -typedef struct RADDBGIC_VMap RADDBGIC_VMap; -struct RADDBGIC_VMap -{ - RADDBGI_VMapEntry *vmap; // [count + 1] - RADDBGI_U32 count; -}; - -typedef struct RADDBGIC_VMapMarker RADDBGIC_VMapMarker; -struct RADDBGIC_VMapMarker -{ - RADDBGI_U32 idx; - RADDBGI_U32 begin_range; -}; - -typedef struct RADDBGIC_VMapRangeTracker RADDBGIC_VMapRangeTracker; -struct RADDBGIC_VMapRangeTracker -{ - RADDBGIC_VMapRangeTracker *next; - RADDBGI_U32 idx; -}; - -//- rjf: type data baking types - -typedef struct RADDBGIC_TypeData RADDBGIC_TypeData; -struct RADDBGIC_TypeData -{ - RADDBGI_TypeNode *type_nodes; - RADDBGI_U32 type_node_count; - - RADDBGI_UDT *udts; - RADDBGI_U32 udt_count; - - RADDBGI_Member *members; - RADDBGI_U32 member_count; - - RADDBGI_EnumMember *enum_members; - RADDBGI_U32 enum_member_count; -}; - -//- rjf: symbol data baking types - -typedef struct RADDBGIC_SymbolData RADDBGIC_SymbolData; -struct RADDBGIC_SymbolData -{ - RADDBGI_GlobalVariable *global_variables; - RADDBGI_U32 global_variable_count; - - RADDBGIC_VMap *global_vmap; - - RADDBGI_ThreadVariable *thread_variables; - RADDBGI_U32 thread_variable_count; - - RADDBGI_Procedure *procedures; - RADDBGI_U32 procedure_count; - - RADDBGI_Scope *scopes; - RADDBGI_U32 scope_count; - - RADDBGI_U64 *scope_voffs; - RADDBGI_U32 scope_voff_count; - - RADDBGIC_VMap *scope_vmap; - - RADDBGI_Local *locals; - RADDBGI_U32 local_count; - - RADDBGI_LocationBlock *location_blocks; - RADDBGI_U32 location_block_count; - - void *location_data; - RADDBGI_U32 location_data_size; -}; - -//- rjf: name map baking types - -typedef struct RADDBGIC_NameMapSemiNode RADDBGIC_NameMapSemiNode; -struct RADDBGIC_NameMapSemiNode -{ - RADDBGIC_NameMapSemiNode *next; - RADDBGIC_NameMapNode *node; -}; - -typedef struct RADDBGIC_NameMapSemiBucket RADDBGIC_NameMapSemiBucket; -struct RADDBGIC_NameMapSemiBucket -{ - RADDBGIC_NameMapSemiNode *first; - RADDBGIC_NameMapSemiNode *last; - RADDBGI_U64 count; -}; - -typedef struct RADDBGIC_NameMapBaked RADDBGIC_NameMapBaked; -struct RADDBGIC_NameMapBaked -{ - RADDBGI_NameMapBucket *buckets; - RADDBGI_NameMapNode *nodes; - RADDBGI_U32 bucket_count; - RADDBGI_U32 node_count; -}; - -//- rjf: bundle baking context type - -typedef struct RADDBGIC_BakeParams RADDBGIC_BakeParams; -struct RADDBGIC_BakeParams -{ - RADDBGI_U64 strings_bucket_count; - RADDBGI_U64 idx_runs_bucket_count; -}; - -typedef struct RADDBGIC_BakeCtx RADDBGIC_BakeCtx; -struct RADDBGIC_BakeCtx -{ - RADDBGIC_Arena *arena; - RADDBGIC_Strings strs; - RADDBGIC_IdxRuns idxs; - RADDBGIC_PathTree *tree; -}; - -//////////////////////////////// -//~ rjf: Basic Helpers - -//- rjf: memory operations -#if !defined(RADDBGIC_MEMSET_OVERRIDE) -RADDBGI_PROC void *raddbgic_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size); -#endif -#if !defined(RADDBGIC_MEMCPY_OVERRIDE) -RADDBGI_PROC void *raddbgic_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size); -#endif -#define raddbgic_memzero(ptr, size) raddbgic_memset((ptr), 0, (size)) -#define raddbgic_memzero_struct(ptr) raddbgic_memset((ptr), 0, sizeof(*(ptr))) -#define raddbgic_memcpy_struct(dst, src) raddbgic_memcpy((dst), (src), sizeof(*(dst))) - -//- rjf: arenas -#if !defined (RADDBGIC_ARENA_OVERRIDE) -RADDBGI_PROC RADDBGIC_Arena *raddbgic_arena_alloc_fallback(void); -RADDBGI_PROC void raddbgic_arena_release_fallback(RADDBGIC_Arena *arena); -RADDBGI_PROC RADDBGI_U64 raddbgic_arena_pos_fallback(RADDBGIC_Arena *arena); -RADDBGI_PROC void *raddbgic_arena_push_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 size); -RADDBGI_PROC void raddbgic_arena_pop_to_fallback(RADDBGIC_Arena *arena, RADDBGI_U64 pos); -#endif -#define raddbgic_push_array_no_zero(a,T,c) (T*)raddbgic_arena_push((a), sizeof(T)*(c)) -#define raddbgic_push_array(a,T,c) (T*)raddbgic_memzero(raddbgic_push_array_no_zero(a,T,c), sizeof(T)*(c)) - -//- rjf: thread-local scratch arenas -#if !defined (RADDBGIC_SCRATCH_OVERRIDE) -RADDBGI_PROC RADDBGIC_Temp raddbgic_scratch_begin_fallback(RADDBGIC_Arena **conflicts, RADDBGI_U64 conflicts_count); -RADDBGI_PROC void raddbgic_scratch_end_fallback(RADDBGIC_Temp temp); -#endif - -//- rjf: strings -RADDBGI_PROC RADDBGIC_String8 raddbgic_str8(RADDBGI_U8 *str, RADDBGI_U64 size); -RADDBGI_PROC RADDBGIC_String8 raddbgic_str8_copy(RADDBGIC_Arena *arena, RADDBGIC_String8 src); -RADDBGI_PROC RADDBGIC_String8 raddbgic_str8f(RADDBGIC_Arena *arena, char *fmt, ...); -RADDBGI_PROC RADDBGIC_String8 raddbgic_str8fv(RADDBGIC_Arena *arena, char *fmt, va_list args); -RADDBGI_PROC RADDBGI_S32 raddbgic_str8_match(RADDBGIC_String8 a, RADDBGIC_String8 b, RADDBGIC_StringMatchFlags flags); -#define raddbgic_str8_lit(S) raddbgic_str8((RADDBGI_U8*)(S), sizeof(S) - 1) -#define raddbgic_str8_struct(S) raddbgic_str8((RADDBGI_U8*)(S), sizeof(*(S))) - -//- rjf: string lists -RADDBGI_PROC void raddbgic_str8_list_push(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDBGIC_String8 string); -RADDBGI_PROC RADDBGIC_String8 raddbgic_str8_list_join(RADDBGIC_Arena *arena, RADDBGIC_String8List *list, RADDBGIC_String8 sep); - -//- rjf: type lists -RADDBGI_PROC void raddbgic_type_list_push(RADDBGIC_Arena *arena, RADDBGIC_TypeList *list, RADDBGIC_Type *type); - -//- rjf: bytecode lists -RADDBGI_PROC void raddbgic_bytecode_push_op(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_EvalOp op, RADDBGI_U64 p); -RADDBGI_PROC void raddbgic_bytecode_push_uconst(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_U64 x); -RADDBGI_PROC void raddbgic_bytecode_push_sconst(RADDBGIC_Arena *arena, RADDBGIC_EvalBytecode *bytecode, RADDBGI_S64 x); -RADDBGI_PROC void raddbgic_bytecode_concat_in_place(RADDBGIC_EvalBytecode *left_dst, RADDBGIC_EvalBytecode *right_destroyed); - -//- rjf: sortable range sorting -RADDBGI_PROC RADDBGIC_SortKey* raddbgic_sort_key_array(RADDBGIC_Arena *arena, RADDBGIC_SortKey *keys, RADDBGI_U64 count); - -//////////////////////////////// -//~ rjf: Auxiliary Data Structure Functions - -//- rjf: u64 -> ptr map -RADDBGI_PROC void raddbgic_u64toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 bucket_count); -RADDBGI_PROC void raddbgic_u64toptr_map_lookup(RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RADDBGIC_U64ToPtrLookup *lookup_out); -RADDBGI_PROC void raddbgic_u64toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RADDBGIC_U64ToPtrLookup *lookup, void *ptr); - -//- rjf: string8 -> ptr map -RADDBGI_PROC void raddbgic_str8toptr_map_init(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGI_U64 bucket_count); -RADDBGI_PROC void*raddbgic_str8toptr_map_lookup(RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, RADDBGI_U64 hash); -RADDBGI_PROC void raddbgic_str8toptr_map_insert(RADDBGIC_Arena *arena, RADDBGIC_Str8ToPtrMap *map, RADDBGIC_String8 key, RADDBGI_U64 hash, void *ptr); - -//////////////////////////////// -//~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions - -//- rjf: root creation -RADDBGI_PROC RADDBGIC_Root* raddbgic_root_alloc(RADDBGIC_RootParams *params); -RADDBGI_PROC void raddbgic_root_release(RADDBGIC_Root *root); - -//- rjf: error accumulation -RADDBGI_PROC void raddbgic_push_error(RADDBGIC_Root *root, RADDBGIC_String8 string); -RADDBGI_PROC void raddbgic_push_errorf(RADDBGIC_Root *root, char *fmt, ...); -RADDBGI_PROC RADDBGIC_Error* raddbgic_first_error_from_root(RADDBGIC_Root *root); - -//- rjf: top-level info specification -RADDBGI_PROC void raddbgic_set_top_level_info(RADDBGIC_Root *root, RADDBGIC_TopLevelInfo *tli); - -//- rjf: binary section building -RADDBGI_PROC void raddbgic_add_binary_section(RADDBGIC_Root *root, - RADDBGIC_String8 name, RADDBGI_BinarySectionFlags flags, - RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, - RADDBGI_U64 foff_opl); - -//- rjf: unit info building -RADDBGI_PROC RADDBGIC_Unit* raddbgic_unit_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 unit_user_id, RADDBGI_U64 unit_user_id_hash); -RADDBGI_PROC void raddbgic_unit_set_info(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_UnitInfo *info); -RADDBGI_PROC void raddbgic_unit_add_line_sequence(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGIC_LineSequence *line_sequence); -RADDBGI_PROC void raddbgic_unit_vmap_add_range(RADDBGIC_Root *root, RADDBGIC_Unit *unit, RADDBGI_U64 first, RADDBGI_U64 opl); - -//- rjf: type info lookups/reservations -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_from_id(RADDBGIC_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash); -RADDBGI_PROC RADDBGIC_Reservation* raddbgic_type_reserve_id(RADDBGIC_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash); -RADDBGI_PROC void raddbgic_type_fill_id(RADDBGIC_Root *root, RADDBGIC_Reservation *res, RADDBGIC_Type *type); - -//- rjf: nil/singleton types -RADDBGI_PROC RADDBGI_S32 raddbgic_type_is_unhandled_nil(RADDBGIC_Root *root, RADDBGIC_Type *type); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_handled_nil(RADDBGIC_Root *root); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_nil(RADDBGIC_Root *root); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_variadic(RADDBGIC_Root *root); - -//- rjf: base type info constructors -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_new(RADDBGIC_Root *root); -RADDBGI_PROC RADDBGIC_TypeUDT* raddbgic_type_udt_from_any_type(RADDBGIC_Root *root, RADDBGIC_Type *type); -RADDBGI_PROC RADDBGIC_TypeUDT* raddbgic_type_udt_from_record_type(RADDBGIC_Root *root, RADDBGIC_Type *type); - -//- rjf: basic/operator type construction helpers -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_basic(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_String8 name); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_modifier(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeModifierFlags flags); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_bitfield(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_pointer(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_TypeKind ptr_type_kind); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_array(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGI_U64 count); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_proc(RADDBGIC_Root *root, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_method(RADDBGIC_Root *root, RADDBGIC_Type *this_type, RADDBGIC_Type *return_type, struct RADDBGIC_TypeList *params); - -//- rjf: udt type constructors -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_udt(RADDBGIC_Root *root, RADDBGI_TypeKind record_type_kind, RADDBGIC_String8 name, RADDBGI_U64 size); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_enum(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGIC_String8 name); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_alias(RADDBGIC_Root *root, RADDBGIC_Type *direct_type, RADDBGIC_String8 name); -RADDBGI_PROC RADDBGIC_Type* raddbgic_type_incomplete(RADDBGIC_Root *root, RADDBGI_TypeKind type_kind, RADDBGIC_String8 name); - -//- rjf: type member building -RADDBGI_PROC void raddbgic_type_add_member_data_field(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type, RADDBGI_U32 off); -RADDBGI_PROC void raddbgic_type_add_member_static_data(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type); -RADDBGI_PROC void raddbgic_type_add_member_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type); -RADDBGI_PROC void raddbgic_type_add_member_static_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type); -RADDBGI_PROC void raddbgic_type_add_member_virtual_method(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_String8 name, RADDBGIC_Type *mem_type); -RADDBGI_PROC void raddbgic_type_add_member_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, RADDBGI_U32 off); -RADDBGI_PROC void raddbgic_type_add_member_virtual_base(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *base_type, RADDBGI_U32 vptr_off, RADDBGI_U32 vtable_off); -RADDBGI_PROC void raddbgic_type_add_member_nested_type(RADDBGIC_Root *root, RADDBGIC_Type *record_type, RADDBGIC_Type *nested_type); -RADDBGI_PROC void raddbgic_type_add_enum_val(RADDBGIC_Root *root, RADDBGIC_Type *enum_type, RADDBGIC_String8 name, RADDBGI_U64 val); - -//- rjf: type source coordinate specifications -RADDBGI_PROC void raddbgic_type_set_source_coordinates(RADDBGIC_Root *root, RADDBGIC_Type *defined_type, RADDBGIC_String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col); - -//- rjf: symbol info building -RADDBGI_PROC RADDBGIC_Symbol* raddbgic_symbol_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 symbol_user_id, RADDBGI_U64 symbol_user_id_hash); -RADDBGI_PROC void raddbgic_symbol_set_info(RADDBGIC_Root *root, RADDBGIC_Symbol *symbol, RADDBGIC_SymbolInfo *info); - -//- rjf: scope info building -RADDBGI_PROC RADDBGIC_Scope *raddbgic_scope_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 scope_user_id, RADDBGI_U64 scope_user_id_hash); -RADDBGI_PROC void raddbgic_scope_set_parent(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGIC_Scope *parent); -RADDBGI_PROC void raddbgic_scope_add_voff_range(RADDBGIC_Root *root, RADDBGIC_Scope *scope, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl); -RADDBGI_PROC void raddbgic_scope_recursive_set_symbol(RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); - -//- rjf: local info building -RADDBGI_PROC RADDBGIC_Local* raddbgic_local_handle_from_user_id(RADDBGIC_Root *root, RADDBGI_U64 local_user_id, RADDBGI_U64 local_user_id_hash); -RADDBGI_PROC void raddbgic_local_set_basic_info(RADDBGIC_Root *root, RADDBGIC_Local *local, RADDBGIC_LocalInfo *info); -RADDBGI_PROC RADDBGIC_LocationSet* raddbgic_location_set_from_local(RADDBGIC_Root *root, RADDBGIC_Local *local); - -//- rjf: location info building -RADDBGI_PROC void raddbgic_location_set_add_case(RADDBGIC_Root *root, RADDBGIC_LocationSet *locset, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGIC_Location *location); -RADDBGI_PROC RADDBGIC_Location* raddbgic_location_addr_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode); -RADDBGI_PROC RADDBGIC_Location* raddbgic_location_val_bytecode_stream(RADDBGIC_Root *root, struct RADDBGIC_EvalBytecode *bytecode); -RADDBGI_PROC RADDBGIC_Location* raddbgic_location_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset); -RADDBGI_PROC RADDBGIC_Location* raddbgic_location_addr_addr_reg_plus_u16(RADDBGIC_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset); -RADDBGI_PROC RADDBGIC_Location* raddbgic_location_val_reg(RADDBGIC_Root *root, RADDBGI_U8 reg_code); - -//- rjf: name map building -RADDBGI_PROC RADDBGIC_NameMap* raddbgic_name_map_for_kind(RADDBGIC_Root *root, RADDBGI_NameMapKind kind); -RADDBGI_PROC void raddbgic_name_map_add_pair(RADDBGIC_Root *root, RADDBGIC_NameMap *map, RADDBGIC_String8 name, RADDBGI_U32 idx); - -//////////////////////////////// -//~ rjf: Debug Info Baking (Loose -> Tight) Functions - -//- rjf: bake context construction -RADDBGI_PROC RADDBGIC_BakeCtx* raddbgic_bake_ctx_begin(RADDBGIC_BakeParams *params); -RADDBGI_PROC void raddbgic_bake_ctx_release(RADDBGIC_BakeCtx *bake_ctx); - -//- rjf: string baking -RADDBGI_PROC RADDBGI_U32 raddbgic_string(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 str); - -//- rjf: idx run baking -RADDBGI_PROC RADDBGI_U64 raddbgic_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count); -RADDBGI_PROC RADDBGI_U32 raddbgic_idx_run(RADDBGIC_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count); - -//- rjf: data section baking -RADDBGI_PROC RADDBGI_U32 raddbgic_dsection(RADDBGIC_Arena *arena, RADDBGIC_DSections *dss, void *data, RADDBGI_U64 size, RADDBGI_DataSectionTag tag); - -//- rjf: paths baking -RADDBGI_PROC RADDBGIC_String8 raddbgic_normal_string_from_path_node(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node); -RADDBGI_PROC void raddbgic_normal_string_from_path_node_build(RADDBGIC_Arena *arena, RADDBGIC_PathNode *node, RADDBGIC_String8List *out); -RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_new_node(RADDBGIC_BakeCtx *bctx); -RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_sub_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *dir, RADDBGIC_String8 sub_dir); -RADDBGI_PROC RADDBGIC_PathNode* raddbgic_paths_node_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path); -RADDBGI_PROC RADDBGI_U32 raddbgic_paths_idx_from_path(RADDBGIC_BakeCtx *bctx, RADDBGIC_String8 path); -RADDBGI_PROC RADDBGIC_SrcNode* raddbgic_paths_new_src_node(RADDBGIC_BakeCtx *bctx); -RADDBGI_PROC RADDBGIC_SrcNode* raddbgic_paths_src_node_from_path_node(RADDBGIC_BakeCtx *bctx, RADDBGIC_PathNode *path_node); - -//- rjf: per-unit line info baking -RADDBGI_PROC RADDBGIC_UnitLinesCombined* raddbgic_unit_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_BakeCtx *bctx, RADDBGIC_LineSequenceNode *first_seq); - -//- rjf: per-src line info baking -RADDBGI_PROC RADDBGIC_SrcLinesCombined* raddbgic_source_combine_lines(RADDBGIC_Arena *arena, RADDBGIC_LineMapFragment *first); - -//- rjf: vmap baking -RADDBGI_PROC RADDBGIC_VMap* raddbgic_vmap_from_markers(RADDBGIC_Arena *arena, RADDBGIC_VMapMarker *markers, RADDBGIC_SortKey *keys, RADDBGI_U64 marker_count); -RADDBGI_PROC RADDBGIC_VMap* raddbgic_vmap_from_unit_ranges(RADDBGIC_Arena *arena, RADDBGIC_UnitVMapRange *first, RADDBGI_U64 count); - -//- rjf: type info baking -RADDBGI_PROC RADDBGI_U32* raddbgic_idx_run_from_types(RADDBGIC_Arena *arena, RADDBGIC_Type **types, RADDBGI_U32 count); -RADDBGI_PROC RADDBGIC_TypeData* raddbgic_type_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx); - -//- rjf: symbol data baking -RADDBGI_PROC RADDBGIC_SymbolData* raddbgic_symbol_data_combine(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx); - -//- rjf: name map baking -RADDBGI_PROC RADDBGIC_NameMapBaked* raddbgic_name_map_bake(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_BakeCtx *bctx, RADDBGIC_NameMap *map); - -//- rjf: top-level baking entry point -RADDBGI_PROC void raddbgic_bake_file(RADDBGIC_Arena *arena, RADDBGIC_Root *root, RADDBGIC_String8List *out); - -#endif // RADDBGI_CONS_H diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c new file mode 100644 index 00000000..e55f79b3 --- /dev/null +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -0,0 +1,3673 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: API Implementation Helper Macros + +#define rdim_require(root, b32, else_code, error_msg) do { if(!(b32)) {rdim_push_error((root), (error_msg)); else_code;} }while(0) +#define rdim_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {rdim_push_errorf((root), (fmt), __VA_ARGS__); else_code;} }while(0) + +//////////////////////////////// +//~ rjf: Basic Helpers + +//- rjf: memory set + +#if !defined(RDIM_MEMSET_OVERRIDE) +RADDBGI_PROC void * +rdim_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size) +{ + for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + { + ((RADDBGI_U8 *)dst)[idx] = c; + } + return dst; +} +#endif + +#if !defined(RDIM_MEMCPY_OVERRIDE) +RADDBGI_PROC void * +rdim_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size) +{ + for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + { + ((RADDBGI_U8 *)dst)[idx] = ((RADDBGI_U8 *)src)[idx]; + } + return dst; +} +#endif + +//- rjf: arenas + +#if !defined (RDIM_ARENA_OVERRIDE) + +RADDBGI_PROC RDIM_Arena * +rdim_arena_alloc_fallback(void) +{ + RDIM_Arena *arena = 0; + return arena; +} + +RADDBGI_PROC void +rdim_arena_release_fallback(RDIM_Arena *arena) +{ + +} + +RADDBGI_PROC RADDBGI_U64 +rdim_arena_pos_fallback(RDIM_Arena *arena) +{ + return 0; +} + +RADDBGI_PROC void * +rdim_arena_push_fallback(RDIM_Arena *arena, RADDBGI_U64 size) +{ + return 0; +} + +RADDBGI_PROC void +rdim_arena_pop_to_fallback(RDIM_Arena *arena, RADDBGI_U64 pos) +{ + +} + +#endif + +//- rjf: thread-local scratch arenas + +#if !defined (RDIM_SCRATCH_OVERRIDE) +static RDIM_THREAD_LOCAL RDIM_Arena *rdim_thread_scratches[2]; + +RADDBGI_PROC RDIM_Temp +rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RADDBGI_U64 conflicts_count) +{ + if(rdim_thread_scratches[0] == 0) + { + rdim_thread_scratches[0] = rdim_arena_alloc(); + rdim_thread_scratches[1] = rdim_arena_alloc(); + } + RDIM_Arena *arena = 0; + for(RADDBGI_U64 scratch_idx = 0; + scratch_idx < sizeof(rdim_thread_scratches)/sizeof(rdim_thread_scratches[0]); + scratch_idx += 1) + { + RADDBGI_S32 scratch_conflicts = 0; + for(RADDBGI_U64 conflict_idx = 0; conflict_idx < conflicts_count; conflict_idx += 1) + { + if(conflicts[conflict_idx] == rdim_thread_scratches[scratch_idx]) + { + scratch_conflicts = 1; + break; + } + } + if(!scratch_conflicts) + { + arena = rdim_thread_scratches[scratch_idx]; + } + } + RDIM_Temp temp; + temp.arena = arena; + temp.pos = rdim_arena_pos(arena); + return temp; +} + +RADDBGI_PROC void +rdim_scratch_end_fallback(RDIM_Temp temp) +{ + rdim_arena_pop_to(temp.arena, temp.pos); +} + +#endif + +//- rjf: strings + +RADDBGI_PROC RDIM_String8 +rdim_str8(RADDBGI_U8 *str, RADDBGI_U64 size) +{ + RDIM_String8 result; + result.RDIM_String8_BaseMember = str; + result.RDIM_String8_SizeMember = size; + return result; +} + +RADDBGI_PROC RDIM_String8 +rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src) +{ + RDIM_String8 dst; + dst.RDIM_String8_SizeMember = src.RDIM_String8_SizeMember; + dst.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RADDBGI_U8, dst.RDIM_String8_SizeMember+1); + rdim_memcpy(dst.RDIM_String8_BaseMember, src.RDIM_String8_BaseMember, src.RDIM_String8_SizeMember); + dst.RDIM_String8_BaseMember[dst.RDIM_String8_SizeMember] = 0; + return dst; +} + +RADDBGI_PROC RDIM_String8 +rdim_str8f(RDIM_Arena *arena, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + RDIM_String8 result = rdim_str8fv(arena, fmt, args); + va_end(args); + return(result); +} + +RADDBGI_PROC RDIM_String8 +rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args) +{ + va_list args2; + va_copy(args2, args); + RADDBGI_U32 needed_bytes = rdim_vsnprintf(0, 0, fmt, args) + 1; + RDIM_String8 result = {0}; + result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RADDBGI_U8, needed_bytes); + result.RDIM_String8_SizeMember = rdim_vsnprintf((char*)result.str, needed_bytes, fmt, args2); + result.RDIM_String8_BaseMember[result.RDIM_String8_SizeMember] = 0; + va_end(args2); + return(result); +} + +RADDBGI_PROC RADDBGI_S32 +rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags) +{ + RADDBGI_S32 result = 0; + if(a.RDIM_String8_SizeMember == b.RDIM_String8_SizeMember) + { + RADDBGI_S32 case_insensitive = (flags & RDIM_StringMatchFlag_CaseInsensitive); + RADDBGI_U64 size = a.RDIM_String8_SizeMember; + result = 1; + for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + { + RADDBGI_U8 at = a.RDIM_String8_BaseMember[idx]; + RADDBGI_U8 bt = b.RDIM_String8_BaseMember[idx]; + if(case_insensitive) + { + at = ('a' <= at && at <= 'z') ? at-('a'-'A') : at; + bt = ('a' <= bt && bt <= 'z') ? bt-('a'-'A') : bt; + } + if(at != bt) + { + result = 0; + break; + } + } + } + return result; +} + +//- rjf: string lists + +RADDBGI_PROC void +rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string) +{ + RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1); + n->RDIM_String8Node_StringMember = string; + RDIM_SLLQueuePush_N(list->RDIM_String8List_FirstMember, list->RDIM_String8List_LastMember, n, RDIM_String8Node_NextPtrMember); + list->RDIM_String8List_NodeCountMember += 1; + list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; +} + +RADDBGI_PROC RDIM_String8 +rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep) +{ + RDIM_String8 result; + rdim_memzero_struct(&result); + RADDBGI_U64 sep_count = (list->RDIM_String8List_NodeCountMember > 1) ? (list->RDIM_String8List_NodeCountMember-1) : 0; + result.RDIM_String8_SizeMember = list->RDIM_String8List_TotalSizeMember+sep_count*sep.RDIM_String8_SizeMember; + result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RADDBGI_U8, result.RDIM_String8_SizeMember+1); + RADDBGI_U64 off = 0; + for(RDIM_String8Node *node = list->RDIM_String8List_FirstMember; + node != 0; + node = node->RDIM_String8Node_NextPtrMember) + { + rdim_memcpy((RADDBGI_U8*)result.RDIM_String8_BaseMember+off, + node->RDIM_String8Node_StringMember.RDIM_String8_BaseMember, + node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember); + off += node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember; + if(sep.RDIM_String8_SizeMember != 0 && node->RDIM_String8Node_NextPtrMember != 0) + { + rdim_memcpy((RADDBGI_U8*)result.RDIM_String8_BaseMember+off, + sep.RDIM_String8_BaseMember, + sep.RDIM_String8_SizeMember); + off += sep.RDIM_String8_SizeMember; + } + } + result.RDIM_String8_BaseMember[off] = 0; + return result; +} + +//- rjf: type lists + +RADDBGI_PROC void +rdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *type) +{ + RDIM_TypeNode *node = rdim_push_array(arena, RDIM_TypeNode, 1); + RDIM_SLLQueuePush(list->first, list->last, node); + list->count += 1; + node->type = type; +} + +//- rjf: bytecode lists + +RADDBGI_PROC void +rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_EvalOp op, RADDBGI_U64 p) +{ + RADDBGI_U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; + RADDBGI_U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); + + RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1); + node->op = op; + node->p_size = p_size; + node->p = p; + + RDIM_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); + bytecode->op_count += 1; + bytecode->encoded_size += 1 + p_size; +} + +RADDBGI_PROC void +rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_U64 x) +{ + if(x <= 0xFF) + { + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, x); + } + else if(x <= 0xFFFF) + { + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, x); + } + else if(x <= 0xFFFFFFFF) + { + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, x); + } + else + { + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, x); + } +} + +RADDBGI_PROC void +rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_S64 x) +{ + if(-0x80 <= x && x <= 0x7F) + { + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, (RADDBGI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 8); + } + else if(-0x8000 <= x && x <= 0x7FFF) + { + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, (RADDBGI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 16); + } + else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) + { + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, (RADDBGI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 32); + } + else + { + rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, (RADDBGI_U64)x); + } +} + +RADDBGI_PROC void +rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed) +{ + if(right_destroyed->first_op != 0) + { + if(left_dst->first_op == 0) + { + rdim_memcpy_struct(left_dst, right_destroyed); + } + else + { + left_dst->last_op = right_destroyed->last_op; + left_dst->op_count += right_destroyed->op_count; + left_dst->encoded_size += right_destroyed->encoded_size; + } + rdim_memzero_struct(right_destroyed); + } +} + +//- rjf: sortable range sorting + +RADDBGI_PROC RDIM_SortKey* +rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count) +{ + // This sort is designed to take advantage of lots of pre-existing sorted ranges. + // Most line info is already sorted or close to already sorted. + // Similarly most vmap data has lots of pre-sorted ranges. etc. etc. + // Also - this sort should be a "stable" sort. In the use case of sorting vmap + // ranges, we want to be able to rely on order, so it needs to be preserved here. + + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + RDIM_SortKey *result = 0; + + if(count <= 1) + { + result = keys; + } + else + { + RDIM_OrderedRange *ranges_first = 0; + RDIM_OrderedRange *ranges_last = 0; + RADDBGI_U64 range_count = 0; + { + RADDBGI_U64 pos = 0; + for(;pos < count;) + { + // identify ordered range + RADDBGI_U64 first = pos; + RADDBGI_U64 opl = pos + 1; + for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); + + // generate an ordered range node + RDIM_OrderedRange *new_range = rdim_push_array(rdim_temp_arena(scratch), RDIM_OrderedRange, 1); + SLLQueuePush(ranges_first, ranges_last, new_range); + range_count += 1; + new_range->first = first; + new_range->opl = opl; + + // update pos + pos = opl; + } + } + + if(range_count == 1) + { + result = keys; + } + else + { + RDIM_SortKey *keys_swap = rdim_push_array_no_zero(arena, RDIM_SortKey, count); + RDIM_SortKey *src = keys; + RDIM_SortKey *dst = keys_swap; + RDIM_OrderedRange *src_ranges = ranges_first; + RDIM_OrderedRange *dst_ranges = 0; + RDIM_OrderedRange *dst_ranges_last = 0; + + for(;;) + { + // begin a pass + for(;;) + { + // end pass when out of ranges + if(src_ranges == 0) + { + break; + } + + // get first range + RDIM_OrderedRange *range1 = src_ranges; + SLLStackPop(src_ranges); + + // if this range is the whole array, we are done + if(range1->first == 0 && range1->opl == count) + { + result = src; + goto sort_done; + } + + // if there is not a second range, save this range for next time and end this pass + if(src_ranges == 0) + { + RADDBGI_U64 first = range1->first; + rdim_memcpy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); + SLLQueuePush(dst_ranges, dst_ranges_last, range1); + break; + } + + // get second range + RDIM_OrderedRange *range2 = src_ranges; + SLLStackPop(src_ranges); + + rdim_assert(range1->opl == range2->first); + + // merge these ranges + RADDBGI_U64 jd = range1->first; + RADDBGI_U64 j1 = range1->first; + RADDBGI_U64 j1_opl = range1->opl; + RADDBGI_U64 j2 = range2->first; + RADDBGI_U64 j2_opl = range2->opl; + for(;;) + { + if(src[j1].key <= src[j2].key) + { + rdim_memcpy(dst + jd, src + j1, sizeof(*src)); + j1 += 1; + jd += 1; + if(j1 >= j1_opl) + { + break; + } + } + else + { + rdim_memcpy(dst + jd, src + j2, sizeof(*src)); + j2 += 1; + jd += 1; + if(j2 >= j2_opl) + { + break; + } + } + } + if(j1 < j1_opl) + { + rdim_memcpy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1)); + } + else + { + rdim_memcpy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2)); + } + + // save this as one range + range1->opl = range2->opl; + SLLQueuePush(dst_ranges, dst_ranges_last, range1); + } + + // end pass by swapping buffers and range nodes + { + RDIM_SortKey *temp = src; + src = dst; + dst = temp; + } + src_ranges = dst_ranges; + dst_ranges = 0; + dst_ranges_last = 0; + } + } + } + sort_done:; + +#if 0 + // assert sortedness + for(RADDBGI_U64 i = 1; i < count; i += 1){ + rdim_assert(result[i - 1].key <= result[i].key); + } +#endif + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Auxiliary Data Structure Functions + +//- rjf: u64 -> ptr map + +RADDBGI_PROC void +rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 bucket_count) +{ + rdim_assert(IsPow2OrZero(bucket_count) && bucket_count > 0); + map->buckets = rdim_push_array(arena, RDIM_U64ToPtrNode*, bucket_count); + map->buckets_count = bucket_count; +} + +RADDBGI_PROC void +rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RDIM_U64ToPtrLookup *lookup_out) +{ + RADDBGI_U64 bucket_idx = hash&(map->buckets_count - 1); + RDIM_U64ToPtrNode *check_node = map->buckets[bucket_idx]; + for(;check_node != 0; check_node = check_node->next){ + for(RADDBGI_U32 k = 0; k < ArrayCount(check_node->key); k += 1){ + if(check_node->ptr[k] == 0){ + lookup_out->fill_node = check_node; + lookup_out->fill_k = k; + break; + } + else if(check_node->key[k] == key){ + lookup_out->match = check_node->ptr[k]; + break; + } + } + } +} + +RADDBGI_PROC void +rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr) +{ + if(lookup->fill_node != 0) + { + RDIM_U64ToPtrNode *node = lookup->fill_node; + RADDBGI_U32 k = lookup->fill_k; + node->key[k] = key; + node->ptr[k] = ptr; + } + else + { + RADDBGI_U64 bucket_idx = hash&(map->buckets_count - 1); + + RDIM_U64ToPtrNode *node = rdim_push_array(arena, RDIM_U64ToPtrNode, 1); + SLLStackPush(map->buckets[bucket_idx], node); + node->key[0] = key; + node->ptr[0] = ptr; + + lookup->fill_node = node; + lookup->fill_k = 0; + + map->pair_count += 1; + map->bucket_collision_count += (node->next != 0); + } +} + +//- rjf: string8 -> ptr map + +RADDBGI_PROC void +rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RADDBGI_U64 bucket_count) +{ + map->buckets_count = bucket_count; + map->buckets = rdim_push_array(arena, RDIM_Str8ToPtrNode*, map->buckets_count); +} + +RADDBGI_PROC void* +rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 hash) +{ + void *result = 0; + RADDBGI_U64 bucket_idx = hash%map->buckets_count; + for(RDIM_Str8ToPtrNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->hash == hash && rdim_str8_match(node->key, key, 0)) + { + result = node->ptr; + break; + } + } + return result; +} + +RADDBGI_PROC void +rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 hash, void *ptr) +{ + RADDBGI_U64 bucket_idx = hash%map->buckets_count; + RDIM_Str8ToPtrNode *node = rdim_push_array(arena, RDIM_Str8ToPtrNode, 1); + SLLStackPush(map->buckets[bucket_idx], node); + + node->key = rdim_str8_copy(arena, key); + node->hash = hash; + node->ptr = ptr; + map->bucket_collision_count += (node->next != 0); + map->pair_count += 1; +} + +//////////////////////////////// +//~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions + +//- rjf: root creation + +RADDBGI_PROC RDIM_Root* +rdim_root_alloc(RDIM_RootParams *params) +{ + RDIM_Arena *arena = rdim_arena_alloc(); + RDIM_Root *result = rdim_push_array(arena, RDIM_Root, 1); + result->arena = arena; + + // fill in root parameters + { + result->addr_size = params->addr_size; + } + + // setup singular types + { + result->nil_type = rdim_type_new(result); + result->variadic_type = rdim_type_new(result); + result->variadic_type->kind = RADDBGI_TypeKind_Variadic; + + // references to "handled nil type" should be emitted as + // references to nil - but should not generate error + // messages when they are detected - they are expected! + rdim_assert(result->nil_type->idx == result->handled_nil_type.idx); + } + + // setup a null scope + { + RDIM_Scope *scope = rdim_push_array(result->arena, RDIM_Scope, 1); + RDIM_SLLQueuePush_N(result->first_scope, result->last_scope, scope, next_order); + result->scope_count += 1; + } + + // rjf: setup null UDT + { + rdim_type_udt_from_any_type(result, result->nil_type); + } + + // initialize maps + { +#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128)) + + rdim_u64toptr_map_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); + rdim_u64toptr_map_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); + rdim_u64toptr_map_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); + rdim_u64toptr_map_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); + rdim_u64toptr_map_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); + rdim_str8toptr_map_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); + +#undef BKTCOUNT + } + + return result; +} + +RADDBGI_PROC void +rdim_root_release(RDIM_Root *root) +{ + arena_release(root->arena); +} + +//- rjf: error accumulation + +RADDBGI_PROC void +rdim_push_error(RDIM_Root *root, RDIM_String8 string) +{ + RDIM_Error *error = rdim_push_array(root->arena, RDIM_Error, 1); + SLLQueuePush(root->errors.first, root->errors.last, error); + root->errors.count += 1; + error->msg = string; +} + +RADDBGI_PROC void +rdim_push_errorf(RDIM_Root *root, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + RDIM_String8 str = rdim_str8fv(root->arena, fmt, args); + rdim_push_error(root, str); + va_end(args); +} + +RADDBGI_PROC RDIM_Error* +rdim_first_error_from_root(RDIM_Root *root) +{ + return root->errors.first; +} + +//- rjf: top-level info specification + +RADDBGI_PROC void +rdim_set_top_level_info(RDIM_Root *root, RDIM_TopLevelInfo *tli) +{ + rdim_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); + rdim_memcpy_struct(&root->top_level_info, tli); + root->top_level_info_is_set = 1; +} + +//- rjf: binary section building + +RADDBGI_PROC void +rdim_add_binary_section(RDIM_Root *root, RDIM_String8 name, RADDBGI_BinarySectionFlags flags, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, RADDBGI_U64 foff_opl) +{ + RDIM_BinarySection *sec = rdim_push_array(root->arena, RDIM_BinarySection, 1); + SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); + root->binary_section_count += 1; + sec->name = name; + sec->flags = flags; + sec->voff_first = voff_first; + sec->voff_opl = voff_opl; + sec->foff_first = foff_first; + sec->foff_opl = foff_opl; +} + +//- rjf: unit info building + +RADDBGI_PROC RDIM_Unit* +rdim_unit_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 unit_user_id, RADDBGI_U64 unit_user_id_hash) +{ + RDIM_U64ToPtrLookup lookup = {0}; + rdim_u64toptr_map_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); + RDIM_Unit *result = 0; + if(lookup.match != 0) + { + result = (RDIM_Unit*)lookup.match; + } + else + { + result = rdim_push_array(root->arena, RDIM_Unit, 1); + result->idx = root->unit_count; + RDIM_SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); + root->unit_count += 1; + rdim_u64toptr_map_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); + } + return result; +} + +RADDBGI_PROC void +rdim_unit_set_info(RDIM_Root *root, RDIM_Unit *unit, RDIM_UnitInfo *info) +{ + rdim_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); + unit->info_is_set = 1; + unit->unit_name = rdim_str8_copy(root->arena, info->unit_name); + unit->compiler_name = rdim_str8_copy(root->arena, info->compiler_name); + unit->source_file = rdim_str8_copy(root->arena, info->source_file); + unit->object_file = rdim_str8_copy(root->arena, info->object_file); + unit->archive_file = rdim_str8_copy(root->arena, info->archive_file); + unit->build_path = rdim_str8_copy(root->arena, info->build_path); + unit->language = info->language; +} + +RADDBGI_PROC void +rdim_unit_add_line_sequence(RDIM_Root *root, RDIM_Unit *unit, RDIM_LineSequence *line_sequence) +{ + RDIM_LineSequenceNode *node = rdim_push_array(root->arena, RDIM_LineSequenceNode, 1); + SLLQueuePush(unit->line_seq_first, unit->line_seq_last, node); + unit->line_seq_count += 1; + + node->line_seq.file_name = rdim_str8_copy(root->arena, line_sequence->file_name); + + node->line_seq.voffs = rdim_push_array(root->arena, RADDBGI_U64, line_sequence->line_count + 1); + rdim_memcpy(node->line_seq.voffs, line_sequence->voffs, sizeof(RADDBGI_U64)*(line_sequence->line_count + 1)); + + node->line_seq.line_nums = rdim_push_array(root->arena, RADDBGI_U32, line_sequence->line_count); + rdim_memcpy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(RADDBGI_U32)*line_sequence->line_count); + + if(line_sequence->col_nums != 0) + { + node->line_seq.col_nums = rdim_push_array(root->arena, RADDBGI_U16, line_sequence->line_count); + rdim_memcpy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(RADDBGI_U16)*line_sequence->line_count); + } + + node->line_seq.line_count = line_sequence->line_count; +} + +RADDBGI_PROC void +rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RADDBGI_U64 first, RADDBGI_U64 opl) +{ + RDIM_UnitVMapRange *node = rdim_push_array(root->arena, RDIM_UnitVMapRange, 1); + SLLQueuePush(root->unit_vmap_range_first, root->unit_vmap_range_last, node); + root->unit_vmap_range_count += 1; + node->unit = unit; + node->first = first; + node->opl = opl; +} + +//- rjf: type info lookups/reservations + +RADDBGI_PROC RDIM_Type* +rdim_type_from_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash) +{ + RDIM_U64ToPtrLookup lookup = {0}; + rdim_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); + RDIM_Type *result = (RDIM_Type*)lookup.match; + return result; +} + +RADDBGI_PROC RDIM_Reservation* +rdim_type_reserve_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash) +{ + RDIM_Reservation *result = 0; + RDIM_U64ToPtrLookup lookup = {0}; + rdim_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); + if(lookup.match == 0) + { + rdim_u64toptr_map_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); + void **slot = &lookup.fill_node->ptr[lookup.fill_k]; + result = (RDIM_Reservation*)slot; + } + return result; +} + +RADDBGI_PROC void +rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type) +{ + if(res != 0 && type != 0) + { + *(void**)res = type; + } +} + +//- rjf: nil/singleton types + +RADDBGI_PROC RADDBGI_S32 +rdim_type_is_unhandled_nil(RDIM_Root *root, RDIM_Type *type) +{ + RADDBGI_S32 result = (type->kind == RADDBGI_TypeKind_NULL && type != &root->handled_nil_type); + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_handled_nil(RDIM_Root *root) +{ + return &root->handled_nil_type; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_nil(RDIM_Root *root) +{ + return root->nil_type; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_variadic(RDIM_Root *root) +{ + return root->variadic_type; +} + +//- rjf: base type info constructors + +RADDBGI_PROC RDIM_Type* +rdim_type_new(RDIM_Root *root) +{ + RDIM_Type *result = rdim_push_array(root->arena, RDIM_Type, 1); + result->idx = root->type_count; + RDIM_SLLQueuePush_N(root->first_type, root->last_type, result, next_order); + root->type_count += 1; + return result; +} + +RADDBGI_PROC RDIM_TypeUDT* +rdim_type_udt_from_any_type(RDIM_Root *root, RDIM_Type *type) +{ + if(type->udt == 0) + { + RDIM_TypeUDT *new_udt = rdim_push_array(root->arena, RDIM_TypeUDT, 1); + new_udt->idx = root->type_udt_count; + RDIM_SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); + root->type_udt_count += 1; + new_udt->self_type = type; + type->udt = new_udt; + } + RDIM_TypeUDT *result = type->udt; + return result; +} + +RADDBGI_PROC RDIM_TypeUDT* +rdim_type_udt_from_record_type(RDIM_Root *root, RDIM_Type *type) +{ + rdim_requiref(root, (type->kind == RADDBGI_TypeKind_Struct || + type->kind == RADDBGI_TypeKind_Class || + type->kind == RADDBGI_TypeKind_Union), + return 0, + "Tried to use non-user-defined-type-kind to create user-defined-type."); + RDIM_TypeUDT *result = 0; + result = rdim_type_udt_from_any_type(root, type); + return result; +} + +//- rjf: basic/operator type construction helpers + +RADDBGI_PROC RDIM_Type* +rdim_type_basic(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name) +{ + rdim_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); + RDIM_Type *result = root->nil_type; + RDIM_Temp scratch = rdim_scratch_begin(0, 0); + + // setup construct buffer + RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(type_kind) + name.size; + RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + { + RADDBGI_U8 *ptr = buf; + // "basic" + *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Basic; + ptr += sizeof(RDIM_TypeConstructKind); + // type_kind + rdim_memcpy(ptr, &type_kind, sizeof(type_kind)); + ptr += sizeof(type_kind); + // name + rdim_memcpy(ptr, name.str, name.size); + ptr += name.size; + } + + // check for duplicate construct + RDIM_String8 blob = rdim_str8(buf, buf_size); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); + result = (RDIM_Type*)lookup_ptr; + if(result == 0) + { + // calculate size + RADDBGI_U32 byte_size = raddbgi_size_from_basic_type_kind(type_kind); + if(byte_size == 0xFFFFFFFF) + { + byte_size = root->addr_size; + } + + // setup new node + result = rdim_type_new(root); + result->kind = type_kind; + result->name = rdim_str8_copy(root->arena, name); + result->byte_size = byte_size; + + // save in construct map + rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); + + // save in name map + { + RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + rdim_name_map_add_pair(root, map, result->name, result->idx); + } + } + + scratch_end(scratch); + rdim_assert(result != 0); + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeModifierFlags flags) +{ + RDIM_Type *result = root->nil_type; + RDIM_Temp scratch = rdim_scratch_begin(0, 0); + + // setup construct buffer + RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); + RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + { + RADDBGI_U8 *ptr = buf; + // "modifier" + *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Modifier; + ptr += sizeof(RDIM_TypeConstructKind); + // flags + rdim_memcpy(ptr, &flags, sizeof(flags)); + ptr += sizeof(flags); + // direct_type->idx + rdim_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + ptr += sizeof(direct_type->idx); + } + + // check for duplicate construct + RDIM_String8 blob = rdim_str8(buf, buf_size); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); + result = (RDIM_Type*)lookup_ptr; + if(result == 0){ + + // setup new node + result = rdim_type_new(root); + result->kind = RADDBGI_TypeKind_Modifier; + result->flags = flags; + result->byte_size = direct_type->byte_size; + result->direct_type = direct_type; + + // save in construct map + rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + rdim_scratch_end(scratch); + rdim_assert(result != 0); + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count) +{ + RDIM_Type *result = root->nil_type; + RDIM_Temp scratch = rdim_scratch_begin(0, 0); + + // setup construct buffer + RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(RADDBGI_U32)*2; + RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + { + RADDBGI_U8 *ptr = buf; + // "bitfield" + *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Bitfield; + ptr += sizeof(RDIM_TypeConstructKind); + // direct_type->idx + rdim_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + ptr += sizeof(direct_type->idx); + // bit_off + rdim_memcpy(ptr, &bit_off, sizeof(bit_off)); + ptr += sizeof(bit_off); + // bit_count + rdim_memcpy(ptr, &bit_count, sizeof(bit_count)); + ptr += sizeof(bit_count); + } + + // check for duplicate construct + RDIM_String8 blob = rdim_str8(buf, buf_size); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); + result = (RDIM_Type*)lookup_ptr; + if(result == 0) + { + // setup new node + result = rdim_type_new(root); + result->kind = RADDBGI_TypeKind_Bitfield; + result->byte_size = direct_type->byte_size; + result->off = bit_off; + result->count = bit_count; + result->direct_type = direct_type; + + // save in construct map + rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + rdim_scratch_end(scratch); + rdim_assert(result != 0); + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeKind ptr_type_kind) +{ + rdim_requiref(root, (ptr_type_kind == RADDBGI_TypeKind_Ptr || + ptr_type_kind == RADDBGI_TypeKind_LRef || + ptr_type_kind == RADDBGI_TypeKind_RRef), + return root->nil_type, + "Non-pointer type kind used to construct pointer type."); + RDIM_Type *result = root->nil_type; + RDIM_Temp scratch = rdim_scratch_begin(0, 0); + + // setup construct buffer + RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); + RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + { + RADDBGI_U8 *ptr = buf; + // "pointer" + *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Pointer; + ptr += sizeof(RDIM_TypeConstructKind); + // type_kind + rdim_memcpy(ptr, &ptr_type_kind, sizeof(ptr_type_kind)); + ptr += sizeof(ptr_type_kind); + // direct_type->idx + rdim_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + ptr += sizeof(direct_type->idx); + } + + // check for duplicate construct + RDIM_String8 blob = rdim_str8(buf, buf_size); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); + result = (RDIM_Type*)lookup_ptr; + if(result == 0) + { + // setup new node + result = rdim_type_new(root); + result->kind = ptr_type_kind; + result->byte_size = root->addr_size; + result->direct_type = direct_type; + + // save in construct map + rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + rdim_scratch_end(scratch); + rdim_assert(result != 0); + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U64 count) +{ + RDIM_Type *result = root->nil_type; + RDIM_Temp scratch = rdim_scratch_begin(0, 0); + + // setup construct buffer + RADDBGI_U64 buf_size = + sizeof(RDIM_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); + RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + { + RADDBGI_U8 *ptr = buf; + // "array" + *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Array; + ptr += sizeof(RDIM_TypeConstructKind); + // direct_type->idx + rdim_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); + ptr += sizeof(direct_type->idx); + // count + rdim_memcpy(ptr, &count, sizeof(count)); + ptr += sizeof(count); + } + + // check for duplicate construct + RDIM_String8 blob = rdim_str8(buf, buf_size); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); + result = (RDIM_Type*)lookup_ptr; + if(result == 0) + { + // setup new node + result = rdim_type_new(root); + result->kind = RADDBGI_TypeKind_Array; + result->count = count; + result->direct_type = direct_type; + result->byte_size = direct_type->byte_size*count; + + // save in construct map + rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + scratch_end(scratch); + rdim_assert(result != 0); + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *params) +{ + RDIM_Type *result = root->nil_type; + RDIM_Temp scratch = rdim_scratch_begin(0, 0); + + // setup construct buffer + RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); + RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + { + RADDBGI_U8 *ptr = buf; + // "procedure" + *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Procedure; + ptr += sizeof(RDIM_TypeConstructKind); + // ret_type->idx + rdim_memcpy(ptr, &return_type->idx, sizeof(return_type->idx)); + ptr += sizeof(return_type->idx); + // (params ...)->idx + for(RDIM_TypeNode *node = params->first; + node != 0; + node = node->next) + { + rdim_memcpy(ptr, &node->type->idx, sizeof(node->type->idx)); + ptr += sizeof(node->type->idx); + } + } + + // check for duplicate construct + RDIM_String8 blob = rdim_str8(buf, buf_size); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); + result = (RDIM_Type*)lookup_ptr; + if(result == 0) + { + // setup param buffer + RDIM_Type **param_types = rdim_push_array(root->arena, RDIM_Type*, params->count); + { + RDIM_Type **ptr = param_types; + for(RDIM_TypeNode *node = params->first; + node != 0; + node = node->next) + { + *ptr = node->type; + ptr += 1; + } + } + + // setup new node + result = rdim_type_new(root); + result->kind = RADDBGI_TypeKind_Function; + result->byte_size = root->addr_size; + result->count = params->count; + result->direct_type = return_type; + result->param_types = param_types; + + // save in construct map + rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + rdim_scratch_end(scratch); + rdim_assert(result != 0); + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, struct RDIM_TypeList *params) +{ + RDIM_Type *result = root->nil_type; + RDIM_Temp scratch = rdim_scratch_begin(0, 0); + + // setup construct buffer + RADDBGI_U64 buf_size = + sizeof(RDIM_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); + RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + { + RADDBGI_U8 *ptr = buf; + // "method" + *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Method; + ptr += sizeof(RDIM_TypeConstructKind); + // ret_type->idx + rdim_memcpy(ptr, &return_type->idx, sizeof(return_type->idx)); + ptr += sizeof(return_type->idx); + // this_type->idx + rdim_memcpy(ptr, &this_type->idx, sizeof(this_type->idx)); + ptr += sizeof(this_type->idx); + // (params ...)->idx + for(RDIM_TypeNode *node = params->first; + node != 0; + node = node->next) + { + rdim_memcpy(ptr, &node->type->idx, sizeof(node->type->idx)); + ptr += sizeof(node->type->idx); + } + } + + // check for duplicate construct + RDIM_String8 blob = rdim_str8(buf, buf_size); + RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); + result = (RDIM_Type*)lookup_ptr; + if(result == 0) + { + // setup param buffer + RDIM_Type **param_types = rdim_push_array(root->arena, RDIM_Type*, params->count + 1); + { + RDIM_Type **ptr = param_types; + { + *ptr = this_type; + ptr += 1; + } + for(RDIM_TypeNode *node = params->first; + node != 0; + node = node->next) + { + *ptr = node->type; + ptr += 1; + } + } + + // setup new node + result = rdim_type_new(root); + result->kind = RADDBGI_TypeKind_Method; + result->byte_size = root->addr_size; + result->count = params->count; + result->direct_type = return_type; + result->param_types = param_types; + + // save in construct map + rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); + } + + rdim_scratch_end(scratch); + rdim_assert(result != 0); + return result; +} + +//- rjf: udt type constructors + +RADDBGI_PROC RDIM_Type* +rdim_type_udt(RDIM_Root *root, RADDBGI_TypeKind record_type_kind, RDIM_String8 name, RADDBGI_U64 size) +{ + rdim_requiref(root, (record_type_kind == RADDBGI_TypeKind_Struct || + record_type_kind == RADDBGI_TypeKind_Class || + record_type_kind == RADDBGI_TypeKind_Union), + return root->nil_type, + "Non-user-defined-type-kind used to create user-defined type."); + + // rjf: make type + RDIM_Type *result = rdim_type_new(root); + result->kind = record_type_kind; + result->byte_size = size; + result->name = rdim_str8_copy(root->arena, name); + + // rjf: save in name map + { + RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + rdim_name_map_add_pair(root, map, result->name, result->idx); + } + + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_enum(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name) +{ + // rjf: make type + RDIM_Type *result = rdim_type_new(root); + result->kind = RADDBGI_TypeKind_Enum; + result->byte_size = direct_type->byte_size; + result->name = rdim_str8_copy(root->arena, name); + result->direct_type = direct_type; + + // rjf: save in name map + { + RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + rdim_name_map_add_pair(root, map, result->name, result->idx); + } + + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_alias(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name) +{ + // rjf: make type + RDIM_Type *result = rdim_type_new(root); + result->kind = RADDBGI_TypeKind_Alias; + result->byte_size = direct_type->byte_size; + result->name = rdim_str8_copy(root->arena, name); + result->direct_type = direct_type; + + // rjf: save in name map + { + RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + rdim_name_map_add_pair(root, map, result->name, result->idx); + } + + return result; +} + +RADDBGI_PROC RDIM_Type* +rdim_type_incomplete(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name) +{ + rdim_requiref(root, (type_kind == RADDBGI_TypeKind_IncompleteStruct || + type_kind == RADDBGI_TypeKind_IncompleteClass || + type_kind == RADDBGI_TypeKind_IncompleteUnion || + type_kind == RADDBGI_TypeKind_IncompleteEnum), + return root->nil_type, + "Non-incomplete-type-kind used to create incomplete type."); + + // rjf: make type + RDIM_Type *result = rdim_type_new(root); + result->kind = type_kind; + result->name = rdim_str8_copy(root->arena, name); + + // save in name map + { + RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + rdim_name_map_add_pair(root, map, result->name, result->idx); + } + + return result; +} + +//- rjf: type member building + +RADDBGI_PROC void +rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type, RADDBGI_U32 off) +{ + RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); + if(udt != 0) + { + RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); + SLLQueuePush(udt->first_member, udt->last_member, member); + udt->member_count += 1; + root->total_member_count += 1; + member->kind = RADDBGI_MemberKind_DataField; + member->name = rdim_str8_copy(root->arena, name); + member->type = mem_type; + member->off = off; + } +} + +RADDBGI_PROC void +rdim_type_add_member_static_data(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) +{ + RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); + if(udt != 0) + { + RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); + SLLQueuePush(udt->first_member, udt->last_member, member); + udt->member_count += 1; + root->total_member_count += 1; + member->kind = RADDBGI_MemberKind_StaticData; + member->name = rdim_str8_copy(root->arena, name); + member->type = mem_type; + } +} + +RADDBGI_PROC void +rdim_type_add_member_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) +{ + RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); + if(udt != 0) + { + RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); + SLLQueuePush(udt->first_member, udt->last_member, member); + udt->member_count += 1; + root->total_member_count += 1; + member->kind = RADDBGI_MemberKind_Method; + member->name = rdim_str8_copy(root->arena, name); + member->type = mem_type; + } +} + +RADDBGI_PROC void +rdim_type_add_member_static_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) +{ + RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); + if(udt != 0) + { + RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); + SLLQueuePush(udt->first_member, udt->last_member, member); + udt->member_count += 1; + + root->total_member_count += 1; + + member->kind = RADDBGI_MemberKind_StaticMethod; + member->name = rdim_str8_copy(root->arena, name); + member->type = mem_type; + } +} + +RADDBGI_PROC void +rdim_type_add_member_virtual_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) +{ + RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); + if(udt != 0) + { + RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); + SLLQueuePush(udt->first_member, udt->last_member, member); + udt->member_count += 1; + root->total_member_count += 1; + member->kind = RADDBGI_MemberKind_VirtualMethod; + member->name = rdim_str8_copy(root->arena, name); + member->type = mem_type; + } +} + +RADDBGI_PROC void +rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RADDBGI_U32 off) +{ + RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); + if(udt != 0) + { + RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); + SLLQueuePush(udt->first_member, udt->last_member, member); + udt->member_count += 1; + root->total_member_count += 1; + member->kind = RADDBGI_MemberKind_Base; + member->type = base_type; + member->off = off; + } +} + +RADDBGI_PROC void +rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RADDBGI_U32 vptr_off, RADDBGI_U32 vtable_off) +{ + RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); + if(udt != 0) + { + RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); + SLLQueuePush(udt->first_member, udt->last_member, member); + udt->member_count += 1; + root->total_member_count += 1; + member->kind = RADDBGI_MemberKind_VirtualBase; + member->type = base_type; + // TODO(allen): what to do with the two offsets in this case? + } +} + +RADDBGI_PROC void +rdim_type_add_member_nested_type(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *nested_type) +{ + RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); + if(udt != 0) + { + RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); + SLLQueuePush(udt->first_member, udt->last_member, member); + udt->member_count += 1; + root->total_member_count += 1; + member->kind = RADDBGI_MemberKind_NestedType; + member->type = nested_type; + } +} + +RADDBGI_PROC void +rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, RADDBGI_U64 val) +{ + rdim_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); + RDIM_TypeUDT *udt = rdim_type_udt_from_any_type(root, enum_type); + if(udt != 0) + { + RDIM_TypeEnumVal *enum_val = rdim_push_array(root->arena, RDIM_TypeEnumVal, 1); + SLLQueuePush(udt->first_enum_val, udt->last_enum_val, enum_val); + udt->enum_val_count += 1; + root->total_enum_val_count += 1; + enum_val->name = rdim_str8_copy(root->arena, name); + enum_val->val = val; + } +} + +//- rjf: type source coordinate specifications +RADDBGI_PROC void +rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col) +{ + rdim_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), + return, "Tried to add source coordinates to non-user-defined type."); + RDIM_TypeUDT *udt = rdim_type_udt_from_any_type(root, defined_type); + if(udt != 0) + { + udt->source_path = rdim_str8_copy(root->arena, source_path); + udt->line = line; + udt->col = col; + } +} + +//- rjf: symbol info building + +RADDBGI_PROC RDIM_Symbol* +rdim_symbol_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 symbol_user_id, RADDBGI_U64 symbol_user_id_hash) +{ + RDIM_U64ToPtrLookup lookup = {0}; + rdim_u64toptr_map_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); + RDIM_Symbol *result = 0; + if(lookup.match != 0) + { + result = (RDIM_Symbol*)lookup.match; + } + else + { + result = rdim_push_array(root->arena, RDIM_Symbol, 1); + RDIM_SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); + root->symbol_count += 1; + rdim_u64toptr_map_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); + } + return result; +} + +RADDBGI_PROC void +rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info) +{ + // rjf: unpack + RDIM_SymbolKind kind = info->kind; + RDIM_Symbol *container_symbol = info->container_symbol; + RDIM_Type *container_type = info->container_type; + + // rjf: requirements + rdim_requiref(root, RDIM_SymbolKind_NULL == symbol->kind, return, "Symbol information set multiple times."); + rdim_requiref(root, RDIM_SymbolKind_NULL < info->kind && info->kind < RDIM_SymbolKind_COUNT, return, "Invalid symbol kind used to initialize symbol."); + rdim_requiref(root, info->type != 0, return, "Invalid type used to initialize symbol."); + rdim_requiref(root, info->container_symbol == 0 || info->container_type == 0, container_type = 0, "Symbol initialized with both a containing symbol and containing type, when only one is allowed."); + + // rjf: fill + root->symbol_kind_counts[kind] += 1; + symbol->idx = root->symbol_kind_counts[kind]; + symbol->kind = kind; + symbol->name = rdim_str8_copy(root->arena, info->name); + symbol->link_name = rdim_str8_copy(root->arena, info->link_name); + symbol->type = info->type; + symbol->is_extern = info->is_extern; + symbol->offset = info->offset; + symbol->container_symbol = container_symbol; + symbol->container_type = container_type; + + // rjf: set root scope + switch(kind) + { + default:{}break; + case RDIM_SymbolKind_GlobalVariable: + case RDIM_SymbolKind_ThreadVariable: + { + rdim_requiref(root, info->root_scope == 0, rdim_noop, "Global or thread variable initialized with root scope."); + }break; + case RDIM_SymbolKind_Procedure: + { + rdim_requiref(root, info->root_scope != 0, rdim_noop, "Procedure symbol initialized without root scope."); + symbol->root_scope = info->root_scope; + rdim_scope_recursive_set_symbol(info->root_scope, symbol); + }break; + } + + // save name map + { + RDIM_NameMap *map = 0; + switch(kind) + { + default:{}break; + case RDIM_SymbolKind_GlobalVariable: + { + map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_GlobalVariables); + }break; + case RDIM_SymbolKind_ThreadVariable: + { + map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_ThreadVariables); + }break; + case RDIM_SymbolKind_Procedure: + { + map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Procedures); + }break; + } + if(map != 0) + { + rdim_name_map_add_pair(root, map, symbol->name, symbol->idx); + } + } + + // save link name map + if(kind == RDIM_SymbolKind_Procedure && symbol->link_name.size > 0) + { + RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_LinkNameProcedures); + rdim_name_map_add_pair(root, map, symbol->link_name, symbol->idx); + } +} + +//- rjf: scope info building + +RADDBGI_PROC RDIM_Scope * +rdim_scope_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 scope_user_id, RADDBGI_U64 scope_user_id_hash) +{ + RDIM_Scope *result = 0; + RDIM_U64ToPtrLookup lookup = {0}; + rdim_u64toptr_map_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); + if(lookup.match != 0) + { + result = (RDIM_Scope*)lookup.match; + } + else + { + result = rdim_push_array(root->arena, RDIM_Scope, 1); + result->idx = root->scope_count; + RDIM_SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); + root->scope_count += 1; + rdim_u64toptr_map_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); + } + return result; +} + +RADDBGI_PROC void +rdim_scope_set_parent(RDIM_Root *root, RDIM_Scope *scope, RDIM_Scope *parent) +{ + rdim_requiref(root, scope->parent_scope == 0, return, "Scope parent set multiple times."); + rdim_requiref(root, parent != 0, return, "Tried to set invalid parent as scope parent."); + scope->symbol = parent->symbol; + scope->parent_scope = parent; + RDIM_SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); +} + +RADDBGI_PROC void +rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl) +{ + RDIM_VOffRange *range = rdim_push_array(root->arena, RDIM_VOffRange, 1); + SLLQueuePush(scope->first_range, scope->last_range, range); + scope->range_count += 1; + range->voff_first = voff_first; + range->voff_opl = voff_opl; + scope->voff_base = Min(scope->voff_base, voff_first); + root->scope_voff_count += 2; +} + +RADDBGI_PROC void +rdim_scope_recursive_set_symbol(RDIM_Scope *scope, RDIM_Symbol *symbol) +{ + scope->symbol = symbol; + for(RDIM_Scope *node = scope->first_child; + node != 0; + node = node->next_sibling) + { + rdim_scope_recursive_set_symbol(node, symbol); + } +} + +//- rjf: local info building + +RADDBGI_PROC RDIM_Local* +rdim_local_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 local_user_id, RADDBGI_U64 local_user_id_hash) +{ + RDIM_Local *result = 0; + RDIM_U64ToPtrLookup lookup = {0}; + rdim_u64toptr_map_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); + if(lookup.match != 0) + { + result = (RDIM_Local*)lookup.match; + } + else + { + result = rdim_push_array(root->arena, RDIM_Local, 1); + rdim_u64toptr_map_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); + } + return result; +} + +RADDBGI_PROC void +rdim_local_set_basic_info(RDIM_Root *root, RDIM_Local *local, RDIM_LocalInfo *info) +{ + rdim_requiref(root, local->kind == RADDBGI_LocalKind_NULL, return, "Local information set multiple times."); + rdim_requiref(root, info->scope != 0, return, "Tried to set invalid scope as local's containing scope."); + rdim_requiref(root, RADDBGI_LocalKind_NULL < info->kind && info->kind < RADDBGI_LocalKind_COUNT, return, "Invalid local kind."); + rdim_requiref(root, info->type != 0, return, "Tried to set invalid type as local's type."); + RDIM_Scope *scope = info->scope; + SLLQueuePush(scope->first_local, scope->last_local, local); + scope->local_count += 1; + root->local_count += 1; + local->kind = info->kind; + local->name = rdim_str8_copy(root->arena, info->name); + local->type = info->type; +} + +RADDBGI_PROC RDIM_LocationSet* +rdim_location_set_from_local(RDIM_Root *root, RDIM_Local *local) +{ + RDIM_LocationSet *result = local->locset; + if(result == 0) + { + local->locset = rdim_push_array(root->arena, RDIM_LocationSet, 1); + result = local->locset; + } + return result; +} + +//- rjf: location info building + +RADDBGI_PROC void +rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RDIM_Location *location) +{ + RDIM_LocationCase *location_case = rdim_push_array(root->arena, RDIM_LocationCase, 1); + SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); + locset->location_case_count += 1; + root->location_count += 1; + location_case->voff_first = voff_first; + location_case->voff_opl = voff_opl; + location_case->location = location; +} + +RADDBGI_PROC RDIM_Location* +rdim_location_addr_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode) +{ + RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); + result->kind = RADDBGI_LocationKind_AddrBytecodeStream; + result->bytecode = *bytecode; + return result; +} + +RADDBGI_PROC RDIM_Location* +rdim_location_val_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode) +{ + RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); + result->kind = RADDBGI_LocationKind_ValBytecodeStream; + result->bytecode = *bytecode; + return result; +} + +RADDBGI_PROC RDIM_Location* +rdim_location_addr_reg_plus_u16(RDIM_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset) +{ + RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); + result->kind = RADDBGI_LocationKind_AddrRegisterPlusU16; + result->register_code = reg_code; + result->offset = offset; + return result; +} + +RADDBGI_PROC RDIM_Location* +rdim_location_addr_addr_reg_plus_u16(RDIM_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset) +{ + RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); + result->kind = RADDBGI_LocationKind_AddrAddrRegisterPlusU16; + result->register_code = reg_code; + result->offset = offset; + return result; +} + +RADDBGI_PROC RDIM_Location* +rdim_location_val_reg(RDIM_Root *root, RADDBGI_U8 reg_code) +{ + RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); + result->kind = RADDBGI_LocationKind_ValRegister; + result->register_code = reg_code; + return result; +} + +//- rjf: name map building + +RADDBGI_PROC RDIM_NameMap* +rdim_name_map_for_kind(RDIM_Root *root, RADDBGI_NameMapKind kind) +{ + RDIM_NameMap *result = 0; + if(kind < RADDBGI_NameMapKind_COUNT) + { + if(root->name_maps[kind] == 0) + { + root->name_maps[kind] = rdim_push_array(root->arena, RDIM_NameMap, 1); + root->name_maps[kind]->buckets_count = 16384; + root->name_maps[kind]->buckets = rdim_push_array(root->arena, RDIM_NameMapNode *, root->name_maps[kind]->buckets_count); + } + result = root->name_maps[kind]; + } + return result; +} + +RADDBGI_PROC void +rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 string, RADDBGI_U32 idx) +{ + // hash + RADDBGI_U64 hash = raddbgi_hash(string.str, string.size); + RADDBGI_U64 bucket_idx = hash%map->buckets_count; + + // find existing name node + RDIM_NameMapNode *match = 0; + for(RDIM_NameMapNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->bucket_next) + { + if(rdim_str8_match(string, node->string, 0)) + { + match = node; + break; + } + } + + // make name node if necessary + if(match == 0) + { + match = rdim_push_array(root->arena, RDIM_NameMapNode, 1); + match->string = rdim_str8_copy(root->arena, string); + RDIM_SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); + RDIM_SLLQueuePush_N(map->first, map->last, match, order_next); + map->name_count += 1; + map->bucket_collision_count += (match->bucket_next != 0); + } + + // find existing idx + RADDBGI_S32 existing_idx = 0; + for(RDIM_NameMapIdxNode *node = match->idx_first; + node != 0; + node = node->next) + { + for(RADDBGI_U32 i = 0; i < ArrayCount(node->idx); i += 1) + { + if(node->idx[i] == 0) + { + break; + } + if(node->idx[i] == idx) + { + existing_idx = 1; + break; + } + } + } + + // insert new idx if necessary + if(!existing_idx) + { + RDIM_NameMapIdxNode *idx_node = match->idx_last; + RADDBGI_U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); + if(insert_i == 0) + { + idx_node = rdim_push_array(root->arena, RDIM_NameMapIdxNode, 1); + SLLQueuePush(match->idx_first, match->idx_last, idx_node); + } + + idx_node->idx[insert_i] = idx; + match->idx_count += 1; + } +} + +//////////////////////////////// +//~ rjf: Debug Info Baking (Loose -> Tight) Functions + +//- rjf: bake context construction + +RADDBGI_PROC RDIM_BakeCtx* +rdim_bake_ctx_begin(RDIM_BakeParams *params) +{ + RDIM_Arena *arena = rdim_arena_alloc(); + RDIM_BakeCtx *result = rdim_push_array(arena, RDIM_BakeCtx, 1); + result->arena = arena; +#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) + result->strs.buckets_count = BKTCOUNT(params->strings_bucket_count); + result->idxs.buckets_count = BKTCOUNT(params->idx_runs_bucket_count); +#undef BKTCOUNT + result->strs.buckets = rdim_push_array(arena, RDIM_StringNode *, result->strs.buckets_count); + result->idxs.buckets = rdim_push_array(arena, RDIM_IdxRunNode *, result->idxs.buckets_count); + + rdim_string(result, rdim_str8_lit("")); + rdim_idx_run(result, 0, 0); + + result->tree = rdim_push_array(arena, RDIM_PathTree, 1); + { + RDIM_PathNode *nil_path_node = rdim_paths_new_node(result); + nil_path_node->name = rdim_str8_lit(""); + RDIM_SrcNode *nil_src_node = rdim_paths_new_src_node(result); + nil_src_node->path_node = nil_path_node; + nil_src_node->normal_full_path = rdim_str8_lit(""); + nil_path_node->src_file = nil_src_node; + } + + return result; +} + +RADDBGI_PROC void +rdim_bake_ctx_release(RDIM_BakeCtx *bake_ctx) +{ + arena_release(bake_ctx->arena); +} + +//- rjf: string baking + +RADDBGI_PROC RADDBGI_U32 +rdim_string(RDIM_BakeCtx *bctx, RDIM_String8 str) +{ + RDIM_Arena *arena = bctx->arena; + RDIM_Strings *strs = &bctx->strs; + RADDBGI_U64 hash = raddbgi_hash(str.str, str.size); + RADDBGI_U64 bucket_idx = hash%strs->buckets_count; + + // look for a match + RDIM_StringNode *match = 0; + for(RDIM_StringNode *node = strs->buckets[bucket_idx]; + node != 0; + node = node->bucket_next) + { + if(node->hash == hash && rdim_str8_match(node->str, str, 0)) + { + match = node; + break; + } + } + + // insert new node if no match + if(match == 0) + { + RDIM_StringNode *node = rdim_push_array_no_zero(arena, RDIM_StringNode, 1); + node->str = rdim_str8_copy(arena, str); + node->hash = hash; + node->idx = strs->count; + strs->count += 1; + RDIM_SLLQueuePush_N(strs->order_first, strs->order_last, node, order_next); + RDIM_SLLStackPush_N(strs->buckets[bucket_idx], node, bucket_next); + match = node; + strs->bucket_collision_count += (node->bucket_next != 0); + } + + // extract idx to return + rdim_assert(match != 0); + RADDBGI_U32 result = match->idx; + return result; +} + +//- rjf: idx run baking + +RADDBGI_PROC RADDBGI_U64 +rdim_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count) +{ + RADDBGI_U64 hash = 5381; + RADDBGI_U32 *ptr = idx_run; + RADDBGI_U32 *opl = idx_run + count; + for(;ptr < opl; ptr += 1) + { + hash = ((hash << 5) + hash) + (*ptr); + } + return(hash); +} + +RADDBGI_PROC RADDBGI_U32 +rdim_idx_run(RDIM_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count) +{ + RDIM_Arena *arena = bctx->arena; + RDIM_IdxRuns *idxs = &bctx->idxs; + + RADDBGI_U64 hash = rdim_idx_run_hash(idx_run, count); + RADDBGI_U64 bucket_idx = hash%idxs->buckets_count; + + // look for a match + RDIM_IdxRunNode *match = 0; + for(RDIM_IdxRunNode *node = idxs->buckets[bucket_idx]; + node != 0; + node = node->bucket_next) + { + if(node->hash == hash) + { + RADDBGI_S32 is_match = 1; + RADDBGI_U32 *node_idx = node->idx_run; + for(RADDBGI_U32 i = 0; i < count; i += 1) + { + if(node_idx[i] != idx_run[i]) + { + is_match = 0; + break; + } + } + if(is_match) + { + match = node; + break; + } + } + } + + // insert new node if no match + if(match == 0) + { + RDIM_IdxRunNode *node = rdim_push_array_no_zero(arena, RDIM_IdxRunNode, 1); + RADDBGI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RADDBGI_U32, count); + for(RADDBGI_U32 i = 0; i < count; i += 1) + { + idx_run_copy[i] = idx_run[i]; + } + node->idx_run = idx_run_copy; + node->hash = hash; + node->count = count; + node->first_idx = idxs->idx_count; + idxs->count += 1; + idxs->idx_count += count; + RDIM_SLLQueuePush_N(idxs->order_first, idxs->order_last, node, order_next); + RDIM_SLLStackPush_N(idxs->buckets[bucket_idx], node, bucket_next); + match = node; + idxs->bucket_collision_count += (node->bucket_next != 0); + } + + // extract idx to return + rdim_assert(match != 0); + RADDBGI_U32 result = match->first_idx; + return result; +} + +//- rjf: data section baking + +RADDBGI_PROC RADDBGI_U32 +rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RADDBGI_U64 size, RADDBGI_DataSectionTag tag) +{ + RADDBGI_U32 result = dss->count; + RDIM_DSectionNode *node = rdim_push_array(arena, RDIM_DSectionNode, 1); + SLLQueuePush(dss->first, dss->last, node); + node->data = data; + node->size = size; + node->tag = tag; + dss->count += 1; + return result; +} + +//- rjf: paths baking + +RADDBGI_PROC RDIM_String8 +rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + RDIM_String8List list = {0}; + if(node != 0) + { + rdim_normal_string_from_path_node_build(scratch.arena, node, &list); + } + RDIM_String8 result = rdim_str8_list_join(arena, &list, rdim_str8_lit("/")); + { + RADDBGI_U8 *ptr = result.str; + RADDBGI_U8 *opl = result.str + result.size; + for(; ptr < opl; ptr += 1) + { + RADDBGI_U8 c = *ptr; + if('A' <= c && c <= 'Z') { c += 'a' - 'A'; } + *ptr = c; + } + } + scratch_end(scratch); + return result; +} + +RADDBGI_PROC void +rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out) +{ + // TODO(rjf): why is this recursive... + if(node->parent != 0) + { + rdim_normal_string_from_path_node_build(arena, node->parent, out); + } + if(node->name.size > 0) + { + rdim_str8_list_push(arena, out, node->name); + } +} + +RADDBGI_PROC RDIM_PathNode* +rdim_paths_new_node(RDIM_BakeCtx *bctx) +{ + RDIM_PathTree *tree = bctx->tree; + RDIM_PathNode *result = rdim_push_array(bctx->arena, RDIM_PathNode, 1); + RDIM_SLLQueuePush_N(tree->first, tree->last, result, next_order); + result->idx = tree->count; + tree->count += 1; + return result; +} + +RADDBGI_PROC RDIM_PathNode* +rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir) +{ + // look for existing match + RDIM_PathNode *match = 0; + for(RDIM_PathNode *node = dir->first_child; + node != 0; + node = node->next_sibling) + { + if(rdim_str8_match(node->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) + { + match = node; + break; + } + } + + // construct new node if no match + RDIM_PathNode *new_node = 0; + if(match == 0){ + new_node = rdim_paths_new_node(bctx); + new_node->parent = dir; + RDIM_SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); + new_node->name = rdim_str8_copy(bctx->arena, sub_dir); + } + + // select result from the two paths + RDIM_PathNode *result = match; + if(match == 0){ + result = new_node; + } + + return result; +} + +RADDBGI_PROC RDIM_PathNode* +rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path) +{ + RDIM_PathNode *node_cursor = &bctx->tree->root; + + RADDBGI_U8 *ptr = path.str; + RADDBGI_U8 *opl = path.str + path.size; + for(;ptr < opl;){ + // skip past slashes + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + + // save beginning of non-slash range + RADDBGI_U8 *range_first = ptr; + + // skip past non-slashes + for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); + + // if range is non-empty advance the node cursor + if(range_first < ptr){ + RDIM_String8 sub_dir = rdim_str8(range_first, (RADDBGI_U64)(ptr-range_first)); + node_cursor = rdim_paths_sub_path(bctx, node_cursor, sub_dir); + } + } + + RDIM_PathNode *result = node_cursor; + return result; +} + +RADDBGI_PROC RADDBGI_U32 +rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path) +{ + RDIM_PathNode *node = rdim_paths_node_from_path(bctx, path); + RADDBGI_U32 result = node->idx; + return result; +} + +RADDBGI_PROC RDIM_SrcNode* +rdim_paths_new_src_node(RDIM_BakeCtx *bctx) +{ + RDIM_PathTree *tree = bctx->tree; + RDIM_SrcNode *result = rdim_push_array(bctx->arena, RDIM_SrcNode, 1); + SLLQueuePush(tree->src_first, tree->src_last, result); + result->idx = tree->src_count; + tree->src_count += 1; + return result; +} + +RADDBGI_PROC RDIM_SrcNode* +rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node) +{ + RDIM_SrcNode *result = path_node->src_file; + if(result == 0) + { + RDIM_SrcNode *new_node = rdim_paths_new_src_node(bctx); + new_node->path_node = path_node; + new_node->normal_full_path = rdim_normal_string_from_path_node(bctx->arena, path_node); + result = path_node->src_file = new_node; + } + return result; +} + +//- rjf: per-unit line info baking + +RADDBGI_PROC RDIM_UnitLinesCombined* +rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequenceNode *first_seq) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // gather up all line info into two arrays + // keys: sortable array; pairs voffs with line info records; null records are sequence enders + // recs: contains all the source coordinates for a range of voffs + RADDBGI_U64 line_count = 0; + RADDBGI_U64 seq_count = 0; + for(RDIM_LineSequenceNode *node = first_seq; + node != 0; + node = node->next) + { + seq_count += 1; + line_count += node->line_seq.line_count; + } + + RADDBGI_U64 key_count = line_count + seq_count; + RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); + RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); + + { + RDIM_SortKey *key_ptr = line_keys; + RDIM_LineRec *rec_ptr = line_recs; + + for(RDIM_LineSequenceNode *node = first_seq; + node != 0; + node = node->next) + { + RDIM_PathNode *src_path = + rdim_paths_node_from_path(bctx, node->line_seq.file_name); + RDIM_SrcNode *src_file = rdim_paths_src_node_from_path_node(bctx, src_path); + RADDBGI_U32 file_id = src_file->idx; + + RADDBGI_U64 node_line_count = node->line_seq.line_count; + for(RADDBGI_U64 i = 0; i < node_line_count; i += 1){ + key_ptr->key = node->line_seq.voffs[i]; + key_ptr->val = rec_ptr; + key_ptr += 1; + + rec_ptr->file_id = file_id; + rec_ptr->line_num = node->line_seq.line_nums[i]; + if(node->line_seq.col_nums != 0){ + rec_ptr->col_first = node->line_seq.col_nums[i*2]; + rec_ptr->col_opl = node->line_seq.col_nums[i*2 + 1]; + } + rec_ptr += 1; + } + + key_ptr->key = node->line_seq.voffs[node_line_count]; + key_ptr->val = 0; + key_ptr += 1; + + RDIM_LineMapFragment *fragment = rdim_push_array(arena, RDIM_LineMapFragment, 1); + RDIM_SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); + fragment->sequence = node; + } + } + + // sort + RDIM_SortKey *sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); + + // TODO(allen): do a pass over sorted keys to make sure duplicate keys are sorted with + // null record first, and no more than one null record and one non-null record + + // arrange output + RADDBGI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RADDBGI_U64, key_count + 1); + RADDBGI_Line *arranged_lines = rdim_push_array_no_zero(arena, RADDBGI_Line, key_count); + + for(RADDBGI_U64 i = 0; i < key_count; i += 1){ + arranged_voffs[i] = sorted_line_keys[i].key; + } + arranged_voffs[key_count] = ~0ull; + for(RADDBGI_U64 i = 0; i < key_count; i += 1){ + RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; + if(rec != 0){ + arranged_lines[i].file_idx = rec->file_id; + arranged_lines[i].line_num = rec->line_num; + } + else{ + arranged_lines[i].file_idx = 0; + arranged_lines[i].line_num = 0; + } + } + + RDIM_UnitLinesCombined *result = rdim_push_array(arena, RDIM_UnitLinesCombined, 1); + result->voffs = arranged_voffs; + result->lines = arranged_lines; + result->cols = 0; + result->line_count = key_count; + + scratch_end(scratch); + return result; +} + +//- rjf: per-src line info baking + +RADDBGI_PROC RDIM_SrcLinesCombined* +rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // gather line number map + RDIM_SrcLineMapBucket *first_bucket = 0; + RDIM_SrcLineMapBucket *last_bucket = 0; + RADDBGI_U64 line_hash_slots_count = 1024; + RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); + RADDBGI_U64 line_count = 0; + RADDBGI_U64 voff_count = 0; + RADDBGI_U64 max_line_num = 0; + { + for(RDIM_LineMapFragment *map_fragment = first; + map_fragment != 0; + map_fragment = map_fragment->next) + { + RDIM_LineSequence *sequence = &map_fragment->sequence->line_seq; + + RADDBGI_U64 *seq_voffs = sequence->voffs; + RADDBGI_U32 *seq_line_nums = sequence->line_nums; + RADDBGI_U64 seq_line_count = sequence->line_count; + for(RADDBGI_U64 i = 0; i < seq_line_count; i += 1){ + RADDBGI_U32 line_num = seq_line_nums[i]; + RADDBGI_U64 voff = seq_voffs[i]; + RADDBGI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; + + // update unique voff counter & max line number + voff_count += 1; + max_line_num = Max(max_line_num, line_num); + + // find match + RDIM_SrcLineMapBucket *match = 0; + { + for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + node != 0; + node = node->hash_next){ + if(node->line_num == line_num){ + match = node; + break; + } + } + } + + // introduce new line if no match + if(match == 0){ + match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); + RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); + RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); + match->line_num = line_num; + line_count += 1; + } + + // insert new voff + { + RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); + RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); + match->voff_count += 1; + block->voff = voff; + } + } + } + } + + // bake sortable keys array + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); + { + RDIM_SortKey *key_ptr = keys; + for(RDIM_SrcLineMapBucket *node = first_bucket; + node != 0; + node = node->order_next, key_ptr += 1){ + key_ptr->key = node->line_num; + key_ptr->val = node; + } + } + + // sort + RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); + + // bake result + RADDBGI_U32 *line_nums = rdim_push_array_no_zero(arena, RADDBGI_U32, line_count); + RADDBGI_U32 *line_ranges = rdim_push_array_no_zero(arena, RADDBGI_U32, line_count + 1); + RADDBGI_U64 *voffs = rdim_push_array_no_zero(arena, RADDBGI_U64, voff_count); + { + RADDBGI_U64 *voff_ptr = voffs; + for(RADDBGI_U32 i = 0; i < line_count; i += 1){ + line_nums[i] = sorted_keys[i].key; + line_ranges[i] = (RADDBGI_U32)(voff_ptr - voffs); + RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; + for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; + node != 0; + node = node->next){ + *voff_ptr = node->voff; + voff_ptr += 1; + } + } + line_ranges[line_count] = voff_count; + } + + RDIM_SrcLinesCombined *result = rdim_push_array(arena, RDIM_SrcLinesCombined, 1); + result->line_nums = line_nums; + result->line_ranges = line_ranges; + result->line_count = line_count; + result->voffs = voffs; + result->voff_count = voff_count; + + scratch_end(scratch); + return result; +} + +//- rjf: vmap baking +RADDBGI_PROC RDIM_VMap* +rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RADDBGI_U64 marker_count) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // sort markers + RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, marker_count); + + // determine if an extra vmap entry for zero is needed + RADDBGI_U32 extra_vmap_entry = 0; + if(marker_count > 0 && sorted_keys[0].key != 0){ + extra_vmap_entry = 1; + } + + // fill output vmap entries + RADDBGI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; + RADDBGI_VMapEntry *vmap = rdim_push_array_no_zero(arena, RADDBGI_VMapEntry, vmap_count_raw + 1); + RADDBGI_U32 vmap_entry_count_pass_1 = 0; + + { + RADDBGI_VMapEntry *vmap_ptr = vmap; + + if(extra_vmap_entry){ + vmap_ptr->voff = 0; + vmap_ptr->idx = 0; + vmap_ptr += 1; + } + + RDIM_VMapRangeTracker *tracker_stack = 0; + RDIM_VMapRangeTracker *tracker_free = 0; + + RDIM_SortKey *key_ptr = sorted_keys; + RDIM_SortKey *key_opl = sorted_keys + marker_count; + for(;key_ptr < key_opl;){ + // get initial map state from tracker stack + RADDBGI_U32 initial_idx = (RADDBGI_U32)0xffffffff; + if(tracker_stack != 0){ + initial_idx = tracker_stack->idx; + } + + // update tracker stack + // * we must process _all_ of the changes that apply at this voff before moving on + RADDBGI_U64 voff = key_ptr->key; + + for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ + RDIM_VMapMarker *marker = (RDIM_VMapMarker*)key_ptr->val; + RADDBGI_U32 idx = marker->idx; + + // push to stack + if(marker->begin_range){ + RDIM_VMapRangeTracker *new_tracker = tracker_free; + if(new_tracker != 0){ + RDIM_SLLStackPop(tracker_free); + } + else{ + new_tracker = rdim_push_array(scratch.arena, RDIM_VMapRangeTracker, 1); + } + RDIM_SLLStackPush(tracker_stack, new_tracker); + new_tracker->idx = idx; + } + + // pop matching node from stack (not always the top) + else{ + RDIM_VMapRangeTracker **ptr_in = &tracker_stack; + RDIM_VMapRangeTracker *match = 0; + for(RDIM_VMapRangeTracker *node = tracker_stack; + node != 0;){ + if(node->idx == idx){ + match = node; + break; + } + ptr_in = &node->next; + node = node->next; + } + if(match != 0){ + *ptr_in = match->next; + RDIM_SLLStackPush(tracker_free, match); + } + } + } + + // get final map state from tracker stack + RADDBGI_U32 final_idx = 0; + if(tracker_stack != 0){ + final_idx = tracker_stack->idx; + } + + // if final is different from initial - emit new vmap entry + if(final_idx != initial_idx){ + vmap_ptr->voff = voff; + vmap_ptr->idx = final_idx; + vmap_ptr += 1; + } + } + + vmap_entry_count_pass_1 = (RADDBGI_U32)(vmap_ptr - vmap); + } + + // replace zero unit indexes that follow a non-zero + // TODO(rjf): 0 *is* a real unit index right now + if(0) + { + // (the last entry is not replaced because it acts as a terminator) + RADDBGI_U32 last = vmap_entry_count_pass_1 - 1; + + RADDBGI_VMapEntry *vmap_ptr = vmap; + RADDBGI_U64 real_idx = 0; + + for(RADDBGI_U32 i = 0; i < last; i += 1, vmap_ptr += 1){ + // is this a zero after a real index? + if(vmap_ptr->idx == 0){ + vmap_ptr->idx = real_idx; + } + + // remember a real index + else{ + real_idx = vmap_ptr->idx; + } + } + } + + // combine duplicate neighbors + RADDBGI_U32 vmap_entry_count = 0; + { + RADDBGI_VMapEntry *vmap_ptr = vmap; + RADDBGI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; + RADDBGI_VMapEntry *vmap_out = vmap; + + for(;vmap_ptr < vmap_opl;){ + RADDBGI_VMapEntry *vmap_range_first = vmap_ptr; + RADDBGI_U64 idx = vmap_ptr->idx; + vmap_ptr += 1; + for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; + rdim_memcpy_struct(vmap_out, vmap_range_first); + vmap_out += 1; + } + + vmap_entry_count = (RADDBGI_U32)(vmap_out - vmap); + } + + // fill result + RDIM_VMap *result = rdim_push_array(arena, RDIM_VMap, 1); + result->vmap = vmap; + result->count = vmap_entry_count - 1; + + rdim_scratch_end(scratch); + + return result; +} + +RADDBGI_PROC RDIM_VMap* +rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RADDBGI_U64 count) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // count necessary markers + RADDBGI_U64 marker_count = count*2; + + // fill markers + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + for(RDIM_UnitVMapRange *range = first; + range != 0; + range = range->next){ + if(range->first < range->opl){ + RADDBGI_U32 unit_idx = range->unit->idx; + + key_ptr->key = range->first; + key_ptr->val = marker_ptr; + marker_ptr->idx = unit_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = range->opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = unit_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + } + + // construct vmap + RDIM_VMap *result = rdim_vmap_from_markers(arena, markers, keys, marker_count); + rdim_scratch_end(scratch); + return result; +} + +//- rjf: type info baking + +RADDBGI_PROC RADDBGI_U32* +rdim_idx_run_from_types(RDIM_Arena *arena, RDIM_Type **types, RADDBGI_U32 count) +{ + RADDBGI_U32 *result = rdim_push_array(arena, RADDBGI_U32, count); + for(RADDBGI_U32 i = 0; i < count; i += 1){ + result[i] = types[i]->idx; + } + return result; +} + +RADDBGI_PROC RDIM_TypeData* +rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // fill type nodes + RADDBGI_U32 type_count = root->type_count; + RADDBGI_TypeNode *type_nodes = rdim_push_array_no_zero(arena, RADDBGI_TypeNode, type_count); + + { + RADDBGI_TypeNode *ptr = type_nodes; + RADDBGI_TypeNode *opl = ptr + type_count; + RDIM_Type *loose_type = root->first_type; + for(;loose_type != 0 && ptr < opl; + loose_type = loose_type->next_order, ptr += 1){ + + RADDBGI_TypeKind kind = loose_type->kind; + + // shared + ptr->kind = kind; + ptr->flags = loose_type->flags; + ptr->byte_size = loose_type->byte_size; + + // built-in + if(RADDBGI_TypeKind_FirstBuiltIn <= kind && kind <= RADDBGI_TypeKind_LastBuiltIn){ + ptr->built_in.name_string_idx = rdim_string(bctx, loose_type->name); + } + + // constructed + else if(RADDBGI_TypeKind_FirstConstructed <= kind && kind <= RADDBGI_TypeKind_LastConstructed){ + ptr->constructed.direct_type_idx = loose_type->direct_type->idx; + + switch (kind){ + case RADDBGI_TypeKind_Array: + { + ptr->constructed.count = loose_type->count; + }break; + + case RADDBGI_TypeKind_Function: + { + // parameters + RADDBGI_U32 count = loose_type->count; + RADDBGI_U32 *idx_run = rdim_idx_run_from_types(scratch.arena, loose_type->param_types, count); + ptr->constructed.param_idx_run_first = rdim_idx_run(bctx, idx_run, count); + ptr->constructed.count = count; + }break; + + case RADDBGI_TypeKind_Method: + { + // parameters + RADDBGI_U32 count = loose_type->count; + RADDBGI_U32 *idx_run = rdim_idx_run_from_types(scratch.arena, loose_type->param_types, count); + ptr->constructed.param_idx_run_first = rdim_idx_run(bctx, idx_run, count); + ptr->constructed.count = count; + }break; + } + } + + // user-defined + else if(RADDBGI_TypeKind_FirstUserDefined <= kind && kind <= RADDBGI_TypeKind_LastUserDefined){ + ptr->user_defined.name_string_idx = rdim_string(bctx, loose_type->name); + if(loose_type->udt != 0){ + ptr->user_defined.udt_idx = loose_type->udt->idx; + } + if(loose_type->direct_type != 0){ + ptr->user_defined.direct_type_idx = loose_type->direct_type->idx; + } + } + + // bitfield + else if(kind == RADDBGI_TypeKind_Bitfield){ + ptr->bitfield.off = loose_type->off; + ptr->bitfield.size = loose_type->count; + } + + rdim_scratch_end(scratch); + } + + // both iterators should end at the same time + rdim_assert(loose_type == 0); + rdim_assert(ptr == opl); + } + + + // fill udts + RADDBGI_U32 udt_count = root->type_udt_count; + RADDBGI_UDT *udts = rdim_push_array_no_zero(arena, RADDBGI_UDT, udt_count); + + RADDBGI_U32 member_count = root->total_member_count; + RADDBGI_Member *members = rdim_push_array_no_zero(arena, RADDBGI_Member, member_count); + + RADDBGI_U32 enum_member_count = root->total_enum_val_count; + RADDBGI_EnumMember *enum_members = rdim_push_array_no_zero(arena, RADDBGI_EnumMember, enum_member_count); + + { + RADDBGI_UDT *ptr = udts; + RADDBGI_UDT *opl = ptr + udt_count; + + RADDBGI_Member *member_ptr = members; + RADDBGI_Member *member_opl = members + member_count; + + RADDBGI_EnumMember *enum_member_ptr = enum_members; + RADDBGI_EnumMember *enum_member_opl = enum_members + enum_member_count; + + RDIM_TypeUDT *loose_udt = root->first_udt; + for(;loose_udt != 0 && ptr < opl; + loose_udt = loose_udt->next_order, ptr += 1){ + ptr->self_type_idx = loose_udt->self_type->idx; + + rdim_assert(loose_udt->member_count == 0 || + loose_udt->enum_val_count == 0); + + // enum members + if(loose_udt->enum_val_count != 0){ + ptr->flags |= RADDBGI_UserDefinedTypeFlag_EnumMembers; + + ptr->member_first = (RADDBGI_U32)(enum_member_ptr - enum_members); + ptr->member_count = loose_udt->enum_val_count; + + RADDBGI_U32 local_enum_val_count = loose_udt->enum_val_count; + RDIM_TypeEnumVal *loose_enum_val = loose_udt->first_enum_val; + for(RADDBGI_U32 i = 0; + i < local_enum_val_count; + i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ + enum_member_ptr->name_string_idx = rdim_string(bctx, loose_enum_val->name); + enum_member_ptr->val = loose_enum_val->val; + } + } + + // struct/class/union members + else{ + ptr->member_first = (RADDBGI_U32)(member_ptr - members); + ptr->member_count = loose_udt->member_count; + + RADDBGI_U32 local_member_count = loose_udt->member_count; + RDIM_TypeMember *loose_member = loose_udt->first_member; + for(RADDBGI_U32 i = 0; + i < local_member_count; + i += 1, member_ptr += 1, loose_member = loose_member->next){ + member_ptr->kind = loose_member->kind; + // TODO(allen): member_ptr->visibility = ; + member_ptr->name_string_idx = rdim_string(bctx, loose_member->name); + member_ptr->off = loose_member->off; + member_ptr->type_idx = loose_member->type->idx; + + // TODO(allen): + if(loose_member->kind == RADDBGI_MemberKind_Method){ + //loose_member_ptr->unit_idx = ; + //loose_member_ptr->proc_symbol_idx = ; + } + } + + } + + RADDBGI_U32 file_idx = 0; + if(loose_udt->source_path.size > 0){ + RDIM_PathNode *path_node = rdim_paths_node_from_path(bctx, loose_udt->source_path); + RDIM_SrcNode *src_node = rdim_paths_src_node_from_path_node(bctx, path_node); + file_idx = src_node->idx; + } + + ptr->file_idx = file_idx; + ptr->line = loose_udt->line; + ptr->col = loose_udt->col; + } + + // all iterators should end at the same time + rdim_assert(loose_udt == 0); + rdim_assert(ptr == opl); + rdim_assert(member_ptr == member_opl); + rdim_assert(enum_member_ptr == enum_member_opl); + } + + + // fill result + RDIM_TypeData *result = rdim_push_array(arena, RDIM_TypeData, 1); + result->type_nodes = type_nodes; + result->type_node_count = type_count; + result->udts = udts; + result->udt_count = udt_count; + result->members = members; + result->member_count = member_count; + result->enum_members = enum_members; + result->enum_member_count = enum_member_count; + + rdim_scratch_end(scratch); + return result; +} + +//- rjf: symbol data baking + +RADDBGI_PROC RDIM_SymbolData* +rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // count symbol kinds + RADDBGI_U32 globalvar_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_GlobalVariable]; + RADDBGI_U32 threadvar_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_ThreadVariable]; + RADDBGI_U32 procedure_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_Procedure]; + + // allocate symbol arrays + RADDBGI_GlobalVariable *global_variables = + rdim_push_array(arena, RADDBGI_GlobalVariable, globalvar_count); + + RADDBGI_ThreadVariable *thread_variables = + rdim_push_array(arena, RADDBGI_ThreadVariable, threadvar_count); + + RADDBGI_Procedure *procedures = rdim_push_array(arena, RADDBGI_Procedure, procedure_count); + + // fill symbol arrays + { + RADDBGI_GlobalVariable *global_ptr = global_variables; + RADDBGI_ThreadVariable *thread_local_ptr = thread_variables; + RADDBGI_Procedure *procedure_ptr = procedures; + + // nils + global_ptr += 1; + thread_local_ptr += 1; + procedure_ptr += 1; + + // symbol nodes + for(RDIM_Symbol *node = root->first_symbol; + node != 0; + node = node->next_order){ + RADDBGI_U32 name_string_idx = rdim_string(bctx, node->name); + RADDBGI_U32 link_name_string_idx = rdim_string(bctx, node->link_name); + RADDBGI_U32 type_idx = node->type->idx; + + RADDBGI_LinkFlags link_flags = 0; + RADDBGI_U32 container_idx = 0; + { + if(node->is_extern){ + link_flags |= RADDBGI_LinkFlag_External; + } + if(node->container_symbol != 0){ + container_idx = node->container_symbol->idx; + link_flags |= RADDBGI_LinkFlag_ProcScoped; + } + else if(node->container_type != 0 && node->container_type->udt != 0){ + container_idx = node->container_type->udt->idx; + link_flags |= RADDBGI_LinkFlag_TypeScoped; + } + } + + switch (node->kind){ + default:{}break; + + case RDIM_SymbolKind_GlobalVariable: + { + global_ptr->name_string_idx = name_string_idx; + global_ptr->link_flags = link_flags; + global_ptr->voff = node->offset; + global_ptr->type_idx = type_idx; + global_ptr->container_idx = container_idx; + global_ptr += 1; + }break; + + case RDIM_SymbolKind_ThreadVariable: + { + thread_local_ptr->name_string_idx = name_string_idx; + thread_local_ptr->link_flags = link_flags; + thread_local_ptr->tls_off = (RADDBGI_U32)node->offset; + thread_local_ptr->type_idx = type_idx; + thread_local_ptr->container_idx = container_idx; + thread_local_ptr += 1; + }break; + + case RDIM_SymbolKind_Procedure: + { + procedure_ptr->name_string_idx = name_string_idx; + procedure_ptr->link_name_string_idx = link_name_string_idx; + procedure_ptr->link_flags = link_flags; + procedure_ptr->type_idx = type_idx; + procedure_ptr->root_scope_idx = node->root_scope->idx; + procedure_ptr->container_idx = container_idx; + procedure_ptr += 1; + }break; + } + } + + rdim_assert(global_ptr - global_variables == globalvar_count); + rdim_assert(thread_local_ptr - thread_variables == threadvar_count); + rdim_assert(procedure_ptr - procedures == procedure_count); + } + + // global vmap + RDIM_VMap *global_vmap = 0; + { + // count necessary markers + RADDBGI_U32 marker_count = globalvar_count*2; + + // fill markers + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + + // real globals + for(RDIM_Symbol *node = root->first_symbol; + node != 0; + node = node->next_order){ + if(node->kind == RDIM_SymbolKind_GlobalVariable){ + RADDBGI_U32 global_idx = node->idx; + + RADDBGI_U64 first = node->offset; + RADDBGI_U64 opl = first + node->type->byte_size; + + key_ptr->key = first; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + + // nil global + { + RADDBGI_U32 global_idx = 0; + + RADDBGI_U64 first = 0; + RADDBGI_U64 opl = (RADDBGI_U64)0xffffffffffffffffull; + + key_ptr->key = first; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + + // assert we filled all the markers + rdim_assert(key_ptr - keys == marker_count && + marker_ptr - markers == marker_count); + + // construct vmap + global_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); + } + + // allocate scope array + + // (assert there is a nil scope) + rdim_assert(root->first_scope != 0 && + root->first_scope->symbol == 0 && + root->first_scope->first_child == 0 && + root->first_scope->next_sibling == 0 && + root->first_scope->range_count == 0); + + RADDBGI_U32 scope_count = root->scope_count; + RADDBGI_Scope *scopes = rdim_push_array(arena, RADDBGI_Scope, scope_count); + + RADDBGI_U32 scope_voff_count = root->scope_voff_count; + RADDBGI_U64 *scope_voffs = rdim_push_array(arena, RADDBGI_U64, scope_voff_count); + + RADDBGI_U32 local_count = root->local_count; + RADDBGI_Local *locals = rdim_push_array(arena, RADDBGI_Local, local_count); + + RADDBGI_U32 location_block_count = root->location_count; + RADDBGI_LocationBlock *location_blocks = + rdim_push_array(arena, RADDBGI_LocationBlock, location_block_count); + + RDIM_String8List location_data = {0}; + + // iterate scopes, locals, and locations + // fill scope voffs, locals, and location information + { + RADDBGI_Scope *scope_ptr = scopes; + RADDBGI_U64 *scope_voff_ptr = scope_voffs; + RADDBGI_Local *local_ptr = locals; + RADDBGI_LocationBlock *location_block_ptr = location_blocks; + + for(RDIM_Scope *node = root->first_scope; + node != 0; + node = node->next_order, scope_ptr += 1){ + + // emit voffs + RADDBGI_U32 voff_first = (RADDBGI_U32)(scope_voff_ptr - scope_voffs); + for(RDIM_VOffRange *range = node->first_range; + range != 0; + range = range->next){ + *scope_voff_ptr = range->voff_first; + scope_voff_ptr += 1; + *scope_voff_ptr = range->voff_opl; + scope_voff_ptr += 1; + } + RADDBGI_U32 voff_opl = (RADDBGI_U32)(scope_voff_ptr - scope_voffs); + + // emit locals + RADDBGI_U32 scope_local_count = node->local_count; + RADDBGI_U32 scope_local_first = (RADDBGI_U32)(local_ptr - locals); + for(RDIM_Local *slocal = node->first_local; + slocal != 0; + slocal = slocal->next, local_ptr += 1){ + local_ptr->kind = slocal->kind; + local_ptr->name_string_idx = rdim_string(bctx, slocal->name); + local_ptr->type_idx = slocal->type->idx; + + RDIM_LocationSet *locset = slocal->locset; + if(locset != 0){ + RADDBGI_U32 location_first = (RADDBGI_U32)(location_block_ptr - location_blocks); + RADDBGI_U32 location_opl = location_first + locset->location_case_count; + local_ptr->location_first = location_first; + local_ptr->location_opl = location_opl; + + for(RDIM_LocationCase *location_case = locset->first_location_case; + location_case != 0; + location_case = location_case->next){ + location_block_ptr->scope_off_first = location_case->voff_first; + location_block_ptr->scope_off_opl = location_case->voff_opl; + location_block_ptr->location_data_off = location_data.total_size; + location_block_ptr += 1; + + RDIM_Location *location = location_case->location; + if(location == 0){ + RADDBGI_U64 data = 0; + str8_serial_push_align(scratch.arena, &location_data, 8); + str8_serial_push_data(scratch.arena, &location_data, &data, 1); + } + else{ + switch (location->kind){ + default: + { + RADDBGI_U64 data = 0; + str8_serial_push_align(scratch.arena, &location_data, 8); + str8_serial_push_data(scratch.arena, &location_data, &data, 1); + }break; + + case RADDBGI_LocationKind_AddrBytecodeStream: + case RADDBGI_LocationKind_ValBytecodeStream: + { + rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&location->kind))); + for(RDIM_EvalBytecodeOp *op_node = location->bytecode.first_op; + op_node != 0; + op_node = op_node->next){ + RADDBGI_U8 op_data[9]; + op_data[0] = op_node->op; + rdim_memcpy(op_data + 1, &op_node->p, op_node->p_size); + RDIM_String8 op_data_str = rdim_str8(op_data, 1 + op_node->p_size); + rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, op_data_str)); + } + { + RADDBGI_U64 data = 0; + RDIM_String8 data_str = rdim_str8((RADDBGI_U8 *)&data, 1); + rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, data_str)); + } + }break; + + case RADDBGI_LocationKind_AddrRegisterPlusU16: + case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: + { + RADDBGI_LocationRegisterPlusU16 loc = {0}; + loc.kind = location->kind; + loc.register_code = location->register_code; + loc.offset = location->offset; + rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); + }break; + + case RADDBGI_LocationKind_ValRegister: + { + RADDBGI_LocationRegister loc = {0}; + loc.kind = location->kind; + loc.register_code = location->register_code; + rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); + }break; + } + } + } + + rdim_assert(location_block_ptr - location_blocks == location_opl); + } + } + + rdim_assert(local_ptr - locals == scope_local_first + scope_local_count); + + // emit scope + scope_ptr->proc_idx = (node->symbol == 0)?0:node->symbol->idx; + scope_ptr->parent_scope_idx = (node->parent_scope == 0)?0:node->parent_scope->idx; + scope_ptr->first_child_scope_idx = (node->first_child == 0)?0:node->first_child->idx; + scope_ptr->next_sibling_scope_idx = (node->next_sibling == 0)?0:node->next_sibling->idx; + scope_ptr->voff_range_first = voff_first; + scope_ptr->voff_range_opl = voff_opl; + scope_ptr->local_first = scope_local_first; + scope_ptr->local_count = scope_local_count; + + // TODO(allen): + //scope_ptr->static_local_idx_run_first = ; + //scope_ptr->static_local_count = ; + } + + rdim_assert(scope_ptr - scopes == scope_count); + rdim_assert(local_ptr - locals == local_count); + } + + // flatten location data + RDIM_String8 location_data_str = rdim_str8_list_join(arena, &location_data, rdim_str8_lit("")); + + // scope vmap + RDIM_VMap *scope_vmap = 0; + { + // count necessary markers + RADDBGI_U32 marker_count = scope_voff_count; + + // fill markers + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + + for(RDIM_Scope *node = root->first_scope; + node != 0; + node = node->next_order){ + RADDBGI_U32 scope_idx = node->idx; + + for(RDIM_VOffRange *range = node->first_range; + range != 0; + range = range->next){ + key_ptr->key = range->voff_first; + key_ptr->val = marker_ptr; + marker_ptr->idx = scope_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = range->voff_opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = scope_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + + scope_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); + } + + // fill result + RDIM_SymbolData *result = rdim_push_array(arena, RDIM_SymbolData, 1); + result->global_variables = global_variables; + result->global_variable_count = globalvar_count; + result->global_vmap = global_vmap; + result->thread_variables = thread_variables; + result->thread_variable_count = threadvar_count; + result->procedures = procedures; + result->procedure_count = procedure_count; + result->scopes = scopes; + result->scope_count = scope_count; + result->scope_voffs = scope_voffs; + result->scope_voff_count = scope_voff_count; + result->scope_vmap = scope_vmap; + result->locals = locals; + result->local_count = local_count; + result->location_blocks = location_blocks; + result->location_block_count = location_block_count; + result->location_data = location_data_str.str; + result->location_data_size = location_data_str.size; + + rdim_scratch_end(scratch); + return result; +} + +//- rjf: name map baking + +RADDBGI_PROC RDIM_NameMapBaked* +rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_NameMap *map) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + RADDBGI_U32 bucket_count = map->name_count; + RADDBGI_U32 node_count = map->name_count; + + // setup the final bucket layouts + RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, bucket_count); + for(RDIM_NameMapNode *node = map->first; + node != 0; + node = node->order_next){ + RADDBGI_U64 hash = raddbgi_hash(node->string.str, node->string.size); + RADDBGI_U64 bi = hash%bucket_count; + RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); + SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); + snode->node = node; + sbuckets[bi].count += 1; + } + + // allocate tables + RADDBGI_NameMapBucket *buckets = rdim_push_array(arena, RADDBGI_NameMapBucket, bucket_count); + RADDBGI_NameMapNode *nodes = rdim_push_array_no_zero(arena, RADDBGI_NameMapNode, node_count); + + // convert to serialized buckets & nodes + { + RADDBGI_NameMapBucket *bucket_ptr = buckets; + RADDBGI_NameMapNode *node_ptr = nodes; + for(RADDBGI_U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ + bucket_ptr->first_node = (RADDBGI_U32)(node_ptr - nodes); + bucket_ptr->node_count = sbuckets[i].count; + + for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; + snode != 0; + snode = snode->next){ + RDIM_NameMapNode *node = snode->node; + + // cons name and index(es) + RADDBGI_U32 string_idx = rdim_string(bctx, node->string); + RADDBGI_U32 match_count = node->idx_count; + RADDBGI_U32 idx = 0; + if(match_count == 1){ + idx = node->idx_first->idx[0]; + } + else{ + RADDBGI_U64 temp_pos = rdim_arena_pos(scratch.arena); + RADDBGI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RADDBGI_U32, match_count); + RADDBGI_U32 *idx_ptr = idx_run; + for(RDIM_NameMapIdxNode *idxnode = node->idx_first; + idxnode != 0; + idxnode = idxnode->next){ + for(RADDBGI_U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ + if(idxnode->idx[i] == 0){ + goto dblbreak; + } + *idx_ptr = idxnode->idx[i]; + idx_ptr += 1; + } + } + dblbreak:; + rdim_assert(idx_ptr == idx_run + match_count); + idx = rdim_idx_run(bctx, idx_run, match_count); + rdim_arena_pop_to(scratch.arena, temp_pos); + } + + // write to node + node_ptr->string_idx = string_idx; + node_ptr->match_count = match_count; + node_ptr->match_idx_or_idx_run_first = idx; + node_ptr += 1; + } + } + rdim_assert(node_ptr - nodes == node_count); + } + + rdim_scratch_end(scratch); + + RDIM_NameMapBaked *result = rdim_push_array(arena, RDIM_NameMapBaked, 1); + result->buckets = buckets; + result->nodes = nodes; + result->bucket_count = bucket_count; + result->node_count = node_count; + return result; +} + +//- rjf: top-level baking entry point + +RADDBGI_PROC void +rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) +{ + str8_serial_begin(arena, out); + + // setup cons helpers + RDIM_DSections dss = {0}; + rdim_dsection(arena, &dss, 0, 0, RADDBGI_DataSectionTag_NULL); + + RDIM_BakeParams bctx_params = {0}; + { + bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); + bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); + } + RDIM_BakeCtx *bctx = rdim_bake_ctx_begin(&bctx_params); + + //////////////////////////////// + // MAIN PART: allocating and filling out sections of the file + + // top level info + RADDBGI_TopLevelInfo *tli = rdim_push_array(arena, RADDBGI_TopLevelInfo, 1); + { + RDIM_TopLevelInfo *rdim_tli = &root->top_level_info; + tli->architecture = rdim_tli->architecture; + tli->exe_name_string_idx = rdim_string(bctx, rdim_tli->exe_name); + tli->exe_hash = rdim_tli->exe_hash; + tli->voff_max = rdim_tli->voff_max; + } + rdim_dsection(arena, &dss, tli, sizeof(*tli), RADDBGI_DataSectionTag_TopLevelInfo); + + // binary sections array + { + RADDBGI_U32 count = root->binary_section_count; + RADDBGI_BinarySection *sections = rdim_push_array(arena, RADDBGI_BinarySection, count); + RADDBGI_BinarySection *dsec = sections; + for(RDIM_BinarySection *ssec = root->binary_section_first; + ssec != 0; + ssec = ssec->next, dsec += 1){ + dsec->name_string_idx = rdim_string(bctx, ssec->name); + dsec->flags = ssec->flags; + dsec->voff_first = ssec->voff_first; + dsec->voff_opl = ssec->voff_opl; + dsec->foff_first = ssec->foff_first; + dsec->foff_opl = ssec->foff_opl; + } + rdim_dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBGI_DataSectionTag_BinarySections); + } + + // units array + // * pass for per-unit information including: + // * top-level unit information + // * combining line info for whole unit + { + RADDBGI_U32 count = root->unit_count; + RADDBGI_Unit *units = rdim_push_array(arena, RADDBGI_Unit, count); + RADDBGI_Unit *dunit = units; + for(RDIM_Unit *sunit = root->unit_first; + sunit != 0; + sunit = sunit->next_order, dunit += 1){ + // strings & paths + RADDBGI_U32 unit_name = rdim_string(bctx, sunit->unit_name); + RADDBGI_U32 cmp_name = rdim_string(bctx, sunit->compiler_name); + + RADDBGI_U32 src_path = rdim_paths_idx_from_path(bctx, sunit->source_file); + RADDBGI_U32 obj_path = rdim_paths_idx_from_path(bctx, sunit->object_file); + RADDBGI_U32 archive_path = rdim_paths_idx_from_path(bctx, sunit->archive_file); + RADDBGI_U32 build_path = rdim_paths_idx_from_path(bctx, sunit->build_path); + + dunit->unit_name_string_idx = unit_name; + dunit->compiler_name_string_idx = cmp_name; + dunit->source_file_path_node = src_path; + dunit->object_file_path_node = obj_path; + dunit->archive_file_path_node = archive_path; + dunit->build_path_node = build_path; + dunit->language = sunit->language; + + // line info (voff -> file*line*col) + RDIM_LineSequenceNode *first_seq = sunit->line_seq_first; + RDIM_UnitLinesCombined *lines = rdim_unit_combine_lines(arena, bctx, first_seq); + + RADDBGI_U32 line_count = lines->line_count; + if(line_count > 0){ + dunit->line_info_voffs_data_idx = + rdim_dsection(arena, &dss, lines->voffs, sizeof(RADDBGI_U64)*(line_count + 1), + RADDBGI_DataSectionTag_LineInfoVoffs); + dunit->line_info_data_idx = + rdim_dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, + RADDBGI_DataSectionTag_LineInfoData); + if(lines->cols != 0){ + dunit->line_info_col_data_idx = + rdim_dsection(arena, &dss, lines->cols, sizeof(RADDBGI_Column)*line_count, + RADDBGI_DataSectionTag_LineInfoColumns); + } + dunit->line_info_count = line_count; + } + } + + rdim_dsection(arena, &dss, units, sizeof(*units)*count, RADDBGI_DataSectionTag_Units); + } + + // source file line info baking + // * pass for "source_combine_line" for each source file - + // * can only be run after a pass that does "unit_combine_lines" for each unit. + for(RDIM_SrcNode *src_node = bctx->tree->src_first; + src_node != 0; + src_node = src_node->next){ + RDIM_LineMapFragment *first_fragment = src_node->first_fragment; + RDIM_SrcLinesCombined *lines = rdim_source_combine_lines(arena, first_fragment); + RADDBGI_U32 line_count = lines->line_count; + + if(line_count > 0){ + src_node->line_map_count = line_count; + + src_node->line_map_nums_data_idx = + rdim_dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, + RADDBGI_DataSectionTag_LineMapNumbers); + + src_node->line_map_range_data_idx = + rdim_dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), + RADDBGI_DataSectionTag_LineMapRanges); + + src_node->line_map_voff_data_idx = + rdim_dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, + RADDBGI_DataSectionTag_LineMapVoffs); + } + } + + // source file name mapping + { + RDIM_NameMap* map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_NormalSourcePaths); + for(RDIM_SrcNode *src_node = bctx->tree->src_first; + src_node != 0; + src_node = src_node->next){ + if(src_node->idx != 0){ + rdim_name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); + } + } + } + + // unit vmap baking + { + RDIM_VMap *vmap = rdim_vmap_from_unit_ranges(arena, + root->unit_vmap_range_first, + root->unit_vmap_range_count); + + RADDBGI_U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); + rdim_dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); + } + + // type info baking + { + RDIM_TypeData *types = rdim_type_data_combine(arena, root, bctx); + + RADDBGI_U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; + rdim_dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); + + RADDBGI_U64 udt_size = sizeof(*types->udts)*types->udt_count; + rdim_dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); + + RADDBGI_U64 member_size = sizeof(*types->members)*types->member_count; + rdim_dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); + + RADDBGI_U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; + rdim_dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); + } + + // symbol info baking + { + RDIM_SymbolData *symbol_data = rdim_symbol_data_combine(arena, root, bctx); + + RADDBGI_U64 global_variables_size = + sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; + rdim_dsection(arena, &dss, symbol_data->global_variables, global_variables_size, + RADDBGI_DataSectionTag_GlobalVariables); + + RDIM_VMap *global_vmap = symbol_data->global_vmap; + RADDBGI_U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); + rdim_dsection(arena, &dss, global_vmap->vmap, global_vmap_size, + RADDBGI_DataSectionTag_GlobalVmap); + + RADDBGI_U64 thread_variables_size = + sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; + rdim_dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, + RADDBGI_DataSectionTag_ThreadVariables); + + RADDBGI_U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; + rdim_dsection(arena, &dss, symbol_data->procedures, procedures_size, + RADDBGI_DataSectionTag_Procedures); + + RADDBGI_U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; + rdim_dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); + + RADDBGI_U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; + rdim_dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, + RADDBGI_DataSectionTag_ScopeVoffData); + + RDIM_VMap *scope_vmap = symbol_data->scope_vmap; + RADDBGI_U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); + rdim_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); + + RADDBGI_U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; + rdim_dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); + + RADDBGI_U64 location_blocks_size = + sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; + rdim_dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, + RADDBGI_DataSectionTag_LocationBlocks); + + RADDBGI_U64 location_data_size = symbol_data->location_data_size; + rdim_dsection(arena, &dss, symbol_data->location_data, location_data_size, + RADDBGI_DataSectionTag_LocationData); + } + + // name map baking + { + RADDBGI_U32 name_map_count = 0; + for(RADDBGI_U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ + if(root->name_maps[i] != 0){ + name_map_count += 1; + } + } + + RADDBGI_NameMap *name_maps = rdim_push_array(arena, RADDBGI_NameMap, name_map_count); + + RADDBGI_NameMap *name_map_ptr = name_maps; + for(RADDBGI_U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ + RDIM_NameMap *map = root->name_maps[i]; + if(map != 0){ + RDIM_NameMapBaked *baked = rdim_name_map_bake(arena, root, bctx, map); + + name_map_ptr->kind = i; + name_map_ptr->bucket_data_idx = + rdim_dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, + RADDBGI_DataSectionTag_NameMapBuckets); + name_map_ptr->node_data_idx = + rdim_dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, + RADDBGI_DataSectionTag_NameMapNodes); + name_map_ptr += 1; + } + } + + rdim_dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, + RADDBGI_DataSectionTag_NameMaps); + } + + //////////////////////////////// + // LATE PART: baking loose structures and creating final layout + + // generate data sections for file paths + { + RADDBGI_U32 count = bctx->tree->count; + RADDBGI_FilePathNode *nodes = rdim_push_array(arena, RADDBGI_FilePathNode, count); + + RADDBGI_FilePathNode *out_node = nodes; + for(RDIM_PathNode *node = bctx->tree->first; + node != 0; + node = node->next_order, out_node += 1){ + out_node->name_string_idx = rdim_string(bctx, node->name); + if(node->parent != 0){ + out_node->parent_path_node = node->parent->idx; + } + if(node->first_child != 0){ + out_node->first_child = node->first_child->idx; + } + if(node->next_sibling != 0){ + out_node->next_sibling = node->next_sibling->idx; + } + if(node->src_file != 0){ + out_node->source_file_idx = node->src_file->idx; + } + } + + rdim_dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBGI_DataSectionTag_FilePathNodes); + } + + // generate data sections for files + { + RADDBGI_U32 count = bctx->tree->src_count; + RADDBGI_SourceFile *src_files = rdim_push_array(arena, RADDBGI_SourceFile, count); + + RADDBGI_SourceFile *out_src_file = src_files; + for(RDIM_SrcNode *node = bctx->tree->src_first; + node != 0; + node = node->next, out_src_file += 1){ + out_src_file->file_path_node_idx = node->path_node->idx; + out_src_file->normal_full_path_string_idx = rdim_string(bctx, node->normal_full_path); + out_src_file->line_map_nums_data_idx = node->line_map_nums_data_idx; + out_src_file->line_map_range_data_idx = node->line_map_range_data_idx; + out_src_file->line_map_count = node->line_map_count; + out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; + } + + rdim_dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBGI_DataSectionTag_SourceFiles); + } + + // generate data sections for strings + { + RADDBGI_U32 *str_offs = rdim_push_array_no_zero(arena, RADDBGI_U32, bctx->strs.count + 1); + + RADDBGI_U32 off_cursor = 0; + { + RADDBGI_U32 *off_ptr = str_offs; + *off_ptr = 0; + off_ptr += 1; + for(RDIM_StringNode *node = bctx->strs.order_first; + node != 0; + node = node->order_next){ + off_cursor += node->str.size; + *off_ptr = off_cursor; + off_ptr += 1; + } + } + + RADDBGI_U8 *buf = rdim_push_array(arena, RADDBGI_U8, off_cursor); + { + RADDBGI_U8 *ptr = buf; + for(RDIM_StringNode *node = bctx->strs.order_first; + node != 0; + node = node->order_next){ + rdim_memcpy(ptr, node->str.str, node->str.size); + ptr += node->str.size; + } + } + + rdim_dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), + RADDBGI_DataSectionTag_StringTable); + rdim_dsection(arena, &dss, buf, off_cursor, RADDBGI_DataSectionTag_StringData); + } + + // generate data sections for index runs + { + RADDBGI_U32 *idx_data = rdim_push_array_no_zero(arena, RADDBGI_U32, bctx->idxs.idx_count); + + { + RADDBGI_U32 *out_ptr = idx_data; + RADDBGI_U32 *opl = out_ptr + bctx->idxs.idx_count; + RDIM_IdxRunNode *node = bctx->idxs.order_first; + for(;node != 0 && out_ptr < opl; + node = node->order_next){ + rdim_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); + out_ptr += node->count; + } + rdim_assert(out_ptr == opl); + } + + rdim_dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, + RADDBGI_DataSectionTag_IndexRuns); + } + + // layout + // * the header and data section table have to be initialized "out of order" + // * so that the rest of the system can avoid this tricky order-layout interdependence stuff + RADDBGI_Header *header = rdim_push_array(arena, RADDBGI_Header, 1); + RADDBGI_DataSection *dstable = rdim_push_array(arena, RADDBGI_DataSection, dss.count); + str8_serial_push_align(arena, out, 8); + RADDBGI_U64 header_off = out->total_size; + str8_list_push(arena, out, str8_struct(header)); + str8_serial_push_align(arena, out, 8); + RADDBGI_U64 data_section_off = out->total_size; + str8_list_push(arena, out, str8((RADDBGI_U8 *)dstable, sizeof(*dstable)*dss.count)); + { + header->magic = RADDBGI_MAGIC_CONSTANT; + header->encoding_version = RADDBGI_ENCODING_VERSION; + header->data_section_off = data_section_off; + header->data_section_count = dss.count; + } + { + RADDBGI_U64 test_dss_count = 0; + for(RDIM_DSectionNode *node = dss.first; + node != 0; + node = node->next){ + test_dss_count += 1; + } + rdim_assert(test_dss_count == dss.count); + + RADDBGI_DataSection *ptr = dstable; + for(RDIM_DSectionNode *node = dss.first; + node != 0; + node = node->next, ptr += 1){ + RADDBGI_U64 data_section_offset = 0; + if(node->size != 0) + { + str8_serial_push_align(arena, out, 8); + data_section_offset = out->total_size; + str8_list_push(arena, out, str8((RADDBGI_U8 *)node->data, node->size)); + } + ptr->tag = node->tag; + ptr->encoding = RADDBGI_DataSectionEncoding_Unpacked; + ptr->off = data_section_offset; + ptr->encoded_size = node->size; + ptr->unpacked_size = node->size; + } + rdim_assert(ptr == dstable + dss.count); + } + + rdim_bake_ctx_release(bctx); +} diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h new file mode 100644 index 00000000..414aa237 --- /dev/null +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -0,0 +1,1303 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RADDBGI_CONS_H +#define RADDBGI_CONS_H + +//////////////////////////////// +//~ rjf: Overrideable Memory Operations + +// To override the slow/default memset implementation used by the library, +// do the following: +// +// #define RDIM_MEMSET_OVERRIDE +// #define rdim_memset + +#if !defined(rdim_memset) +# define rdim_memset rdim_memset_fallback +#endif + +// To override the slow/default memcpy implementation used by the library, +// do the following: +// +// #define RDIM_MEMCPY_OVERRIDE +// #define rdim_memcpy + +#if !defined(rdim_memset) +# define rdim_memset rdim_memset_fallback +#endif + +#if !defined(rdim_memcpy) +# define rdim_memcpy rdim_memcpy_fallback +#endif + +//////////////////////////////// +//~ rjf: Overrideable sprintf Functions + +#if !defined(rdim_vsnprintf) +# include +# define rdim_vsnprintf vsnprintf +#endif + +//////////////////////////////// +//~ rjf: Overrideable String View Types + +// To override the string view type used by the library, do the following: +// +// #define RDIM_STRING8_OVERRIDE +// #define RDIM_String8 +// #define RDIM_String8_BaseMember +// #define RDIM_String8_SizeMember + +// To override the string view list type used by the library, do the following: +// +// #define RDIM_STRING8LIST_OVERRIDE +// #define RDIM_String8Node +// #define RDIM_String8_NextPtrMember +// #define RDIM_String8_StringMember +// #define RDIM_String8List +// #define RDIM_String8_FirstMember +// #define RDIM_String8_LastMember +// #define RDIM_String8_NodeCount +// #define RDIM_String8_TotalSizeMember + +#if !defined(RDIM_String8) +#define RDIM_String8 RDIM_String8 +#define RDIM_String8_BaseMember str +#define RDIM_String8_SizeMember size +typedef struct RDIM_String8 RDIM_String8; +struct RDIM_String8 +{ + RADDBGI_U8 *str; + RADDBGI_U64 size; +}; +#endif + +#if !defined(RDIM_String8Node) +#define RDIM_String8Node RDIM_String8Node +#define RDIM_String8Node_NextPtrMember next +#define RDIM_String8Node_StringMember string +typedef struct RDIM_String8Node RDIM_String8Node; +struct RDIM_String8Node +{ + RDIM_String8Node *next; + RDIM_String8 string; +}; +#endif + +#if !defined(RDIM_String8List) +#define RDIM_String8List RDIM_String8List +#define RDIM_String8List_FirstMember first +#define RDIM_String8List_LastMember last +#define RDIM_String8List_NodeCountMember node_count +#define RDIM_String8List_TotalSizeMember total_size +typedef struct RDIM_String8List RDIM_String8List; +struct RDIM_String8List +{ + RDIM_String8Node *first; + RDIM_String8Node *last; + RADDBGI_U64 node_count; + RADDBGI_U64 total_size; +}; +#endif + +typedef RADDBGI_U32 RDIM_StringMatchFlags; +enum +{ + RDIM_StringMatchFlag_CaseInsensitive = (1<<0), +}; + +//////////////////////////////// +//~ rjf: Overrideable Arena Allocator Types + +// To override the arena allocator type used by the library, do the following: +// +// #define RDIM_ARENA_OVERRIDE +// #define RDIM_Arena +// #define rdim_arena_alloc Arena*> +// #define rdim_arena_release void> +// #define rdim_arena_pos U64> +// #define rdim_arena_push void*> +// #define rdim_arena_pop_to void> + +#if !defined(RDIM_Arena) +# define RDIM_Arena RDIM_Arena +typedef struct RDIM_Arena RDIM_Arena; +struct RDIM_Arena +{ + RDIM_Arena *prev; + RDIM_Arena *current; + RADDBGI_U64 base_pos; + RADDBGI_U64 pos; + RADDBGI_U64 cmt; + RADDBGI_U64 res; + RADDBGI_U64 align; + RADDBGI_S8 grow; +}; +#endif + +#if !defined(rdim_arena_alloc) +# define rdim_arena_alloc rdim_arena_alloc_fallback +#endif +#if !defined(rdim_arena_release) +# define rdim_arena_release rdim_arena_release_fallback +#endif +#if !defined(rdim_arena_pos) +# define rdim_arena_pos rdim_arena_pos_fallback +#endif +#if !defined(rdim_arena_push) +# define rdim_arena_push rdim_arena_push_fallback +#endif + +//////////////////////////////// +//~ rjf: Overrideable Thread-Local Scratch Arenas + +// To override the default thread-local scratch arenas used b yhe library, +// do the following: +// +// #define RDIM_SCRATCH_OVERRIDE +// #define RDIM_Temp arena implementation - must be (Temp) -> (Arena*)> +// #define rdim_scratch_begin Temp> +// #define rdim_scratch_end void + +#if !defined(RDIM_Temp) +# define RDIM_Temp RDIM_Temp +typedef struct RDIM_Temp RDIM_Temp; +struct RDIM_Temp +{ + RDIM_Arena *arena; + RADDBGI_U64 pos; +}; +#define rdim_temp_arena(t) ((t).arena) +#endif + +#if !defined(rdim_scratch_begin) +# define rdim_scratch_begin rdim_scratch_begin_fallback +#endif +#if !defined(rdim_scratch_end) +# define rdim_scratch_end rdim_scratch_end_fallback +#endif + +//////////////////////////////// +//~ rjf: Linked List Helpers + +#define RDIM_CheckNil(nil,p) ((p) == 0 || (p) == nil) +#define RDIM_SetNil(nil,p) ((p) = nil) + +//- rjf: Base Doubly-Linked-List Macros +#define RDIM_DLLInsert_NPZ(nil,f,l,p,n,next,prev) (RDIM_CheckNil(nil,f) ? \ +((f) = (l) = (n), RDIM_SetNil(nil,(n)->next), RDIM_SetNil(nil,(n)->prev)) :\ +RDIM_CheckNil(nil,p) ? \ +((n)->next = (f), (f)->prev = (n), (f) = (n), RDIM_SetNil(nil,(n)->prev)) :\ +((p)==(l)) ? \ +((l)->next = (n), (n)->prev = (l), (l) = (n), RDIM_SetNil(nil, (n)->next)) :\ +(((!RDIM_CheckNil(nil,p) && RDIM_CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) +#define RDIM_DLLPushBack_NPZ(nil,f,l,n,next,prev) RDIM_DLLInsert_NPZ(nil,f,l,l,n,next,prev) +#define RDIM_DLLPushFront_NPZ(nil,f,l,n,next,prev) RDIM_DLLInsert_NPZ(nil,l,f,f,n,prev,next) +#define RDIM_DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ +((n) == (l) ? (l) = (l)->prev : (0)),\ +(RDIM_CheckNil(nil,(n)->prev) ? (0) :\ +((n)->prev->next = (n)->next)),\ +(RDIM_CheckNil(nil,(n)->next) ? (0) :\ +((n)->next->prev = (n)->prev))) + +//- rjf: Base Singly-Linked-List Queue Macros +#define RDIM_SLLQueuePush_NZ(nil,f,l,n,next) (RDIM_CheckNil(nil,f)?\ +((f)=(l)=(n),RDIM_SetNil(nil,(n)->next)):\ +((l)->next=(n),(l)=(n),RDIM_SetNil(nil,(n)->next))) +#define RDIM_SLLQueuePushFront_NZ(nil,f,l,n,next) (RDIM_CheckNil(nil,f)?\ +((f)=(l)=(n),RDIM_SetNil(nil,(n)->next)):\ +((n)->next=(f),(f)=(n))) +#define RDIM_SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ +(RDIM_SetNil(nil,f), RDIM_SetNil(nil,l)):\ +((f)=(f)->next)) + +//- rjf: Base Singly-Linked-List Stack Macros +#define RDIM_SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) +#define RDIM_SLLStackPop_N(f,next) ((f)=(f)->next) + +//////////////////////////////// +//~ rjf: Convenience Wrappers + +//- rjf: Doubly-Linked-List Wrappers +#define RDIM_DLLInsert_NP(f,l,p,n,next,prev) RDIM_DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define RDIM_DLLPushBack_NP(f,l,n,next,prev) RDIM_DLLPushBack_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLPushFront_NP(f,l,n,next,prev) RDIM_DLLPushFront_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLRemove_NP(f,l,n,next,prev) RDIM_DLLRemove_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLInsert(f,l,p,n) RDIM_DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define RDIM_DLLPushBack(f,l,n) RDIM_DLLPushBack_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLPushFront(f,l,n) RDIM_DLLPushFront_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLRemove(f,l,n) RDIM_DLLRemove_NPZ(0,f,l,n,next,prev) + +//- rjf: Singly-Linked-List Queue Wrappers +#define RDIM_SLLQueuePush_N(f,l,n,next) RDIM_SLLQueuePush_NZ(0,f,l,n,next) +#define RDIM_SLLQueuePushFront_N(f,l,n,next) RDIM_SLLQueuePushFront_NZ(0,f,l,n,next) +#define RDIM_SLLQueuePop_N(f,l,next) RDIM_SLLQueuePop_NZ(0,f,l,next) +#define RDIM_SLLQueuePush(f,l,n) RDIM_SLLQueuePush_NZ(0,f,l,n,next) +#define RDIM_SLLQueuePushFront(f,l,n) RDIM_SLLQueuePushFront_NZ(0,f,l,n,next) +#define RDIM_SLLQueuePop(f,l) RDIM_SLLQueuePop_NZ(0,f,l,next) + +//- rjf: Singly-Linked-List Stack Wrappers +#define RDIM_SLLStackPush(f,n) RDIM_SLLStackPush_N(f,n,next) +#define RDIM_SLLStackPop(f) RDIM_SLLStackPop_N(f,next) + +//////////////////////////////// +//~ rjf: Helper Macros + +#if defined(_MSC_VER) +# define RDIM_THREAD_LOCAL __declspec(thread) +#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +# define RDIM_THREAD_LOCAL __thread +#else +# error RDIM_THREAD_LOCAL not defined for this compiler. +#endif + +#if defined(_MSC_VER) +# define rdim_trap() __debugbreak() +#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +# define rdim_trap() __builtin_trap() +#else +# error "rdim_trap not defined for this compiler." +#endif + +#define rdim_assert_always(x) do{if(!(x)) {rdim_trap();}}while(0) +#if !defined(NDEBUG) +# define rdim_assert(x) rdim_assert_always(x) +#else +# define rdim_assert(x) (void)(x) +#endif +#define rdim_noop ((void)0) + +//////////////////////////////// +//~ rjf: Error Types + +typedef struct RDIM_Error RDIM_Error; +struct RDIM_Error +{ + RDIM_Error *next; + RDIM_String8 msg; +}; + +typedef struct RDIM_ErrorList RDIM_ErrorList; +struct RDIM_ErrorList +{ + RDIM_Error *first; + RDIM_Error *last; + RADDBGI_U64 count; +}; + +//////////////////////////////// +//~ rjf: Auxiliary Data Structure Types + +//- rjf: u64 -> pointer map + +typedef struct RDIM_U64ToPtrNode RDIM_U64ToPtrNode; +struct RDIM_U64ToPtrNode +{ + RDIM_U64ToPtrNode *next; + RADDBGI_U64 _padding_; + RADDBGI_U64 key[1]; + void *ptr[1]; +}; + +typedef struct RDIM_U64ToPtrMap RDIM_U64ToPtrMap; +struct RDIM_U64ToPtrMap +{ + RDIM_U64ToPtrNode **buckets; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RADDBGI_U64 pair_count; +}; + +typedef struct RDIM_U64ToPtrLookup RDIM_U64ToPtrLookup; +struct RDIM_U64ToPtrLookup +{ + void *match; + RDIM_U64ToPtrNode *fill_node; + RADDBGI_U32 fill_k; +}; + +//- rjf: string8 -> pointer map + +typedef struct RDIM_Str8ToPtrNode RDIM_Str8ToPtrNode; +struct RDIM_Str8ToPtrNode +{ + struct RDIM_Str8ToPtrNode *next; + RDIM_String8 key; + RADDBGI_U64 hash; + void *ptr; +}; + +typedef struct RDIM_Str8ToPtrMap RDIM_Str8ToPtrMap; +struct RDIM_Str8ToPtrMap +{ + RDIM_Str8ToPtrNode **buckets; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RADDBGI_U64 pair_count; +}; + +//- rjf: sortable range data structure + +typedef struct RDIM_SortKey RDIM_SortKey; +struct RDIM_SortKey +{ + RADDBGI_U64 key; + void *val; +}; + +typedef struct RDIM_OrderedRange RDIM_OrderedRange; +struct RDIM_OrderedRange +{ + RDIM_OrderedRange *next; + RADDBGI_U64 first; + RADDBGI_U64 opl; +}; + +//////////////////////////////// +//~ rjf: Binary Section Types + +typedef struct RDIM_BinarySection RDIM_BinarySection; +struct RDIM_BinarySection +{ + RDIM_BinarySection *next; + RDIM_String8 name; + RADDBGI_BinarySectionFlags flags; + RADDBGI_U64 voff_first; + RADDBGI_U64 voff_opl; + RADDBGI_U64 foff_first; + RADDBGI_U64 foff_opl; +}; + +//////////////////////////////// +//~ rjf: Per-Compilation-Unit Info Types + +typedef struct RDIM_LineSequence RDIM_LineSequence; +struct RDIM_LineSequence +{ + RDIM_String8 file_name; + RADDBGI_U64 *voffs; // [line_count + 1] (sorted) + RADDBGI_U32 *line_nums; // [line_count] + RADDBGI_U16 *col_nums; // [2*line_count] + RADDBGI_U64 line_count; +}; + +typedef struct RDIM_LineSequenceNode RDIM_LineSequenceNode; +struct RDIM_LineSequenceNode +{ + RDIM_LineSequenceNode *next; + RDIM_LineSequence line_seq; +}; + +typedef struct RDIM_UnitInfo RDIM_UnitInfo; +struct RDIM_UnitInfo +{ + RDIM_String8 unit_name; + RDIM_String8 compiler_name; + RDIM_String8 source_file; + RDIM_String8 object_file; + RDIM_String8 archive_file; + RDIM_String8 build_path; + RADDBGI_Language language; +}; + +typedef struct RDIM_Unit RDIM_Unit; +struct RDIM_Unit +{ + RDIM_Unit *next_order; + RADDBGI_U32 idx; + RADDBGI_S32 info_is_set; + RDIM_String8 unit_name; + RDIM_String8 compiler_name; + RDIM_String8 source_file; + RDIM_String8 object_file; + RDIM_String8 archive_file; + RDIM_String8 build_path; + RADDBGI_Language language; + RDIM_LineSequenceNode *line_seq_first; + RDIM_LineSequenceNode *line_seq_last; + RADDBGI_U64 line_seq_count; +}; + +typedef struct RDIM_UnitVMapRange RDIM_UnitVMapRange; +struct RDIM_UnitVMapRange +{ + RDIM_UnitVMapRange *next; + RDIM_Unit *unit; + RADDBGI_U64 first; + RADDBGI_U64 opl; +}; + +//////////////////////////////// +//~ rjf: Type Info Types + +typedef RADDBGI_U8 RDIM_TypeConstructKind; +enum +{ + RDIM_TypeConstructKind_Basic, + RDIM_TypeConstructKind_Modifier, + RDIM_TypeConstructKind_Bitfield, + RDIM_TypeConstructKind_Pointer, + RDIM_TypeConstructKind_Array, + RDIM_TypeConstructKind_Procedure, + RDIM_TypeConstructKind_Method, +}; + +typedef struct RDIM_Reservation RDIM_Reservation; + +typedef struct RDIM_TypeMember RDIM_TypeMember; +struct RDIM_TypeMember +{ + RDIM_TypeMember *next; + RADDBGI_MemberKind kind; + RDIM_String8 name; + struct RDIM_Type *type; + RADDBGI_U32 off; +}; + +typedef struct RDIM_TypeEnumVal RDIM_TypeEnumVal; +struct RDIM_TypeEnumVal +{ + RDIM_TypeEnumVal *next; + RDIM_String8 name; + RADDBGI_U64 val; +}; + +typedef struct RDIM_Type RDIM_Type; +struct RDIM_Type +{ + RDIM_Type *next_order; + RADDBGI_TypeKind kind; + RADDBGI_U32 idx; + RADDBGI_U32 byte_size; + RADDBGI_U32 flags; + RADDBGI_U32 off; + RADDBGI_U32 count; + RDIM_String8 name; + RDIM_Type *direct_type; + RDIM_Type **param_types; + struct RDIM_TypeUDT *udt; +}; + +typedef struct RDIM_TypeUDT RDIM_TypeUDT; +struct RDIM_TypeUDT +{ + RDIM_TypeUDT *next_order; + RADDBGI_U32 idx; + RDIM_Type *self_type; + RDIM_TypeMember *first_member; + RDIM_TypeMember *last_member; + RADDBGI_U64 member_count; + RDIM_TypeEnumVal *first_enum_val; + RDIM_TypeEnumVal *last_enum_val; + RADDBGI_U64 enum_val_count; + RDIM_String8 source_path; + RADDBGI_U32 line; + RADDBGI_U32 col; +}; + +typedef struct RDIM_TypeNode RDIM_TypeNode; +struct RDIM_TypeNode +{ + RDIM_TypeNode *next; + RDIM_Type *type; +}; + +typedef struct RDIM_TypeList RDIM_TypeList; +struct RDIM_TypeList +{ + RDIM_TypeNode *first; + RDIM_TypeNode *last; + RADDBGI_U64 count; +}; + +//////////////////////////////// +//~ rjf: Symbol Info Types + +typedef enum RDIM_SymbolKind +{ + RDIM_SymbolKind_NULL, + RDIM_SymbolKind_GlobalVariable, + RDIM_SymbolKind_ThreadVariable, + RDIM_SymbolKind_Procedure, + RDIM_SymbolKind_COUNT +} +RDIM_SymbolKind; + +typedef struct RDIM_SymbolInfo RDIM_SymbolInfo; +struct RDIM_SymbolInfo +{ + RDIM_SymbolKind kind; + RDIM_String8 name; + RDIM_String8 link_name; + RDIM_Type *type; + RADDBGI_S32 is_extern; + RADDBGI_U64 offset; + // TODO(allen): should this actually be "container scope"? + struct RDIM_Symbol *container_symbol; + RDIM_Type *container_type; + struct RDIM_Scope *root_scope; +}; + +typedef struct RDIM_Symbol RDIM_Symbol; +struct RDIM_Symbol +{ + RDIM_Symbol *next_order; + RADDBGI_U32 idx; + RDIM_SymbolKind kind; + RDIM_String8 name; + RDIM_String8 link_name; + RDIM_Type *type; + RADDBGI_S32 is_extern; + RADDBGI_S8 offset_is_set; + RADDBGI_U64 offset; + RDIM_Symbol *container_symbol; + RDIM_Type *container_type; + struct RDIM_Scope *root_scope; +}; + +//////////////////////////////// +//~ rjf: Scope Info Types + +typedef struct RDIM_LocalInfo RDIM_LocalInfo; +struct RDIM_LocalInfo +{ + RADDBGI_LocalKind kind; + struct RDIM_Scope *scope; + RDIM_String8 name; + RDIM_Type *type; +}; + +typedef struct RDIM_Local RDIM_Local; +struct RDIM_Local +{ + RDIM_Local *next; + RADDBGI_LocalKind kind; + RDIM_String8 name; + RDIM_Type *type; + struct RDIM_LocationSet *locset; +}; + +typedef struct RDIM_VOffRange RDIM_VOffRange; +struct RDIM_VOffRange +{ + RDIM_VOffRange *next; + RADDBGI_U64 voff_first; + RADDBGI_U64 voff_opl; +}; + +typedef struct RDIM_Scope RDIM_Scope; +struct RDIM_Scope +{ + RDIM_Scope *next_order; + RDIM_Symbol *symbol; + RDIM_Scope *parent_scope; + RDIM_Scope *first_child; + RDIM_Scope *last_child; + RDIM_Scope *next_sibling; + RADDBGI_U64 voff_base; + RDIM_VOffRange *first_range; + RDIM_VOffRange *last_range; + RADDBGI_U32 range_count; + RADDBGI_U32 idx; + RDIM_Local *first_local; + RDIM_Local *last_local; + RADDBGI_U32 local_count; +}; + +//////////////////////////////// +//~ rjf: Location Info Types + +typedef struct RDIM_EvalBytecodeOp RDIM_EvalBytecodeOp; +struct RDIM_EvalBytecodeOp +{ + RDIM_EvalBytecodeOp *next; + RADDBGI_EvalOp op; + RADDBGI_U32 p_size; + RADDBGI_U64 p; +}; + +typedef struct RDIM_EvalBytecode RDIM_EvalBytecode; +struct RDIM_EvalBytecode +{ + RDIM_EvalBytecodeOp *first_op; + RDIM_EvalBytecodeOp *last_op; + RADDBGI_U32 op_count; + RADDBGI_U32 encoded_size; +}; + +typedef struct RDIM_Location RDIM_Location; +struct RDIM_Location +{ + RADDBGI_LocationKind kind; + RADDBGI_U8 register_code; + RADDBGI_U16 offset; + RDIM_EvalBytecode bytecode; +}; + +typedef struct RDIM_LocationCase RDIM_LocationCase; +struct RDIM_LocationCase +{ + RDIM_LocationCase *next; + RADDBGI_U64 voff_first; + RADDBGI_U64 voff_opl; + RDIM_Location *location; +}; + +typedef struct RDIM_LocationSet RDIM_LocationSet; +struct RDIM_LocationSet +{ + RDIM_LocationCase *first_location_case; + RDIM_LocationCase *last_location_case; + RADDBGI_U64 location_case_count; +}; + +//////////////////////////////// +//~ rjf: Name Map Types + +typedef struct RDIM_NameMapIdxNode RDIM_NameMapIdxNode; +struct RDIM_NameMapIdxNode +{ + RDIM_NameMapIdxNode *next; + RADDBGI_U32 idx[8]; +}; + +typedef struct RDIM_NameMapNode RDIM_NameMapNode; +struct RDIM_NameMapNode +{ + RDIM_NameMapNode *bucket_next; + RDIM_NameMapNode *order_next; + RDIM_String8 string; + RDIM_NameMapIdxNode *idx_first; + RDIM_NameMapIdxNode *idx_last; + RADDBGI_U64 idx_count; +}; + +typedef struct RDIM_NameMap RDIM_NameMap; +struct RDIM_NameMap +{ + RDIM_NameMapNode **buckets; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RDIM_NameMapNode *first; + RDIM_NameMapNode *last; + RADDBGI_U64 name_count; +}; + +//////////////////////////////// +//~ rjf: Top-Level Debug Info Types + +typedef struct RDIM_TopLevelInfo RDIM_TopLevelInfo; +struct RDIM_TopLevelInfo +{ + RADDBGI_Arch architecture; + RDIM_String8 exe_name; + RADDBGI_U64 exe_hash; + RADDBGI_U64 voff_max; +}; + +//////////////////////////////// +//~ rjf: Root Construction Bundle Types + +typedef struct RDIM_RootParams RDIM_RootParams; +struct RDIM_RootParams +{ + RADDBGI_U64 addr_size; + RADDBGI_U32 bucket_count_units; // optional; default chosen if 0 + RADDBGI_U32 bucket_count_symbols; // optional; default chosen if 0 + RADDBGI_U32 bucket_count_scopes; // optional; default chosen if 0 + RADDBGI_U32 bucket_count_locals; // optional; default chosen if 0 + RADDBGI_U32 bucket_count_types; // optional; default chosen if 0 + RADDBGI_U64 bucket_count_type_constructs; // optional; default chosen if 0 +}; + +typedef struct RDIM_Root RDIM_Root; +struct RDIM_Root +{ + RDIM_Arena *arena; + RDIM_ErrorList errors; + + //////// Contextual Information + + RADDBGI_U64 addr_size; + + //////// Info Declared By User + + // top level info + RADDBGI_S32 top_level_info_is_set; + RDIM_TopLevelInfo top_level_info; + + // binary layout + RDIM_BinarySection *binary_section_first; + RDIM_BinarySection *binary_section_last; + RADDBGI_U64 binary_section_count; + + // compilation units + RDIM_Unit *unit_first; + RDIM_Unit *unit_last; + RADDBGI_U64 unit_count; + + RDIM_UnitVMapRange *unit_vmap_range_first; + RDIM_UnitVMapRange *unit_vmap_range_last; + RADDBGI_U64 unit_vmap_range_count; + + // types + RDIM_Type *first_type; + RDIM_Type *last_type; + RADDBGI_U64 type_count; + + RDIM_Type *nil_type; + RDIM_Type *variadic_type; + + RDIM_Type handled_nil_type; + + RDIM_TypeUDT *first_udt; + RDIM_TypeUDT *last_udt; + RADDBGI_U64 type_udt_count; + + RADDBGI_U64 total_member_count; + RADDBGI_U64 total_enum_val_count; + + // symbols + RDIM_Symbol *first_symbol; + RDIM_Symbol *last_symbol; + union + { + RADDBGI_U64 symbol_count; + RADDBGI_U64 symbol_kind_counts[RDIM_SymbolKind_COUNT]; + }; + + RDIM_Scope *first_scope; + RDIM_Scope *last_scope; + RADDBGI_U64 scope_count; + RADDBGI_U64 scope_voff_count; + + RDIM_Local *first_local; + RDIM_Local *last_local; + RADDBGI_U64 local_count; + RADDBGI_U64 location_count; + + // name maps + RDIM_NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; + + //////// Handle Relationship Maps + + RDIM_U64ToPtrMap unit_map; + RDIM_U64ToPtrMap symbol_map; + RDIM_U64ToPtrMap scope_map; + RDIM_U64ToPtrMap local_map; + RDIM_U64ToPtrMap type_from_id_map; + RDIM_Str8ToPtrMap construct_map; +}; + +//////////////////////////////// +//~ rjf: Baking Phase Types + +//- rjf: bake data section data structure + +typedef struct RDIM_DSectionNode RDIM_DSectionNode; +struct RDIM_DSectionNode +{ + RDIM_DSectionNode *next; + void *data; + RADDBGI_U64 size; + RADDBGI_DataSectionTag tag; +}; + +typedef struct RDIM_DSections RDIM_DSections; +struct RDIM_DSections +{ + RDIM_DSectionNode *first; + RDIM_DSectionNode *last; + RADDBGI_U32 count; +}; + +//- rjf: bake string data structure + +typedef struct RDIM_StringNode RDIM_StringNode; +struct RDIM_StringNode +{ + RDIM_StringNode *order_next; + RDIM_StringNode *bucket_next; + RDIM_String8 str; + RADDBGI_U64 hash; + RADDBGI_U32 idx; +}; + +typedef struct RDIM_Strings RDIM_Strings; +struct RDIM_Strings +{ + RDIM_StringNode *order_first; + RDIM_StringNode *order_last; + RDIM_StringNode **buckets; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RADDBGI_U32 count; +}; + +//- rjf: index run baking data structure + +typedef struct RDIM_IdxRunNode RDIM_IdxRunNode; +struct RDIM_IdxRunNode +{ + RDIM_IdxRunNode *order_next; + RDIM_IdxRunNode *bucket_next; + RADDBGI_U32 *idx_run; + RADDBGI_U64 hash; + RADDBGI_U32 count; + RADDBGI_U32 first_idx; +}; + +typedef struct RDIM_IdxRuns RDIM_IdxRuns; +struct RDIM_IdxRuns +{ + RDIM_IdxRunNode *order_first; + RDIM_IdxRunNode *order_last; + RDIM_IdxRunNode **buckets; + RADDBGI_U64 buckets_count; + RADDBGI_U64 bucket_collision_count; + RADDBGI_U32 count; + RADDBGI_U32 idx_count; +}; + +//- rjf: source file & file path baking data structures + +typedef struct RDIM_PathNode RDIM_PathNode; +struct RDIM_PathNode +{ + RDIM_PathNode *next_order; + RDIM_PathNode *parent; + RDIM_PathNode *first_child; + RDIM_PathNode *last_child; + RDIM_PathNode *next_sibling; + RDIM_String8 name; + struct RDIM_SrcNode *src_file; + RADDBGI_U32 idx; +}; + +typedef struct RDIM_LineMapFragment RDIM_LineMapFragment; +struct RDIM_LineMapFragment +{ + RDIM_LineMapFragment *next; + RDIM_LineSequenceNode *sequence; +}; + +typedef struct RDIM_SrcNode RDIM_SrcNode; +struct RDIM_SrcNode +{ + RDIM_SrcNode *next; + RDIM_PathNode *path_node; + RADDBGI_U32 idx; + + RDIM_String8 normal_full_path; + + // place to gather the line info attached to this src file + RDIM_LineMapFragment *first_fragment; + RDIM_LineMapFragment *last_fragment; + + // place to put the final baked version of this file's line map + RADDBGI_U32 line_map_nums_data_idx; + RADDBGI_U32 line_map_range_data_idx; + RADDBGI_U32 line_map_count; + RADDBGI_U32 line_map_voff_data_idx; +}; + +typedef struct RDIM_PathTree RDIM_PathTree; +struct RDIM_PathTree +{ + RDIM_PathNode *first; + RDIM_PathNode *last; + RADDBGI_U32 count; + RDIM_PathNode root; + RDIM_SrcNode *src_first; + RDIM_SrcNode *src_last; + RADDBGI_U32 src_count; +}; + +//- rjf: line info baking data structures + +typedef struct RDIM_LineRec RDIM_LineRec; +struct RDIM_LineRec +{ + RADDBGI_U32 file_id; + RADDBGI_U32 line_num; + RADDBGI_U16 col_first; + RADDBGI_U16 col_opl; +}; + +typedef struct RDIM_UnitLinesCombined RDIM_UnitLinesCombined; +struct RDIM_UnitLinesCombined +{ + RADDBGI_U64 *voffs; + RADDBGI_Line *lines; + RADDBGI_U16 *cols; + RADDBGI_U32 line_count; +}; + +typedef struct RDIM_SrcLinesCombined RDIM_SrcLinesCombined; +struct RDIM_SrcLinesCombined +{ + RADDBGI_U32 *line_nums; + RADDBGI_U32 *line_ranges; + RADDBGI_U64 *voffs; + RADDBGI_U32 line_count; + RADDBGI_U32 voff_count; +}; + +typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; +struct RDIM_SrcLineMapVoffBlock +{ + RDIM_SrcLineMapVoffBlock *next; + RADDBGI_U64 voff; +}; + +typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; +struct RDIM_SrcLineMapBucket +{ + RDIM_SrcLineMapBucket *order_next; + RDIM_SrcLineMapBucket *hash_next; + RADDBGI_U32 line_num; + RDIM_SrcLineMapVoffBlock *first_voff_block; + RDIM_SrcLineMapVoffBlock *last_voff_block; + RADDBGI_U64 voff_count; +}; + +//- rjf: vmap baking data structure + +typedef struct RDIM_VMap RDIM_VMap; +struct RDIM_VMap +{ + RADDBGI_VMapEntry *vmap; // [count + 1] + RADDBGI_U32 count; +}; + +typedef struct RDIM_VMapMarker RDIM_VMapMarker; +struct RDIM_VMapMarker +{ + RADDBGI_U32 idx; + RADDBGI_U32 begin_range; +}; + +typedef struct RDIM_VMapRangeTracker RDIM_VMapRangeTracker; +struct RDIM_VMapRangeTracker +{ + RDIM_VMapRangeTracker *next; + RADDBGI_U32 idx; +}; + +//- rjf: type data baking types + +typedef struct RDIM_TypeData RDIM_TypeData; +struct RDIM_TypeData +{ + RADDBGI_TypeNode *type_nodes; + RADDBGI_U32 type_node_count; + + RADDBGI_UDT *udts; + RADDBGI_U32 udt_count; + + RADDBGI_Member *members; + RADDBGI_U32 member_count; + + RADDBGI_EnumMember *enum_members; + RADDBGI_U32 enum_member_count; +}; + +//- rjf: symbol data baking types + +typedef struct RDIM_SymbolData RDIM_SymbolData; +struct RDIM_SymbolData +{ + RADDBGI_GlobalVariable *global_variables; + RADDBGI_U32 global_variable_count; + + RDIM_VMap *global_vmap; + + RADDBGI_ThreadVariable *thread_variables; + RADDBGI_U32 thread_variable_count; + + RADDBGI_Procedure *procedures; + RADDBGI_U32 procedure_count; + + RADDBGI_Scope *scopes; + RADDBGI_U32 scope_count; + + RADDBGI_U64 *scope_voffs; + RADDBGI_U32 scope_voff_count; + + RDIM_VMap *scope_vmap; + + RADDBGI_Local *locals; + RADDBGI_U32 local_count; + + RADDBGI_LocationBlock *location_blocks; + RADDBGI_U32 location_block_count; + + void *location_data; + RADDBGI_U32 location_data_size; +}; + +//- rjf: name map baking types + +typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; +struct RDIM_NameMapSemiNode +{ + RDIM_NameMapSemiNode *next; + RDIM_NameMapNode *node; +}; + +typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; +struct RDIM_NameMapSemiBucket +{ + RDIM_NameMapSemiNode *first; + RDIM_NameMapSemiNode *last; + RADDBGI_U64 count; +}; + +typedef struct RDIM_NameMapBaked RDIM_NameMapBaked; +struct RDIM_NameMapBaked +{ + RADDBGI_NameMapBucket *buckets; + RADDBGI_NameMapNode *nodes; + RADDBGI_U32 bucket_count; + RADDBGI_U32 node_count; +}; + +//- rjf: bundle baking context type + +typedef struct RDIM_BakeParams RDIM_BakeParams; +struct RDIM_BakeParams +{ + RADDBGI_U64 strings_bucket_count; + RADDBGI_U64 idx_runs_bucket_count; +}; + +typedef struct RDIM_BakeCtx RDIM_BakeCtx; +struct RDIM_BakeCtx +{ + RDIM_Arena *arena; + RDIM_Strings strs; + RDIM_IdxRuns idxs; + RDIM_PathTree *tree; +}; + +//////////////////////////////// +//~ rjf: Basic Helpers + +//- rjf: memory operations +#if !defined(RDIM_MEMSET_OVERRIDE) +RADDBGI_PROC void *rdim_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size); +#endif +#if !defined(RDIM_MEMCPY_OVERRIDE) +RADDBGI_PROC void *rdim_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size); +#endif +#define rdim_memzero(ptr, size) rdim_memset((ptr), 0, (size)) +#define rdim_memzero_struct(ptr) rdim_memset((ptr), 0, sizeof(*(ptr))) +#define rdim_memcpy_struct(dst, src) rdim_memcpy((dst), (src), sizeof(*(dst))) + +//- rjf: arenas +#if !defined (RDIM_ARENA_OVERRIDE) +RADDBGI_PROC RDIM_Arena *rdim_arena_alloc_fallback(void); +RADDBGI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena); +RADDBGI_PROC RADDBGI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena); +RADDBGI_PROC void *rdim_arena_push_fallback(RDIM_Arena *arena, RADDBGI_U64 size); +RADDBGI_PROC void rdim_arena_pop_to_fallback(RDIM_Arena *arena, RADDBGI_U64 pos); +#endif +#define rdim_push_array_no_zero(a,T,c) (T*)rdim_arena_push((a), sizeof(T)*(c)) +#define rdim_push_array(a,T,c) (T*)rdim_memzero(rdim_push_array_no_zero(a,T,c), sizeof(T)*(c)) + +//- rjf: thread-local scratch arenas +#if !defined (RDIM_SCRATCH_OVERRIDE) +RADDBGI_PROC RDIM_Temp rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RADDBGI_U64 conflicts_count); +RADDBGI_PROC void rdim_scratch_end_fallback(RDIM_Temp temp); +#endif + +//- rjf: strings +RADDBGI_PROC RDIM_String8 rdim_str8(RADDBGI_U8 *str, RADDBGI_U64 size); +RADDBGI_PROC RDIM_String8 rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src); +RADDBGI_PROC RDIM_String8 rdim_str8f(RDIM_Arena *arena, char *fmt, ...); +RADDBGI_PROC RDIM_String8 rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args); +RADDBGI_PROC RADDBGI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags); +#define rdim_str8_lit(S) rdim_str8((RADDBGI_U8*)(S), sizeof(S) - 1) +#define rdim_str8_struct(S) rdim_str8((RADDBGI_U8*)(S), sizeof(*(S))) + +//- rjf: string lists +RADDBGI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); +RADDBGI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep); + +//- rjf: type lists +RADDBGI_PROC void rdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *type); + +//- rjf: bytecode lists +RADDBGI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_EvalOp op, RADDBGI_U64 p); +RADDBGI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_U64 x); +RADDBGI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_S64 x); +RADDBGI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); + +//- rjf: sortable range sorting +RADDBGI_PROC RDIM_SortKey* rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count); + +//////////////////////////////// +//~ rjf: Auxiliary Data Structure Functions + +//- rjf: u64 -> ptr map +RADDBGI_PROC void rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 bucket_count); +RADDBGI_PROC void rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RDIM_U64ToPtrLookup *lookup_out); +RADDBGI_PROC void rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr); + +//- rjf: string8 -> ptr map +RADDBGI_PROC void rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RADDBGI_U64 bucket_count); +RADDBGI_PROC void*rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 hash); +RADDBGI_PROC void rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 hash, void *ptr); + +//////////////////////////////// +//~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions + +//- rjf: root creation +RADDBGI_PROC RDIM_Root* rdim_root_alloc(RDIM_RootParams *params); +RADDBGI_PROC void rdim_root_release(RDIM_Root *root); + +//- rjf: error accumulation +RADDBGI_PROC void rdim_push_error(RDIM_Root *root, RDIM_String8 string); +RADDBGI_PROC void rdim_push_errorf(RDIM_Root *root, char *fmt, ...); +RADDBGI_PROC RDIM_Error* rdim_first_error_from_root(RDIM_Root *root); + +//- rjf: top-level info specification +RADDBGI_PROC void rdim_set_top_level_info(RDIM_Root *root, RDIM_TopLevelInfo *tli); + +//- rjf: binary section building +RADDBGI_PROC void rdim_add_binary_section(RDIM_Root *root, + RDIM_String8 name, RADDBGI_BinarySectionFlags flags, + RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, + RADDBGI_U64 foff_opl); + +//- rjf: unit info building +RADDBGI_PROC RDIM_Unit* rdim_unit_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 unit_user_id, RADDBGI_U64 unit_user_id_hash); +RADDBGI_PROC void rdim_unit_set_info(RDIM_Root *root, RDIM_Unit *unit, RDIM_UnitInfo *info); +RADDBGI_PROC void rdim_unit_add_line_sequence(RDIM_Root *root, RDIM_Unit *unit, RDIM_LineSequence *line_sequence); +RADDBGI_PROC void rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RADDBGI_U64 first, RADDBGI_U64 opl); + +//- rjf: type info lookups/reservations +RADDBGI_PROC RDIM_Type* rdim_type_from_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash); +RADDBGI_PROC RDIM_Reservation* rdim_type_reserve_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash); +RADDBGI_PROC void rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type); + +//- rjf: nil/singleton types +RADDBGI_PROC RADDBGI_S32 rdim_type_is_unhandled_nil(RDIM_Root *root, RDIM_Type *type); +RADDBGI_PROC RDIM_Type* rdim_type_handled_nil(RDIM_Root *root); +RADDBGI_PROC RDIM_Type* rdim_type_nil(RDIM_Root *root); +RADDBGI_PROC RDIM_Type* rdim_type_variadic(RDIM_Root *root); + +//- rjf: base type info constructors +RADDBGI_PROC RDIM_Type* rdim_type_new(RDIM_Root *root); +RADDBGI_PROC RDIM_TypeUDT* rdim_type_udt_from_any_type(RDIM_Root *root, RDIM_Type *type); +RADDBGI_PROC RDIM_TypeUDT* rdim_type_udt_from_record_type(RDIM_Root *root, RDIM_Type *type); + +//- rjf: basic/operator type construction helpers +RADDBGI_PROC RDIM_Type* rdim_type_basic(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name); +RADDBGI_PROC RDIM_Type* rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeModifierFlags flags); +RADDBGI_PROC RDIM_Type* rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count); +RADDBGI_PROC RDIM_Type* rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeKind ptr_type_kind); +RADDBGI_PROC RDIM_Type* rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U64 count); +RADDBGI_PROC RDIM_Type* rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *params); +RADDBGI_PROC RDIM_Type* rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, struct RDIM_TypeList *params); + +//- rjf: udt type constructors +RADDBGI_PROC RDIM_Type* rdim_type_udt(RDIM_Root *root, RADDBGI_TypeKind record_type_kind, RDIM_String8 name, RADDBGI_U64 size); +RADDBGI_PROC RDIM_Type* rdim_type_enum(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name); +RADDBGI_PROC RDIM_Type* rdim_type_alias(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name); +RADDBGI_PROC RDIM_Type* rdim_type_incomplete(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name); + +//- rjf: type member building +RADDBGI_PROC void rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type, RADDBGI_U32 off); +RADDBGI_PROC void rdim_type_add_member_static_data(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); +RADDBGI_PROC void rdim_type_add_member_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); +RADDBGI_PROC void rdim_type_add_member_static_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); +RADDBGI_PROC void rdim_type_add_member_virtual_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); +RADDBGI_PROC void rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RADDBGI_U32 off); +RADDBGI_PROC void rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RADDBGI_U32 vptr_off, RADDBGI_U32 vtable_off); +RADDBGI_PROC void rdim_type_add_member_nested_type(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *nested_type); +RADDBGI_PROC void rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, RADDBGI_U64 val); + +//- rjf: type source coordinate specifications +RADDBGI_PROC void rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col); + +//- rjf: symbol info building +RADDBGI_PROC RDIM_Symbol* rdim_symbol_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 symbol_user_id, RADDBGI_U64 symbol_user_id_hash); +RADDBGI_PROC void rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info); + +//- rjf: scope info building +RADDBGI_PROC RDIM_Scope *rdim_scope_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 scope_user_id, RADDBGI_U64 scope_user_id_hash); +RADDBGI_PROC void rdim_scope_set_parent(RDIM_Root *root, RDIM_Scope *scope, RDIM_Scope *parent); +RADDBGI_PROC void rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl); +RADDBGI_PROC void rdim_scope_recursive_set_symbol(RDIM_Scope *scope, RDIM_Symbol *symbol); + +//- rjf: local info building +RADDBGI_PROC RDIM_Local* rdim_local_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 local_user_id, RADDBGI_U64 local_user_id_hash); +RADDBGI_PROC void rdim_local_set_basic_info(RDIM_Root *root, RDIM_Local *local, RDIM_LocalInfo *info); +RADDBGI_PROC RDIM_LocationSet* rdim_location_set_from_local(RDIM_Root *root, RDIM_Local *local); + +//- rjf: location info building +RADDBGI_PROC void rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RDIM_Location *location); +RADDBGI_PROC RDIM_Location* rdim_location_addr_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode); +RADDBGI_PROC RDIM_Location* rdim_location_val_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode); +RADDBGI_PROC RDIM_Location* rdim_location_addr_reg_plus_u16(RDIM_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset); +RADDBGI_PROC RDIM_Location* rdim_location_addr_addr_reg_plus_u16(RDIM_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset); +RADDBGI_PROC RDIM_Location* rdim_location_val_reg(RDIM_Root *root, RADDBGI_U8 reg_code); + +//- rjf: name map building +RADDBGI_PROC RDIM_NameMap* rdim_name_map_for_kind(RDIM_Root *root, RADDBGI_NameMapKind kind); +RADDBGI_PROC void rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 name, RADDBGI_U32 idx); + +//////////////////////////////// +//~ rjf: Debug Info Baking (Loose -> Tight) Functions + +//- rjf: bake context construction +RADDBGI_PROC RDIM_BakeCtx* rdim_bake_ctx_begin(RDIM_BakeParams *params); +RADDBGI_PROC void rdim_bake_ctx_release(RDIM_BakeCtx *bake_ctx); + +//- rjf: string baking +RADDBGI_PROC RADDBGI_U32 rdim_string(RDIM_BakeCtx *bctx, RDIM_String8 str); + +//- rjf: idx run baking +RADDBGI_PROC RADDBGI_U64 rdim_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count); +RADDBGI_PROC RADDBGI_U32 rdim_idx_run(RDIM_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count); + +//- rjf: data section baking +RADDBGI_PROC RADDBGI_U32 rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RADDBGI_U64 size, RADDBGI_DataSectionTag tag); + +//- rjf: paths baking +RADDBGI_PROC RDIM_String8 rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node); +RADDBGI_PROC void rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out); +RADDBGI_PROC RDIM_PathNode* rdim_paths_new_node(RDIM_BakeCtx *bctx); +RADDBGI_PROC RDIM_PathNode* rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir); +RADDBGI_PROC RDIM_PathNode* rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); +RADDBGI_PROC RADDBGI_U32 rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); +RADDBGI_PROC RDIM_SrcNode* rdim_paths_new_src_node(RDIM_BakeCtx *bctx); +RADDBGI_PROC RDIM_SrcNode* rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node); + +//- rjf: per-unit line info baking +RADDBGI_PROC RDIM_UnitLinesCombined* rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequenceNode *first_seq); + +//- rjf: per-src line info baking +RADDBGI_PROC RDIM_SrcLinesCombined* rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first); + +//- rjf: vmap baking +RADDBGI_PROC RDIM_VMap* rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RADDBGI_U64 marker_count); +RADDBGI_PROC RDIM_VMap* rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RADDBGI_U64 count); + +//- rjf: type info baking +RADDBGI_PROC RADDBGI_U32* rdim_idx_run_from_types(RDIM_Arena *arena, RDIM_Type **types, RADDBGI_U32 count); +RADDBGI_PROC RDIM_TypeData* rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx); + +//- rjf: symbol data baking +RADDBGI_PROC RDIM_SymbolData* rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx); + +//- rjf: name map baking +RADDBGI_PROC RDIM_NameMapBaked* rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_NameMap *map); + +//- rjf: top-level baking entry point +RADDBGI_PROC void rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out); + +#endif // RADDBGI_CONS_H diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 3f5a43ee..2111864e 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -634,7 +634,7 @@ entry_point(int argc, char **argv) if(out != 0 && params->output_name.size > 0) { String8List baked = {0}; - raddbgic_bake_file(scratch.arena, out->root, &baked); + rdim_bake_file(scratch.arena, out->root, &baked); U64 off = 0; for(String8Node *node = baked.first; node != 0; node = node->next) { diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 4e72888d..6bb32ceb 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -13,7 +13,7 @@ //- rjf: [h] #include "base/base_inc.h" #include "os/os_inc.h" -#include "raddbgi_cons_local/raddbgi_cons_local.h" +#include "raddbgi_make_local/raddbgi_make_local.h" #include "mdesk/mdesk.h" #include "hash_store/hash_store.h" #include "file_stream/file_stream.h" @@ -50,7 +50,7 @@ //- rjf: [c] #include "base/base_inc.c" #include "os/os_inc.c" -#include "raddbgi_cons_local/raddbgi_cons_local.c" +#include "raddbgi_make_local/raddbgi_make_local.c" #include "mdesk/mdesk.c" #include "hash_store/hash_store.c" #include "file_stream/file_stream.c" diff --git a/src/raddbgi_cons_local/raddbgi_cons_local.h b/src/raddbgi_cons_local/raddbgi_cons_local.h deleted file mode 100644 index 3b37a7b7..00000000 --- a/src/raddbgi_cons_local/raddbgi_cons_local.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RADDBGI_CONS_LOCAL_H -#define RADDBGI_CONS_LOCAL_H - -// rjf: base layer memory ops -#define RADDBGIC_MEMSET_OVERRIDE -#define RADDBGIC_MEMCPY_OVERRIDE -#define raddbgic_memset MemorySet -#define raddbgic_memcpy MemoryCopy - -// rjf: base layer string overrides -#define RADDBGI_STRING8_OVERRIDE -#define RADDBGIC_String8 String8 -#define RADDBGIC_String8_BaseMember str -#define RADDBGIC_String8_SizeMember size -#define RADDBGI_STRING8LIST_OVERRIDE -#define RADDBGIC_String8Node String8Node -#define RADDBGIC_String8Node_NextPtrMember next -#define RADDBGIC_String8Node_StringMember string -#define RADDBGIC_String8List String8List -#define RADDBGIC_String8List_FirstMember first -#define RADDBGIC_String8List_LastMember last -#define RADDBGIC_String8List_NodeCountMember node_count -#define RADDBGIC_String8List_TotalSizeMember total_size - -// rjf: base layer arena overrides -#define RADDBGIC_ARENA_OVERRIDE -#define RADDBGIC_Arena Arena -#define raddbgic_arena_alloc arena_alloc -#define raddbgic_arena_release arena_release -#define raddbgic_arena_pos arena_pos -#define raddbgic_arena_push arena_push -#define raddbgic_arena_pop_to arena_pop_to - -// rjf: base layer scratch arena overrides -#define RADDBGIC_SCRATCH_OVERRIDE -#define RADDBGIC_Temp Temp -#define raddbgic_temp_arena(t) ((t).arena) -#define raddbgic_scratch_begin scratch_begin -#define raddbgic_scratch_end scratch_end - -#include "lib_raddbgi_cons/raddbgi_cons.h" - -#endif // RADDBGI_CONS_LOCAL_H diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index bcfeecbb..643cd794 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -304,7 +304,7 @@ raddbgi_language_from_cv_language(CV_Language cv_language) //- rjf: pdb conversion context creation internal P2R_Ctx * -p2r_ctx_alloc(P2R_CtxParams *params, RADDBGIC_Root *out_root) +p2r_ctx_alloc(P2R_CtxParams *params, RDIM_Root *out_root) { Arena *arena = arena_alloc(); P2R_Ctx *pdb_ctx = push_array(arena, P2R_Ctx, 1); @@ -362,7 +362,7 @@ p2r_u32_from_numeric(P2R_Ctx *ctx, CV_NumericParsed *num) U32 n_u32 = (U32)n_u64; if(n_u64 > 0xFFFFFFFF) { - raddbgic_push_errorf(ctx->root, "constant too large"); + rdim_push_errorf(ctx->root, "constant too large"); n_u32 = 0; } return(n_u32); @@ -391,9 +391,9 @@ p2r_type_cons_main_passes(P2R_Ctx *ctx) // setup variadic itype -> node ProfScope("setup variadic itype -> node") { - RADDBGIC_Type *variadic_type = raddbgic_type_variadic(ctx->root); - RADDBGIC_Reservation *res = raddbgic_type_reserve_id(ctx->root, CV_TypeId_Variadic, CV_TypeId_Variadic); - raddbgic_type_fill_id(ctx->root, res, variadic_type); + RDIM_Type *variadic_type = rdim_type_variadic(ctx->root); + RDIM_Reservation *res = rdim_type_reserve_id(ctx->root, CV_TypeId_Variadic, CV_TypeId_Variadic); + rdim_type_fill_id(ctx->root, res, variadic_type); } // resolve forward references @@ -610,7 +610,7 @@ p2r_type_resolve_fwd(P2R_Ctx *ctx, CV_TypeId itype) return(result); } -internal RADDBGIC_Type* +internal RDIM_Type* p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype) { B32 is_basic = (itype < 0x1000); @@ -626,7 +626,7 @@ p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype) } // type handle from id - RADDBGIC_Type *result = raddbgic_type_from_id(ctx->root, itype, itype); + RDIM_Type *result = rdim_type_from_id(ctx->root, itype, itype); // basic type if(result == 0 && is_basic) @@ -643,14 +643,14 @@ p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype) // never return null, return "nil" instead if(result == 0) { - result = raddbgic_type_nil(ctx->root); + result = rdim_type_nil(ctx->root); } return(result); } internal void -p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype) +p2r_type_equip_members(P2R_Ctx *ctx, RDIM_Type *owner_type, CV_TypeId field_itype) { Temp scratch = scratch_begin(0, 0); @@ -763,9 +763,9 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ list_item_opl_off = name_off + name.size + 1; // emit member - RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, member->itype); + RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, member->itype); U32 offset_u32 = p2r_u32_from_numeric(ctx, &offset); - raddbgic_type_add_member_data_field(ctx->root, owner_type, name, mem_type, offset_u32); + rdim_type_add_member_data_field(ctx->root, owner_type, name, mem_type, offset_u32); } }break; @@ -785,8 +785,8 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ // TODO(allen): handle attribs // emit member - RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, stmember->itype); - raddbgic_type_add_member_static_data(ctx->root, owner_type, name, mem_type); + RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, stmember->itype); + rdim_type_add_member_static_data(ctx->root, owner_type, name, mem_type); } }break; @@ -870,18 +870,18 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ // TODO(allen): handle attribs // emit - RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, method->itype); + RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, method->itype); switch (prop) { default: { - raddbgic_type_add_member_method(ctx->root, owner_type, name, mem_type); + rdim_type_add_member_method(ctx->root, owner_type, name, mem_type); }break; case CV_MethodProp_Static: { - raddbgic_type_add_member_static_method(ctx->root, owner_type, name, mem_type); + rdim_type_add_member_static_method(ctx->root, owner_type, name, mem_type); }break; case CV_MethodProp_Virtual: @@ -889,7 +889,7 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - raddbgic_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); + rdim_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); }break; } } @@ -924,18 +924,18 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ // TODO(allen): handle attribs // emit - RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, one_method->itype); + RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, one_method->itype); switch (prop) { default: { - raddbgic_type_add_member_method(ctx->root, owner_type, name, mem_type); + rdim_type_add_member_method(ctx->root, owner_type, name, mem_type); }break; case CV_MethodProp_Static: { - raddbgic_type_add_member_static_method(ctx->root, owner_type, name, mem_type); + rdim_type_add_member_static_method(ctx->root, owner_type, name, mem_type); }break; case CV_MethodProp_Virtual: @@ -943,7 +943,7 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - raddbgic_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); + rdim_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); }break; } } @@ -963,8 +963,8 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ list_item_opl_off = name_off + name.size + 1; // emit member - RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, nest_type->itype); - raddbgic_type_add_member_nested_type(ctx->root, owner_type, mem_type); + RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, nest_type->itype); + rdim_type_add_member_nested_type(ctx->root, owner_type, mem_type); } }break; @@ -984,8 +984,8 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ // TODO(allen): handle attribs // emit member - RADDBGIC_Type *mem_type = p2r_type_resolve_itype(ctx, nest_type->itype); - raddbgic_type_add_member_nested_type(ctx->root, owner_type, mem_type); + RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, nest_type->itype); + rdim_type_add_member_nested_type(ctx->root, owner_type, mem_type); } }break; @@ -1005,9 +1005,9 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ // TODO(allen): handle attribs // emit member - RADDBGIC_Type *base_type = p2r_type_resolve_itype(ctx, bclass->itype); + RDIM_Type *base_type = p2r_type_resolve_itype(ctx, bclass->itype); U32 offset_u32 = p2r_u32_from_numeric(ctx, &offset); - raddbgic_type_add_member_base(ctx->root, owner_type, base_type, offset_u32); + rdim_type_add_member_base(ctx->root, owner_type, base_type, offset_u32); } }break; @@ -1031,11 +1031,11 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ // TODO(allen): handle attribs // emit member - RADDBGIC_Type *base_type = p2r_type_resolve_itype(ctx, vbclass->itype); + RDIM_Type *base_type = p2r_type_resolve_itype(ctx, vbclass->itype); U32 vbptr_offset_u32 = p2r_u32_from_numeric(ctx, &num1); U32 vtable_offset_u32 = p2r_u32_from_numeric(ctx, &num2); - raddbgic_type_add_member_virtual_base(ctx->root, owner_type, base_type, - vbptr_offset_u32, vtable_offset_u32); + rdim_type_add_member_virtual_base(ctx->root, owner_type, base_type, + vbptr_offset_u32, vtable_offset_u32); } }break; @@ -1053,8 +1053,8 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ default: { String8 kind_str = cv_string_from_leaf_kind(field_kind); - raddbgic_push_errorf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", - str8_varg(kind_str)); + rdim_push_errorf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", + str8_varg(kind_str)); }break; } @@ -1068,7 +1068,7 @@ p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_ } internal void -p2r_type_equip_enumerates(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype) +p2r_type_equip_enumerates(P2R_Ctx *ctx, RDIM_Type *owner_type, CV_TypeId field_itype) { Temp scratch = scratch_begin(0, 0); @@ -1181,15 +1181,15 @@ p2r_type_equip_enumerates(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId fie // emit enum val U64 val_u64 = cv_u64_from_numeric(&val); - raddbgic_type_add_enum_val(ctx->root, owner_type, name, val_u64); + rdim_type_add_enum_val(ctx->root, owner_type, name, val_u64); }break; // unhandled or invalid cases default: { String8 kind_str = cv_string_from_leaf_kind(field_kind); - raddbgic_push_errorf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", - str8_varg(kind_str)); + rdim_push_errorf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", + str8_varg(kind_str)); }break; } @@ -1202,7 +1202,7 @@ p2r_type_equip_enumerates(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId fie scratch_end(scratch); } -internal RADDBGIC_Type* +internal RDIM_Type* p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype) { Assert(itype < 0x1000); @@ -1210,183 +1210,183 @@ p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype) CV_BasicPointerKind basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); CV_BasicType basic_type_code = CV_BasicTypeFromTypeId(itype); - RADDBGIC_Reservation *basic_res = raddbgic_type_reserve_id(ctx->root, basic_type_code, basic_type_code); + RDIM_Reservation *basic_res = rdim_type_reserve_id(ctx->root, basic_type_code, basic_type_code); - RADDBGIC_Type *basic_type = 0; + RDIM_Type *basic_type = 0; switch (basic_type_code) { case CV_BasicType_VOID: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Void, str8_lit("void")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Void, str8_lit("void")); }break; case CV_BasicType_HRESULT: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("HRESULT")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("HRESULT")); }break; case CV_BasicType_RCHAR: case CV_BasicType_CHAR: case CV_BasicType_CHAR8: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Char8, str8_lit("char")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Char8, str8_lit("char")); }break; case CV_BasicType_UCHAR: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_UChar8, str8_lit("UCHAR")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_UChar8, str8_lit("UCHAR")); }break; case CV_BasicType_WCHAR: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_UChar16, str8_lit("WCHAR")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_UChar16, str8_lit("WCHAR")); }break; case CV_BasicType_CHAR16: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Char16, str8_lit("CHAR16")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Char16, str8_lit("CHAR16")); }break; case CV_BasicType_CHAR32: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Char32, str8_lit("CHAR32")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Char32, str8_lit("CHAR32")); }break; case CV_BasicType_BOOL8: case CV_BasicType_INT8: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S8, str8_lit("S8")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S8, str8_lit("S8")); }break; case CV_BasicType_BOOL16: case CV_BasicType_INT16: case CV_BasicType_SHORT: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S16, str8_lit("S16")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S16, str8_lit("S16")); }break; case CV_BasicType_BOOL32: case CV_BasicType_INT32: case CV_BasicType_LONG: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S32, str8_lit("S32")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S32, str8_lit("S32")); }break; case CV_BasicType_BOOL64: case CV_BasicType_INT64: case CV_BasicType_QUAD: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S64, str8_lit("S64")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S64, str8_lit("S64")); }break; case CV_BasicType_INT128: case CV_BasicType_OCT: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_S128, str8_lit("S128")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S128, str8_lit("S128")); }break; case CV_BasicType_UINT8: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U8, str8_lit("U8")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U8, str8_lit("U8")); }break; case CV_BasicType_UINT16: case CV_BasicType_USHORT: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U16, str8_lit("U16")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U16, str8_lit("U16")); }break; case CV_BasicType_UINT32: case CV_BasicType_ULONG: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U32, str8_lit("U32")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U32, str8_lit("U32")); }break; case CV_BasicType_UINT64: case CV_BasicType_UQUAD: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U64, str8_lit("U64")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U64, str8_lit("U64")); }break; case CV_BasicType_UINT128: case CV_BasicType_UOCT: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_U128, str8_lit("U128")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U128, str8_lit("U128")); }break; case CV_BasicType_FLOAT16: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F16, str8_lit("F16")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F16, str8_lit("F16")); }break; case CV_BasicType_FLOAT32: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F32, str8_lit("F32")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F32, str8_lit("F32")); }break; case CV_BasicType_FLOAT32PP: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F32PP, str8_lit("F32PP")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F32PP, str8_lit("F32PP")); }break; case CV_BasicType_FLOAT48: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F48, str8_lit("F48")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F48, str8_lit("F48")); }break; case CV_BasicType_FLOAT64: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F64, str8_lit("F64")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F64, str8_lit("F64")); }break; case CV_BasicType_FLOAT80: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F80, str8_lit("F80")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F80, str8_lit("F80")); }break; case CV_BasicType_FLOAT128: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_F128, str8_lit("F128")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F128, str8_lit("F128")); }break; case CV_BasicType_COMPLEX32: { basic_type = - raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF32, str8_lit("ComplexF32")); + rdim_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF32, str8_lit("ComplexF32")); }break; case CV_BasicType_COMPLEX64: { basic_type = - raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF64, str8_lit("ComplexF64")); + rdim_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF64, str8_lit("ComplexF64")); }break; case CV_BasicType_COMPLEX80: { basic_type = - raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF80, str8_lit("ComplexF80")); + rdim_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF80, str8_lit("ComplexF80")); }break; case CV_BasicType_COMPLEX128: { basic_type = - raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF128, str8_lit("ComplexF128")); + rdim_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF128, str8_lit("ComplexF128")); }break; case CV_BasicType_PTR: { - basic_type = raddbgic_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("PTR")); + basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("PTR")); }break; } // basic resolve - raddbgic_type_fill_id(ctx->root, basic_res, basic_type); + rdim_type_fill_id(ctx->root, basic_res, basic_type); // wrap in constructed type - RADDBGIC_Type *constructed_type = 0; + RDIM_Type *constructed_type = 0; if(basic_ptr_kind != 0 && basic_type != 0) { - RADDBGIC_Reservation *constructed_res = raddbgic_type_reserve_id(ctx->root, itype, itype); + RDIM_Reservation *constructed_res = rdim_type_reserve_id(ctx->root, itype, itype); switch (basic_ptr_kind) { @@ -1397,16 +1397,16 @@ p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype) case CV_BasicPointerKind_16_32BIT: case CV_BasicPointerKind_64BIT: { - constructed_type = raddbgic_type_pointer(ctx->root, basic_type, RADDBGI_TypeKind_Ptr); + constructed_type = rdim_type_pointer(ctx->root, basic_type, RADDBGI_TypeKind_Ptr); }break; } // constructed resolve - raddbgic_type_fill_id(ctx->root, constructed_res, constructed_type); + rdim_type_fill_id(ctx->root, constructed_res, constructed_type); } // select output - RADDBGIC_Type *result = basic_type; + RDIM_Type *result = basic_type; if(basic_ptr_kind != 0) { result = constructed_type; @@ -1415,17 +1415,17 @@ p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype) return(result); } -internal RADDBGIC_Type* +internal RDIM_Type* p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) { Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); - RADDBGIC_Reservation *res = raddbgic_type_reserve_id(ctx->root, itype, itype); + RDIM_Reservation *res = rdim_type_reserve_id(ctx->root, itype, itype); CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[itype - ctx->leaf->itype_first]; String8 data = ctx->leaf->data; - RADDBGIC_Type *result = 0; + RDIM_Type *result = 0; if(range->off + range->hdr.size <= data.size) { U8 *first = data.str + range->off + 2; @@ -1450,10 +1450,10 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) flags |= RADDBGI_TypeModifierFlag_Volatile; } - RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, modifier->itype); + RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, modifier->itype); if(flags != 0) { - result = raddbgic_type_modifier(ctx->root, direct_type, flags); + result = rdim_type_modifier(ctx->root, direct_type, flags); } else { @@ -1505,13 +1505,13 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) type_kind = RADDBGI_TypeKind_RRef; } - RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, pointer->itype); - RADDBGIC_Type *ptr_type = raddbgic_type_pointer(ctx->root, direct_type, type_kind); + RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, pointer->itype); + RDIM_Type *ptr_type = rdim_type_pointer(ctx->root, direct_type, type_kind); result = ptr_type; if(modifier_flags != 0) { - result = raddbgic_type_modifier(ctx->root, ptr_type, modifier_flags); + result = rdim_type_modifier(ctx->root, ptr_type, modifier_flags); } } }break; @@ -1527,12 +1527,12 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // TODO(allen): handle call_kind & attribs - RADDBGIC_Type *ret_type = p2r_type_resolve_and_check(ctx, procedure->ret_itype); + RDIM_Type *ret_type = p2r_type_resolve_and_check(ctx, procedure->ret_itype); - RADDBGIC_TypeList param_list = {0}; + RDIM_TypeList param_list = {0}; p2r_type_resolve_arglist(scratch.arena, ¶m_list, ctx, procedure->arg_itype); - result = raddbgic_type_proc(ctx->root, ret_type, ¶m_list); + result = rdim_type_proc(ctx->root, ret_type, ¶m_list); scratch_end(scratch); } @@ -1550,20 +1550,20 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // TODO(allen): handle call_kind & attribs // TODO(allen): preserve "this_adjust" - RADDBGIC_Type *ret_type = p2r_type_resolve_and_check(ctx, mfunction->ret_itype); + RDIM_Type *ret_type = p2r_type_resolve_and_check(ctx, mfunction->ret_itype); - RADDBGIC_TypeList param_list = {0}; + RDIM_TypeList param_list = {0}; p2r_type_resolve_arglist(scratch.arena, ¶m_list, ctx, mfunction->arg_itype); - RADDBGIC_Type *this_type = 0; + RDIM_Type *this_type = 0; if(mfunction->this_itype != 0) { this_type = p2r_type_resolve_and_check(ctx, mfunction->this_itype); - result = raddbgic_type_method(ctx->root, this_type, ret_type, ¶m_list); + result = rdim_type_method(ctx->root, this_type, ret_type, ¶m_list); } else { - result = raddbgic_type_proc(ctx->root, ret_type, ¶m_list); + result = rdim_type_proc(ctx->root, ret_type, ¶m_list); } scratch_end(scratch); @@ -1576,8 +1576,8 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) if(sizeof(CV_LeafBitField) <= cap) { CV_LeafBitField *bit_field = (CV_LeafBitField*)first; - RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, bit_field->itype); - result = raddbgic_type_bitfield(ctx->root, direct_type, bit_field->pos, bit_field->len); + RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, bit_field->itype); + result = rdim_type_bitfield(ctx->root, direct_type, bit_field->pos, bit_field->len); } }break; @@ -1594,7 +1594,7 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) U64 full_size = cv_u64_from_numeric(&array_count); - RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, array->entry_itype); + RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, array->entry_itype); U64 count = full_size; if(direct_type != 0 && direct_type->byte_size != 0) { @@ -1602,7 +1602,7 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) } // build type - result = raddbgic_type_array(ctx->root, direct_type, count); + result = rdim_type_array(ctx->root, direct_type, count); } }break; @@ -1633,7 +1633,7 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) { type_kind = RADDBGI_TypeKind_IncompleteClass; } - result = raddbgic_type_incomplete(ctx->root, type_kind, name); + result = rdim_type_incomplete(ctx->root, type_kind, name); } // complete type @@ -1644,7 +1644,7 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) { type_kind = RADDBGI_TypeKind_Class; } - result = raddbgic_type_udt(ctx->root, type_kind, name, size_u64); + result = rdim_type_udt(ctx->root, type_kind, name, size_u64); // remember to revisit this for members { @@ -1684,7 +1684,7 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) { type_kind = RADDBGI_TypeKind_IncompleteClass; } - result = raddbgic_type_incomplete(ctx->root, type_kind, name); + result = rdim_type_incomplete(ctx->root, type_kind, name); } // complete type @@ -1695,7 +1695,7 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) { type_kind = RADDBGI_TypeKind_Class; } - result = raddbgic_type_udt(ctx->root, type_kind, name, size_u64); + result = rdim_type_udt(ctx->root, type_kind, name, size_u64); // remember to revisit this for members { @@ -1730,13 +1730,13 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) if(lf_union->props & CV_TypeProp_FwdRef) { result = - raddbgic_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteUnion, name); + rdim_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteUnion, name); } // complete type else { - result = raddbgic_type_udt(ctx->root, RADDBGI_TypeKind_Union, name, size_u64); + result = rdim_type_udt(ctx->root, RADDBGI_TypeKind_Union, name, size_u64); // remember to revisit this for members { @@ -1765,14 +1765,14 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // incomplete type if(lf_enum->props & CV_TypeProp_FwdRef) { - result = raddbgic_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteEnum, name); + result = rdim_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteEnum, name); } // complete type else { - RADDBGIC_Type *direct_type = p2r_type_resolve_and_check(ctx, lf_enum->base_itype); - result = raddbgic_type_enum(ctx->root, direct_type, name); + RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, lf_enum->base_itype); + result = rdim_type_enum(ctx->root, direct_type, name); // remember to revisit this for enumerates { @@ -1791,7 +1791,7 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) case CV_LeafKind_VFTABLE: case CV_LeafKind_LABEL: { - result = raddbgic_type_handled_nil(ctx->root); + result = rdim_type_handled_nil(ctx->root); }break; // do nothing cases - these get handled in special passes and @@ -1932,30 +1932,30 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) default: { String8 kind_str = cv_string_from_leaf_kind(range->hdr.kind); - raddbgic_push_errorf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", - str8_varg(kind_str), range->hdr.kind); + rdim_push_errorf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", + str8_varg(kind_str), range->hdr.kind); }break; } } - raddbgic_type_fill_id(ctx->root, res, result); + rdim_type_fill_id(ctx->root, res, result); return(result); } -internal RADDBGIC_Type* +internal RDIM_Type* p2r_type_resolve_and_check(P2R_Ctx *ctx, CV_TypeId itype) { - RADDBGIC_Type *result = p2r_type_resolve_itype(ctx, itype); - if(raddbgic_type_is_unhandled_nil(ctx->root, result)) + RDIM_Type *result = p2r_type_resolve_itype(ctx, itype); + if(rdim_type_is_unhandled_nil(ctx->root, result)) { - raddbgic_push_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); + rdim_push_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); } return(result); } internal void -p2r_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, +p2r_type_resolve_arglist(Arena *arena, RDIM_TypeList *out, P2R_Ctx *ctx, CV_TypeId arglist_itype) { ProfBeginFunction(); @@ -1982,8 +1982,8 @@ p2r_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, U32 clamped_count = ClampTop(arglist->count, max_count); for(U32 i = 0; i < clamped_count; i += 1) { - RADDBGIC_Type *param_type = p2r_type_resolve_and_check(ctx, itypes[i]); - raddbgic_type_list_push(arena, out, param_type); + RDIM_Type *param_type = p2r_type_resolve_and_check(ctx, itypes[i]); + rdim_type_list_push(arena, out, param_type); } } @@ -1993,12 +1993,12 @@ p2r_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, ProfEnd(); } -internal RADDBGIC_Type* +internal RDIM_Type* p2r_type_from_name(P2R_Ctx *ctx, String8 name) { // TODO(rjf): no idea if this is correct CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); - RADDBGIC_Type *result = raddbgic_type_from_id(ctx->root, cv_type_id, cv_type_id); + RDIM_Type *result = rdim_type_from_id(ctx->root, cv_type_id, cv_type_id); return(result); } @@ -2099,7 +2099,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // ProfScope("map out data associations") { - RADDBGIC_Symbol *current_proc = 0; + RDIM_Symbol *current_proc = 0; CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; for(CV_RecRange *rec_range = rec_ranges_first; @@ -2149,7 +2149,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { U64 symbol_id = user_id_base + sym_off_first; U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - current_proc = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + current_proc = rdim_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); }break; } } @@ -2160,7 +2160,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // ProfScope("main symbol construction pass") { - RADDBGIC_LocationSet *defrange_target = 0; + RDIM_LocationSet *defrange_target = 0; B32 defrange_target_is_param = 0; U64 local_num = 1; U64 scope_num = 1; @@ -2193,8 +2193,8 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } //- rjf: unpack current state - RADDBGIC_Scope *current_scope = p2r_symbol_current_scope(ctx); - RADDBGIC_Symbol *current_procedure = 0; + RDIM_Scope *current_scope = p2r_symbol_current_scope(ctx); + RDIM_Symbol *current_procedure = 0; if(current_scope != 0) { current_procedure = current_scope->symbol; @@ -2222,8 +2222,8 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U64 scope_id = user_id_base + scope_num; scope_num += 1; U64 scope_hash = p2r_hash_from_scope_user_id(sym_unique_id_hash, scope_id); - RADDBGIC_Scope *block_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); - raddbgic_scope_set_parent(ctx->root, block_scope, current_scope); + RDIM_Scope *block_scope = rdim_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); + rdim_scope_set_parent(ctx->root, block_scope, current_scope); p2r_symbol_push_scope(ctx, block_scope, current_procedure); // set voff range @@ -2232,7 +2232,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { U64 voff_first = section->voff + block32->off; U64 voff_last = voff_first + block32->len; - raddbgic_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last); + rdim_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last); } }break; @@ -2256,10 +2256,10 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) p2r_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); // type of variable - RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, data32->itype); + RDIM_Type *type = p2r_type_resolve_itype(ctx, data32->itype); // container type - RADDBGIC_Type *container_type = 0; + RDIM_Type *container_type = 0; U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); if(container_name_opl > 2) { @@ -2268,7 +2268,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } // container symbol - RADDBGIC_Symbol *container_symbol = 0; + RDIM_Symbol *container_symbol = 0; if(container_type == 0) { container_symbol = current_procedure; @@ -2280,10 +2280,10 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // cons this symbol U64 symbol_id = user_id_base + sym_off_first; U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + RDIM_Symbol *symbol = rdim_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - RADDBGIC_SymbolInfo info = zero_struct; - info.kind = RADDBGIC_SymbolKind_GlobalVariable; + RDIM_SymbolInfo info = zero_struct; + info.kind = RDIM_SymbolKind_GlobalVariable; info.name = name; info.type = type; info.is_extern = is_extern; @@ -2291,7 +2291,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) info.container_type = container_type; info.container_symbol = container_symbol; - raddbgic_symbol_set_info(ctx->root, symbol, &info); + rdim_symbol_set_info(ctx->root, symbol, &info); } }break; @@ -2301,10 +2301,10 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { CV_SymProc32 *proc32 = (CV_SymProc32*)sym_header_struct_base; String8 name = str8_cstring_capped(proc32+1, sym_data_opl); - RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, proc32->itype); + RDIM_Type *type = p2r_type_resolve_itype(ctx, proc32->itype); // container type - RADDBGIC_Type *container_type = 0; + RDIM_Type *container_type = 0; U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); if(container_name_opl > 2) { @@ -2313,7 +2313,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } // container symbol - RADDBGIC_Symbol *container_symbol = 0; + RDIM_Symbol *container_symbol = 0; if(container_type == 0) { container_symbol = current_procedure; @@ -2322,7 +2322,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // get this symbol handle U64 symbol_id = user_id_base + sym_off_first; U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RADDBGIC_Symbol *proc_symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + RDIM_Symbol *proc_symbol = rdim_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); // scope @@ -2333,7 +2333,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // no parent. U64 scope_id = user_id_base + scope_num; U64 scope_hash = p2r_hash_from_scope_user_id(sym_unique_id_hash, scope_id); - RADDBGIC_Scope *root_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); + RDIM_Scope *root_scope = rdim_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); p2r_symbol_push_scope(ctx, root_scope, proc_symbol); scope_num += 1; @@ -2344,7 +2344,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { U64 voff_first = section->voff + proc32->off; U64 voff_last = voff_first + proc32->len; - raddbgic_scope_add_voff_range(ctx->root, root_scope, voff_first, voff_last); + rdim_scope_add_voff_range(ctx->root, root_scope, voff_first, voff_last); voff = voff_first; } @@ -2360,8 +2360,8 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) B32 is_extern = (kind == CV_SymKind_GPROC32); // set symbol info - RADDBGIC_SymbolInfo info = zero_struct; - info.kind = RADDBGIC_SymbolKind_Procedure; + RDIM_SymbolInfo info = zero_struct; + info.kind = RDIM_SymbolKind_Procedure; info.name = name; info.link_name = link_name; info.type = type; @@ -2370,7 +2370,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) info.container_symbol = container_symbol; info.root_scope = root_scope; - raddbgic_symbol_set_info(ctx->root, proc_symbol, &info); + rdim_symbol_set_info(ctx->root, proc_symbol, &info); }break; //- rjf: REGREL32 @@ -2381,7 +2381,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)sym_header_struct_base; String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); - RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, regrel32->itype); + RDIM_Type *type = p2r_type_resolve_itype(ctx, regrel32->itype); // extract regrel's info CV_Reg cv_reg = regrel32->reg; @@ -2419,15 +2419,15 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // emit local U64 local_id = user_id_base + local_num;; U64 local_id_hash = p2r_hash_from_local_user_id(sym_unique_id_hash, local_id); - RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); + RDIM_Local *local_var = rdim_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; - RADDBGIC_LocalInfo info = {0}; + RDIM_LocalInfo info = {0}; info.kind = local_kind; info.scope = current_scope; info.name = name; info.type = type; - raddbgic_local_set_basic_info(ctx->root, local_var, &info); + rdim_local_set_basic_info(ctx->root, local_var, &info); // add location to local { @@ -2461,12 +2461,12 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U32 byte_pos = 0; // set location case - RADDBGIC_Location *loc = + RDIM_Location *loc = p2r_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RADDBGIC_LocationSet *locset = raddbgic_location_set_from_local(ctx->root, local_var); - raddbgic_location_set_add_case(ctx->root, locset, 0, max_U64, loc); + RDIM_LocationSet *locset = rdim_location_set_from_local(ctx->root, local_var); + rdim_location_set_add_case(ctx->root, locset, 0, max_U64, loc); } }break; @@ -2477,10 +2477,10 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) CV_SymThread32 *thread32 = (CV_SymThread32*)sym_header_struct_base; String8 name = str8_cstring_capped(thread32+1, sym_data_opl); U32 tls_off = thread32->tls_off; - RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, thread32->itype); + RDIM_Type *type = p2r_type_resolve_itype(ctx, thread32->itype); // container type - RADDBGIC_Type *container_type = 0; + RDIM_Type *container_type = 0; U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); if(container_name_opl > 2) { @@ -2489,7 +2489,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } // container symbol - RADDBGIC_Symbol *container_symbol = 0; + RDIM_Symbol *container_symbol = 0; if(container_type == 0) { container_symbol = current_procedure; @@ -2501,10 +2501,10 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // setup symbol U64 symbol_id = user_id_base + sym_off_first; U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); + RDIM_Symbol *symbol = rdim_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - RADDBGIC_SymbolInfo info = zero_struct; - info.kind = RADDBGIC_SymbolKind_ThreadVariable; + RDIM_SymbolInfo info = zero_struct; + info.kind = RDIM_SymbolKind_ThreadVariable; info.name = name; info.type = type; info.is_extern = is_extern; @@ -2512,7 +2512,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) info.container_type = container_type; info.container_symbol = container_symbol; - raddbgic_symbol_set_info(ctx->root, symbol, &info); + rdim_symbol_set_info(ctx->root, symbol, &info); }break; //- rjf: LOCAL @@ -2520,7 +2520,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { CV_SymLocal *slocal = (CV_SymLocal*)sym_header_struct_base; String8 name = str8_cstring_capped(slocal+1, sym_data_opl); - RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, slocal->itype); + RDIM_Type *type = p2r_type_resolve_itype(ctx, slocal->itype); // determine how to handle B32 begin_a_global_modification = 0; @@ -2551,20 +2551,20 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // emit local U64 local_id = user_id_base + local_num; U64 local_id_hash = p2r_hash_from_local_user_id(sym_unique_id_hash, local_id); - RADDBGIC_Local *local_var = raddbgic_local_handle_from_user_id(ctx->root, local_id, local_id_hash); + RDIM_Local *local_var = rdim_local_handle_from_user_id(ctx->root, local_id, local_id_hash); local_num += 1; local_var->kind = local_kind; local_var->name = name; local_var->type = type; - RADDBGIC_LocalInfo info = {0}; + RDIM_LocalInfo info = {0}; info.kind = local_kind; info.scope = current_scope; info.name = name; info.type = type; - raddbgic_local_set_basic_info(ctx->root, local_var, &info); + rdim_local_set_basic_info(ctx->root, local_var, &info); - defrange_target = raddbgic_location_set_from_local(ctx->root, local_var); + defrange_target = rdim_location_set_from_local(ctx->root, local_var); defrange_target_is_param = (local_kind == RADDBGI_LocalKind_Parameter); } }break; @@ -2581,7 +2581,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); // setup location - RADDBGIC_Location *location = raddbgic_location_val_reg(ctx->root, register_code); + RDIM_Location *location = rdim_location_val_reg(ctx->root, register_code); // extract range info CV_LvarAddrRange *range = &defrange_register->range; @@ -2610,7 +2610,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U32 byte_size = ctx->addr_size; U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel->off; - RADDBGIC_Location *location = + RDIM_Location *location = p2r_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); @@ -2640,7 +2640,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); // setup location - RADDBGIC_Location *location = raddbgic_location_val_reg(ctx->root, register_code); + RDIM_Location *location = rdim_location_val_reg(ctx->root, register_code); // extract range info CV_LvarAddrRange *range = &defrange_subfield_register->range; @@ -2671,13 +2671,13 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U32 byte_size = ctx->addr_size; U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel_full_scope->off; - RADDBGIC_Location *location = + RDIM_Location *location = p2r_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); // emit location - raddbgic_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location); + rdim_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location); }break; //- rjf: DEFRANGE_REGISTER_REL @@ -2697,7 +2697,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) S64 var_off = defrange_register_rel->reg_off; // setup location - RADDBGIC_Location *location = + RDIM_Location *location = p2r_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, var_off, extra_indirection_to_value); @@ -2716,7 +2716,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; String8 name = str8_cstring_capped(file_static+1, sym_data_opl); - RADDBGIC_Type *type = p2r_type_resolve_itype(ctx, file_static->itype); + RDIM_Type *type = p2r_type_resolve_itype(ctx, file_static->itype); // TODO(allen): emit a global modifier symbol @@ -2729,7 +2729,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) //- rjf: non-empty scope stack? -> error { - RADDBGIC_Scope *scope = p2r_symbol_current_scope(ctx); + RDIM_Scope *scope = p2r_symbol_current_scope(ctx); if(scope != 0) { // TODO(allen): emit error @@ -2804,7 +2804,7 @@ p2r_gather_link_names(P2R_Ctx *ctx, CV_SymParsed *sym) // "frameproc" map internal void -p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RADDBGIC_Symbol *key,P2R_FrameProcData *data) +p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RDIM_Symbol *key,P2R_FrameProcData *data) { ProfBeginFunction(); U64 key_int = IntFromPtr(key); @@ -2844,7 +2844,7 @@ p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RADDBGIC_Symbol *key,P2R_FrameProcData } internal P2R_FrameProcData* -p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RADDBGIC_Symbol *key) +p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RDIM_Symbol *key) { U64 key_int = IntFromPtr(key); P2R_FrameProcMap *map = &ctx->frame_proc_map; @@ -2868,7 +2868,7 @@ p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RADDBGIC_Symbol *key) // scope stack internal void -p2r_symbol_push_scope(P2R_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol) +p2r_symbol_push_scope(P2R_Ctx *ctx, RDIM_Scope *scope, RDIM_Symbol *symbol) { P2R_ScopeNode *node = ctx->scope_node_free; if(node == 0) @@ -3007,7 +3007,7 @@ p2r_known_global_insert(Arena *arena, P2R_KnownGlobalSet *set, String8 name, U64 // location info helpers -internal RADDBGIC_Location* +internal RDIM_Location* p2r_location_from_addr_reg_off(P2R_Ctx *ctx, RADDBGI_RegisterCode reg_code, U32 reg_byte_size, @@ -3015,40 +3015,40 @@ p2r_location_from_addr_reg_off(P2R_Ctx *ctx, S64 offset, B32 extra_indirection) { - RADDBGIC_Location *result = 0; + RDIM_Location *result = 0; if(0 <= offset && offset <= (S64)max_U16) { if(extra_indirection) { - result = raddbgic_location_addr_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); + result = rdim_location_addr_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); } else { - result = raddbgic_location_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); + result = rdim_location_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); } } else { Arena *arena = ctx->arena; - RADDBGIC_EvalBytecode bytecode = {0}; + RDIM_EvalBytecode bytecode = {0}; U32 regread_param = RADDBGI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); - raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_RegRead, regread_param); - raddbgic_bytecode_push_sconst(arena, &bytecode, offset); - raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_Add, 0); + rdim_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_RegRead, regread_param); + rdim_bytecode_push_sconst(arena, &bytecode, offset); + rdim_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_Add, 0); if(extra_indirection) { - raddbgic_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_MemRead, ctx->addr_size); + rdim_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_MemRead, ctx->addr_size); } - result = raddbgic_location_addr_bytecode_stream(ctx->root, &bytecode); + result = rdim_location_addr_bytecode_stream(ctx->root, &bytecode); } return(result); } internal CV_EncodedFramePtrReg -p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, RADDBGIC_Symbol *proc, B32 param_base) +p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, RDIM_Symbol *proc, B32 param_base) { CV_EncodedFramePtrReg result = 0; if(proc != 0) @@ -3119,8 +3119,8 @@ p2r_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg e internal void p2r_location_over_lvar_addr_range(P2R_Ctx *ctx, - RADDBGIC_LocationSet *locset, - RADDBGIC_Location *location, + RDIM_LocationSet *locset, + RDIM_Location *location, CV_LvarAddrRange *range, CV_LvarAddrGap *gaps, U64 gap_count) { @@ -3145,14 +3145,14 @@ p2r_location_over_lvar_addr_range(P2R_Ctx *ctx, U64 voff_gap_opl = voff_gap_first + gap_ptr->len; if(voff_cursor < voff_gap_first) { - raddbgic_location_set_add_case(ctx->root, locset, voff_cursor, voff_gap_first, location); + rdim_location_set_add_case(ctx->root, locset, voff_cursor, voff_gap_first, location); } voff_cursor = voff_gap_opl; } if(voff_cursor < voff_opl) { - raddbgic_location_set_add_case(ctx->root, locset, voff_cursor, voff_opl, location); + rdim_location_set_add_case(ctx->root, locset, voff_cursor, voff_opl, location); } } @@ -3494,7 +3494,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // setup root - RADDBGIC_RootParams root_params = {0}; + RDIM_RootParams root_params = {0}; root_params.addr_size = addr_size; root_params.bucket_count_units = comp_unit_count; @@ -3504,7 +3504,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ root_params.bucket_count_types = tpi->itype_opl; root_params.bucket_count_type_constructs = tpi->itype_opl; - RADDBGIC_Root *root = raddbgic_root_alloc(&root_params); + RDIM_Root *root = rdim_root_alloc(&root_params); out->root = root; // top level info @@ -3522,13 +3522,13 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ } // set top level info - RADDBGIC_TopLevelInfo tli = {0}; + RDIM_TopLevelInfo tli = {0}; tli.architecture = architecture; tli.exe_name = params->input_exe_name; tli.exe_hash = exe_hash; tli.voff_max = voff_max; - raddbgic_set_top_level_info(root, &tli); + rdim_set_top_level_info(root, &tli); } @@ -3543,9 +3543,9 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 name = str8_cstring_capped(name_first, name_opl); RADDBGI_BinarySectionFlags flags = raddbgi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); - raddbgic_add_binary_section(root, name, flags, - coff_ptr->voff, coff_ptr->voff + coff_ptr->vsize, - coff_ptr->foff, coff_ptr->foff + coff_ptr->fsize); + rdim_add_binary_section(root, name, flags, + coff_ptr->voff, coff_ptr->voff + coff_ptr->vsize, + coff_ptr->foff, coff_ptr->foff + coff_ptr->fsize); } } @@ -3592,16 +3592,16 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ RADDBGI_Language lang = raddbgi_language_from_cv_language(sym->info.language); // basic per unit info - RADDBGIC_Unit *unit_handle = raddbgic_unit_handle_from_user_id(root, i, i); + RDIM_Unit *unit_handle = rdim_unit_handle_from_user_id(root, i, i); - RADDBGIC_UnitInfo info = {0}; + RDIM_UnitInfo info = {0}; info.unit_name = unit_name; info.compiler_name = compiler_name; info.object_file = obj_name; info.archive_file = archive_file; info.language = lang; - raddbgic_unit_set_info(root, unit_handle, &info); + rdim_unit_set_info(root, unit_handle, &info); // unit's line info for(CV_C13SubSectionNode *node = unit_c13->first_sub_section; @@ -3615,13 +3615,13 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ lines_n = lines_n->next) { CV_C13LinesParsed *lines = &lines_n->v; - RADDBGIC_LineSequence seq = {0}; + RDIM_LineSequence seq = {0}; seq.file_name = lines->file_name; seq.voffs = lines->voffs; seq.line_nums = lines->line_nums; seq.col_nums = lines->col_nums; seq.line_count = lines->line_count; - raddbgic_unit_add_line_sequence(root, unit_handle, &seq); + rdim_unit_add_line_sequence(root, unit_handle, &seq); } } } @@ -3637,10 +3637,10 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ { if(contrib_ptr->mod < root->unit_count) { - RADDBGIC_Unit *unit_handle = raddbgic_unit_handle_from_user_id(root, contrib_ptr->mod, contrib_ptr->mod); - raddbgic_unit_vmap_add_range(root, unit_handle, - contrib_ptr->voff_first, - contrib_ptr->voff_opl); + RDIM_Unit *unit_handle = rdim_unit_handle_from_user_id(root, contrib_ptr->mod, contrib_ptr->mod); + rdim_unit_vmap_add_range(root, unit_handle, + contrib_ptr->voff_first, + contrib_ptr->voff_opl); } } } @@ -3673,7 +3673,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // conversion errors if(!params->hide_errors.converting) { - for(RADDBGIC_Error *error = raddbgic_first_error_from_root(root); + for(RDIM_Error *error = rdim_first_error_from_root(root); error != 0; error = error->next) { @@ -3894,12 +3894,12 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ {str8_lit("p2r_ctx frame_proc_map"), p2r_ctx?p2r_ctx->frame_proc_map.buckets_count:0, p2r_ctx?p2r_ctx->frame_proc_map.pair_count:0, p2r_ctx?p2r_ctx->frame_proc_map.bucket_collision_count:0}, {str8_lit("p2r_ctx known_globals"), p2r_ctx?p2r_ctx->known_globals.buckets_count:0, p2r_ctx?p2r_ctx->known_globals.global_count:0, p2r_ctx?p2r_ctx->known_globals.bucket_collision_count:0}, {str8_lit("p2r_ctx link_names"), p2r_ctx?p2r_ctx->link_names.buckets_count:0, p2r_ctx?p2r_ctx->link_names.link_name_count:0, p2r_ctx?p2r_ctx->link_names.bucket_collision_count:0}, - {str8_lit("raddbgic_root unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count, out->root->unit_map.bucket_collision_count}, - {str8_lit("raddbgic_root symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count, out->root->symbol_map.bucket_collision_count}, - {str8_lit("raddbgic_root scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count, out->root->scope_map.bucket_collision_count}, - {str8_lit("raddbgic_root local_map"), out->root->local_map.buckets_count, out->root->local_map.pair_count, out->root->local_map.bucket_collision_count}, - {str8_lit("raddbgic_root type_from_id_map"), out->root->type_from_id_map.buckets_count, out->root->type_from_id_map.pair_count, out->root->type_from_id_map.bucket_collision_count}, - {str8_lit("raddbgic_root construct_map"), out->root->construct_map.buckets_count, out->root->construct_map.pair_count, out->root->construct_map.bucket_collision_count}, + {str8_lit("rdim_root unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count, out->root->unit_map.bucket_collision_count}, + {str8_lit("rdim_root symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count, out->root->symbol_map.bucket_collision_count}, + {str8_lit("rdim_root scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count, out->root->scope_map.bucket_collision_count}, + {str8_lit("rdim_root local_map"), out->root->local_map.buckets_count, out->root->local_map.pair_count, out->root->local_map.bucket_collision_count}, + {str8_lit("rdim_root type_from_id_map"), out->root->type_from_id_map.buckets_count, out->root->type_from_id_map.pair_count, out->root->type_from_id_map.bucket_collision_count}, + {str8_lit("rdim_root construct_map"), out->root->construct_map.buckets_count, out->root->construct_map.pair_count, out->root->construct_map.bucket_collision_count}, }; for(U64 idx = 0; idx < ArrayCount(table_info); idx += 1) { diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 6a2b4050..a1b4787d 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -67,7 +67,7 @@ typedef struct P2R_TypeRev P2R_TypeRev; struct P2R_TypeRev { P2R_TypeRev *next; - RADDBGIC_Type *owner_type; + RDIM_Type *owner_type; CV_TypeId field_itype; }; @@ -84,7 +84,7 @@ typedef struct P2R_FrameProcNode P2R_FrameProcNode; struct P2R_FrameProcNode { P2R_FrameProcNode *next; - RADDBGIC_Symbol *key; + RDIM_Symbol *key; P2R_FrameProcData data; }; @@ -103,8 +103,8 @@ typedef struct P2R_ScopeNode P2R_ScopeNode; struct P2R_ScopeNode { P2R_ScopeNode *next; - RADDBGIC_Scope *scope; - RADDBGIC_Symbol *symbol; + RDIM_Scope *scope; + RDIM_Symbol *symbol; }; //- rjf: known global map @@ -179,7 +179,7 @@ struct P2R_Ctx U64 section_count; // OUTPUT data - RADDBGIC_Root *root; + RDIM_Root *root; // TEMPORARY STATE P2R_FwdMap fwd_map; @@ -201,7 +201,7 @@ typedef struct P2R_Out P2R_Out; struct P2R_Out { B32 good_parse; - RADDBGIC_Root *root; + RDIM_Root *root; String8List dump; String8List errors; }; @@ -227,7 +227,7 @@ internal RADDBGI_Language raddbgi_language_from_cv_language(CV_Language lang //~ rjf: Conversion Implementation Helpers //- rjf: pdb conversion context creation -internal P2R_Ctx *p2r_ctx_alloc(P2R_CtxParams *params, RADDBGIC_Root *out_root); +internal P2R_Ctx *p2r_ctx_alloc(P2R_CtxParams *params, RDIM_Root *out_root); //- rjf: pdb types and symbols internal void p2r_types_and_symbols(P2R_Ctx *pdb_ctx, P2R_TypesSymbolsParams *params); @@ -249,19 +249,19 @@ internal COFF_SectionHeader* p2r_sec_header_from_sec_num(P2R_Ctx *ctx, U32 sec_n // type info construction passes internal void p2r_type_cons_main_passes(P2R_Ctx *ctx); internal CV_TypeId p2r_type_resolve_fwd(P2R_Ctx *ctx, CV_TypeId itype); -internal RADDBGIC_Type* p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype); -internal void p2r_type_equip_members(P2R_Ctx *ctx, RADDBGIC_Type *owern_type, CV_TypeId field_itype); -internal void p2r_type_equip_enumerates(P2R_Ctx *ctx, RADDBGIC_Type *owner_type, CV_TypeId field_itype); +internal RDIM_Type* p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype); +internal void p2r_type_equip_members(P2R_Ctx *ctx, RDIM_Type *owern_type, CV_TypeId field_itype); +internal void p2r_type_equip_enumerates(P2R_Ctx *ctx, RDIM_Type *owner_type, CV_TypeId field_itype); // type info construction helpers -internal RADDBGIC_Type* p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype); -internal RADDBGIC_Type* p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype); -internal RADDBGIC_Type* p2r_type_resolve_and_check(P2R_Ctx *ctx, CV_TypeId itype); -internal void p2r_type_resolve_arglist(Arena *arena, RADDBGIC_TypeList *out, +internal RDIM_Type* p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype); +internal RDIM_Type* p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype); +internal RDIM_Type* p2r_type_resolve_and_check(P2R_Ctx *ctx, CV_TypeId itype); +internal void p2r_type_resolve_arglist(Arena *arena, RDIM_TypeList *out, P2R_Ctx *ctx, CV_TypeId arglist_itype); // type info resolution helpers -internal RADDBGIC_Type* p2r_type_from_name(P2R_Ctx *ctx, String8 name); +internal RDIM_Type* p2r_type_from_name(P2R_Ctx *ctx, String8 name); // type fwd map internal void p2r_type_fwd_map_set(Arena *arena, P2R_FwdMap *map, @@ -278,12 +278,12 @@ internal void p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id internal void p2r_gather_link_names(P2R_Ctx *ctx, CV_SymParsed *sym); // "frameproc" map -internal void p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RADDBGIC_Symbol *key, +internal void p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RDIM_Symbol *key, P2R_FrameProcData *data); -internal P2R_FrameProcData* p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RADDBGIC_Symbol *key); +internal P2R_FrameProcData* p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RDIM_Symbol *key); // scope stack -internal void p2r_symbol_push_scope(P2R_Ctx *ctx, RADDBGIC_Scope *scope, RADDBGIC_Symbol *symbol); +internal void p2r_symbol_push_scope(P2R_Ctx *ctx, RDIM_Scope *scope, RDIM_Symbol *symbol); internal void p2r_symbol_pop_scope(P2R_Ctx *ctx); internal void p2r_symbol_clear_scope_stack(P2R_Ctx *ctx); @@ -302,23 +302,23 @@ internal void p2r_known_global_insert(Arena *arena, P2R_KnownGlobalSet *set, // location info helpers -internal RADDBGIC_Location* p2r_location_from_addr_reg_off(P2R_Ctx *ctx, - RADDBGI_RegisterCode reg_code, - U32 reg_byte_size, - U32 reg_byte_pos, - S64 offset, - B32 extra_indirection); +internal RDIM_Location* p2r_location_from_addr_reg_off(P2R_Ctx *ctx, + RADDBGI_RegisterCode reg_code, + U32 reg_byte_size, + U32 reg_byte_pos, + S64 offset, + B32 extra_indirection); internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, - RADDBGIC_Symbol *proc, + RDIM_Symbol *proc, B32 param_base); internal RADDBGI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg encoded_reg); internal void p2r_location_over_lvar_addr_range(P2R_Ctx *ctx, - RADDBGIC_LocationSet *locset, - RADDBGIC_Location *location, + RDIM_LocationSet *locset, + RDIM_Location *location, CV_LvarAddrRange *range, CV_LvarAddrGap *gaps, U64 gap_count); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 5b2891d8..fbfa1e23 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -90,7 +90,7 @@ main(int argc, char **argv){ if(out != 0 && out->good_parse && params->output_name.size > 0 && out->good_parse) { String8List baked = {0}; - raddbgic_bake_file(arena, out->root, &baked); + rdim_bake_file(arena, out->root, &baked); for(String8Node *node = baked.first; node != 0; node = node->next) { fwrite(node->string.str, node->string.size, 1, out_file); diff --git a/src/raddbgi_cons_local/raddbgi_cons_local.c b/src/raddbgi_make_local/raddbgi_make_local.c similarity index 72% rename from src/raddbgi_cons_local/raddbgi_cons_local.c rename to src/raddbgi_make_local/raddbgi_make_local.c index 59334e1d..7e476d6c 100644 --- a/src/raddbgi_cons_local/raddbgi_cons_local.c +++ b/src/raddbgi_make_local/raddbgi_make_local.c @@ -1,4 +1,4 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#include "lib_raddbgi_cons/raddbgi_cons.c" +#include "lib_raddbgi_make/raddbgi_make.c" diff --git a/src/raddbgi_make_local/raddbgi_make_local.h b/src/raddbgi_make_local/raddbgi_make_local.h new file mode 100644 index 00000000..c5f7fee0 --- /dev/null +++ b/src/raddbgi_make_local/raddbgi_make_local.h @@ -0,0 +1,46 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RADDBGI_CONS_LOCAL_H +#define RADDBGI_CONS_LOCAL_H + +// rjf: base layer memory ops +#define RDIM_MEMSET_OVERRIDE +#define RDIM_MEMCPY_OVERRIDE +#define rdim_memset MemorySet +#define rdim_memcpy MemoryCopy + +// rjf: base layer string overrides +#define RADDBGI_STRING8_OVERRIDE +#define RDIM_String8 String8 +#define RDIM_String8_BaseMember str +#define RDIM_String8_SizeMember size +#define RADDBGI_STRING8LIST_OVERRIDE +#define RDIM_String8Node String8Node +#define RDIM_String8Node_NextPtrMember next +#define RDIM_String8Node_StringMember string +#define RDIM_String8List String8List +#define RDIM_String8List_FirstMember first +#define RDIM_String8List_LastMember last +#define RDIM_String8List_NodeCountMember node_count +#define RDIM_String8List_TotalSizeMember total_size + +// rjf: base layer arena overrides +#define RDIM_ARENA_OVERRIDE +#define RDIM_Arena Arena +#define rdim_arena_alloc arena_alloc +#define rdim_arena_release arena_release +#define rdim_arena_pos arena_pos +#define rdim_arena_push arena_push +#define rdim_arena_pop_to arena_pop_to + +// rjf: base layer scratch arena overrides +#define RDIM_SCRATCH_OVERRIDE +#define RDIM_Temp Temp +#define rdim_temp_arena(t) ((t).arena) +#define rdim_scratch_begin scratch_begin +#define rdim_scratch_end scratch_end + +#include "lib_raddbgi_make/raddbgi_make.h" + +#endif // RADDBGI_CONS_LOCAL_H From 87d9d0be05f7097154606d3e23c39b76c9f8d547 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 15:37:27 -0800 Subject: [PATCH 061/275] readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fb4013f8..35b7a385 100644 --- a/README.md +++ b/README.md @@ -33,11 +33,11 @@ The RADDBGI format is currently specified in code, in the files within the `src/lib_raddbgi_format` folder. The other relevant folders for working with the format are: -- `lib_raddbgi_cons`: The RADDBGI construction library, for making RADDBGI -debug info. +- `lib_raddbgi_make`: The "RAD Debug Info Make" library, for making RADDBGI + debug info. - `raddbgi_from_pdb`: Our PDB-to-RADDBGI converter. Can be used as a helper -codebase layer, or built as an executable with a command line interface -frontend. + codebase layer, or built as an executable with a command line interface + frontend. - `raddbgi_from_dwarf`: Our in-progress DWARF-to-RADDBGI converter. - `raddbgi_dump`: Our RADDBGI textual dumping utility. @@ -274,7 +274,7 @@ A list of the layers in the codebase and their associated namespaces is below: - `lib_raddbg_markup` (`RADDBG_`): Standalone library for marking up user programs to work with various features in the `raddbg` debugger. Does not depend on `base`, and can be independently relocated to other codebases. -- `lib_raddbgi_cons` (`RADDBGIC_`): Standalone library for constructing RADDBGI +- `lib_raddbgi_make` (`RDIM_`): Standalone library for constructing RADDBGI debug info data. Does not depend on `base`, and can be independently relocated to other codebases. - `lib_raddbgi_format` (`RADDBGI_`): Standalone library for defining the core From 30d2dea9511c6534d0604b328d02ec43676d3852 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 15:38:38 -0800 Subject: [PATCH 062/275] complete raddbgi_cons -> raddbgi_make --- src/lib_raddbgi_make/raddbgi_make.h | 6 +++--- src/raddbgi_from_dwarf/raddbgi_from_dwarf.c | 4 ++-- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 414aa237..f8be19d1 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_CONS_H -#define RADDBGI_CONS_H +#ifndef RADDBGI_MAKE_H +#define RADDBGI_MAKE_H //////////////////////////////// //~ rjf: Overrideable Memory Operations @@ -1300,4 +1300,4 @@ RADDBGI_PROC RDIM_NameMapBaked* rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root //- rjf: top-level baking entry point RADDBGI_PROC void rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out); -#endif // RADDBGI_CONS_H +#endif // RADDBGI_MAKE_H diff --git a/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c b/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c index ca54b69c..17bc620c 100644 --- a/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c +++ b/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c @@ -4,7 +4,7 @@ #include "lib_raddbgi_format/raddbgi_format.h" #include "base/base_inc.h" #include "os/os_inc.h" -#include "raddbgi_cons_local/raddbgi_cons_local.h" +#include "raddbgi_make_local/raddbgi_make_local.h" #include "raddbgi_elf.h" #include "raddbgi_dwarf.h" @@ -16,7 +16,7 @@ #include "lib_raddbgi_format/raddbgi_format.c" #include "base/base_inc.c" #include "os/os_inc.c" -#include "raddbgi_cons_local/raddbgi_cons_local.c" +#include "raddbgi_make_local/raddbgi_make_local.c" #include "raddbgi_elf.c" #include "raddbgi_dwarf.c" diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index fbfa1e23..9468bddb 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -6,25 +6,25 @@ #include "base/base_inc.h" #include "os/os_inc.h" +#include "raddbgi_make_local/raddbgi_make_local.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_from_pdb.h" #include "base/base_inc.c" #include "os/os_inc.c" +#include "raddbgi_make_local/raddbgi_make_local.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_from_pdb.c" From b9f010dff6caabedf7a89f1557251a9bb5f54b88 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 15:52:53 -0800 Subject: [PATCH 063/275] raddbgi_ -> rdi_ --- build.bat | 2 +- src/codeview/codeview.h | 4 +- src/ctrl/ctrl_core.c | 84 +- src/dbgi/dbgi.c | 68 +- src/dbgi/dbgi.h | 40 +- src/df/core/df_core.c | 208 +-- src/df/core/df_core.h | 10 +- src/df/gfx/df_gfx.c | 34 +- src/df/gfx/df_gfx.h | 2 +- src/df/gfx/df_view_rule_hooks.c | 28 +- src/df/gfx/df_view_rule_hooks.h | 4 +- src/df/gfx/df_views.c | 24 +- src/eval/eval_compiler.c | 298 ++--- src/eval/eval_compiler.h | 34 +- src/eval/eval_core.h | 6 +- src/eval/eval_machine.c | 222 ++-- src/eval/eval_parser.c | 208 +-- src/eval/eval_parser.h | 8 +- src/lib_raddbg_markup/raddbg_markup.h | 6 +- src/lib_raddbgi_format/raddbgi_format.c | 74 +- src/lib_raddbgi_format/raddbgi_format.h | 670 +++++----- src/lib_raddbgi_format/raddbgi_format_parse.c | 468 +++---- src/lib_raddbgi_format/raddbgi_format_parse.h | 278 ++-- src/lib_raddbgi_make/raddbgi_make.c | 1174 ++++++++--------- src/lib_raddbgi_make/raddbgi_make.h | 617 ++++----- src/raddbgi_dump/raddbgi_dump.c | 90 +- src/raddbgi_dump/raddbgi_dump.h | 6 +- src/raddbgi_dump/raddbgi_stringize.c | 428 +++--- src/raddbgi_dump/raddbgi_stringize.h | 118 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 240 ++-- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 24 +- src/raddbgi_make_local/raddbgi_make_local.h | 10 +- .../raddbgi/generated/regs_raddbgi.meta.c | 550 ++++---- src/regs/raddbgi/regs_raddbgi.h | 4 +- src/regs/raddbgi/regs_raddbgi.mdesk | 14 +- src/scratch/look_at_raddbg.c | 24 +- src/type_graph/type_graph.c | 302 ++--- src/type_graph/type_graph.h | 34 +- 38 files changed, 3214 insertions(+), 3201 deletions(-) diff --git a/build.bat b/build.bat index 153e1fb9..4db67b11 100644 --- a/build.bat +++ b/build.bat @@ -85,7 +85,7 @@ pushd build popd :: --- Get Current Git Commit Id ---------------------------------------------- -for /f %%i in ('call git describe --always --dirty') do set compile=%compile% -DRADDBGI_GIT=\"%%i\" +for /f %%i in ('call git describe --always --dirty') do set compile=%compile% -DRADDBG_GIT=\"%%i\" :: --- Build & Run Metaprogram ------------------------------------------------ if "%no_meta%"=="1" echo [skipping metagen] diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index 07d60867..4075934c 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -27,7 +27,7 @@ read_only global CV_TypeId cv_type_id_variadic = 0xFFFFFFFF; //////////////////////////////// //~ rjf: Registers -// X(NAME, CODE, (RADDBGI_RegsiterCode_X86) NAME, BYTE_POS, BYTE_SIZE) +// X(NAME, CODE, (RDI_RegisterCode_X86) NAME, BYTE_POS, BYTE_SIZE) #define CV_Reg_X86_XList(X) \ X(NONE, 0, nil, 0, 0)\ X(AL, 1, eax, 0, 1)\ @@ -282,7 +282,7 @@ typedef enum CV_Regx86Enum } CV_Regx86Enum; -// X(NAME, CODE, (RADDBGI_RegsiterCode_X64) NAME, BYTE_POS, BYTE_SIZE) +// X(NAME, CODE, (RDI_RegisterCode_X64) NAME, BYTE_POS, BYTE_SIZE) #define CV_Reg_X64_XList(X) \ X(NONE, 0, nil, 0, 0)\ X(AL, 1, rax, 0, 1)\ diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 767ec495..e050523a 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -204,7 +204,7 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE DBGI_Scope *scope = dbgi_scope_open(); String8 exe_path = demon_full_path_from_module(scratch.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; U64 base_vaddr = demon_base_vaddr_from_module(module); for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) { @@ -229,16 +229,16 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE // rjf: filename -> src_id U32 src_id = 0; { - RADDBGI_NameMap *mapptr = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_NormalSourcePaths); + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { - RADDBGI_ParsedNameMap map = {0}; - raddbgi_name_map_parse(rdbg, mapptr, &map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, filename_normalized.str, filename_normalized.size); + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdbg, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, filename_normalized.str, filename_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { src_id = ids[0]; @@ -249,11 +249,11 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE // rjf: src_id * pt -> push { - RADDBGI_SourceFile *src = raddbgi_element_from_idx(rdbg, source_files, src_id); - RADDBGI_ParsedLineMap line_map = {0}; - raddbgi_line_map_from_source_file(rdbg, src, &line_map); + RDI_SourceFile *src = rdi_element_from_idx(rdbg, source_files, src_id); + RDI_ParsedLineMap line_map = {0}; + rdi_line_map_from_source_file(rdbg, src, &line_map); U32 voff_count = 0; - U64 *voffs = raddbgi_line_voffs_from_num(&line_map, pt.line, &voff_count); + U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); for(U32 i = 0; i < voff_count; i += 1) { U64 vaddr = voffs[i] + base_vaddr; @@ -270,19 +270,19 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE U64 voff = bp->u64; if(rdbg != 0 && rdbg->procedures != 0) { - RADDBGI_NameMap *mapptr = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_Procedures); + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Procedures); if(mapptr != 0) { - RADDBGI_ParsedNameMap map = {0}; - raddbgi_name_map_parse(rdbg, mapptr, &map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, symbol_name.str, symbol_name.size); + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdbg, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, symbol_name.str, symbol_name.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); for(U32 match_i = 0; match_i < id_count; match_i += 1) { - U64 proc_voff = raddbgi_first_voff_from_proc(rdbg, ids[match_i]); + U64 proc_voff = rdi_first_voff_from_proc(rdbg, ids[match_i]); U64 proc_vaddr = proc_voff + base_vaddr; DEMON_Trap trap = {process, proc_vaddr + voff, (U64)bp}; demon_trap_chunk_list_push(arena, traps_out, 256, &trap); @@ -1643,21 +1643,21 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c CTRL_Handle module = ctrl_handle_from_demon(modules.handles[0]); String8 module_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module)); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; - RADDBGI_NameMap *unparsed_map = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_GlobalVariables); + RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_GlobalVariables); if(rdbg->global_variables != 0 && unparsed_map != 0) { - RADDBGI_ParsedNameMap map = {0}; - raddbgi_name_map_parse(rdbg, unparsed_map, &map); + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdbg, unparsed_map, &map); String8 name = str8_lit("__asan_shadow_memory_dynamic_address"); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { - RADDBGI_GlobalVariable *global_var = raddbgi_element_from_idx(rdbg, global_variables, ids[0]); + RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, ids[0]); U64 global_var_voff = global_var->voff; U64 global_var_vaddr = global_var->voff + demon_base_vaddr_from_module(ctrl_demon_handle_from_ctrl(module)); Architecture arch = demon_arch_from_object(ev->thread); @@ -2148,10 +2148,10 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U64 module_base_vaddr = demon_base_vaddr_from_module(module); String8 exe_path = demon_full_path_from_module(scratch.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; - RADDBGI_NameMap *unparsed_map = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_Procedures); - RADDBGI_ParsedNameMap map = {0}; - raddbgi_name_map_parse(rdbg, unparsed_map, &map); + RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Procedures); + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdbg, unparsed_map, &map); //- rjf: add trap for user-specified entry point, if specified B32 entries_found = 0; @@ -2162,15 +2162,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = n->string; - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = raddbgi_first_voff_from_proc(rdbg, procedure_id); + U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); if(voff != 0) { entries_found = 1; @@ -2188,15 +2188,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = n->string; - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = raddbgi_first_voff_from_proc(rdbg, procedure_id); + U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); if(voff != 0) { DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; @@ -2221,15 +2221,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = hi_entry_points[idx]; - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = raddbgi_first_voff_from_proc(rdbg, procedure_id); + U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); if(voff != 0) { entries_found = 1; @@ -2265,15 +2265,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = lo_entry_points[idx]; - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = raddbgi_first_voff_from_proc(rdbg, procedure_id); + U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); if(voff != 0) { entries_found = 1; @@ -2871,7 +2871,7 @@ ctrl_thread__run(CTRL_Msg *msg) { String8 exe_path = demon_full_path_from_module(temp.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) { String8 string = condition_n->string; @@ -2883,8 +2883,8 @@ ctrl_thread__run(CTRL_Msg *msg) parse_ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256); parse_ctx.regs_map = ctrl_string2reg_from_arch(arch); parse_ctx.reg_alias_map = ctrl_string2alias_from_arch(arch); - parse_ctx.locals_map = eval_push_locals_map_from_raddbgi_voff(temp.arena, rdbg, thread_rip_voff); - parse_ctx.member_map = eval_push_member_map_from_raddbgi_voff(temp.arena, rdbg, thread_rip_voff); + parse_ctx.locals_map = eval_push_locals_map_from_rdi_voff(temp.arena, rdbg, thread_rip_voff); + parse_ctx.member_map = eval_push_member_map_from_rdi_voff(temp.arena, rdbg, thread_rip_voff); } EVAL_TokenArray tokens = eval_token_array_from_text(temp.arena, string); EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(temp.arena, &parse_ctx, string, &tokens); diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index fc03ea0f..e34dcf39 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -111,7 +111,7 @@ dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemAr } internal String8 -dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBGI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx) +dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RDI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx) { String8 result = {0}; switch(target) @@ -119,31 +119,31 @@ dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBGI_Parsed *rdbg, DBGI_F // NOTE(rjf): no default - warn if we miss a case case DBGI_FuzzySearchTarget_Procedures: { - RADDBGI_Procedure *proc = raddbgi_element_from_idx(rdbg, procedures, element_idx); + RDI_Procedure *proc = rdi_element_from_idx(rdbg, procedures, element_idx); U64 name_size = 0; - U8 *name_base = raddbgi_string_from_idx(rdbg, proc->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdbg, proc->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_GlobalVariables: { - RADDBGI_GlobalVariable *gvar = raddbgi_element_from_idx(rdbg, global_variables, element_idx); + RDI_GlobalVariable *gvar = rdi_element_from_idx(rdbg, global_variables, element_idx); U64 name_size = 0; - U8 *name_base = raddbgi_string_from_idx(rdbg, gvar->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdbg, gvar->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_ThreadVariables: { - RADDBGI_ThreadVariable *tvar = raddbgi_element_from_idx(rdbg, thread_variables, element_idx); + RDI_ThreadVariable *tvar = rdi_element_from_idx(rdbg, thread_variables, element_idx); U64 name_size = 0; - U8 *name_base = raddbgi_string_from_idx(rdbg, tvar->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdbg, tvar->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_UDTs: { - RADDBGI_UDT *udt = raddbgi_element_from_idx(rdbg, udts, element_idx); - RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, element_idx); + RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); U64 name_size = 0; - U8 *name_base = raddbgi_string_from_idx(rdbg, type_node->user_defined.name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdbg, type_node->user_defined.name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_COUNT:{}break; @@ -769,7 +769,7 @@ dbgi_parse_thread_entry_point(void *p) } if(!og_dbg_format_is_known) { - if(data.size >= 8 && *(U64 *)data.str == RADDBGI_MAGIC_CONSTANT) + if(data.size >= 8 && *(U64 *)data.str == RDI_MAGIC_CONSTANT) { og_dbg_format_is_known = 1; og_dbg_is_raddbg = 1; @@ -838,10 +838,10 @@ dbgi_parse_thread_entry_point(void *p) file_map = os_file_map_open(OS_AccessFlag_Read, file); file_props = os_properties_from_file(file); file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size)); - if(sizeof(RADDBGI_Header) <= file_props.size) + if(sizeof(RDI_Header) <= file_props.size) { - RADDBGI_Header *header = (RADDBGI_Header*)file_base; - if(header->encoding_version != RADDBGI_ENCODING_VERSION) + RDI_Header *header = (RDI_Header*)file_base; + if(header->encoding_version != RDI_ENCODING_VERSION) { raddbgi_file_is_up_to_date = 0; } @@ -1017,14 +1017,14 @@ dbgi_parse_thread_entry_point(void *p) } //- rjf: parse raddbg info - RADDBGI_Parsed raddbgi_parsed = dbgi_parse_nil.rdbg; + RDI_Parsed rdi_parsed = dbgi_parse_nil.rdbg; U64 arch_addr_size = 8; if(do_task) { - RADDBGI_ParseStatus parse_status = raddbgi_parse((U8 *)raddbgi_file_base, raddbgi_file_props.size, &raddbgi_parsed); - if(raddbgi_parsed.top_level_info != 0) + RDI_ParseStatus parse_status = rdi_parse((U8 *)raddbgi_file_base, raddbgi_file_props.size, &rdi_parsed); + if(rdi_parsed.top_level_info != 0) { - arch_addr_size = raddbgi_addr_size_from_arch(raddbgi_parsed.top_level_info->architecture); + arch_addr_size = rdi_addr_size_from_arch(rdi_parsed.top_level_info->architecture); } } @@ -1053,7 +1053,7 @@ dbgi_parse_thread_entry_point(void *p) bin->parse.arena = parse_arena; bin->parse.dbg_path = push_str8_copy(parse_arena, dbg_path); MemoryCopyStruct(&bin->parse.pe, &exe_pe_info); - MemoryCopyStruct(&bin->parse.rdbg, &raddbgi_parsed); + MemoryCopyStruct(&bin->parse.rdbg, &rdi_parsed); bin->parse.gen = bin->gen; break; } @@ -1197,7 +1197,7 @@ dbgi_fuzzy_thread__entry_point(void *p) //- rjf: exe_path -> dbgi_parse, raddbg DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; //- rjf: rdbg * query -> item list U64 table_ptr_off = 0; @@ -1210,30 +1210,30 @@ dbgi_fuzzy_thread__entry_point(void *p) case DBGI_FuzzySearchTarget_COUNT:{}break; case DBGI_FuzzySearchTarget_Procedures: { - table_ptr_off = OffsetOf(RADDBGI_Parsed, procedures); - element_name_idx_off = OffsetOf(RADDBGI_Procedure, name_string_idx); + table_ptr_off = OffsetOf(RDI_Parsed, procedures); + element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx); element_count = rdbg->procedures_count; - element_size = sizeof(RADDBGI_Procedure); + element_size = sizeof(RDI_Procedure); }break; case DBGI_FuzzySearchTarget_GlobalVariables: { - table_ptr_off = OffsetOf(RADDBGI_Parsed, global_variables); - element_name_idx_off = OffsetOf(RADDBGI_GlobalVariable, name_string_idx); + table_ptr_off = OffsetOf(RDI_Parsed, global_variables); + element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx); element_count = rdbg->global_variables_count; - element_size = sizeof(RADDBGI_GlobalVariable); + element_size = sizeof(RDI_GlobalVariable); }break; case DBGI_FuzzySearchTarget_ThreadVariables: { - table_ptr_off = OffsetOf(RADDBGI_Parsed, thread_variables); - element_name_idx_off = OffsetOf(RADDBGI_ThreadVariable, name_string_idx); + table_ptr_off = OffsetOf(RDI_Parsed, thread_variables); + element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx); element_count = rdbg->thread_variables_count; - element_size = sizeof(RADDBGI_ThreadVariable); + element_size = sizeof(RDI_ThreadVariable); }break; case DBGI_FuzzySearchTarget_UDTs: { - table_ptr_off = OffsetOf(RADDBGI_Parsed, udts); + table_ptr_off = OffsetOf(RDI_Parsed, udts); element_count = rdbg->udts_count; - element_size = sizeof(RADDBGI_UDT); + element_size = sizeof(RDI_UDT); }break; } DBGI_FuzzySearchItemChunkList items_list = {0}; @@ -1246,13 +1246,13 @@ dbgi_fuzzy_thread__entry_point(void *p) U32 *name_idx_ptr = (U32 *)((U8 *)element + element_name_idx_off); if(target == DBGI_FuzzySearchTarget_UDTs) { - RADDBGI_UDT *udt = (RADDBGI_UDT *)element; - RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + RDI_UDT *udt = (RDI_UDT *)element; + RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); name_idx_ptr = &type_node->user_defined.name_string_idx; } U32 name_idx = *name_idx_ptr; U64 name_size = 0; - U8 *name_base = raddbgi_string_from_idx(rdbg, name_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdbg, name_idx, &name_size); String8 name = str8(name_base, name_size); if(name.size == 0) { continue; } FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query, name); diff --git a/src/dbgi/dbgi.h b/src/dbgi/dbgi.h index 94906ce2..0ba0f35b 100644 --- a/src/dbgi/dbgi.h +++ b/src/dbgi/dbgi.h @@ -18,7 +18,7 @@ struct DBGI_Parse void *dbg_base; FileProperties dbg_props; PE_BinInfo pe; - RADDBGI_Parsed rdbg; + RDI_Parsed rdbg; }; //////////////////////////////// @@ -341,24 +341,24 @@ global DBGI_Parse dbgi_parse_nil = 0, 0, 0, - &raddbgi_binary_section_nil, 1, - &raddbgi_file_path_node_nil, 1, - &raddbgi_source_file_nil, 1, - &raddbgi_unit_nil, 1, - &raddbgi_vmap_entry_nil, 1, - &raddbgi_type_node_nil, 1, - &raddbgi_udt_nil, 1, - &raddbgi_member_nil, 1, - &raddbgi_enum_member_nil, 1, - &raddbgi_global_variable_nil, 1, - &raddbgi_vmap_entry_nil, 1, - &raddbgi_thread_variable_nil, 1, - &raddbgi_procedure_nil, 1, - &raddbgi_scope_nil, 1, - &raddbgi_voff_nil, 1, - &raddbgi_vmap_entry_nil, 1, - &raddbgi_local_nil, 1, - &raddbgi_location_block_nil, 1, + &rdi_binary_section_nil, 1, + &rdi_file_path_node_nil, 1, + &rdi_source_file_nil, 1, + &rdi_unit_nil, 1, + &rdi_vmap_entry_nil, 1, + &rdi_type_node_nil, 1, + &rdi_udt_nil, 1, + &rdi_member_nil, 1, + &rdi_enum_member_nil, 1, + &rdi_global_variable_nil, 1, + &rdi_vmap_entry_nil, 1, + &rdi_thread_variable_nil, 1, + &rdi_procedure_nil, 1, + &rdi_scope_nil, 1, + &rdi_voff_nil, 1, + &rdi_vmap_entry_nil, 1, + &rdi_local_nil, 1, + &rdi_location_block_nil, 1, 0, 0, 0, 0, }, @@ -379,7 +379,7 @@ internal void dbgi_ensure_tctx_inited(void); internal U64 dbgi_hash_from_string(String8 string); internal U64 dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemArray *array, U64 element_idx); -internal String8 dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBGI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx); +internal String8 dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RDI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx); //////////////////////////////// //~ rjf: Forced Override Cache Functions diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index c296d905..24f23489 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1085,7 +1085,7 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, query); if(eval.errors.count == 0) { - TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_raddbgi_key(parse_ctx.type_graph, parse_ctx.rdbg, eval.type_key)); + TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, eval.type_key)); if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) { eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdbg, ctrl_ctx, eval); @@ -3196,23 +3196,23 @@ df_symbol_name_from_binary_voff(Arena *arena, DF_Entity *binary, U64 voff) DBGI_Scope *scope = dbgi_scope_open(); String8 path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; if(result.size == 0 && rdbg->scope_vmap != 0) { - U64 scope_idx = raddbgi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); - RADDBGI_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); + RDI_Scope *scope = &rdbg->scopes[scope_idx]; U64 proc_idx = scope->proc_idx; - RADDBGI_Procedure *procedure = &rdbg->procedures[proc_idx]; + RDI_Procedure *procedure = &rdbg->procedures[proc_idx]; U64 name_size = 0; - U8 *name_ptr = raddbgi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_ptr = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); result = push_str8_copy(arena, str8(name_ptr, name_size)); } if(result.size == 0 && rdbg->global_vmap != 0) { - U64 global_idx = raddbgi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, voff); - RADDBGI_GlobalVariable *global_var = &rdbg->global_variables[global_idx]; + U64 global_idx = rdi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, voff); + RDI_GlobalVariable *global_var = &rdbg->global_variables[global_idx]; U64 name_size = 0; - U8 *name_ptr = raddbgi_string_from_idx(rdbg, global_var->name_string_idx, &name_size); + U8 *name_ptr = rdi_string_from_idx(rdbg, global_var->name_string_idx, &name_size); result = push_str8_copy(arena, str8(name_ptr, name_size)); } dbgi_scope_close(scope); @@ -3263,23 +3263,23 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit DF_Entity *binary = binary_n->entity; String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; // rjf: file_path_normalized * rdbg -> src_id B32 good_src_id = 0; U32 src_id = 0; if(dbgi != &dbgi_parse_nil) { - RADDBGI_NameMap *mapptr = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_NormalSourcePaths); + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { - RADDBGI_ParsedNameMap map = {0}; - raddbgi_name_map_parse(rdbg, mapptr, &map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdbg, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { good_src_id = 1; @@ -3292,9 +3292,9 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit // rjf: good src-id -> look up line info for visible range if(good_src_id) { - RADDBGI_SourceFile *src = rdbg->source_files+src_id; - RADDBGI_ParsedLineMap line_map = {0}; - raddbgi_line_map_from_source_file(rdbg, src, &line_map); + RDI_SourceFile *src = rdbg->source_files+src_id; + RDI_ParsedLineMap line_map = {0}; + rdi_line_map_from_source_file(rdbg, src, &line_map); U64 line_idx = 0; for(S64 line_num = line_num_range.min; line_num <= line_num_range.max; @@ -3302,15 +3302,15 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit { DF_TextLineSrc2DasmInfoList *src2dasm_list = &src2dasm_array.v[line_idx]; U32 voff_count = 0; - U64 *voffs = raddbgi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); + U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); for(U64 idx = 0; idx < voff_count; idx += 1) { U64 base_voff = voffs[idx]; - U64 unit_idx = raddbgi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); - RADDBGI_Unit *unit = &rdbg->units[unit_idx]; - RADDBGI_ParsedLineInfo unit_line_info = {0}; - raddbgi_line_info_from_unit(rdbg, unit, &unit_line_info); - U64 line_info_idx = raddbgi_line_info_idx_from_voff(&unit_line_info, base_voff); + U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); + RDI_Unit *unit = &rdbg->units[unit_idx]; + RDI_ParsedLineInfo unit_line_info = {0}; + rdi_line_info_from_unit(rdbg, unit, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); if(unit_line_info.voffs != 0) { Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); @@ -3347,23 +3347,23 @@ df_text_line_dasm2src_info_from_binary_voff(DF_Entity *binary, U64 voff) DBGI_Scope *scope = dbgi_scope_open(); String8 path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; DF_TextLineDasm2SrcInfo result = {0}; result.file = result.binary = &df_g_nil_entity; if(rdbg->unit_vmap != 0 && rdbg->units != 0 && rdbg->source_files != 0) { - U64 unit_idx = raddbgi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, voff); - RADDBGI_Unit *unit = &rdbg->units[unit_idx]; - RADDBGI_ParsedLineInfo unit_line_info = {0}; - raddbgi_line_info_from_unit(rdbg, unit, &unit_line_info); - U64 line_info_idx = raddbgi_line_info_idx_from_voff(&unit_line_info, voff); + U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, voff); + RDI_Unit *unit = &rdbg->units[unit_idx]; + RDI_ParsedLineInfo unit_line_info = {0}; + rdi_line_info_from_unit(rdbg, unit, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff); if(line_info_idx < unit_line_info.count) { - RADDBGI_Line *line = &unit_line_info.lines[line_info_idx]; - RADDBGI_Column *column = (line_info_idx < unit_line_info.col_count) ? &unit_line_info.cols[line_info_idx] : 0; - RADDBGI_SourceFile *file = &rdbg->source_files[line->file_idx]; + RDI_Line *line = &unit_line_info.lines[line_info_idx]; + RDI_Column *column = (line_info_idx < unit_line_info.col_count) ? &unit_line_info.cols[line_info_idx] : 0; + RDI_SourceFile *file = &rdbg->source_files[line->file_idx]; String8 file_normalized_full_path = {0}; - file_normalized_full_path.str = raddbgi_string_from_idx(rdbg, file->normal_full_path_string_idx, &file_normalized_full_path.size); + file_normalized_full_path.str = rdi_string_from_idx(rdbg, file->normal_full_path_string_idx, &file_normalized_full_path.size); result.binary = binary; if(line->file_idx != 0 && file_normalized_full_path.size != 0) { @@ -3412,11 +3412,11 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) { String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; - RADDBGI_NameMapKind name_map_kinds[] = + RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_NameMapKind name_map_kinds[] = { - RADDBGI_NameMapKind_GlobalVariables, - RADDBGI_NameMapKind_Procedures, + RDI_NameMapKind_GlobalVariables, + RDI_NameMapKind_Procedures, }; if(dbgi != &dbgi_parse_nil) { @@ -3424,11 +3424,11 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) name_map_kind_idx < ArrayCount(name_map_kinds); name_map_kind_idx += 1) { - RADDBGI_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx]; - RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(rdbg, name_map_kind); - RADDBGI_ParsedNameMap parsed_name_map = {0}; - raddbgi_name_map_parse(rdbg, name_map, &parsed_name_map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &parsed_name_map, symbol_name.str, symbol_name.size); + RDI_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx]; + RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, name_map_kind); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_name_map_parse(rdbg, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, symbol_name.str, symbol_name.size); // rjf: node -> num U64 entity_num = 0; @@ -3443,7 +3443,7 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) default: { U32 num = 0; - U32 *run = raddbgi_matches_from_map_node(rdbg, node, &num); + U32 *run = rdi_matches_from_map_node(rdbg, node, &num); if(num != 0) { entity_num = run[0]+1; @@ -3457,15 +3457,15 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) if(entity_num != 0) switch(name_map_kind) { default:{}break; - case RADDBGI_NameMapKind_GlobalVariables: + case RDI_NameMapKind_GlobalVariables: { - RADDBGI_GlobalVariable *global_var = raddbgi_element_from_idx(rdbg, global_variables, entity_num-1); + RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, entity_num-1); voff = global_var->voff; }break; - case RADDBGI_NameMapKind_Procedures: + case RDI_NameMapKind_Procedures: { - RADDBGI_Procedure *procedure = raddbgi_element_from_idx(rdbg, procedures, entity_num-1); - RADDBGI_Scope *scope = raddbgi_element_from_idx(rdbg, scopes, procedure->root_scope_idx); + RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, entity_num-1); + RDI_Scope *scope = rdi_element_from_idx(rdbg, scopes, procedure->root_scope_idx); voff = rdbg->scope_voffs[scope->voff_range_first]; }break; } @@ -3495,11 +3495,11 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name) { String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; - RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_Types); - RADDBGI_ParsedNameMap parsed_name_map = {0}; - raddbgi_name_map_parse(rdbg, name_map, &parsed_name_map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); + RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Types); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_name_map_parse(rdbg, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); U64 entity_num = 0; if(node != 0) { @@ -3512,7 +3512,7 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name) default: { U32 num = 0; - U32 *run = raddbgi_matches_from_map_node(rdbg, node, &num); + U32 *run = rdi_matches_from_map_node(rdbg, node, &num); if(num != 0) { entity_num = run[0]+1; @@ -3697,8 +3697,8 @@ df_push_locals_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity * Temp scratch = scratch_begin(&arena, 1); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; - EVAL_String2NumMap *result = eval_push_locals_map_from_raddbgi_voff(arena, rdbg, voff); + RDI_Parsed *rdbg = &dbgi->rdbg; + EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdbg, voff); scratch_end(scratch); return result; } @@ -3709,8 +3709,8 @@ df_push_member_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity * Temp scratch = scratch_begin(&arena, 1); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; - EVAL_String2NumMap *result = eval_push_member_map_from_raddbgi_voff(arena, rdbg, voff); + RDI_Parsed *rdbg = &dbgi->rdbg; + EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdbg, voff); scratch_end(scratch); return result; } @@ -3987,7 +3987,7 @@ df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 DF_Entity *binary = df_binary_file_from_module(module); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; Architecture arch = df_architecture_from_entity(process); EVAL_String2NumMap *reg_map = ctrl_string2reg_from_arch(arch); EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch); @@ -4035,22 +4035,22 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt) DF_Entity *binary = binary_n->entity; String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; // rjf: file_path_normalized * rdbg -> src_id B32 good_src_id = 0; U32 src_id = 0; { - RADDBGI_NameMap *mapptr = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_NormalSourcePaths); + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { - RADDBGI_ParsedNameMap map = {0}; - raddbgi_name_map_parse(rdbg, mapptr, &map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdbg, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = raddbgi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); if(id_count > 0) { good_src_id = 1; @@ -4063,19 +4063,19 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt) // rjf: good src-id -> look up line info for visible range if(good_src_id) { - RADDBGI_SourceFile *src = rdbg->source_files+src_id; - RADDBGI_ParsedLineMap line_map = {0}; - raddbgi_line_map_from_source_file(rdbg, src, &line_map); + RDI_SourceFile *src = rdbg->source_files+src_id; + RDI_ParsedLineMap line_map = {0}; + rdi_line_map_from_source_file(rdbg, src, &line_map); U32 voff_count = 0; - U64 *voffs = raddbgi_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count); + U64 *voffs = rdi_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count); for(U64 idx = 0; idx < voff_count; idx += 1) { U64 base_voff = voffs[idx]; - U64 unit_idx = raddbgi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); - RADDBGI_Unit *unit = &rdbg->units[unit_idx]; - RADDBGI_ParsedLineInfo unit_line_info = {0}; - raddbgi_line_info_from_unit(rdbg, unit, &unit_line_info); - U64 line_info_idx = raddbgi_line_info_idx_from_voff(&unit_line_info, base_voff); + U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); + RDI_Unit *unit = &rdbg->units[unit_idx]; + RDI_ParsedLineInfo unit_line_info = {0}; + rdi_line_info_from_unit(rdbg, unit, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; DF_TextLineSrc2DasmInfoNode *src2dasm_n = push_array(scratch.arena, DF_TextLineSrc2DasmInfoNode, 1); @@ -4246,7 +4246,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ } internal DF_Eval -df_value_mode_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) +df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) { ProfBeginFunction(); DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); @@ -4262,7 +4262,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx * { TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= 8) { Temp scratch = scratch_begin(0, 0); @@ -4292,7 +4292,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx * case EVAL_EvalMode_Reg: { TG_Key type_key = eval.type_key; - U64 type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); U64 reg_off = eval.offset; CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); if(unwind.first != 0) @@ -4316,7 +4316,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx * } internal DF_Eval -df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) +df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -4330,11 +4330,11 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_Ct TG_Kind type_kind = tg_kind_from_key(type_key); if(type_kind == TG_Kind_Ptr) { - TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, type_key); + TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, type_key); TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key); if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class) { - TG_Type *ptee_type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, ptee_type_key); + TG_Type *ptee_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, ptee_type_key); B32 has_vtable = 0; for(U64 idx = 0; idx < ptee_type->count; idx += 1) { @@ -4363,13 +4363,13 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_Ct U64 vtable_vaddr = 0; MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size); U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr); - U64 global_idx = raddbgi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff); - RADDBGI_GlobalVariable *global_var = raddbgi_element_from_idx(rdbg, global_variables, global_idx); - if(global_var->link_flags & RADDBGI_LinkFlag_TypeScoped) + U64 global_idx = rdi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff); + RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, global_idx); + if(global_var->link_flags & RDI_LinkFlag_TypeScoped) { - RADDBGI_UDT *udt = raddbgi_element_from_idx(rdbg, udts, global_var->container_idx); - RADDBGI_TypeNode *type = raddbgi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); - TG_Key derived_type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type->kind), (U64)udt->self_type_idx); + RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, global_var->container_idx); + RDI_TypeNode *type = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + TG_Key derived_type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), (U64)udt->self_type_idx); TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0); eval.type_key = ptr_to_derived_type_key; } @@ -4579,13 +4579,13 @@ df_string_from_ascii_value(Arena *arena, U8 val) } internal String8 -df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) +df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) { ProfBeginFunction(); String8 result = {0}; - TG_Key type_key = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, eval.type_key); + TG_Key type_key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, eval.type_key); TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); U8 digit_group_separator = 0; if(!(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) { @@ -4653,7 +4653,7 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed * case TG_Kind_Enum: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, type_key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type_key); String8 constant_name = {0}; for(U64 val_idx = 0; val_idx < type->count; val_idx += 1) { @@ -4693,7 +4693,7 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed * //- rjf: writing values back to child processes internal B32 -df_commit_eval_value(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) +df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) { B32 result = 0; Temp scratch = scratch_begin(0, 0); @@ -4705,8 +4705,8 @@ df_commit_eval_value(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx TG_Key src_type_key = src_eval.type_key; TG_Kind dst_type_kind = tg_kind_from_key(dst_type_key); TG_Kind src_type_kind = tg_kind_from_key(src_type_key); - U64 dst_type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, dst_type_key); - U64 src_type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, src_type_key); + U64 dst_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, dst_type_key); + U64 src_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, src_type_key); //- rjf: get commit data based on destination type String8 commit_data = {0}; @@ -4914,7 +4914,7 @@ df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray mem } internal DF_EvalLinkBaseChunkList -df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap) +df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap) { DF_EvalLinkBaseChunkList list = {0}; for(DF_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;) @@ -5053,7 +5053,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ////////////////////////////// //- rjf: unpack eval // - TG_Key eval_type_key = tg_unwrapped_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval.type_key); + TG_Key eval_type_key = tg_unwrapped_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval.type_key); TG_Kind eval_type_kind = tg_kind_from_key(eval_type_key); ////////////////////////////// @@ -5084,7 +5084,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie TG_Kind ptr_type_kind = TG_Kind_Null; if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) { - TG_Key direct_type_key = tg_ptee_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval_type_key); + TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval_type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); DF_Eval ptr_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); @@ -5199,7 +5199,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("build viz blocks for UDT members") { //- rjf: type -> filtered data members - TG_MemberArray data_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); //- rjf: build blocks for all members, split by sub-expansions @@ -5255,7 +5255,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("build viz blocks for UDT type-eval enums") { //- rjf: type -> full type info - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); //- rjf: build block for all members (cannot be expanded) DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_EnumMembers, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); @@ -5277,7 +5277,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("(structs, unions, classes) descend to members & make block(s), with linked list view") { //- rjf: type -> data members - TG_MemberArray data_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); //- rjf: find link member TG_Member *link_member = 0; @@ -5290,7 +5290,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie { link_member = mem; link_member_type_kind = tg_kind_from_key(link_member->type_key); - link_member_ptee_type_key = tg_ptee_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, link_member->type_key); + link_member_ptee_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, link_member->type_key); break; } } @@ -5371,10 +5371,10 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("(arrays) descend to elements & make block(s)") { //- rjf: unpack array type info - TG_Type *array_type = tg_type_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, arr_eval.type_key); + TG_Type *array_type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, arr_eval.type_key); U64 array_count = array_type->count; TG_Key element_type_key = array_type->direct_type_key; - U64 element_type_byte_size = tg_byte_size_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, element_type_key); + U64 element_type_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, element_type_key); //- rjf: build blocks for all elements, split by sub-expansions DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Elements, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); @@ -5612,7 +5612,7 @@ df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalViz // rjf: determine exandability, editability if(tg_kind_from_key(eval.type_key) != TG_Kind_Null) { - for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, t)) + for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, t)) { TG_Kind kind = tg_kind_from_key(t); if(kind == TG_Kind_Null) diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 85d27da0..e2d24277 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1579,8 +1579,8 @@ internal B32 df_eval_memory_read(void *u, void *out, U64 addr, U64 size); internal EVAL_ParseCtx df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 vaddr); internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt); internal DF_Eval df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, String8 string); -internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); -internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); +internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); +internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg); //////////////////////////////// @@ -1604,14 +1604,14 @@ internal String8 df_eval_view_rule_from_key(DF_EvalView *eval_view, DF_ExpandKey //- rjf: evaluation value string builder helpers internal String8 df_string_from_ascii_value(Arena *arena, U8 val); -internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); +internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); //- rjf: writing values back to child processes -internal B32 df_commit_eval_value(TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); +internal B32 df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); //- rjf: type helpers internal TG_MemberArray df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray members, DF_CfgTable *cfg); -internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); +internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); internal DF_EvalLinkBase df_eval_link_base_from_chunk_list_index(DF_EvalLinkBaseChunkList *list, U64 idx); internal DF_EvalLinkBaseArray df_eval_link_base_array_from_chunk_list(Arena *arena, DF_EvalLinkBaseChunkList *chunks); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index b59ddc60..7c3d640d 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -4410,15 +4410,15 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D DF_Entity *task = n->entity; if(task->alloc_time_us + 500000 < os_now_microseconds()) { - String8 raddbgi_path = task->name; - String8 raddbgi_name = str8_skip_last_slash(raddbgi_path); - String8 task_text = push_str8f(scratch.arena, "Creating %S...", raddbgi_name); + String8 rdi_path = task->name; + String8 rdi_name = str8_skip_last_slash(rdi_path); + String8 task_text = push_str8f(scratch.arena, "Creating %S...", rdi_name); UI_Key key = ui_key_from_stringf(ui_key_zero(), "task_%p", task); UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, key); UI_Signal sig = ui_signal_from_box(box); if(ui_hovering(sig)) UI_Tooltip { - ui_label(raddbgi_path); + ui_label(rdi_path); } ui_box_equip_display_string(box, task_text); } @@ -5232,7 +5232,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D default:{}break; case EVAL_EvalMode_Addr: { - U64 size = tg_byte_size_from_graph_raddbgi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); + U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); size = Min(size, 64); Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); @@ -6858,7 +6858,7 @@ df_eval_escaped_from_raw_string(Arena *arena, String8 raw) } internal String8List -df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table) +df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table) { ProfBeginFunction(); String8List list = {0}; @@ -6869,13 +6869,13 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags { if(opt_member != 0) { - U64 member_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, opt_member->type_key); + U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, opt_member->type_key); str8_list_pushf(arena, &list, "member (%I64u offset, %I64u byte%s)", opt_member->off, member_byte_size, member_byte_size > 1 ? "s" : ""); } else { String8 basic_type_kind_string = tg_kind_basic_string_table[tg_kind_from_key(eval.type_key)]; - U64 byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, eval.type_key); + U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, eval.type_key); str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size > 1 ? "s" : ""); } } @@ -6883,7 +6883,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags //- rjf: non-type path: descend recursively & produce single-line value strings else if(max_size > 0) { - TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, eval.type_key)); + TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(graph, rdbg, eval.type_key)); U32 radix = default_radix; DF_CfgVal *dec_cfg = df_cfg_val_from_string(cfg_table, str8_lit("dec")); DF_CfgVal *hex_cfg = df_cfg_val_from_string(cfg_table, str8_lit("hex")); @@ -6924,7 +6924,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags // rjf: get pointed-at info TG_Kind type_kind = tg_kind_from_key(eval.type_key); - TG_Key direct_type_key = tg_ptee_from_graph_raddbgi_key(graph, rdbg, eval.type_key); + TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(graph, rdbg, eval.type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); B32 direct_type_has_content = (direct_type_kind != TG_Kind_Null && direct_type_kind != TG_Kind_Void && value_eval.imm_u64 != 0); B32 direct_type_is_string = (direct_type_kind != TG_Kind_Null && value_eval.imm_u64 != 0 && @@ -7011,7 +7011,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags case TG_Kind_Array: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *eval_type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, eval.type_key); + TG_Type *eval_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, eval.type_key); TG_Key direct_type_key = eval_type->direct_type_key; TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); U64 array_count = eval_type->count; @@ -7055,7 +7055,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags { if(depth < 3) { - U64 direct_type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, direct_type_key); + U64 direct_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct_type_key); for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) { DF_Eval element_eval = zero_struct; @@ -7111,7 +7111,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(depth < 4) { Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray data_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, graph, rdbg, eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdbg, eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); for(U64 member_idx = 0; member_idx < filtered_data_members.count && max_size > space_taken; member_idx += 1) { @@ -7312,7 +7312,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop case DF_EvalVizBlockKind_Members: if(block_type_kind != TG_Kind_Null) { - TG_MemberArray data_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, &block->cfg_table); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < filtered_data_members.count; idx += 1) { @@ -7370,7 +7370,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop case DF_EvalVizBlockKind_EnumMembers: if(block_type_kind == TG_Kind_Enum) { - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < type->count; idx += 1) { TG_EnumVal *enum_val = &type->enum_vals[idx]; @@ -7414,9 +7414,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop // case DF_EvalVizBlockKind_Elements: { - TG_Key direct_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_Key direct_type_key = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); - U64 direct_type_key_byte_size = tg_byte_size_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, direct_type_key); + U64 direct_type_key_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, direct_type_key); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) { // rjf: get keys for this row diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 36d5b226..cb2637d9 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -961,7 +961,7 @@ internal void df_window_update_and_render(Arena *arena, OS_EventList *events, DF //~ rjf: Eval Viz internal String8 df_eval_escaped_from_raw_string(Arena *arena, String8 raw); -internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RADDBGI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table); +internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table); internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); //////////////////////////////// diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 0a6ddbf4..cb43eda3 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -5,7 +5,7 @@ //~ rjf: Helpers internal Vec4F32 -df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed *raddbg, DF_Entity *process) +df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entity *process) { Vec4F32 rgba = {0}; Temp scratch = scratch_begin(0, 0); @@ -27,14 +27,14 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed case TG_Kind_Array: if(eval.mode == EVAL_EvalMode_Addr) { - U64 array_total_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, type_key); + U64 array_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); U64 array_total_size_capped = ClampTop(array_total_size, 64); Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); CTRL_ProcessMemorySlice array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng, 0); String8 array_memory = array_slice.data; - TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(graph, raddbg, type_key); + TG_Key element_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, raddbg, type_key); TG_Kind element_type_kind = tg_kind_from_key(element_type_key); - U64 element_type_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, element_type_key); + U64 element_type_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, element_type_key); for(U64 element_idx = 0; element_idx < 4; element_idx += 1) { U64 offset = element_idx*element_type_size; @@ -64,12 +64,12 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed case TG_Kind_Union: if(eval.mode == EVAL_EvalMode_Addr) { - U64 struct_total_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, type_key); + U64 struct_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); U64 struct_total_size_capped = ClampTop(struct_total_size, 64); Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); CTRL_ProcessMemorySlice struct_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng, 0); String8 struct_memory = struct_slice.data; - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, raddbg, type_key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, raddbg, type_key); for(U64 element_idx = 0, member_idx = 0; element_idx < 4 && member_idx < type->count; member_idx += 1) @@ -102,7 +102,7 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed } internal void -df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba) +df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba) { TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); @@ -126,13 +126,13 @@ df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBGI_Pars case TG_Kind_Array: if(eval.mode == EVAL_EvalMode_Addr) { - U64 array_total_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, type_key); + U64 array_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); U64 array_total_size_capped = ClampTop(array_total_size, 64); Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); String8 array_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng); - TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(graph, raddbg, type_key); + TG_Key element_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, raddbg, type_key); TG_Kind element_type_kind = tg_kind_from_key(element_type_key); - U64 element_type_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, element_type_key); + U64 element_type_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, element_type_key); for(U64 element_idx = 0; element_idx < 4; element_idx += 1) { U64 offset = element_idx*element_type_size; @@ -162,11 +162,11 @@ df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBGI_Pars case TG_Kind_Union: if(eval.mode == EVAL_EvalMode_Addr) { - U64 struct_total_size = tg_byte_size_from_graph_raddbgi_key(graph, raddbg, type_key); + U64 struct_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); U64 struct_total_size_capped = ClampTop(struct_total_size, 64); Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); String8 struct_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, raddbg, type_key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, raddbg, type_key); for(U64 element_idx = 0, member_idx = 0; element_idx < 4 && member_idx < type->count; member_idx += 1) @@ -343,7 +343,7 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) } // rjf: apply array size to type - TG_Key pointee = tg_ptee_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); + TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, array_size); eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); } @@ -373,7 +373,7 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap) Temp scratch = scratch_begin(&arena, 1); TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_size_bytes = tg_byte_size_from_graph_raddbgi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); + U64 type_size_bytes = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); if(TG_Kind_Char8 <= type_kind && type_kind <= TG_Kind_S256 && (type_size_bytes == 2 || type_size_bytes == 4 || diff --git a/src/df/gfx/df_view_rule_hooks.h b/src/df/gfx/df_view_rule_hooks.h index 9b2f578b..c57d9ca4 100644 --- a/src/df/gfx/df_view_rule_hooks.h +++ b/src/df/gfx/df_view_rule_hooks.h @@ -32,8 +32,8 @@ struct DF_TxtTopologyInfo //////////////////////////////// //~ rjf: Helpers -internal Vec4F32 df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed *raddbg, DF_Entity *process); -internal void df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RADDBGI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba); +internal Vec4F32 df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entity *process); +internal void df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba); internal DF_BitmapTopologyInfo df_view_rule_hooks__bitmap_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); internal DF_GeoTopologyInfo df_view_rule_hooks__geo_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); internal DF_TxtTopologyInfo df_view_rule_hooks__txt_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 808ebd2d..c6424a10 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -751,7 +751,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF DF_Entity *binary = df_binary_file_from_module(module); String8 exe_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; //- rjf: calculate top-level keys, expand root-level, grab root expansion node DF_ExpandKey parent_key = df_expand_key_make(5381, 0); @@ -1180,7 +1180,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW default:{}break; case EVAL_EvalMode_Addr: { - U64 size = tg_byte_size_from_graph_raddbgi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); + U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); size = Min(size, 64); Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); @@ -1270,7 +1270,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW row->depth > 0 && !row_expanded) { - U64 next_off = (row->eval.offset + tg_byte_size_from_graph_raddbgi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key)); + U64 next_off = (row->eval.offset + tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key)); if(next_off%64 != 0 && row->eval.offset/64 < next_off/64) { ui_set_next_fixed_x(0); @@ -2918,7 +2918,7 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) //- rjf: query -> raddbg, filtered items U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100); - RADDBGI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdbg = &dbgi->rdbg; B32 items_stale = 0; DBGI_FuzzySearchItemArray items = dbgi_fuzzy_search_items_from_key_exe_query(scope, fuzzy_search_key, exe_path, query, DBGI_FuzzySearchTarget_Procedures, os_now_microseconds()+100, &items_stale); if(items_stale) @@ -2929,9 +2929,9 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) //- rjf: submit best match when hitting enter w/ no selection if(slv->cursor.y == 0 && items.count != 0 && os_key_press(ui_events(), ui_window(), 0, OS_Key_Return)) { - RADDBGI_Procedure *procedure = raddbgi_element_from_idx(rdbg, procedures, items.v[0].idx); + RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, items.v[0].idx); U64 name_size = 0; - U8 *name_base = raddbgi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); String8 name = str8(name_base, name_size); if(name.size != 0) { @@ -2967,12 +2967,12 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) UI_Focus((slv->cursor.y == idx+1) ? UI_FocusKind_On : UI_FocusKind_Off) { DBGI_FuzzySearchItem *item = &items.v[idx]; - RADDBGI_Procedure *procedure = raddbgi_element_from_idx(rdbg, procedures, item->idx); + RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, item->idx); U64 name_size = 0; - U8 *name_base = raddbgi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); String8 name = str8(name_base, name_size); - RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(rdbg, type_nodes, procedure->type_idx); - TG_Key type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), procedure->type_idx); + RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, procedure->type_idx); + TG_Key type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), procedure->type_idx); ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| UI_BoxFlag_DrawBackground| @@ -7902,7 +7902,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) DBGI_Scope *scope = dbgi_scope_open(); U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, thread_rip_vaddr); - RADDBGI_Parsed *rdbg = parse_ctx.rdbg; + RDI_Parsed *rdbg = parse_ctx.rdbg; for(EVAL_String2NumMapNode *n = parse_ctx.locals_map->first; n != 0; n = n->order_next) { String8 local_name = n->string; @@ -7910,7 +7910,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) if(local_eval.mode == EVAL_EvalMode_Addr) { TG_Kind local_eval_type_kind = tg_kind_from_key(local_eval.type_key); - U64 local_eval_type_size = tg_byte_size_from_graph_raddbgi_key(parse_ctx.type_graph, rdbg, local_eval.type_key); + U64 local_eval_type_size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, rdbg, local_eval.type_key); Rng1U64 vaddr_rng = r1u64(local_eval.offset, local_eval.offset+local_eval_type_size); Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng); if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min) diff --git a/src/eval/eval_compiler.c b/src/eval/eval_compiler.c index b1fd0409..afcd9812 100644 --- a/src/eval/eval_compiler.c +++ b/src/eval/eval_compiler.c @@ -23,8 +23,8 @@ eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list){ default: { // compute bytecode advance - U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[opcode]; - U64 extra_byte_count = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); + U8 ctrlbits = rdi_eval_opcode_ctrlbits[opcode]; + U64 extra_byte_count = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); U8 *next_ptr = ptr + 1 + extra_byte_count; Assert(next_ptr <= opl); @@ -62,9 +62,9 @@ eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list){ } internal void -eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RADDBGI_EvalOp opcode, U64 p){ - U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[opcode]; - U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); +eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RDI_EvalOp opcode, U64 p){ + U8 ctrlbits = rdi_eval_opcode_ctrlbits[opcode]; + U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); EVAL_Op *node = push_array_no_zero(arena, EVAL_Op, 1); node->opcode = opcode; @@ -78,35 +78,35 @@ eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RADDBGI_EvalOp opcode, U64 internal void eval_oplist_push_uconst(Arena *arena, EVAL_OpList *list, U64 x){ if (x <= 0xFF){ - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU8, x); + eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, x); } else if (x <= 0xFFFF){ - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU16, x); + eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, x); } else if (x <= 0xFFFFFFFF){ - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU32, x); + eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, x); } else{ - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU64, x); + eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, x); } } internal void eval_oplist_push_sconst(Arena *arena, EVAL_OpList *list, S64 x){ if (-0x80 <= x && x <= 0x7F){ - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU8, (U64)x); - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_TruncSigned, 8); + eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, (U64)x); + eval_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 8); } else if (-0x8000 <= x && x <= 0x7FFF){ - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU16, (U64)x); - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_TruncSigned, 16); + eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, (U64)x); + eval_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 16); } else if (-0x80000000ll <= x && x <= 0x7FFFFFFFll){ - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU32, (U64)x); - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_TruncSigned, 32); + eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, (U64)x); + eval_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 32); } else{ - eval_oplist_push_op(arena, list, RADDBGI_EvalOp_ConstU64, (U64)x); + eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, (U64)x); } } @@ -138,31 +138,31 @@ eval_oplist_concat_in_place(EVAL_OpList *left_dst, EVAL_OpList *right_destroyed) //////////////////////////////// //~ allen: EVAL Expression Info Functions -internal RADDBGI_EvalOp +internal RDI_EvalOp eval_opcode_from_expr_kind(EVAL_ExprKind kind){ - RADDBGI_EvalOp result = RADDBGI_EvalOp_Stop; + RDI_EvalOp result = RDI_EvalOp_Stop; switch (kind){ - case EVAL_ExprKind_Neg: result = RADDBGI_EvalOp_Neg; break; - case EVAL_ExprKind_LogNot: result = RADDBGI_EvalOp_LogNot; break; - case EVAL_ExprKind_BitNot: result = RADDBGI_EvalOp_BitNot; break; - case EVAL_ExprKind_Mul: result = RADDBGI_EvalOp_Mul; break; - case EVAL_ExprKind_Div: result = RADDBGI_EvalOp_Div; break; - case EVAL_ExprKind_Mod: result = RADDBGI_EvalOp_Mod; break; - case EVAL_ExprKind_Add: result = RADDBGI_EvalOp_Add; break; - case EVAL_ExprKind_Sub: result = RADDBGI_EvalOp_Sub; break; - case EVAL_ExprKind_LShift: result = RADDBGI_EvalOp_LShift; break; - case EVAL_ExprKind_RShift: result = RADDBGI_EvalOp_RShift; break; - case EVAL_ExprKind_Less: result = RADDBGI_EvalOp_Less; break; - case EVAL_ExprKind_LsEq: result = RADDBGI_EvalOp_LsEq; break; - case EVAL_ExprKind_Grtr: result = RADDBGI_EvalOp_Grtr; break; - case EVAL_ExprKind_GrEq: result = RADDBGI_EvalOp_GrEq; break; - case EVAL_ExprKind_EqEq: result = RADDBGI_EvalOp_EqEq; break; - case EVAL_ExprKind_NtEq: result = RADDBGI_EvalOp_NtEq; break; - case EVAL_ExprKind_BitAnd: result = RADDBGI_EvalOp_BitAnd; break; - case EVAL_ExprKind_BitXor: result = RADDBGI_EvalOp_BitXor; break; - case EVAL_ExprKind_BitOr: result = RADDBGI_EvalOp_BitOr; break; - case EVAL_ExprKind_LogAnd: result = RADDBGI_EvalOp_LogAnd; break; - case EVAL_ExprKind_LogOr: result = RADDBGI_EvalOp_LogOr; break; + case EVAL_ExprKind_Neg: result = RDI_EvalOp_Neg; break; + case EVAL_ExprKind_LogNot: result = RDI_EvalOp_LogNot; break; + case EVAL_ExprKind_BitNot: result = RDI_EvalOp_BitNot; break; + case EVAL_ExprKind_Mul: result = RDI_EvalOp_Mul; break; + case EVAL_ExprKind_Div: result = RDI_EvalOp_Div; break; + case EVAL_ExprKind_Mod: result = RDI_EvalOp_Mod; break; + case EVAL_ExprKind_Add: result = RDI_EvalOp_Add; break; + case EVAL_ExprKind_Sub: result = RDI_EvalOp_Sub; break; + case EVAL_ExprKind_LShift: result = RDI_EvalOp_LShift; break; + case EVAL_ExprKind_RShift: result = RDI_EvalOp_RShift; break; + case EVAL_ExprKind_Less: result = RDI_EvalOp_Less; break; + case EVAL_ExprKind_LsEq: result = RDI_EvalOp_LsEq; break; + case EVAL_ExprKind_Grtr: result = RDI_EvalOp_Grtr; break; + case EVAL_ExprKind_GrEq: result = RDI_EvalOp_GrEq; break; + case EVAL_ExprKind_EqEq: result = RDI_EvalOp_EqEq; break; + case EVAL_ExprKind_NtEq: result = RDI_EvalOp_NtEq; break; + case EVAL_ExprKind_BitAnd: result = RDI_EvalOp_BitAnd; break; + case EVAL_ExprKind_BitXor: result = RDI_EvalOp_BitXor; break; + case EVAL_ExprKind_BitOr: result = RDI_EvalOp_BitOr; break; + case EVAL_ExprKind_LogAnd: result = RDI_EvalOp_LogAnd; break; + case EVAL_ExprKind_LogOr: result = RDI_EvalOp_LogOr; break; } return(result); } @@ -286,9 +286,9 @@ eval_expr_leaf_type(Arena *arena, void *location, TG_Key type_key){ //////////////////////////////// //~ allen: EVAL Type Information Transformers -internal RADDBGI_EvalTypeGroup +internal RDI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind){ - RADDBGI_EvalTypeGroup result = 0; + RDI_EvalTypeGroup result = 0; switch (kind){ default:{}break; @@ -303,7 +303,7 @@ eval_type_group_from_kind(TG_Kind kind){ case TG_Kind_IncompleteStruct: case TG_Kind_IncompleteClass: case TG_Kind_IncompleteUnion: case TG_Kind_IncompleteEnum: case TG_Kind_Bitfield: case TG_Kind_Variadic: - result = RADDBGI_EvalTypeGroup_Other; break; + result = RDI_EvalTypeGroup_Other; break; case TG_Kind_Handle: case TG_Kind_UChar8: case TG_Kind_UChar16: case TG_Kind_UChar32: @@ -312,26 +312,26 @@ eval_type_group_from_kind(TG_Kind kind){ case TG_Kind_U512: case TG_Kind_Ptr: case TG_Kind_LRef: case TG_Kind_RRef: case TG_Kind_Function: case TG_Kind_Method: case TG_Kind_MemberPtr: - result = RADDBGI_EvalTypeGroup_U; break; + result = RDI_EvalTypeGroup_U; break; case TG_Kind_Char8: case TG_Kind_Char16: case TG_Kind_Char32: case TG_Kind_S8: case TG_Kind_S16: case TG_Kind_S32: case TG_Kind_S64: case TG_Kind_S128: case TG_Kind_S256: case TG_Kind_S512: case TG_Kind_Bool: - result = RADDBGI_EvalTypeGroup_S; break; + result = RDI_EvalTypeGroup_S; break; case TG_Kind_F32: - result = RADDBGI_EvalTypeGroup_F32; break; + result = RDI_EvalTypeGroup_F32; break; case TG_Kind_F64: - result = RADDBGI_EvalTypeGroup_F64; break; + result = RDI_EvalTypeGroup_F64; break; } return(result); } internal TG_Key -eval_type_unwrap_enum(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { TG_Key result = key; for(B32 good = 1; good;) @@ -339,7 +339,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) TG_Kind kind = tg_kind_from_key(key); if(kind == TG_Kind_Enum) { - result = tg_direct_from_graph_raddbgi_key(graph, rdbg, result); + result = tg_direct_from_graph_rdi_key(graph, rdbg, result); } else { @@ -350,7 +350,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) } internal TG_Key -eval_type_promote(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key){ +eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key){ TG_Key result = key; TG_Kind kind = tg_kind_from_key(key); if(kind == TG_Kind_Bool || @@ -365,7 +365,7 @@ eval_type_promote(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key){ } internal TG_Key -eval_type_coerce(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ +eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ Assert(eval_kind_is_basic_or_enum(tg_kind_from_key(l)) && eval_kind_is_basic_or_enum(tg_kind_from_key(r))); @@ -384,12 +384,12 @@ eval_type_coerce(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ } internal B32 -eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ +eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ B32 result = 0; // unwrap - TG_Key lu = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l); - TG_Key ru = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, r); + TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l); + TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r); if (tg_key_match(lu, ru)){ result = 1; @@ -408,8 +408,8 @@ eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_LRef: case TG_Kind_RRef: { - TG_Key lud = tg_direct_from_graph_raddbgi_key(graph, rdbg, lu); - TG_Key rud = tg_direct_from_graph_raddbgi_key(graph, rdbg, ru); + TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu); + TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru); if (eval_type_match(graph, rdbg, lud, rud)){ result = 1; } @@ -417,10 +417,10 @@ eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_MemberPtr: { - TG_Key lud = tg_direct_from_graph_raddbgi_key(graph, rdbg, lu); - TG_Key rud = tg_direct_from_graph_raddbgi_key(graph, rdbg, ru); - TG_Key luo = tg_owner_from_graph_raddbgi_key(graph, rdbg, lu); - TG_Key ruo = tg_owner_from_graph_raddbgi_key(graph, rdbg, ru); + TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu); + TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru); + TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdbg, lu); + TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdbg, ru); if (eval_type_match(graph, rdbg, lud, rud) && eval_type_match(graph, rdbg, luo, ruo)){ result = 1; @@ -430,8 +430,8 @@ eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Array: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, r); + TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); + TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); if(lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key)) { result = 1; @@ -442,8 +442,8 @@ eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Function: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, r); + TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); + TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); if (lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key)) { B32 params_match = 1; @@ -466,8 +466,8 @@ eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Method: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, r); + TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); + TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); if (lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key) && eval_type_match(graph, rdbg, lt->owner_type_key, rt->owner_type_key)) @@ -522,15 +522,15 @@ eval_kind_is_basic_or_enum(TG_Kind kind){ internal EVAL_IRTree* eval_irtree_const_u(Arena *arena, U64 v){ // choose encoding op - RADDBGI_EvalOp op = RADDBGI_EvalOp_ConstU64; + RDI_EvalOp op = RDI_EvalOp_ConstU64; if (v < 0x100){ - op = RADDBGI_EvalOp_ConstU8; + op = RDI_EvalOp_ConstU8; } else if (v < 0x10000){ - op = RADDBGI_EvalOp_ConstU16; + op = RDI_EvalOp_ConstU16; } else if (v < 0x100000000){ - op = RADDBGI_EvalOp_ConstU32; + op = RDI_EvalOp_ConstU32; } // make the tree node @@ -541,8 +541,8 @@ eval_irtree_const_u(Arena *arena, U64 v){ } internal EVAL_IRTree* -eval_irtree_unary_op(Arena *arena, RADDBGI_EvalOp op, - RADDBGI_EvalTypeGroup group, EVAL_IRTree *c){ +eval_irtree_unary_op(Arena *arena, RDI_EvalOp op, + RDI_EvalTypeGroup group, EVAL_IRTree *c){ EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); result->op = op; result->p = group; @@ -551,7 +551,7 @@ eval_irtree_unary_op(Arena *arena, RADDBGI_EvalOp op, } internal EVAL_IRTree* -eval_irtree_binary_op(Arena *arena, RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group, +eval_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, EVAL_IRTree *l, EVAL_IRTree *r){ EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); result->op = op; @@ -562,15 +562,15 @@ eval_irtree_binary_op(Arena *arena, RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup gro } internal EVAL_IRTree* -eval_irtree_binary_op_u(Arena *arena, RADDBGI_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r){ - EVAL_IRTree *result = eval_irtree_binary_op(arena, op, RADDBGI_EvalTypeGroup_U, l, r); +eval_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r){ + EVAL_IRTree *result = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l, r); return(result); } internal EVAL_IRTree* eval_irtree_conditional(Arena *arena, EVAL_IRTree *c, EVAL_IRTree *l, EVAL_IRTree *r){ EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = RADDBGI_EvalOp_Cond; + result->op = RDI_EvalOp_Cond; result->children[0] = c; result->children[1] = l; result->children[2] = r; @@ -589,13 +589,13 @@ eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode){ //~ allen: EVAL IR-Tree High Level Helpers internal EVAL_IRTree* -eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ - U64 byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); +eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ + U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); EVAL_IRTree *result = &eval_irtree_nil; if (0 < byte_size && byte_size <= 8){ // build the read node EVAL_IRTree *read_node = push_array(arena, EVAL_IRTree, 1); - read_node->op = RADDBGI_EvalOp_MemRead; + read_node->op = RDI_EvalOp_MemRead; read_node->p = byte_size; read_node->children[0] = c; @@ -605,7 +605,7 @@ eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, E TG_Kind kind = tg_kind_from_key(type_key); if (bit_size < 64 && eval_kind_is_signed(kind)){ with_trunc = push_array(arena, EVAL_IRTree, 1); - with_trunc->op = RADDBGI_EvalOp_TruncSigned; + with_trunc->op = RDI_EvalOp_TruncSigned; with_trunc->p = bit_size; with_trunc->children[0] = read_node; } @@ -620,23 +620,23 @@ eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, E } internal EVAL_IRTree* -eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RADDBGI_EvalTypeGroup out, RADDBGI_EvalTypeGroup in){ +eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in){ EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = RADDBGI_EvalOp_Convert; + result->op = RDI_EvalOp_Convert; result->p = in | (out << 8); result->children[0] = c; return(result); } internal EVAL_IRTree* -eval_irtree_trunc(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ +eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ EVAL_IRTree *result = c; - U64 byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); + U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); if (byte_size < 64){ - RADDBGI_EvalOp op = RADDBGI_EvalOp_Trunc; + RDI_EvalOp op = RDI_EvalOp_Trunc; TG_Kind kind = tg_kind_from_key(type_key); if (eval_kind_is_signed(kind)){ - op = RADDBGI_EvalOp_TruncSigned; + op = RDI_EvalOp_TruncSigned; } U64 bit_size = byte_size << 3; result = push_array(arena, EVAL_IRTree, 1); @@ -648,19 +648,19 @@ eval_irtree_trunc(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTr } internal EVAL_IRTree* -eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in){ +eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in){ EVAL_IRTree *result = c; TG_Kind in_kind = tg_kind_from_key(in); TG_Kind out_kind = tg_kind_from_key(out); U8 in_group = eval_type_group_from_kind(in_kind); U8 out_group = eval_type_group_from_kind(out_kind); - U32 conversion_rule = raddbgi_eval_conversion_rule(in_group, out_group); - if(conversion_rule == RADDBGI_EvalConversionKind_Legal) + U32 conversion_rule = rdi_eval_conversion_rule(in_group, out_group); + if(conversion_rule == RDI_EvalConversionKind_Legal) { result = eval_irtree_convert_lo(arena, result, out_group, in_group); } - U64 in_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, in); - U64 out_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, out); + U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, in); + U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, out); if(out_byte_size < in_byte_size && eval_kind_is_integer(out_kind)) { result = eval_irtree_trunc(arena, graph, rdbg, result, out); @@ -669,7 +669,7 @@ eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL } internal EVAL_IRTree* -eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_EvalMode from_mode, +eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key){ EVAL_IRTree *result = tree; switch (from_mode){ @@ -680,7 +680,7 @@ eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg }break; case EVAL_EvalMode_Reg: { - result = eval_irtree_unary_op(arena, RADDBGI_EvalOp_RegReadDyn, RADDBGI_EvalTypeGroup_U, tree); + result = eval_irtree_unary_op(arena, RDI_EvalOp_RegReadDyn, RDI_EvalTypeGroup_U, tree); }break; } return(result); @@ -715,7 +715,7 @@ eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap } internal TG_Key -eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout){ +eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout){ TG_Key result = zero_struct; EVAL_ExprKind kind = expr->kind; @@ -758,7 +758,7 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EV } internal EVAL_IRTreeAndType -eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout) +eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout) { ProfBeginFunction(); EVAL_IRTreeAndType result = {0}; @@ -781,8 +781,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); if (l.tree->op != 0 && r.tree->op != 0){ - TG_Key l_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, r.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -795,8 +795,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index with this type."); } else{ - direct_type = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, l_restype); - direct_type_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, direct_type); + direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); + direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct_type); if (l_restype_kind == TG_Kind_Ptr){ if (direct_type_size == 0){ eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); @@ -832,7 +832,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); if (direct_type_size > 1){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - index_tree = eval_irtree_binary_op_u(arena, RADDBGI_EvalOp_Mul, index_tree, const_tree); + index_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, index_tree, const_tree); } // how to compute the base address @@ -842,7 +842,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } // how to compute the final address - EVAL_IRTree *new_tree = eval_irtree_binary_op_u(arena, RADDBGI_EvalOp_Add, index_tree, base_tree); + EVAL_IRTree *new_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Add, index_tree, base_tree); // fill result result.tree = new_tree; @@ -860,14 +860,14 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); if (l.tree->op != 0 && !tg_key_match(tg_key_zero(), l.type_key)){ - TG_Key l_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); // determine which type to use TG_Key check_type_key = l_restype; TG_Kind check_type_kind = l_restype_kind; if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){ - check_type_key = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, l_restype); + check_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); check_type_kind = tg_kind_from_key(check_type_key); } @@ -921,7 +921,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd if (l_good && r_good){ Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray check_type_members = tg_data_members_from_graph_raddbgi_key(scratch.arena, graph, rdbg, check_type_key); + TG_MemberArray check_type_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdbg, check_type_key); // lookup member String8 member_name = exprr->name; @@ -957,7 +957,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } if (r_off != 0){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, r_off); - new_tree = eval_irtree_binary_op_u(arena, RADDBGI_EvalOp_Add, new_tree, const_tree); + new_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Add, new_tree, const_tree); } // fill result @@ -978,10 +978,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); if (c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, c_restype); - U64 c_restype_direct_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, c_restype_direct); + TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, c_restype); + U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype_direct); // analyze situation B32 can_generate = 0; @@ -1035,7 +1035,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); if(c.tree->op != 0 && !tg_key_match(c.type_key, tg_key_zero())) { - TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); // analyze situation @@ -1070,26 +1070,26 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd if(cast_type_kind != TG_Kind_Null && c.tree->op != 0) { - TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - U64 c_restype_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, c_restype); - U64 cast_type_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, cast_type_key); + U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype); + U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, cast_type_key); // analyze situation U8 in_group = eval_type_group_from_kind(c_restype_kind); U8 out_group = eval_type_group_from_kind(cast_type_kind); - RADDBGI_EvalConversionKind conversion_rule = raddbgi_eval_conversion_rule(in_group, out_group); + RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_rule(in_group, out_group); // generate tree switch(conversion_rule) { - case RADDBGI_EvalConversionKind_Noop: - case RADDBGI_EvalConversionKind_Legal: + case RDI_EvalConversionKind_Noop: + case RDI_EvalConversionKind_Legal: { EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); EVAL_IRTree *new_tree = in_tree; - if (conversion_rule == RADDBGI_EvalConversionKind_Legal){ + if (conversion_rule == RDI_EvalConversionKind_Legal){ new_tree = eval_irtree_convert_lo(arena, in_tree, out_group, in_group); } if (cast_type_byte_size < c_restype_byte_size && eval_kind_is_integer(cast_type_kind)){ @@ -1104,8 +1104,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd default: { String8 text = str8_lit("(internal) unknown conversion rule"); - if (conversion_rule < RADDBGI_EvalConversionKind_COUNT){ - text.str = raddbgi_eval_conversion_message(conversion_rule, &text.size); + if (conversion_rule < RDI_EvalConversionKind_COUNT){ + text.str = rdi_eval_conversion_message(conversion_rule, &text.size); } eval_error(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, text); }break; @@ -1141,7 +1141,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd TG_Kind type_kind = tg_kind_from_key(type_key); if (type_kind != TG_Kind_Null){ can_generate = 1; - size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, type_key); + size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); } // generate ir tree @@ -1162,15 +1162,15 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); if (c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Key p_type = eval_type_promote(graph, rdbg, c_restype); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); // analyze situation B32 can_generate = 0; - RADDBGI_EvalOp op = eval_opcode_from_expr_kind(kind); + RDI_EvalOp op = eval_opcode_from_expr_kind(kind); U8 c_group = eval_type_group_from_kind(c_restype_kind); - if (!raddbgi_eval_opcode_type_compatible(op, c_group)){ + if (!rdi_eval_opcode_type_compatible(op, c_group)){ eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Cannot use this operator on this type."); } else{ @@ -1218,8 +1218,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); if (l.tree->op != 0 && r.tree->op != 0){ - TG_Key l_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, r.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -1235,7 +1235,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd r_restype_kind = tg_kind_from_key(r_restype); } - RADDBGI_EvalOp op = eval_opcode_from_expr_kind(kind); + RDI_EvalOp op = eval_opcode_from_expr_kind(kind); //- pointer decay B32 l_is_pointer = (l_restype_kind == TG_Kind_Ptr); @@ -1267,10 +1267,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd arith_path = EVAL_ArithPath_PtrAdd; } if (l_is_pointer_like && r_is_pointer_like){ - TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, l_restype); - TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, r_restype); - U64 l_restype_direct_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, l_restype_direct); - U64 r_restype_direct_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, r_restype_direct); + TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); + TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, r_restype); + U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, l_restype_direct); + U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, r_restype_direct); if (l_restype_direct_byte_size == r_restype_direct_byte_size){ arith_path = EVAL_ArithPath_PtrSub; } @@ -1299,7 +1299,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd U8 cv_group = eval_type_group_from_kind(cv_type_kind); B32 can_generate = 0; - if (raddbgi_eval_opcode_type_compatible(op, cv_group)){ + if (rdi_eval_opcode_type_compatible(op, cv_group)){ can_generate = 1; } else{ @@ -1339,8 +1339,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd ptr_is_decay = r_is_decay; } - TG_Key direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, ptr->type_key); - U64 direct_type_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, direct); + TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, ptr->type_key); + U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct); // generate ir tree EVAL_IRTree *ptr_tree = ptr->tree; @@ -1351,7 +1351,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, integer->mode, integer->tree, integer->type_key); if (direct_type_size > 1){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - integer_tree = eval_irtree_binary_op_u(arena, RADDBGI_EvalOp_Mul, integer_tree, const_tree); + integer_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, integer_tree, const_tree); } TG_Key ptr_type = ptr->type_key; @@ -1359,7 +1359,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd ptr_type = tg_cons_type_make(graph, TG_Kind_Ptr, direct, 0); } - EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, RADDBGI_EvalTypeGroup_U, ptr_tree, integer_tree); + EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, ptr_tree, integer_tree); result.tree = new_tree; result.type_key = ptr_type; @@ -1368,8 +1368,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd case EVAL_ArithPath_PtrSub: { - TG_Key direct = tg_unwrapped_direct_from_graph_raddbgi_key(graph, rdbg, l_restype); - U64 direct_type_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, direct); + TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); + U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct); // generate ir tree EVAL_IRTree *l_tree = l.tree; @@ -1382,12 +1382,12 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); } - EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RADDBGI_EvalTypeGroup_U, l_tree, r_tree); + EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l_tree, r_tree); EVAL_IRTree *new_tree = op_tree; if (direct_type_size > 1){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - new_tree = eval_irtree_binary_op(arena, RADDBGI_EvalOp_Div, RADDBGI_EvalTypeGroup_U, new_tree, const_tree); + new_tree = eval_irtree_binary_op(arena, RDI_EvalOp_Div, RDI_EvalTypeGroup_U, new_tree, const_tree); } result.tree = new_tree; @@ -1410,9 +1410,9 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd if (l.tree->op != 0 && r.tree->op != 0 && c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, c.type_key); - TG_Key l_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, r.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -1568,8 +1568,8 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ ProfBeginFunction(); U32 op = tree->op; switch (op){ - case RADDBGI_EvalOp_Stop: - case RADDBGI_EvalOp_Skip: + case RDI_EvalOp_Stop: + case RDI_EvalOp_Skip: { // TODO: error - invalid ir-tree op }break; @@ -1579,7 +1579,7 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ eval_oplist_push_bytecode(arena, out, tree->bytecode); }break; - case RADDBGI_EvalOp_Cond: + case RDI_EvalOp_Cond: { // split out each of the children EVAL_OpList prt_cond = {0}; @@ -1598,11 +1598,11 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ // 4. // modify prt_right in place to create step 2 - eval_oplist_push_op(arena, &prt_right, RADDBGI_EvalOp_Skip, prt_left.encoded_size); + eval_oplist_push_op(arena, &prt_right, RDI_EvalOp_Skip, prt_left.encoded_size); // merge 1 into out eval_oplist_concat_in_place(out, &prt_cond); - eval_oplist_push_op(arena, out, RADDBGI_EvalOp_Cond, prt_right.encoded_size); + eval_oplist_push_op(arena, out, RDI_EvalOp_Cond, prt_right.encoded_size); // merge 2 into out eval_oplist_concat_in_place(out, &prt_right); @@ -1613,20 +1613,20 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ default: { - if (op >= RADDBGI_EvalOp_COUNT){ + if (op >= RDI_EvalOp_COUNT){ // TODO: error - invalid ir-tree op } else{ // handle all children - U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; - U64 child_count = RADDBGI_POPN_FROM_CTRLBITS(ctrlbits); + U8 ctrlbits = rdi_eval_opcode_ctrlbits[op]; + U64 child_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); EVAL_IRTree**child = tree->children; for (U64 i = 0; i < child_count; i += 1, child += 1){ eval_oplist_from_irtree(arena, *child, out); } // emit op to compute this node - eval_oplist_push_op(arena, out, (RADDBGI_EvalOp)tree->op, tree->p); + eval_oplist_push_op(arena, out, (RDI_EvalOp)tree->op, tree->p); } }break; } diff --git a/src/eval/eval_compiler.h b/src/eval/eval_compiler.h index 57066ce9..910bbc07 100644 --- a/src/eval/eval_compiler.h +++ b/src/eval/eval_compiler.h @@ -9,7 +9,7 @@ internal String8 eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list); -internal void eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RADDBGI_EvalOp op, U64 p); +internal void eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RDI_EvalOp op, U64 p); internal void eval_oplist_push_uconst(Arena *arena, EVAL_OpList *list, U64 x); internal void eval_oplist_push_sconst(Arena *arena, EVAL_OpList *list, S64 x); @@ -20,7 +20,7 @@ internal void eval_oplist_concat_in_place(EVAL_OpList *left_dst, EVAL_OpList *ri //////////////////////////////// //~ allen: EVAL Expression Info Functions -internal RADDBGI_EvalOp eval_opcode_from_expr_kind(EVAL_ExprKind kind); +internal RDI_EvalOp eval_opcode_from_expr_kind(EVAL_ExprKind kind); internal B32 eval_expr_kind_is_comparison(EVAL_ExprKind kind); //////////////////////////////// @@ -40,13 +40,13 @@ internal EVAL_Expr* eval_expr_leaf_type(Arena *arena, void *location, TG_Key typ //////////////////////////////// //~ allen: EVAL Type Information Transformers -internal RADDBGI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind); +internal RDI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind); -internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal TG_Key eval_type_promote(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal TG_Key eval_type_coerce(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r); +internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_Key eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_Key eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r); -internal B32 eval_type_match(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key l, TG_Key r); +internal B32 eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r); internal B32 eval_kind_is_integer(TG_Kind kind); internal B32 eval_kind_is_signed(TG_Kind kind); @@ -56,27 +56,27 @@ internal B32 eval_kind_is_basic_or_enum(TG_Kind kind); //~ allen: EVAL IR-Tree Constructors internal EVAL_IRTree* eval_irtree_const_u(Arena *arena, U64 v); -internal EVAL_IRTree* eval_irtree_unary_op(Arena *arena, RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group, EVAL_IRTree *c); -internal EVAL_IRTree* eval_irtree_binary_op(Arena *arena, RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group, EVAL_IRTree *l, EVAL_IRTree *r); -internal EVAL_IRTree* eval_irtree_binary_op_u(Arena *arena, RADDBGI_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r); +internal EVAL_IRTree* eval_irtree_unary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, EVAL_IRTree *c); +internal EVAL_IRTree* eval_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, EVAL_IRTree *l, EVAL_IRTree *r); +internal EVAL_IRTree* eval_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r); internal EVAL_IRTree* eval_irtree_conditional(Arena *arena, EVAL_IRTree *c, EVAL_IRTree *l, EVAL_IRTree *r); internal EVAL_IRTree* eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode); //////////////////////////////// //~ allen: EVAL IR-Tree High Level Helpers -internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); -internal EVAL_IRTree* eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RADDBGI_EvalTypeGroup out, RADDBGI_EvalTypeGroup in); -internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); -internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in); -internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in); +internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in); +internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key); //////////////////////////////// //~ allen: EVAL Compiler Phases internal void eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap *map, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout); +internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout); +internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout); internal void eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out); #endif //EVAL_COMPILER_H diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 26d54c4a..93c5d03b 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -41,7 +41,7 @@ struct EVAL_ErrorList enum { - EVAL_IRExtKind_Bytecode = RADDBGI_EvalOp_COUNT, + EVAL_IRExtKind_Bytecode = RDI_EvalOp_COUNT, EVAL_IRExtKind_COUNT }; @@ -49,7 +49,7 @@ typedef struct EVAL_Op EVAL_Op; struct EVAL_Op { EVAL_Op *next; - RADDBGI_EvalOp opcode; + RDI_EvalOp opcode; union { U64 p; @@ -115,7 +115,7 @@ struct EVAL_Expr typedef struct EVAL_IRTree EVAL_IRTree; struct EVAL_IRTree{ - RADDBGI_EvalOp op; + RDI_EvalOp op; EVAL_IRTree *children[3]; union{ U64 p; diff --git a/src/eval/eval_machine.c b/src/eval/eval_machine.c index 1649b54d..0a44e9f9 100644 --- a/src/eval/eval_machine.c +++ b/src/eval/eval_machine.c @@ -22,18 +22,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) for (;ptr < opl;){ // consume opcode - RADDBGI_EvalOp op = (RADDBGI_EvalOp)*ptr; - if (op >= RADDBGI_EvalOp_COUNT){ + RDI_EvalOp op = (RDI_EvalOp)*ptr; + if (op >= RDI_EvalOp_COUNT){ result.code = EVAL_ResultCode_BadOp; goto done; } - U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; + U8 ctrlbits = rdi_eval_opcode_ctrlbits[op]; ptr += 1; // decode U64 imm = 0; { - U32 decode_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); + U32 decode_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); U8 *next_ptr = ptr + decode_size; if (next_ptr > opl){ result.code = EVAL_ResultCode_BadOp; @@ -54,7 +54,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) // pop EVAL_Slot *svals = 0; { - U32 pop_count = RADDBGI_POPN_FROM_CTRLBITS(ctrlbits); + U32 pop_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); if (pop_count > stack_count){ result.code = EVAL_ResultCode_BadOp; goto done; @@ -68,29 +68,29 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) // interpret EVAL_Slot nval = {0}; switch (op){ - case RADDBGI_EvalOp_Stop: + case RDI_EvalOp_Stop: { goto done; }break; - case RADDBGI_EvalOp_Noop: + case RDI_EvalOp_Noop: { // do nothing }break; - case RADDBGI_EvalOp_Cond: + case RDI_EvalOp_Cond: { if (svals[0].u64){ ptr += imm; } }break; - case RADDBGI_EvalOp_Skip: + case RDI_EvalOp_Skip: { ptr += imm; }break; - case RADDBGI_EvalOp_MemRead: + case RDI_EvalOp_MemRead: { U64 addr = svals[0].u64; U64 size = imm; @@ -105,12 +105,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_RegRead: + case RDI_EvalOp_RegRead: { - U8 raddbgi_reg_code = (imm&0x0000FF)>>0; + U8 rdi_reg_code = (imm&0x0000FF)>>0; U8 byte_size = (imm&0x00FF00)>>8; U8 byte_off = (imm&0xFF0000)>>16; - REGS_RegCode base_reg_code = regs_reg_code_from_arch_raddbgi_code(machine->arch, raddbgi_reg_code); + REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(machine->arch, rdi_reg_code); REGS_Rng rng = regs_reg_code_rng_table_from_architecture(machine->arch)[base_reg_code]; U64 off = (U64)rng.byte_off + byte_off; U64 size = (U64)byte_size; @@ -123,7 +123,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_RegReadDyn: + case RDI_EvalOp_RegReadDyn: { U64 off = svals[0].u64; U64 size = bit_size_from_arch(machine->arch)/8; @@ -136,7 +136,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_FrameOff: + case RDI_EvalOp_FrameOff: { if (machine->frame_base != 0){ nval.u64 = *machine->frame_base + imm; @@ -147,7 +147,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_ModuleOff: + case RDI_EvalOp_ModuleOff: { if (machine->module_base != 0){ nval.u64 = *machine->module_base + imm; @@ -158,7 +158,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_TLSOff: + case RDI_EvalOp_TLSOff: { if (machine->tls_base != 0){ nval.u64 = *machine->tls_base + imm; @@ -169,23 +169,23 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_ConstU8: - case RADDBGI_EvalOp_ConstU16: - case RADDBGI_EvalOp_ConstU32: - case RADDBGI_EvalOp_ConstU64: + case RDI_EvalOp_ConstU8: + case RDI_EvalOp_ConstU16: + case RDI_EvalOp_ConstU32: + case RDI_EvalOp_ConstU64: { nval.u64 = imm; }break; - case RADDBGI_EvalOp_Abs: + case RDI_EvalOp_Abs: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.f32 = svals[0].f32; if (svals[0].f32 < 0){ nval.f32 = -svals[0].f32; } } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.f64 = svals[0].f64; if (svals[0].f64 < 0){ nval.f64 = -svals[0].f64; @@ -199,12 +199,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Neg: + case RDI_EvalOp_Neg: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.f32 = -svals[0].f32; } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.f64 = -svals[0].f64; } else{ @@ -212,12 +212,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Add: + case RDI_EvalOp_Add: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.f32 = svals[0].f32 + svals[1].f32; } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.f64 = svals[0].f64 + svals[1].f64; } else{ @@ -225,12 +225,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Sub: + case RDI_EvalOp_Sub: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.f32 = svals[0].f32 - svals[1].f32; } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.f64 = svals[0].f64 - svals[1].f64; } else{ @@ -238,12 +238,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Mul: + case RDI_EvalOp_Mul: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.f32 = svals[0].f32*svals[1].f32; } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.f64 = svals[0].f64*svals[1].f64; } else{ @@ -251,9 +251,9 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Div: + case RDI_EvalOp_Div: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ if (svals[1].f32 != 0.f){ nval.f32 = svals[0].f32/svals[1].f32; } @@ -263,7 +263,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) goto done; } } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ if (svals[1].f64 != 0.){ nval.f64 = svals[0].f64/svals[1].f64; } @@ -273,8 +273,8 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) goto done; } } - else if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + else if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ if (svals[1].u64 != 0){ nval.u64 = svals[0].u64/svals[1].u64; } @@ -290,10 +290,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Mod: + case RDI_EvalOp_Mod: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ if (svals[1].u64 != 0){ nval.u64 = svals[0].u64%svals[1].u64; } @@ -304,10 +304,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_LShift: + case RDI_EvalOp_LShift: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ nval.u64 = svals[0].u64 << svals[1].u64; } else{ @@ -316,12 +316,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_RShift: + case RDI_EvalOp_RShift: { - if (imm == RADDBGI_EvalTypeGroup_U){ + if (imm == RDI_EvalTypeGroup_U){ nval.u64 = svals[0].u64 >> svals[1].u64; } - else if (imm == RADDBGI_EvalTypeGroup_S){ + else if (imm == RDI_EvalTypeGroup_S){ nval.u64 = svals[0].s64 >> svals[1].u64; } else{ @@ -330,10 +330,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_BitAnd: + case RDI_EvalOp_BitAnd: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ nval.u64 = svals[0].u64&svals[1].u64; } else{ @@ -342,10 +342,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_BitOr: + case RDI_EvalOp_BitOr: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ nval.u64 = svals[0].u64|svals[1].u64; } else{ @@ -354,10 +354,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_BitXor: + case RDI_EvalOp_BitXor: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ nval.u64 = svals[0].u64^svals[1].u64; } else{ @@ -366,10 +366,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_BitNot: + case RDI_EvalOp_BitNot: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ nval.u64 = ~svals[0].u64; } else{ @@ -378,10 +378,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_LogAnd: + case RDI_EvalOp_LogAnd: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ nval.u64 = (svals[0].u64 && svals[1].u64); } else{ @@ -390,10 +390,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_LogOr: + case RDI_EvalOp_LogOr: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ nval.u64 = (svals[0].u64 || svals[1].u64); } else{ @@ -402,10 +402,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_LogNot: + case RDI_EvalOp_LogNot: { - if (imm == RADDBGI_EvalTypeGroup_U || - imm == RADDBGI_EvalTypeGroup_S){ + if (imm == RDI_EvalTypeGroup_U || + imm == RDI_EvalTypeGroup_S){ nval.u64 = (!svals[0].u64); } else{ @@ -414,28 +414,28 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_EqEq: + case RDI_EvalOp_EqEq: { nval.u64 = (svals[0].u64 == svals[1].u64); }break; - case RADDBGI_EvalOp_NtEq: + case RDI_EvalOp_NtEq: { nval.u64 = (svals[0].u64 != svals[1].u64); }break; - case RADDBGI_EvalOp_LsEq: + case RDI_EvalOp_LsEq: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.u64 = (svals[0].f32 <= svals[1].f32); } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.u64 = (svals[0].f64 <= svals[1].f64); } - else if (imm == RADDBGI_EvalTypeGroup_U){ + else if (imm == RDI_EvalTypeGroup_U){ nval.u64 = (svals[0].u64 <= svals[1].u64); } - else if (imm == RADDBGI_EvalTypeGroup_S){ + else if (imm == RDI_EvalTypeGroup_S){ nval.u64 = (svals[0].s64 <= svals[1].s64); } else{ @@ -444,18 +444,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_GrEq: + case RDI_EvalOp_GrEq: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.u64 = (svals[0].f32 >= svals[1].f32); } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.u64 = (svals[0].f64 >= svals[1].f64); } - else if (imm == RADDBGI_EvalTypeGroup_U){ + else if (imm == RDI_EvalTypeGroup_U){ nval.u64 = (svals[0].u64 >= svals[1].u64); } - else if (imm == RADDBGI_EvalTypeGroup_S){ + else if (imm == RDI_EvalTypeGroup_S){ nval.u64 = (svals[0].s64 >= svals[1].s64); } else{ @@ -464,18 +464,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Less: + case RDI_EvalOp_Less: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.u64 = (svals[0].f32 < svals[1].f32); } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.u64 = (svals[0].f64 < svals[1].f64); } - else if (imm == RADDBGI_EvalTypeGroup_U){ + else if (imm == RDI_EvalTypeGroup_U){ nval.u64 = (svals[0].u64 < svals[1].u64); } - else if (imm == RADDBGI_EvalTypeGroup_S){ + else if (imm == RDI_EvalTypeGroup_S){ nval.u64 = (svals[0].s64 < svals[1].s64); } else{ @@ -484,18 +484,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Grtr: + case RDI_EvalOp_Grtr: { - if (imm == RADDBGI_EvalTypeGroup_F32){ + if (imm == RDI_EvalTypeGroup_F32){ nval.u64 = (svals[0].f32 > svals[1].f32); } - else if (imm == RADDBGI_EvalTypeGroup_F64){ + else if (imm == RDI_EvalTypeGroup_F64){ nval.u64 = (svals[0].f64 > svals[1].f64); } - else if (imm == RADDBGI_EvalTypeGroup_U){ + else if (imm == RDI_EvalTypeGroup_U){ nval.u64 = (svals[0].u64 > svals[1].u64); } - else if (imm == RADDBGI_EvalTypeGroup_S){ + else if (imm == RDI_EvalTypeGroup_S){ nval.u64 = (svals[0].s64 > svals[1].s64); } else{ @@ -504,7 +504,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Trunc: + case RDI_EvalOp_Trunc: { if (0 < imm){ U64 mask = 0; @@ -515,7 +515,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_TruncSigned: + case RDI_EvalOp_TruncSigned: { if (0 < imm){ U64 mask = 0; @@ -530,52 +530,52 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Convert: + case RDI_EvalOp_Convert: { U32 in = imm&0xFF; U32 out = (imm >> 8)&0xFF; if (in != out){ - switch (in + out*RADDBGI_EvalTypeGroup_COUNT){ - case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_U*RADDBGI_EvalTypeGroup_COUNT: + switch (in + out*RDI_EvalTypeGroup_COUNT){ + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: { nval.u64 = (U64)svals[0].f32; }break; - case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_U*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: { nval.u64 = (U64)svals[0].f64; }break; - case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_S*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: { nval.s64 = (S64)svals[0].f32; }break; - case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_S*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: { nval.s64 = (S64)svals[0].f64; }break; - case RADDBGI_EvalTypeGroup_U + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].u64; }break; - case RADDBGI_EvalTypeGroup_S + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].s64; }break; - case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].f64; }break; - case RADDBGI_EvalTypeGroup_U + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].u64; }break; - case RADDBGI_EvalTypeGroup_S + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].s64; }break; - case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT: + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].f32; }break; @@ -583,7 +583,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Pick: + case RDI_EvalOp_Pick: { if (stack_count > imm){ nval = stack[stack_count - imm - 1]; @@ -594,12 +594,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) } }break; - case RADDBGI_EvalOp_Pop: + case RDI_EvalOp_Pop: { // do nothing - the pop is handled by the control bits }break; - case RADDBGI_EvalOp_Insert: + case RDI_EvalOp_Insert: { if (stack_count > imm){ if (imm > 0){ @@ -619,7 +619,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode) // push { - U64 push_count = RADDBGI_PUSHN_FROM_CTRLBITS(ctrlbits); + U64 push_count = RDI_PUSHN_FROM_CTRLBITS(ctrlbits); if (push_count == 1){ if (stack_count < stack_cap){ stack[stack_count] = nval; diff --git a/src/eval/eval_parser.c b/src/eval/eval_parser.c index dbbd3a6b..a832bca4 100644 --- a/src/eval/eval_parser.c +++ b/src/eval/eval_parser.c @@ -57,7 +57,7 @@ global read_only S64 eval_g_max_precedence = 15; //~ rjf: Map Building Fast Paths internal EVAL_String2NumMap * -eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff) +eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) { Temp scratch = scratch_begin(&arena, 1); @@ -66,17 +66,17 @@ eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 v struct Task { Task *next; - RADDBGI_Scope *scope; + RDI_Scope *scope; }; Task *first_task = 0; Task *last_task = 0; //- rjf: voff -> tightest scope - RADDBGI_Scope *tightest_scope = 0; + RDI_Scope *tightest_scope = 0; if(rdbg->scope_vmap != 0 && rdbg->scopes != 0) { - U64 scope_idx = raddbgi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); - RADDBGI_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); + RDI_Scope *scope = &rdbg->scopes[scope_idx]; Task *task = push_array(scratch.arena, Task, 1); task->scope = scope; SLLQueuePush(first_task, last_task, task); @@ -86,8 +86,8 @@ eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 v //- rjf: voff-1 -> scope if(voff > 0 && rdbg->scope_vmap != 0 && rdbg->scopes != 0) { - U64 scope_idx = raddbgi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff-1); - RADDBGI_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff-1); + RDI_Scope *scope = &rdbg->scopes[scope_idx]; if(scope != tightest_scope) { Task *task = push_array(scratch.arena, Task, 1); @@ -99,7 +99,7 @@ eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 v //- rjf: tightest scope -> walk up the tree & build tasks for each parent scope if(tightest_scope != 0) { - for(RADDBGI_Scope *scope = &rdbg->scopes[tightest_scope->parent_scope_idx]; + for(RDI_Scope *scope = &rdbg->scopes[tightest_scope->parent_scope_idx]; scope != 0 && scope != &rdbg->scopes[0]; scope = &rdbg->scopes[scope->parent_scope_idx]) { @@ -116,15 +116,15 @@ eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 v //- rjf: accumulate locals for all tasks for(Task *task = first_task; task != 0; task = task->next) { - RADDBGI_Scope *scope = task->scope; + RDI_Scope *scope = task->scope; if(scope != 0) { U32 local_opl_idx = scope->local_first + scope->local_count; for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1) { - RADDBGI_Local *local_var = &rdbg->locals[local_idx]; + RDI_Local *local_var = &rdbg->locals[local_idx]; U64 local_name_size = 0; - U8 *local_name_str = raddbgi_string_from_idx(rdbg, local_var->name_string_idx, &local_name_size); + U8 *local_name_str = rdi_string_from_idx(rdbg, local_var->name_string_idx, &local_name_size); String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size)); eval_string2num_map_insert(arena, map, name, (U64)local_idx+1); } @@ -136,18 +136,18 @@ eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 v } internal EVAL_String2NumMap * -eval_push_member_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff) +eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) { //- rjf: voff -> tightest scope - RADDBGI_Scope *tightest_scope = 0; + RDI_Scope *tightest_scope = 0; if(rdbg->scope_vmap != 0 && rdbg->scopes != 0) { - U64 scope_idx = raddbgi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); + U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); tightest_scope = &rdbg->scopes[scope_idx]; } //- rjf: tightest scope -> procedure - RADDBGI_Procedure *procedure = 0; + RDI_Procedure *procedure = 0; if(tightest_scope != 0 && rdbg->procedures != 0) { U32 proc_idx = tightest_scope->proc_idx; @@ -158,8 +158,8 @@ eval_push_member_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 v } //- rjf: procedure -> udt - RADDBGI_UDT *udt = 0; - if(procedure != 0 && rdbg->udts != 0 && procedure->link_flags & RADDBGI_LinkFlag_TypeScoped) + RDI_UDT *udt = 0; + if(procedure != 0 && rdbg->udts != 0 && procedure->link_flags & RDI_LinkFlag_TypeScoped) { U32 udt_idx = procedure->container_idx; if(0 < udt_idx && udt_idx < rdbg->udts_count) @@ -173,7 +173,7 @@ eval_push_member_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 v *map = eval_string2num_map_make(arena, 64); //- rjf: udt -> fill member map - if(udt != 0 && !(udt->flags & RADDBGI_UserDefinedTypeFlag_EnumMembers) && rdbg->members != 0) + if(udt != 0 && !(udt->flags & RDI_UserDefinedTypeFlag_EnumMembers) && rdbg->members != 0) { U64 data_member_num = 1; for(U32 member_idx = udt->member_first; @@ -184,11 +184,11 @@ eval_push_member_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 v { break; } - RADDBGI_Member *m = &rdbg->members[member_idx]; - if(m->kind == RADDBGI_MemberKind_DataField) + RDI_Member *m = &rdbg->members[member_idx]; + if(m->kind == RDI_MemberKind_DataField) { String8 name = {0}; - name.str = raddbgi_string_from_idx(rdbg, m->name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdbg, m->name_string_idx, &name.size); eval_string2num_map_insert(arena, map, name, data_member_num); data_member_num += 1; } @@ -464,25 +464,25 @@ eval_token_array_make_first_opl(EVAL_Token *first, EVAL_Token *opl) //~ rjf: Parser Functions internal TG_Key -eval_leaf_type_from_name(RADDBGI_Parsed *rdbg, String8 name) +eval_leaf_type_from_name(RDI_Parsed *rdbg, String8 name) { TG_Key key = zero_struct; B32 found = 0; if(rdbg->type_nodes != 0) { - RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(rdbg, RADDBGI_NameMapKind_Types); - RADDBGI_ParsedNameMap parsed_name_map = {0}; - raddbgi_name_map_parse(rdbg, name_map, &parsed_name_map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); + RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Types); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_name_map_parse(rdbg, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); if(node != 0) { U32 match_count = 0; - U32 *matches = raddbgi_matches_from_map_node(rdbg, node, &match_count); + U32 *matches = rdi_matches_from_map_node(rdbg, node, &match_count); if(match_count != 0) { - RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(rdbg, type_nodes, matches[0]); - found = type_node->kind != RADDBGI_TypeKind_NULL; - key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)matches[0]); + RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, matches[0]); + found = type_node->kind != RDI_TypeKind_NULL; + key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)matches[0]); } } } @@ -787,9 +787,9 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 B32 mapped_identifier = 0; B32 identifier_type_is_possibly_dynamically_overridden = 0; B32 identifier_looks_like_type_expr = 0; - RADDBGI_LocationKind loc_kind = RADDBGI_LocationKind_NULL; - RADDBGI_LocationRegister loc_reg = {0}; - RADDBGI_LocationRegisterPlusU16 loc_reg_u16 = {0}; + RDI_LocationKind loc_kind = RDI_LocationKind_NULL; + RDI_LocationRegister loc_reg = {0}; + RDI_LocationRegisterPlusU16 loc_reg_u16 = {0}; String8 loc_bytecode = {0}; REGS_RegCode reg_code = 0; REGS_AliasCode alias_code = 0; @@ -800,12 +800,12 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 String8List namespaceified_token_strings = {0}; if(ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_vmap != 0) { - U64 scope_idx = raddbgi_vmap_idx_from_voff(ctx->rdbg->scope_vmap, ctx->rdbg->scope_vmap_count, ctx->ip_voff); - RADDBGI_Scope *scope = &ctx->rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(ctx->rdbg->scope_vmap, ctx->rdbg->scope_vmap_count, ctx->ip_voff); + RDI_Scope *scope = &ctx->rdbg->scopes[scope_idx]; U64 proc_idx = scope->proc_idx; - RADDBGI_Procedure *procedure = &ctx->rdbg->procedures[proc_idx]; + RDI_Procedure *procedure = &ctx->rdbg->procedures[proc_idx]; U64 name_size = 0; - U8 *name_ptr = raddbgi_string_from_idx(ctx->rdbg, procedure->name_string_idx, &name_size); + U8 *name_ptr = rdi_string_from_idx(ctx->rdbg, procedure->name_string_idx, &name_size); String8 containing_procedure_name = str8(name_ptr, name_size); U64 last_past_scope_resolution_pos = 0; for(;;) @@ -843,26 +843,26 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 { mapped_identifier = 1; identifier_type_is_possibly_dynamically_overridden = 1; - RADDBGI_Local *local_var = raddbgi_element_from_idx(ctx->rdbg, locals, local_num-1); - RADDBGI_TypeNode *type_node = raddbgi_element_from_idx(ctx->rdbg, type_nodes, local_var->type_idx); - type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)local_var->type_idx); + RDI_Local *local_var = rdi_element_from_idx(ctx->rdbg, locals, local_num-1); + RDI_TypeNode *type_node = rdi_element_from_idx(ctx->rdbg, type_nodes, local_var->type_idx); + type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)local_var->type_idx); // rjf: grab location info for(U32 loc_block_idx = local_var->location_first; loc_block_idx < local_var->location_opl; loc_block_idx += 1) { - RADDBGI_LocationBlock *block = &ctx->rdbg->location_blocks[loc_block_idx]; + RDI_LocationBlock *block = &ctx->rdbg->location_blocks[loc_block_idx]; if(block->scope_off_first <= ctx->ip_voff && ctx->ip_voff < block->scope_off_opl) { - loc_kind = *((RADDBGI_LocationKind *)(ctx->rdbg->location_data + block->location_data_off)); + loc_kind = *((RDI_LocationKind *)(ctx->rdbg->location_data + block->location_data_off)); switch(loc_kind) { default:{mapped_identifier = 0;}break; - case RADDBGI_LocationKind_AddrBytecodeStream: - case RADDBGI_LocationKind_ValBytecodeStream: + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: { - U8 *bytecode_base = ctx->rdbg->location_data + block->location_data_off + sizeof(RADDBGI_LocationKind); + U8 *bytecode_base = ctx->rdbg->location_data + block->location_data_off + sizeof(RDI_LocationKind); U64 bytecode_size = 0; for(U64 idx = 0; idx < ctx->rdbg->location_data_size; idx += 1) { @@ -871,18 +871,18 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 { break; } - U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; - U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); + U8 ctrlbits = rdi_eval_opcode_ctrlbits[op]; + U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); bytecode_size += 1+p_size; } loc_bytecode = str8(bytecode_base, bytecode_size); }break; - case RADDBGI_LocationKind_AddrRegisterPlusU16: - case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: + case RDI_LocationKind_AddrRegisterPlusU16: + case RDI_LocationKind_AddrAddrRegisterPlusU16: { MemoryCopy(&loc_reg_u16, (ctx->rdbg->location_data + block->location_data_off), sizeof(loc_reg_u16)); }break; - case RADDBGI_LocationKind_ValRegister: + case RDI_LocationKind_ValRegister: { MemoryCopy(&loc_reg, (ctx->rdbg->location_data + block->location_data_off), sizeof(loc_reg)); }break; @@ -919,21 +919,21 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try global variables if(mapped_identifier == 0) { - RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(ctx->rdbg, RADDBGI_NameMapKind_GlobalVariables); + RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_GlobalVariables); if(name_map != 0 && ctx->rdbg->global_variables != 0) { - RADDBGI_ParsedNameMap parsed_name_map = {0}; - raddbgi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); } if(matches_count != 0) { @@ -942,16 +942,16 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 // don't know of a magic hash table fixup path in PDBs, so // in this case, I'm going to prefer the latest-added global. U32 match_idx = matches[matches_count-1]; - RADDBGI_GlobalVariable *global_var = &ctx->rdbg->global_variables[match_idx]; + RDI_GlobalVariable *global_var = &ctx->rdbg->global_variables[match_idx]; EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_ModuleOff, global_var->voff); - loc_kind = RADDBGI_LocationKind_AddrBytecodeStream; + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff); + loc_kind = RDI_LocationKind_AddrBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = global_var->type_idx; if(type_idx < ctx->rdbg->type_nodes_count) { - RADDBGI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; - type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)type_idx); + RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; } @@ -961,35 +961,35 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try thread variables if(mapped_identifier == 0) { - RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(ctx->rdbg, RADDBGI_NameMapKind_ThreadVariables); + RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_ThreadVariables); if(name_map != 0 && ctx->rdbg->global_variables != 0) { - RADDBGI_ParsedNameMap parsed_name_map = {0}; - raddbgi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); } if(matches_count != 0) { U32 match_idx = matches[0]; - RADDBGI_ThreadVariable *thread_var = &ctx->rdbg->thread_variables[match_idx]; + RDI_ThreadVariable *thread_var = &ctx->rdbg->thread_variables[match_idx]; EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_TLSOff, thread_var->tls_off); - loc_kind = RADDBGI_LocationKind_AddrBytecodeStream; + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off); + loc_kind = RDI_LocationKind_AddrBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = thread_var->type_idx; if(type_idx < ctx->rdbg->type_nodes_count) { - RADDBGI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; - type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)type_idx); + RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; } @@ -999,37 +999,37 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try procedures if(mapped_identifier == 0) { - RADDBGI_NameMap *name_map = raddbgi_name_map_from_kind(ctx->rdbg, RADDBGI_NameMapKind_Procedures); + RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_Procedures); if(name_map != 0 && ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_voffs) { - RADDBGI_ParsedNameMap parsed_name_map = {0}; - raddbgi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RADDBGI_NameMapNode *node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = raddbgi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = raddbgi_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); } if(matches_count != 0) { U32 match_idx = matches[0]; - RADDBGI_Procedure *procedure = &ctx->rdbg->procedures[match_idx]; - RADDBGI_Scope *scope = &ctx->rdbg->scopes[procedure->root_scope_idx]; + RDI_Procedure *procedure = &ctx->rdbg->procedures[match_idx]; + RDI_Scope *scope = &ctx->rdbg->scopes[procedure->root_scope_idx]; U64 voff = ctx->rdbg->scope_voffs[scope->voff_range_first]; EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_ModuleOff, voff); - loc_kind = RADDBGI_LocationKind_ValBytecodeStream; + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, voff); + loc_kind = RDI_LocationKind_ValBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = procedure->type_idx; if(type_idx < ctx->rdbg->type_nodes_count) { - RADDBGI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; - type_key = tg_key_ext(tg_kind_from_raddbgi_type_kind(type_node->kind), (U64)type_idx); + RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; } @@ -1086,44 +1086,44 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 eval_errorf(arena, &result.errors, EVAL_ErrorKind_MissingInfo, token_string.str, "Missing location information for \"%S\".", token_string); } }break; - case RADDBGI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_AddrBytecodeStream: { atom = eval_expr_leaf_bytecode(arena, token_string.str, type_key, loc_bytecode, EVAL_EvalMode_Addr); }break; - case RADDBGI_LocationKind_ValBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: { atom = eval_expr_leaf_bytecode(arena, token_string.str, type_key, loc_bytecode, EVAL_EvalMode_Value); }break; - case RADDBGI_LocationKind_AddrRegisterPlusU16: + case RDI_LocationKind_AddrRegisterPlusU16: { EVAL_OpList oplist = {0}; U64 byte_size = bit_size_from_arch(ctx->arch)/8; - U64 regread_param = RADDBGI_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0); - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_RegRead, regread_param); - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_ConstU16, loc_reg_u16.offset); - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_Add, 0); + U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0); + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0); atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Addr); }break; - case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: + case RDI_LocationKind_AddrAddrRegisterPlusU16: { EVAL_OpList oplist = {0}; U64 byte_size = bit_size_from_arch(ctx->arch)/8; - U64 regread_param = RADDBGI_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0); - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_RegRead, regread_param); - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_ConstU16, loc_reg_u16.offset); - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_Add, 0); - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_MemRead, bit_size_from_arch(ctx->arch)/8); + U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0); + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0); + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(ctx->arch)/8); atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Addr); }break; - case RADDBGI_LocationKind_ValRegister: + case RDI_LocationKind_ValRegister: { - REGS_RegCode regs_reg_code = regs_reg_code_from_arch_raddbgi_code(ctx->arch, loc_reg.register_code); + REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(ctx->arch, loc_reg.register_code); REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(ctx->arch)[regs_reg_code]; EVAL_OpList oplist = {0}; U64 byte_size = (U64)reg_rng.byte_size; U64 byte_pos = 0; - U64 regread_param = RADDBGI_EncodeRegReadParam(loc_reg.register_code, byte_size, byte_pos); - eval_oplist_push_op(arena, &oplist, RADDBGI_EvalOp_RegRead, regread_param); + U64 regread_param = RDI_EncodeRegReadParam(loc_reg.register_code, byte_size, byte_pos); + eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Value); }break; } diff --git a/src/eval/eval_parser.h b/src/eval/eval_parser.h index 2b1c6fe8..b534800e 100644 --- a/src/eval/eval_parser.h +++ b/src/eval/eval_parser.h @@ -67,7 +67,7 @@ struct EVAL_ParseCtx { Architecture arch; U64 ip_voff; - RADDBGI_Parsed *rdbg; + RDI_Parsed *rdbg; TG_Graph *type_graph; EVAL_String2NumMap *regs_map; EVAL_String2NumMap *reg_alias_map; @@ -85,8 +85,8 @@ global read_only EVAL_ParseResult eval_parse_result_nil = {0, &eval_expr_nil}; //////////////////////////////// //~ rjf: Debug-Info-Driven Map Building Fast Paths -internal EVAL_String2NumMap *eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff); -internal EVAL_String2NumMap *eval_push_member_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff); +internal EVAL_String2NumMap *eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff); +internal EVAL_String2NumMap *eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff); //////////////////////////////// //~ rjf: Tokenization Functions @@ -101,7 +101,7 @@ internal EVAL_TokenArray eval_token_array_make_first_opl(EVAL_Token *first, EVAL //////////////////////////////// //~ rjf: Parser Functions -internal TG_Key eval_leaf_type_from_name(RADDBGI_Parsed *rdbg, String8 name); +internal TG_Key eval_leaf_type_from_name(RDI_Parsed *rdbg, String8 name); internal EVAL_ParseResult eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); internal EVAL_ParseResult eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens, S64 max_precedence); internal EVAL_ParseResult eval_parse_expr_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); diff --git a/src/lib_raddbg_markup/raddbg_markup.h b/src/lib_raddbg_markup/raddbg_markup.h index 696143b2..bd0b0cc4 100644 --- a/src/lib_raddbg_markup/raddbg_markup.h +++ b/src/lib_raddbg_markup/raddbg_markup.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_MARKUP_H -#define RADDBGI_MARKUP_H +#ifndef RDI_MARKUP_H +#define RDI_MARKUP_H //////////////////////////////// //~ Usage Macros @@ -75,4 +75,4 @@ raddbg_log__impl(char *fmt, ...) #endif // defined(_WIN32) -#endif // RADDBGI_MARKUP_H +#endif // RDI_MARKUP_H diff --git a/src/lib_raddbgi_format/raddbgi_format.c b/src/lib_raddbgi_format/raddbgi_format.c index 50aa193d..8d5ea8b8 100644 --- a/src/lib_raddbgi_format/raddbgi_format.c +++ b/src/lib_raddbgi_format/raddbgi_format.c @@ -4,24 +4,24 @@ //////////////////////////////// // Functions -RADDBGI_PROC RADDBGI_U64 -raddbgi_hash(RADDBGI_U8 *ptr, RADDBGI_U64 size){ - RADDBGI_U64 result = 5381; - RADDBGI_U8 *opl = ptr + size; +RDI_PROC RDI_U64 +rdi_hash(RDI_U8 *ptr, RDI_U64 size){ + RDI_U64 result = 5381; + RDI_U8 *opl = ptr + size; for (; ptr < opl; ptr += 1){ result = ((result << 5) + result) + *ptr; } return(result); } -RADDBGI_PROC RADDBGI_U32 -raddbgi_size_from_basic_type_kind(RADDBGI_TypeKind kind){ - RADDBGI_U32 result = 0; +RDI_PROC RDI_U32 +rdi_size_from_basic_type_kind(RDI_TypeKind kind){ + RDI_U32 result = 0; switch (kind){ #define X(N,C) #define XZ(N,C,Z) case C: result = Z; break; #define Y(A,N) - RADDBGI_TypeKindXList(X,XZ,Y) + RDI_TypeKindXList(X,XZ,Y) #undef X #undef XZ #undef Y @@ -29,12 +29,12 @@ raddbgi_size_from_basic_type_kind(RADDBGI_TypeKind kind){ return(result); } -RADDBGI_PROC RADDBGI_U32 -raddbgi_addr_size_from_arch(RADDBGI_Arch arch){ - RADDBGI_U32 result = 0; +RDI_PROC RDI_U32 +rdi_addr_size_from_arch(RDI_Arch arch){ + RDI_U32 result = 0; switch (arch){ #define X(N,C,Z) case C: result = Z; break; - RADDBGI_ArchXList(X) + RDI_ArchXList(X) #undef X } return(result); @@ -42,14 +42,14 @@ raddbgi_addr_size_from_arch(RADDBGI_Arch arch){ //- eval helpers -RADDBGI_PROC RADDBGI_EvalConversionKind -raddbgi_eval_conversion_rule(RADDBGI_EvalTypeGroup in, RADDBGI_EvalTypeGroup out){ - RADDBGI_EvalConversionKind result = 0; +RDI_PROC RDI_EvalConversionKind +rdi_eval_conversion_rule(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out){ + RDI_EvalConversionKind result = 0; switch (in + (out << 8)){ -#define Y(i,o) case ((RADDBGI_EvalTypeGroup_##i) + ((RADDBGI_EvalTypeGroup_##o) << 8)): +#define Y(i,o) case ((RDI_EvalTypeGroup_##i) + ((RDI_EvalTypeGroup_##o) << 8)): #define Xb(c) -#define Xe(c) result = RADDBGI_EvalConversionKind_##c; break; - RADDBGI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe) +#define Xe(c) result = RDI_EvalConversionKind_##c; break; + RDI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe) #undef Xe #undef Xb #undef Y @@ -57,38 +57,38 @@ raddbgi_eval_conversion_rule(RADDBGI_EvalTypeGroup in, RADDBGI_EvalTypeGroup out return(result); } -RADDBGI_PROC RADDBGI_U8* -raddbgi_eval_conversion_message(RADDBGI_EvalConversionKind conversion_kind, RADDBGI_U64 *lenout){ - RADDBGI_U8 *result = 0; +RDI_PROC RDI_U8* +rdi_eval_conversion_message(RDI_EvalConversionKind conversion_kind, RDI_U64 *lenout){ + RDI_U8 *result = 0; switch (conversion_kind){ #define X(N,msg) \ -case RADDBGI_EvalConversionKind_##N: result = (RADDBGI_U8*)msg; *lenout = sizeof(msg) - 1; break; - RADDBGI_EvalConversionKindXList(X) +case RDI_EvalConversionKind_##N: result = (RDI_U8*)msg; *lenout = sizeof(msg) - 1; break; + RDI_EvalConversionKindXList(X) #undef X } return(result); } -RADDBGI_PROC RADDBGI_S32 -raddbgi_eval_opcode_type_compatible(RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group){ - RADDBGI_S32 result = 0; +RDI_PROC RDI_S32 +rdi_eval_opcode_type_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group){ + RDI_S32 result = 0; switch (op){ - case RADDBGI_EvalOp_Neg: case RADDBGI_EvalOp_Add: case RADDBGI_EvalOp_Sub: - case RADDBGI_EvalOp_Mul: case RADDBGI_EvalOp_Div: - case RADDBGI_EvalOp_EqEq:case RADDBGI_EvalOp_NtEq: - case RADDBGI_EvalOp_LsEq:case RADDBGI_EvalOp_GrEq: - case RADDBGI_EvalOp_Less:case RADDBGI_EvalOp_Grtr: + case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub: + case RDI_EvalOp_Mul: case RDI_EvalOp_Div: + case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq: + case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq: + case RDI_EvalOp_Less:case RDI_EvalOp_Grtr: { - if (group != RADDBGI_EvalTypeGroup_Other){ + if (group != RDI_EvalTypeGroup_Other){ result = 1; } }break; - case RADDBGI_EvalOp_Mod:case RADDBGI_EvalOp_LShift:case RADDBGI_EvalOp_RShift: - case RADDBGI_EvalOp_BitNot:case RADDBGI_EvalOp_BitAnd:case RADDBGI_EvalOp_BitXor: - case RADDBGI_EvalOp_BitOr:case RADDBGI_EvalOp_LogNot:case RADDBGI_EvalOp_LogAnd: - case RADDBGI_EvalOp_LogOr: + case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift: + case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor: + case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd: + case RDI_EvalOp_LogOr: { - if (group == RADDBGI_EvalTypeGroup_S || group == RADDBGI_EvalTypeGroup_U){ + if (group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U){ result = 1; } }break; diff --git a/src/lib_raddbgi_format/raddbgi_format.h b/src/lib_raddbgi_format/raddbgi_format.h index a237173f..6f89ccca 100644 --- a/src/lib_raddbgi_format/raddbgi_format.h +++ b/src/lib_raddbgi_format/raddbgi_format.h @@ -1,60 +1,66 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////////////////////////////////////// +// RAD Debug Info, (R)AD(D)BG(I) Format Library +// +// Defines standard RADDBGI debug information format types and +// functions. + #ifndef RADDBGI_FORMAT_H #define RADDBGI_FORMAT_H //////////////////////////////////////////////////////////////// // Overridable procedure decoration -#if !defined(RADDBGI_PROC) -# define RADDBGI_PROC static +#if !defined(RDI_PROC) +# define RDI_PROC static #endif //////////////////////////////////////////////////////////////// // Overridable integer types -#if !defined(RADDBGI_U8) -# define RADDBGI_U8 RADDBGI_U8 -# define RADDBGI_U16 RADDBGI_U16 -# define RADDBGI_U32 RADDBGI_U32 -# define RADDBGI_U64 RADDBGI_U64 -# define RADDBGI_S8 RADDBGI_S8 -# define RADDBGI_S16 RADDBGI_S16 -# define RADDBGI_S32 RADDBGI_S32 -# define RADDBGI_S64 RADDBGI_S64 +#if !defined(RDI_U8) +# define RDI_U8 RDI_U8 +# define RDI_U16 RDI_U16 +# define RDI_U32 RDI_U32 +# define RDI_U64 RDI_U64 +# define RDI_S8 RDI_S8 +# define RDI_S16 RDI_S16 +# define RDI_S32 RDI_S32 +# define RDI_S64 RDI_S64 #include -typedef uint8_t RADDBGI_U8; -typedef uint16_t RADDBGI_U16; -typedef uint32_t RADDBGI_U32; -typedef uint64_t RADDBGI_U64; -typedef int8_t RADDBGI_S8; -typedef int16_t RADDBGI_S16; -typedef int32_t RADDBGI_S32; -typedef int64_t RADDBGI_S64; +typedef uint8_t RDI_U8; +typedef uint16_t RDI_U16; +typedef uint32_t RDI_U32; +typedef uint64_t RDI_U64; +typedef int8_t RDI_S8; +typedef int16_t RDI_S16; +typedef int32_t RDI_S32; +typedef int64_t RDI_S64; #endif //////////////////////////////////////////////////////////////// // Architecture Constants -#define RADDBGI_ArchXList(X)\ +#define RDI_ArchXList(X)\ X(NULL, 0, 0)\ X(X86, 1, 4)\ X(X64, 2, 8) -typedef RADDBGI_U32 RADDBGI_Arch; -typedef enum RADDBGI_ArchEnum{ -#define X(N,C,Z) RADDBGI_Arch_##N = C, - RADDBGI_ArchXList(X) +typedef RDI_U32 RDI_Arch; +typedef enum RDI_ArchEnum{ +#define X(N,C,Z) RDI_Arch_##N = C, + RDI_ArchXList(X) #undef X -} RADDBGI_ArchEnum; +} RDI_ArchEnum; -typedef RADDBGI_U8 RADDBGI_RegisterCode; +typedef RDI_U8 RDI_RegisterCode; // x86 registers -#define RADDBGI_RegisterCode_X86_XList(X) \ +#define RDI_RegisterCode_X86_XList(X) \ X(nil, 0) \ X(eax, 1) \ X(ecx, 2) \ @@ -118,14 +124,14 @@ X(ymm6, 59) \ X(ymm7, 60) \ X(COUNT, 61) -typedef enum RADDBGI_RegisterCode_X86_Enum{ -#define X(N,C) RADDBGI_RegisterCode_X86_##N = C, - RADDBGI_RegisterCode_X86_XList(X) +typedef enum RDI_RegisterCode_X86_Enum{ +#define X(N,C) RDI_RegisterCode_X86_##N = C, + RDI_RegisterCode_X86_XList(X) #undef X -} RADDBGI_RegisterCode_X86_Enum; +} RDI_RegisterCode_X86_Enum; // x64 registers -#define RADDBGI_RegisterCode_X64_XList(X) \ +#define RDI_RegisterCode_X64_XList(X) \ X(nil, 0) \ X(rax, 1) \ X(rcx, 2) \ @@ -205,48 +211,48 @@ X(fdp, 75) \ X(mxcsr_mask, 76) \ X(COUNT, 77) -typedef enum RADDBGI_RegisterCode_X64_Enum{ -#define X(N,C) RADDBGI_RegisterCode_X64_##N = C, - RADDBGI_RegisterCode_X64_XList(X) +typedef enum RDI_RegisterCode_X64_Enum{ +#define X(N,C) RDI_RegisterCode_X64_##N = C, + RDI_RegisterCode_X64_XList(X) #undef X -} RADDBGI_RegisterCode_X64_Enum; +} RDI_RegisterCode_X64_Enum; //////////////////////////////////////////////////////////////// // Format types // "raddbg\0\0" -#define RADDBGI_MAGIC_CONSTANT 0x0000676264646172 -#define RADDBGI_ENCODING_VERSION 1 +#define RDI_MAGIC_CONSTANT 0x0000676264646172 +#define RDI_ENCODING_VERSION 1 -#define RADDBGI_LanguageXList(X) \ +#define RDI_LanguageXList(X) \ X(NULL, 0) \ X(C, 1) \ X(CPlusPlus, 2) -typedef RADDBGI_U32 RADDBGI_Language; -typedef enum RADDBGI_LanguageEnum{ -#define X(N,C) RADDBGI_Language_##N = C, - RADDBGI_LanguageXList(X) +typedef RDI_U32 RDI_Language; +typedef enum RDI_LanguageEnum{ +#define X(N,C) RDI_Language_##N = C, + RDI_LanguageXList(X) #undef X -} RADDBGI_LanguageEnum; +} RDI_LanguageEnum; -typedef struct RADDBGI_Header{ +typedef struct RDI_Header{ // identification - RADDBGI_U64 magic; - RADDBGI_U32 encoding_version; + RDI_U64 magic; + RDI_U32 encoding_version; // data sections - RADDBGI_U32 data_section_off; - RADDBGI_U32 data_section_count; -} RADDBGI_Header; + RDI_U32 data_section_off; + RDI_U32 data_section_count; +} RDI_Header; //- data sections -#define RADDBGI_DataSectionTag_SECONDARY 0x80000000 +#define RDI_DataSectionTag_SECONDARY 0x80000000 -#define RADDBGI_DataSectionTagXList(X,Y) \ +#define RDI_DataSectionTagXList(X,Y) \ X(NULL, 0x0000)\ X(TopLevelInfo, 0x0001)\ X(StringData, 0x0002)\ @@ -273,131 +279,131 @@ X(LocationBlocks, 0x0016)\ X(LocationData, 0x0017)\ X(NameMaps, 0x0018)\ Y(PRIMARY_COUNT)\ -X(SKIP, RADDBGI_DataSectionTag_SECONDARY|0x0000)\ -X(LineInfoVoffs, RADDBGI_DataSectionTag_SECONDARY|0x0001)\ -X(LineInfoData, RADDBGI_DataSectionTag_SECONDARY|0x0002)\ -X(LineInfoColumns, RADDBGI_DataSectionTag_SECONDARY|0x0003)\ -X(LineMapNumbers, RADDBGI_DataSectionTag_SECONDARY|0x0004)\ -X(LineMapRanges, RADDBGI_DataSectionTag_SECONDARY|0x0005)\ -X(LineMapVoffs, RADDBGI_DataSectionTag_SECONDARY|0x0006)\ -X(NameMapBuckets, RADDBGI_DataSectionTag_SECONDARY|0x0007)\ -X(NameMapNodes, RADDBGI_DataSectionTag_SECONDARY|0x0008) +X(SKIP, RDI_DataSectionTag_SECONDARY|0x0000)\ +X(LineInfoVoffs, RDI_DataSectionTag_SECONDARY|0x0001)\ +X(LineInfoData, RDI_DataSectionTag_SECONDARY|0x0002)\ +X(LineInfoColumns, RDI_DataSectionTag_SECONDARY|0x0003)\ +X(LineMapNumbers, RDI_DataSectionTag_SECONDARY|0x0004)\ +X(LineMapRanges, RDI_DataSectionTag_SECONDARY|0x0005)\ +X(LineMapVoffs, RDI_DataSectionTag_SECONDARY|0x0006)\ +X(NameMapBuckets, RDI_DataSectionTag_SECONDARY|0x0007)\ +X(NameMapNodes, RDI_DataSectionTag_SECONDARY|0x0008) -typedef RADDBGI_U32 RADDBGI_DataSectionTag; -typedef enum RADDBGI_DataSectionTagEnum{ -#define X(N,C) RADDBGI_DataSectionTag_##N = C, -#define Y(N) RADDBGI_DataSectionTag_##N, - RADDBGI_DataSectionTagXList(X,Y) +typedef RDI_U32 RDI_DataSectionTag; +typedef enum RDI_DataSectionTagEnum{ +#define X(N,C) RDI_DataSectionTag_##N = C, +#define Y(N) RDI_DataSectionTag_##N, + RDI_DataSectionTagXList(X,Y) #undef X #undef Y -} RADDBGI_DataSectionTagEnum; +} RDI_DataSectionTagEnum; -#define RADDBGI_DataSectionEncodingXList(X) \ +#define RDI_DataSectionEncodingXList(X) \ X(Unpacked, 0) -typedef RADDBGI_U32 RADDBGI_DataSectionEncoding; -typedef enum RADDBGI_DataSectionEncodingEnum{ -#define X(N,C) RADDBGI_DataSectionEncoding_##N = C, - RADDBGI_DataSectionEncodingXList(X) +typedef RDI_U32 RDI_DataSectionEncoding; +typedef enum RDI_DataSectionEncodingEnum{ +#define X(N,C) RDI_DataSectionEncoding_##N = C, + RDI_DataSectionEncodingXList(X) #undef X -} RADDBGI_DataSectionEncodingEnum; +} RDI_DataSectionEncodingEnum; -typedef struct RADDBGI_DataSection{ - RADDBGI_DataSectionTag tag; - RADDBGI_DataSectionEncoding encoding; - RADDBGI_U64 off; - RADDBGI_U64 encoded_size; - RADDBGI_U64 unpacked_size; -} RADDBGI_DataSection; +typedef struct RDI_DataSection{ + RDI_DataSectionTag tag; + RDI_DataSectionEncoding encoding; + RDI_U64 off; + RDI_U64 encoded_size; + RDI_U64 unpacked_size; +} RDI_DataSection; //- common types -typedef struct RADDBGI_VMapEntry{ - RADDBGI_U64 voff; - RADDBGI_U64 idx; -} RADDBGI_VMapEntry; +typedef struct RDI_VMapEntry{ + RDI_U64 voff; + RDI_U64 idx; +} RDI_VMapEntry; //- top level info -typedef struct RADDBGI_TopLevelInfo{ - RADDBGI_Arch architecture; - RADDBGI_U32 exe_name_string_idx; - RADDBGI_U64 exe_hash; - RADDBGI_U64 voff_max; -} RADDBGI_TopLevelInfo; +typedef struct RDI_TopLevelInfo{ + RDI_Arch architecture; + RDI_U32 exe_name_string_idx; + RDI_U64 exe_hash; + RDI_U64 voff_max; +} RDI_TopLevelInfo; //- binary sections -typedef RADDBGI_U32 RADDBGI_BinarySectionFlags; -typedef enum RADDBGI_BinarySectionFlagsEnum{ - RADDBGI_BinarySectionFlag_Read = (1 << 0), - RADDBGI_BinarySectionFlag_Write = (1 << 1), - RADDBGI_BinarySectionFlag_Execute = (1 << 2) -} RADDBGI_BinarySectionFlagsEnum; +typedef RDI_U32 RDI_BinarySectionFlags; +typedef enum RDI_BinarySectionFlagsEnum{ + RDI_BinarySectionFlag_Read = (1 << 0), + RDI_BinarySectionFlag_Write = (1 << 1), + RDI_BinarySectionFlag_Execute = (1 << 2) +} RDI_BinarySectionFlagsEnum; -typedef struct RADDBGI_BinarySection{ - RADDBGI_U32 name_string_idx; - RADDBGI_BinarySectionFlags flags; - RADDBGI_U64 voff_first; - RADDBGI_U64 voff_opl; - RADDBGI_U64 foff_first; - RADDBGI_U64 foff_opl; -} RADDBGI_BinarySection; +typedef struct RDI_BinarySection{ + RDI_U32 name_string_idx; + RDI_BinarySectionFlags flags; + RDI_U64 voff_first; + RDI_U64 voff_opl; + RDI_U64 foff_first; + RDI_U64 foff_opl; +} RDI_BinarySection; //- file & file system info -typedef struct RADDBGI_FilePathNode{ - RADDBGI_U32 name_string_idx; - RADDBGI_U32 parent_path_node; - RADDBGI_U32 first_child; - RADDBGI_U32 next_sibling; - RADDBGI_U32 source_file_idx; -} RADDBGI_FilePathNode; +typedef struct RDI_FilePathNode{ + RDI_U32 name_string_idx; + RDI_U32 parent_path_node; + RDI_U32 first_child; + RDI_U32 next_sibling; + RDI_U32 source_file_idx; +} RDI_FilePathNode; -typedef struct RADDBGI_SourceFile{ - RADDBGI_U32 file_path_node_idx; +typedef struct RDI_SourceFile{ + RDI_U32 file_path_node_idx; - RADDBGI_U32 normal_full_path_string_idx; + RDI_U32 normal_full_path_string_idx; // usage of line map to go from a line number to an array of voffs // (line_map_nums * line_number) -> (nil | index) // (line_map_data * index) -> (range) // (line_map_voff_data * range) -> (array(voff)) - RADDBGI_U32 line_map_count; - RADDBGI_U32 line_map_nums_data_idx; // U32[line_map_count] (sorted - not closed ranges) - RADDBGI_U32 line_map_range_data_idx; // U32[line_map_count + 1] (pairs form ranges) - RADDBGI_U32 line_map_voff_data_idx; // U64[...] (idx by line_map_range_data) -} RADDBGI_SourceFile; + RDI_U32 line_map_count; + RDI_U32 line_map_nums_data_idx; // U32[line_map_count] (sorted - not closed ranges) + RDI_U32 line_map_range_data_idx; // U32[line_map_count + 1] (pairs form ranges) + RDI_U32 line_map_voff_data_idx; // U64[...] (idx by line_map_range_data) +} RDI_SourceFile; //- units & line info -typedef struct RADDBGI_Unit{ - RADDBGI_U32 unit_name_string_idx; - RADDBGI_U32 compiler_name_string_idx; - RADDBGI_U32 source_file_path_node; - RADDBGI_U32 object_file_path_node; - RADDBGI_U32 archive_file_path_node; - RADDBGI_U32 build_path_node; - RADDBGI_Language language; +typedef struct RDI_Unit{ + RDI_U32 unit_name_string_idx; + RDI_U32 compiler_name_string_idx; + RDI_U32 source_file_path_node; + RDI_U32 object_file_path_node; + RDI_U32 archive_file_path_node; + RDI_U32 build_path_node; + RDI_Language language; // usage of line info to go from voff to file & line number: // (line_info_voffs * voff) -> (nil + index) - // (line_info_data * index) -> (RADDBGI_Line = (file_idx * line_number)) + // (line_info_data * index) -> (RDI_Line = (file_idx * line_number)) - RADDBGI_U32 line_info_voffs_data_idx; // U64[line_info_count + 1] (sorted ranges) - RADDBGI_U32 line_info_data_idx; // RADDBGI_Line[line_info_count] - RADDBGI_U32 line_info_col_data_idx; // RADDBGI_Col[line_info_count] - RADDBGI_U32 line_info_count; -} RADDBGI_Unit; + RDI_U32 line_info_voffs_data_idx; // U64[line_info_count + 1] (sorted ranges) + RDI_U32 line_info_data_idx; // RDI_Line[line_info_count] + RDI_U32 line_info_col_data_idx; // RDI_Col[line_info_count] + RDI_U32 line_info_count; +} RDI_Unit; -typedef struct RADDBGI_Line{ - RADDBGI_U32 file_idx; - RADDBGI_U32 line_num; -} RADDBGI_Line; +typedef struct RDI_Line{ + RDI_U32 file_idx; + RDI_U32 line_num; +} RDI_Line; -typedef struct RADDBGI_Column{ - RADDBGI_U16 col_first; - RADDBGI_U16 col_opl; -} RADDBGI_Column; +typedef struct RDI_Column{ + RDI_U16 col_first; + RDI_U16 col_opl; +} RDI_Column; //- type info @@ -405,7 +411,7 @@ typedef struct RADDBGI_Column{ // X(name,code) - defines a primary code // XZ(name,code size) - defines a primary code & associates a size // Y(alias_name,name) - defines an alias for bookends -#define RADDBGI_TypeKindXList(X,XZ,Y)\ +#define RDI_TypeKindXList(X,XZ,Y)\ X(NULL, 0x0000) \ \ XZ(Void, 0x0001, 0) Y(FirstBuiltIn, Void) \ @@ -466,23 +472,23 @@ Y(LastUserDefined, IncompleteEnum) \ X(Bitfield, 0xF000) \ X(Variadic, 0xF001) -typedef RADDBGI_U16 RADDBGI_TypeKind; -typedef enum RADDBGI_TypeKindEnum{ +typedef RDI_U16 RDI_TypeKind; +typedef enum RDI_TypeKindEnum{ -#define X(name,code) RADDBGI_TypeKind_##name = code, +#define X(name,code) RDI_TypeKind_##name = code, #define XZ(name,code,size) X(name,code) -#define Y(alias_name,name) RADDBGI_TypeKind_##alias_name = RADDBGI_TypeKind_##name, - RADDBGI_TypeKindXList(X,XZ,Y) +#define Y(alias_name,name) RDI_TypeKind_##alias_name = RDI_TypeKind_##name, + RDI_TypeKindXList(X,XZ,Y) #undef X #undef XZ #undef Y -} RADDBGI_TypeKindEnum; +} RDI_TypeKindEnum; -typedef RADDBGI_U16 RADDBGI_TypeModifierFlags; +typedef RDI_U16 RDI_TypeModifierFlags; enum{ - RADDBGI_TypeModifierFlag_Const = (1 << 0), - RADDBGI_TypeModifierFlag_Volatile = (1 << 1), + RDI_TypeModifierFlag_Const = (1 << 0), + RDI_TypeModifierFlag_Volatile = (1 << 1), }; // IMPORTANT NOTE: All type nodes in a valid raddbg are *topologically sorted*. @@ -493,65 +499,65 @@ enum{ // This restriction does not apply to the members of a type that are // attached through a "UDT" though. -typedef struct RADDBGI_TypeNode{ - RADDBGI_TypeKind kind; - // when kind is 'Modifier' -> RADDBGI_TypeModifierFlags - RADDBGI_U16 flags; +typedef struct RDI_TypeNode{ + RDI_TypeKind kind; + // when kind is 'Modifier' -> RDI_TypeModifierFlags + RDI_U16 flags; - RADDBGI_U32 byte_size; + RDI_U32 byte_size; union{ // kind is 'built-in' struct{ - RADDBGI_U32 name_string_idx; + RDI_U32 name_string_idx; } built_in; // kind is 'constructed' struct{ - RADDBGI_U32 direct_type_idx; - RADDBGI_U32 count; + RDI_U32 direct_type_idx; + RDI_U32 count; union{ // when kind is 'Function' or 'Method' - RADDBGI_U32 param_idx_run_first; + RDI_U32 param_idx_run_first; // when kind is 'MemberPtr' - RADDBGI_U32 owner_type_idx; + RDI_U32 owner_type_idx; }; } constructed; // kind is 'user defined' struct{ - RADDBGI_U32 name_string_idx; - RADDBGI_U32 direct_type_idx; - RADDBGI_U32 udt_idx; + RDI_U32 name_string_idx; + RDI_U32 direct_type_idx; + RDI_U32 udt_idx; } user_defined; // (kind = Bitfield) struct{ - RADDBGI_U32 off; - RADDBGI_U32 size; + RDI_U32 off; + RDI_U32 size; } bitfield; }; -} RADDBGI_TypeNode; +} RDI_TypeNode; -typedef RADDBGI_U32 RADDBGI_UserDefinedTypeFlags; +typedef RDI_U32 RDI_UserDefinedTypeFlags; enum{ - RADDBGI_UserDefinedTypeFlag_EnumMembers = (1 << 0), + RDI_UserDefinedTypeFlag_EnumMembers = (1 << 0), }; -typedef struct RADDBGI_UDT{ - RADDBGI_U32 self_type_idx; - RADDBGI_UserDefinedTypeFlags flags; +typedef struct RDI_UDT{ + RDI_U32 self_type_idx; + RDI_UserDefinedTypeFlags flags; // when EnumMembers flag is set, indexes into enum "enum_members" instead of "members" - RADDBGI_U32 member_first; - RADDBGI_U32 member_count; + RDI_U32 member_first; + RDI_U32 member_count; - RADDBGI_U32 file_idx; - RADDBGI_U32 line; - RADDBGI_U32 col; -} RADDBGI_UDT; + RDI_U32 file_idx; + RDI_U32 line; + RDI_U32 col; +} RDI_UDT; -#define RADDBGI_MemberKindXList(X) \ +#define RDI_MemberKindXList(X) \ X(NULL, 0x0000) \ X(DataField, 0x0001) \ X(StaticData, 0x0002) \ @@ -563,12 +569,12 @@ X(Base, 0x0201) \ X(VirtualBase, 0x0202) \ X(NestedType, 0x0300) -typedef RADDBGI_U16 RADDBGI_MemberKind; -typedef enum RADDBGI_MemberKindEnum{ -#define X(N,C) RADDBGI_MemberKind_##N = C, - RADDBGI_MemberKindXList(X) +typedef RDI_U16 RDI_MemberKind; +typedef enum RDI_MemberKindEnum{ +#define X(N,C) RDI_MemberKind_##N = C, + RDI_MemberKindXList(X) #undef X -} RADDBGI_MemberKindEnum; +} RDI_MemberKindEnum; // TODO(allen): need a way to equip methods and some virtual methods // with procedure symbol information. I'm thinking a seperate data @@ -578,141 +584,141 @@ typedef enum RADDBGI_MemberKindEnum{ // like 'associate_method_to_proc' that can be used *after* both the // method and proc are known, rather than one that forces us to know // the association when constructing the member data. -typedef struct RADDBGI_Member{ - RADDBGI_MemberKind kind; - RADDBGI_U16 __unused__; +typedef struct RDI_Member{ + RDI_MemberKind kind; + RDI_U16 __unused__; - RADDBGI_U32 name_string_idx; - RADDBGI_U32 type_idx; - RADDBGI_U32 off; -} RADDBGI_Member; + RDI_U32 name_string_idx; + RDI_U32 type_idx; + RDI_U32 off; +} RDI_Member; -typedef struct RADDBGI_EnumMember{ - RADDBGI_U32 name_string_idx; - RADDBGI_U32 __unused__; - RADDBGI_U64 val; -} RADDBGI_EnumMember; +typedef struct RDI_EnumMember{ + RDI_U32 name_string_idx; + RDI_U32 __unused__; + RDI_U64 val; +} RDI_EnumMember; //- symbol info -typedef RADDBGI_U32 RADDBGI_LinkFlags; +typedef RDI_U32 RDI_LinkFlags; enum{ - RADDBGI_LinkFlag_External = (1 << 0), + RDI_LinkFlag_External = (1 << 0), // NOTE: Scope flags are mutually exclusive. // A symbol is either global scoped, type scoped, or procedure scoped. - RADDBGI_LinkFlag_TypeScoped = (1 << 1), - RADDBGI_LinkFlag_ProcScoped = (1 << 2), + RDI_LinkFlag_TypeScoped = (1 << 1), + RDI_LinkFlag_ProcScoped = (1 << 2), }; -typedef struct RADDBGI_GlobalVariable{ - RADDBGI_U32 name_string_idx; +typedef struct RDI_GlobalVariable{ + RDI_U32 name_string_idx; // NOTE: "global variables" can be scoped in *any* way. The scope flags here refer to // *namespace* scoping. "global variables" are all in the data section of the // final exe/dll type file, so they are "global" in the life-time sense of the // word. In the namespace sense of the word, they can be scoped globally, by type, // or by procedure. - RADDBGI_LinkFlags link_flags; - RADDBGI_U64 voff; - RADDBGI_U32 type_idx; + RDI_LinkFlags link_flags; + RDI_U64 voff; + RDI_U32 type_idx; // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RADDBGI_U32 container_idx; -} RADDBGI_GlobalVariable; + RDI_U32 container_idx; +} RDI_GlobalVariable; -typedef struct RADDBGI_ThreadVariable{ - RADDBGI_U32 name_string_idx; +typedef struct RDI_ThreadVariable{ + RDI_U32 name_string_idx; // NOTE: See the note in GlobalVariable regarding scoping. The same concept applies here. - RADDBGI_LinkFlags link_flags; - RADDBGI_U32 tls_off; - RADDBGI_U32 type_idx; + RDI_LinkFlags link_flags; + RDI_U32 tls_off; + RDI_U32 type_idx; // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RADDBGI_U32 container_idx; -} RADDBGI_ThreadVariable; + RDI_U32 container_idx; +} RDI_ThreadVariable; -typedef struct RADDBGI_Procedure{ - RADDBGI_U32 name_string_idx; - RADDBGI_U32 link_name_string_idx; +typedef struct RDI_Procedure{ + RDI_U32 name_string_idx; + RDI_U32 link_name_string_idx; // NOTE: See the note in GlobalVariable regarding scoping. The same concept applies here. - RADDBGI_LinkFlags link_flags; - RADDBGI_U32 type_idx; - RADDBGI_U32 root_scope_idx; + RDI_LinkFlags link_flags; + RDI_U32 type_idx; + RDI_U32 root_scope_idx; // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RADDBGI_U32 container_idx; -} RADDBGI_Procedure; + RDI_U32 container_idx; +} RDI_Procedure; -typedef struct RADDBGI_Scope{ - RADDBGI_U32 proc_idx; - RADDBGI_U32 parent_scope_idx; - RADDBGI_U32 first_child_scope_idx; - RADDBGI_U32 next_sibling_scope_idx; +typedef struct RDI_Scope{ + RDI_U32 proc_idx; + RDI_U32 parent_scope_idx; + RDI_U32 first_child_scope_idx; + RDI_U32 next_sibling_scope_idx; - RADDBGI_U32 voff_range_first; - RADDBGI_U32 voff_range_opl; + RDI_U32 voff_range_first; + RDI_U32 voff_range_opl; // indexes into "locals" - RADDBGI_U32 local_first; - RADDBGI_U32 local_count; + RDI_U32 local_first; + RDI_U32 local_count; - RADDBGI_U32 static_local_idx_run_first; - RADDBGI_U32 static_local_count; + RDI_U32 static_local_idx_run_first; + RDI_U32 static_local_count; // TODO(allen): attach less common scope-relevant info -} RADDBGI_Scope; +} RDI_Scope; -typedef RADDBGI_U32 RADDBGI_LocalKind; +typedef RDI_U32 RDI_LocalKind; typedef enum{ - RADDBGI_LocalKind_NULL, - RADDBGI_LocalKind_Parameter, - RADDBGI_LocalKind_Variable, - RADDBGI_LocalKind_COUNT -} RADDBGI_LocalKindEnum; + RDI_LocalKind_NULL, + RDI_LocalKind_Parameter, + RDI_LocalKind_Variable, + RDI_LocalKind_COUNT +} RDI_LocalKindEnum; -typedef struct RADDBGI_Local{ - RADDBGI_LocalKind kind; - RADDBGI_U32 name_string_idx; - RADDBGI_U64 type_idx; +typedef struct RDI_Local{ + RDI_LocalKind kind; + RDI_U32 name_string_idx; + RDI_U64 type_idx; // indexes into "location_blocks" - RADDBGI_U32 location_first; - RADDBGI_U32 location_opl; -} RADDBGI_Local; + RDI_U32 location_first; + RDI_U32 location_opl; +} RDI_Local; -typedef struct RADDBGI_LocationBlock{ - RADDBGI_U32 scope_off_first; - RADDBGI_U32 scope_off_opl; - RADDBGI_U32 location_data_off; -} RADDBGI_LocationBlock; +typedef struct RDI_LocationBlock{ + RDI_U32 scope_off_first; + RDI_U32 scope_off_opl; + RDI_U32 location_data_off; +} RDI_LocationBlock; -typedef RADDBGI_U8 RADDBGI_LocationKind; +typedef RDI_U8 RDI_LocationKind; typedef enum{ - RADDBGI_LocationKind_NULL, - RADDBGI_LocationKind_AddrBytecodeStream, - RADDBGI_LocationKind_ValBytecodeStream, - RADDBGI_LocationKind_AddrRegisterPlusU16, - RADDBGI_LocationKind_AddrAddrRegisterPlusU16, - RADDBGI_LocationKind_ValRegister, - RADDBGI_LocationKind_COUNT -} RADDBGI_LocationKindEnum; + RDI_LocationKind_NULL, + RDI_LocationKind_AddrBytecodeStream, + RDI_LocationKind_ValBytecodeStream, + RDI_LocationKind_AddrRegisterPlusU16, + RDI_LocationKind_AddrAddrRegisterPlusU16, + RDI_LocationKind_ValRegister, + RDI_LocationKind_COUNT +} RDI_LocationKindEnum; -typedef struct RADDBGI_LocationBytecodeStream{ - RADDBGI_LocationKind kind; - // [... 0] null terminated byte sequence RADDBGI_EvalBytecodeStream -} RADDBGI_LocationBytecodeStream; +typedef struct RDI_LocationBytecodeStream{ + RDI_LocationKind kind; + // [... 0] null terminated byte sequence RDI_EvalBytecodeStream +} RDI_LocationBytecodeStream; -typedef struct RADDBGI_LocationRegisterPlusU16{ - RADDBGI_LocationKind kind; - RADDBGI_RegisterCode register_code; - RADDBGI_U16 offset; -} RADDBGI_LocationRegisterPlusU16; +typedef struct RDI_LocationRegisterPlusU16{ + RDI_LocationKind kind; + RDI_RegisterCode register_code; + RDI_U16 offset; +} RDI_LocationRegisterPlusU16; -typedef struct RADDBGI_LocationRegister{ - RADDBGI_LocationKind kind; - RADDBGI_RegisterCode register_code; -} RADDBGI_LocationRegister; +typedef struct RDI_LocationRegister{ + RDI_LocationKind kind; + RDI_RegisterCode register_code; +} RDI_LocationRegister; //- name map types -#define RADDBGI_NameMapXList(X)\ +#define RDI_NameMapXList(X)\ X(NULL, 0)\ X(GlobalVariables, 1)\ X(ThreadVariables, 2)\ @@ -721,42 +727,42 @@ X(Types, 4)\ X(LinkNameProcedures, 5)\ X(NormalSourcePaths, 6) -typedef RADDBGI_U32 RADDBGI_NameMapKind; -typedef enum RADDBGI_NameMapKindEnum{ -#define X(N,C) RADDBGI_NameMapKind_##N = C, - RADDBGI_NameMapXList(X) +typedef RDI_U32 RDI_NameMapKind; +typedef enum RDI_NameMapKindEnum{ +#define X(N,C) RDI_NameMapKind_##N = C, + RDI_NameMapXList(X) #undef X - RADDBGI_NameMapKind_COUNT -} RADDBGI_NameMapKindEnum; + RDI_NameMapKind_COUNT +} RDI_NameMapKindEnum; // TODO(allen): documentation here for the hashing and probing strategy for this table -typedef struct RADDBGI_NameMap{ - RADDBGI_NameMapKind kind; - RADDBGI_U32 bucket_data_idx; - RADDBGI_U32 node_data_idx; -} RADDBGI_NameMap; +typedef struct RDI_NameMap{ + RDI_NameMapKind kind; + RDI_U32 bucket_data_idx; + RDI_U32 node_data_idx; +} RDI_NameMap; -typedef struct RADDBGI_NameMapBucket{ - RADDBGI_U32 first_node; - RADDBGI_U32 node_count; -} RADDBGI_NameMapBucket; +typedef struct RDI_NameMapBucket{ + RDI_U32 first_node; + RDI_U32 node_count; +} RDI_NameMapBucket; -typedef struct RADDBGI_NameMapNode{ - RADDBGI_U32 string_idx; - RADDBGI_U32 match_count; +typedef struct RDI_NameMapNode{ + RDI_U32 string_idx; + RDI_U32 match_count; // NOTE: if (match_count == 1) then this is the index of the matching item // if (match_count > 1) then this is the first for an index run of all the matches - RADDBGI_U32 match_idx_or_idx_run_first; -} RADDBGI_NameMapNode; + RDI_U32 match_idx_or_idx_run_first; +} RDI_NameMapNode; //////////////////////////////// // Eval Bytecode // (Name, decodeN, popN, pushN) -#define RADDBGI_EvalOpXList(X)\ +#define RDI_EvalOpXList(X)\ X(Stop, 0, 0, 0)\ X(Noop, 0, 0, 0)\ X(Cond, 1, 1, 0)\ @@ -803,7 +809,7 @@ X(Pop, 0, 1, 0)\ X(Insert, 1, 0, 0) // (Name) -#define RADDBGI_EvalTypeGroupXList(X)\ +#define RDI_EvalTypeGroupXList(X)\ X(Other)\ X(U)\ X(S)\ @@ -811,7 +817,7 @@ X(F32)\ X(F64) // (Name, error-message) -#define RADDBGI_EvalConversionKindXList(X)\ +#define RDI_EvalConversionKindXList(X)\ X(Noop, "")\ X(Legal, "")\ X(OtherToOther, "cannot convert between these types")\ @@ -819,7 +825,7 @@ X(ToOther, "cannot convert to this type")\ X(FromOther, "cannot convert this type") // Xb(EvalTypeGroup) Y(TypeKind) Xe(EvalTypeGroup) -#define RADDBGI_EvalTypeGroupFromKindMap(Y,Xb,Xe)\ +#define RDI_EvalTypeGroupFromKindMap(Y,Xb,Xe)\ \ Xb(U) Y(U8) Y(U16) Y(U32) Y(U64) Y(Bool) Y(Ptr) Y(Enum)\ Xe(U)\ @@ -834,7 +840,7 @@ Xb(F64) Y(F64)\ Xe(F64) // Xb(EvalConversionKind) Y(EvalTypeGroup, EvalTypeGroup) Xe(EvalConversionKind) -#define RADDBGI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe)\ +#define RDI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe)\ \ Xb(Noop) Y(U, U) Y(S, S) Y(F32, F32) Y(F64, F64) Y(U, S) Y(S, U)\ Xe(Noop)\ @@ -855,65 +861,65 @@ Xb(FromOther) Y(Other, U) Y(Other, S) Y(Other, F32) Y(Other, F64)\ Xe(FromOther) // eval interpretation macros -#define RADDBGI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) +#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) // eval enums -typedef RADDBGI_U8 RADDBGI_EvalOp; +typedef RDI_U8 RDI_EvalOp; -typedef enum RADDBGI_EvalOpEnum{ -#define X(N,dec,pop,push) RADDBGI_EvalOp_##N, - RADDBGI_EvalOpXList(X) +typedef enum RDI_EvalOpEnum{ +#define X(N,dec,pop,push) RDI_EvalOp_##N, + RDI_EvalOpXList(X) #undef X - RADDBGI_EvalOp_COUNT -} RADDBGI_EvalOpEnum; + RDI_EvalOp_COUNT +} RDI_EvalOpEnum; -typedef RADDBGI_U8 RADDBGI_EvalTypeGroup; +typedef RDI_U8 RDI_EvalTypeGroup; -typedef enum RADDBGI_EvalTypeGroupEnum{ -#define X(N) RADDBGI_EvalTypeGroup_##N, - RADDBGI_EvalTypeGroupXList(X) +typedef enum RDI_EvalTypeGroupEnum{ +#define X(N) RDI_EvalTypeGroup_##N, + RDI_EvalTypeGroupXList(X) #undef X - RADDBGI_EvalTypeGroup_COUNT, -} RADDBGI_EvalTypeGroupEnum; + RDI_EvalTypeGroup_COUNT, +} RDI_EvalTypeGroupEnum; -typedef RADDBGI_U8 RADDBGI_EvalConversionKind; +typedef RDI_U8 RDI_EvalConversionKind; -typedef enum RADDBGI_EvalConversionKindEnum{ -#define X(N,msg) RADDBGI_EvalConversionKind_##N, - RADDBGI_EvalConversionKindXList(X) +typedef enum RDI_EvalConversionKindEnum{ +#define X(N,msg) RDI_EvalConversionKind_##N, + RDI_EvalConversionKindXList(X) #undef X - RADDBGI_EvalConversionKind_COUNT, -} RADDBGI_EvalConversionKindEnum; + RDI_EvalConversionKind_COUNT, +} RDI_EvalConversionKindEnum; //- eval data tables -#define RADDBGI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) -#define RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) -#define RADDBGI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) -#define RADDBGI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) +#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) +#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) +#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) +#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) -static RADDBGI_U8 raddbgi_eval_opcode_ctrlbits[] = { -#define X(Name, decodeN, popN, pushN) RADDBGI_EVAL_CTRLBITS(decodeN,popN,pushN), - RADDBGI_EvalOpXList(X) +static RDI_U8 rdi_eval_opcode_ctrlbits[] = { +#define X(Name, decodeN, popN, pushN) RDI_EVAL_CTRLBITS(decodeN,popN,pushN), + RDI_EvalOpXList(X) #undef X }; //////////////////////////////// // Functions -RADDBGI_PROC RADDBGI_U64 raddbgi_hash(RADDBGI_U8 *ptr, RADDBGI_U64 size); -RADDBGI_PROC RADDBGI_U32 raddbgi_size_from_basic_type_kind(RADDBGI_TypeKind kind); -RADDBGI_PROC RADDBGI_U32 raddbgi_addr_size_from_arch(RADDBGI_Arch arch); +RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); +RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind); +RDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch); //- eval helpers -RADDBGI_PROC RADDBGI_EvalConversionKind raddbgi_eval_conversion_rule(RADDBGI_EvalTypeGroup in, RADDBGI_EvalTypeGroup out); -RADDBGI_PROC RADDBGI_U8* raddbgi_eval_conversion_message(RADDBGI_EvalConversionKind conversion_kind, RADDBGI_U64 *lennout); -RADDBGI_PROC RADDBGI_S32 raddbgi_eval_opcode_type_compatible(RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group); +RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_rule(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); +RDI_PROC RDI_U8* rdi_eval_conversion_message(RDI_EvalConversionKind conversion_kind, RDI_U64 *lennout); +RDI_PROC RDI_S32 rdi_eval_opcode_type_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); #endif // RADDBGI_FORMAT_H diff --git a/src/lib_raddbgi_format/raddbgi_format_parse.c b/src/lib_raddbgi_format/raddbgi_format_parse.c index 9e294146..cbd6a880 100644 --- a/src/lib_raddbgi_format/raddbgi_format_parse.c +++ b/src/lib_raddbgi_format/raddbgi_format_parse.c @@ -4,105 +4,105 @@ //////////////////////////////// //~ RADDBG Parse API -RADDBGI_PROC RADDBGI_ParseStatus -raddbgi_parse(RADDBGI_U8 *data, RADDBGI_U64 size, RADDBGI_Parsed *out){ - RADDBGI_ParseStatus result = RADDBGI_ParseStatus_Good; +RDI_PROC RDI_ParseStatus +rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out){ + RDI_ParseStatus result = RDI_ParseStatus_Good; // out header - RADDBGI_Header *hdr = 0; + RDI_Header *hdr = 0; { if (sizeof(*hdr) <= size){ - hdr = (RADDBGI_Header*)data; + hdr = (RDI_Header*)data; } // (errors) - if (hdr == 0 || hdr->magic != RADDBGI_MAGIC_CONSTANT){ + if (hdr == 0 || hdr->magic != RDI_MAGIC_CONSTANT){ hdr = 0; - result = RADDBGI_ParseStatus_HeaderDoesNotMatch; + result = RDI_ParseStatus_HeaderDoesNotMatch; } if (hdr != 0 && hdr->encoding_version != 1){ hdr = 0; - result = RADDBGI_ParseStatus_UnsupportedVersionNumber; + result = RDI_ParseStatus_UnsupportedVersionNumber; } } // out data sections - RADDBGI_DataSection *dsecs = 0; - RADDBGI_U32 dsec_count = 0; + RDI_DataSection *dsecs = 0; + RDI_U32 dsec_count = 0; if (hdr != 0){ - RADDBGI_U64 opl = (RADDBGI_U64)hdr->data_section_off + (RADDBGI_U64)hdr->data_section_count*sizeof(*dsecs); + RDI_U64 opl = (RDI_U64)hdr->data_section_off + (RDI_U64)hdr->data_section_count*sizeof(*dsecs); if (opl <= size){ - dsecs = (RADDBGI_DataSection*)(data + hdr->data_section_off); + dsecs = (RDI_DataSection*)(data + hdr->data_section_off); dsec_count = hdr->data_section_count; } // (errors) if (dsecs == 0){ - result = RADDBGI_ParseStatus_InvalidDataSecionLayout; + result = RDI_ParseStatus_InvalidDataSecionLayout; } } // extract primary data section indexes - RADDBGI_U32 dsec_idx[RADDBGI_DataSectionTag_PRIMARY_COUNT] = {0}; - if (result == RADDBGI_ParseStatus_Good){ - RADDBGI_DataSection *sec_ptr = dsecs; - for (RADDBGI_U32 i = 0; i < dsec_count; i += 1, sec_ptr += 1){ - if (sec_ptr->tag < RADDBGI_DataSectionTag_PRIMARY_COUNT){ + RDI_U32 dsec_idx[RDI_DataSectionTag_PRIMARY_COUNT] = {0}; + if (result == RDI_ParseStatus_Good){ + RDI_DataSection *sec_ptr = dsecs; + for (RDI_U32 i = 0; i < dsec_count; i += 1, sec_ptr += 1){ + if (sec_ptr->tag < RDI_DataSectionTag_PRIMARY_COUNT){ dsec_idx[sec_ptr->tag] = i; } } } // fill out data block (part 1) - if (result == RADDBGI_ParseStatus_Good){ + if (result == RDI_ParseStatus_Good){ out->raw_data = data; out->raw_data_size = size; out->dsecs = dsecs; out->dsec_count = dsec_count; - for (RADDBGI_U32 i = 0; i < RADDBGI_DataSectionTag_PRIMARY_COUNT; i += 1){ + for (RDI_U32 i = 0; i < RDI_DataSectionTag_PRIMARY_COUNT; i += 1){ out->dsec_idx[i] = dsec_idx[i]; } } // out string table - RADDBGI_U8 *string_data = 0; - RADDBGI_U64 string_opl = 0; - RADDBGI_U32 *string_offs = 0; - RADDBGI_U64 string_count = 0; - if (result == RADDBGI_ParseStatus_Good){ - raddbgi_parse__extract_primary(out, string_data, &string_opl, - RADDBGI_DataSectionTag_StringData); + RDI_U8 *string_data = 0; + RDI_U64 string_opl = 0; + RDI_U32 *string_offs = 0; + RDI_U64 string_count = 0; + if (result == RDI_ParseStatus_Good){ + rdi_parse__extract_primary(out, string_data, &string_opl, + RDI_DataSectionTag_StringData); - RADDBGI_U64 table_entry_count = 0; - raddbgi_parse__extract_primary(out, string_offs, &table_entry_count, - RADDBGI_DataSectionTag_StringTable); + RDI_U64 table_entry_count = 0; + rdi_parse__extract_primary(out, string_offs, &table_entry_count, + RDI_DataSectionTag_StringTable); if (table_entry_count > 0){ string_count = table_entry_count - 1; } // (errors) if (string_data == 0){ - result = RADDBGI_ParseStatus_MissingStringDataSection; + result = RDI_ParseStatus_MissingStringDataSection; } else if (string_offs == 0){ - result = RADDBGI_ParseStatus_MissingStringTableSection; + result = RDI_ParseStatus_MissingStringTableSection; } } // out index runs - RADDBGI_U32 *idx_run_data = 0; - RADDBGI_U64 idx_run_count = 0; - if (result == RADDBGI_ParseStatus_Good){ - raddbgi_parse__extract_primary(out, idx_run_data, &idx_run_count, - RADDBGI_DataSectionTag_IndexRuns); + RDI_U32 *idx_run_data = 0; + RDI_U64 idx_run_count = 0; + if (result == RDI_ParseStatus_Good){ + rdi_parse__extract_primary(out, idx_run_data, &idx_run_count, + RDI_DataSectionTag_IndexRuns); // (errors) if (idx_run_data == 0){ - result = RADDBGI_ParseStatus_MissingIndexRunSection; + result = RDI_ParseStatus_MissingIndexRunSection; } } - if (result == RADDBGI_ParseStatus_Good){ + if (result == RDI_ParseStatus_Good){ // fill out primary data structures (part 2) out->string_data = string_data; out->string_offs = string_offs; @@ -112,81 +112,81 @@ raddbgi_parse(RADDBGI_U8 *data, RADDBGI_U64 size, RADDBGI_Parsed *out){ out->idx_run_count = idx_run_count; { - RADDBGI_TopLevelInfo *tli = 0; - RADDBGI_U64 dummy = 0; - raddbgi_parse__extract_primary(out, tli, &dummy, RADDBGI_DataSectionTag_TopLevelInfo); + RDI_TopLevelInfo *tli = 0; + RDI_U64 dummy = 0; + rdi_parse__extract_primary(out, tli, &dummy, RDI_DataSectionTag_TopLevelInfo); if (dummy != 1){ tli = 0; } out->top_level_info = tli; } - raddbgi_parse__extract_primary(out, out->binary_sections, &out->binary_sections_count, - RADDBGI_DataSectionTag_BinarySections); + rdi_parse__extract_primary(out, out->binary_sections, &out->binary_sections_count, + RDI_DataSectionTag_BinarySections); - raddbgi_parse__extract_primary(out, out->file_paths, &out->file_paths_count, - RADDBGI_DataSectionTag_FilePathNodes); + rdi_parse__extract_primary(out, out->file_paths, &out->file_paths_count, + RDI_DataSectionTag_FilePathNodes); - raddbgi_parse__extract_primary(out, out->source_files, &out->source_files_count, - RADDBGI_DataSectionTag_SourceFiles); + rdi_parse__extract_primary(out, out->source_files, &out->source_files_count, + RDI_DataSectionTag_SourceFiles); - raddbgi_parse__extract_primary(out, out->units, &out->units_count, - RADDBGI_DataSectionTag_Units); + rdi_parse__extract_primary(out, out->units, &out->units_count, + RDI_DataSectionTag_Units); - raddbgi_parse__extract_primary(out, out->unit_vmap, &out->unit_vmap_count, - RADDBGI_DataSectionTag_UnitVmap); + rdi_parse__extract_primary(out, out->unit_vmap, &out->unit_vmap_count, + RDI_DataSectionTag_UnitVmap); - raddbgi_parse__extract_primary(out, out->unit_vmap, &out->unit_vmap_count, - RADDBGI_DataSectionTag_UnitVmap); + rdi_parse__extract_primary(out, out->unit_vmap, &out->unit_vmap_count, + RDI_DataSectionTag_UnitVmap); - raddbgi_parse__extract_primary(out, out->type_nodes, &out->type_nodes_count, - RADDBGI_DataSectionTag_TypeNodes); + rdi_parse__extract_primary(out, out->type_nodes, &out->type_nodes_count, + RDI_DataSectionTag_TypeNodes); - raddbgi_parse__extract_primary(out, out->udts, &out->udts_count, - RADDBGI_DataSectionTag_UDTs); + rdi_parse__extract_primary(out, out->udts, &out->udts_count, + RDI_DataSectionTag_UDTs); - raddbgi_parse__extract_primary(out, out->members, &out->members_count, - RADDBGI_DataSectionTag_Members); + rdi_parse__extract_primary(out, out->members, &out->members_count, + RDI_DataSectionTag_Members); - raddbgi_parse__extract_primary(out, out->enum_members, &out->enum_members_count, - RADDBGI_DataSectionTag_EnumMembers); + rdi_parse__extract_primary(out, out->enum_members, &out->enum_members_count, + RDI_DataSectionTag_EnumMembers); - raddbgi_parse__extract_primary(out, out->global_variables, &out->global_variables_count, - RADDBGI_DataSectionTag_GlobalVariables); + rdi_parse__extract_primary(out, out->global_variables, &out->global_variables_count, + RDI_DataSectionTag_GlobalVariables); - raddbgi_parse__extract_primary(out, out->global_vmap, &out->global_vmap_count, - RADDBGI_DataSectionTag_GlobalVmap); + rdi_parse__extract_primary(out, out->global_vmap, &out->global_vmap_count, + RDI_DataSectionTag_GlobalVmap); - raddbgi_parse__extract_primary(out, out->thread_variables, &out->thread_variables_count, - RADDBGI_DataSectionTag_ThreadVariables); + rdi_parse__extract_primary(out, out->thread_variables, &out->thread_variables_count, + RDI_DataSectionTag_ThreadVariables); - raddbgi_parse__extract_primary(out, out->procedures, &out->procedures_count, - RADDBGI_DataSectionTag_Procedures); + rdi_parse__extract_primary(out, out->procedures, &out->procedures_count, + RDI_DataSectionTag_Procedures); - raddbgi_parse__extract_primary(out, out->scopes, &out->scopes_count, - RADDBGI_DataSectionTag_Scopes); + rdi_parse__extract_primary(out, out->scopes, &out->scopes_count, + RDI_DataSectionTag_Scopes); - raddbgi_parse__extract_primary(out, out->scope_voffs, &out->scope_voffs_count, - RADDBGI_DataSectionTag_ScopeVoffData); + rdi_parse__extract_primary(out, out->scope_voffs, &out->scope_voffs_count, + RDI_DataSectionTag_ScopeVoffData); - raddbgi_parse__extract_primary(out, out->scope_vmap, &out->scope_vmap_count, - RADDBGI_DataSectionTag_ScopeVmap); + rdi_parse__extract_primary(out, out->scope_vmap, &out->scope_vmap_count, + RDI_DataSectionTag_ScopeVmap); - raddbgi_parse__extract_primary(out, out->locals, &out->locals_count, - RADDBGI_DataSectionTag_Locals); + rdi_parse__extract_primary(out, out->locals, &out->locals_count, + RDI_DataSectionTag_Locals); - raddbgi_parse__extract_primary(out, out->location_blocks, &out->location_blocks_count, - RADDBGI_DataSectionTag_LocationBlocks); + rdi_parse__extract_primary(out, out->location_blocks, &out->location_blocks_count, + RDI_DataSectionTag_LocationBlocks); - raddbgi_parse__extract_primary(out, out->location_data, &out->location_data_size, - RADDBGI_DataSectionTag_LocationData); + rdi_parse__extract_primary(out, out->location_data, &out->location_data_size, + RDI_DataSectionTag_LocationData); { - raddbgi_parse__extract_primary(out, out->name_maps, &out->name_maps_count, - RADDBGI_DataSectionTag_NameMaps); + rdi_parse__extract_primary(out, out->name_maps, &out->name_maps_count, + RDI_DataSectionTag_NameMaps); - RADDBGI_NameMap *name_map_ptr = out->name_maps; - RADDBGI_NameMap *name_map_opl = out->name_maps + out->name_maps_count; + RDI_NameMap *name_map_ptr = out->name_maps; + RDI_NameMap *name_map_opl = out->name_maps + out->name_maps_count; for (; name_map_ptr < name_map_opl; name_map_ptr += 1){ if (out->name_maps_by_kind[name_map_ptr->kind] == 0){ out->name_maps_by_kind[name_map_ptr->kind] = name_map_ptr; @@ -194,25 +194,25 @@ raddbgi_parse(RADDBGI_U8 *data, RADDBGI_U64 size, RADDBGI_Parsed *out){ } } -#if !defined(RADDBGI_DISABLE_NILS) - if(out->binary_sections == 0) { out->binary_sections = &raddbgi_binary_section_nil; out->binary_sections_count = 1; } - if(out->file_paths == 0) { out->file_paths = &raddbgi_file_path_node_nil; out->file_paths_count = 1; } - if(out->source_files == 0) { out->source_files = &raddbgi_source_file_nil; out->source_files_count = 1; } - if(out->units == 0) { out->units = &raddbgi_unit_nil; out->units_count = 1; } - if(out->unit_vmap == 0) { out->unit_vmap = &raddbgi_vmap_entry_nil; out->unit_vmap_count = 1; } - if(out->type_nodes == 0) { out->type_nodes = &raddbgi_type_node_nil; out->type_nodes_count = 1; } - if(out->udts == 0) { out->udts = &raddbgi_udt_nil; out->udts_count = 1; } - if(out->members == 0) { out->members = &raddbgi_member_nil; out->members_count = 1; } - if(out->enum_members == 0) { out->enum_members = &raddbgi_enum_member_nil; out->enum_members_count = 1; } - if(out->global_variables == 0) { out->global_variables = &raddbgi_global_variable_nil; out->global_variables_count = 1; } - if(out->global_vmap == 0) { out->global_vmap = &raddbgi_vmap_entry_nil; out->global_vmap_count = 1; } - if(out->thread_variables == 0) { out->thread_variables = &raddbgi_thread_variable_nil; out->thread_variables_count = 1; } - if(out->procedures == 0) { out->procedures = &raddbgi_procedure_nil; out->procedures_count = 1; } - if(out->scopes == 0) { out->scopes = &raddbgi_scope_nil; out->scopes_count = 1; } - if(out->scope_voffs == 0) { out->scope_voffs = &raddbgi_voff_nil; out->scope_voffs_count = 1; } - if(out->scope_vmap == 0) { out->scope_vmap = &raddbgi_vmap_entry_nil; out->scope_vmap_count = 1; } - if(out->locals == 0) { out->locals = &raddbgi_local_nil; out->locals_count = 1; } - if(out->location_blocks == 0) { out->location_blocks = &raddbgi_location_block_nil; out->location_blocks_count = 1; } +#if !defined(RDI_DISABLE_NILS) + if(out->binary_sections == 0) { out->binary_sections = &rdi_binary_section_nil; out->binary_sections_count = 1; } + if(out->file_paths == 0) { out->file_paths = &rdi_file_path_node_nil; out->file_paths_count = 1; } + if(out->source_files == 0) { out->source_files = &rdi_source_file_nil; out->source_files_count = 1; } + if(out->units == 0) { out->units = &rdi_unit_nil; out->units_count = 1; } + if(out->unit_vmap == 0) { out->unit_vmap = &rdi_vmap_entry_nil; out->unit_vmap_count = 1; } + if(out->type_nodes == 0) { out->type_nodes = &rdi_type_node_nil; out->type_nodes_count = 1; } + if(out->udts == 0) { out->udts = &rdi_udt_nil; out->udts_count = 1; } + if(out->members == 0) { out->members = &rdi_member_nil; out->members_count = 1; } + if(out->enum_members == 0) { out->enum_members = &rdi_enum_member_nil; out->enum_members_count = 1; } + if(out->global_variables == 0) { out->global_variables = &rdi_global_variable_nil; out->global_variables_count = 1; } + if(out->global_vmap == 0) { out->global_vmap = &rdi_vmap_entry_nil; out->global_vmap_count = 1; } + if(out->thread_variables == 0) { out->thread_variables = &rdi_thread_variable_nil; out->thread_variables_count = 1; } + if(out->procedures == 0) { out->procedures = &rdi_procedure_nil; out->procedures_count = 1; } + if(out->scopes == 0) { out->scopes = &rdi_scope_nil; out->scopes_count = 1; } + if(out->scope_voffs == 0) { out->scope_voffs = &rdi_voff_nil; out->scope_voffs_count = 1; } + if(out->scope_vmap == 0) { out->scope_vmap = &rdi_vmap_entry_nil; out->scope_vmap_count = 1; } + if(out->locals == 0) { out->locals = &rdi_local_nil; out->locals_count = 1; } + if(out->location_blocks == 0) { out->location_blocks = &rdi_location_block_nil; out->location_blocks_count = 1; } #endif } @@ -220,15 +220,15 @@ raddbgi_parse(RADDBGI_U8 *data, RADDBGI_U64 size, RADDBGI_Parsed *out){ return(result); } -RADDBGI_PROC RADDBGI_U8* -raddbgi_string_from_idx(RADDBGI_Parsed *parsed, RADDBGI_U32 idx, RADDBGI_U64 *len_out){ - RADDBGI_U8 *result = 0; - RADDBGI_U64 len_result = 0; +RDI_PROC RDI_U8* +rdi_string_from_idx(RDI_Parsed *parsed, RDI_U32 idx, RDI_U64 *len_out){ + RDI_U8 *result = 0; + RDI_U64 len_result = 0; if (idx < parsed->string_count){ - RADDBGI_U32 off_raw = parsed->string_offs[idx]; - RADDBGI_U32 opl_raw = parsed->string_offs[idx + 1]; - RADDBGI_U32 opl = raddbgi_parse__min(opl_raw, parsed->string_data_size); - RADDBGI_U32 off = raddbgi_parse__min(off_raw, opl); + RDI_U32 off_raw = parsed->string_offs[idx]; + RDI_U32 opl_raw = parsed->string_offs[idx + 1]; + RDI_U32 opl = rdi_parse__min(opl_raw, parsed->string_data_size); + RDI_U32 off = rdi_parse__min(off_raw, opl); result = parsed->string_data + off; len_result = opl - off; } @@ -236,15 +236,15 @@ raddbgi_string_from_idx(RADDBGI_Parsed *parsed, RADDBGI_U32 idx, RADDBGI_U64 *le return(result); } -RADDBGI_PROC RADDBGI_U32* -raddbgi_idx_run_from_first_count(RADDBGI_Parsed *parsed, - RADDBGI_U32 raw_first, RADDBGI_U32 raw_count, - RADDBGI_U32 *n_out){ - RADDBGI_U32 raw_opl = raw_first + raw_count; - RADDBGI_U32 opl = raddbgi_parse__min(raw_opl, parsed->idx_run_count); - RADDBGI_U32 first = raddbgi_parse__min(raw_first, opl); +RDI_PROC RDI_U32* +rdi_idx_run_from_first_count(RDI_Parsed *parsed, + RDI_U32 raw_first, RDI_U32 raw_count, + RDI_U32 *n_out){ + RDI_U32 raw_opl = raw_first + raw_count; + RDI_U32 opl = rdi_parse__min(raw_opl, parsed->idx_run_count); + RDI_U32 first = rdi_parse__min(raw_first, opl); - RADDBGI_U32 *result = 0; + RDI_U32 *result = 0; if (first < parsed->idx_run_count){ result = parsed->idx_run_data + first; } @@ -254,29 +254,29 @@ raddbgi_idx_run_from_first_count(RADDBGI_Parsed *parsed, //- line info -RADDBGI_PROC void -raddbgi_line_info_from_unit(RADDBGI_Parsed *p, RADDBGI_Unit *unit, RADDBGI_ParsedLineInfo *out){ - RADDBGI_U64 line_info_voff_count = 0; - RADDBGI_U64 *voffs = (RADDBGI_U64*) - raddbgi_data_from_dsec(p, unit->line_info_voffs_data_idx, sizeof(RADDBGI_U64), - RADDBGI_DataSectionTag_LineInfoVoffs, - &line_info_voff_count); +RDI_PROC void +rdi_line_info_from_unit(RDI_Parsed *p, RDI_Unit *unit, RDI_ParsedLineInfo *out){ + RDI_U64 line_info_voff_count = 0; + RDI_U64 *voffs = (RDI_U64*) + rdi_data_from_dsec(p, unit->line_info_voffs_data_idx, sizeof(RDI_U64), + RDI_DataSectionTag_LineInfoVoffs, + &line_info_voff_count); - RADDBGI_U64 line_info_count_raw = 0; - RADDBGI_Line *lines = (RADDBGI_Line*) - raddbgi_data_from_dsec(p, unit->line_info_data_idx, sizeof(RADDBGI_Line), - RADDBGI_DataSectionTag_LineInfoData, - &line_info_count_raw); + RDI_U64 line_info_count_raw = 0; + RDI_Line *lines = (RDI_Line*) + rdi_data_from_dsec(p, unit->line_info_data_idx, sizeof(RDI_Line), + RDI_DataSectionTag_LineInfoData, + &line_info_count_raw); - RADDBGI_U64 column_info_count_raw = 0; - RADDBGI_Column *cols = (RADDBGI_Column*) - raddbgi_data_from_dsec(p, unit->line_info_col_data_idx, sizeof(RADDBGI_Column), - RADDBGI_DataSectionTag_LineInfoColumns, - &column_info_count_raw); + RDI_U64 column_info_count_raw = 0; + RDI_Column *cols = (RDI_Column*) + rdi_data_from_dsec(p, unit->line_info_col_data_idx, sizeof(RDI_Column), + RDI_DataSectionTag_LineInfoColumns, + &column_info_count_raw); - RADDBGI_U32 line_info_count_a = (line_info_voff_count > 0)?line_info_voff_count - 1:0; - RADDBGI_U32 line_info_count = raddbgi_parse__min(line_info_count_a, line_info_count_raw); - RADDBGI_U32 column_info_count = raddbgi_parse__min(column_info_count_raw, line_info_count); + RDI_U32 line_info_count_a = (line_info_voff_count > 0)?line_info_voff_count - 1:0; + RDI_U32 line_info_count = rdi_parse__min(line_info_count_a, line_info_count_raw); + RDI_U32 column_info_count = rdi_parse__min(column_info_count_raw, line_info_count); out->voffs = voffs; out->lines = lines; @@ -285,17 +285,17 @@ raddbgi_line_info_from_unit(RADDBGI_Parsed *p, RADDBGI_Unit *unit, RADDBGI_Parse out->col_count = column_info_count; } -RADDBGI_PROC RADDBGI_U64 -raddbgi_line_info_idx_from_voff(RADDBGI_ParsedLineInfo *line_info, RADDBGI_U64 voff) +RDI_PROC RDI_U64 +rdi_line_info_idx_from_voff(RDI_ParsedLineInfo *line_info, RDI_U64 voff) { - RADDBGI_U64 result = 0; + RDI_U64 result = 0; if (line_info->count > 0 && line_info->voffs[0] <= voff && voff < line_info->voffs[line_info->count - 1]){ // assuming: (i < j) -> (vmap[i].voff < vmap[j].voff) // find i such that: (vmap[i].voff <= voff) && (voff < vmap[i + 1].voff) - RADDBGI_U32 first = 0; - RADDBGI_U32 opl = line_info->count; + RDI_U32 first = 0; + RDI_U32 opl = line_info->count; for (;;){ - RADDBGI_U32 mid = (first + opl)/2; + RDI_U32 mid = (first + opl)/2; if (line_info->voffs[mid] < voff){ first = mid; } @@ -310,35 +310,35 @@ raddbgi_line_info_idx_from_voff(RADDBGI_ParsedLineInfo *line_info, RADDBGI_U64 v break; } } - result = (RADDBGI_U64)first; + result = (RDI_U64)first; } return(result); } -RADDBGI_PROC void -raddbgi_line_map_from_source_file(RADDBGI_Parsed *p, RADDBGI_SourceFile *srcfile, - RADDBGI_ParsedLineMap *out){ - RADDBGI_U64 num_count = 0; - RADDBGI_U32 *nums = (RADDBGI_U32*) - raddbgi_data_from_dsec(p, srcfile->line_map_nums_data_idx, sizeof(RADDBGI_U32), - RADDBGI_DataSectionTag_LineMapNumbers, - &num_count); +RDI_PROC void +rdi_line_map_from_source_file(RDI_Parsed *p, RDI_SourceFile *srcfile, + RDI_ParsedLineMap *out){ + RDI_U64 num_count = 0; + RDI_U32 *nums = (RDI_U32*) + rdi_data_from_dsec(p, srcfile->line_map_nums_data_idx, sizeof(RDI_U32), + RDI_DataSectionTag_LineMapNumbers, + &num_count); - RADDBGI_U64 range_count = 0; - RADDBGI_U32 *ranges = (RADDBGI_U32*) - raddbgi_data_from_dsec(p, srcfile->line_map_range_data_idx, sizeof(RADDBGI_U32), - RADDBGI_DataSectionTag_LineMapRanges, - &range_count); + RDI_U64 range_count = 0; + RDI_U32 *ranges = (RDI_U32*) + rdi_data_from_dsec(p, srcfile->line_map_range_data_idx, sizeof(RDI_U32), + RDI_DataSectionTag_LineMapRanges, + &range_count); - RADDBGI_U64 voff_count = 0; - RADDBGI_U64 *voffs = (RADDBGI_U64*) - raddbgi_data_from_dsec(p, srcfile->line_map_voff_data_idx, sizeof(RADDBGI_U64), - RADDBGI_DataSectionTag_LineMapVoffs, - &voff_count); + RDI_U64 voff_count = 0; + RDI_U64 *voffs = (RDI_U64*) + rdi_data_from_dsec(p, srcfile->line_map_voff_data_idx, sizeof(RDI_U64), + RDI_DataSectionTag_LineMapVoffs, + &voff_count); - RADDBGI_U32 count_a = (range_count > 0)?(range_count - 1):0; - RADDBGI_U32 count_b = raddbgi_parse__min(count_a, num_count); - RADDBGI_U32 count = raddbgi_parse__min(count_b, srcfile->line_map_count); + RDI_U32 count_a = (range_count > 0)?(range_count - 1):0; + RDI_U32 count_b = rdi_parse__min(count_a, num_count); + RDI_U32 count = rdi_parse__min(count_b, srcfile->line_map_count); out->nums = nums; out->ranges = ranges; @@ -347,20 +347,20 @@ raddbgi_line_map_from_source_file(RADDBGI_Parsed *p, RADDBGI_SourceFile *srcfile out->voff_count = voff_count; } -RADDBGI_PROC RADDBGI_U64* -raddbgi_line_voffs_from_num(RADDBGI_ParsedLineMap *map, RADDBGI_U32 linenum, RADDBGI_U32 *n_out){ - RADDBGI_U64 *result = 0; +RDI_PROC RDI_U64* +rdi_line_voffs_from_num(RDI_ParsedLineMap *map, RDI_U32 linenum, RDI_U32 *n_out){ + RDI_U64 *result = 0; *n_out = 0; - RADDBGI_U32 closest_i = 0; + RDI_U32 closest_i = 0; if (map->count > 0 && map->nums[0] <= linenum){ // assuming: (i < j) -> (nums[i] < nums[j]) // find i such that: (nums[i] <= linenum) && (linenum < nums[i + 1]) - RADDBGI_U32 *nums = map->nums; - RADDBGI_U32 first = 0; - RADDBGI_U32 opl = map->count; + RDI_U32 *nums = map->nums; + RDI_U32 first = 0; + RDI_U32 opl = map->count; for (;;){ - RADDBGI_U32 mid = (first + opl)/2; + RDI_U32 mid = (first + opl)/2; if (nums[mid] < linenum){ first = mid; } @@ -386,8 +386,8 @@ raddbgi_line_voffs_from_num(RADDBGI_ParsedLineMap *map, RADDBGI_U32 linenum, RAD // set result if possible if (closest_i < map->count){ - RADDBGI_U32 first = map->ranges[closest_i]; - RADDBGI_U32 opl = map->ranges[closest_i + 1]; + RDI_U32 first = map->ranges[closest_i]; + RDI_U32 opl = map->ranges[closest_i + 1]; if (opl < map->voff_count){ result = map->voffs + first; *n_out = opl - first; @@ -400,16 +400,16 @@ raddbgi_line_voffs_from_num(RADDBGI_ParsedLineMap *map, RADDBGI_U32 linenum, RAD //- vmaps -RADDBGI_PROC RADDBGI_U64 -raddbgi_vmap_idx_from_voff(RADDBGI_VMapEntry *vmap, RADDBGI_U32 vmap_count, RADDBGI_U64 voff){ - RADDBGI_U64 result = 0; +RDI_PROC RDI_U64 +rdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U32 vmap_count, RDI_U64 voff){ + RDI_U64 result = 0; if (vmap_count > 0 && vmap[0].voff <= voff && voff < vmap[vmap_count - 1].voff){ // assuming: (i < j) -> (vmap[i].voff < vmap[j].voff) // find i such that: (vmap[i].voff <= voff) && (voff < vmap[i + 1].voff) - RADDBGI_U32 first = 0; - RADDBGI_U32 opl = vmap_count; + RDI_U32 first = 0; + RDI_U32 opl = vmap_count; for (;;){ - RADDBGI_U32 mid = (first + opl)/2; + RDI_U32 mid = (first + opl)/2; if (vmap[mid].voff < voff){ first = mid; } @@ -424,60 +424,60 @@ raddbgi_vmap_idx_from_voff(RADDBGI_VMapEntry *vmap, RADDBGI_U32 vmap_count, RADD break; } } - result = (RADDBGI_U64)vmap[first].idx; + result = (RDI_U64)vmap[first].idx; } return(result); } //- name maps -RADDBGI_PROC RADDBGI_NameMap* -raddbgi_name_map_from_kind(RADDBGI_Parsed *p, RADDBGI_NameMapKind kind){ - RADDBGI_NameMap *result = 0; - if (0 < kind && kind < RADDBGI_NameMapKind_COUNT){ +RDI_PROC RDI_NameMap* +rdi_name_map_from_kind(RDI_Parsed *p, RDI_NameMapKind kind){ + RDI_NameMap *result = 0; + if (0 < kind && kind < RDI_NameMapKind_COUNT){ result = p->name_maps_by_kind[kind]; } return(result); } -RADDBGI_PROC void -raddbgi_name_map_parse(RADDBGI_Parsed *p, RADDBGI_NameMap *mapptr, RADDBGI_ParsedNameMap *out){ +RDI_PROC void +rdi_name_map_parse(RDI_Parsed *p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out){ out->buckets = 0; out->bucket_count = 0; if (mapptr != 0){ - out->buckets = (RADDBGI_NameMapBucket*) - raddbgi_data_from_dsec(p, mapptr->bucket_data_idx, sizeof(RADDBGI_NameMapBucket), - RADDBGI_DataSectionTag_NameMapBuckets, &out->bucket_count); - out->nodes = (RADDBGI_NameMapNode*) - raddbgi_data_from_dsec(p, mapptr->node_data_idx, sizeof(RADDBGI_NameMapNode), - RADDBGI_DataSectionTag_NameMapNodes, &out->node_count); + out->buckets = (RDI_NameMapBucket*) + rdi_data_from_dsec(p, mapptr->bucket_data_idx, sizeof(RDI_NameMapBucket), + RDI_DataSectionTag_NameMapBuckets, &out->bucket_count); + out->nodes = (RDI_NameMapNode*) + rdi_data_from_dsec(p, mapptr->node_data_idx, sizeof(RDI_NameMapNode), + RDI_DataSectionTag_NameMapNodes, &out->node_count); } } -RADDBGI_PROC RADDBGI_NameMapNode* -raddbgi_name_map_lookup(RADDBGI_Parsed *p, RADDBGI_ParsedNameMap *map, - RADDBGI_U8 *str, RADDBGI_U64 len){ - RADDBGI_NameMapNode *result = 0; +RDI_PROC RDI_NameMapNode* +rdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, + RDI_U8 *str, RDI_U64 len){ + RDI_NameMapNode *result = 0; if (map->bucket_count > 0){ - RADDBGI_NameMapBucket *buckets = map->buckets; - RADDBGI_U64 bucket_count = map->bucket_count; - RADDBGI_U64 hash = raddbgi_hash(str, len); - RADDBGI_U64 bucket_index = hash%bucket_count; - RADDBGI_NameMapBucket *bucket = map->buckets + bucket_index; + RDI_NameMapBucket *buckets = map->buckets; + RDI_U64 bucket_count = map->bucket_count; + RDI_U64 hash = rdi_hash(str, len); + RDI_U64 bucket_index = hash%bucket_count; + RDI_NameMapBucket *bucket = map->buckets + bucket_index; - RADDBGI_NameMapNode *node = map->nodes + bucket->first_node; - RADDBGI_NameMapNode *node_opl = node + bucket->node_count; + RDI_NameMapNode *node = map->nodes + bucket->first_node; + RDI_NameMapNode *node_opl = node + bucket->node_count; for (;node < node_opl; node += 1){ // extract a string from this node - RADDBGI_U64 nlen = 0; - RADDBGI_U8 *nstr = raddbgi_string_from_idx(p, node->string_idx, &nlen); + RDI_U64 nlen = 0; + RDI_U8 *nstr = rdi_string_from_idx(p, node->string_idx, &nlen); // compare this to the needle string - RADDBGI_S32 match = 0; + RDI_S32 match = 0; if (nlen == len){ - RADDBGI_U8 *a = str; - RADDBGI_U8 *aopl = str + len; - RADDBGI_U8 *b = nstr; + RDI_U8 *a = str; + RDI_U8 *aopl = str + len; + RDI_U8 *b = nstr; for (;a < aopl && *a == *b; a += 1, b += 1); match = (a == aopl); } @@ -493,10 +493,10 @@ raddbgi_name_map_lookup(RADDBGI_Parsed *p, RADDBGI_ParsedNameMap *map, return(result); } -RADDBGI_PROC RADDBGI_U32* -raddbgi_matches_from_map_node(RADDBGI_Parsed *p, RADDBGI_NameMapNode *node, - RADDBGI_U32 *n_out){ - RADDBGI_U32 *result = 0; +RDI_PROC RDI_U32* +rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, + RDI_U32 *n_out){ + RDI_U32 *result = 0; *n_out = 0; if (node != 0){ if (node->match_count == 1){ @@ -504,8 +504,8 @@ raddbgi_matches_from_map_node(RADDBGI_Parsed *p, RADDBGI_NameMapNode *node, *n_out = 1; } else{ - result = raddbgi_idx_run_from_first_count(p, node->match_idx_or_idx_run_first, - node->match_count, n_out); + result = rdi_idx_run_from_first_count(p, node->match_idx_or_idx_run_first, + node->match_count, n_out); } } return(result); @@ -513,14 +513,14 @@ raddbgi_matches_from_map_node(RADDBGI_Parsed *p, RADDBGI_NameMapNode *node, //- common helpers -RADDBGI_PROC RADDBGI_U64 -raddbgi_first_voff_from_proc(RADDBGI_Parsed *p, RADDBGI_U32 proc_id){ - RADDBGI_U64 result = 0; +RDI_PROC RDI_U64 +rdi_first_voff_from_proc(RDI_Parsed *p, RDI_U32 proc_id){ + RDI_U64 result = 0; if (0 < proc_id && proc_id < p->procedures_count){ - RADDBGI_Procedure *proc = p->procedures + proc_id; - RADDBGI_U32 scope_id = proc->root_scope_idx; + RDI_Procedure *proc = p->procedures + proc_id; + RDI_U32 scope_id = proc->root_scope_idx; if (0 < scope_id && scope_id < p->scopes_count){ - RADDBGI_Scope *scope = p->scopes + scope_id; + RDI_Scope *scope = p->scopes + scope_id; if (scope->voff_range_first < scope->voff_range_opl && scope->voff_range_first < p->scope_voffs_count){ result = p->scope_voffs[scope->voff_range_first]; @@ -533,19 +533,19 @@ raddbgi_first_voff_from_proc(RADDBGI_Parsed *p, RADDBGI_U32 proc_id){ //////////////////////////////// //~ RADDBG Parsing Helpers -RADDBGI_PROC void* -raddbgi_data_from_dsec(RADDBGI_Parsed *parsed, RADDBGI_U32 idx, RADDBGI_U32 item_size, - RADDBGI_DataSectionTag expected_tag, - RADDBGI_U64 *count_out){ +RDI_PROC void* +rdi_data_from_dsec(RDI_Parsed *parsed, RDI_U32 idx, RDI_U32 item_size, + RDI_DataSectionTag expected_tag, + RDI_U64 *count_out){ void *result = 0; - RADDBGI_U32 count_result = 0; + RDI_U32 count_result = 0; // TODO(allen): need a version of this that works with encodings other than "Unpacked" if (0 < idx && idx < parsed->dsec_count){ - RADDBGI_DataSection *ds = parsed->dsecs + idx; + RDI_DataSection *ds = parsed->dsecs + idx; if (ds->tag == expected_tag){ - RADDBGI_U64 opl = ds->off + ds->encoded_size; + RDI_U64 opl = ds->off + ds->encoded_size; if (opl <= parsed->raw_data_size){ count_result = ds->encoded_size/item_size; result = (parsed->raw_data + ds->off); diff --git a/src/lib_raddbgi_format/raddbgi_format_parse.h b/src/lib_raddbgi_format/raddbgi_format_parse.h index e0c3fa9c..97377f93 100644 --- a/src/lib_raddbgi_format/raddbgi_format_parse.h +++ b/src/lib_raddbgi_format/raddbgi_format_parse.h @@ -1,105 +1,105 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_PARSE_H -#define RADDBGI_PARSE_H +#ifndef RDI_PARSE_H +#define RDI_PARSE_H //////////////////////////////// //~ RADDBG Parsing Helpers -typedef struct RADDBGI_Parsed{ +typedef struct RDI_Parsed{ // raw data & data sections (part 1) - RADDBGI_U8 *raw_data; - RADDBGI_U64 raw_data_size; - RADDBGI_DataSection *dsecs; - RADDBGI_U64 dsec_count; - RADDBGI_U32 dsec_idx[RADDBGI_DataSectionTag_PRIMARY_COUNT]; + RDI_U8 *raw_data; + RDI_U64 raw_data_size; + RDI_DataSection *dsecs; + RDI_U64 dsec_count; + RDI_U32 dsec_idx[RDI_DataSectionTag_PRIMARY_COUNT]; // primary data structures (part 2) // handled by helper APIs - RADDBGI_U8* string_data; - RADDBGI_U64 string_data_size; - RADDBGI_U32* string_offs; - RADDBGI_U64 string_count; - RADDBGI_U32* idx_run_data; - RADDBGI_U32 idx_run_count; + RDI_U8* string_data; + RDI_U64 string_data_size; + RDI_U32* string_offs; + RDI_U64 string_count; + RDI_U32* idx_run_data; + RDI_U32 idx_run_count; // directly readable by users // (any of these may be empty and null even in a successful parse) - RADDBGI_TopLevelInfo* top_level_info; + RDI_TopLevelInfo* top_level_info; - RADDBGI_BinarySection* binary_sections; - RADDBGI_U64 binary_sections_count; - RADDBGI_FilePathNode* file_paths; - RADDBGI_U64 file_paths_count; - RADDBGI_SourceFile* source_files; - RADDBGI_U64 source_files_count; - RADDBGI_Unit* units; - RADDBGI_U64 units_count; - RADDBGI_VMapEntry* unit_vmap; - RADDBGI_U64 unit_vmap_count; - RADDBGI_TypeNode* type_nodes; - RADDBGI_U64 type_nodes_count; - RADDBGI_UDT* udts; - RADDBGI_U64 udts_count; - RADDBGI_Member* members; - RADDBGI_U64 members_count; - RADDBGI_EnumMember* enum_members; - RADDBGI_U64 enum_members_count; - RADDBGI_GlobalVariable* global_variables; - RADDBGI_U64 global_variables_count; - RADDBGI_VMapEntry* global_vmap; - RADDBGI_U64 global_vmap_count; - RADDBGI_ThreadVariable* thread_variables; - RADDBGI_U64 thread_variables_count; - RADDBGI_Procedure* procedures; - RADDBGI_U64 procedures_count; - RADDBGI_Scope* scopes; - RADDBGI_U64 scopes_count; - RADDBGI_U64* scope_voffs; - RADDBGI_U64 scope_voffs_count; - RADDBGI_VMapEntry* scope_vmap; - RADDBGI_U64 scope_vmap_count; - RADDBGI_Local* locals; - RADDBGI_U64 locals_count; - RADDBGI_LocationBlock* location_blocks; - RADDBGI_U64 location_blocks_count; - RADDBGI_U8* location_data; - RADDBGI_U64 location_data_size; - RADDBGI_NameMap* name_maps; - RADDBGI_U64 name_maps_count; + RDI_BinarySection* binary_sections; + RDI_U64 binary_sections_count; + RDI_FilePathNode* file_paths; + RDI_U64 file_paths_count; + RDI_SourceFile* source_files; + RDI_U64 source_files_count; + RDI_Unit* units; + RDI_U64 units_count; + RDI_VMapEntry* unit_vmap; + RDI_U64 unit_vmap_count; + RDI_TypeNode* type_nodes; + RDI_U64 type_nodes_count; + RDI_UDT* udts; + RDI_U64 udts_count; + RDI_Member* members; + RDI_U64 members_count; + RDI_EnumMember* enum_members; + RDI_U64 enum_members_count; + RDI_GlobalVariable* global_variables; + RDI_U64 global_variables_count; + RDI_VMapEntry* global_vmap; + RDI_U64 global_vmap_count; + RDI_ThreadVariable* thread_variables; + RDI_U64 thread_variables_count; + RDI_Procedure* procedures; + RDI_U64 procedures_count; + RDI_Scope* scopes; + RDI_U64 scopes_count; + RDI_U64* scope_voffs; + RDI_U64 scope_voffs_count; + RDI_VMapEntry* scope_vmap; + RDI_U64 scope_vmap_count; + RDI_Local* locals; + RDI_U64 locals_count; + RDI_LocationBlock* location_blocks; + RDI_U64 location_blocks_count; + RDI_U8* location_data; + RDI_U64 location_data_size; + RDI_NameMap* name_maps; + RDI_U64 name_maps_count; // other helpers - RADDBGI_NameMap* name_maps_by_kind[RADDBGI_NameMapKind_COUNT]; + RDI_NameMap* name_maps_by_kind[RDI_NameMapKind_COUNT]; -} RADDBGI_Parsed; +} RDI_Parsed; typedef enum{ - RADDBGI_ParseStatus_Good = 0, - RADDBGI_ParseStatus_HeaderDoesNotMatch = 1, - RADDBGI_ParseStatus_UnsupportedVersionNumber = 2, - RADDBGI_ParseStatus_InvalidDataSecionLayout = 3, - RADDBGI_ParseStatus_MissingStringDataSection = 4, - RADDBGI_ParseStatus_MissingStringTableSection = 5, - RADDBGI_ParseStatus_MissingIndexRunSection = 6, -} RADDBGI_ParseStatus; + RDI_ParseStatus_Good = 0, + RDI_ParseStatus_HeaderDoesNotMatch = 1, + RDI_ParseStatus_UnsupportedVersionNumber = 2, + RDI_ParseStatus_InvalidDataSecionLayout = 3, + RDI_ParseStatus_MissingStringDataSection = 4, + RDI_ParseStatus_MissingStringTableSection = 5, + RDI_ParseStatus_MissingIndexRunSection = 6, +} RDI_ParseStatus; -typedef struct RADDBGI_ParsedLineInfo{ +typedef struct RDI_ParsedLineInfo{ // NOTE: Mapping VOFF -> LINE_INFO // // * [ voff[i], voff[i + 1] ) forms the voff range // * for the line info at lines[i] (and cols[i] if i < col_count) - RADDBGI_U64* voffs; // [count + 1] sorted - RADDBGI_Line* lines; // [count] - RADDBGI_Column* cols; // [col_count] - RADDBGI_U64 count; - RADDBGI_U64 col_count; -} RADDBGI_ParsedLineInfo; + RDI_U64* voffs; // [count + 1] sorted + RDI_Line* lines; // [count] + RDI_Column* cols; // [col_count] + RDI_U64 count; + RDI_U64 col_count; +} RDI_ParsedLineInfo; -typedef struct RADDBGI_ParsedLineMap{ +typedef struct RDI_ParsedLineMap{ // NOTE: Mapping LINE_NUMBER -> VOFFs // // * nums[i] gives a line number @@ -109,111 +109,111 @@ typedef struct RADDBGI_ParsedLineMap{ // * let k span over the range [ ranges[i], ranges[i + 1] ) // * voffs[k] gives the associated voffs - RADDBGI_U32* nums; // [count] sorted - RADDBGI_U32* ranges; // [count + 1] - RADDBGI_U64* voffs; // [voff_count] - RADDBGI_U64 count; - RADDBGI_U64 voff_count; -} RADDBGI_ParsedLineMap; + RDI_U32* nums; // [count] sorted + RDI_U32* ranges; // [count + 1] + RDI_U64* voffs; // [voff_count] + RDI_U64 count; + RDI_U64 voff_count; +} RDI_ParsedLineMap; -typedef struct RADDBGI_ParsedNameMap{ - RADDBGI_NameMapBucket *buckets; - RADDBGI_NameMapNode *nodes; - RADDBGI_U64 bucket_count; - RADDBGI_U64 node_count; -} RADDBGI_ParsedNameMap; +typedef struct RDI_ParsedNameMap{ + RDI_NameMapBucket *buckets; + RDI_NameMapNode *nodes; + RDI_U64 bucket_count; + RDI_U64 node_count; +} RDI_ParsedNameMap; //////////////////////////////// //~ Global Nils -#if !defined(RADDBGI_DISABLE_NILS) -static RADDBGI_BinarySection raddbgi_binary_section_nil = {0}; -static RADDBGI_FilePathNode raddbgi_file_path_node_nil = {0}; -static RADDBGI_SourceFile raddbgi_source_file_nil = {0}; -static RADDBGI_Unit raddbgi_unit_nil = {0}; -static RADDBGI_VMapEntry raddbgi_vmap_entry_nil = {0}; -static RADDBGI_TypeNode raddbgi_type_node_nil = {0}; -static RADDBGI_UDT raddbgi_udt_nil = {0}; -static RADDBGI_Member raddbgi_member_nil = {0}; -static RADDBGI_EnumMember raddbgi_enum_member_nil = {0}; -static RADDBGI_GlobalVariable raddbgi_global_variable_nil = {0}; -static RADDBGI_ThreadVariable raddbgi_thread_variable_nil = {0}; -static RADDBGI_Procedure raddbgi_procedure_nil = {0}; -static RADDBGI_Scope raddbgi_scope_nil = {0}; -static RADDBGI_U64 raddbgi_voff_nil = 0; -static RADDBGI_LocationBlock raddbgi_location_block_nil = {0}; -static RADDBGI_Local raddbgi_local_nil = {0}; +#if !defined(RDI_DISABLE_NILS) +static RDI_BinarySection rdi_binary_section_nil = {0}; +static RDI_FilePathNode rdi_file_path_node_nil = {0}; +static RDI_SourceFile rdi_source_file_nil = {0}; +static RDI_Unit rdi_unit_nil = {0}; +static RDI_VMapEntry rdi_vmap_entry_nil = {0}; +static RDI_TypeNode rdi_type_node_nil = {0}; +static RDI_UDT rdi_udt_nil = {0}; +static RDI_Member rdi_member_nil = {0}; +static RDI_EnumMember rdi_enum_member_nil = {0}; +static RDI_GlobalVariable rdi_global_variable_nil = {0}; +static RDI_ThreadVariable rdi_thread_variable_nil = {0}; +static RDI_Procedure rdi_procedure_nil = {0}; +static RDI_Scope rdi_scope_nil = {0}; +static RDI_U64 rdi_voff_nil = 0; +static RDI_LocationBlock rdi_location_block_nil = {0}; +static RDI_Local rdi_local_nil = {0}; #endif //////////////////////////////// //~ RADDBG Parse API -RADDBGI_PROC RADDBGI_ParseStatus -raddbgi_parse(RADDBGI_U8 *data, RADDBGI_U64 size, RADDBGI_Parsed *out); +RDI_PROC RDI_ParseStatus +rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out); -RADDBGI_PROC RADDBGI_U8* -raddbgi_string_from_idx(RADDBGI_Parsed *parsed, RADDBGI_U32 idx, RADDBGI_U64 *len_out); +RDI_PROC RDI_U8* +rdi_string_from_idx(RDI_Parsed *parsed, RDI_U32 idx, RDI_U64 *len_out); -RADDBGI_PROC RADDBGI_U32* -raddbgi_idx_run_from_first_count(RADDBGI_Parsed *parsed, RADDBGI_U32 first, RADDBGI_U32 raw_count, - RADDBGI_U32 *n_out); +RDI_PROC RDI_U32* +rdi_idx_run_from_first_count(RDI_Parsed *parsed, RDI_U32 first, RDI_U32 raw_count, + RDI_U32 *n_out); //- table lookups -#define raddbgi_element_from_idx(parsed, name, idx) ((0 <= (idx) && (idx) < (parsed)->name##_count) ? &(parsed)->name[idx] : (parsed)->name ? &(parsed)->name[0] : 0) +#define rdi_element_from_idx(parsed, name, idx) ((0 <= (idx) && (idx) < (parsed)->name##_count) ? &(parsed)->name[idx] : (parsed)->name ? &(parsed)->name[0] : 0) //- line info -RADDBGI_PROC void -raddbgi_line_info_from_unit(RADDBGI_Parsed *p, RADDBGI_Unit *unit, RADDBGI_ParsedLineInfo *out); +RDI_PROC void +rdi_line_info_from_unit(RDI_Parsed *p, RDI_Unit *unit, RDI_ParsedLineInfo *out); -RADDBGI_PROC RADDBGI_U64 -raddbgi_line_info_idx_from_voff(RADDBGI_ParsedLineInfo *line_info, RADDBGI_U64 voff); +RDI_PROC RDI_U64 +rdi_line_info_idx_from_voff(RDI_ParsedLineInfo *line_info, RDI_U64 voff); -RADDBGI_PROC void -raddbgi_line_map_from_source_file(RADDBGI_Parsed *p, RADDBGI_SourceFile *srcfile, - RADDBGI_ParsedLineMap *out); +RDI_PROC void +rdi_line_map_from_source_file(RDI_Parsed *p, RDI_SourceFile *srcfile, + RDI_ParsedLineMap *out); -RADDBGI_PROC RADDBGI_U64* -raddbgi_line_voffs_from_num(RADDBGI_ParsedLineMap *map, RADDBGI_U32 linenum, RADDBGI_U32 *n_out); +RDI_PROC RDI_U64* +rdi_line_voffs_from_num(RDI_ParsedLineMap *map, RDI_U32 linenum, RDI_U32 *n_out); //- vmaps -RADDBGI_PROC RADDBGI_U64 -raddbgi_vmap_idx_from_voff(RADDBGI_VMapEntry *vmap, RADDBGI_U32 vmap_count, RADDBGI_U64 voff); +RDI_PROC RDI_U64 +rdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U32 vmap_count, RDI_U64 voff); //- name maps -RADDBGI_PROC RADDBGI_NameMap* -raddbgi_name_map_from_kind(RADDBGI_Parsed *p, RADDBGI_NameMapKind kind); +RDI_PROC RDI_NameMap* +rdi_name_map_from_kind(RDI_Parsed *p, RDI_NameMapKind kind); -RADDBGI_PROC void -raddbgi_name_map_parse(RADDBGI_Parsed* p, RADDBGI_NameMap *mapptr, RADDBGI_ParsedNameMap *out); +RDI_PROC void +rdi_name_map_parse(RDI_Parsed* p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out); -RADDBGI_PROC RADDBGI_NameMapNode* -raddbgi_name_map_lookup(RADDBGI_Parsed *p, RADDBGI_ParsedNameMap *map, - RADDBGI_U8 *str, RADDBGI_U64 len); +RDI_PROC RDI_NameMapNode* +rdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, + RDI_U8 *str, RDI_U64 len); -RADDBGI_PROC RADDBGI_U32* -raddbgi_matches_from_map_node(RADDBGI_Parsed *p, RADDBGI_NameMapNode *node, RADDBGI_U32 *n_out); +RDI_PROC RDI_U32* +rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out); //- common helpers -RADDBGI_PROC RADDBGI_U64 -raddbgi_first_voff_from_proc(RADDBGI_Parsed *p, RADDBGI_U32 proc_id); +RDI_PROC RDI_U64 +rdi_first_voff_from_proc(RDI_Parsed *p, RDI_U32 proc_id); //////////////////////////////// //~ RADDBG Parsing Helpers -#define raddbgi_parse__extract_primary(p,outptr,outn,pritag) \ +#define rdi_parse__extract_primary(p,outptr,outn,pritag) \ ( (*(void**)&(outptr)) = \ -raddbgi_data_from_dsec((p),(p)->dsec_idx[pritag],sizeof(*(outptr)),(pritag),(outn)) ) +rdi_data_from_dsec((p),(p)->dsec_idx[pritag],sizeof(*(outptr)),(pritag),(outn)) ) -RADDBGI_PROC void* -raddbgi_data_from_dsec(RADDBGI_Parsed *p, RADDBGI_U32 idx, RADDBGI_U32 item_size, - RADDBGI_DataSectionTag expected_tag, RADDBGI_U64 *n_out); +RDI_PROC void* +rdi_data_from_dsec(RDI_Parsed *p, RDI_U32 idx, RDI_U32 item_size, + RDI_DataSectionTag expected_tag, RDI_U64 *n_out); -#define raddbgi_parse__min(a,b) (((a)<(b))?(a):(b)) +#define rdi_parse__min(a,b) (((a)<(b))?(a):(b)) -#endif // RADDBGI_PARSE_H +#endif // RDI_PARSE_H diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index e55f79b3..3e5cde69 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -13,24 +13,24 @@ //- rjf: memory set #if !defined(RDIM_MEMSET_OVERRIDE) -RADDBGI_PROC void * -rdim_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size) +RDI_PROC void * +rdim_memset_fallback(void *dst, RDI_U8 c, RDI_U64 size) { - for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + for(RDI_U64 idx = 0; idx < size; idx += 1) { - ((RADDBGI_U8 *)dst)[idx] = c; + ((RDI_U8 *)dst)[idx] = c; } return dst; } #endif #if !defined(RDIM_MEMCPY_OVERRIDE) -RADDBGI_PROC void * -rdim_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size) +RDI_PROC void * +rdim_memcpy_fallback(void *dst, void *src, RDI_U64 size) { - for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + for(RDI_U64 idx = 0; idx < size; idx += 1) { - ((RADDBGI_U8 *)dst)[idx] = ((RADDBGI_U8 *)src)[idx]; + ((RDI_U8 *)dst)[idx] = ((RDI_U8 *)src)[idx]; } return dst; } @@ -40,33 +40,33 @@ rdim_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size) #if !defined (RDIM_ARENA_OVERRIDE) -RADDBGI_PROC RDIM_Arena * +RDI_PROC RDIM_Arena * rdim_arena_alloc_fallback(void) { RDIM_Arena *arena = 0; return arena; } -RADDBGI_PROC void +RDI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena) { } -RADDBGI_PROC RADDBGI_U64 +RDI_PROC RDI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena) { return 0; } -RADDBGI_PROC void * -rdim_arena_push_fallback(RDIM_Arena *arena, RADDBGI_U64 size) +RDI_PROC void * +rdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 size) { return 0; } -RADDBGI_PROC void -rdim_arena_pop_to_fallback(RDIM_Arena *arena, RADDBGI_U64 pos) +RDI_PROC void +rdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos) { } @@ -78,8 +78,8 @@ rdim_arena_pop_to_fallback(RDIM_Arena *arena, RADDBGI_U64 pos) #if !defined (RDIM_SCRATCH_OVERRIDE) static RDIM_THREAD_LOCAL RDIM_Arena *rdim_thread_scratches[2]; -RADDBGI_PROC RDIM_Temp -rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RADDBGI_U64 conflicts_count) +RDI_PROC RDIM_Temp +rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RDI_U64 conflicts_count) { if(rdim_thread_scratches[0] == 0) { @@ -87,12 +87,12 @@ rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RADDBGI_U64 conflicts_count) rdim_thread_scratches[1] = rdim_arena_alloc(); } RDIM_Arena *arena = 0; - for(RADDBGI_U64 scratch_idx = 0; + for(RDI_U64 scratch_idx = 0; scratch_idx < sizeof(rdim_thread_scratches)/sizeof(rdim_thread_scratches[0]); scratch_idx += 1) { - RADDBGI_S32 scratch_conflicts = 0; - for(RADDBGI_U64 conflict_idx = 0; conflict_idx < conflicts_count; conflict_idx += 1) + RDI_S32 scratch_conflicts = 0; + for(RDI_U64 conflict_idx = 0; conflict_idx < conflicts_count; conflict_idx += 1) { if(conflicts[conflict_idx] == rdim_thread_scratches[scratch_idx]) { @@ -111,7 +111,7 @@ rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RADDBGI_U64 conflicts_count) return temp; } -RADDBGI_PROC void +RDI_PROC void rdim_scratch_end_fallback(RDIM_Temp temp) { rdim_arena_pop_to(temp.arena, temp.pos); @@ -121,8 +121,8 @@ rdim_scratch_end_fallback(RDIM_Temp temp) //- rjf: strings -RADDBGI_PROC RDIM_String8 -rdim_str8(RADDBGI_U8 *str, RADDBGI_U64 size) +RDI_PROC RDIM_String8 +rdim_str8(RDI_U8 *str, RDI_U64 size) { RDIM_String8 result; result.RDIM_String8_BaseMember = str; @@ -130,18 +130,18 @@ rdim_str8(RADDBGI_U8 *str, RADDBGI_U64 size) return result; } -RADDBGI_PROC RDIM_String8 +RDI_PROC RDIM_String8 rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src) { RDIM_String8 dst; dst.RDIM_String8_SizeMember = src.RDIM_String8_SizeMember; - dst.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RADDBGI_U8, dst.RDIM_String8_SizeMember+1); + dst.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, dst.RDIM_String8_SizeMember+1); rdim_memcpy(dst.RDIM_String8_BaseMember, src.RDIM_String8_BaseMember, src.RDIM_String8_SizeMember); dst.RDIM_String8_BaseMember[dst.RDIM_String8_SizeMember] = 0; return dst; } -RADDBGI_PROC RDIM_String8 +RDI_PROC RDIM_String8 rdim_str8f(RDIM_Arena *arena, char *fmt, ...) { va_list args; @@ -151,33 +151,33 @@ rdim_str8f(RDIM_Arena *arena, char *fmt, ...) return(result); } -RADDBGI_PROC RDIM_String8 +RDI_PROC RDIM_String8 rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args) { va_list args2; va_copy(args2, args); - RADDBGI_U32 needed_bytes = rdim_vsnprintf(0, 0, fmt, args) + 1; + RDI_U32 needed_bytes = rdim_vsnprintf(0, 0, fmt, args) + 1; RDIM_String8 result = {0}; - result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RADDBGI_U8, needed_bytes); + result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, needed_bytes); result.RDIM_String8_SizeMember = rdim_vsnprintf((char*)result.str, needed_bytes, fmt, args2); result.RDIM_String8_BaseMember[result.RDIM_String8_SizeMember] = 0; va_end(args2); return(result); } -RADDBGI_PROC RADDBGI_S32 +RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags) { - RADDBGI_S32 result = 0; + RDI_S32 result = 0; if(a.RDIM_String8_SizeMember == b.RDIM_String8_SizeMember) { - RADDBGI_S32 case_insensitive = (flags & RDIM_StringMatchFlag_CaseInsensitive); - RADDBGI_U64 size = a.RDIM_String8_SizeMember; + RDI_S32 case_insensitive = (flags & RDIM_StringMatchFlag_CaseInsensitive); + RDI_U64 size = a.RDIM_String8_SizeMember; result = 1; - for(RADDBGI_U64 idx = 0; idx < size; idx += 1) + for(RDI_U64 idx = 0; idx < size; idx += 1) { - RADDBGI_U8 at = a.RDIM_String8_BaseMember[idx]; - RADDBGI_U8 bt = b.RDIM_String8_BaseMember[idx]; + RDI_U8 at = a.RDIM_String8_BaseMember[idx]; + RDI_U8 bt = b.RDIM_String8_BaseMember[idx]; if(case_insensitive) { at = ('a' <= at && at <= 'z') ? at-('a'-'A') : at; @@ -195,7 +195,7 @@ rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags) //- rjf: string lists -RADDBGI_PROC void +RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string) { RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1); @@ -205,26 +205,26 @@ rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 stri list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; } -RADDBGI_PROC RDIM_String8 +RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep) { RDIM_String8 result; rdim_memzero_struct(&result); - RADDBGI_U64 sep_count = (list->RDIM_String8List_NodeCountMember > 1) ? (list->RDIM_String8List_NodeCountMember-1) : 0; + RDI_U64 sep_count = (list->RDIM_String8List_NodeCountMember > 1) ? (list->RDIM_String8List_NodeCountMember-1) : 0; result.RDIM_String8_SizeMember = list->RDIM_String8List_TotalSizeMember+sep_count*sep.RDIM_String8_SizeMember; - result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RADDBGI_U8, result.RDIM_String8_SizeMember+1); - RADDBGI_U64 off = 0; + result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, result.RDIM_String8_SizeMember+1); + RDI_U64 off = 0; for(RDIM_String8Node *node = list->RDIM_String8List_FirstMember; node != 0; node = node->RDIM_String8Node_NextPtrMember) { - rdim_memcpy((RADDBGI_U8*)result.RDIM_String8_BaseMember+off, + rdim_memcpy((RDI_U8*)result.RDIM_String8_BaseMember+off, node->RDIM_String8Node_StringMember.RDIM_String8_BaseMember, node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember); off += node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember; if(sep.RDIM_String8_SizeMember != 0 && node->RDIM_String8Node_NextPtrMember != 0) { - rdim_memcpy((RADDBGI_U8*)result.RDIM_String8_BaseMember+off, + rdim_memcpy((RDI_U8*)result.RDIM_String8_BaseMember+off, sep.RDIM_String8_BaseMember, sep.RDIM_String8_SizeMember); off += sep.RDIM_String8_SizeMember; @@ -236,7 +236,7 @@ rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep) //- rjf: type lists -RADDBGI_PROC void +RDI_PROC void rdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *type) { RDIM_TypeNode *node = rdim_push_array(arena, RDIM_TypeNode, 1); @@ -247,11 +247,11 @@ rdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *type) //- rjf: bytecode lists -RADDBGI_PROC void -rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_EvalOp op, RADDBGI_U64 p) +RDI_PROC void +rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) { - RADDBGI_U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op]; - RADDBGI_U32 p_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits); + RDI_U8 ctrlbits = rdi_eval_opcode_ctrlbits[op]; + RDI_U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1); node->op = op; @@ -263,52 +263,52 @@ rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_Ev bytecode->encoded_size += 1 + p_size; } -RADDBGI_PROC void -rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_U64 x) +RDI_PROC void +rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x) { if(x <= 0xFF) { - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, x); } else if(x <= 0xFFFF) { - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, x); } else if(x <= 0xFFFFFFFF) { - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, x); } else { - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, x); } } -RADDBGI_PROC void -rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_S64 x) +RDI_PROC void +rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x) { if(-0x80 <= x && x <= 0x7F) { - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU8, (RADDBGI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 8); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); } else if(-0x8000 <= x && x <= 0x7FFF) { - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU16, (RADDBGI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 16); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); } else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) { - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU32, (RADDBGI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_TruncSigned, 32); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 32); } else { - rdim_bytecode_push_op(arena, bytecode, RADDBGI_EvalOp_ConstU64, (RADDBGI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)x); } } -RADDBGI_PROC void +RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed) { if(right_destroyed->first_op != 0) @@ -329,8 +329,8 @@ rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *ri //- rjf: sortable range sorting -RADDBGI_PROC RDIM_SortKey* -rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count) +RDI_PROC RDIM_SortKey* +rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count) { // This sort is designed to take advantage of lots of pre-existing sorted ranges. // Most line info is already sorted or close to already sorted. @@ -349,14 +349,14 @@ rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count) { RDIM_OrderedRange *ranges_first = 0; RDIM_OrderedRange *ranges_last = 0; - RADDBGI_U64 range_count = 0; + RDI_U64 range_count = 0; { - RADDBGI_U64 pos = 0; + RDI_U64 pos = 0; for(;pos < count;) { // identify ordered range - RADDBGI_U64 first = pos; - RADDBGI_U64 opl = pos + 1; + RDI_U64 first = pos; + RDI_U64 opl = pos + 1; for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); // generate an ordered range node @@ -409,7 +409,7 @@ rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count) // if there is not a second range, save this range for next time and end this pass if(src_ranges == 0) { - RADDBGI_U64 first = range1->first; + RDI_U64 first = range1->first; rdim_memcpy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); SLLQueuePush(dst_ranges, dst_ranges_last, range1); break; @@ -422,11 +422,11 @@ rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count) rdim_assert(range1->opl == range2->first); // merge these ranges - RADDBGI_U64 jd = range1->first; - RADDBGI_U64 j1 = range1->first; - RADDBGI_U64 j1_opl = range1->opl; - RADDBGI_U64 j2 = range2->first; - RADDBGI_U64 j2_opl = range2->opl; + RDI_U64 jd = range1->first; + RDI_U64 j1 = range1->first; + RDI_U64 j1_opl = range1->opl; + RDI_U64 j2 = range2->first; + RDI_U64 j2_opl = range2->opl; for(;;) { if(src[j1].key <= src[j2].key) @@ -480,7 +480,7 @@ rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count) #if 0 // assert sortedness - for(RADDBGI_U64 i = 1; i < count; i += 1){ + for(RDI_U64 i = 1; i < count; i += 1){ rdim_assert(result[i - 1].key <= result[i].key); } #endif @@ -494,21 +494,21 @@ rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count) //- rjf: u64 -> ptr map -RADDBGI_PROC void -rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 bucket_count) +RDI_PROC void +rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count) { rdim_assert(IsPow2OrZero(bucket_count) && bucket_count > 0); map->buckets = rdim_push_array(arena, RDIM_U64ToPtrNode*, bucket_count); map->buckets_count = bucket_count; } -RADDBGI_PROC void -rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RDIM_U64ToPtrLookup *lookup_out) +RDI_PROC void +rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out) { - RADDBGI_U64 bucket_idx = hash&(map->buckets_count - 1); + RDI_U64 bucket_idx = hash&(map->buckets_count - 1); RDIM_U64ToPtrNode *check_node = map->buckets[bucket_idx]; for(;check_node != 0; check_node = check_node->next){ - for(RADDBGI_U32 k = 0; k < ArrayCount(check_node->key); k += 1){ + for(RDI_U32 k = 0; k < ArrayCount(check_node->key); k += 1){ if(check_node->ptr[k] == 0){ lookup_out->fill_node = check_node; lookup_out->fill_k = k; @@ -522,19 +522,19 @@ rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 has } } -RADDBGI_PROC void -rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr) +RDI_PROC void +rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr) { if(lookup->fill_node != 0) { RDIM_U64ToPtrNode *node = lookup->fill_node; - RADDBGI_U32 k = lookup->fill_k; + RDI_U32 k = lookup->fill_k; node->key[k] = key; node->ptr[k] = ptr; } else { - RADDBGI_U64 bucket_idx = hash&(map->buckets_count - 1); + RDI_U64 bucket_idx = hash&(map->buckets_count - 1); RDIM_U64ToPtrNode *node = rdim_push_array(arena, RDIM_U64ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); @@ -551,18 +551,18 @@ rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 k //- rjf: string8 -> ptr map -RADDBGI_PROC void -rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RADDBGI_U64 bucket_count) +RDI_PROC void +rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_U64 bucket_count) { map->buckets_count = bucket_count; map->buckets = rdim_push_array(arena, RDIM_Str8ToPtrNode*, map->buckets_count); } -RADDBGI_PROC void* -rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 hash) +RDI_PROC void* +rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash) { void *result = 0; - RADDBGI_U64 bucket_idx = hash%map->buckets_count; + RDI_U64 bucket_idx = hash%map->buckets_count; for(RDIM_Str8ToPtrNode *node = map->buckets[bucket_idx]; node != 0; node = node->next) @@ -576,10 +576,10 @@ rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 return result; } -RADDBGI_PROC void -rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 hash, void *ptr) +RDI_PROC void +rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr) { - RADDBGI_U64 bucket_idx = hash%map->buckets_count; + RDI_U64 bucket_idx = hash%map->buckets_count; RDIM_Str8ToPtrNode *node = rdim_push_array(arena, RDIM_Str8ToPtrNode, 1); SLLStackPush(map->buckets[bucket_idx], node); @@ -595,7 +595,7 @@ rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String //- rjf: root creation -RADDBGI_PROC RDIM_Root* +RDI_PROC RDIM_Root* rdim_root_alloc(RDIM_RootParams *params) { RDIM_Arena *arena = rdim_arena_alloc(); @@ -611,7 +611,7 @@ rdim_root_alloc(RDIM_RootParams *params) { result->nil_type = rdim_type_new(result); result->variadic_type = rdim_type_new(result); - result->variadic_type->kind = RADDBGI_TypeKind_Variadic; + result->variadic_type->kind = RDI_TypeKind_Variadic; // references to "handled nil type" should be emitted as // references to nil - but should not generate error @@ -648,7 +648,7 @@ rdim_root_alloc(RDIM_RootParams *params) return result; } -RADDBGI_PROC void +RDI_PROC void rdim_root_release(RDIM_Root *root) { arena_release(root->arena); @@ -656,7 +656,7 @@ rdim_root_release(RDIM_Root *root) //- rjf: error accumulation -RADDBGI_PROC void +RDI_PROC void rdim_push_error(RDIM_Root *root, RDIM_String8 string) { RDIM_Error *error = rdim_push_array(root->arena, RDIM_Error, 1); @@ -665,7 +665,7 @@ rdim_push_error(RDIM_Root *root, RDIM_String8 string) error->msg = string; } -RADDBGI_PROC void +RDI_PROC void rdim_push_errorf(RDIM_Root *root, char *fmt, ...) { va_list args; @@ -675,7 +675,7 @@ rdim_push_errorf(RDIM_Root *root, char *fmt, ...) va_end(args); } -RADDBGI_PROC RDIM_Error* +RDI_PROC RDIM_Error* rdim_first_error_from_root(RDIM_Root *root) { return root->errors.first; @@ -683,7 +683,7 @@ rdim_first_error_from_root(RDIM_Root *root) //- rjf: top-level info specification -RADDBGI_PROC void +RDI_PROC void rdim_set_top_level_info(RDIM_Root *root, RDIM_TopLevelInfo *tli) { rdim_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); @@ -693,8 +693,8 @@ rdim_set_top_level_info(RDIM_Root *root, RDIM_TopLevelInfo *tli) //- rjf: binary section building -RADDBGI_PROC void -rdim_add_binary_section(RDIM_Root *root, RDIM_String8 name, RADDBGI_BinarySectionFlags flags, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, RADDBGI_U64 foff_opl) +RDI_PROC void +rdim_add_binary_section(RDIM_Root *root, RDIM_String8 name, RDI_BinarySectionFlags flags, RDI_U64 voff_first, RDI_U64 voff_opl, RDI_U64 foff_first, RDI_U64 foff_opl) { RDIM_BinarySection *sec = rdim_push_array(root->arena, RDIM_BinarySection, 1); SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); @@ -709,8 +709,8 @@ rdim_add_binary_section(RDIM_Root *root, RDIM_String8 name, RADDBGI_BinarySectio //- rjf: unit info building -RADDBGI_PROC RDIM_Unit* -rdim_unit_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 unit_user_id, RADDBGI_U64 unit_user_id_hash) +RDI_PROC RDIM_Unit* +rdim_unit_handle_from_user_id(RDIM_Root *root, RDI_U64 unit_user_id, RDI_U64 unit_user_id_hash) { RDIM_U64ToPtrLookup lookup = {0}; rdim_u64toptr_map_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); @@ -730,7 +730,7 @@ rdim_unit_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 unit_user_id, RADDBGI return result; } -RADDBGI_PROC void +RDI_PROC void rdim_unit_set_info(RDIM_Root *root, RDIM_Unit *unit, RDIM_UnitInfo *info) { rdim_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); @@ -744,7 +744,7 @@ rdim_unit_set_info(RDIM_Root *root, RDIM_Unit *unit, RDIM_UnitInfo *info) unit->language = info->language; } -RADDBGI_PROC void +RDI_PROC void rdim_unit_add_line_sequence(RDIM_Root *root, RDIM_Unit *unit, RDIM_LineSequence *line_sequence) { RDIM_LineSequenceNode *node = rdim_push_array(root->arena, RDIM_LineSequenceNode, 1); @@ -753,23 +753,23 @@ rdim_unit_add_line_sequence(RDIM_Root *root, RDIM_Unit *unit, RDIM_LineSequence node->line_seq.file_name = rdim_str8_copy(root->arena, line_sequence->file_name); - node->line_seq.voffs = rdim_push_array(root->arena, RADDBGI_U64, line_sequence->line_count + 1); - rdim_memcpy(node->line_seq.voffs, line_sequence->voffs, sizeof(RADDBGI_U64)*(line_sequence->line_count + 1)); + node->line_seq.voffs = rdim_push_array(root->arena, RDI_U64, line_sequence->line_count + 1); + rdim_memcpy(node->line_seq.voffs, line_sequence->voffs, sizeof(RDI_U64)*(line_sequence->line_count + 1)); - node->line_seq.line_nums = rdim_push_array(root->arena, RADDBGI_U32, line_sequence->line_count); - rdim_memcpy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(RADDBGI_U32)*line_sequence->line_count); + node->line_seq.line_nums = rdim_push_array(root->arena, RDI_U32, line_sequence->line_count); + rdim_memcpy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(RDI_U32)*line_sequence->line_count); if(line_sequence->col_nums != 0) { - node->line_seq.col_nums = rdim_push_array(root->arena, RADDBGI_U16, line_sequence->line_count); - rdim_memcpy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(RADDBGI_U16)*line_sequence->line_count); + node->line_seq.col_nums = rdim_push_array(root->arena, RDI_U16, line_sequence->line_count); + rdim_memcpy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(RDI_U16)*line_sequence->line_count); } node->line_seq.line_count = line_sequence->line_count; } -RADDBGI_PROC void -rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RADDBGI_U64 first, RADDBGI_U64 opl) +RDI_PROC void +rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RDI_U64 first, RDI_U64 opl) { RDIM_UnitVMapRange *node = rdim_push_array(root->arena, RDIM_UnitVMapRange, 1); SLLQueuePush(root->unit_vmap_range_first, root->unit_vmap_range_last, node); @@ -781,8 +781,8 @@ rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RADDBGI_U64 first, RA //- rjf: type info lookups/reservations -RADDBGI_PROC RDIM_Type* -rdim_type_from_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash) +RDI_PROC RDIM_Type* +rdim_type_from_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash) { RDIM_U64ToPtrLookup lookup = {0}; rdim_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); @@ -790,8 +790,8 @@ rdim_type_from_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_us return result; } -RADDBGI_PROC RDIM_Reservation* -rdim_type_reserve_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash) +RDI_PROC RDIM_Reservation* +rdim_type_reserve_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash) { RDIM_Reservation *result = 0; RDIM_U64ToPtrLookup lookup = {0}; @@ -805,7 +805,7 @@ rdim_type_reserve_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type return result; } -RADDBGI_PROC void +RDI_PROC void rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type) { if(res != 0 && type != 0) @@ -816,26 +816,26 @@ rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type) //- rjf: nil/singleton types -RADDBGI_PROC RADDBGI_S32 +RDI_PROC RDI_S32 rdim_type_is_unhandled_nil(RDIM_Root *root, RDIM_Type *type) { - RADDBGI_S32 result = (type->kind == RADDBGI_TypeKind_NULL && type != &root->handled_nil_type); + RDI_S32 result = (type->kind == RDI_TypeKind_NULL && type != &root->handled_nil_type); return result; } -RADDBGI_PROC RDIM_Type* +RDI_PROC RDIM_Type* rdim_type_handled_nil(RDIM_Root *root) { return &root->handled_nil_type; } -RADDBGI_PROC RDIM_Type* +RDI_PROC RDIM_Type* rdim_type_nil(RDIM_Root *root) { return root->nil_type; } -RADDBGI_PROC RDIM_Type* +RDI_PROC RDIM_Type* rdim_type_variadic(RDIM_Root *root) { return root->variadic_type; @@ -843,7 +843,7 @@ rdim_type_variadic(RDIM_Root *root) //- rjf: base type info constructors -RADDBGI_PROC RDIM_Type* +RDI_PROC RDIM_Type* rdim_type_new(RDIM_Root *root) { RDIM_Type *result = rdim_push_array(root->arena, RDIM_Type, 1); @@ -853,7 +853,7 @@ rdim_type_new(RDIM_Root *root) return result; } -RADDBGI_PROC RDIM_TypeUDT* +RDI_PROC RDIM_TypeUDT* rdim_type_udt_from_any_type(RDIM_Root *root, RDIM_Type *type) { if(type->udt == 0) @@ -869,12 +869,12 @@ rdim_type_udt_from_any_type(RDIM_Root *root, RDIM_Type *type) return result; } -RADDBGI_PROC RDIM_TypeUDT* +RDI_PROC RDIM_TypeUDT* rdim_type_udt_from_record_type(RDIM_Root *root, RDIM_Type *type) { - rdim_requiref(root, (type->kind == RADDBGI_TypeKind_Struct || - type->kind == RADDBGI_TypeKind_Class || - type->kind == RADDBGI_TypeKind_Union), + rdim_requiref(root, (type->kind == RDI_TypeKind_Struct || + type->kind == RDI_TypeKind_Class || + type->kind == RDI_TypeKind_Union), return 0, "Tried to use non-user-defined-type-kind to create user-defined-type."); RDIM_TypeUDT *result = 0; @@ -884,18 +884,18 @@ rdim_type_udt_from_record_type(RDIM_Root *root, RDIM_Type *type) //- rjf: basic/operator type construction helpers -RADDBGI_PROC RDIM_Type* -rdim_type_basic(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name) +RDI_PROC RDIM_Type* +rdim_type_basic(RDIM_Root *root, RDI_TypeKind type_kind, RDIM_String8 name) { - rdim_requiref(root, (RADDBGI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RADDBGI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); + rdim_requiref(root, (RDI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RDI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); RDIM_Type *result = root->nil_type; RDIM_Temp scratch = rdim_scratch_begin(0, 0); // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(type_kind) + name.size; - RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(type_kind) + name.size; + RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); { - RADDBGI_U8 *ptr = buf; + RDI_U8 *ptr = buf; // "basic" *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Basic; ptr += sizeof(RDIM_TypeConstructKind); @@ -909,13 +909,13 @@ rdim_type_basic(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name) // check for duplicate construct RDIM_String8 blob = rdim_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + RDI_U64 blob_hash = rdi_hash(buf, buf_size); void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RDIM_Type*)lookup_ptr; if(result == 0) { // calculate size - RADDBGI_U32 byte_size = raddbgi_size_from_basic_type_kind(type_kind); + RDI_U32 byte_size = rdi_size_from_basic_type_kind(type_kind); if(byte_size == 0xFFFFFFFF) { byte_size = root->addr_size; @@ -932,7 +932,7 @@ rdim_type_basic(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name) // save in name map { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); rdim_name_map_add_pair(root, map, result->name, result->idx); } } @@ -942,17 +942,17 @@ rdim_type_basic(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name) return result; } -RADDBGI_PROC RDIM_Type* -rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeModifierFlags flags) +RDI_PROC RDIM_Type* +rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RDI_TypeModifierFlags flags) { RDIM_Type *result = root->nil_type; RDIM_Temp scratch = rdim_scratch_begin(0, 0); // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); - RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); + RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); { - RADDBGI_U8 *ptr = buf; + RDI_U8 *ptr = buf; // "modifier" *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Modifier; ptr += sizeof(RDIM_TypeConstructKind); @@ -966,14 +966,14 @@ rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeModifier // check for duplicate construct RDIM_String8 blob = rdim_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + RDI_U64 blob_hash = rdi_hash(buf, buf_size); void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RDIM_Type*)lookup_ptr; if(result == 0){ // setup new node result = rdim_type_new(root); - result->kind = RADDBGI_TypeKind_Modifier; + result->kind = RDI_TypeKind_Modifier; result->flags = flags; result->byte_size = direct_type->byte_size; result->direct_type = direct_type; @@ -987,17 +987,17 @@ rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeModifier return result; } -RADDBGI_PROC RDIM_Type* -rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count) +RDI_PROC RDIM_Type* +rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RDI_U32 bit_off, RDI_U32 bit_count) { RDIM_Type *result = root->nil_type; RDIM_Temp scratch = rdim_scratch_begin(0, 0); // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(RADDBGI_U32)*2; - RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(RDI_U32)*2; + RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); { - RADDBGI_U8 *ptr = buf; + RDI_U8 *ptr = buf; // "bitfield" *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Bitfield; ptr += sizeof(RDIM_TypeConstructKind); @@ -1014,14 +1014,14 @@ rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U32 bit_off, // check for duplicate construct RDIM_String8 blob = rdim_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + RDI_U64 blob_hash = rdi_hash(buf, buf_size); void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RDIM_Type*)lookup_ptr; if(result == 0) { // setup new node result = rdim_type_new(root); - result->kind = RADDBGI_TypeKind_Bitfield; + result->kind = RDI_TypeKind_Bitfield; result->byte_size = direct_type->byte_size; result->off = bit_off; result->count = bit_count; @@ -1036,22 +1036,22 @@ rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U32 bit_off, return result; } -RADDBGI_PROC RDIM_Type* -rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeKind ptr_type_kind) +RDI_PROC RDIM_Type* +rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RDI_TypeKind ptr_type_kind) { - rdim_requiref(root, (ptr_type_kind == RADDBGI_TypeKind_Ptr || - ptr_type_kind == RADDBGI_TypeKind_LRef || - ptr_type_kind == RADDBGI_TypeKind_RRef), + rdim_requiref(root, (ptr_type_kind == RDI_TypeKind_Ptr || + ptr_type_kind == RDI_TypeKind_LRef || + ptr_type_kind == RDI_TypeKind_RRef), return root->nil_type, "Non-pointer type kind used to construct pointer type."); RDIM_Type *result = root->nil_type; RDIM_Temp scratch = rdim_scratch_begin(0, 0); // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); - RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); + RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); { - RADDBGI_U8 *ptr = buf; + RDI_U8 *ptr = buf; // "pointer" *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Pointer; ptr += sizeof(RDIM_TypeConstructKind); @@ -1065,7 +1065,7 @@ rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeKind ptr_ // check for duplicate construct RDIM_String8 blob = rdim_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + RDI_U64 blob_hash = rdi_hash(buf, buf_size); void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RDIM_Type*)lookup_ptr; if(result == 0) @@ -1085,18 +1085,18 @@ rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeKind ptr_ return result; } -RADDBGI_PROC RDIM_Type* -rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U64 count) +RDI_PROC RDIM_Type* +rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RDI_U64 count) { RDIM_Type *result = root->nil_type; RDIM_Temp scratch = rdim_scratch_begin(0, 0); // setup construct buffer - RADDBGI_U64 buf_size = + RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); - RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); { - RADDBGI_U8 *ptr = buf; + RDI_U8 *ptr = buf; // "array" *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Array; ptr += sizeof(RDIM_TypeConstructKind); @@ -1110,14 +1110,14 @@ rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U64 count) // check for duplicate construct RDIM_String8 blob = rdim_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + RDI_U64 blob_hash = rdi_hash(buf, buf_size); void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RDIM_Type*)lookup_ptr; if(result == 0) { // setup new node result = rdim_type_new(root); - result->kind = RADDBGI_TypeKind_Array; + result->kind = RDI_TypeKind_Array; result->count = count; result->direct_type = direct_type; result->byte_size = direct_type->byte_size*count; @@ -1131,17 +1131,17 @@ rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U64 count) return result; } -RADDBGI_PROC RDIM_Type* +RDI_PROC RDIM_Type* rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *params) { RDIM_Type *result = root->nil_type; RDIM_Temp scratch = rdim_scratch_begin(0, 0); // setup construct buffer - RADDBGI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); - RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); + RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); { - RADDBGI_U8 *ptr = buf; + RDI_U8 *ptr = buf; // "procedure" *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Procedure; ptr += sizeof(RDIM_TypeConstructKind); @@ -1160,7 +1160,7 @@ rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *pa // check for duplicate construct RDIM_String8 blob = rdim_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + RDI_U64 blob_hash = rdi_hash(buf, buf_size); void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RDIM_Type*)lookup_ptr; if(result == 0) @@ -1180,7 +1180,7 @@ rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *pa // setup new node result = rdim_type_new(root); - result->kind = RADDBGI_TypeKind_Function; + result->kind = RDI_TypeKind_Function; result->byte_size = root->addr_size; result->count = params->count; result->direct_type = return_type; @@ -1195,18 +1195,18 @@ rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *pa return result; } -RADDBGI_PROC RDIM_Type* +RDI_PROC RDIM_Type* rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, struct RDIM_TypeList *params) { RDIM_Type *result = root->nil_type; RDIM_Temp scratch = rdim_scratch_begin(0, 0); // setup construct buffer - RADDBGI_U64 buf_size = + RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); - RADDBGI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RADDBGI_U8, buf_size); + RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); { - RADDBGI_U8 *ptr = buf; + RDI_U8 *ptr = buf; // "method" *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Method; ptr += sizeof(RDIM_TypeConstructKind); @@ -1228,7 +1228,7 @@ rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, // check for duplicate construct RDIM_String8 blob = rdim_str8(buf, buf_size); - RADDBGI_U64 blob_hash = raddbgi_hash(buf, buf_size); + RDI_U64 blob_hash = rdi_hash(buf, buf_size); void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); result = (RDIM_Type*)lookup_ptr; if(result == 0) @@ -1252,7 +1252,7 @@ rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, // setup new node result = rdim_type_new(root); - result->kind = RADDBGI_TypeKind_Method; + result->kind = RDI_TypeKind_Method; result->byte_size = root->addr_size; result->count = params->count; result->direct_type = return_type; @@ -1269,12 +1269,12 @@ rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, //- rjf: udt type constructors -RADDBGI_PROC RDIM_Type* -rdim_type_udt(RDIM_Root *root, RADDBGI_TypeKind record_type_kind, RDIM_String8 name, RADDBGI_U64 size) +RDI_PROC RDIM_Type* +rdim_type_udt(RDIM_Root *root, RDI_TypeKind record_type_kind, RDIM_String8 name, RDI_U64 size) { - rdim_requiref(root, (record_type_kind == RADDBGI_TypeKind_Struct || - record_type_kind == RADDBGI_TypeKind_Class || - record_type_kind == RADDBGI_TypeKind_Union), + rdim_requiref(root, (record_type_kind == RDI_TypeKind_Struct || + record_type_kind == RDI_TypeKind_Class || + record_type_kind == RDI_TypeKind_Union), return root->nil_type, "Non-user-defined-type-kind used to create user-defined type."); @@ -1286,58 +1286,58 @@ rdim_type_udt(RDIM_Root *root, RADDBGI_TypeKind record_type_kind, RDIM_String8 n // rjf: save in name map { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); rdim_name_map_add_pair(root, map, result->name, result->idx); } return result; } -RADDBGI_PROC RDIM_Type* +RDI_PROC RDIM_Type* rdim_type_enum(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name) { // rjf: make type RDIM_Type *result = rdim_type_new(root); - result->kind = RADDBGI_TypeKind_Enum; + result->kind = RDI_TypeKind_Enum; result->byte_size = direct_type->byte_size; result->name = rdim_str8_copy(root->arena, name); result->direct_type = direct_type; // rjf: save in name map { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); rdim_name_map_add_pair(root, map, result->name, result->idx); } return result; } -RADDBGI_PROC RDIM_Type* +RDI_PROC RDIM_Type* rdim_type_alias(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name) { // rjf: make type RDIM_Type *result = rdim_type_new(root); - result->kind = RADDBGI_TypeKind_Alias; + result->kind = RDI_TypeKind_Alias; result->byte_size = direct_type->byte_size; result->name = rdim_str8_copy(root->arena, name); result->direct_type = direct_type; // rjf: save in name map { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); rdim_name_map_add_pair(root, map, result->name, result->idx); } return result; } -RADDBGI_PROC RDIM_Type* -rdim_type_incomplete(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name) +RDI_PROC RDIM_Type* +rdim_type_incomplete(RDIM_Root *root, RDI_TypeKind type_kind, RDIM_String8 name) { - rdim_requiref(root, (type_kind == RADDBGI_TypeKind_IncompleteStruct || - type_kind == RADDBGI_TypeKind_IncompleteClass || - type_kind == RADDBGI_TypeKind_IncompleteUnion || - type_kind == RADDBGI_TypeKind_IncompleteEnum), + rdim_requiref(root, (type_kind == RDI_TypeKind_IncompleteStruct || + type_kind == RDI_TypeKind_IncompleteClass || + type_kind == RDI_TypeKind_IncompleteUnion || + type_kind == RDI_TypeKind_IncompleteEnum), return root->nil_type, "Non-incomplete-type-kind used to create incomplete type."); @@ -1348,7 +1348,7 @@ rdim_type_incomplete(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 n // save in name map { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Types); + RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); rdim_name_map_add_pair(root, map, result->name, result->idx); } @@ -1357,8 +1357,8 @@ rdim_type_incomplete(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 n //- rjf: type member building -RADDBGI_PROC void -rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type, RADDBGI_U32 off) +RDI_PROC void +rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type, RDI_U32 off) { RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); if(udt != 0) @@ -1367,14 +1367,14 @@ rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_St SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_DataField; + member->kind = RDI_MemberKind_DataField; member->name = rdim_str8_copy(root->arena, name); member->type = mem_type; member->off = off; } } -RADDBGI_PROC void +RDI_PROC void rdim_type_add_member_static_data(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) { RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); @@ -1384,13 +1384,13 @@ rdim_type_add_member_static_data(RDIM_Root *root, RDIM_Type *record_type, RDIM_S SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_StaticData; + member->kind = RDI_MemberKind_StaticData; member->name = rdim_str8_copy(root->arena, name); member->type = mem_type; } } -RADDBGI_PROC void +RDI_PROC void rdim_type_add_member_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) { RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); @@ -1400,13 +1400,13 @@ rdim_type_add_member_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_Method; + member->kind = RDI_MemberKind_Method; member->name = rdim_str8_copy(root->arena, name); member->type = mem_type; } } -RADDBGI_PROC void +RDI_PROC void rdim_type_add_member_static_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) { RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); @@ -1418,13 +1418,13 @@ rdim_type_add_member_static_method(RDIM_Root *root, RDIM_Type *record_type, RDIM root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_StaticMethod; + member->kind = RDI_MemberKind_StaticMethod; member->name = rdim_str8_copy(root->arena, name); member->type = mem_type; } } -RADDBGI_PROC void +RDI_PROC void rdim_type_add_member_virtual_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) { RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); @@ -1434,14 +1434,14 @@ rdim_type_add_member_virtual_method(RDIM_Root *root, RDIM_Type *record_type, RDI SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_VirtualMethod; + member->kind = RDI_MemberKind_VirtualMethod; member->name = rdim_str8_copy(root->arena, name); member->type = mem_type; } } -RADDBGI_PROC void -rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RADDBGI_U32 off) +RDI_PROC void +rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RDI_U32 off) { RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); if(udt != 0) @@ -1450,14 +1450,14 @@ rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *ba SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_Base; + member->kind = RDI_MemberKind_Base; member->type = base_type; member->off = off; } } -RADDBGI_PROC void -rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RADDBGI_U32 vptr_off, RADDBGI_U32 vtable_off) +RDI_PROC void +rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RDI_U32 vptr_off, RDI_U32 vtable_off) { RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); if(udt != 0) @@ -1466,13 +1466,13 @@ rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_ SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_VirtualBase; + member->kind = RDI_MemberKind_VirtualBase; member->type = base_type; // TODO(allen): what to do with the two offsets in this case? } } -RADDBGI_PROC void +RDI_PROC void rdim_type_add_member_nested_type(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *nested_type) { RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); @@ -1482,15 +1482,15 @@ rdim_type_add_member_nested_type(RDIM_Root *root, RDIM_Type *record_type, RDIM_T SLLQueuePush(udt->first_member, udt->last_member, member); udt->member_count += 1; root->total_member_count += 1; - member->kind = RADDBGI_MemberKind_NestedType; + member->kind = RDI_MemberKind_NestedType; member->type = nested_type; } } -RADDBGI_PROC void -rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, RADDBGI_U64 val) +RDI_PROC void +rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, RDI_U64 val) { - rdim_requiref(root, (enum_type->kind == RADDBGI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); + rdim_requiref(root, (enum_type->kind == RDI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); RDIM_TypeUDT *udt = rdim_type_udt_from_any_type(root, enum_type); if(udt != 0) { @@ -1504,10 +1504,10 @@ rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, } //- rjf: type source coordinate specifications -RADDBGI_PROC void -rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col) +RDI_PROC void +rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_String8 source_path, RDI_U32 line, RDI_U32 col) { - rdim_requiref(root, (RADDBGI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RADDBGI_TypeKind_LastUserDefined), + rdim_requiref(root, (RDI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RDI_TypeKind_LastUserDefined), return, "Tried to add source coordinates to non-user-defined type."); RDIM_TypeUDT *udt = rdim_type_udt_from_any_type(root, defined_type); if(udt != 0) @@ -1520,8 +1520,8 @@ rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_ //- rjf: symbol info building -RADDBGI_PROC RDIM_Symbol* -rdim_symbol_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 symbol_user_id, RADDBGI_U64 symbol_user_id_hash) +RDI_PROC RDIM_Symbol* +rdim_symbol_handle_from_user_id(RDIM_Root *root, RDI_U64 symbol_user_id, RDI_U64 symbol_user_id_hash) { RDIM_U64ToPtrLookup lookup = {0}; rdim_u64toptr_map_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); @@ -1540,7 +1540,7 @@ rdim_symbol_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 symbol_user_id, RAD return result; } -RADDBGI_PROC void +RDI_PROC void rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info) { // rjf: unpack @@ -1591,15 +1591,15 @@ rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info default:{}break; case RDIM_SymbolKind_GlobalVariable: { - map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_GlobalVariables); + map = rdim_name_map_for_kind(root, RDI_NameMapKind_GlobalVariables); }break; case RDIM_SymbolKind_ThreadVariable: { - map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_ThreadVariables); + map = rdim_name_map_for_kind(root, RDI_NameMapKind_ThreadVariables); }break; case RDIM_SymbolKind_Procedure: { - map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_Procedures); + map = rdim_name_map_for_kind(root, RDI_NameMapKind_Procedures); }break; } if(map != 0) @@ -1611,15 +1611,15 @@ rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info // save link name map if(kind == RDIM_SymbolKind_Procedure && symbol->link_name.size > 0) { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_LinkNameProcedures); + RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_LinkNameProcedures); rdim_name_map_add_pair(root, map, symbol->link_name, symbol->idx); } } //- rjf: scope info building -RADDBGI_PROC RDIM_Scope * -rdim_scope_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 scope_user_id, RADDBGI_U64 scope_user_id_hash) +RDI_PROC RDIM_Scope * +rdim_scope_handle_from_user_id(RDIM_Root *root, RDI_U64 scope_user_id, RDI_U64 scope_user_id_hash) { RDIM_Scope *result = 0; RDIM_U64ToPtrLookup lookup = {0}; @@ -1639,7 +1639,7 @@ rdim_scope_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 scope_user_id, RADDB return result; } -RADDBGI_PROC void +RDI_PROC void rdim_scope_set_parent(RDIM_Root *root, RDIM_Scope *scope, RDIM_Scope *parent) { rdim_requiref(root, scope->parent_scope == 0, return, "Scope parent set multiple times."); @@ -1649,8 +1649,8 @@ rdim_scope_set_parent(RDIM_Root *root, RDIM_Scope *scope, RDIM_Scope *parent) RDIM_SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); } -RADDBGI_PROC void -rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl) +RDI_PROC void +rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RDI_U64 voff_first, RDI_U64 voff_opl) { RDIM_VOffRange *range = rdim_push_array(root->arena, RDIM_VOffRange, 1); SLLQueuePush(scope->first_range, scope->last_range, range); @@ -1661,7 +1661,7 @@ rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RADDBGI_U64 voff_f root->scope_voff_count += 2; } -RADDBGI_PROC void +RDI_PROC void rdim_scope_recursive_set_symbol(RDIM_Scope *scope, RDIM_Symbol *symbol) { scope->symbol = symbol; @@ -1675,8 +1675,8 @@ rdim_scope_recursive_set_symbol(RDIM_Scope *scope, RDIM_Symbol *symbol) //- rjf: local info building -RADDBGI_PROC RDIM_Local* -rdim_local_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 local_user_id, RADDBGI_U64 local_user_id_hash) +RDI_PROC RDIM_Local* +rdim_local_handle_from_user_id(RDIM_Root *root, RDI_U64 local_user_id, RDI_U64 local_user_id_hash) { RDIM_Local *result = 0; RDIM_U64ToPtrLookup lookup = {0}; @@ -1693,12 +1693,12 @@ rdim_local_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 local_user_id, RADDB return result; } -RADDBGI_PROC void +RDI_PROC void rdim_local_set_basic_info(RDIM_Root *root, RDIM_Local *local, RDIM_LocalInfo *info) { - rdim_requiref(root, local->kind == RADDBGI_LocalKind_NULL, return, "Local information set multiple times."); + rdim_requiref(root, local->kind == RDI_LocalKind_NULL, return, "Local information set multiple times."); rdim_requiref(root, info->scope != 0, return, "Tried to set invalid scope as local's containing scope."); - rdim_requiref(root, RADDBGI_LocalKind_NULL < info->kind && info->kind < RADDBGI_LocalKind_COUNT, return, "Invalid local kind."); + rdim_requiref(root, RDI_LocalKind_NULL < info->kind && info->kind < RDI_LocalKind_COUNT, return, "Invalid local kind."); rdim_requiref(root, info->type != 0, return, "Tried to set invalid type as local's type."); RDIM_Scope *scope = info->scope; SLLQueuePush(scope->first_local, scope->last_local, local); @@ -1709,7 +1709,7 @@ rdim_local_set_basic_info(RDIM_Root *root, RDIM_Local *local, RDIM_LocalInfo *in local->type = info->type; } -RADDBGI_PROC RDIM_LocationSet* +RDI_PROC RDIM_LocationSet* rdim_location_set_from_local(RDIM_Root *root, RDIM_Local *local) { RDIM_LocationSet *result = local->locset; @@ -1723,8 +1723,8 @@ rdim_location_set_from_local(RDIM_Root *root, RDIM_Local *local) //- rjf: location info building -RADDBGI_PROC void -rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RDIM_Location *location) +RDI_PROC void +rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RDI_U64 voff_first, RDI_U64 voff_opl, RDIM_Location *location) { RDIM_LocationCase *location_case = rdim_push_array(root->arena, RDIM_LocationCase, 1); SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); @@ -1735,60 +1735,60 @@ rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RADDBGI_U6 location_case->location = location; } -RADDBGI_PROC RDIM_Location* +RDI_PROC RDIM_Location* rdim_location_addr_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode) { RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RADDBGI_LocationKind_AddrBytecodeStream; + result->kind = RDI_LocationKind_AddrBytecodeStream; result->bytecode = *bytecode; return result; } -RADDBGI_PROC RDIM_Location* +RDI_PROC RDIM_Location* rdim_location_val_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode) { RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RADDBGI_LocationKind_ValBytecodeStream; + result->kind = RDI_LocationKind_ValBytecodeStream; result->bytecode = *bytecode; return result; } -RADDBGI_PROC RDIM_Location* -rdim_location_addr_reg_plus_u16(RDIM_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset) +RDI_PROC RDIM_Location* +rdim_location_addr_reg_plus_u16(RDIM_Root *root, RDI_U8 reg_code, RDI_U16 offset) { RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RADDBGI_LocationKind_AddrRegisterPlusU16; + result->kind = RDI_LocationKind_AddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; return result; } -RADDBGI_PROC RDIM_Location* -rdim_location_addr_addr_reg_plus_u16(RDIM_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset) +RDI_PROC RDIM_Location* +rdim_location_addr_addr_reg_plus_u16(RDIM_Root *root, RDI_U8 reg_code, RDI_U16 offset) { RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RADDBGI_LocationKind_AddrAddrRegisterPlusU16; + result->kind = RDI_LocationKind_AddrAddrRegisterPlusU16; result->register_code = reg_code; result->offset = offset; return result; } -RADDBGI_PROC RDIM_Location* -rdim_location_val_reg(RDIM_Root *root, RADDBGI_U8 reg_code) +RDI_PROC RDIM_Location* +rdim_location_val_reg(RDIM_Root *root, RDI_U8 reg_code) { RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RADDBGI_LocationKind_ValRegister; + result->kind = RDI_LocationKind_ValRegister; result->register_code = reg_code; return result; } //- rjf: name map building -RADDBGI_PROC RDIM_NameMap* -rdim_name_map_for_kind(RDIM_Root *root, RADDBGI_NameMapKind kind) +RDI_PROC RDIM_NameMap* +rdim_name_map_for_kind(RDIM_Root *root, RDI_NameMapKind kind) { RDIM_NameMap *result = 0; - if(kind < RADDBGI_NameMapKind_COUNT) + if(kind < RDI_NameMapKind_COUNT) { if(root->name_maps[kind] == 0) { @@ -1801,12 +1801,12 @@ rdim_name_map_for_kind(RDIM_Root *root, RADDBGI_NameMapKind kind) return result; } -RADDBGI_PROC void -rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 string, RADDBGI_U32 idx) +RDI_PROC void +rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 string, RDI_U32 idx) { // hash - RADDBGI_U64 hash = raddbgi_hash(string.str, string.size); - RADDBGI_U64 bucket_idx = hash%map->buckets_count; + RDI_U64 hash = rdi_hash(string.str, string.size); + RDI_U64 bucket_idx = hash%map->buckets_count; // find existing name node RDIM_NameMapNode *match = 0; @@ -1833,12 +1833,12 @@ rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 string, } // find existing idx - RADDBGI_S32 existing_idx = 0; + RDI_S32 existing_idx = 0; for(RDIM_NameMapIdxNode *node = match->idx_first; node != 0; node = node->next) { - for(RADDBGI_U32 i = 0; i < ArrayCount(node->idx); i += 1) + for(RDI_U32 i = 0; i < ArrayCount(node->idx); i += 1) { if(node->idx[i] == 0) { @@ -1856,7 +1856,7 @@ rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 string, if(!existing_idx) { RDIM_NameMapIdxNode *idx_node = match->idx_last; - RADDBGI_U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); + RDI_U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); if(insert_i == 0) { idx_node = rdim_push_array(root->arena, RDIM_NameMapIdxNode, 1); @@ -1873,7 +1873,7 @@ rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 string, //- rjf: bake context construction -RADDBGI_PROC RDIM_BakeCtx* +RDI_PROC RDIM_BakeCtx* rdim_bake_ctx_begin(RDIM_BakeParams *params) { RDIM_Arena *arena = rdim_arena_alloc(); @@ -1902,7 +1902,7 @@ rdim_bake_ctx_begin(RDIM_BakeParams *params) return result; } -RADDBGI_PROC void +RDI_PROC void rdim_bake_ctx_release(RDIM_BakeCtx *bake_ctx) { arena_release(bake_ctx->arena); @@ -1910,13 +1910,13 @@ rdim_bake_ctx_release(RDIM_BakeCtx *bake_ctx) //- rjf: string baking -RADDBGI_PROC RADDBGI_U32 +RDI_PROC RDI_U32 rdim_string(RDIM_BakeCtx *bctx, RDIM_String8 str) { RDIM_Arena *arena = bctx->arena; RDIM_Strings *strs = &bctx->strs; - RADDBGI_U64 hash = raddbgi_hash(str.str, str.size); - RADDBGI_U64 bucket_idx = hash%strs->buckets_count; + RDI_U64 hash = rdi_hash(str.str, str.size); + RDI_U64 bucket_idx = hash%strs->buckets_count; // look for a match RDIM_StringNode *match = 0; @@ -1947,18 +1947,18 @@ rdim_string(RDIM_BakeCtx *bctx, RDIM_String8 str) // extract idx to return rdim_assert(match != 0); - RADDBGI_U32 result = match->idx; + RDI_U32 result = match->idx; return result; } //- rjf: idx run baking -RADDBGI_PROC RADDBGI_U64 -rdim_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count) +RDI_PROC RDI_U64 +rdim_idx_run_hash(RDI_U32 *idx_run, RDI_U32 count) { - RADDBGI_U64 hash = 5381; - RADDBGI_U32 *ptr = idx_run; - RADDBGI_U32 *opl = idx_run + count; + RDI_U64 hash = 5381; + RDI_U32 *ptr = idx_run; + RDI_U32 *opl = idx_run + count; for(;ptr < opl; ptr += 1) { hash = ((hash << 5) + hash) + (*ptr); @@ -1966,14 +1966,14 @@ rdim_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count) return(hash); } -RADDBGI_PROC RADDBGI_U32 -rdim_idx_run(RDIM_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count) +RDI_PROC RDI_U32 +rdim_idx_run(RDIM_BakeCtx *bctx, RDI_U32 *idx_run, RDI_U32 count) { RDIM_Arena *arena = bctx->arena; RDIM_IdxRuns *idxs = &bctx->idxs; - RADDBGI_U64 hash = rdim_idx_run_hash(idx_run, count); - RADDBGI_U64 bucket_idx = hash%idxs->buckets_count; + RDI_U64 hash = rdim_idx_run_hash(idx_run, count); + RDI_U64 bucket_idx = hash%idxs->buckets_count; // look for a match RDIM_IdxRunNode *match = 0; @@ -1983,9 +1983,9 @@ rdim_idx_run(RDIM_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count) { if(node->hash == hash) { - RADDBGI_S32 is_match = 1; - RADDBGI_U32 *node_idx = node->idx_run; - for(RADDBGI_U32 i = 0; i < count; i += 1) + RDI_S32 is_match = 1; + RDI_U32 *node_idx = node->idx_run; + for(RDI_U32 i = 0; i < count; i += 1) { if(node_idx[i] != idx_run[i]) { @@ -2005,8 +2005,8 @@ rdim_idx_run(RDIM_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count) if(match == 0) { RDIM_IdxRunNode *node = rdim_push_array_no_zero(arena, RDIM_IdxRunNode, 1); - RADDBGI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RADDBGI_U32, count); - for(RADDBGI_U32 i = 0; i < count; i += 1) + RDI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RDI_U32, count); + for(RDI_U32 i = 0; i < count; i += 1) { idx_run_copy[i] = idx_run[i]; } @@ -2024,16 +2024,16 @@ rdim_idx_run(RDIM_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count) // extract idx to return rdim_assert(match != 0); - RADDBGI_U32 result = match->first_idx; + RDI_U32 result = match->first_idx; return result; } //- rjf: data section baking -RADDBGI_PROC RADDBGI_U32 -rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RADDBGI_U64 size, RADDBGI_DataSectionTag tag) +RDI_PROC RDI_U32 +rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RDI_U64 size, RDI_DataSectionTag tag) { - RADDBGI_U32 result = dss->count; + RDI_U32 result = dss->count; RDIM_DSectionNode *node = rdim_push_array(arena, RDIM_DSectionNode, 1); SLLQueuePush(dss->first, dss->last, node); node->data = data; @@ -2045,7 +2045,7 @@ rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RADDBGI_U64 si //- rjf: paths baking -RADDBGI_PROC RDIM_String8 +RDI_PROC RDIM_String8 rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -2056,11 +2056,11 @@ rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node) } RDIM_String8 result = rdim_str8_list_join(arena, &list, rdim_str8_lit("/")); { - RADDBGI_U8 *ptr = result.str; - RADDBGI_U8 *opl = result.str + result.size; + RDI_U8 *ptr = result.str; + RDI_U8 *opl = result.str + result.size; for(; ptr < opl; ptr += 1) { - RADDBGI_U8 c = *ptr; + RDI_U8 c = *ptr; if('A' <= c && c <= 'Z') { c += 'a' - 'A'; } *ptr = c; } @@ -2069,7 +2069,7 @@ rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node) return result; } -RADDBGI_PROC void +RDI_PROC void rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out) { // TODO(rjf): why is this recursive... @@ -2083,7 +2083,7 @@ rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, } } -RADDBGI_PROC RDIM_PathNode* +RDI_PROC RDIM_PathNode* rdim_paths_new_node(RDIM_BakeCtx *bctx) { RDIM_PathTree *tree = bctx->tree; @@ -2094,7 +2094,7 @@ rdim_paths_new_node(RDIM_BakeCtx *bctx) return result; } -RADDBGI_PROC RDIM_PathNode* +RDI_PROC RDIM_PathNode* rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir) { // look for existing match @@ -2128,26 +2128,26 @@ rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir return result; } -RADDBGI_PROC RDIM_PathNode* +RDI_PROC RDIM_PathNode* rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path) { RDIM_PathNode *node_cursor = &bctx->tree->root; - RADDBGI_U8 *ptr = path.str; - RADDBGI_U8 *opl = path.str + path.size; + RDI_U8 *ptr = path.str; + RDI_U8 *opl = path.str + path.size; for(;ptr < opl;){ // skip past slashes for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); // save beginning of non-slash range - RADDBGI_U8 *range_first = ptr; + RDI_U8 *range_first = ptr; // skip past non-slashes for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); // if range is non-empty advance the node cursor if(range_first < ptr){ - RDIM_String8 sub_dir = rdim_str8(range_first, (RADDBGI_U64)(ptr-range_first)); + RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); node_cursor = rdim_paths_sub_path(bctx, node_cursor, sub_dir); } } @@ -2156,15 +2156,15 @@ rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path) return result; } -RADDBGI_PROC RADDBGI_U32 +RDI_PROC RDI_U32 rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path) { RDIM_PathNode *node = rdim_paths_node_from_path(bctx, path); - RADDBGI_U32 result = node->idx; + RDI_U32 result = node->idx; return result; } -RADDBGI_PROC RDIM_SrcNode* +RDI_PROC RDIM_SrcNode* rdim_paths_new_src_node(RDIM_BakeCtx *bctx) { RDIM_PathTree *tree = bctx->tree; @@ -2175,7 +2175,7 @@ rdim_paths_new_src_node(RDIM_BakeCtx *bctx) return result; } -RADDBGI_PROC RDIM_SrcNode* +RDI_PROC RDIM_SrcNode* rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node) { RDIM_SrcNode *result = path_node->src_file; @@ -2191,7 +2191,7 @@ rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node) //- rjf: per-unit line info baking -RADDBGI_PROC RDIM_UnitLinesCombined* +RDI_PROC RDIM_UnitLinesCombined* rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequenceNode *first_seq) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -2199,8 +2199,8 @@ rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequence // gather up all line info into two arrays // keys: sortable array; pairs voffs with line info records; null records are sequence enders // recs: contains all the source coordinates for a range of voffs - RADDBGI_U64 line_count = 0; - RADDBGI_U64 seq_count = 0; + RDI_U64 line_count = 0; + RDI_U64 seq_count = 0; for(RDIM_LineSequenceNode *node = first_seq; node != 0; node = node->next) @@ -2209,7 +2209,7 @@ rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequence line_count += node->line_seq.line_count; } - RADDBGI_U64 key_count = line_count + seq_count; + RDI_U64 key_count = line_count + seq_count; RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); @@ -2224,10 +2224,10 @@ rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequence RDIM_PathNode *src_path = rdim_paths_node_from_path(bctx, node->line_seq.file_name); RDIM_SrcNode *src_file = rdim_paths_src_node_from_path_node(bctx, src_path); - RADDBGI_U32 file_id = src_file->idx; + RDI_U32 file_id = src_file->idx; - RADDBGI_U64 node_line_count = node->line_seq.line_count; - for(RADDBGI_U64 i = 0; i < node_line_count; i += 1){ + RDI_U64 node_line_count = node->line_seq.line_count; + for(RDI_U64 i = 0; i < node_line_count; i += 1){ key_ptr->key = node->line_seq.voffs[i]; key_ptr->val = rec_ptr; key_ptr += 1; @@ -2258,14 +2258,14 @@ rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequence // null record first, and no more than one null record and one non-null record // arrange output - RADDBGI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RADDBGI_U64, key_count + 1); - RADDBGI_Line *arranged_lines = rdim_push_array_no_zero(arena, RADDBGI_Line, key_count); + RDI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RDI_U64, key_count + 1); + RDI_Line *arranged_lines = rdim_push_array_no_zero(arena, RDI_Line, key_count); - for(RADDBGI_U64 i = 0; i < key_count; i += 1){ + for(RDI_U64 i = 0; i < key_count; i += 1){ arranged_voffs[i] = sorted_line_keys[i].key; } arranged_voffs[key_count] = ~0ull; - for(RADDBGI_U64 i = 0; i < key_count; i += 1){ + for(RDI_U64 i = 0; i < key_count; i += 1){ RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; if(rec != 0){ arranged_lines[i].file_idx = rec->file_id; @@ -2289,7 +2289,7 @@ rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequence //- rjf: per-src line info baking -RADDBGI_PROC RDIM_SrcLinesCombined* +RDI_PROC RDIM_SrcLinesCombined* rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -2297,11 +2297,11 @@ rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first) // gather line number map RDIM_SrcLineMapBucket *first_bucket = 0; RDIM_SrcLineMapBucket *last_bucket = 0; - RADDBGI_U64 line_hash_slots_count = 1024; + RDI_U64 line_hash_slots_count = 1024; RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); - RADDBGI_U64 line_count = 0; - RADDBGI_U64 voff_count = 0; - RADDBGI_U64 max_line_num = 0; + RDI_U64 line_count = 0; + RDI_U64 voff_count = 0; + RDI_U64 max_line_num = 0; { for(RDIM_LineMapFragment *map_fragment = first; map_fragment != 0; @@ -2309,13 +2309,13 @@ rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first) { RDIM_LineSequence *sequence = &map_fragment->sequence->line_seq; - RADDBGI_U64 *seq_voffs = sequence->voffs; - RADDBGI_U32 *seq_line_nums = sequence->line_nums; - RADDBGI_U64 seq_line_count = sequence->line_count; - for(RADDBGI_U64 i = 0; i < seq_line_count; i += 1){ - RADDBGI_U32 line_num = seq_line_nums[i]; - RADDBGI_U64 voff = seq_voffs[i]; - RADDBGI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; + RDI_U64 *seq_voffs = sequence->voffs; + RDI_U32 *seq_line_nums = sequence->line_nums; + RDI_U64 seq_line_count = sequence->line_count; + for(RDI_U64 i = 0; i < seq_line_count; i += 1){ + RDI_U32 line_num = seq_line_nums[i]; + RDI_U64 voff = seq_voffs[i]; + RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; // update unique voff counter & max line number voff_count += 1; @@ -2370,14 +2370,14 @@ rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first) RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); // bake result - RADDBGI_U32 *line_nums = rdim_push_array_no_zero(arena, RADDBGI_U32, line_count); - RADDBGI_U32 *line_ranges = rdim_push_array_no_zero(arena, RADDBGI_U32, line_count + 1); - RADDBGI_U64 *voffs = rdim_push_array_no_zero(arena, RADDBGI_U64, voff_count); + RDI_U32 *line_nums = rdim_push_array_no_zero(arena, RDI_U32, line_count); + RDI_U32 *line_ranges = rdim_push_array_no_zero(arena, RDI_U32, line_count + 1); + RDI_U64 *voffs = rdim_push_array_no_zero(arena, RDI_U64, voff_count); { - RADDBGI_U64 *voff_ptr = voffs; - for(RADDBGI_U32 i = 0; i < line_count; i += 1){ + RDI_U64 *voff_ptr = voffs; + for(RDI_U32 i = 0; i < line_count; i += 1){ line_nums[i] = sorted_keys[i].key; - line_ranges[i] = (RADDBGI_U32)(voff_ptr - voffs); + line_ranges[i] = (RDI_U32)(voff_ptr - voffs); RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; @@ -2401,8 +2401,8 @@ rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first) } //- rjf: vmap baking -RADDBGI_PROC RDIM_VMap* -rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RADDBGI_U64 marker_count) +RDI_PROC RDIM_VMap* +rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -2410,18 +2410,18 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, marker_count); // determine if an extra vmap entry for zero is needed - RADDBGI_U32 extra_vmap_entry = 0; + RDI_U32 extra_vmap_entry = 0; if(marker_count > 0 && sorted_keys[0].key != 0){ extra_vmap_entry = 1; } // fill output vmap entries - RADDBGI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; - RADDBGI_VMapEntry *vmap = rdim_push_array_no_zero(arena, RADDBGI_VMapEntry, vmap_count_raw + 1); - RADDBGI_U32 vmap_entry_count_pass_1 = 0; + RDI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; + RDI_VMapEntry *vmap = rdim_push_array_no_zero(arena, RDI_VMapEntry, vmap_count_raw + 1); + RDI_U32 vmap_entry_count_pass_1 = 0; { - RADDBGI_VMapEntry *vmap_ptr = vmap; + RDI_VMapEntry *vmap_ptr = vmap; if(extra_vmap_entry){ vmap_ptr->voff = 0; @@ -2436,18 +2436,18 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey RDIM_SortKey *key_opl = sorted_keys + marker_count; for(;key_ptr < key_opl;){ // get initial map state from tracker stack - RADDBGI_U32 initial_idx = (RADDBGI_U32)0xffffffff; + RDI_U32 initial_idx = (RDI_U32)0xffffffff; if(tracker_stack != 0){ initial_idx = tracker_stack->idx; } // update tracker stack // * we must process _all_ of the changes that apply at this voff before moving on - RADDBGI_U64 voff = key_ptr->key; + RDI_U64 voff = key_ptr->key; for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ RDIM_VMapMarker *marker = (RDIM_VMapMarker*)key_ptr->val; - RADDBGI_U32 idx = marker->idx; + RDI_U32 idx = marker->idx; // push to stack if(marker->begin_range){ @@ -2483,7 +2483,7 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey } // get final map state from tracker stack - RADDBGI_U32 final_idx = 0; + RDI_U32 final_idx = 0; if(tracker_stack != 0){ final_idx = tracker_stack->idx; } @@ -2496,7 +2496,7 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey } } - vmap_entry_count_pass_1 = (RADDBGI_U32)(vmap_ptr - vmap); + vmap_entry_count_pass_1 = (RDI_U32)(vmap_ptr - vmap); } // replace zero unit indexes that follow a non-zero @@ -2504,12 +2504,12 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey if(0) { // (the last entry is not replaced because it acts as a terminator) - RADDBGI_U32 last = vmap_entry_count_pass_1 - 1; + RDI_U32 last = vmap_entry_count_pass_1 - 1; - RADDBGI_VMapEntry *vmap_ptr = vmap; - RADDBGI_U64 real_idx = 0; + RDI_VMapEntry *vmap_ptr = vmap; + RDI_U64 real_idx = 0; - for(RADDBGI_U32 i = 0; i < last; i += 1, vmap_ptr += 1){ + for(RDI_U32 i = 0; i < last; i += 1, vmap_ptr += 1){ // is this a zero after a real index? if(vmap_ptr->idx == 0){ vmap_ptr->idx = real_idx; @@ -2523,22 +2523,22 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey } // combine duplicate neighbors - RADDBGI_U32 vmap_entry_count = 0; + RDI_U32 vmap_entry_count = 0; { - RADDBGI_VMapEntry *vmap_ptr = vmap; - RADDBGI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; - RADDBGI_VMapEntry *vmap_out = vmap; + RDI_VMapEntry *vmap_ptr = vmap; + RDI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; + RDI_VMapEntry *vmap_out = vmap; for(;vmap_ptr < vmap_opl;){ - RADDBGI_VMapEntry *vmap_range_first = vmap_ptr; - RADDBGI_U64 idx = vmap_ptr->idx; + RDI_VMapEntry *vmap_range_first = vmap_ptr; + RDI_U64 idx = vmap_ptr->idx; vmap_ptr += 1; for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; rdim_memcpy_struct(vmap_out, vmap_range_first); vmap_out += 1; } - vmap_entry_count = (RADDBGI_U32)(vmap_out - vmap); + vmap_entry_count = (RDI_U32)(vmap_out - vmap); } // fill result @@ -2551,13 +2551,13 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey return result; } -RADDBGI_PROC RDIM_VMap* -rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RADDBGI_U64 count) +RDI_PROC RDIM_VMap* +rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RDI_U64 count) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); // count necessary markers - RADDBGI_U64 marker_count = count*2; + RDI_U64 marker_count = count*2; // fill markers RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); @@ -2570,7 +2570,7 @@ rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RADDBGI range != 0; range = range->next){ if(range->first < range->opl){ - RADDBGI_U32 unit_idx = range->unit->idx; + RDI_U32 unit_idx = range->unit->idx; key_ptr->key = range->first; key_ptr->val = marker_ptr; @@ -2597,33 +2597,33 @@ rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RADDBGI //- rjf: type info baking -RADDBGI_PROC RADDBGI_U32* -rdim_idx_run_from_types(RDIM_Arena *arena, RDIM_Type **types, RADDBGI_U32 count) +RDI_PROC RDI_U32* +rdim_idx_run_from_types(RDIM_Arena *arena, RDIM_Type **types, RDI_U32 count) { - RADDBGI_U32 *result = rdim_push_array(arena, RADDBGI_U32, count); - for(RADDBGI_U32 i = 0; i < count; i += 1){ + RDI_U32 *result = rdim_push_array(arena, RDI_U32, count); + for(RDI_U32 i = 0; i < count; i += 1){ result[i] = types[i]->idx; } return result; } -RADDBGI_PROC RDIM_TypeData* +RDI_PROC RDIM_TypeData* rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); // fill type nodes - RADDBGI_U32 type_count = root->type_count; - RADDBGI_TypeNode *type_nodes = rdim_push_array_no_zero(arena, RADDBGI_TypeNode, type_count); + RDI_U32 type_count = root->type_count; + RDI_TypeNode *type_nodes = rdim_push_array_no_zero(arena, RDI_TypeNode, type_count); { - RADDBGI_TypeNode *ptr = type_nodes; - RADDBGI_TypeNode *opl = ptr + type_count; + RDI_TypeNode *ptr = type_nodes; + RDI_TypeNode *opl = ptr + type_count; RDIM_Type *loose_type = root->first_type; for(;loose_type != 0 && ptr < opl; loose_type = loose_type->next_order, ptr += 1){ - RADDBGI_TypeKind kind = loose_type->kind; + RDI_TypeKind kind = loose_type->kind; // shared ptr->kind = kind; @@ -2631,34 +2631,34 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) ptr->byte_size = loose_type->byte_size; // built-in - if(RADDBGI_TypeKind_FirstBuiltIn <= kind && kind <= RADDBGI_TypeKind_LastBuiltIn){ + if(RDI_TypeKind_FirstBuiltIn <= kind && kind <= RDI_TypeKind_LastBuiltIn){ ptr->built_in.name_string_idx = rdim_string(bctx, loose_type->name); } // constructed - else if(RADDBGI_TypeKind_FirstConstructed <= kind && kind <= RADDBGI_TypeKind_LastConstructed){ + else if(RDI_TypeKind_FirstConstructed <= kind && kind <= RDI_TypeKind_LastConstructed){ ptr->constructed.direct_type_idx = loose_type->direct_type->idx; switch (kind){ - case RADDBGI_TypeKind_Array: + case RDI_TypeKind_Array: { ptr->constructed.count = loose_type->count; }break; - case RADDBGI_TypeKind_Function: + case RDI_TypeKind_Function: { // parameters - RADDBGI_U32 count = loose_type->count; - RADDBGI_U32 *idx_run = rdim_idx_run_from_types(scratch.arena, loose_type->param_types, count); + RDI_U32 count = loose_type->count; + RDI_U32 *idx_run = rdim_idx_run_from_types(scratch.arena, loose_type->param_types, count); ptr->constructed.param_idx_run_first = rdim_idx_run(bctx, idx_run, count); ptr->constructed.count = count; }break; - case RADDBGI_TypeKind_Method: + case RDI_TypeKind_Method: { // parameters - RADDBGI_U32 count = loose_type->count; - RADDBGI_U32 *idx_run = rdim_idx_run_from_types(scratch.arena, loose_type->param_types, count); + RDI_U32 count = loose_type->count; + RDI_U32 *idx_run = rdim_idx_run_from_types(scratch.arena, loose_type->param_types, count); ptr->constructed.param_idx_run_first = rdim_idx_run(bctx, idx_run, count); ptr->constructed.count = count; }break; @@ -2666,7 +2666,7 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) } // user-defined - else if(RADDBGI_TypeKind_FirstUserDefined <= kind && kind <= RADDBGI_TypeKind_LastUserDefined){ + else if(RDI_TypeKind_FirstUserDefined <= kind && kind <= RDI_TypeKind_LastUserDefined){ ptr->user_defined.name_string_idx = rdim_string(bctx, loose_type->name); if(loose_type->udt != 0){ ptr->user_defined.udt_idx = loose_type->udt->idx; @@ -2677,7 +2677,7 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) } // bitfield - else if(kind == RADDBGI_TypeKind_Bitfield){ + else if(kind == RDI_TypeKind_Bitfield){ ptr->bitfield.off = loose_type->off; ptr->bitfield.size = loose_type->count; } @@ -2692,24 +2692,24 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) // fill udts - RADDBGI_U32 udt_count = root->type_udt_count; - RADDBGI_UDT *udts = rdim_push_array_no_zero(arena, RADDBGI_UDT, udt_count); + RDI_U32 udt_count = root->type_udt_count; + RDI_UDT *udts = rdim_push_array_no_zero(arena, RDI_UDT, udt_count); - RADDBGI_U32 member_count = root->total_member_count; - RADDBGI_Member *members = rdim_push_array_no_zero(arena, RADDBGI_Member, member_count); + RDI_U32 member_count = root->total_member_count; + RDI_Member *members = rdim_push_array_no_zero(arena, RDI_Member, member_count); - RADDBGI_U32 enum_member_count = root->total_enum_val_count; - RADDBGI_EnumMember *enum_members = rdim_push_array_no_zero(arena, RADDBGI_EnumMember, enum_member_count); + RDI_U32 enum_member_count = root->total_enum_val_count; + RDI_EnumMember *enum_members = rdim_push_array_no_zero(arena, RDI_EnumMember, enum_member_count); { - RADDBGI_UDT *ptr = udts; - RADDBGI_UDT *opl = ptr + udt_count; + RDI_UDT *ptr = udts; + RDI_UDT *opl = ptr + udt_count; - RADDBGI_Member *member_ptr = members; - RADDBGI_Member *member_opl = members + member_count; + RDI_Member *member_ptr = members; + RDI_Member *member_opl = members + member_count; - RADDBGI_EnumMember *enum_member_ptr = enum_members; - RADDBGI_EnumMember *enum_member_opl = enum_members + enum_member_count; + RDI_EnumMember *enum_member_ptr = enum_members; + RDI_EnumMember *enum_member_opl = enum_members + enum_member_count; RDIM_TypeUDT *loose_udt = root->first_udt; for(;loose_udt != 0 && ptr < opl; @@ -2721,14 +2721,14 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) // enum members if(loose_udt->enum_val_count != 0){ - ptr->flags |= RADDBGI_UserDefinedTypeFlag_EnumMembers; + ptr->flags |= RDI_UserDefinedTypeFlag_EnumMembers; - ptr->member_first = (RADDBGI_U32)(enum_member_ptr - enum_members); + ptr->member_first = (RDI_U32)(enum_member_ptr - enum_members); ptr->member_count = loose_udt->enum_val_count; - RADDBGI_U32 local_enum_val_count = loose_udt->enum_val_count; + RDI_U32 local_enum_val_count = loose_udt->enum_val_count; RDIM_TypeEnumVal *loose_enum_val = loose_udt->first_enum_val; - for(RADDBGI_U32 i = 0; + for(RDI_U32 i = 0; i < local_enum_val_count; i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ enum_member_ptr->name_string_idx = rdim_string(bctx, loose_enum_val->name); @@ -2738,12 +2738,12 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) // struct/class/union members else{ - ptr->member_first = (RADDBGI_U32)(member_ptr - members); + ptr->member_first = (RDI_U32)(member_ptr - members); ptr->member_count = loose_udt->member_count; - RADDBGI_U32 local_member_count = loose_udt->member_count; + RDI_U32 local_member_count = loose_udt->member_count; RDIM_TypeMember *loose_member = loose_udt->first_member; - for(RADDBGI_U32 i = 0; + for(RDI_U32 i = 0; i < local_member_count; i += 1, member_ptr += 1, loose_member = loose_member->next){ member_ptr->kind = loose_member->kind; @@ -2753,7 +2753,7 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) member_ptr->type_idx = loose_member->type->idx; // TODO(allen): - if(loose_member->kind == RADDBGI_MemberKind_Method){ + if(loose_member->kind == RDI_MemberKind_Method){ //loose_member_ptr->unit_idx = ; //loose_member_ptr->proc_symbol_idx = ; } @@ -2761,7 +2761,7 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) } - RADDBGI_U32 file_idx = 0; + RDI_U32 file_idx = 0; if(loose_udt->source_path.size > 0){ RDIM_PathNode *path_node = rdim_paths_node_from_path(bctx, loose_udt->source_path); RDIM_SrcNode *src_node = rdim_paths_src_node_from_path_node(bctx, path_node); @@ -2798,30 +2798,30 @@ rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) //- rjf: symbol data baking -RADDBGI_PROC RDIM_SymbolData* +RDI_PROC RDIM_SymbolData* rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); // count symbol kinds - RADDBGI_U32 globalvar_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_GlobalVariable]; - RADDBGI_U32 threadvar_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_ThreadVariable]; - RADDBGI_U32 procedure_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_Procedure]; + RDI_U32 globalvar_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_GlobalVariable]; + RDI_U32 threadvar_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_ThreadVariable]; + RDI_U32 procedure_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_Procedure]; // allocate symbol arrays - RADDBGI_GlobalVariable *global_variables = - rdim_push_array(arena, RADDBGI_GlobalVariable, globalvar_count); + RDI_GlobalVariable *global_variables = + rdim_push_array(arena, RDI_GlobalVariable, globalvar_count); - RADDBGI_ThreadVariable *thread_variables = - rdim_push_array(arena, RADDBGI_ThreadVariable, threadvar_count); + RDI_ThreadVariable *thread_variables = + rdim_push_array(arena, RDI_ThreadVariable, threadvar_count); - RADDBGI_Procedure *procedures = rdim_push_array(arena, RADDBGI_Procedure, procedure_count); + RDI_Procedure *procedures = rdim_push_array(arena, RDI_Procedure, procedure_count); // fill symbol arrays { - RADDBGI_GlobalVariable *global_ptr = global_variables; - RADDBGI_ThreadVariable *thread_local_ptr = thread_variables; - RADDBGI_Procedure *procedure_ptr = procedures; + RDI_GlobalVariable *global_ptr = global_variables; + RDI_ThreadVariable *thread_local_ptr = thread_variables; + RDI_Procedure *procedure_ptr = procedures; // nils global_ptr += 1; @@ -2832,23 +2832,23 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) for(RDIM_Symbol *node = root->first_symbol; node != 0; node = node->next_order){ - RADDBGI_U32 name_string_idx = rdim_string(bctx, node->name); - RADDBGI_U32 link_name_string_idx = rdim_string(bctx, node->link_name); - RADDBGI_U32 type_idx = node->type->idx; + RDI_U32 name_string_idx = rdim_string(bctx, node->name); + RDI_U32 link_name_string_idx = rdim_string(bctx, node->link_name); + RDI_U32 type_idx = node->type->idx; - RADDBGI_LinkFlags link_flags = 0; - RADDBGI_U32 container_idx = 0; + RDI_LinkFlags link_flags = 0; + RDI_U32 container_idx = 0; { if(node->is_extern){ - link_flags |= RADDBGI_LinkFlag_External; + link_flags |= RDI_LinkFlag_External; } if(node->container_symbol != 0){ container_idx = node->container_symbol->idx; - link_flags |= RADDBGI_LinkFlag_ProcScoped; + link_flags |= RDI_LinkFlag_ProcScoped; } else if(node->container_type != 0 && node->container_type->udt != 0){ container_idx = node->container_type->udt->idx; - link_flags |= RADDBGI_LinkFlag_TypeScoped; + link_flags |= RDI_LinkFlag_TypeScoped; } } @@ -2869,7 +2869,7 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) { thread_local_ptr->name_string_idx = name_string_idx; thread_local_ptr->link_flags = link_flags; - thread_local_ptr->tls_off = (RADDBGI_U32)node->offset; + thread_local_ptr->tls_off = (RDI_U32)node->offset; thread_local_ptr->type_idx = type_idx; thread_local_ptr->container_idx = container_idx; thread_local_ptr += 1; @@ -2897,7 +2897,7 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) RDIM_VMap *global_vmap = 0; { // count necessary markers - RADDBGI_U32 marker_count = globalvar_count*2; + RDI_U32 marker_count = globalvar_count*2; // fill markers RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); @@ -2911,10 +2911,10 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) node != 0; node = node->next_order){ if(node->kind == RDIM_SymbolKind_GlobalVariable){ - RADDBGI_U32 global_idx = node->idx; + RDI_U32 global_idx = node->idx; - RADDBGI_U64 first = node->offset; - RADDBGI_U64 opl = first + node->type->byte_size; + RDI_U64 first = node->offset; + RDI_U64 opl = first + node->type->byte_size; key_ptr->key = first; key_ptr->val = marker_ptr; @@ -2934,10 +2934,10 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) // nil global { - RADDBGI_U32 global_idx = 0; + RDI_U32 global_idx = 0; - RADDBGI_U64 first = 0; - RADDBGI_U64 opl = (RADDBGI_U64)0xffffffffffffffffull; + RDI_U64 first = 0; + RDI_U64 opl = (RDI_U64)0xffffffffffffffffull; key_ptr->key = first; key_ptr->val = marker_ptr; @@ -2971,35 +2971,35 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) root->first_scope->next_sibling == 0 && root->first_scope->range_count == 0); - RADDBGI_U32 scope_count = root->scope_count; - RADDBGI_Scope *scopes = rdim_push_array(arena, RADDBGI_Scope, scope_count); + RDI_U32 scope_count = root->scope_count; + RDI_Scope *scopes = rdim_push_array(arena, RDI_Scope, scope_count); - RADDBGI_U32 scope_voff_count = root->scope_voff_count; - RADDBGI_U64 *scope_voffs = rdim_push_array(arena, RADDBGI_U64, scope_voff_count); + RDI_U32 scope_voff_count = root->scope_voff_count; + RDI_U64 *scope_voffs = rdim_push_array(arena, RDI_U64, scope_voff_count); - RADDBGI_U32 local_count = root->local_count; - RADDBGI_Local *locals = rdim_push_array(arena, RADDBGI_Local, local_count); + RDI_U32 local_count = root->local_count; + RDI_Local *locals = rdim_push_array(arena, RDI_Local, local_count); - RADDBGI_U32 location_block_count = root->location_count; - RADDBGI_LocationBlock *location_blocks = - rdim_push_array(arena, RADDBGI_LocationBlock, location_block_count); + RDI_U32 location_block_count = root->location_count; + RDI_LocationBlock *location_blocks = + rdim_push_array(arena, RDI_LocationBlock, location_block_count); RDIM_String8List location_data = {0}; // iterate scopes, locals, and locations // fill scope voffs, locals, and location information { - RADDBGI_Scope *scope_ptr = scopes; - RADDBGI_U64 *scope_voff_ptr = scope_voffs; - RADDBGI_Local *local_ptr = locals; - RADDBGI_LocationBlock *location_block_ptr = location_blocks; + RDI_Scope *scope_ptr = scopes; + RDI_U64 *scope_voff_ptr = scope_voffs; + RDI_Local *local_ptr = locals; + RDI_LocationBlock *location_block_ptr = location_blocks; for(RDIM_Scope *node = root->first_scope; node != 0; node = node->next_order, scope_ptr += 1){ // emit voffs - RADDBGI_U32 voff_first = (RADDBGI_U32)(scope_voff_ptr - scope_voffs); + RDI_U32 voff_first = (RDI_U32)(scope_voff_ptr - scope_voffs); for(RDIM_VOffRange *range = node->first_range; range != 0; range = range->next){ @@ -3008,11 +3008,11 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) *scope_voff_ptr = range->voff_opl; scope_voff_ptr += 1; } - RADDBGI_U32 voff_opl = (RADDBGI_U32)(scope_voff_ptr - scope_voffs); + RDI_U32 voff_opl = (RDI_U32)(scope_voff_ptr - scope_voffs); // emit locals - RADDBGI_U32 scope_local_count = node->local_count; - RADDBGI_U32 scope_local_first = (RADDBGI_U32)(local_ptr - locals); + RDI_U32 scope_local_count = node->local_count; + RDI_U32 scope_local_first = (RDI_U32)(local_ptr - locals); for(RDIM_Local *slocal = node->first_local; slocal != 0; slocal = slocal->next, local_ptr += 1){ @@ -3022,8 +3022,8 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) RDIM_LocationSet *locset = slocal->locset; if(locset != 0){ - RADDBGI_U32 location_first = (RADDBGI_U32)(location_block_ptr - location_blocks); - RADDBGI_U32 location_opl = location_first + locset->location_case_count; + RDI_U32 location_first = (RDI_U32)(location_block_ptr - location_blocks); + RDI_U32 location_opl = location_first + locset->location_case_count; local_ptr->location_first = location_first; local_ptr->location_opl = location_opl; @@ -3037,7 +3037,7 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) RDIM_Location *location = location_case->location; if(location == 0){ - RADDBGI_U64 data = 0; + RDI_U64 data = 0; str8_serial_push_align(scratch.arena, &location_data, 8); str8_serial_push_data(scratch.arena, &location_data, &data, 1); } @@ -3045,44 +3045,44 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) switch (location->kind){ default: { - RADDBGI_U64 data = 0; + RDI_U64 data = 0; str8_serial_push_align(scratch.arena, &location_data, 8); str8_serial_push_data(scratch.arena, &location_data, &data, 1); }break; - case RADDBGI_LocationKind_AddrBytecodeStream: - case RADDBGI_LocationKind_ValBytecodeStream: + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: { rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&location->kind))); for(RDIM_EvalBytecodeOp *op_node = location->bytecode.first_op; op_node != 0; op_node = op_node->next){ - RADDBGI_U8 op_data[9]; + RDI_U8 op_data[9]; op_data[0] = op_node->op; rdim_memcpy(op_data + 1, &op_node->p, op_node->p_size); RDIM_String8 op_data_str = rdim_str8(op_data, 1 + op_node->p_size); rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, op_data_str)); } { - RADDBGI_U64 data = 0; - RDIM_String8 data_str = rdim_str8((RADDBGI_U8 *)&data, 1); + RDI_U64 data = 0; + RDIM_String8 data_str = rdim_str8((RDI_U8 *)&data, 1); rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, data_str)); } }break; - case RADDBGI_LocationKind_AddrRegisterPlusU16: - case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: + case RDI_LocationKind_AddrRegisterPlusU16: + case RDI_LocationKind_AddrAddrRegisterPlusU16: { - RADDBGI_LocationRegisterPlusU16 loc = {0}; + RDI_LocationRegisterPlusU16 loc = {0}; loc.kind = location->kind; loc.register_code = location->register_code; loc.offset = location->offset; rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); }break; - case RADDBGI_LocationKind_ValRegister: + case RDI_LocationKind_ValRegister: { - RADDBGI_LocationRegister loc = {0}; + RDI_LocationRegister loc = {0}; loc.kind = location->kind; loc.register_code = location->register_code; rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); @@ -3123,7 +3123,7 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) RDIM_VMap *scope_vmap = 0; { // count necessary markers - RADDBGI_U32 marker_count = scope_voff_count; + RDI_U32 marker_count = scope_voff_count; // fill markers RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); @@ -3135,7 +3135,7 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) for(RDIM_Scope *node = root->first_scope; node != 0; node = node->next_order){ - RADDBGI_U32 scope_idx = node->idx; + RDI_U32 scope_idx = node->idx; for(RDIM_VOffRange *range = node->first_range; range != 0; @@ -3186,21 +3186,21 @@ rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) //- rjf: name map baking -RADDBGI_PROC RDIM_NameMapBaked* +RDI_PROC RDIM_NameMapBaked* rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_NameMap *map) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - RADDBGI_U32 bucket_count = map->name_count; - RADDBGI_U32 node_count = map->name_count; + RDI_U32 bucket_count = map->name_count; + RDI_U32 node_count = map->name_count; // setup the final bucket layouts RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, bucket_count); for(RDIM_NameMapNode *node = map->first; node != 0; node = node->order_next){ - RADDBGI_U64 hash = raddbgi_hash(node->string.str, node->string.size); - RADDBGI_U64 bi = hash%bucket_count; + RDI_U64 hash = rdi_hash(node->string.str, node->string.size); + RDI_U64 bi = hash%bucket_count; RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); snode->node = node; @@ -3208,15 +3208,15 @@ rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_ } // allocate tables - RADDBGI_NameMapBucket *buckets = rdim_push_array(arena, RADDBGI_NameMapBucket, bucket_count); - RADDBGI_NameMapNode *nodes = rdim_push_array_no_zero(arena, RADDBGI_NameMapNode, node_count); + RDI_NameMapBucket *buckets = rdim_push_array(arena, RDI_NameMapBucket, bucket_count); + RDI_NameMapNode *nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, node_count); // convert to serialized buckets & nodes { - RADDBGI_NameMapBucket *bucket_ptr = buckets; - RADDBGI_NameMapNode *node_ptr = nodes; - for(RADDBGI_U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ - bucket_ptr->first_node = (RADDBGI_U32)(node_ptr - nodes); + RDI_NameMapBucket *bucket_ptr = buckets; + RDI_NameMapNode *node_ptr = nodes; + for(RDI_U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ + bucket_ptr->first_node = (RDI_U32)(node_ptr - nodes); bucket_ptr->node_count = sbuckets[i].count; for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; @@ -3225,20 +3225,20 @@ rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_ RDIM_NameMapNode *node = snode->node; // cons name and index(es) - RADDBGI_U32 string_idx = rdim_string(bctx, node->string); - RADDBGI_U32 match_count = node->idx_count; - RADDBGI_U32 idx = 0; + RDI_U32 string_idx = rdim_string(bctx, node->string); + RDI_U32 match_count = node->idx_count; + RDI_U32 idx = 0; if(match_count == 1){ idx = node->idx_first->idx[0]; } else{ - RADDBGI_U64 temp_pos = rdim_arena_pos(scratch.arena); - RADDBGI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RADDBGI_U32, match_count); - RADDBGI_U32 *idx_ptr = idx_run; + RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); + RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); + RDI_U32 *idx_ptr = idx_run; for(RDIM_NameMapIdxNode *idxnode = node->idx_first; idxnode != 0; idxnode = idxnode->next){ - for(RADDBGI_U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ + for(RDI_U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ if(idxnode->idx[i] == 0){ goto dblbreak; } @@ -3274,14 +3274,14 @@ rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_ //- rjf: top-level baking entry point -RADDBGI_PROC void +RDI_PROC void rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) { str8_serial_begin(arena, out); // setup cons helpers RDIM_DSections dss = {0}; - rdim_dsection(arena, &dss, 0, 0, RADDBGI_DataSectionTag_NULL); + rdim_dsection(arena, &dss, 0, 0, RDI_DataSectionTag_NULL); RDIM_BakeParams bctx_params = {0}; { @@ -3294,7 +3294,7 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) // MAIN PART: allocating and filling out sections of the file // top level info - RADDBGI_TopLevelInfo *tli = rdim_push_array(arena, RADDBGI_TopLevelInfo, 1); + RDI_TopLevelInfo *tli = rdim_push_array(arena, RDI_TopLevelInfo, 1); { RDIM_TopLevelInfo *rdim_tli = &root->top_level_info; tli->architecture = rdim_tli->architecture; @@ -3302,13 +3302,13 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) tli->exe_hash = rdim_tli->exe_hash; tli->voff_max = rdim_tli->voff_max; } - rdim_dsection(arena, &dss, tli, sizeof(*tli), RADDBGI_DataSectionTag_TopLevelInfo); + rdim_dsection(arena, &dss, tli, sizeof(*tli), RDI_DataSectionTag_TopLevelInfo); // binary sections array { - RADDBGI_U32 count = root->binary_section_count; - RADDBGI_BinarySection *sections = rdim_push_array(arena, RADDBGI_BinarySection, count); - RADDBGI_BinarySection *dsec = sections; + RDI_U32 count = root->binary_section_count; + RDI_BinarySection *sections = rdim_push_array(arena, RDI_BinarySection, count); + RDI_BinarySection *dsec = sections; for(RDIM_BinarySection *ssec = root->binary_section_first; ssec != 0; ssec = ssec->next, dsec += 1){ @@ -3319,7 +3319,7 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) dsec->foff_first = ssec->foff_first; dsec->foff_opl = ssec->foff_opl; } - rdim_dsection(arena, &dss, sections, sizeof(*sections)*count, RADDBGI_DataSectionTag_BinarySections); + rdim_dsection(arena, &dss, sections, sizeof(*sections)*count, RDI_DataSectionTag_BinarySections); } // units array @@ -3327,20 +3327,20 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) // * top-level unit information // * combining line info for whole unit { - RADDBGI_U32 count = root->unit_count; - RADDBGI_Unit *units = rdim_push_array(arena, RADDBGI_Unit, count); - RADDBGI_Unit *dunit = units; + RDI_U32 count = root->unit_count; + RDI_Unit *units = rdim_push_array(arena, RDI_Unit, count); + RDI_Unit *dunit = units; for(RDIM_Unit *sunit = root->unit_first; sunit != 0; sunit = sunit->next_order, dunit += 1){ // strings & paths - RADDBGI_U32 unit_name = rdim_string(bctx, sunit->unit_name); - RADDBGI_U32 cmp_name = rdim_string(bctx, sunit->compiler_name); + RDI_U32 unit_name = rdim_string(bctx, sunit->unit_name); + RDI_U32 cmp_name = rdim_string(bctx, sunit->compiler_name); - RADDBGI_U32 src_path = rdim_paths_idx_from_path(bctx, sunit->source_file); - RADDBGI_U32 obj_path = rdim_paths_idx_from_path(bctx, sunit->object_file); - RADDBGI_U32 archive_path = rdim_paths_idx_from_path(bctx, sunit->archive_file); - RADDBGI_U32 build_path = rdim_paths_idx_from_path(bctx, sunit->build_path); + RDI_U32 src_path = rdim_paths_idx_from_path(bctx, sunit->source_file); + RDI_U32 obj_path = rdim_paths_idx_from_path(bctx, sunit->object_file); + RDI_U32 archive_path = rdim_paths_idx_from_path(bctx, sunit->archive_file); + RDI_U32 build_path = rdim_paths_idx_from_path(bctx, sunit->build_path); dunit->unit_name_string_idx = unit_name; dunit->compiler_name_string_idx = cmp_name; @@ -3354,24 +3354,24 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) RDIM_LineSequenceNode *first_seq = sunit->line_seq_first; RDIM_UnitLinesCombined *lines = rdim_unit_combine_lines(arena, bctx, first_seq); - RADDBGI_U32 line_count = lines->line_count; + RDI_U32 line_count = lines->line_count; if(line_count > 0){ dunit->line_info_voffs_data_idx = - rdim_dsection(arena, &dss, lines->voffs, sizeof(RADDBGI_U64)*(line_count + 1), - RADDBGI_DataSectionTag_LineInfoVoffs); + rdim_dsection(arena, &dss, lines->voffs, sizeof(RDI_U64)*(line_count + 1), + RDI_DataSectionTag_LineInfoVoffs); dunit->line_info_data_idx = - rdim_dsection(arena, &dss, lines->lines, sizeof(RADDBGI_Line)*line_count, - RADDBGI_DataSectionTag_LineInfoData); + rdim_dsection(arena, &dss, lines->lines, sizeof(RDI_Line)*line_count, + RDI_DataSectionTag_LineInfoData); if(lines->cols != 0){ dunit->line_info_col_data_idx = - rdim_dsection(arena, &dss, lines->cols, sizeof(RADDBGI_Column)*line_count, - RADDBGI_DataSectionTag_LineInfoColumns); + rdim_dsection(arena, &dss, lines->cols, sizeof(RDI_Column)*line_count, + RDI_DataSectionTag_LineInfoColumns); } dunit->line_info_count = line_count; } } - rdim_dsection(arena, &dss, units, sizeof(*units)*count, RADDBGI_DataSectionTag_Units); + rdim_dsection(arena, &dss, units, sizeof(*units)*count, RDI_DataSectionTag_Units); } // source file line info baking @@ -3382,28 +3382,28 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) src_node = src_node->next){ RDIM_LineMapFragment *first_fragment = src_node->first_fragment; RDIM_SrcLinesCombined *lines = rdim_source_combine_lines(arena, first_fragment); - RADDBGI_U32 line_count = lines->line_count; + RDI_U32 line_count = lines->line_count; if(line_count > 0){ src_node->line_map_count = line_count; src_node->line_map_nums_data_idx = rdim_dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, - RADDBGI_DataSectionTag_LineMapNumbers); + RDI_DataSectionTag_LineMapNumbers); src_node->line_map_range_data_idx = rdim_dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), - RADDBGI_DataSectionTag_LineMapRanges); + RDI_DataSectionTag_LineMapRanges); src_node->line_map_voff_data_idx = rdim_dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, - RADDBGI_DataSectionTag_LineMapVoffs); + RDI_DataSectionTag_LineMapVoffs); } } // source file name mapping { - RDIM_NameMap* map = rdim_name_map_for_kind(root, RADDBGI_NameMapKind_NormalSourcePaths); + RDIM_NameMap* map = rdim_name_map_for_kind(root, RDI_NameMapKind_NormalSourcePaths); for(RDIM_SrcNode *src_node = bctx->tree->src_first; src_node != 0; src_node = src_node->next){ @@ -3419,87 +3419,87 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) root->unit_vmap_range_first, root->unit_vmap_range_count); - RADDBGI_U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); - rdim_dsection(arena, &dss, vmap->vmap, vmap_size, RADDBGI_DataSectionTag_UnitVmap); + RDI_U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); + rdim_dsection(arena, &dss, vmap->vmap, vmap_size, RDI_DataSectionTag_UnitVmap); } // type info baking { RDIM_TypeData *types = rdim_type_data_combine(arena, root, bctx); - RADDBGI_U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; - rdim_dsection(arena, &dss, types->type_nodes, type_nodes_size, RADDBGI_DataSectionTag_TypeNodes); + RDI_U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; + rdim_dsection(arena, &dss, types->type_nodes, type_nodes_size, RDI_DataSectionTag_TypeNodes); - RADDBGI_U64 udt_size = sizeof(*types->udts)*types->udt_count; - rdim_dsection(arena, &dss, types->udts, udt_size, RADDBGI_DataSectionTag_UDTs); + RDI_U64 udt_size = sizeof(*types->udts)*types->udt_count; + rdim_dsection(arena, &dss, types->udts, udt_size, RDI_DataSectionTag_UDTs); - RADDBGI_U64 member_size = sizeof(*types->members)*types->member_count; - rdim_dsection(arena, &dss, types->members, member_size, RADDBGI_DataSectionTag_Members); + RDI_U64 member_size = sizeof(*types->members)*types->member_count; + rdim_dsection(arena, &dss, types->members, member_size, RDI_DataSectionTag_Members); - RADDBGI_U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; - rdim_dsection(arena, &dss, types->enum_members, enum_member_size, RADDBGI_DataSectionTag_EnumMembers); + RDI_U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; + rdim_dsection(arena, &dss, types->enum_members, enum_member_size, RDI_DataSectionTag_EnumMembers); } // symbol info baking { RDIM_SymbolData *symbol_data = rdim_symbol_data_combine(arena, root, bctx); - RADDBGI_U64 global_variables_size = + RDI_U64 global_variables_size = sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; rdim_dsection(arena, &dss, symbol_data->global_variables, global_variables_size, - RADDBGI_DataSectionTag_GlobalVariables); + RDI_DataSectionTag_GlobalVariables); RDIM_VMap *global_vmap = symbol_data->global_vmap; - RADDBGI_U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); + RDI_U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); rdim_dsection(arena, &dss, global_vmap->vmap, global_vmap_size, - RADDBGI_DataSectionTag_GlobalVmap); + RDI_DataSectionTag_GlobalVmap); - RADDBGI_U64 thread_variables_size = + RDI_U64 thread_variables_size = sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; rdim_dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, - RADDBGI_DataSectionTag_ThreadVariables); + RDI_DataSectionTag_ThreadVariables); - RADDBGI_U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; + RDI_U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; rdim_dsection(arena, &dss, symbol_data->procedures, procedures_size, - RADDBGI_DataSectionTag_Procedures); + RDI_DataSectionTag_Procedures); - RADDBGI_U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; - rdim_dsection(arena, &dss, symbol_data->scopes, scopes_size, RADDBGI_DataSectionTag_Scopes); + RDI_U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; + rdim_dsection(arena, &dss, symbol_data->scopes, scopes_size, RDI_DataSectionTag_Scopes); - RADDBGI_U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; + RDI_U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; rdim_dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, - RADDBGI_DataSectionTag_ScopeVoffData); + RDI_DataSectionTag_ScopeVoffData); RDIM_VMap *scope_vmap = symbol_data->scope_vmap; - RADDBGI_U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); - rdim_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RADDBGI_DataSectionTag_ScopeVmap); + RDI_U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); + rdim_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RDI_DataSectionTag_ScopeVmap); - RADDBGI_U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; - rdim_dsection(arena, &dss, symbol_data->locals, local_size, RADDBGI_DataSectionTag_Locals); + RDI_U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; + rdim_dsection(arena, &dss, symbol_data->locals, local_size, RDI_DataSectionTag_Locals); - RADDBGI_U64 location_blocks_size = + RDI_U64 location_blocks_size = sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; rdim_dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, - RADDBGI_DataSectionTag_LocationBlocks); + RDI_DataSectionTag_LocationBlocks); - RADDBGI_U64 location_data_size = symbol_data->location_data_size; + RDI_U64 location_data_size = symbol_data->location_data_size; rdim_dsection(arena, &dss, symbol_data->location_data, location_data_size, - RADDBGI_DataSectionTag_LocationData); + RDI_DataSectionTag_LocationData); } // name map baking { - RADDBGI_U32 name_map_count = 0; - for(RADDBGI_U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ + RDI_U32 name_map_count = 0; + for(RDI_U32 i = 0; i < RDI_NameMapKind_COUNT; i += 1){ if(root->name_maps[i] != 0){ name_map_count += 1; } } - RADDBGI_NameMap *name_maps = rdim_push_array(arena, RADDBGI_NameMap, name_map_count); + RDI_NameMap *name_maps = rdim_push_array(arena, RDI_NameMap, name_map_count); - RADDBGI_NameMap *name_map_ptr = name_maps; - for(RADDBGI_U32 i = 0; i < RADDBGI_NameMapKind_COUNT; i += 1){ + RDI_NameMap *name_map_ptr = name_maps; + for(RDI_U32 i = 0; i < RDI_NameMapKind_COUNT; i += 1){ RDIM_NameMap *map = root->name_maps[i]; if(map != 0){ RDIM_NameMapBaked *baked = rdim_name_map_bake(arena, root, bctx, map); @@ -3507,16 +3507,16 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) name_map_ptr->kind = i; name_map_ptr->bucket_data_idx = rdim_dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, - RADDBGI_DataSectionTag_NameMapBuckets); + RDI_DataSectionTag_NameMapBuckets); name_map_ptr->node_data_idx = rdim_dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, - RADDBGI_DataSectionTag_NameMapNodes); + RDI_DataSectionTag_NameMapNodes); name_map_ptr += 1; } } rdim_dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, - RADDBGI_DataSectionTag_NameMaps); + RDI_DataSectionTag_NameMaps); } //////////////////////////////// @@ -3524,10 +3524,10 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) // generate data sections for file paths { - RADDBGI_U32 count = bctx->tree->count; - RADDBGI_FilePathNode *nodes = rdim_push_array(arena, RADDBGI_FilePathNode, count); + RDI_U32 count = bctx->tree->count; + RDI_FilePathNode *nodes = rdim_push_array(arena, RDI_FilePathNode, count); - RADDBGI_FilePathNode *out_node = nodes; + RDI_FilePathNode *out_node = nodes; for(RDIM_PathNode *node = bctx->tree->first; node != 0; node = node->next_order, out_node += 1){ @@ -3546,15 +3546,15 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) } } - rdim_dsection(arena, &dss, nodes, sizeof(*nodes)*count, RADDBGI_DataSectionTag_FilePathNodes); + rdim_dsection(arena, &dss, nodes, sizeof(*nodes)*count, RDI_DataSectionTag_FilePathNodes); } // generate data sections for files { - RADDBGI_U32 count = bctx->tree->src_count; - RADDBGI_SourceFile *src_files = rdim_push_array(arena, RADDBGI_SourceFile, count); + RDI_U32 count = bctx->tree->src_count; + RDI_SourceFile *src_files = rdim_push_array(arena, RDI_SourceFile, count); - RADDBGI_SourceFile *out_src_file = src_files; + RDI_SourceFile *out_src_file = src_files; for(RDIM_SrcNode *node = bctx->tree->src_first; node != 0; node = node->next, out_src_file += 1){ @@ -3566,16 +3566,16 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; } - rdim_dsection(arena, &dss, src_files, sizeof(*src_files)*count, RADDBGI_DataSectionTag_SourceFiles); + rdim_dsection(arena, &dss, src_files, sizeof(*src_files)*count, RDI_DataSectionTag_SourceFiles); } // generate data sections for strings { - RADDBGI_U32 *str_offs = rdim_push_array_no_zero(arena, RADDBGI_U32, bctx->strs.count + 1); + RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, bctx->strs.count + 1); - RADDBGI_U32 off_cursor = 0; + RDI_U32 off_cursor = 0; { - RADDBGI_U32 *off_ptr = str_offs; + RDI_U32 *off_ptr = str_offs; *off_ptr = 0; off_ptr += 1; for(RDIM_StringNode *node = bctx->strs.order_first; @@ -3587,9 +3587,9 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) } } - RADDBGI_U8 *buf = rdim_push_array(arena, RADDBGI_U8, off_cursor); + RDI_U8 *buf = rdim_push_array(arena, RDI_U8, off_cursor); { - RADDBGI_U8 *ptr = buf; + RDI_U8 *ptr = buf; for(RDIM_StringNode *node = bctx->strs.order_first; node != 0; node = node->order_next){ @@ -3599,17 +3599,17 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) } rdim_dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), - RADDBGI_DataSectionTag_StringTable); - rdim_dsection(arena, &dss, buf, off_cursor, RADDBGI_DataSectionTag_StringData); + RDI_DataSectionTag_StringTable); + rdim_dsection(arena, &dss, buf, off_cursor, RDI_DataSectionTag_StringData); } // generate data sections for index runs { - RADDBGI_U32 *idx_data = rdim_push_array_no_zero(arena, RADDBGI_U32, bctx->idxs.idx_count); + RDI_U32 *idx_data = rdim_push_array_no_zero(arena, RDI_U32, bctx->idxs.idx_count); { - RADDBGI_U32 *out_ptr = idx_data; - RADDBGI_U32 *opl = out_ptr + bctx->idxs.idx_count; + RDI_U32 *out_ptr = idx_data; + RDI_U32 *opl = out_ptr + bctx->idxs.idx_count; RDIM_IdxRunNode *node = bctx->idxs.order_first; for(;node != 0 && out_ptr < opl; node = node->order_next){ @@ -3620,28 +3620,28 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) } rdim_dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, - RADDBGI_DataSectionTag_IndexRuns); + RDI_DataSectionTag_IndexRuns); } // layout // * the header and data section table have to be initialized "out of order" // * so that the rest of the system can avoid this tricky order-layout interdependence stuff - RADDBGI_Header *header = rdim_push_array(arena, RADDBGI_Header, 1); - RADDBGI_DataSection *dstable = rdim_push_array(arena, RADDBGI_DataSection, dss.count); + RDI_Header *header = rdim_push_array(arena, RDI_Header, 1); + RDI_DataSection *dstable = rdim_push_array(arena, RDI_DataSection, dss.count); str8_serial_push_align(arena, out, 8); - RADDBGI_U64 header_off = out->total_size; + RDI_U64 header_off = out->total_size; str8_list_push(arena, out, str8_struct(header)); str8_serial_push_align(arena, out, 8); - RADDBGI_U64 data_section_off = out->total_size; - str8_list_push(arena, out, str8((RADDBGI_U8 *)dstable, sizeof(*dstable)*dss.count)); + RDI_U64 data_section_off = out->total_size; + str8_list_push(arena, out, str8((RDI_U8 *)dstable, sizeof(*dstable)*dss.count)); { - header->magic = RADDBGI_MAGIC_CONSTANT; - header->encoding_version = RADDBGI_ENCODING_VERSION; + header->magic = RDI_MAGIC_CONSTANT; + header->encoding_version = RDI_ENCODING_VERSION; header->data_section_off = data_section_off; header->data_section_count = dss.count; } { - RADDBGI_U64 test_dss_count = 0; + RDI_U64 test_dss_count = 0; for(RDIM_DSectionNode *node = dss.first; node != 0; node = node->next){ @@ -3649,19 +3649,19 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) } rdim_assert(test_dss_count == dss.count); - RADDBGI_DataSection *ptr = dstable; + RDI_DataSection *ptr = dstable; for(RDIM_DSectionNode *node = dss.first; node != 0; node = node->next, ptr += 1){ - RADDBGI_U64 data_section_offset = 0; + RDI_U64 data_section_offset = 0; if(node->size != 0) { str8_serial_push_align(arena, out, 8); data_section_offset = out->total_size; - str8_list_push(arena, out, str8((RADDBGI_U8 *)node->data, node->size)); + str8_list_push(arena, out, str8((RDI_U8 *)node->data, node->size)); } ptr->tag = node->tag; - ptr->encoding = RADDBGI_DataSectionEncoding_Unpacked; + ptr->encoding = RDI_DataSectionEncoding_Unpacked; ptr->off = data_section_offset; ptr->encoded_size = node->size; ptr->unpacked_size = node->size; diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index f8be19d1..d2c2fba9 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1,6 +1,13 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////////////////////////////////////// +// RAD Debug Info Make, (R)AD(D)BG(I) (M)ake Library +// +// Library for building loose data structures which contain +// RADDBGI debug information, and baking that down into the +// proper flattened RADDBGI format. + #ifndef RADDBGI_MAKE_H #define RADDBGI_MAKE_H @@ -68,8 +75,8 @@ typedef struct RDIM_String8 RDIM_String8; struct RDIM_String8 { - RADDBGI_U8 *str; - RADDBGI_U64 size; + RDI_U8 *str; + RDI_U64 size; }; #endif @@ -96,12 +103,12 @@ struct RDIM_String8List { RDIM_String8Node *first; RDIM_String8Node *last; - RADDBGI_U64 node_count; - RADDBGI_U64 total_size; + RDI_U64 node_count; + RDI_U64 total_size; }; #endif -typedef RADDBGI_U32 RDIM_StringMatchFlags; +typedef RDI_U32 RDIM_StringMatchFlags; enum { RDIM_StringMatchFlag_CaseInsensitive = (1<<0), @@ -127,12 +134,12 @@ struct RDIM_Arena { RDIM_Arena *prev; RDIM_Arena *current; - RADDBGI_U64 base_pos; - RADDBGI_U64 pos; - RADDBGI_U64 cmt; - RADDBGI_U64 res; - RADDBGI_U64 align; - RADDBGI_S8 grow; + RDI_U64 base_pos; + RDI_U64 pos; + RDI_U64 cmt; + RDI_U64 res; + RDI_U64 align; + RDI_S8 grow; }; #endif @@ -167,7 +174,7 @@ typedef struct RDIM_Temp RDIM_Temp; struct RDIM_Temp { RDIM_Arena *arena; - RADDBGI_U64 pos; + RDI_U64 pos; }; #define rdim_temp_arena(t) ((t).arena) #endif @@ -284,7 +291,7 @@ struct RDIM_ErrorList { RDIM_Error *first; RDIM_Error *last; - RADDBGI_U64 count; + RDI_U64 count; }; //////////////////////////////// @@ -296,8 +303,8 @@ typedef struct RDIM_U64ToPtrNode RDIM_U64ToPtrNode; struct RDIM_U64ToPtrNode { RDIM_U64ToPtrNode *next; - RADDBGI_U64 _padding_; - RADDBGI_U64 key[1]; + RDI_U64 _padding_; + RDI_U64 key[1]; void *ptr[1]; }; @@ -305,9 +312,9 @@ typedef struct RDIM_U64ToPtrMap RDIM_U64ToPtrMap; struct RDIM_U64ToPtrMap { RDIM_U64ToPtrNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGI_U64 pair_count; + RDI_U64 buckets_count; + RDI_U64 bucket_collision_count; + RDI_U64 pair_count; }; typedef struct RDIM_U64ToPtrLookup RDIM_U64ToPtrLookup; @@ -315,7 +322,7 @@ struct RDIM_U64ToPtrLookup { void *match; RDIM_U64ToPtrNode *fill_node; - RADDBGI_U32 fill_k; + RDI_U32 fill_k; }; //- rjf: string8 -> pointer map @@ -325,7 +332,7 @@ struct RDIM_Str8ToPtrNode { struct RDIM_Str8ToPtrNode *next; RDIM_String8 key; - RADDBGI_U64 hash; + RDI_U64 hash; void *ptr; }; @@ -333,9 +340,9 @@ typedef struct RDIM_Str8ToPtrMap RDIM_Str8ToPtrMap; struct RDIM_Str8ToPtrMap { RDIM_Str8ToPtrNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGI_U64 pair_count; + RDI_U64 buckets_count; + RDI_U64 bucket_collision_count; + RDI_U64 pair_count; }; //- rjf: sortable range data structure @@ -343,7 +350,7 @@ struct RDIM_Str8ToPtrMap typedef struct RDIM_SortKey RDIM_SortKey; struct RDIM_SortKey { - RADDBGI_U64 key; + RDI_U64 key; void *val; }; @@ -351,8 +358,8 @@ typedef struct RDIM_OrderedRange RDIM_OrderedRange; struct RDIM_OrderedRange { RDIM_OrderedRange *next; - RADDBGI_U64 first; - RADDBGI_U64 opl; + RDI_U64 first; + RDI_U64 opl; }; //////////////////////////////// @@ -363,11 +370,11 @@ struct RDIM_BinarySection { RDIM_BinarySection *next; RDIM_String8 name; - RADDBGI_BinarySectionFlags flags; - RADDBGI_U64 voff_first; - RADDBGI_U64 voff_opl; - RADDBGI_U64 foff_first; - RADDBGI_U64 foff_opl; + RDI_BinarySectionFlags flags; + RDI_U64 voff_first; + RDI_U64 voff_opl; + RDI_U64 foff_first; + RDI_U64 foff_opl; }; //////////////////////////////// @@ -377,10 +384,10 @@ typedef struct RDIM_LineSequence RDIM_LineSequence; struct RDIM_LineSequence { RDIM_String8 file_name; - RADDBGI_U64 *voffs; // [line_count + 1] (sorted) - RADDBGI_U32 *line_nums; // [line_count] - RADDBGI_U16 *col_nums; // [2*line_count] - RADDBGI_U64 line_count; + RDI_U64 *voffs; // [line_count + 1] (sorted) + RDI_U32 *line_nums; // [line_count] + RDI_U16 *col_nums; // [2*line_count] + RDI_U64 line_count; }; typedef struct RDIM_LineSequenceNode RDIM_LineSequenceNode; @@ -399,25 +406,25 @@ struct RDIM_UnitInfo RDIM_String8 object_file; RDIM_String8 archive_file; RDIM_String8 build_path; - RADDBGI_Language language; + RDI_Language language; }; typedef struct RDIM_Unit RDIM_Unit; struct RDIM_Unit { RDIM_Unit *next_order; - RADDBGI_U32 idx; - RADDBGI_S32 info_is_set; + RDI_U32 idx; + RDI_S32 info_is_set; RDIM_String8 unit_name; RDIM_String8 compiler_name; RDIM_String8 source_file; RDIM_String8 object_file; RDIM_String8 archive_file; RDIM_String8 build_path; - RADDBGI_Language language; + RDI_Language language; RDIM_LineSequenceNode *line_seq_first; RDIM_LineSequenceNode *line_seq_last; - RADDBGI_U64 line_seq_count; + RDI_U64 line_seq_count; }; typedef struct RDIM_UnitVMapRange RDIM_UnitVMapRange; @@ -425,14 +432,14 @@ struct RDIM_UnitVMapRange { RDIM_UnitVMapRange *next; RDIM_Unit *unit; - RADDBGI_U64 first; - RADDBGI_U64 opl; + RDI_U64 first; + RDI_U64 opl; }; //////////////////////////////// //~ rjf: Type Info Types -typedef RADDBGI_U8 RDIM_TypeConstructKind; +typedef RDI_U8 RDIM_TypeConstructKind; enum { RDIM_TypeConstructKind_Basic, @@ -450,10 +457,10 @@ typedef struct RDIM_TypeMember RDIM_TypeMember; struct RDIM_TypeMember { RDIM_TypeMember *next; - RADDBGI_MemberKind kind; + RDI_MemberKind kind; RDIM_String8 name; struct RDIM_Type *type; - RADDBGI_U32 off; + RDI_U32 off; }; typedef struct RDIM_TypeEnumVal RDIM_TypeEnumVal; @@ -461,19 +468,19 @@ struct RDIM_TypeEnumVal { RDIM_TypeEnumVal *next; RDIM_String8 name; - RADDBGI_U64 val; + RDI_U64 val; }; typedef struct RDIM_Type RDIM_Type; struct RDIM_Type { RDIM_Type *next_order; - RADDBGI_TypeKind kind; - RADDBGI_U32 idx; - RADDBGI_U32 byte_size; - RADDBGI_U32 flags; - RADDBGI_U32 off; - RADDBGI_U32 count; + RDI_TypeKind kind; + RDI_U32 idx; + RDI_U32 byte_size; + RDI_U32 flags; + RDI_U32 off; + RDI_U32 count; RDIM_String8 name; RDIM_Type *direct_type; RDIM_Type **param_types; @@ -484,17 +491,17 @@ typedef struct RDIM_TypeUDT RDIM_TypeUDT; struct RDIM_TypeUDT { RDIM_TypeUDT *next_order; - RADDBGI_U32 idx; + RDI_U32 idx; RDIM_Type *self_type; RDIM_TypeMember *first_member; RDIM_TypeMember *last_member; - RADDBGI_U64 member_count; + RDI_U64 member_count; RDIM_TypeEnumVal *first_enum_val; RDIM_TypeEnumVal *last_enum_val; - RADDBGI_U64 enum_val_count; + RDI_U64 enum_val_count; RDIM_String8 source_path; - RADDBGI_U32 line; - RADDBGI_U32 col; + RDI_U32 line; + RDI_U32 col; }; typedef struct RDIM_TypeNode RDIM_TypeNode; @@ -509,7 +516,7 @@ struct RDIM_TypeList { RDIM_TypeNode *first; RDIM_TypeNode *last; - RADDBGI_U64 count; + RDI_U64 count; }; //////////////////////////////// @@ -532,8 +539,8 @@ struct RDIM_SymbolInfo RDIM_String8 name; RDIM_String8 link_name; RDIM_Type *type; - RADDBGI_S32 is_extern; - RADDBGI_U64 offset; + RDI_S32 is_extern; + RDI_U64 offset; // TODO(allen): should this actually be "container scope"? struct RDIM_Symbol *container_symbol; RDIM_Type *container_type; @@ -544,14 +551,14 @@ typedef struct RDIM_Symbol RDIM_Symbol; struct RDIM_Symbol { RDIM_Symbol *next_order; - RADDBGI_U32 idx; + RDI_U32 idx; RDIM_SymbolKind kind; RDIM_String8 name; RDIM_String8 link_name; RDIM_Type *type; - RADDBGI_S32 is_extern; - RADDBGI_S8 offset_is_set; - RADDBGI_U64 offset; + RDI_S32 is_extern; + RDI_S8 offset_is_set; + RDI_U64 offset; RDIM_Symbol *container_symbol; RDIM_Type *container_type; struct RDIM_Scope *root_scope; @@ -563,7 +570,7 @@ struct RDIM_Symbol typedef struct RDIM_LocalInfo RDIM_LocalInfo; struct RDIM_LocalInfo { - RADDBGI_LocalKind kind; + RDI_LocalKind kind; struct RDIM_Scope *scope; RDIM_String8 name; RDIM_Type *type; @@ -573,7 +580,7 @@ typedef struct RDIM_Local RDIM_Local; struct RDIM_Local { RDIM_Local *next; - RADDBGI_LocalKind kind; + RDI_LocalKind kind; RDIM_String8 name; RDIM_Type *type; struct RDIM_LocationSet *locset; @@ -583,8 +590,8 @@ typedef struct RDIM_VOffRange RDIM_VOffRange; struct RDIM_VOffRange { RDIM_VOffRange *next; - RADDBGI_U64 voff_first; - RADDBGI_U64 voff_opl; + RDI_U64 voff_first; + RDI_U64 voff_opl; }; typedef struct RDIM_Scope RDIM_Scope; @@ -596,14 +603,14 @@ struct RDIM_Scope RDIM_Scope *first_child; RDIM_Scope *last_child; RDIM_Scope *next_sibling; - RADDBGI_U64 voff_base; + RDI_U64 voff_base; RDIM_VOffRange *first_range; RDIM_VOffRange *last_range; - RADDBGI_U32 range_count; - RADDBGI_U32 idx; + RDI_U32 range_count; + RDI_U32 idx; RDIM_Local *first_local; RDIM_Local *last_local; - RADDBGI_U32 local_count; + RDI_U32 local_count; }; //////////////////////////////// @@ -613,9 +620,9 @@ typedef struct RDIM_EvalBytecodeOp RDIM_EvalBytecodeOp; struct RDIM_EvalBytecodeOp { RDIM_EvalBytecodeOp *next; - RADDBGI_EvalOp op; - RADDBGI_U32 p_size; - RADDBGI_U64 p; + RDI_EvalOp op; + RDI_U32 p_size; + RDI_U64 p; }; typedef struct RDIM_EvalBytecode RDIM_EvalBytecode; @@ -623,16 +630,16 @@ struct RDIM_EvalBytecode { RDIM_EvalBytecodeOp *first_op; RDIM_EvalBytecodeOp *last_op; - RADDBGI_U32 op_count; - RADDBGI_U32 encoded_size; + RDI_U32 op_count; + RDI_U32 encoded_size; }; typedef struct RDIM_Location RDIM_Location; struct RDIM_Location { - RADDBGI_LocationKind kind; - RADDBGI_U8 register_code; - RADDBGI_U16 offset; + RDI_LocationKind kind; + RDI_U8 register_code; + RDI_U16 offset; RDIM_EvalBytecode bytecode; }; @@ -640,8 +647,8 @@ typedef struct RDIM_LocationCase RDIM_LocationCase; struct RDIM_LocationCase { RDIM_LocationCase *next; - RADDBGI_U64 voff_first; - RADDBGI_U64 voff_opl; + RDI_U64 voff_first; + RDI_U64 voff_opl; RDIM_Location *location; }; @@ -650,7 +657,7 @@ struct RDIM_LocationSet { RDIM_LocationCase *first_location_case; RDIM_LocationCase *last_location_case; - RADDBGI_U64 location_case_count; + RDI_U64 location_case_count; }; //////////////////////////////// @@ -660,7 +667,7 @@ typedef struct RDIM_NameMapIdxNode RDIM_NameMapIdxNode; struct RDIM_NameMapIdxNode { RDIM_NameMapIdxNode *next; - RADDBGI_U32 idx[8]; + RDI_U32 idx[8]; }; typedef struct RDIM_NameMapNode RDIM_NameMapNode; @@ -671,18 +678,18 @@ struct RDIM_NameMapNode RDIM_String8 string; RDIM_NameMapIdxNode *idx_first; RDIM_NameMapIdxNode *idx_last; - RADDBGI_U64 idx_count; + RDI_U64 idx_count; }; typedef struct RDIM_NameMap RDIM_NameMap; struct RDIM_NameMap { RDIM_NameMapNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; + RDI_U64 buckets_count; + RDI_U64 bucket_collision_count; RDIM_NameMapNode *first; RDIM_NameMapNode *last; - RADDBGI_U64 name_count; + RDI_U64 name_count; }; //////////////////////////////// @@ -691,10 +698,10 @@ struct RDIM_NameMap typedef struct RDIM_TopLevelInfo RDIM_TopLevelInfo; struct RDIM_TopLevelInfo { - RADDBGI_Arch architecture; + RDI_Arch architecture; RDIM_String8 exe_name; - RADDBGI_U64 exe_hash; - RADDBGI_U64 voff_max; + RDI_U64 exe_hash; + RDI_U64 voff_max; }; //////////////////////////////// @@ -703,13 +710,13 @@ struct RDIM_TopLevelInfo typedef struct RDIM_RootParams RDIM_RootParams; struct RDIM_RootParams { - RADDBGI_U64 addr_size; - RADDBGI_U32 bucket_count_units; // optional; default chosen if 0 - RADDBGI_U32 bucket_count_symbols; // optional; default chosen if 0 - RADDBGI_U32 bucket_count_scopes; // optional; default chosen if 0 - RADDBGI_U32 bucket_count_locals; // optional; default chosen if 0 - RADDBGI_U32 bucket_count_types; // optional; default chosen if 0 - RADDBGI_U64 bucket_count_type_constructs; // optional; default chosen if 0 + RDI_U64 addr_size; + RDI_U32 bucket_count_units; // optional; default chosen if 0 + RDI_U32 bucket_count_symbols; // optional; default chosen if 0 + RDI_U32 bucket_count_scopes; // optional; default chosen if 0 + RDI_U32 bucket_count_locals; // optional; default chosen if 0 + RDI_U32 bucket_count_types; // optional; default chosen if 0 + RDI_U64 bucket_count_type_constructs; // optional; default chosen if 0 }; typedef struct RDIM_Root RDIM_Root; @@ -720,32 +727,32 @@ struct RDIM_Root //////// Contextual Information - RADDBGI_U64 addr_size; + RDI_U64 addr_size; //////// Info Declared By User // top level info - RADDBGI_S32 top_level_info_is_set; + RDI_S32 top_level_info_is_set; RDIM_TopLevelInfo top_level_info; // binary layout RDIM_BinarySection *binary_section_first; RDIM_BinarySection *binary_section_last; - RADDBGI_U64 binary_section_count; + RDI_U64 binary_section_count; // compilation units RDIM_Unit *unit_first; RDIM_Unit *unit_last; - RADDBGI_U64 unit_count; + RDI_U64 unit_count; RDIM_UnitVMapRange *unit_vmap_range_first; RDIM_UnitVMapRange *unit_vmap_range_last; - RADDBGI_U64 unit_vmap_range_count; + RDI_U64 unit_vmap_range_count; // types RDIM_Type *first_type; RDIM_Type *last_type; - RADDBGI_U64 type_count; + RDI_U64 type_count; RDIM_Type *nil_type; RDIM_Type *variadic_type; @@ -754,32 +761,32 @@ struct RDIM_Root RDIM_TypeUDT *first_udt; RDIM_TypeUDT *last_udt; - RADDBGI_U64 type_udt_count; + RDI_U64 type_udt_count; - RADDBGI_U64 total_member_count; - RADDBGI_U64 total_enum_val_count; + RDI_U64 total_member_count; + RDI_U64 total_enum_val_count; // symbols RDIM_Symbol *first_symbol; RDIM_Symbol *last_symbol; union { - RADDBGI_U64 symbol_count; - RADDBGI_U64 symbol_kind_counts[RDIM_SymbolKind_COUNT]; + RDI_U64 symbol_count; + RDI_U64 symbol_kind_counts[RDIM_SymbolKind_COUNT]; }; RDIM_Scope *first_scope; RDIM_Scope *last_scope; - RADDBGI_U64 scope_count; - RADDBGI_U64 scope_voff_count; + RDI_U64 scope_count; + RDI_U64 scope_voff_count; RDIM_Local *first_local; RDIM_Local *last_local; - RADDBGI_U64 local_count; - RADDBGI_U64 location_count; + RDI_U64 local_count; + RDI_U64 location_count; // name maps - RDIM_NameMap *name_maps[RADDBGI_NameMapKind_COUNT]; + RDIM_NameMap *name_maps[RDI_NameMapKind_COUNT]; //////// Handle Relationship Maps @@ -801,8 +808,8 @@ struct RDIM_DSectionNode { RDIM_DSectionNode *next; void *data; - RADDBGI_U64 size; - RADDBGI_DataSectionTag tag; + RDI_U64 size; + RDI_DataSectionTag tag; }; typedef struct RDIM_DSections RDIM_DSections; @@ -810,7 +817,7 @@ struct RDIM_DSections { RDIM_DSectionNode *first; RDIM_DSectionNode *last; - RADDBGI_U32 count; + RDI_U32 count; }; //- rjf: bake string data structure @@ -821,8 +828,8 @@ struct RDIM_StringNode RDIM_StringNode *order_next; RDIM_StringNode *bucket_next; RDIM_String8 str; - RADDBGI_U64 hash; - RADDBGI_U32 idx; + RDI_U64 hash; + RDI_U32 idx; }; typedef struct RDIM_Strings RDIM_Strings; @@ -831,9 +838,9 @@ struct RDIM_Strings RDIM_StringNode *order_first; RDIM_StringNode *order_last; RDIM_StringNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGI_U32 count; + RDI_U64 buckets_count; + RDI_U64 bucket_collision_count; + RDI_U32 count; }; //- rjf: index run baking data structure @@ -843,10 +850,10 @@ struct RDIM_IdxRunNode { RDIM_IdxRunNode *order_next; RDIM_IdxRunNode *bucket_next; - RADDBGI_U32 *idx_run; - RADDBGI_U64 hash; - RADDBGI_U32 count; - RADDBGI_U32 first_idx; + RDI_U32 *idx_run; + RDI_U64 hash; + RDI_U32 count; + RDI_U32 first_idx; }; typedef struct RDIM_IdxRuns RDIM_IdxRuns; @@ -855,10 +862,10 @@ struct RDIM_IdxRuns RDIM_IdxRunNode *order_first; RDIM_IdxRunNode *order_last; RDIM_IdxRunNode **buckets; - RADDBGI_U64 buckets_count; - RADDBGI_U64 bucket_collision_count; - RADDBGI_U32 count; - RADDBGI_U32 idx_count; + RDI_U64 buckets_count; + RDI_U64 bucket_collision_count; + RDI_U32 count; + RDI_U32 idx_count; }; //- rjf: source file & file path baking data structures @@ -873,7 +880,7 @@ struct RDIM_PathNode RDIM_PathNode *next_sibling; RDIM_String8 name; struct RDIM_SrcNode *src_file; - RADDBGI_U32 idx; + RDI_U32 idx; }; typedef struct RDIM_LineMapFragment RDIM_LineMapFragment; @@ -888,7 +895,7 @@ struct RDIM_SrcNode { RDIM_SrcNode *next; RDIM_PathNode *path_node; - RADDBGI_U32 idx; + RDI_U32 idx; RDIM_String8 normal_full_path; @@ -897,10 +904,10 @@ struct RDIM_SrcNode RDIM_LineMapFragment *last_fragment; // place to put the final baked version of this file's line map - RADDBGI_U32 line_map_nums_data_idx; - RADDBGI_U32 line_map_range_data_idx; - RADDBGI_U32 line_map_count; - RADDBGI_U32 line_map_voff_data_idx; + RDI_U32 line_map_nums_data_idx; + RDI_U32 line_map_range_data_idx; + RDI_U32 line_map_count; + RDI_U32 line_map_voff_data_idx; }; typedef struct RDIM_PathTree RDIM_PathTree; @@ -908,11 +915,11 @@ struct RDIM_PathTree { RDIM_PathNode *first; RDIM_PathNode *last; - RADDBGI_U32 count; + RDI_U32 count; RDIM_PathNode root; RDIM_SrcNode *src_first; RDIM_SrcNode *src_last; - RADDBGI_U32 src_count; + RDI_U32 src_count; }; //- rjf: line info baking data structures @@ -920,36 +927,36 @@ struct RDIM_PathTree typedef struct RDIM_LineRec RDIM_LineRec; struct RDIM_LineRec { - RADDBGI_U32 file_id; - RADDBGI_U32 line_num; - RADDBGI_U16 col_first; - RADDBGI_U16 col_opl; + RDI_U32 file_id; + RDI_U32 line_num; + RDI_U16 col_first; + RDI_U16 col_opl; }; typedef struct RDIM_UnitLinesCombined RDIM_UnitLinesCombined; struct RDIM_UnitLinesCombined { - RADDBGI_U64 *voffs; - RADDBGI_Line *lines; - RADDBGI_U16 *cols; - RADDBGI_U32 line_count; + RDI_U64 *voffs; + RDI_Line *lines; + RDI_U16 *cols; + RDI_U32 line_count; }; typedef struct RDIM_SrcLinesCombined RDIM_SrcLinesCombined; struct RDIM_SrcLinesCombined { - RADDBGI_U32 *line_nums; - RADDBGI_U32 *line_ranges; - RADDBGI_U64 *voffs; - RADDBGI_U32 line_count; - RADDBGI_U32 voff_count; + RDI_U32 *line_nums; + RDI_U32 *line_ranges; + RDI_U64 *voffs; + RDI_U32 line_count; + RDI_U32 voff_count; }; typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; struct RDIM_SrcLineMapVoffBlock { RDIM_SrcLineMapVoffBlock *next; - RADDBGI_U64 voff; + RDI_U64 voff; }; typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; @@ -957,10 +964,10 @@ struct RDIM_SrcLineMapBucket { RDIM_SrcLineMapBucket *order_next; RDIM_SrcLineMapBucket *hash_next; - RADDBGI_U32 line_num; + RDI_U32 line_num; RDIM_SrcLineMapVoffBlock *first_voff_block; RDIM_SrcLineMapVoffBlock *last_voff_block; - RADDBGI_U64 voff_count; + RDI_U64 voff_count; }; //- rjf: vmap baking data structure @@ -968,22 +975,22 @@ struct RDIM_SrcLineMapBucket typedef struct RDIM_VMap RDIM_VMap; struct RDIM_VMap { - RADDBGI_VMapEntry *vmap; // [count + 1] - RADDBGI_U32 count; + RDI_VMapEntry *vmap; // [count + 1] + RDI_U32 count; }; typedef struct RDIM_VMapMarker RDIM_VMapMarker; struct RDIM_VMapMarker { - RADDBGI_U32 idx; - RADDBGI_U32 begin_range; + RDI_U32 idx; + RDI_U32 begin_range; }; typedef struct RDIM_VMapRangeTracker RDIM_VMapRangeTracker; struct RDIM_VMapRangeTracker { RDIM_VMapRangeTracker *next; - RADDBGI_U32 idx; + RDI_U32 idx; }; //- rjf: type data baking types @@ -991,17 +998,17 @@ struct RDIM_VMapRangeTracker typedef struct RDIM_TypeData RDIM_TypeData; struct RDIM_TypeData { - RADDBGI_TypeNode *type_nodes; - RADDBGI_U32 type_node_count; + RDI_TypeNode *type_nodes; + RDI_U32 type_node_count; - RADDBGI_UDT *udts; - RADDBGI_U32 udt_count; + RDI_UDT *udts; + RDI_U32 udt_count; - RADDBGI_Member *members; - RADDBGI_U32 member_count; + RDI_Member *members; + RDI_U32 member_count; - RADDBGI_EnumMember *enum_members; - RADDBGI_U32 enum_member_count; + RDI_EnumMember *enum_members; + RDI_U32 enum_member_count; }; //- rjf: symbol data baking types @@ -1009,33 +1016,33 @@ struct RDIM_TypeData typedef struct RDIM_SymbolData RDIM_SymbolData; struct RDIM_SymbolData { - RADDBGI_GlobalVariable *global_variables; - RADDBGI_U32 global_variable_count; + RDI_GlobalVariable *global_variables; + RDI_U32 global_variable_count; RDIM_VMap *global_vmap; - RADDBGI_ThreadVariable *thread_variables; - RADDBGI_U32 thread_variable_count; + RDI_ThreadVariable *thread_variables; + RDI_U32 thread_variable_count; - RADDBGI_Procedure *procedures; - RADDBGI_U32 procedure_count; + RDI_Procedure *procedures; + RDI_U32 procedure_count; - RADDBGI_Scope *scopes; - RADDBGI_U32 scope_count; + RDI_Scope *scopes; + RDI_U32 scope_count; - RADDBGI_U64 *scope_voffs; - RADDBGI_U32 scope_voff_count; + RDI_U64 *scope_voffs; + RDI_U32 scope_voff_count; RDIM_VMap *scope_vmap; - RADDBGI_Local *locals; - RADDBGI_U32 local_count; + RDI_Local *locals; + RDI_U32 local_count; - RADDBGI_LocationBlock *location_blocks; - RADDBGI_U32 location_block_count; + RDI_LocationBlock *location_blocks; + RDI_U32 location_block_count; void *location_data; - RADDBGI_U32 location_data_size; + RDI_U32 location_data_size; }; //- rjf: name map baking types @@ -1052,16 +1059,16 @@ struct RDIM_NameMapSemiBucket { RDIM_NameMapSemiNode *first; RDIM_NameMapSemiNode *last; - RADDBGI_U64 count; + RDI_U64 count; }; typedef struct RDIM_NameMapBaked RDIM_NameMapBaked; struct RDIM_NameMapBaked { - RADDBGI_NameMapBucket *buckets; - RADDBGI_NameMapNode *nodes; - RADDBGI_U32 bucket_count; - RADDBGI_U32 node_count; + RDI_NameMapBucket *buckets; + RDI_NameMapNode *nodes; + RDI_U32 bucket_count; + RDI_U32 node_count; }; //- rjf: bundle baking context type @@ -1069,8 +1076,8 @@ struct RDIM_NameMapBaked typedef struct RDIM_BakeParams RDIM_BakeParams; struct RDIM_BakeParams { - RADDBGI_U64 strings_bucket_count; - RADDBGI_U64 idx_runs_bucket_count; + RDI_U64 strings_bucket_count; + RDI_U64 idx_runs_bucket_count; }; typedef struct RDIM_BakeCtx RDIM_BakeCtx; @@ -1087,10 +1094,10 @@ struct RDIM_BakeCtx //- rjf: memory operations #if !defined(RDIM_MEMSET_OVERRIDE) -RADDBGI_PROC void *rdim_memset_fallback(void *dst, RADDBGI_U8 c, RADDBGI_U64 size); +RDI_PROC void *rdim_memset_fallback(void *dst, RDI_U8 c, RDI_U64 size); #endif #if !defined(RDIM_MEMCPY_OVERRIDE) -RADDBGI_PROC void *rdim_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size); +RDI_PROC void *rdim_memcpy_fallback(void *dst, void *src, RDI_U64 size); #endif #define rdim_memzero(ptr, size) rdim_memset((ptr), 0, (size)) #define rdim_memzero_struct(ptr) rdim_memset((ptr), 0, sizeof(*(ptr))) @@ -1098,206 +1105,206 @@ RADDBGI_PROC void *rdim_memcpy_fallback(void *dst, void *src, RADDBGI_U64 size); //- rjf: arenas #if !defined (RDIM_ARENA_OVERRIDE) -RADDBGI_PROC RDIM_Arena *rdim_arena_alloc_fallback(void); -RADDBGI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena); -RADDBGI_PROC RADDBGI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena); -RADDBGI_PROC void *rdim_arena_push_fallback(RDIM_Arena *arena, RADDBGI_U64 size); -RADDBGI_PROC void rdim_arena_pop_to_fallback(RDIM_Arena *arena, RADDBGI_U64 pos); +RDI_PROC RDIM_Arena *rdim_arena_alloc_fallback(void); +RDI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena); +RDI_PROC RDI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena); +RDI_PROC void *rdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 size); +RDI_PROC void rdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos); #endif #define rdim_push_array_no_zero(a,T,c) (T*)rdim_arena_push((a), sizeof(T)*(c)) #define rdim_push_array(a,T,c) (T*)rdim_memzero(rdim_push_array_no_zero(a,T,c), sizeof(T)*(c)) //- rjf: thread-local scratch arenas #if !defined (RDIM_SCRATCH_OVERRIDE) -RADDBGI_PROC RDIM_Temp rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RADDBGI_U64 conflicts_count); -RADDBGI_PROC void rdim_scratch_end_fallback(RDIM_Temp temp); +RDI_PROC RDIM_Temp rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RDI_U64 conflicts_count); +RDI_PROC void rdim_scratch_end_fallback(RDIM_Temp temp); #endif //- rjf: strings -RADDBGI_PROC RDIM_String8 rdim_str8(RADDBGI_U8 *str, RADDBGI_U64 size); -RADDBGI_PROC RDIM_String8 rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src); -RADDBGI_PROC RDIM_String8 rdim_str8f(RDIM_Arena *arena, char *fmt, ...); -RADDBGI_PROC RDIM_String8 rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args); -RADDBGI_PROC RADDBGI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags); -#define rdim_str8_lit(S) rdim_str8((RADDBGI_U8*)(S), sizeof(S) - 1) -#define rdim_str8_struct(S) rdim_str8((RADDBGI_U8*)(S), sizeof(*(S))) +RDI_PROC RDIM_String8 rdim_str8(RDI_U8 *str, RDI_U64 size); +RDI_PROC RDIM_String8 rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src); +RDI_PROC RDIM_String8 rdim_str8f(RDIM_Arena *arena, char *fmt, ...); +RDI_PROC RDIM_String8 rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args); +RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags); +#define rdim_str8_lit(S) rdim_str8((RDI_U8*)(S), sizeof(S) - 1) +#define rdim_str8_struct(S) rdim_str8((RDI_U8*)(S), sizeof(*(S))) //- rjf: string lists -RADDBGI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); -RADDBGI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep); +RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); +RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep); //- rjf: type lists -RADDBGI_PROC void rdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *type); +RDI_PROC void rdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *type); //- rjf: bytecode lists -RADDBGI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_EvalOp op, RADDBGI_U64 p); -RADDBGI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_U64 x); -RADDBGI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RADDBGI_S64 x); -RADDBGI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); +RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); +RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); +RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); +RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); //- rjf: sortable range sorting -RADDBGI_PROC RDIM_SortKey* rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RADDBGI_U64 count); +RDI_PROC RDIM_SortKey* rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count); //////////////////////////////// //~ rjf: Auxiliary Data Structure Functions //- rjf: u64 -> ptr map -RADDBGI_PROC void rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 bucket_count); -RADDBGI_PROC void rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RDIM_U64ToPtrLookup *lookup_out); -RADDBGI_PROC void rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RADDBGI_U64 key, RADDBGI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr); +RDI_PROC void rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count); +RDI_PROC void rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out); +RDI_PROC void rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr); //- rjf: string8 -> ptr map -RADDBGI_PROC void rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RADDBGI_U64 bucket_count); -RADDBGI_PROC void*rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 hash); -RADDBGI_PROC void rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RADDBGI_U64 hash, void *ptr); +RDI_PROC void rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_U64 bucket_count); +RDI_PROC void*rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash); +RDI_PROC void rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr); //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions //- rjf: root creation -RADDBGI_PROC RDIM_Root* rdim_root_alloc(RDIM_RootParams *params); -RADDBGI_PROC void rdim_root_release(RDIM_Root *root); +RDI_PROC RDIM_Root* rdim_root_alloc(RDIM_RootParams *params); +RDI_PROC void rdim_root_release(RDIM_Root *root); //- rjf: error accumulation -RADDBGI_PROC void rdim_push_error(RDIM_Root *root, RDIM_String8 string); -RADDBGI_PROC void rdim_push_errorf(RDIM_Root *root, char *fmt, ...); -RADDBGI_PROC RDIM_Error* rdim_first_error_from_root(RDIM_Root *root); +RDI_PROC void rdim_push_error(RDIM_Root *root, RDIM_String8 string); +RDI_PROC void rdim_push_errorf(RDIM_Root *root, char *fmt, ...); +RDI_PROC RDIM_Error* rdim_first_error_from_root(RDIM_Root *root); //- rjf: top-level info specification -RADDBGI_PROC void rdim_set_top_level_info(RDIM_Root *root, RDIM_TopLevelInfo *tli); +RDI_PROC void rdim_set_top_level_info(RDIM_Root *root, RDIM_TopLevelInfo *tli); //- rjf: binary section building -RADDBGI_PROC void rdim_add_binary_section(RDIM_Root *root, - RDIM_String8 name, RADDBGI_BinarySectionFlags flags, - RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RADDBGI_U64 foff_first, - RADDBGI_U64 foff_opl); +RDI_PROC void rdim_add_binary_section(RDIM_Root *root, + RDIM_String8 name, RDI_BinarySectionFlags flags, + RDI_U64 voff_first, RDI_U64 voff_opl, RDI_U64 foff_first, + RDI_U64 foff_opl); //- rjf: unit info building -RADDBGI_PROC RDIM_Unit* rdim_unit_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 unit_user_id, RADDBGI_U64 unit_user_id_hash); -RADDBGI_PROC void rdim_unit_set_info(RDIM_Root *root, RDIM_Unit *unit, RDIM_UnitInfo *info); -RADDBGI_PROC void rdim_unit_add_line_sequence(RDIM_Root *root, RDIM_Unit *unit, RDIM_LineSequence *line_sequence); -RADDBGI_PROC void rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RADDBGI_U64 first, RADDBGI_U64 opl); +RDI_PROC RDIM_Unit* rdim_unit_handle_from_user_id(RDIM_Root *root, RDI_U64 unit_user_id, RDI_U64 unit_user_id_hash); +RDI_PROC void rdim_unit_set_info(RDIM_Root *root, RDIM_Unit *unit, RDIM_UnitInfo *info); +RDI_PROC void rdim_unit_add_line_sequence(RDIM_Root *root, RDIM_Unit *unit, RDIM_LineSequence *line_sequence); +RDI_PROC void rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RDI_U64 first, RDI_U64 opl); //- rjf: type info lookups/reservations -RADDBGI_PROC RDIM_Type* rdim_type_from_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash); -RADDBGI_PROC RDIM_Reservation* rdim_type_reserve_id(RDIM_Root *root, RADDBGI_U64 type_user_id, RADDBGI_U64 type_user_id_hash); -RADDBGI_PROC void rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type); +RDI_PROC RDIM_Type* rdim_type_from_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash); +RDI_PROC RDIM_Reservation* rdim_type_reserve_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash); +RDI_PROC void rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type); //- rjf: nil/singleton types -RADDBGI_PROC RADDBGI_S32 rdim_type_is_unhandled_nil(RDIM_Root *root, RDIM_Type *type); -RADDBGI_PROC RDIM_Type* rdim_type_handled_nil(RDIM_Root *root); -RADDBGI_PROC RDIM_Type* rdim_type_nil(RDIM_Root *root); -RADDBGI_PROC RDIM_Type* rdim_type_variadic(RDIM_Root *root); +RDI_PROC RDI_S32 rdim_type_is_unhandled_nil(RDIM_Root *root, RDIM_Type *type); +RDI_PROC RDIM_Type* rdim_type_handled_nil(RDIM_Root *root); +RDI_PROC RDIM_Type* rdim_type_nil(RDIM_Root *root); +RDI_PROC RDIM_Type* rdim_type_variadic(RDIM_Root *root); //- rjf: base type info constructors -RADDBGI_PROC RDIM_Type* rdim_type_new(RDIM_Root *root); -RADDBGI_PROC RDIM_TypeUDT* rdim_type_udt_from_any_type(RDIM_Root *root, RDIM_Type *type); -RADDBGI_PROC RDIM_TypeUDT* rdim_type_udt_from_record_type(RDIM_Root *root, RDIM_Type *type); +RDI_PROC RDIM_Type* rdim_type_new(RDIM_Root *root); +RDI_PROC RDIM_TypeUDT* rdim_type_udt_from_any_type(RDIM_Root *root, RDIM_Type *type); +RDI_PROC RDIM_TypeUDT* rdim_type_udt_from_record_type(RDIM_Root *root, RDIM_Type *type); //- rjf: basic/operator type construction helpers -RADDBGI_PROC RDIM_Type* rdim_type_basic(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name); -RADDBGI_PROC RDIM_Type* rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeModifierFlags flags); -RADDBGI_PROC RDIM_Type* rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U32 bit_off, RADDBGI_U32 bit_count); -RADDBGI_PROC RDIM_Type* rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_TypeKind ptr_type_kind); -RADDBGI_PROC RDIM_Type* rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RADDBGI_U64 count); -RADDBGI_PROC RDIM_Type* rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *params); -RADDBGI_PROC RDIM_Type* rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, struct RDIM_TypeList *params); +RDI_PROC RDIM_Type* rdim_type_basic(RDIM_Root *root, RDI_TypeKind type_kind, RDIM_String8 name); +RDI_PROC RDIM_Type* rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RDI_TypeModifierFlags flags); +RDI_PROC RDIM_Type* rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RDI_U32 bit_off, RDI_U32 bit_count); +RDI_PROC RDIM_Type* rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RDI_TypeKind ptr_type_kind); +RDI_PROC RDIM_Type* rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RDI_U64 count); +RDI_PROC RDIM_Type* rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *params); +RDI_PROC RDIM_Type* rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, struct RDIM_TypeList *params); //- rjf: udt type constructors -RADDBGI_PROC RDIM_Type* rdim_type_udt(RDIM_Root *root, RADDBGI_TypeKind record_type_kind, RDIM_String8 name, RADDBGI_U64 size); -RADDBGI_PROC RDIM_Type* rdim_type_enum(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name); -RADDBGI_PROC RDIM_Type* rdim_type_alias(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name); -RADDBGI_PROC RDIM_Type* rdim_type_incomplete(RDIM_Root *root, RADDBGI_TypeKind type_kind, RDIM_String8 name); +RDI_PROC RDIM_Type* rdim_type_udt(RDIM_Root *root, RDI_TypeKind record_type_kind, RDIM_String8 name, RDI_U64 size); +RDI_PROC RDIM_Type* rdim_type_enum(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name); +RDI_PROC RDIM_Type* rdim_type_alias(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name); +RDI_PROC RDIM_Type* rdim_type_incomplete(RDIM_Root *root, RDI_TypeKind type_kind, RDIM_String8 name); //- rjf: type member building -RADDBGI_PROC void rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type, RADDBGI_U32 off); -RADDBGI_PROC void rdim_type_add_member_static_data(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); -RADDBGI_PROC void rdim_type_add_member_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); -RADDBGI_PROC void rdim_type_add_member_static_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); -RADDBGI_PROC void rdim_type_add_member_virtual_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); -RADDBGI_PROC void rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RADDBGI_U32 off); -RADDBGI_PROC void rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RADDBGI_U32 vptr_off, RADDBGI_U32 vtable_off); -RADDBGI_PROC void rdim_type_add_member_nested_type(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *nested_type); -RADDBGI_PROC void rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, RADDBGI_U64 val); +RDI_PROC void rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type, RDI_U32 off); +RDI_PROC void rdim_type_add_member_static_data(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); +RDI_PROC void rdim_type_add_member_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); +RDI_PROC void rdim_type_add_member_static_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); +RDI_PROC void rdim_type_add_member_virtual_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); +RDI_PROC void rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RDI_U32 off); +RDI_PROC void rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RDI_U32 vptr_off, RDI_U32 vtable_off); +RDI_PROC void rdim_type_add_member_nested_type(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *nested_type); +RDI_PROC void rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, RDI_U64 val); //- rjf: type source coordinate specifications -RADDBGI_PROC void rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_String8 source_path, RADDBGI_U32 line, RADDBGI_U32 col); +RDI_PROC void rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_String8 source_path, RDI_U32 line, RDI_U32 col); //- rjf: symbol info building -RADDBGI_PROC RDIM_Symbol* rdim_symbol_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 symbol_user_id, RADDBGI_U64 symbol_user_id_hash); -RADDBGI_PROC void rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info); +RDI_PROC RDIM_Symbol* rdim_symbol_handle_from_user_id(RDIM_Root *root, RDI_U64 symbol_user_id, RDI_U64 symbol_user_id_hash); +RDI_PROC void rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info); //- rjf: scope info building -RADDBGI_PROC RDIM_Scope *rdim_scope_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 scope_user_id, RADDBGI_U64 scope_user_id_hash); -RADDBGI_PROC void rdim_scope_set_parent(RDIM_Root *root, RDIM_Scope *scope, RDIM_Scope *parent); -RADDBGI_PROC void rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl); -RADDBGI_PROC void rdim_scope_recursive_set_symbol(RDIM_Scope *scope, RDIM_Symbol *symbol); +RDI_PROC RDIM_Scope *rdim_scope_handle_from_user_id(RDIM_Root *root, RDI_U64 scope_user_id, RDI_U64 scope_user_id_hash); +RDI_PROC void rdim_scope_set_parent(RDIM_Root *root, RDIM_Scope *scope, RDIM_Scope *parent); +RDI_PROC void rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RDI_U64 voff_first, RDI_U64 voff_opl); +RDI_PROC void rdim_scope_recursive_set_symbol(RDIM_Scope *scope, RDIM_Symbol *symbol); //- rjf: local info building -RADDBGI_PROC RDIM_Local* rdim_local_handle_from_user_id(RDIM_Root *root, RADDBGI_U64 local_user_id, RADDBGI_U64 local_user_id_hash); -RADDBGI_PROC void rdim_local_set_basic_info(RDIM_Root *root, RDIM_Local *local, RDIM_LocalInfo *info); -RADDBGI_PROC RDIM_LocationSet* rdim_location_set_from_local(RDIM_Root *root, RDIM_Local *local); +RDI_PROC RDIM_Local* rdim_local_handle_from_user_id(RDIM_Root *root, RDI_U64 local_user_id, RDI_U64 local_user_id_hash); +RDI_PROC void rdim_local_set_basic_info(RDIM_Root *root, RDIM_Local *local, RDIM_LocalInfo *info); +RDI_PROC RDIM_LocationSet* rdim_location_set_from_local(RDIM_Root *root, RDIM_Local *local); //- rjf: location info building -RADDBGI_PROC void rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RADDBGI_U64 voff_first, RADDBGI_U64 voff_opl, RDIM_Location *location); -RADDBGI_PROC RDIM_Location* rdim_location_addr_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode); -RADDBGI_PROC RDIM_Location* rdim_location_val_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode); -RADDBGI_PROC RDIM_Location* rdim_location_addr_reg_plus_u16(RDIM_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset); -RADDBGI_PROC RDIM_Location* rdim_location_addr_addr_reg_plus_u16(RDIM_Root *root, RADDBGI_U8 reg_code, RADDBGI_U16 offset); -RADDBGI_PROC RDIM_Location* rdim_location_val_reg(RDIM_Root *root, RADDBGI_U8 reg_code); +RDI_PROC void rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RDI_U64 voff_first, RDI_U64 voff_opl, RDIM_Location *location); +RDI_PROC RDIM_Location* rdim_location_addr_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode); +RDI_PROC RDIM_Location* rdim_location_val_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode); +RDI_PROC RDIM_Location* rdim_location_addr_reg_plus_u16(RDIM_Root *root, RDI_U8 reg_code, RDI_U16 offset); +RDI_PROC RDIM_Location* rdim_location_addr_addr_reg_plus_u16(RDIM_Root *root, RDI_U8 reg_code, RDI_U16 offset); +RDI_PROC RDIM_Location* rdim_location_val_reg(RDIM_Root *root, RDI_U8 reg_code); //- rjf: name map building -RADDBGI_PROC RDIM_NameMap* rdim_name_map_for_kind(RDIM_Root *root, RADDBGI_NameMapKind kind); -RADDBGI_PROC void rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 name, RADDBGI_U32 idx); +RDI_PROC RDIM_NameMap* rdim_name_map_for_kind(RDIM_Root *root, RDI_NameMapKind kind); +RDI_PROC void rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 name, RDI_U32 idx); //////////////////////////////// //~ rjf: Debug Info Baking (Loose -> Tight) Functions //- rjf: bake context construction -RADDBGI_PROC RDIM_BakeCtx* rdim_bake_ctx_begin(RDIM_BakeParams *params); -RADDBGI_PROC void rdim_bake_ctx_release(RDIM_BakeCtx *bake_ctx); +RDI_PROC RDIM_BakeCtx* rdim_bake_ctx_begin(RDIM_BakeParams *params); +RDI_PROC void rdim_bake_ctx_release(RDIM_BakeCtx *bake_ctx); //- rjf: string baking -RADDBGI_PROC RADDBGI_U32 rdim_string(RDIM_BakeCtx *bctx, RDIM_String8 str); +RDI_PROC RDI_U32 rdim_string(RDIM_BakeCtx *bctx, RDIM_String8 str); //- rjf: idx run baking -RADDBGI_PROC RADDBGI_U64 rdim_idx_run_hash(RADDBGI_U32 *idx_run, RADDBGI_U32 count); -RADDBGI_PROC RADDBGI_U32 rdim_idx_run(RDIM_BakeCtx *bctx, RADDBGI_U32 *idx_run, RADDBGI_U32 count); +RDI_PROC RDI_U64 rdim_idx_run_hash(RDI_U32 *idx_run, RDI_U32 count); +RDI_PROC RDI_U32 rdim_idx_run(RDIM_BakeCtx *bctx, RDI_U32 *idx_run, RDI_U32 count); //- rjf: data section baking -RADDBGI_PROC RADDBGI_U32 rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RADDBGI_U64 size, RADDBGI_DataSectionTag tag); +RDI_PROC RDI_U32 rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RDI_U64 size, RDI_DataSectionTag tag); //- rjf: paths baking -RADDBGI_PROC RDIM_String8 rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node); -RADDBGI_PROC void rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out); -RADDBGI_PROC RDIM_PathNode* rdim_paths_new_node(RDIM_BakeCtx *bctx); -RADDBGI_PROC RDIM_PathNode* rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir); -RADDBGI_PROC RDIM_PathNode* rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); -RADDBGI_PROC RADDBGI_U32 rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); -RADDBGI_PROC RDIM_SrcNode* rdim_paths_new_src_node(RDIM_BakeCtx *bctx); -RADDBGI_PROC RDIM_SrcNode* rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node); +RDI_PROC RDIM_String8 rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node); +RDI_PROC void rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out); +RDI_PROC RDIM_PathNode* rdim_paths_new_node(RDIM_BakeCtx *bctx); +RDI_PROC RDIM_PathNode* rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir); +RDI_PROC RDIM_PathNode* rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); +RDI_PROC RDI_U32 rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); +RDI_PROC RDIM_SrcNode* rdim_paths_new_src_node(RDIM_BakeCtx *bctx); +RDI_PROC RDIM_SrcNode* rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node); //- rjf: per-unit line info baking -RADDBGI_PROC RDIM_UnitLinesCombined* rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequenceNode *first_seq); +RDI_PROC RDIM_UnitLinesCombined* rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequenceNode *first_seq); //- rjf: per-src line info baking -RADDBGI_PROC RDIM_SrcLinesCombined* rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first); +RDI_PROC RDIM_SrcLinesCombined* rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first); //- rjf: vmap baking -RADDBGI_PROC RDIM_VMap* rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RADDBGI_U64 marker_count); -RADDBGI_PROC RDIM_VMap* rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RADDBGI_U64 count); +RDI_PROC RDIM_VMap* rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count); +RDI_PROC RDIM_VMap* rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RDI_U64 count); //- rjf: type info baking -RADDBGI_PROC RADDBGI_U32* rdim_idx_run_from_types(RDIM_Arena *arena, RDIM_Type **types, RADDBGI_U32 count); -RADDBGI_PROC RDIM_TypeData* rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx); +RDI_PROC RDI_U32* rdim_idx_run_from_types(RDIM_Arena *arena, RDIM_Type **types, RDI_U32 count); +RDI_PROC RDIM_TypeData* rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx); //- rjf: symbol data baking -RADDBGI_PROC RDIM_SymbolData* rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx); +RDI_PROC RDIM_SymbolData* rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx); //- rjf: name map baking -RADDBGI_PROC RDIM_NameMapBaked* rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_NameMap *map); +RDI_PROC RDIM_NameMapBaked* rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_NameMap *map); //- rjf: top-level baking entry point -RADDBGI_PROC void rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out); +RDI_PROC void rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out); -#endif // RADDBGI_MAKE_H +#endif // RDI_MAKE_H diff --git a/src/raddbgi_dump/raddbgi_dump.c b/src/raddbgi_dump/raddbgi_dump.c index cb878ede..fbc18af4 100644 --- a/src/raddbgi_dump/raddbgi_dump.c +++ b/src/raddbgi_dump/raddbgi_dump.c @@ -161,12 +161,12 @@ main(int argc, char **argv){ // will we try to parse an input file B32 try_parse_input = (params->errors.node_count == 0); - RADDBGI_ParseStatus parse_status = RADDBGI_ParseStatus_Good; - RADDBGI_Parsed raddbg__ = {0}; - RADDBGI_Parsed *raddbg = 0; + RDI_ParseStatus parse_status = RDI_ParseStatus_Good; + RDI_Parsed raddbg__ = {0}; + RDI_Parsed *raddbg = 0; if (try_parse_input){ - parse_status = raddbgi_parse(params->input_data.str, params->input_data.size, &raddbg__); - if (parse_status == RADDBGI_ParseStatus_Good){ + parse_status = rdi_parse(params->input_data.str, params->input_data.size, &raddbg__); + if (parse_status == RDI_ParseStatus_Good){ raddbg = &raddbg__; } } @@ -183,24 +183,24 @@ main(int argc, char **argv){ // DATA SECTIONS if (raddbg->dsecs != 0 && params->dump_data_sections){ str8_list_pushf(arena, &dump, "# DATA SECTIONS:\n"); - raddbgi_stringize_data_sections(arena, &dump, raddbg, 1); + rdi_stringize_data_sections(arena, &dump, raddbg, 1); str8_list_push(arena, &dump, str8_lit("\n")); } // TOP LEVEL INFO if (raddbg->top_level_info != 0 && params->dump_top_level_info){ str8_list_pushf(arena, &dump, "# TOP LEVEL INFO:\n"); - raddbgi_stringize_top_level_info(arena, &dump, raddbg, raddbg->top_level_info, 1); + rdi_stringize_top_level_info(arena, &dump, raddbg, raddbg->top_level_info, 1); str8_list_push(arena, &dump, str8_lit("\n")); } // BINARY SECTIONS if (raddbg->binary_sections != 0 && params->dump_binary_sections){ str8_list_pushf(arena, &dump, "# BINARY SECTIONS:\n"); - RADDBGI_BinarySection *ptr = raddbg->binary_sections; + RDI_BinarySection *ptr = raddbg->binary_sections; for (U32 i = 0; i < raddbg->binary_sections_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " section[%u]:\n", i); - raddbgi_stringize_binary_section(arena, &dump, raddbg, ptr, 2); + rdi_stringize_binary_section(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -208,17 +208,17 @@ main(int argc, char **argv){ // FILE PATHS if (raddbg->file_paths != 0 && params->dump_file_paths){ - RADDBGI_FilePathBundle file_path_bundle = {0}; + RDI_FilePathBundle file_path_bundle = {0}; { file_path_bundle.file_paths = raddbg->file_paths; file_path_bundle.file_path_count = raddbg->file_paths_count; } str8_list_pushf(arena, &dump, "# FILE PATHS\n"); - RADDBGI_FilePathNode *ptr = raddbg->file_paths; + RDI_FilePathNode *ptr = raddbg->file_paths; for (U32 i = 0; i < raddbg->file_paths_count; i += 1, ptr += 1){ if (ptr->parent_path_node == 0){ - raddbgi_stringize_file_path(arena, &dump, raddbg, &file_path_bundle, ptr, 1); + rdi_stringize_file_path(arena, &dump, raddbg, &file_path_bundle, ptr, 1); } } str8_list_push(arena, &dump, str8_lit("\n")); @@ -227,10 +227,10 @@ main(int argc, char **argv){ // SOURCE FILES if (raddbg->source_files != 0 && params->dump_source_files){ str8_list_pushf(arena, &dump, "# SOURCE FILES\n"); - RADDBGI_SourceFile *ptr = raddbg->source_files; + RDI_SourceFile *ptr = raddbg->source_files; for (U32 i = 0; i < raddbg->source_files_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " source_file[%u]:\n", i); - raddbgi_stringize_source_file(arena, &dump, raddbg, ptr, 2); + rdi_stringize_source_file(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -239,10 +239,10 @@ main(int argc, char **argv){ // UNITS if (raddbg->units != 0 && params->dump_units){ str8_list_pushf(arena, &dump, "# UNITS\n"); - RADDBGI_Unit *ptr = raddbg->units; + RDI_Unit *ptr = raddbg->units; for (U32 i = 0; i < raddbg->units_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - raddbgi_stringize_unit(arena, &dump, raddbg, ptr, 2); + rdi_stringize_unit(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -251,7 +251,7 @@ main(int argc, char **argv){ // UNIT VMAP if (raddbg->unit_vmap != 0 && params->dump_unit_vmap){ str8_list_pushf(arena, &dump, "# UNIT VMAP\n"); - RADDBGI_VMapEntry *ptr = raddbg->unit_vmap; + RDI_VMapEntry *ptr = raddbg->unit_vmap; for (U32 i = 0; i < raddbg->unit_vmap_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); } @@ -261,10 +261,10 @@ main(int argc, char **argv){ // TYPE NODES if (raddbg->type_nodes != 0 && params->dump_type_nodes){ str8_list_pushf(arena, &dump, "# TYPE NODES:\n"); - RADDBGI_TypeNode *ptr = raddbg->type_nodes; + RDI_TypeNode *ptr = raddbg->type_nodes; for (U32 i = 0; i < raddbg->type_nodes_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " type[%u]:\n", i); - raddbgi_stringize_type_node(arena, &dump, raddbg, ptr, 2); + rdi_stringize_type_node(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -272,7 +272,7 @@ main(int argc, char **argv){ // UDT DATA if (raddbg->udts != 0 && params->dump_udt_data){ - RADDBGI_UDTMemberBundle member_bundle = {0}; + RDI_UDTMemberBundle member_bundle = {0}; { member_bundle.members = raddbg->members; member_bundle.enum_members = raddbg->enum_members; @@ -281,10 +281,10 @@ main(int argc, char **argv){ } str8_list_pushf(arena, &dump, "# UDTS:\n"); - RADDBGI_UDT *ptr = raddbg->udts; + RDI_UDT *ptr = raddbg->udts; for (U32 i = 0; i < raddbg->udts_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " udt[%u]:\n", i); - raddbgi_stringize_udt(arena, &dump, raddbg, &member_bundle, ptr, 2); + rdi_stringize_udt(arena, &dump, raddbg, &member_bundle, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -293,10 +293,10 @@ main(int argc, char **argv){ // GLOBAL VARIABLES if (raddbg->global_variables != 0 && params->dump_global_variables){ str8_list_pushf(arena, &dump, "# GLOBAL VARIABLES:\n"); - RADDBGI_GlobalVariable *ptr = raddbg->global_variables; + RDI_GlobalVariable *ptr = raddbg->global_variables; for (U32 i = 0; i < raddbg->global_variables_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " global_variable[%u]:\n", i); - raddbgi_stringize_global_variable(arena, &dump, raddbg, ptr, 2); + rdi_stringize_global_variable(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -305,7 +305,7 @@ main(int argc, char **argv){ // GLOBAL VMAP if (raddbg->global_vmap != 0 && params->dump_global_vmap){ str8_list_pushf(arena, &dump, "# GLOBAL VMAP:\n"); - RADDBGI_VMapEntry *ptr = raddbg->global_vmap; + RDI_VMapEntry *ptr = raddbg->global_vmap; for (U32 i = 0; i < raddbg->global_vmap_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); } @@ -315,10 +315,10 @@ main(int argc, char **argv){ // THREAD LOCAL VARIABLES if (raddbg->thread_variables != 0 && params->dump_thread_variables){ str8_list_pushf(arena, &dump, "# THREAD VARIABLES:\n"); - RADDBGI_ThreadVariable *ptr = raddbg->thread_variables; + RDI_ThreadVariable *ptr = raddbg->thread_variables; for (U32 i = 0; i < raddbg->thread_variables_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " thread_variable[%u]:\n", i); - raddbgi_stringize_thread_variable(arena, &dump, raddbg, ptr, 2); + rdi_stringize_thread_variable(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -327,10 +327,10 @@ main(int argc, char **argv){ // PROCEDURES if (raddbg->procedures != 0 && params->dump_procedures){ str8_list_pushf(arena, &dump, "# PROCEDURES:\n"); - RADDBGI_Procedure *ptr = raddbg->procedures; + RDI_Procedure *ptr = raddbg->procedures; for (U32 i = 0; i < raddbg->procedures_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " procedure[%u]:\n", i); - raddbgi_stringize_procedure(arena, &dump, raddbg, ptr, 2); + rdi_stringize_procedure(arena, &dump, raddbg, ptr, 2); str8_list_push(arena, &dump, str8_lit("\n")); } str8_list_push(arena, &dump, str8_lit("\n")); @@ -338,7 +338,7 @@ main(int argc, char **argv){ // SCOPES if (raddbg->scopes != 0 && params->dump_scopes){ - RADDBGI_ScopeBundle scope_bundle = {0}; + RDI_ScopeBundle scope_bundle = {0}; { scope_bundle.scopes = raddbg->scopes; scope_bundle.scope_count = raddbg->scopes_count; @@ -353,10 +353,10 @@ main(int argc, char **argv){ } str8_list_pushf(arena, &dump, "# SCOPES:\n"); - RADDBGI_Scope *ptr = raddbg->scopes; + RDI_Scope *ptr = raddbg->scopes; for (U32 i = 0; i < raddbg->scopes_count; i += 1, ptr += 1){ if (ptr->parent_scope_idx == 0){ - raddbgi_stringize_scope(arena, &dump, raddbg, &scope_bundle, ptr, 1); + rdi_stringize_scope(arena, &dump, raddbg, &scope_bundle, ptr, 1); str8_list_push(arena, &dump, str8_lit("\n")); } } @@ -366,7 +366,7 @@ main(int argc, char **argv){ // SCOPE VMAP if (raddbg->scope_vmap != 0 && params->dump_scope_vmap){ str8_list_pushf(arena, &dump, "# SCOPE VMAP:\n"); - RADDBGI_VMapEntry *ptr = raddbg->scope_vmap; + RDI_VMapEntry *ptr = raddbg->scope_vmap; for (U32 i = 0; i < raddbg->scope_vmap_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); } @@ -376,33 +376,33 @@ main(int argc, char **argv){ // NAME MAPS if (raddbg->name_maps != 0 && params->dump_name_map){ str8_list_pushf(arena, &dump, "# NAME MAP:\n"); - RADDBGI_NameMap *ptr = raddbg->name_maps; + RDI_NameMap *ptr = raddbg->name_maps; for (U32 i = 0; i < raddbg->name_maps_count; i += 1, ptr += 1){ str8_list_pushf(arena, &dump, " name_map[%u]:\n", i); - RADDBGI_ParsedNameMap name_map = {0}; - raddbgi_name_map_parse(raddbg, ptr, &name_map); + RDI_ParsedNameMap name_map = {0}; + rdi_name_map_parse(raddbg, ptr, &name_map); - RADDBGI_NameMapBucket *bucket = name_map.buckets; + RDI_NameMapBucket *bucket = name_map.buckets; for (U32 j = 0; j < name_map.bucket_count; j += 1, bucket += 1){ if (bucket->node_count > 0){ str8_list_pushf(arena, &dump, " bucket[%u]:\n", j); - RADDBGI_NameMapNode *node = name_map.nodes + bucket->first_node; - RADDBGI_NameMapNode *node_opl = node + bucket->node_count; + RDI_NameMapNode *node = name_map.nodes + bucket->first_node; + RDI_NameMapNode *node_opl = node + bucket->node_count; for (; node < node_opl; node += 1){ String8 string = {0}; - string.str = raddbgi_string_from_idx(raddbg, node->string_idx, &string.size); + string.str = rdi_string_from_idx(raddbg, node->string_idx, &string.size); str8_list_pushf(arena, &dump, " match \"%.*s\": ", str8_varg(string)); if (node->match_count == 1){ str8_list_pushf(arena, &dump, "%u", node->match_idx_or_idx_run_first); } else{ - RADDBGI_U32 idx_count = 0; - RADDBGI_U32 *idx_run = - raddbgi_idx_run_from_first_count(raddbg, node->match_idx_or_idx_run_first, - node->match_count, &idx_count); + RDI_U32 idx_count = 0; + RDI_U32 *idx_run = + rdi_idx_run_from_first_count(raddbg, node->match_idx_or_idx_run_first, + node->match_count, &idx_count); if (idx_count > 0){ - RADDBGI_U32 last = idx_count - 1; + RDI_U32 last = idx_count - 1; for (U32 k = 0; k < last; k += 1){ str8_list_pushf(arena, &dump, "%u, ", idx_run[k]); } diff --git a/src/raddbgi_dump/raddbgi_dump.h b/src/raddbgi_dump/raddbgi_dump.h index 4b555ddd..c7b43265 100644 --- a/src/raddbgi_dump/raddbgi_dump.h +++ b/src/raddbgi_dump/raddbgi_dump.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_DUMP_H -#define RADDBGI_DUMP_H +#ifndef RDI_DUMP_H +#define RDI_DUMP_H //////////////////////////////// //~ Program Parameters Type @@ -42,4 +42,4 @@ typedef struct RADDBGIDUMP_Params{ static RADDBGIDUMP_Params *raddbgidump_params_from_cmd_line(Arena *arena, CmdLine *cmdline); -#endif //RADDBGI_DUMP_H +#endif //RDI_DUMP_H diff --git a/src/raddbgi_dump/raddbgi_stringize.c b/src/raddbgi_dump/raddbgi_stringize.c index a2ef8976..b87898fa 100644 --- a/src/raddbgi_dump/raddbgi_stringize.c +++ b/src/raddbgi_dump/raddbgi_stringize.c @@ -5,12 +5,12 @@ //~ RADDBG Common Stringize Functions static String8 -raddbgi_string_from_data_section_tag(RADDBGI_DataSectionTag tag){ +rdi_string_from_data_section_tag(RDI_DataSectionTag tag){ String8 result = {0}; switch (tag){ #define X(N,C) case C: result = str8_lit(#N); break; #define Y(N) - RADDBGI_DataSectionTagXList(X,Y) + RDI_DataSectionTagXList(X,Y) #undef X #undef Y } @@ -18,36 +18,36 @@ raddbgi_string_from_data_section_tag(RADDBGI_DataSectionTag tag){ } static String8 -raddbgi_string_from_arch(RADDBGI_Arch arch){ +rdi_string_from_arch(RDI_Arch arch){ String8 result = {0}; switch (arch){ default: result = str8_lit(""); break; - case RADDBGI_Arch_X86: result = str8_lit("x86"); break; - case RADDBGI_Arch_X64: result = str8_lit("x64"); break; + case RDI_Arch_X86: result = str8_lit("x86"); break; + case RDI_Arch_X64: result = str8_lit("x64"); break; } return(result); } static String8 -raddbgi_string_from_language(RADDBGI_Language language){ +rdi_string_from_language(RDI_Language language){ String8 result = {0}; switch (language){ #define X(name,code) case code: result = str8_lit(#name); break; - RADDBGI_LanguageXList(X) + RDI_LanguageXList(X) #undef X } return(result); } static String8 -raddbgi_string_from_type_kind(RADDBGI_TypeKind type_kind){ +rdi_string_from_type_kind(RDI_TypeKind type_kind){ String8 result = {0}; switch (type_kind){ default: result = str8_lit(""); break; #define X(name,code) case code: result = str8_lit(#name); break; #define XZ(name,code,size) X(name,code) #define Y(a,n) - RADDBGI_TypeKindXList(X,XZ,Y) + RDI_TypeKindXList(X,XZ,Y) #undef X #undef XZ #undef Y @@ -56,24 +56,24 @@ raddbgi_string_from_type_kind(RADDBGI_TypeKind type_kind){ } static String8 -raddbgi_string_from_member_kind(RADDBGI_MemberKind member_kind){ +rdi_string_from_member_kind(RDI_MemberKind member_kind){ String8 result = {0}; switch (member_kind){ default: result = str8_lit(""); break; #define X(N,C) case C: result = str8_lit(#N); break; - RADDBGI_MemberKindXList(X) + RDI_MemberKindXList(X) #undef X } return(result); } static String8 -raddbgi_string_from_local_kind(RADDBGI_LocalKind local_kind){ +rdi_string_from_local_kind(RDI_LocalKind local_kind){ String8 result = {0}; switch (local_kind){ default: result = str8_lit(""); break; - case RADDBGI_LocalKind_Parameter: result = str8_lit("Parameter"); break; - case RADDBGI_LocalKind_Variable: result = str8_lit("Variable"); break; + case RDI_LocalKind_Parameter: result = str8_lit("Parameter"); break; + case RDI_LocalKind_Variable: result = str8_lit("Variable"); break; } return(result); } @@ -83,59 +83,59 @@ raddbgi_string_from_local_kind(RADDBGI_LocalKind local_kind){ //~ RADDBG Flags Stringize Functions static void -raddbgi_stringize_binary_section_flags(Arena *arena, String8List *out, - RADDBGI_BinarySectionFlags flags){ +rdi_stringize_binary_section_flags(Arena *arena, String8List *out, + RDI_BinarySectionFlags flags){ if (flags == 0){ str8_list_push(arena, out, str8_lit("0")); } - if (flags & RADDBGI_BinarySectionFlag_Read){ + if (flags & RDI_BinarySectionFlag_Read){ str8_list_push(arena, out, str8_lit("Read ")); } - if (flags & RADDBGI_BinarySectionFlag_Write){ + if (flags & RDI_BinarySectionFlag_Write){ str8_list_push(arena, out, str8_lit("Write ")); } - if (flags & RADDBGI_BinarySectionFlag_Execute){ + if (flags & RDI_BinarySectionFlag_Execute){ str8_list_push(arena, out, str8_lit("Execute ")); } } static void -raddbgi_stringize_type_modifier_flags(Arena *arena, String8List *out, - RADDBGI_TypeModifierFlags flags){ +rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, + RDI_TypeModifierFlags flags){ if (flags == 0){ str8_list_push(arena, out, str8_lit("0")); } - if (flags & RADDBGI_TypeModifierFlag_Const){ + if (flags & RDI_TypeModifierFlag_Const){ str8_list_push(arena, out, str8_lit("Const ")); } - if (flags & RADDBGI_TypeModifierFlag_Volatile){ + if (flags & RDI_TypeModifierFlag_Volatile){ str8_list_push(arena, out, str8_lit("Volatile ")); } } static void -raddbgi_stringize_user_defined_type_flags(Arena *arena, String8List *out, - RADDBGI_UserDefinedTypeFlags flags){ +rdi_stringize_user_defined_type_flags(Arena *arena, String8List *out, + RDI_UserDefinedTypeFlags flags){ if (flags == 0){ str8_list_push(arena, out, str8_lit("0")); } - if (flags & RADDBGI_UserDefinedTypeFlag_EnumMembers){ + if (flags & RDI_UserDefinedTypeFlag_EnumMembers){ str8_list_push(arena, out, str8_lit("EnumMembers ")); } } static void -raddbgi_stringize_link_flags(Arena *arena, String8List *out, RADDBGI_LinkFlags flags){ +rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags){ if (flags == 0){ str8_list_push(arena, out, str8_lit("0")); } - if (flags & RADDBGI_LinkFlag_External){ + if (flags & RDI_LinkFlag_External){ str8_list_push(arena, out, str8_lit("External ")); } - if (flags & RADDBGI_LinkFlag_TypeScoped){ + if (flags & RDI_LinkFlag_TypeScoped){ str8_list_push(arena, out, str8_lit("TypeScoped ")); } - if (flags & RADDBGI_LinkFlag_ProcScoped){ + if (flags & RDI_LinkFlag_ProcScoped){ str8_list_push(arena, out, str8_lit("ProcScoped ")); } } @@ -144,82 +144,82 @@ raddbgi_stringize_link_flags(Arena *arena, String8List *out, RADDBGI_LinkFlags f //////////////////////////////// //~ RADDBG Compound Stringize Functions -static char raddbgi_stringize_spaces[] = " "; +static char rdi_stringize_spaces[] = " "; static void -raddbgi_stringize_data_sections(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - U32 indent_level){ +rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *parsed, + U32 indent_level){ U64 data_section_count = parsed->dsec_count; - RADDBGI_DataSection *ptr = parsed->dsecs; + RDI_DataSection *ptr = parsed->dsecs; for (U64 i = 0; i < data_section_count; i += 1, ptr += 1){ - String8 tag_str = raddbgi_string_from_data_section_tag(ptr->tag); + String8 tag_str = rdi_string_from_data_section_tag(ptr->tag); str8_list_pushf(arena, out, "%.*sdata_section[%5u] = {0x%08llx, %7u, %7u} %.*s\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, i, ptr->off, ptr->encoded_size, ptr->unpacked_size, str8_varg(tag_str)); } } static void -raddbgi_stringize_top_level_info(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_TopLevelInfo *tli, U32 indent_level){ - String8 arch_str = raddbgi_string_from_arch(tli->architecture); +rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_TopLevelInfo *tli, U32 indent_level){ + String8 arch_str = rdi_string_from_arch(tli->architecture); String8 exe_name = {0}; - exe_name.str = raddbgi_string_from_idx(parsed, tli->exe_name_string_idx, &exe_name.size); + exe_name.str = rdi_string_from_idx(parsed, tli->exe_name_string_idx, &exe_name.size); str8_list_pushf(arena, out, "%.*sarchitecture=%.*s\n", - indent_level, raddbgi_stringize_spaces, str8_varg(arch_str)); + indent_level, rdi_stringize_spaces, str8_varg(arch_str)); str8_list_pushf(arena, out, "%.*sexe_name='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(exe_name)); + indent_level, rdi_stringize_spaces, str8_varg(exe_name)); str8_list_pushf(arena, out, "%.*svoff_max=0x%08llx\n", - indent_level, raddbgi_stringize_spaces, tli->voff_max); + indent_level, rdi_stringize_spaces, tli->voff_max); } static void -raddbgi_stringize_binary_section(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_BinarySection *bin_section, U32 indent_level){ +rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_BinarySection *bin_section, U32 indent_level){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, bin_section->name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, bin_section->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(name)); + indent_level, rdi_stringize_spaces, str8_varg(name)); - str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbgi_stringize_spaces); - raddbgi_stringize_binary_section_flags(arena, out, bin_section->flags); + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_binary_section_flags(arena, out, bin_section->flags); str8_list_pushf(arena, out, "\n"); str8_list_pushf(arena, out, "%.*svoff_first=0x%08x\n", - indent_level, raddbgi_stringize_spaces, bin_section->voff_first); + indent_level, rdi_stringize_spaces, bin_section->voff_first); str8_list_pushf(arena, out, "%.*svoff_opl =0x%08x\n", - indent_level, raddbgi_stringize_spaces, bin_section->voff_opl); + indent_level, rdi_stringize_spaces, bin_section->voff_opl); str8_list_pushf(arena, out, "%.*sfoff_first=0x%08x\n", - indent_level, raddbgi_stringize_spaces, bin_section->foff_first); + indent_level, rdi_stringize_spaces, bin_section->foff_first); str8_list_pushf(arena, out, "%.*sfoff_opl =0x%08x\n", - indent_level, raddbgi_stringize_spaces, bin_section->foff_opl); + indent_level, rdi_stringize_spaces, bin_section->foff_opl); } static void -raddbgi_stringize_file_path(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_FilePathBundle *bundle, RADDBGI_FilePathNode *file_path, - U32 indent_level){ +rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, + U32 indent_level){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, file_path->name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, file_path->name_string_idx, &name.size); U32 this_idx = (U32)(file_path - bundle->file_paths); if (file_path->source_file_idx == 0){ str8_list_pushf(arena, out, "%.*s[%u] '%.*s'\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, this_idx, str8_varg(name)); } else{ str8_list_pushf(arena, out, "%.*s[%u] '%.*s'; source_file=%u\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, this_idx, str8_varg(name), file_path->source_file_idx); } for (U32 child = file_path->first_child; child != 0;){ // get node for child - RADDBGI_FilePathNode *child_node = 0; + RDI_FilePathNode *child_node = 0; if (child < bundle->file_path_count){ child_node = bundle->file_paths + child; } @@ -228,7 +228,7 @@ raddbgi_stringize_file_path(Arena *arena, String8List *out, RADDBGI_Parsed *pars } // stringize child - raddbgi_stringize_file_path(arena, out, parsed, bundle, child_node, indent_level + 1); + rdi_stringize_file_path(arena, out, parsed, bundle, child_node, indent_level + 1); // increment iterator child = child_node->next_sibling; @@ -236,14 +236,14 @@ raddbgi_stringize_file_path(Arena *arena, String8List *out, RADDBGI_Parsed *pars } static void -raddbgi_stringize_source_file(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_SourceFile *source_file, U32 indent_level){ +rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_SourceFile *source_file, U32 indent_level){ // extract line map data - RADDBGI_ParsedLineMap line_map = {0}; - raddbgi_line_map_from_source_file(parsed, source_file, &line_map); + RDI_ParsedLineMap line_map = {0}; + rdi_line_map_from_source_file(parsed, source_file, &line_map); // stringize line map data - str8_list_pushf(arena, out, "%.*slines:\n", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); for (U32 i = 0; i < line_map.count; i += 1){ U32 line_num = line_map.nums[i]; @@ -261,7 +261,7 @@ raddbgi_stringize_source_file(Arena *arena, String8List *out, RADDBGI_Parsed *pa } str8_list_pushf(arena, out, "%.*s %u: ", - indent_level, raddbgi_stringize_spaces, line_num); + indent_level, rdi_stringize_spaces, line_num); U32 first = line_map.ranges[i]; U32 opl_raw = line_map.ranges[i + 1]; @@ -272,7 +272,7 @@ raddbgi_stringize_source_file(Arena *arena, String8List *out, RADDBGI_Parsed *pa } else{ str8_list_pushf(arena, out, "%.*s0x%08x\n", - indent_level + digit_count + 3, raddbgi_stringize_spaces, + indent_level + digit_count + 3, rdi_stringize_spaces, line_map.voffs[j]); } } @@ -280,57 +280,57 @@ raddbgi_stringize_source_file(Arena *arena, String8List *out, RADDBGI_Parsed *pa } static void -raddbgi_stringize_unit(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_Unit *unit, U32 indent_level){ +rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_Unit *unit, U32 indent_level){ String8 unit_name = {0}; - unit_name.str = raddbgi_string_from_idx(parsed, unit->unit_name_string_idx, &unit_name.size); + unit_name.str = rdi_string_from_idx(parsed, unit->unit_name_string_idx, &unit_name.size); String8 compiler_name = {0}; - compiler_name.str = raddbgi_string_from_idx(parsed, unit->compiler_name_string_idx, - &compiler_name.size); + compiler_name.str = rdi_string_from_idx(parsed, unit->compiler_name_string_idx, + &compiler_name.size); str8_list_pushf(arena, out, "%.*sunit_name='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(unit_name)); + indent_level, rdi_stringize_spaces, str8_varg(unit_name)); str8_list_pushf(arena, out, "%.*scompiler_name='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(compiler_name)); + indent_level, rdi_stringize_spaces, str8_varg(compiler_name)); str8_list_pushf(arena, out, "%.*ssource_file_path=%u\n", - indent_level, raddbgi_stringize_spaces, unit->source_file_path_node); + indent_level, rdi_stringize_spaces, unit->source_file_path_node); str8_list_pushf(arena, out, "%.*sobject_file_path=%u\n", - indent_level, raddbgi_stringize_spaces, unit->object_file_path_node); + indent_level, rdi_stringize_spaces, unit->object_file_path_node); str8_list_pushf(arena, out, "%.*sarchive_file_path=%u\n", - indent_level, raddbgi_stringize_spaces, unit->archive_file_path_node); + indent_level, rdi_stringize_spaces, unit->archive_file_path_node); str8_list_pushf(arena, out, "%.*sbuild_path=%u\n", - indent_level, raddbgi_stringize_spaces, unit->build_path_node); + indent_level, rdi_stringize_spaces, unit->build_path_node); - String8 language_str = raddbgi_string_from_language(unit->language); + String8 language_str = rdi_string_from_language(unit->language); str8_list_pushf(arena, out, "%.*slanguage=%.*s\n", - indent_level, raddbgi_stringize_spaces, str8_varg(language_str)); + indent_level, rdi_stringize_spaces, str8_varg(language_str)); // extract line info data - RADDBGI_ParsedLineInfo line_info = {0}; - raddbgi_line_info_from_unit(parsed, unit, &line_info); + RDI_ParsedLineInfo line_info = {0}; + rdi_line_info_from_unit(parsed, unit, &line_info); // stringize line info - str8_list_pushf(arena, out, "%.*slines:\n", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); for (U32 i = 0; i < line_info.count; i += 1){ U64 first = line_info.voffs[i]; U64 opl = line_info.voffs[i + 1]; - RADDBGI_Line *line = line_info.lines + i; - RADDBGI_Column *col = 0; + RDI_Line *line = line_info.lines + i; + RDI_Column *col = 0; if (i < line_info.col_count){ col = line_info.cols + i; } if (col == 0){ str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, first, opl, line->file_idx, line->line_num); } else{ str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u; columns=[%u,%u)\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, first, opl, line->file_idx, line->line_num, col->col_first, col->col_opl); } @@ -338,19 +338,19 @@ raddbgi_stringize_unit(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, } static void -raddbgi_stringize_type_node(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_TypeNode *type, U32 indent_level){ - RADDBGI_TypeKind kind = type->kind; - String8 type_kind_str = raddbgi_string_from_type_kind(kind); +rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_TypeNode *type, U32 indent_level){ + RDI_TypeKind kind = type->kind; + String8 type_kind_str = rdi_string_from_type_kind(kind); str8_list_pushf(arena, out, "%.*skind=%.*s\n", - indent_level, raddbgi_stringize_spaces, str8_varg(type_kind_str)); + indent_level, rdi_stringize_spaces, str8_varg(type_kind_str)); switch (type->kind){ - case RADDBGI_TypeKind_Modifier: + case RDI_TypeKind_Modifier: { - str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbgi_stringize_spaces); - raddbgi_stringize_type_modifier_flags(arena, out, type->flags); + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_type_modifier_flags(arena, out, type->flags); str8_list_push(arena, out, str8_lit("\n")); }break; @@ -358,42 +358,42 @@ raddbgi_stringize_type_node(Arena *arena, String8List *out, RADDBGI_Parsed *pars { if (type->flags != 0){ str8_list_pushf(arena, out, "%.*sflags=%x (missing stringizer path)", - indent_level, raddbgi_stringize_spaces, type->flags); + indent_level, rdi_stringize_spaces, type->flags); } }break; } str8_list_pushf(arena, out, "%.*sbyte_size=%u\n", - indent_level, raddbgi_stringize_spaces, type->byte_size); + indent_level, rdi_stringize_spaces, type->byte_size); - if (RADDBGI_TypeKind_FirstBuiltIn <= kind && - kind <= RADDBGI_TypeKind_LastBuiltIn){ + if (RDI_TypeKind_FirstBuiltIn <= kind && + kind <= RDI_TypeKind_LastBuiltIn){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, type->built_in.name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, type->built_in.name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sbuilt_in.name='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(name)); + indent_level, rdi_stringize_spaces, str8_varg(name)); } - else if (RADDBGI_TypeKind_FirstConstructed <= kind && - kind <= RADDBGI_TypeKind_LastConstructed){ + else if (RDI_TypeKind_FirstConstructed <= kind && + kind <= RDI_TypeKind_LastConstructed){ str8_list_pushf(arena, out, "%.*sconstructed.direct_type=%u\n", - indent_level, raddbgi_stringize_spaces, type->constructed.direct_type_idx); + indent_level, rdi_stringize_spaces, type->constructed.direct_type_idx); - if (type->kind == RADDBGI_TypeKind_Array){ + if (type->kind == RDI_TypeKind_Array){ str8_list_pushf(arena, out, "%.*sconstructed.array_count=%u\n", - indent_level, raddbgi_stringize_spaces, type->constructed.count); + indent_level, rdi_stringize_spaces, type->constructed.count); } - if (type->kind == RADDBGI_TypeKind_Function || - type->kind == RADDBGI_TypeKind_Method){ + if (type->kind == RDI_TypeKind_Function || + type->kind == RDI_TypeKind_Method){ U32 run_first = type->constructed.param_idx_run_first; U32 run_count_raw = type->constructed.count; U32 run_count = 0; - U32 *run = raddbgi_idx_run_from_first_count(parsed, run_first, run_count_raw, &run_count); + U32 *run = rdi_idx_run_from_first_count(parsed, run_first, run_count_raw, &run_count); U32 this_type_idx = 0; - if (run_count > 0 && type->kind == RADDBGI_TypeKind_Method){ + if (run_count > 0 && type->kind == RDI_TypeKind_Method){ this_type_idx = run[0]; run += 1; run_count -= 1; @@ -401,11 +401,11 @@ raddbgi_stringize_type_node(Arena *arena, String8List *out, RADDBGI_Parsed *pars if (this_type_idx != 0){ str8_list_pushf(arena, out, "%.*sconstructed.this_type=%u\n", - indent_level, raddbgi_stringize_spaces, this_type_idx); + indent_level, rdi_stringize_spaces, this_type_idx); } str8_list_pushf(arena, out, "%.*sconstructed.params={", - indent_level, raddbgi_stringize_spaces); + indent_level, rdi_stringize_spaces); if (run_count > 0){ U32 last = run_count - 1; @@ -419,63 +419,63 @@ raddbgi_stringize_type_node(Arena *arena, String8List *out, RADDBGI_Parsed *pars } } - else if (RADDBGI_TypeKind_FirstUserDefined <= kind && - kind <= RADDBGI_TypeKind_LastUserDefined){ + else if (RDI_TypeKind_FirstUserDefined <= kind && + kind <= RDI_TypeKind_LastUserDefined){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, type->user_defined.name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*suser_defined.name='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(name)); + indent_level, rdi_stringize_spaces, str8_varg(name)); str8_list_pushf(arena, out, "%.*suser_defined.direct_type=%u\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, type->user_defined.direct_type_idx); str8_list_pushf(arena, out, "%.*suser_defined.udt=%u\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, type->user_defined.udt_idx); } - else if (kind == RADDBGI_TypeKind_Bitfield){ + else if (kind == RDI_TypeKind_Bitfield){ str8_list_pushf(arena, out, "%.*sbitfield.off=%u\n", - indent_level, raddbgi_stringize_spaces, type->bitfield.off); + indent_level, rdi_stringize_spaces, type->bitfield.off); str8_list_pushf(arena, out, "%.*sbitfield.size=%u\n", - indent_level, raddbgi_stringize_spaces, type->bitfield.size); + indent_level, rdi_stringize_spaces, type->bitfield.size); } } static void -raddbgi_stringize_udt(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_UDTMemberBundle *member_bundle, RADDBGI_UDT *udt, - U32 indent_level){ +rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_UDTMemberBundle *member_bundle, RDI_UDT *udt, + U32 indent_level){ str8_list_pushf(arena, out, "%.*sself_type=%u\n", - indent_level, raddbgi_stringize_spaces, udt->self_type_idx); + indent_level, rdi_stringize_spaces, udt->self_type_idx); - str8_list_pushf(arena, out, "%.*sflags=", indent_level, raddbgi_stringize_spaces); - raddbgi_stringize_user_defined_type_flags(arena, out, udt->flags); + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_user_defined_type_flags(arena, out, udt->flags); str8_list_push(arena, out, str8_lit("\n")); if (udt->file_idx != 0){ str8_list_pushf(arena, out, "%.*sloc={file=%u; line=%u; col=%u}\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, udt->file_idx, udt->line, udt->col); } // enum members - if (udt->flags & RADDBGI_UserDefinedTypeFlag_EnumMembers){ + if (udt->flags & RDI_UserDefinedTypeFlag_EnumMembers){ U32 first_raw = udt->member_first; U32 opl_raw = first_raw + udt->member_count; U32 opl = ClampTop(opl_raw, member_bundle->enum_member_count); U32 first = ClampTop(first_raw, opl); if (first < opl){ - str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, raddbgi_stringize_spaces); - RADDBGI_EnumMember *enum_member = member_bundle->enum_members + first; + str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); + RDI_EnumMember *enum_member = member_bundle->enum_members + first; for (U32 i = first; i < opl; i += 1, enum_member += 1){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, enum_member->name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, enum_member->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*s '%.*s' %llu\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, str8_varg(name), enum_member->val); } - str8_list_pushf(arena, out, "%.*s}\n", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); } } @@ -487,117 +487,117 @@ raddbgi_stringize_udt(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, U32 first = ClampTop(first_raw, opl); if (first < opl){ - str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, raddbgi_stringize_spaces); - RADDBGI_Member *member = member_bundle->members + first; + str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); + RDI_Member *member = member_bundle->members + first; for (U32 i = first; i < opl; i += 1, member += 1){ - str8_list_pushf(arena, out, "%.*s {\n", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*s {\n", indent_level, rdi_stringize_spaces); - String8 kind_str = raddbgi_string_from_member_kind(member->kind); + String8 kind_str = rdi_string_from_member_kind(member->kind); str8_list_pushf(arena, out, "%.*s kind=%.*s\n", - indent_level, raddbgi_stringize_spaces, str8_varg(kind_str)); + indent_level, rdi_stringize_spaces, str8_varg(kind_str)); if (member->name_string_idx != 0){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, member->name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, member->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*s name='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(name)); + indent_level, rdi_stringize_spaces, str8_varg(name)); } str8_list_pushf(arena, out, "%.*s type=%u\n", - indent_level, raddbgi_stringize_spaces, member->type_idx); + indent_level, rdi_stringize_spaces, member->type_idx); str8_list_pushf(arena, out, "%.*s off=%u\n", - indent_level, raddbgi_stringize_spaces, member->off); + indent_level, rdi_stringize_spaces, member->off); - str8_list_pushf(arena, out, "%.*s }\n", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*s }\n", indent_level, rdi_stringize_spaces); } - str8_list_pushf(arena, out, "%.*s}\n", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); } } } static void -raddbgi_stringize_global_variable(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_GlobalVariable *global_variable, U32 indent_level){ +rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_GlobalVariable *global_variable, U32 indent_level){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, global_variable->name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, global_variable->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(name)); + indent_level, rdi_stringize_spaces, str8_varg(name)); - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbgi_stringize_spaces); - raddbgi_stringize_link_flags(arena, out, global_variable->link_flags); + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, global_variable->link_flags); str8_list_push(arena, out, str8_lit("\n")); str8_list_pushf(arena, out, "%.*svoff=0x%08llx\n", - indent_level, raddbgi_stringize_spaces, global_variable->voff); + indent_level, rdi_stringize_spaces, global_variable->voff); str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, raddbgi_stringize_spaces, global_variable->type_idx); + indent_level, rdi_stringize_spaces, global_variable->type_idx); str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, raddbgi_stringize_spaces, global_variable->container_idx); + indent_level, rdi_stringize_spaces, global_variable->container_idx); } static void -raddbgi_stringize_thread_variable(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_ThreadVariable *thread_var, - U32 indent_level){ +rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_ThreadVariable *thread_var, + U32 indent_level){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, thread_var->name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, thread_var->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(name)); + indent_level, rdi_stringize_spaces, str8_varg(name)); - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbgi_stringize_spaces); - raddbgi_stringize_link_flags(arena, out, thread_var->link_flags); + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, thread_var->link_flags); str8_list_push(arena, out, str8_lit("\n")); str8_list_pushf(arena, out, "%.*stls_off=0x%08x\n", - indent_level, raddbgi_stringize_spaces, thread_var->tls_off); + indent_level, rdi_stringize_spaces, thread_var->tls_off); str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, raddbgi_stringize_spaces, thread_var->type_idx); + indent_level, rdi_stringize_spaces, thread_var->type_idx); str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, raddbgi_stringize_spaces, thread_var->container_idx); + indent_level, rdi_stringize_spaces, thread_var->container_idx); } static void -raddbgi_stringize_procedure(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_Procedure *proc, U32 indent_level){ +rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_Procedure *proc, U32 indent_level){ String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, proc->name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, proc->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(name)); + indent_level, rdi_stringize_spaces, str8_varg(name)); String8 link_name = {0}; - link_name.str = raddbgi_string_from_idx(parsed, proc->link_name_string_idx, &link_name.size); + link_name.str = rdi_string_from_idx(parsed, proc->link_name_string_idx, &link_name.size); str8_list_pushf(arena, out, "%.*slink_name='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(link_name)); + indent_level, rdi_stringize_spaces, str8_varg(link_name)); - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, raddbgi_stringize_spaces); - raddbgi_stringize_link_flags(arena, out, proc->link_flags); + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, proc->link_flags); str8_list_push(arena, out, str8_lit("\n")); str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, raddbgi_stringize_spaces, proc->type_idx); + indent_level, rdi_stringize_spaces, proc->type_idx); str8_list_pushf(arena, out, "%.*sroot_scope_idx=%u\n", - indent_level, raddbgi_stringize_spaces, proc->root_scope_idx); + indent_level, rdi_stringize_spaces, proc->root_scope_idx); str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, raddbgi_stringize_spaces, proc->container_idx); + indent_level, rdi_stringize_spaces, proc->container_idx); } static void -raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_ScopeBundle *bundle, RADDBGI_Scope *scope, U32 indent_level){ +rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level){ U32 this_idx = (U32)(scope - bundle->scopes); str8_list_pushf(arena, out, "%.*s[%u]\n", - indent_level, raddbgi_stringize_spaces, this_idx); + indent_level, rdi_stringize_spaces, this_idx); str8_list_pushf(arena, out, "%.*s proc_idx=%u\n", - indent_level, raddbgi_stringize_spaces, scope->proc_idx); + indent_level, rdi_stringize_spaces, scope->proc_idx); // voff ranges { @@ -614,18 +614,18 @@ raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, if (voff_range_opl - voff_range_first > 2){ str8_list_pushf(arena, out, "%.*s voff_ranges={\n", - indent_level, raddbgi_stringize_spaces); + indent_level, rdi_stringize_spaces); for (U32 i = voff_range_first; i < voff_range_opl; i += 2, voff_ptr += 2){ str8_list_pushf(arena, out, "%.*s [0x%08llx, 0x%08llx)\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, voff_ptr[0], voff_ptr[1]); } str8_list_pushf(arena, out, "%.*s }\n", - indent_level, raddbgi_stringize_spaces); + indent_level, rdi_stringize_spaces); } else if (voff_range_opl - voff_range_first == 2){ str8_list_pushf(arena, out, "%.*s voff_range=[0x%08llx, 0x%08llx)\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, voff_ptr[0], voff_ptr[1]); } } @@ -637,60 +637,60 @@ raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, U32 local_opl = ClampTop(local_opl_raw, bundle->local_count); if (local_first < local_opl){ - RADDBGI_Local *local_ptr = bundle->locals + local_first; + RDI_Local *local_ptr = bundle->locals + local_first; for (U32 i = local_first; i < local_opl; i += 1, local_ptr += 1){ str8_list_pushf(arena, out, "%.*s local[%u]\n", - indent_level, raddbgi_stringize_spaces, i); + indent_level, rdi_stringize_spaces, i); - String8 local_kind_str = raddbgi_string_from_local_kind(local_ptr->kind); + String8 local_kind_str = rdi_string_from_local_kind(local_ptr->kind); str8_list_pushf(arena, out, "%.*s kind=%.*s\n", - indent_level, raddbgi_stringize_spaces, str8_varg(local_kind_str)); + indent_level, rdi_stringize_spaces, str8_varg(local_kind_str)); String8 name = {0}; - name.str = raddbgi_string_from_idx(parsed, local_ptr->name_string_idx, &name.size); + name.str = rdi_string_from_idx(parsed, local_ptr->name_string_idx, &name.size); str8_list_pushf(arena, out, "%.*s name='%.*s'\n", - indent_level, raddbgi_stringize_spaces, str8_varg(name)); + indent_level, rdi_stringize_spaces, str8_varg(name)); str8_list_pushf(arena, out, "%.*s type_idx=%u\n", - indent_level, raddbgi_stringize_spaces, local_ptr->type_idx); + indent_level, rdi_stringize_spaces, local_ptr->type_idx); U32 location_first = local_ptr->location_first; U32 location_opl_raw = local_ptr->location_opl; U32 location_opl = ClampTop(location_opl_raw, bundle->location_block_count); if (location_first < location_opl){ - str8_list_pushf(arena, out, "%.*s locations:\n", indent_level, raddbgi_stringize_spaces); - RADDBGI_LocationBlock *block_ptr = bundle->location_blocks + location_first; + str8_list_pushf(arena, out, "%.*s locations:\n", indent_level, rdi_stringize_spaces); + RDI_LocationBlock *block_ptr = bundle->location_blocks + location_first; for (U32 j = location_first; j < location_opl; j += 1, block_ptr += 1){ if (block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32){ - str8_list_pushf(arena, out, "%.*s case *always*:\n", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*s case *always*:\n", indent_level, rdi_stringize_spaces); } else{ str8_list_pushf(arena, out, "%.*s case [0x%08x, 0x%08x):\n", - indent_level, raddbgi_stringize_spaces, + indent_level, rdi_stringize_spaces, block_ptr->scope_off_first, block_ptr->scope_off_opl); } if (block_ptr->location_data_off >= bundle->location_data_size){ str8_list_pushf(arena, out, "%.*s \n", - indent_level, raddbgi_stringize_spaces); + indent_level, rdi_stringize_spaces); } else{ - str8_list_pushf(arena, out, "%.*s ", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); U8 *loc_data_opl = bundle->location_data + bundle->location_data_size; U8 *loc_base_ptr = bundle->location_data + block_ptr->location_data_off; - RADDBGI_LocationKind kind = (RADDBGI_LocationKind)*loc_base_ptr; + RDI_LocationKind kind = (RDI_LocationKind)*loc_base_ptr; switch (kind){ default: { str8_list_pushf(arena, out, "\n"); }break; - case RADDBGI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_AddrBytecodeStream: { str8_list_pushf(arena, out, "AddrBytecodeStream\n"); - str8_list_pushf(arena, out, "%.*s ", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); U8 *bytecode_ptr = loc_base_ptr + 1; for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); @@ -698,10 +698,10 @@ raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, str8_list_pushf(arena, out, "\n"); }break; - case RADDBGI_LocationKind_ValBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: { str8_list_pushf(arena, out, "ValBytecodeStream\n"); - str8_list_pushf(arena, out, "%.*s ", indent_level, raddbgi_stringize_spaces); + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); U8 *bytecode_ptr = loc_base_ptr + 1; for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); @@ -709,37 +709,37 @@ raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, str8_list_pushf(arena, out, "\n"); }break; - case RADDBGI_LocationKind_AddrRegisterPlusU16: + case RDI_LocationKind_AddrRegisterPlusU16: { - if (loc_base_ptr + sizeof(RADDBGI_LocationRegisterPlusU16) > loc_data_opl){ + if (loc_base_ptr + sizeof(RDI_LocationRegisterPlusU16) > loc_data_opl){ str8_list_pushf(arena, out, "AddrRegisterPlusU16( )\n"); } else{ - RADDBGI_LocationRegisterPlusU16 *loc = (RADDBGI_LocationRegisterPlusU16*)loc_base_ptr; + RDI_LocationRegisterPlusU16 *loc = (RDI_LocationRegisterPlusU16*)loc_base_ptr; str8_list_pushf(arena, out, "AddrRegisterPlusU16(reg: %u, off: %u)\n", loc->register_code, loc->offset); } }break; - case RADDBGI_LocationKind_AddrAddrRegisterPlusU16: + case RDI_LocationKind_AddrAddrRegisterPlusU16: { - if (loc_base_ptr + sizeof(RADDBGI_LocationRegisterPlusU16) > loc_data_opl){ + if (loc_base_ptr + sizeof(RDI_LocationRegisterPlusU16) > loc_data_opl){ str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16( )\n"); } else{ - RADDBGI_LocationRegisterPlusU16 *loc = (RADDBGI_LocationRegisterPlusU16*)loc_base_ptr; + RDI_LocationRegisterPlusU16 *loc = (RDI_LocationRegisterPlusU16*)loc_base_ptr; str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16(reg: %u, off: %u)\n", loc->register_code, loc->offset); } }break; - case RADDBGI_LocationKind_ValRegister: + case RDI_LocationKind_ValRegister: { - if (loc_base_ptr + sizeof(RADDBGI_LocationRegister) > loc_data_opl){ + if (loc_base_ptr + sizeof(RDI_LocationRegister) > loc_data_opl){ str8_list_pushf(arena, out, "ValRegister( )\n"); } else{ - RADDBGI_LocationRegister *loc = (RADDBGI_LocationRegister*)loc_base_ptr; + RDI_LocationRegister *loc = (RDI_LocationRegister*)loc_base_ptr; str8_list_pushf(arena, out, "ValRegister(reg: %u)\n", loc->register_code); } }break; @@ -756,7 +756,7 @@ raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, for (U32 child = scope->first_child_scope_idx; child != 0;){ // get scope for child - RADDBGI_Scope *child_scope = 0; + RDI_Scope *child_scope = 0; if (child < bundle->scope_count){ child_scope = bundle->scopes + child; } @@ -765,12 +765,12 @@ raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, } // stringize child - raddbgi_stringize_scope(arena, out, parsed, bundle, child_scope, indent_level + 1); + rdi_stringize_scope(arena, out, parsed, bundle, child_scope, indent_level + 1); // increment iterator child = child_scope->next_sibling_scope_idx; } str8_list_pushf(arena, out, "%.*s[/%u]\n", - indent_level, raddbgi_stringize_spaces, this_idx); + indent_level, rdi_stringize_spaces, this_idx); } diff --git a/src/raddbgi_dump/raddbgi_stringize.h b/src/raddbgi_dump/raddbgi_stringize.h index e74d3a86..51534416 100644 --- a/src/raddbgi_dump/raddbgi_stringize.h +++ b/src/raddbgi_dump/raddbgi_stringize.h @@ -7,108 +7,108 @@ //////////////////////////////// //~ RADDBG Stringize Helper Types -typedef struct RADDBGI_FilePathBundle{ - RADDBGI_FilePathNode *file_paths; +typedef struct RDI_FilePathBundle{ + RDI_FilePathNode *file_paths; U32 file_path_count; -} RADDBGI_FilePathBundle; +} RDI_FilePathBundle; -typedef struct RADDBGI_UDTMemberBundle{ - RADDBGI_Member *members; - RADDBGI_EnumMember *enum_members; +typedef struct RDI_UDTMemberBundle{ + RDI_Member *members; + RDI_EnumMember *enum_members; U32 member_count; U32 enum_member_count; -} RADDBGI_UDTMemberBundle; +} RDI_UDTMemberBundle; -typedef struct RADDBGI_ScopeBundle{ - RADDBGI_Scope *scopes; +typedef struct RDI_ScopeBundle{ + RDI_Scope *scopes; U64 *scope_voffs; - RADDBGI_Local *locals; - RADDBGI_LocationBlock *location_blocks; + RDI_Local *locals; + RDI_LocationBlock *location_blocks; U8 *location_data; U32 scope_count; U32 scope_voff_count; U32 local_count; U32 location_block_count; U32 location_data_size; -} RADDBGI_ScopeBundle; +} RDI_ScopeBundle; //////////////////////////////// //~ RADDBG Common Stringize Functions -static String8 raddbgi_string_from_data_section_tag(RADDBGI_DataSectionTag tag); -static String8 raddbgi_string_from_arch(RADDBGI_Arch arch); -static String8 raddbgi_string_from_language(RADDBGI_Language language); -static String8 raddbgi_string_from_type_kind(RADDBGI_TypeKind type_kind); -static String8 raddbgi_string_from_member_kind(RADDBGI_MemberKind member_kind); -static String8 raddbgi_string_from_local_kind(RADDBGI_LocalKind local_kind); +static String8 rdi_string_from_data_section_tag(RDI_DataSectionTag tag); +static String8 rdi_string_from_arch(RDI_Arch arch); +static String8 rdi_string_from_language(RDI_Language language); +static String8 rdi_string_from_type_kind(RDI_TypeKind type_kind); +static String8 rdi_string_from_member_kind(RDI_MemberKind member_kind); +static String8 rdi_string_from_local_kind(RDI_LocalKind local_kind); //////////////////////////////// //~ RADDBG Flags Stringize Functions -static void raddbgi_stringize_binary_section_flags(Arena *arena, String8List *out, - RADDBGI_BinarySectionFlags flags); +static void rdi_stringize_binary_section_flags(Arena *arena, String8List *out, + RDI_BinarySectionFlags flags); -static void raddbgi_stringize_type_modifier_flags(Arena *arena, String8List *out, - RADDBGI_TypeModifierFlags flags); +static void rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, + RDI_TypeModifierFlags flags); -static void raddbgi_stringize_user_defined_type_flags(Arena *arena, String8List *out, - RADDBGI_UserDefinedTypeFlags flags); +static void rdi_stringize_user_defined_type_flags(Arena *arena, String8List *out, + RDI_UserDefinedTypeFlags flags); -static void raddbgi_stringize_link_flags(Arena *arena, String8List *out, - RADDBGI_LinkFlags flags); +static void rdi_stringize_link_flags(Arena *arena, String8List *out, + RDI_LinkFlags flags); //////////////////////////////// //~ RADDBG Compound Stringize Functions static void -raddbgi_stringize_data_sections(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - U32 indent_level); - -static void -raddbgi_stringize_top_level_info(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_TopLevelInfo *tli, U32 indent_level); - -static void -raddbgi_stringize_binary_section(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_BinarySection *bin_section, U32 indent_level); - -static void -raddbgi_stringize_file_path(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_FilePathBundle *bundle, RADDBGI_FilePathNode *file_path, +rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *parsed, U32 indent_level); static void -raddbgi_stringize_source_file(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_SourceFile *source_file, U32 indent_level); +rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_TopLevelInfo *tli, U32 indent_level); static void -raddbgi_stringize_unit(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_Unit *unit, U32 indent_level); +rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_BinarySection *bin_section, U32 indent_level); static void -raddbgi_stringize_type_node(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_TypeNode *type, U32 indent_level); +rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, + U32 indent_level); static void -raddbgi_stringize_udt(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_UDTMemberBundle *bundle, RADDBGI_UDT *udt, - U32 indent_level); +rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_SourceFile *source_file, U32 indent_level); static void -raddbgi_stringize_global_variable(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_GlobalVariable *global_variable, U32 indent_level); +rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_Unit *unit, U32 indent_level); static void -raddbgi_stringize_thread_variable(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_ThreadVariable *thread_var, - U32 indent_level); +rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_TypeNode *type, U32 indent_level); static void -raddbgi_stringize_procedure(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_Procedure *proc, U32 indent_level); +rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_UDTMemberBundle *bundle, RDI_UDT *udt, + U32 indent_level); static void -raddbgi_stringize_scope(Arena *arena, String8List *out, RADDBGI_Parsed *parsed, - RADDBGI_ScopeBundle *bundle, RADDBGI_Scope *scope, U32 indent_level); +rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_GlobalVariable *global_variable, U32 indent_level); -#endif //RADDBGI_STRINGIZE_H +static void +rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_ThreadVariable *thread_var, + U32 indent_level); + +static void +rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_Procedure *proc, U32 indent_level); + +static void +rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level); + +#endif // RADDBGI_STRINGIZE_H diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 643cd794..94d9dcd8 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -151,21 +151,21 @@ p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline) //////////////////////////////// //~ rjf: COFF <-> RADDBGI Canonical Conversions -internal RADDBGI_BinarySectionFlags -raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) +internal RDI_BinarySectionFlags +rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) { - RADDBGI_BinarySectionFlags result = 0; + RDI_BinarySectionFlags result = 0; if(flags & COFF_SectionFlag_MEM_READ) { - result |= RADDBGI_BinarySectionFlag_Read; + result |= RDI_BinarySectionFlag_Read; } if(flags & COFF_SectionFlag_MEM_WRITE) { - result |= RADDBGI_BinarySectionFlag_Write; + result |= RDI_BinarySectionFlag_Write; } if(flags & COFF_SectionFlag_MEM_EXECUTE) { - result |= RADDBGI_BinarySectionFlag_Execute; + result |= RDI_BinarySectionFlag_Execute; } return(result); } @@ -173,14 +173,14 @@ raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) //////////////////////////////// //~ rjf: CodeView <-> RADDBGI Canonical Conversions -internal RADDBGI_Arch -raddbgi_arch_from_cv_arch(CV_Arch cv_arch) +internal RDI_Arch +rdi_arch_from_cv_arch(CV_Arch cv_arch) { - RADDBGI_Arch result = 0; + RDI_Arch result = 0; switch(cv_arch) { - case CV_Arch_8086: result = RADDBGI_Arch_X86; break; - case CV_Arch_X64: result = RADDBGI_Arch_X64; break; + case CV_Arch_8086: result = RDI_Arch_X86; break; + case CV_Arch_X64: result = RDI_Arch_X64; break; //case CV_Arch_8080: break; //case CV_Arch_80286: break; //case CV_Arch_80386: break; @@ -243,26 +243,26 @@ raddbgi_arch_from_cv_arch(CV_Arch cv_arch) return(result); } -internal RADDBGI_RegisterCode -raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code) +internal RDI_RegisterCode +rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) { - RADDBGI_RegisterCode result = 0; + RDI_RegisterCode result = 0; switch(arch) { - case RADDBGI_Arch_X86: + case RDI_Arch_X86: { switch(reg_code) { -#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBGI_RegisterCode_X86_##RDN; break; +#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegisterCode_X86_##RDN; break; CV_Reg_X86_XList(X) #undef X } }break; - case RADDBGI_Arch_X64: + case RDI_Arch_X64: { switch(reg_code) { -#define X(CVN,C,RDN,BP,BZ) case C: result = RADDBGI_RegisterCode_X64_##RDN; break; +#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegisterCode_X64_##RDN; break; CV_Reg_X64_XList(X) #undef X } @@ -271,14 +271,14 @@ raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code) return(result); } -internal RADDBGI_Language -raddbgi_language_from_cv_language(CV_Language cv_language) +internal RDI_Language +rdi_language_from_cv_language(CV_Language cv_language) { - RADDBGI_Language result = 0; + RDI_Language result = 0; switch(cv_language) { - case CV_Language_C: result = RADDBGI_Language_C; break; - case CV_Language_CXX: result = RADDBGI_Language_CPlusPlus; break; + case CV_Language_C: result = RDI_Language_C; break; + case CV_Language_CXX: result = RDI_Language_CPlusPlus; break; //case CV_Language_FORTRAN: result = ; break; //case CV_Language_MASM: result = ; break; //case CV_Language_PASCAL: result = ; break; @@ -310,7 +310,7 @@ p2r_ctx_alloc(P2R_CtxParams *params, RDIM_Root *out_root) P2R_Ctx *pdb_ctx = push_array(arena, P2R_Ctx, 1); pdb_ctx->arena = arena; pdb_ctx->arch = params->arch; - pdb_ctx->addr_size = raddbgi_addr_size_from_arch(pdb_ctx->arch); + pdb_ctx->addr_size = rdi_addr_size_from_arch(pdb_ctx->arch); pdb_ctx->hash = params->tpi_hash; pdb_ctx->leaf = params->tpi_leaf; pdb_ctx->sections = params->sections->sections; @@ -1217,165 +1217,165 @@ p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype) { case CV_BasicType_VOID: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Void, str8_lit("void")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Void, str8_lit("void")); }break; case CV_BasicType_HRESULT: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("HRESULT")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Handle, str8_lit("HRESULT")); }break; case CV_BasicType_RCHAR: case CV_BasicType_CHAR: case CV_BasicType_CHAR8: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Char8, str8_lit("char")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Char8, str8_lit("char")); }break; case CV_BasicType_UCHAR: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_UChar8, str8_lit("UCHAR")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_UChar8, str8_lit("UCHAR")); }break; case CV_BasicType_WCHAR: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_UChar16, str8_lit("WCHAR")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_UChar16, str8_lit("WCHAR")); }break; case CV_BasicType_CHAR16: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Char16, str8_lit("CHAR16")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Char16, str8_lit("CHAR16")); }break; case CV_BasicType_CHAR32: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Char32, str8_lit("CHAR32")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Char32, str8_lit("CHAR32")); }break; case CV_BasicType_BOOL8: case CV_BasicType_INT8: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S8, str8_lit("S8")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S8, str8_lit("S8")); }break; case CV_BasicType_BOOL16: case CV_BasicType_INT16: case CV_BasicType_SHORT: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S16, str8_lit("S16")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S16, str8_lit("S16")); }break; case CV_BasicType_BOOL32: case CV_BasicType_INT32: case CV_BasicType_LONG: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S32, str8_lit("S32")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S32, str8_lit("S32")); }break; case CV_BasicType_BOOL64: case CV_BasicType_INT64: case CV_BasicType_QUAD: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S64, str8_lit("S64")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S64, str8_lit("S64")); }break; case CV_BasicType_INT128: case CV_BasicType_OCT: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_S128, str8_lit("S128")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S128, str8_lit("S128")); }break; case CV_BasicType_UINT8: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U8, str8_lit("U8")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U8, str8_lit("U8")); }break; case CV_BasicType_UINT16: case CV_BasicType_USHORT: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U16, str8_lit("U16")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U16, str8_lit("U16")); }break; case CV_BasicType_UINT32: case CV_BasicType_ULONG: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U32, str8_lit("U32")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U32, str8_lit("U32")); }break; case CV_BasicType_UINT64: case CV_BasicType_UQUAD: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U64, str8_lit("U64")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U64, str8_lit("U64")); }break; case CV_BasicType_UINT128: case CV_BasicType_UOCT: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_U128, str8_lit("U128")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U128, str8_lit("U128")); }break; case CV_BasicType_FLOAT16: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F16, str8_lit("F16")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F16, str8_lit("F16")); }break; case CV_BasicType_FLOAT32: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F32, str8_lit("F32")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F32, str8_lit("F32")); }break; case CV_BasicType_FLOAT32PP: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F32PP, str8_lit("F32PP")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F32PP, str8_lit("F32PP")); }break; case CV_BasicType_FLOAT48: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F48, str8_lit("F48")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F48, str8_lit("F48")); }break; case CV_BasicType_FLOAT64: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F64, str8_lit("F64")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F64, str8_lit("F64")); }break; case CV_BasicType_FLOAT80: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F80, str8_lit("F80")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F80, str8_lit("F80")); }break; case CV_BasicType_FLOAT128: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_F128, str8_lit("F128")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F128, str8_lit("F128")); }break; case CV_BasicType_COMPLEX32: { basic_type = - rdim_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF32, str8_lit("ComplexF32")); + rdim_type_basic(ctx->root, RDI_TypeKind_ComplexF32, str8_lit("ComplexF32")); }break; case CV_BasicType_COMPLEX64: { basic_type = - rdim_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF64, str8_lit("ComplexF64")); + rdim_type_basic(ctx->root, RDI_TypeKind_ComplexF64, str8_lit("ComplexF64")); }break; case CV_BasicType_COMPLEX80: { basic_type = - rdim_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF80, str8_lit("ComplexF80")); + rdim_type_basic(ctx->root, RDI_TypeKind_ComplexF80, str8_lit("ComplexF80")); }break; case CV_BasicType_COMPLEX128: { basic_type = - rdim_type_basic(ctx->root, RADDBGI_TypeKind_ComplexF128, str8_lit("ComplexF128")); + rdim_type_basic(ctx->root, RDI_TypeKind_ComplexF128, str8_lit("ComplexF128")); }break; case CV_BasicType_PTR: { - basic_type = rdim_type_basic(ctx->root, RADDBGI_TypeKind_Handle, str8_lit("PTR")); + basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Handle, str8_lit("PTR")); }break; } @@ -1397,7 +1397,7 @@ p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype) case CV_BasicPointerKind_16_32BIT: case CV_BasicPointerKind_64BIT: { - constructed_type = rdim_type_pointer(ctx->root, basic_type, RADDBGI_TypeKind_Ptr); + constructed_type = rdim_type_pointer(ctx->root, basic_type, RDI_TypeKind_Ptr); }break; } @@ -1440,14 +1440,14 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) { CV_LeafModifier *modifier = (CV_LeafModifier*)first; - RADDBGI_TypeModifierFlags flags = 0; + RDI_TypeModifierFlags flags = 0; if(modifier->flags & CV_ModifierFlag_Const) { - flags |= RADDBGI_TypeModifierFlag_Const; + flags |= RDI_TypeModifierFlag_Const; } if(modifier->flags & CV_ModifierFlag_Volatile) { - flags |= RADDBGI_TypeModifierFlag_Volatile; + flags |= RDI_TypeModifierFlag_Volatile; } RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, modifier->itype); @@ -1476,33 +1476,33 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // TODO(allen): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead // extract modifier flags - RADDBGI_TypeModifierFlags modifier_flags = 0; + RDI_TypeModifierFlags modifier_flags = 0; if(pointer->attribs & CV_PointerAttrib_Const) { - modifier_flags |= RADDBGI_TypeModifierFlag_Const; + modifier_flags |= RDI_TypeModifierFlag_Const; } if(pointer->attribs & CV_PointerAttrib_Volatile) { - modifier_flags |= RADDBGI_TypeModifierFlag_Volatile; + modifier_flags |= RDI_TypeModifierFlag_Volatile; } // determine type kind - RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Ptr; + RDI_TypeKind type_kind = RDI_TypeKind_Ptr; if(pointer->attribs & CV_PointerAttrib_LRef) { - type_kind = RADDBGI_TypeKind_LRef; + type_kind = RDI_TypeKind_LRef; } else if(pointer->attribs & CV_PointerAttrib_RRef) { - type_kind = RADDBGI_TypeKind_RRef; + type_kind = RDI_TypeKind_RRef; } if(ptr_mode == CV_PointerMode_LRef) { - type_kind = RADDBGI_TypeKind_LRef; + type_kind = RDI_TypeKind_LRef; } else if(ptr_mode == CV_PointerMode_RRef) { - type_kind = RADDBGI_TypeKind_RRef; + type_kind = RDI_TypeKind_RRef; } RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, pointer->itype); @@ -1628,10 +1628,10 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // incomplete type if(lf_struct->props & CV_TypeProp_FwdRef) { - RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_IncompleteStruct; + RDI_TypeKind type_kind = RDI_TypeKind_IncompleteStruct; if(range->hdr.kind == CV_LeafKind_CLASS) { - type_kind = RADDBGI_TypeKind_IncompleteClass; + type_kind = RDI_TypeKind_IncompleteClass; } result = rdim_type_incomplete(ctx->root, type_kind, name); } @@ -1639,10 +1639,10 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // complete type else { - RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Struct; + RDI_TypeKind type_kind = RDI_TypeKind_Struct; if(range->hdr.kind == CV_LeafKind_CLASS) { - type_kind = RADDBGI_TypeKind_Class; + type_kind = RDI_TypeKind_Class; } result = rdim_type_udt(ctx->root, type_kind, name, size_u64); @@ -1679,10 +1679,10 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // incomplete type if(lf_struct->props & CV_TypeProp_FwdRef) { - RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_IncompleteStruct; + RDI_TypeKind type_kind = RDI_TypeKind_IncompleteStruct; if(range->hdr.kind == CV_LeafKind_CLASS2) { - type_kind = RADDBGI_TypeKind_IncompleteClass; + type_kind = RDI_TypeKind_IncompleteClass; } result = rdim_type_incomplete(ctx->root, type_kind, name); } @@ -1690,10 +1690,10 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // complete type else { - RADDBGI_TypeKind type_kind = RADDBGI_TypeKind_Struct; + RDI_TypeKind type_kind = RDI_TypeKind_Struct; if(range->hdr.kind == CV_LeafKind_CLASS2) { - type_kind = RADDBGI_TypeKind_Class; + type_kind = RDI_TypeKind_Class; } result = rdim_type_udt(ctx->root, type_kind, name, size_u64); @@ -1730,13 +1730,13 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) if(lf_union->props & CV_TypeProp_FwdRef) { result = - rdim_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteUnion, name); + rdim_type_incomplete(ctx->root, RDI_TypeKind_IncompleteUnion, name); } // complete type else { - result = rdim_type_udt(ctx->root, RADDBGI_TypeKind_Union, name, size_u64); + result = rdim_type_udt(ctx->root, RDI_TypeKind_Union, name, size_u64); // remember to revisit this for members { @@ -1765,7 +1765,7 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) // incomplete type if(lf_enum->props & CV_TypeProp_FwdRef) { - result = rdim_type_incomplete(ctx->root, RADDBGI_TypeKind_IncompleteEnum, name); + result = rdim_type_incomplete(ctx->root, RDI_TypeKind_IncompleteEnum, name); } // complete type @@ -2092,7 +2092,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) Temp scratch = scratch_begin(0, 0); String8 data = sym->data; U64 user_id_base = (((U64)sym_unique_id) << 32); - U64 sym_unique_id_hash = raddbgi_hash((U8*)&sym_unique_id, sizeof(sym_unique_id)); + U64 sym_unique_id_hash = rdi_hash((U8*)&sym_unique_id, sizeof(sym_unique_id)); ////////////////////////////// //- rjf: PASS 1: map out data associations @@ -2388,17 +2388,17 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) U32 var_off = regrel32->reg_off; // need arch for analyzing register stuff - RADDBGI_Arch arch = ctx->arch; + RDI_Arch arch = ctx->arch; U64 addr_size = ctx->addr_size; // determine if this is a parameter - RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; + RDI_LocalKind local_kind = RDI_LocalKind_Variable; { B32 is_stack_reg = 0; switch (arch) { - case RADDBGI_Arch_X86: is_stack_reg = (cv_reg == CV_Regx86_ESP); break; - case RADDBGI_Arch_X64: is_stack_reg = (cv_reg == CV_Regx64_RSP); break; + case RDI_Arch_X86: is_stack_reg = (cv_reg == CV_Regx86_ESP); break; + case RDI_Arch_X64: is_stack_reg = (cv_reg == CV_Regx64_RSP); break; } if(is_stack_reg) { @@ -2411,7 +2411,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } if(var_off > frame_size) { - local_kind = RADDBGI_LocalKind_Parameter; + local_kind = RDI_LocalKind_Parameter; } } } @@ -2435,18 +2435,18 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) B32 extra_indirection_to_value = 0; switch (arch) { - case RADDBGI_Arch_X86: + case RDI_Arch_X86: { - if(local_kind == RADDBGI_LocalKind_Parameter && + if(local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))) { extra_indirection_to_value = 1; } }break; - case RADDBGI_Arch_X64: + case RDI_Arch_X64: { - if(local_kind == RADDBGI_LocalKind_Parameter && + if(local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))) { extra_indirection_to_value = 1; @@ -2455,7 +2455,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) } // get raddbg register code - RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); // TODO(allen): real byte_size & byte_pos from cv_reg goes here U32 byte_size = 8; U32 byte_pos = 0; @@ -2542,10 +2542,10 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) else { // local kind - RADDBGI_LocalKind local_kind = RADDBGI_LocalKind_Variable; + RDI_LocalKind local_kind = RDI_LocalKind_Variable; if(slocal->flags & CV_LocalFlag_Param) { - local_kind = RADDBGI_LocalKind_Parameter; + local_kind = RDI_LocalKind_Parameter; } // emit local @@ -2565,7 +2565,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) rdim_local_set_basic_info(ctx->root, local_var, &info); defrange_target = rdim_location_set_from_local(ctx->root, local_var); - defrange_target_is_param = (local_kind == RADDBGI_LocalKind_Parameter); + defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); } }break; @@ -2576,9 +2576,9 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; // TODO(allen): offset & size from cv_reg code - RADDBGI_Arch arch = ctx->arch; + RDI_Arch arch = ctx->arch; CV_Reg cv_reg = defrange_register->reg; - RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); // setup location RDIM_Location *location = rdim_location_val_reg(ctx->root, register_code); @@ -2602,7 +2602,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // select frame pointer register CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); - RADDBGI_RegisterCode fp_register_code = + RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); // setup location @@ -2635,9 +2635,9 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) { // TODO(allen): offset & size from cv_reg code - RADDBGI_Arch arch = ctx->arch; + RDI_Arch arch = ctx->arch; CV_Reg cv_reg = defrange_subfield_register->reg; - RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); // setup location RDIM_Location *location = rdim_location_val_reg(ctx->root, register_code); @@ -2663,7 +2663,7 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) // select frame pointer register CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); - RADDBGI_RegisterCode fp_register_code = + RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); // setup location @@ -2687,9 +2687,9 @@ p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; // TODO(allen): offset & size from cv_reg code - RADDBGI_Arch arch = ctx->arch; + RDI_Arch arch = ctx->arch; CV_Reg cv_reg = defrange_register_rel->reg; - RADDBGI_RegisterCode register_code = raddbgi_reg_code_from_cv_reg_code(arch, cv_reg); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); U32 byte_size = ctx->addr_size; U32 byte_pos = 0; @@ -3009,7 +3009,7 @@ p2r_known_global_insert(Arena *arena, P2R_KnownGlobalSet *set, String8 name, U64 internal RDIM_Location* p2r_location_from_addr_reg_off(P2R_Ctx *ctx, - RADDBGI_RegisterCode reg_code, + RDI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, @@ -3032,13 +3032,13 @@ p2r_location_from_addr_reg_off(P2R_Ctx *ctx, Arena *arena = ctx->arena; RDIM_EvalBytecode bytecode = {0}; - U32 regread_param = RADDBGI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); - rdim_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_RegRead, regread_param); + U32 regread_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, regread_param); rdim_bytecode_push_sconst(arena, &bytecode, offset); - rdim_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_Add, 0); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); if(extra_indirection) { - rdim_bytecode_push_op(arena, &bytecode, RADDBGI_EvalOp_MemRead, ctx->addr_size); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, ctx->addr_size); } result = rdim_location_addr_bytecode_stream(ctx->root, &bytecode); @@ -3067,14 +3067,14 @@ p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, RDIM_Symbol *proc, B32 param_base) return(result); } -internal RADDBGI_RegisterCode -p2r_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg encoded_reg) +internal RDI_RegisterCode +p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg) { - RADDBGI_RegisterCode result = 0; + RDI_RegisterCode result = 0; switch (arch) { - case RADDBGI_Arch_X86: + case RDI_Arch_X86: { switch (encoded_reg) { @@ -3085,30 +3085,30 @@ p2r_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, CV_EncodedFramePtrReg e }break; case CV_EncodedFramePtrReg_FramePtr: { - result = RADDBGI_RegisterCode_X86_ebp; + result = RDI_RegisterCode_X86_ebp; }break; case CV_EncodedFramePtrReg_BasePtr: { - result = RADDBGI_RegisterCode_X86_ebx; + result = RDI_RegisterCode_X86_ebx; }break; } }break; - case RADDBGI_Arch_X64: + case RDI_Arch_X64: { switch (encoded_reg) { case CV_EncodedFramePtrReg_StackPtr: { - result = RADDBGI_RegisterCode_X64_rsp; + result = RDI_RegisterCode_X64_rsp; }break; case CV_EncodedFramePtrReg_FramePtr: { - result = RADDBGI_RegisterCode_X64_rbp; + result = RDI_RegisterCode_X64_rbp; }break; case CV_EncodedFramePtrReg_BasePtr: { - result = RADDBGI_RegisterCode_X64_r13; + result = RDI_RegisterCode_X64_r13; }break; } }break; @@ -3435,7 +3435,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ U64 exe_hash = 0; if(out->good_parse && params->input_exe_data.size > 0) ProfScope("hash exe") { - exe_hash = raddbgi_hash(params->input_exe_data.str, params->input_exe_data.size); + exe_hash = rdi_hash(params->input_exe_data.str, params->input_exe_data.size); } // output generation @@ -3444,7 +3444,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ { // determine arch - RADDBGI_Arch architecture = RADDBGI_Arch_NULL; + RDI_Arch architecture = RDI_Arch_NULL; // TODO(rjf): in some cases, the first compilation unit has a zero // architecture, as it's sometimes used as a "nil" unit. this causes bugs // in later stages of conversion - particularly, this was detected via @@ -3462,14 +3462,14 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ { if(sym_for_unit[comp_unit_idx] != 0) { - architecture = raddbgi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); + architecture = rdi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); if(architecture != 0) { break; } } } - U64 addr_size = raddbgi_addr_size_from_arch(architecture); + U64 addr_size = rdi_addr_size_from_arch(architecture); // predict symbol counts @@ -3541,8 +3541,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ char *name_first = (char*)coff_ptr->name; char *name_opl = name_first + sizeof(coff_ptr->name); String8 name = str8_cstring_capped(name_first, name_opl); - RADDBGI_BinarySectionFlags flags = - raddbgi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); + RDI_BinarySectionFlags flags = + rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); rdim_add_binary_section(root, name, flags, coff_ptr->voff, coff_ptr->voff + coff_ptr->vsize, coff_ptr->foff, coff_ptr->foff + coff_ptr->fsize); @@ -3589,7 +3589,7 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 archive_file = unit->group_name; // extract langauge - RADDBGI_Language lang = raddbgi_language_from_cv_language(sym->info.language); + RDI_Language lang = rdi_language_from_cv_language(sym->info.language); // basic per unit info RDIM_Unit *unit_handle = rdim_unit_handle_from_user_id(root, i, i); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index a1b4787d..42f382fa 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_FROM_PDB_H -#define RADDBGI_FROM_PDB_H +#ifndef RDI_FROM_PDB_H +#define RDI_FROM_PDB_H //////////////////////////////// //~ rjf: Conversion Parameters Type @@ -130,7 +130,7 @@ struct P2R_KnownGlobalSet typedef struct P2R_CtxParams P2R_CtxParams; struct P2R_CtxParams { - RADDBGI_Arch arch; + RDI_Arch arch; PDB_TpiHashParsed *tpi_hash; CV_LeafParsed *tpi_leaf; PDB_CoffSectionArray *sections; @@ -171,7 +171,7 @@ struct P2R_Ctx Arena *arena; // INPUT data - RADDBGI_Arch arch; + RDI_Arch arch; U64 addr_size; PDB_TpiHashParsed *hash; CV_LeafParsed *leaf; @@ -214,14 +214,14 @@ internal P2R_Params *p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline); //////////////////////////////// //~ rjf: COFF => RADDBGI Canonical Conversions -internal RADDBGI_BinarySectionFlags raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); +internal RDI_BinarySectionFlags rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); //////////////////////////////// //~ rjf: CodeView => RADDBGI Canonical Conversions -internal RADDBGI_Arch raddbgi_arch_from_cv_arch(CV_Arch arch); -internal RADDBGI_RegisterCode raddbgi_reg_code_from_cv_reg_code(RADDBGI_Arch arch, CV_Reg reg_code); -internal RADDBGI_Language raddbgi_language_from_cv_language(CV_Language language); +internal RDI_Arch rdi_arch_from_cv_arch(CV_Arch arch); +internal RDI_RegisterCode rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code); +internal RDI_Language rdi_language_from_cv_language(CV_Language language); //////////////////////////////// //~ rjf: Conversion Implementation Helpers @@ -303,7 +303,7 @@ internal void p2r_known_global_insert(Arena *arena, P2R_KnownGlobalSet *set, // location info helpers internal RDIM_Location* p2r_location_from_addr_reg_off(P2R_Ctx *ctx, - RADDBGI_RegisterCode reg_code, + RDI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, @@ -313,8 +313,8 @@ internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, RDIM_Symbol *proc, B32 param_base); -internal RADDBGI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RADDBGI_Arch arch, - CV_EncodedFramePtrReg encoded_reg); +internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, + CV_EncodedFramePtrReg encoded_reg); internal void p2r_location_over_lvar_addr_range(P2R_Ctx *ctx, RDIM_LocationSet *locset, @@ -332,4 +332,4 @@ internal String8 p2r_link_name_find(P2R_LinkNameMap *map, U64 voff); internal P2R_Out *p2r_convert(Arena *arena, P2R_Params *params); -#endif // RADDBGI_FROM_PDB_H +#endif // RDI_FROM_PDB_H diff --git a/src/raddbgi_make_local/raddbgi_make_local.h b/src/raddbgi_make_local/raddbgi_make_local.h index c5f7fee0..2f3236da 100644 --- a/src/raddbgi_make_local/raddbgi_make_local.h +++ b/src/raddbgi_make_local/raddbgi_make_local.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RADDBGI_CONS_LOCAL_H -#define RADDBGI_CONS_LOCAL_H +#ifndef RDI_CONS_LOCAL_H +#define RDI_CONS_LOCAL_H // rjf: base layer memory ops #define RDIM_MEMSET_OVERRIDE @@ -11,11 +11,11 @@ #define rdim_memcpy MemoryCopy // rjf: base layer string overrides -#define RADDBGI_STRING8_OVERRIDE +#define RDI_STRING8_OVERRIDE #define RDIM_String8 String8 #define RDIM_String8_BaseMember str #define RDIM_String8_SizeMember size -#define RADDBGI_STRING8LIST_OVERRIDE +#define RDI_STRING8LIST_OVERRIDE #define RDIM_String8Node String8Node #define RDIM_String8Node_NextPtrMember next #define RDIM_String8Node_StringMember string @@ -43,4 +43,4 @@ #include "lib_raddbgi_make/raddbgi_make.h" -#endif // RADDBGI_CONS_LOCAL_H +#endif // RDI_CONS_LOCAL_H diff --git a/src/regs/raddbgi/generated/regs_raddbgi.meta.c b/src/regs/raddbgi/generated/regs_raddbgi.meta.c index bc4c0d55..763da2aa 100644 --- a/src/regs/raddbgi/generated/regs_raddbgi.meta.c +++ b/src/regs/raddbgi/generated/regs_raddbgi.meta.c @@ -3,9 +3,9 @@ //- GENERATED CODE -internal RADDBGI_RegisterCode regs_raddbgi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code) +internal RDI_RegisterCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code) { -RADDBGI_RegisterCode result = 0; +RDI_RegisterCode result = 0; switch(arch) { default:{}break; @@ -14,82 +14,82 @@ case Architecture_x64: switch(code) { default:{}break; -case REGS_RegCodeX64_rax:{result = RADDBGI_RegisterCode_X64_rax;}break; -case REGS_RegCodeX64_rcx:{result = RADDBGI_RegisterCode_X64_rcx;}break; -case REGS_RegCodeX64_rdx:{result = RADDBGI_RegisterCode_X64_rdx;}break; -case REGS_RegCodeX64_rbx:{result = RADDBGI_RegisterCode_X64_rbx;}break; -case REGS_RegCodeX64_rsp:{result = RADDBGI_RegisterCode_X64_rsp;}break; -case REGS_RegCodeX64_rbp:{result = RADDBGI_RegisterCode_X64_rbp;}break; -case REGS_RegCodeX64_rsi:{result = RADDBGI_RegisterCode_X64_rsi;}break; -case REGS_RegCodeX64_rdi:{result = RADDBGI_RegisterCode_X64_rdi;}break; -case REGS_RegCodeX64_r8:{result = RADDBGI_RegisterCode_X64_r8;}break; -case REGS_RegCodeX64_r9:{result = RADDBGI_RegisterCode_X64_r9;}break; -case REGS_RegCodeX64_r10:{result = RADDBGI_RegisterCode_X64_r10;}break; -case REGS_RegCodeX64_r11:{result = RADDBGI_RegisterCode_X64_r11;}break; -case REGS_RegCodeX64_r12:{result = RADDBGI_RegisterCode_X64_r12;}break; -case REGS_RegCodeX64_r13:{result = RADDBGI_RegisterCode_X64_r13;}break; -case REGS_RegCodeX64_r14:{result = RADDBGI_RegisterCode_X64_r14;}break; -case REGS_RegCodeX64_r15:{result = RADDBGI_RegisterCode_X64_r15;}break; -case REGS_RegCodeX64_fsbase:{result = RADDBGI_RegisterCode_X64_fsbase;}break; -case REGS_RegCodeX64_gsbase:{result = RADDBGI_RegisterCode_X64_gsbase;}break; -case REGS_RegCodeX64_rip:{result = RADDBGI_RegisterCode_X64_rip;}break; -case REGS_RegCodeX64_rflags:{result = RADDBGI_RegisterCode_X64_rflags;}break; -case REGS_RegCodeX64_dr0:{result = RADDBGI_RegisterCode_X64_dr0;}break; -case REGS_RegCodeX64_dr1:{result = RADDBGI_RegisterCode_X64_dr1;}break; -case REGS_RegCodeX64_dr2:{result = RADDBGI_RegisterCode_X64_dr2;}break; -case REGS_RegCodeX64_dr3:{result = RADDBGI_RegisterCode_X64_dr3;}break; -case REGS_RegCodeX64_dr4:{result = RADDBGI_RegisterCode_X64_dr4;}break; -case REGS_RegCodeX64_dr5:{result = RADDBGI_RegisterCode_X64_dr5;}break; -case REGS_RegCodeX64_dr6:{result = RADDBGI_RegisterCode_X64_dr6;}break; -case REGS_RegCodeX64_dr7:{result = RADDBGI_RegisterCode_X64_dr7;}break; -case REGS_RegCodeX64_fpr0:{result = RADDBGI_RegisterCode_X64_fpr0;}break; -case REGS_RegCodeX64_fpr1:{result = RADDBGI_RegisterCode_X64_fpr1;}break; -case REGS_RegCodeX64_fpr2:{result = RADDBGI_RegisterCode_X64_fpr2;}break; -case REGS_RegCodeX64_fpr3:{result = RADDBGI_RegisterCode_X64_fpr3;}break; -case REGS_RegCodeX64_fpr4:{result = RADDBGI_RegisterCode_X64_fpr4;}break; -case REGS_RegCodeX64_fpr5:{result = RADDBGI_RegisterCode_X64_fpr5;}break; -case REGS_RegCodeX64_fpr6:{result = RADDBGI_RegisterCode_X64_fpr6;}break; -case REGS_RegCodeX64_fpr7:{result = RADDBGI_RegisterCode_X64_fpr7;}break; -case REGS_RegCodeX64_st0:{result = RADDBGI_RegisterCode_X64_st0;}break; -case REGS_RegCodeX64_st1:{result = RADDBGI_RegisterCode_X64_st1;}break; -case REGS_RegCodeX64_st2:{result = RADDBGI_RegisterCode_X64_st2;}break; -case REGS_RegCodeX64_st3:{result = RADDBGI_RegisterCode_X64_st3;}break; -case REGS_RegCodeX64_st4:{result = RADDBGI_RegisterCode_X64_st4;}break; -case REGS_RegCodeX64_st5:{result = RADDBGI_RegisterCode_X64_st5;}break; -case REGS_RegCodeX64_st6:{result = RADDBGI_RegisterCode_X64_st6;}break; -case REGS_RegCodeX64_st7:{result = RADDBGI_RegisterCode_X64_st7;}break; -case REGS_RegCodeX64_fcw:{result = RADDBGI_RegisterCode_X64_fcw;}break; -case REGS_RegCodeX64_fsw:{result = RADDBGI_RegisterCode_X64_fsw;}break; -case REGS_RegCodeX64_ftw:{result = RADDBGI_RegisterCode_X64_ftw;}break; -case REGS_RegCodeX64_fop:{result = RADDBGI_RegisterCode_X64_fop;}break; -case REGS_RegCodeX64_fcs:{result = RADDBGI_RegisterCode_X64_fcs;}break; -case REGS_RegCodeX64_fds:{result = RADDBGI_RegisterCode_X64_fds;}break; -case REGS_RegCodeX64_fip:{result = RADDBGI_RegisterCode_X64_fip;}break; -case REGS_RegCodeX64_fdp:{result = RADDBGI_RegisterCode_X64_fdp;}break; -case REGS_RegCodeX64_mxcsr:{result = RADDBGI_RegisterCode_X64_mxcsr;}break; -case REGS_RegCodeX64_mxcsr_mask:{result = RADDBGI_RegisterCode_X64_mxcsr_mask;}break; -case REGS_RegCodeX64_ss:{result = RADDBGI_RegisterCode_X64_ss;}break; -case REGS_RegCodeX64_cs:{result = RADDBGI_RegisterCode_X64_cs;}break; -case REGS_RegCodeX64_ds:{result = RADDBGI_RegisterCode_X64_ds;}break; -case REGS_RegCodeX64_es:{result = RADDBGI_RegisterCode_X64_es;}break; -case REGS_RegCodeX64_fs:{result = RADDBGI_RegisterCode_X64_fs;}break; -case REGS_RegCodeX64_gs:{result = RADDBGI_RegisterCode_X64_gs;}break; -case REGS_RegCodeX64_ymm0:{result = RADDBGI_RegisterCode_X64_ymm0;}break; -case REGS_RegCodeX64_ymm1:{result = RADDBGI_RegisterCode_X64_ymm1;}break; -case REGS_RegCodeX64_ymm2:{result = RADDBGI_RegisterCode_X64_ymm2;}break; -case REGS_RegCodeX64_ymm3:{result = RADDBGI_RegisterCode_X64_ymm3;}break; -case REGS_RegCodeX64_ymm4:{result = RADDBGI_RegisterCode_X64_ymm4;}break; -case REGS_RegCodeX64_ymm5:{result = RADDBGI_RegisterCode_X64_ymm5;}break; -case REGS_RegCodeX64_ymm6:{result = RADDBGI_RegisterCode_X64_ymm6;}break; -case REGS_RegCodeX64_ymm7:{result = RADDBGI_RegisterCode_X64_ymm7;}break; -case REGS_RegCodeX64_ymm8:{result = RADDBGI_RegisterCode_X64_ymm8;}break; -case REGS_RegCodeX64_ymm9:{result = RADDBGI_RegisterCode_X64_ymm9;}break; -case REGS_RegCodeX64_ymm10:{result = RADDBGI_RegisterCode_X64_ymm10;}break; -case REGS_RegCodeX64_ymm11:{result = RADDBGI_RegisterCode_X64_ymm11;}break; -case REGS_RegCodeX64_ymm12:{result = RADDBGI_RegisterCode_X64_ymm12;}break; -case REGS_RegCodeX64_ymm13:{result = RADDBGI_RegisterCode_X64_ymm13;}break; -case REGS_RegCodeX64_ymm14:{result = RADDBGI_RegisterCode_X64_ymm14;}break; -case REGS_RegCodeX64_ymm15:{result = RADDBGI_RegisterCode_X64_ymm15;}break; +case REGS_RegCodeX64_rax:{result = RDI_RegisterCode_X64_rax;}break; +case REGS_RegCodeX64_rcx:{result = RDI_RegisterCode_X64_rcx;}break; +case REGS_RegCodeX64_rdx:{result = RDI_RegisterCode_X64_rdx;}break; +case REGS_RegCodeX64_rbx:{result = RDI_RegisterCode_X64_rbx;}break; +case REGS_RegCodeX64_rsp:{result = RDI_RegisterCode_X64_rsp;}break; +case REGS_RegCodeX64_rbp:{result = RDI_RegisterCode_X64_rbp;}break; +case REGS_RegCodeX64_rsi:{result = RDI_RegisterCode_X64_rsi;}break; +case REGS_RegCodeX64_rdi:{result = RDI_RegisterCode_X64_rdi;}break; +case REGS_RegCodeX64_r8:{result = RDI_RegisterCode_X64_r8;}break; +case REGS_RegCodeX64_r9:{result = RDI_RegisterCode_X64_r9;}break; +case REGS_RegCodeX64_r10:{result = RDI_RegisterCode_X64_r10;}break; +case REGS_RegCodeX64_r11:{result = RDI_RegisterCode_X64_r11;}break; +case REGS_RegCodeX64_r12:{result = RDI_RegisterCode_X64_r12;}break; +case REGS_RegCodeX64_r13:{result = RDI_RegisterCode_X64_r13;}break; +case REGS_RegCodeX64_r14:{result = RDI_RegisterCode_X64_r14;}break; +case REGS_RegCodeX64_r15:{result = RDI_RegisterCode_X64_r15;}break; +case REGS_RegCodeX64_fsbase:{result = RDI_RegisterCode_X64_fsbase;}break; +case REGS_RegCodeX64_gsbase:{result = RDI_RegisterCode_X64_gsbase;}break; +case REGS_RegCodeX64_rip:{result = RDI_RegisterCode_X64_rip;}break; +case REGS_RegCodeX64_rflags:{result = RDI_RegisterCode_X64_rflags;}break; +case REGS_RegCodeX64_dr0:{result = RDI_RegisterCode_X64_dr0;}break; +case REGS_RegCodeX64_dr1:{result = RDI_RegisterCode_X64_dr1;}break; +case REGS_RegCodeX64_dr2:{result = RDI_RegisterCode_X64_dr2;}break; +case REGS_RegCodeX64_dr3:{result = RDI_RegisterCode_X64_dr3;}break; +case REGS_RegCodeX64_dr4:{result = RDI_RegisterCode_X64_dr4;}break; +case REGS_RegCodeX64_dr5:{result = RDI_RegisterCode_X64_dr5;}break; +case REGS_RegCodeX64_dr6:{result = RDI_RegisterCode_X64_dr6;}break; +case REGS_RegCodeX64_dr7:{result = RDI_RegisterCode_X64_dr7;}break; +case REGS_RegCodeX64_fpr0:{result = RDI_RegisterCode_X64_fpr0;}break; +case REGS_RegCodeX64_fpr1:{result = RDI_RegisterCode_X64_fpr1;}break; +case REGS_RegCodeX64_fpr2:{result = RDI_RegisterCode_X64_fpr2;}break; +case REGS_RegCodeX64_fpr3:{result = RDI_RegisterCode_X64_fpr3;}break; +case REGS_RegCodeX64_fpr4:{result = RDI_RegisterCode_X64_fpr4;}break; +case REGS_RegCodeX64_fpr5:{result = RDI_RegisterCode_X64_fpr5;}break; +case REGS_RegCodeX64_fpr6:{result = RDI_RegisterCode_X64_fpr6;}break; +case REGS_RegCodeX64_fpr7:{result = RDI_RegisterCode_X64_fpr7;}break; +case REGS_RegCodeX64_st0:{result = RDI_RegisterCode_X64_st0;}break; +case REGS_RegCodeX64_st1:{result = RDI_RegisterCode_X64_st1;}break; +case REGS_RegCodeX64_st2:{result = RDI_RegisterCode_X64_st2;}break; +case REGS_RegCodeX64_st3:{result = RDI_RegisterCode_X64_st3;}break; +case REGS_RegCodeX64_st4:{result = RDI_RegisterCode_X64_st4;}break; +case REGS_RegCodeX64_st5:{result = RDI_RegisterCode_X64_st5;}break; +case REGS_RegCodeX64_st6:{result = RDI_RegisterCode_X64_st6;}break; +case REGS_RegCodeX64_st7:{result = RDI_RegisterCode_X64_st7;}break; +case REGS_RegCodeX64_fcw:{result = RDI_RegisterCode_X64_fcw;}break; +case REGS_RegCodeX64_fsw:{result = RDI_RegisterCode_X64_fsw;}break; +case REGS_RegCodeX64_ftw:{result = RDI_RegisterCode_X64_ftw;}break; +case REGS_RegCodeX64_fop:{result = RDI_RegisterCode_X64_fop;}break; +case REGS_RegCodeX64_fcs:{result = RDI_RegisterCode_X64_fcs;}break; +case REGS_RegCodeX64_fds:{result = RDI_RegisterCode_X64_fds;}break; +case REGS_RegCodeX64_fip:{result = RDI_RegisterCode_X64_fip;}break; +case REGS_RegCodeX64_fdp:{result = RDI_RegisterCode_X64_fdp;}break; +case REGS_RegCodeX64_mxcsr:{result = RDI_RegisterCode_X64_mxcsr;}break; +case REGS_RegCodeX64_mxcsr_mask:{result = RDI_RegisterCode_X64_mxcsr_mask;}break; +case REGS_RegCodeX64_ss:{result = RDI_RegisterCode_X64_ss;}break; +case REGS_RegCodeX64_cs:{result = RDI_RegisterCode_X64_cs;}break; +case REGS_RegCodeX64_ds:{result = RDI_RegisterCode_X64_ds;}break; +case REGS_RegCodeX64_es:{result = RDI_RegisterCode_X64_es;}break; +case REGS_RegCodeX64_fs:{result = RDI_RegisterCode_X64_fs;}break; +case REGS_RegCodeX64_gs:{result = RDI_RegisterCode_X64_gs;}break; +case REGS_RegCodeX64_ymm0:{result = RDI_RegisterCode_X64_ymm0;}break; +case REGS_RegCodeX64_ymm1:{result = RDI_RegisterCode_X64_ymm1;}break; +case REGS_RegCodeX64_ymm2:{result = RDI_RegisterCode_X64_ymm2;}break; +case REGS_RegCodeX64_ymm3:{result = RDI_RegisterCode_X64_ymm3;}break; +case REGS_RegCodeX64_ymm4:{result = RDI_RegisterCode_X64_ymm4;}break; +case REGS_RegCodeX64_ymm5:{result = RDI_RegisterCode_X64_ymm5;}break; +case REGS_RegCodeX64_ymm6:{result = RDI_RegisterCode_X64_ymm6;}break; +case REGS_RegCodeX64_ymm7:{result = RDI_RegisterCode_X64_ymm7;}break; +case REGS_RegCodeX64_ymm8:{result = RDI_RegisterCode_X64_ymm8;}break; +case REGS_RegCodeX64_ymm9:{result = RDI_RegisterCode_X64_ymm9;}break; +case REGS_RegCodeX64_ymm10:{result = RDI_RegisterCode_X64_ymm10;}break; +case REGS_RegCodeX64_ymm11:{result = RDI_RegisterCode_X64_ymm11;}break; +case REGS_RegCodeX64_ymm12:{result = RDI_RegisterCode_X64_ymm12;}break; +case REGS_RegCodeX64_ymm13:{result = RDI_RegisterCode_X64_ymm13;}break; +case REGS_RegCodeX64_ymm14:{result = RDI_RegisterCode_X64_ymm14;}break; +case REGS_RegCodeX64_ymm15:{result = RDI_RegisterCode_X64_ymm15;}break; } }break; case Architecture_x86: @@ -97,72 +97,72 @@ case Architecture_x86: switch(code) { default:{}break; -case REGS_RegCodeX86_eax:{result = RADDBGI_RegisterCode_X86_eax;}break; -case REGS_RegCodeX86_ecx:{result = RADDBGI_RegisterCode_X86_ecx;}break; -case REGS_RegCodeX86_edx:{result = RADDBGI_RegisterCode_X86_edx;}break; -case REGS_RegCodeX86_ebx:{result = RADDBGI_RegisterCode_X86_ebx;}break; -case REGS_RegCodeX86_esp:{result = RADDBGI_RegisterCode_X86_esp;}break; -case REGS_RegCodeX86_ebp:{result = RADDBGI_RegisterCode_X86_ebp;}break; -case REGS_RegCodeX86_esi:{result = RADDBGI_RegisterCode_X86_esi;}break; -case REGS_RegCodeX86_edi:{result = RADDBGI_RegisterCode_X86_edi;}break; -case REGS_RegCodeX86_fsbase:{result = RADDBGI_RegisterCode_X86_fsbase;}break; -case REGS_RegCodeX86_gsbase:{result = RADDBGI_RegisterCode_X86_gsbase;}break; -case REGS_RegCodeX86_eflags:{result = RADDBGI_RegisterCode_X86_eflags;}break; -case REGS_RegCodeX86_eip:{result = RADDBGI_RegisterCode_X86_eip;}break; -case REGS_RegCodeX86_dr0:{result = RADDBGI_RegisterCode_X86_dr0;}break; -case REGS_RegCodeX86_dr1:{result = RADDBGI_RegisterCode_X86_dr1;}break; -case REGS_RegCodeX86_dr2:{result = RADDBGI_RegisterCode_X86_dr2;}break; -case REGS_RegCodeX86_dr3:{result = RADDBGI_RegisterCode_X86_dr3;}break; -case REGS_RegCodeX86_dr4:{result = RADDBGI_RegisterCode_X86_dr4;}break; -case REGS_RegCodeX86_dr5:{result = RADDBGI_RegisterCode_X86_dr5;}break; -case REGS_RegCodeX86_dr6:{result = RADDBGI_RegisterCode_X86_dr6;}break; -case REGS_RegCodeX86_dr7:{result = RADDBGI_RegisterCode_X86_dr7;}break; -case REGS_RegCodeX86_fpr0:{result = RADDBGI_RegisterCode_X86_fpr0;}break; -case REGS_RegCodeX86_fpr1:{result = RADDBGI_RegisterCode_X86_fpr1;}break; -case REGS_RegCodeX86_fpr2:{result = RADDBGI_RegisterCode_X86_fpr2;}break; -case REGS_RegCodeX86_fpr3:{result = RADDBGI_RegisterCode_X86_fpr3;}break; -case REGS_RegCodeX86_fpr4:{result = RADDBGI_RegisterCode_X86_fpr4;}break; -case REGS_RegCodeX86_fpr5:{result = RADDBGI_RegisterCode_X86_fpr5;}break; -case REGS_RegCodeX86_fpr6:{result = RADDBGI_RegisterCode_X86_fpr6;}break; -case REGS_RegCodeX86_fpr7:{result = RADDBGI_RegisterCode_X86_fpr7;}break; -case REGS_RegCodeX86_st0:{result = RADDBGI_RegisterCode_X86_st0;}break; -case REGS_RegCodeX86_st1:{result = RADDBGI_RegisterCode_X86_st1;}break; -case REGS_RegCodeX86_st2:{result = RADDBGI_RegisterCode_X86_st2;}break; -case REGS_RegCodeX86_st3:{result = RADDBGI_RegisterCode_X86_st3;}break; -case REGS_RegCodeX86_st4:{result = RADDBGI_RegisterCode_X86_st4;}break; -case REGS_RegCodeX86_st5:{result = RADDBGI_RegisterCode_X86_st5;}break; -case REGS_RegCodeX86_st6:{result = RADDBGI_RegisterCode_X86_st6;}break; -case REGS_RegCodeX86_st7:{result = RADDBGI_RegisterCode_X86_st7;}break; -case REGS_RegCodeX86_fcw:{result = RADDBGI_RegisterCode_X86_fcw;}break; -case REGS_RegCodeX86_fsw:{result = RADDBGI_RegisterCode_X86_fsw;}break; -case REGS_RegCodeX86_ftw:{result = RADDBGI_RegisterCode_X86_ftw;}break; -case REGS_RegCodeX86_fop:{result = RADDBGI_RegisterCode_X86_fop;}break; -case REGS_RegCodeX86_fcs:{result = RADDBGI_RegisterCode_X86_fcs;}break; -case REGS_RegCodeX86_fds:{result = RADDBGI_RegisterCode_X86_fds;}break; -case REGS_RegCodeX86_fip:{result = RADDBGI_RegisterCode_X86_fip;}break; -case REGS_RegCodeX86_fdp:{result = RADDBGI_RegisterCode_X86_fdp;}break; -case REGS_RegCodeX86_mxcsr:{result = RADDBGI_RegisterCode_X86_mxcsr;}break; -case REGS_RegCodeX86_mxcsr_mask:{result = RADDBGI_RegisterCode_X86_mxcsr_mask;}break; -case REGS_RegCodeX86_ss:{result = RADDBGI_RegisterCode_X86_ss;}break; -case REGS_RegCodeX86_cs:{result = RADDBGI_RegisterCode_X86_cs;}break; -case REGS_RegCodeX86_ds:{result = RADDBGI_RegisterCode_X86_ds;}break; -case REGS_RegCodeX86_es:{result = RADDBGI_RegisterCode_X86_es;}break; -case REGS_RegCodeX86_fs:{result = RADDBGI_RegisterCode_X86_fs;}break; -case REGS_RegCodeX86_gs:{result = RADDBGI_RegisterCode_X86_gs;}break; -case REGS_RegCodeX86_ymm0:{result = RADDBGI_RegisterCode_X86_ymm0;}break; -case REGS_RegCodeX86_ymm1:{result = RADDBGI_RegisterCode_X86_ymm1;}break; -case REGS_RegCodeX86_ymm2:{result = RADDBGI_RegisterCode_X86_ymm2;}break; -case REGS_RegCodeX86_ymm3:{result = RADDBGI_RegisterCode_X86_ymm3;}break; -case REGS_RegCodeX86_ymm4:{result = RADDBGI_RegisterCode_X86_ymm4;}break; -case REGS_RegCodeX86_ymm5:{result = RADDBGI_RegisterCode_X86_ymm5;}break; -case REGS_RegCodeX86_ymm6:{result = RADDBGI_RegisterCode_X86_ymm6;}break; -case REGS_RegCodeX86_ymm7:{result = RADDBGI_RegisterCode_X86_ymm7;}break; +case REGS_RegCodeX86_eax:{result = RDI_RegisterCode_X86_eax;}break; +case REGS_RegCodeX86_ecx:{result = RDI_RegisterCode_X86_ecx;}break; +case REGS_RegCodeX86_edx:{result = RDI_RegisterCode_X86_edx;}break; +case REGS_RegCodeX86_ebx:{result = RDI_RegisterCode_X86_ebx;}break; +case REGS_RegCodeX86_esp:{result = RDI_RegisterCode_X86_esp;}break; +case REGS_RegCodeX86_ebp:{result = RDI_RegisterCode_X86_ebp;}break; +case REGS_RegCodeX86_esi:{result = RDI_RegisterCode_X86_esi;}break; +case REGS_RegCodeX86_edi:{result = RDI_RegisterCode_X86_edi;}break; +case REGS_RegCodeX86_fsbase:{result = RDI_RegisterCode_X86_fsbase;}break; +case REGS_RegCodeX86_gsbase:{result = RDI_RegisterCode_X86_gsbase;}break; +case REGS_RegCodeX86_eflags:{result = RDI_RegisterCode_X86_eflags;}break; +case REGS_RegCodeX86_eip:{result = RDI_RegisterCode_X86_eip;}break; +case REGS_RegCodeX86_dr0:{result = RDI_RegisterCode_X86_dr0;}break; +case REGS_RegCodeX86_dr1:{result = RDI_RegisterCode_X86_dr1;}break; +case REGS_RegCodeX86_dr2:{result = RDI_RegisterCode_X86_dr2;}break; +case REGS_RegCodeX86_dr3:{result = RDI_RegisterCode_X86_dr3;}break; +case REGS_RegCodeX86_dr4:{result = RDI_RegisterCode_X86_dr4;}break; +case REGS_RegCodeX86_dr5:{result = RDI_RegisterCode_X86_dr5;}break; +case REGS_RegCodeX86_dr6:{result = RDI_RegisterCode_X86_dr6;}break; +case REGS_RegCodeX86_dr7:{result = RDI_RegisterCode_X86_dr7;}break; +case REGS_RegCodeX86_fpr0:{result = RDI_RegisterCode_X86_fpr0;}break; +case REGS_RegCodeX86_fpr1:{result = RDI_RegisterCode_X86_fpr1;}break; +case REGS_RegCodeX86_fpr2:{result = RDI_RegisterCode_X86_fpr2;}break; +case REGS_RegCodeX86_fpr3:{result = RDI_RegisterCode_X86_fpr3;}break; +case REGS_RegCodeX86_fpr4:{result = RDI_RegisterCode_X86_fpr4;}break; +case REGS_RegCodeX86_fpr5:{result = RDI_RegisterCode_X86_fpr5;}break; +case REGS_RegCodeX86_fpr6:{result = RDI_RegisterCode_X86_fpr6;}break; +case REGS_RegCodeX86_fpr7:{result = RDI_RegisterCode_X86_fpr7;}break; +case REGS_RegCodeX86_st0:{result = RDI_RegisterCode_X86_st0;}break; +case REGS_RegCodeX86_st1:{result = RDI_RegisterCode_X86_st1;}break; +case REGS_RegCodeX86_st2:{result = RDI_RegisterCode_X86_st2;}break; +case REGS_RegCodeX86_st3:{result = RDI_RegisterCode_X86_st3;}break; +case REGS_RegCodeX86_st4:{result = RDI_RegisterCode_X86_st4;}break; +case REGS_RegCodeX86_st5:{result = RDI_RegisterCode_X86_st5;}break; +case REGS_RegCodeX86_st6:{result = RDI_RegisterCode_X86_st6;}break; +case REGS_RegCodeX86_st7:{result = RDI_RegisterCode_X86_st7;}break; +case REGS_RegCodeX86_fcw:{result = RDI_RegisterCode_X86_fcw;}break; +case REGS_RegCodeX86_fsw:{result = RDI_RegisterCode_X86_fsw;}break; +case REGS_RegCodeX86_ftw:{result = RDI_RegisterCode_X86_ftw;}break; +case REGS_RegCodeX86_fop:{result = RDI_RegisterCode_X86_fop;}break; +case REGS_RegCodeX86_fcs:{result = RDI_RegisterCode_X86_fcs;}break; +case REGS_RegCodeX86_fds:{result = RDI_RegisterCode_X86_fds;}break; +case REGS_RegCodeX86_fip:{result = RDI_RegisterCode_X86_fip;}break; +case REGS_RegCodeX86_fdp:{result = RDI_RegisterCode_X86_fdp;}break; +case REGS_RegCodeX86_mxcsr:{result = RDI_RegisterCode_X86_mxcsr;}break; +case REGS_RegCodeX86_mxcsr_mask:{result = RDI_RegisterCode_X86_mxcsr_mask;}break; +case REGS_RegCodeX86_ss:{result = RDI_RegisterCode_X86_ss;}break; +case REGS_RegCodeX86_cs:{result = RDI_RegisterCode_X86_cs;}break; +case REGS_RegCodeX86_ds:{result = RDI_RegisterCode_X86_ds;}break; +case REGS_RegCodeX86_es:{result = RDI_RegisterCode_X86_es;}break; +case REGS_RegCodeX86_fs:{result = RDI_RegisterCode_X86_fs;}break; +case REGS_RegCodeX86_gs:{result = RDI_RegisterCode_X86_gs;}break; +case REGS_RegCodeX86_ymm0:{result = RDI_RegisterCode_X86_ymm0;}break; +case REGS_RegCodeX86_ymm1:{result = RDI_RegisterCode_X86_ymm1;}break; +case REGS_RegCodeX86_ymm2:{result = RDI_RegisterCode_X86_ymm2;}break; +case REGS_RegCodeX86_ymm3:{result = RDI_RegisterCode_X86_ymm3;}break; +case REGS_RegCodeX86_ymm4:{result = RDI_RegisterCode_X86_ymm4;}break; +case REGS_RegCodeX86_ymm5:{result = RDI_RegisterCode_X86_ymm5;}break; +case REGS_RegCodeX86_ymm6:{result = RDI_RegisterCode_X86_ymm6;}break; +case REGS_RegCodeX86_ymm7:{result = RDI_RegisterCode_X86_ymm7;}break; } }break; } return result; } -internal REGS_RegCode regs_reg_code_from_arch_raddbgi_code(Architecture arch, RADDBGI_RegisterCode code) +internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegisterCode code) { REGS_RegCode result = 0; switch(arch) @@ -173,82 +173,82 @@ case Architecture_x64: switch(code) { default:{}break; -case RADDBGI_RegisterCode_X64_rax:{result = REGS_RegCodeX64_rax;}break; -case RADDBGI_RegisterCode_X64_rcx:{result = REGS_RegCodeX64_rcx;}break; -case RADDBGI_RegisterCode_X64_rdx:{result = REGS_RegCodeX64_rdx;}break; -case RADDBGI_RegisterCode_X64_rbx:{result = REGS_RegCodeX64_rbx;}break; -case RADDBGI_RegisterCode_X64_rsp:{result = REGS_RegCodeX64_rsp;}break; -case RADDBGI_RegisterCode_X64_rbp:{result = REGS_RegCodeX64_rbp;}break; -case RADDBGI_RegisterCode_X64_rsi:{result = REGS_RegCodeX64_rsi;}break; -case RADDBGI_RegisterCode_X64_rdi:{result = REGS_RegCodeX64_rdi;}break; -case RADDBGI_RegisterCode_X64_r8:{result = REGS_RegCodeX64_r8;}break; -case RADDBGI_RegisterCode_X64_r9:{result = REGS_RegCodeX64_r9;}break; -case RADDBGI_RegisterCode_X64_r10:{result = REGS_RegCodeX64_r10;}break; -case RADDBGI_RegisterCode_X64_r11:{result = REGS_RegCodeX64_r11;}break; -case RADDBGI_RegisterCode_X64_r12:{result = REGS_RegCodeX64_r12;}break; -case RADDBGI_RegisterCode_X64_r13:{result = REGS_RegCodeX64_r13;}break; -case RADDBGI_RegisterCode_X64_r14:{result = REGS_RegCodeX64_r14;}break; -case RADDBGI_RegisterCode_X64_r15:{result = REGS_RegCodeX64_r15;}break; -case RADDBGI_RegisterCode_X64_fsbase:{result = REGS_RegCodeX64_fsbase;}break; -case RADDBGI_RegisterCode_X64_gsbase:{result = REGS_RegCodeX64_gsbase;}break; -case RADDBGI_RegisterCode_X64_rip:{result = REGS_RegCodeX64_rip;}break; -case RADDBGI_RegisterCode_X64_rflags:{result = REGS_RegCodeX64_rflags;}break; -case RADDBGI_RegisterCode_X64_dr0:{result = REGS_RegCodeX64_dr0;}break; -case RADDBGI_RegisterCode_X64_dr1:{result = REGS_RegCodeX64_dr1;}break; -case RADDBGI_RegisterCode_X64_dr2:{result = REGS_RegCodeX64_dr2;}break; -case RADDBGI_RegisterCode_X64_dr3:{result = REGS_RegCodeX64_dr3;}break; -case RADDBGI_RegisterCode_X64_dr4:{result = REGS_RegCodeX64_dr4;}break; -case RADDBGI_RegisterCode_X64_dr5:{result = REGS_RegCodeX64_dr5;}break; -case RADDBGI_RegisterCode_X64_dr6:{result = REGS_RegCodeX64_dr6;}break; -case RADDBGI_RegisterCode_X64_dr7:{result = REGS_RegCodeX64_dr7;}break; -case RADDBGI_RegisterCode_X64_fpr0:{result = REGS_RegCodeX64_fpr0;}break; -case RADDBGI_RegisterCode_X64_fpr1:{result = REGS_RegCodeX64_fpr1;}break; -case RADDBGI_RegisterCode_X64_fpr2:{result = REGS_RegCodeX64_fpr2;}break; -case RADDBGI_RegisterCode_X64_fpr3:{result = REGS_RegCodeX64_fpr3;}break; -case RADDBGI_RegisterCode_X64_fpr4:{result = REGS_RegCodeX64_fpr4;}break; -case RADDBGI_RegisterCode_X64_fpr5:{result = REGS_RegCodeX64_fpr5;}break; -case RADDBGI_RegisterCode_X64_fpr6:{result = REGS_RegCodeX64_fpr6;}break; -case RADDBGI_RegisterCode_X64_fpr7:{result = REGS_RegCodeX64_fpr7;}break; -case RADDBGI_RegisterCode_X64_st0:{result = REGS_RegCodeX64_st0;}break; -case RADDBGI_RegisterCode_X64_st1:{result = REGS_RegCodeX64_st1;}break; -case RADDBGI_RegisterCode_X64_st2:{result = REGS_RegCodeX64_st2;}break; -case RADDBGI_RegisterCode_X64_st3:{result = REGS_RegCodeX64_st3;}break; -case RADDBGI_RegisterCode_X64_st4:{result = REGS_RegCodeX64_st4;}break; -case RADDBGI_RegisterCode_X64_st5:{result = REGS_RegCodeX64_st5;}break; -case RADDBGI_RegisterCode_X64_st6:{result = REGS_RegCodeX64_st6;}break; -case RADDBGI_RegisterCode_X64_st7:{result = REGS_RegCodeX64_st7;}break; -case RADDBGI_RegisterCode_X64_fcw:{result = REGS_RegCodeX64_fcw;}break; -case RADDBGI_RegisterCode_X64_fsw:{result = REGS_RegCodeX64_fsw;}break; -case RADDBGI_RegisterCode_X64_ftw:{result = REGS_RegCodeX64_ftw;}break; -case RADDBGI_RegisterCode_X64_fop:{result = REGS_RegCodeX64_fop;}break; -case RADDBGI_RegisterCode_X64_fcs:{result = REGS_RegCodeX64_fcs;}break; -case RADDBGI_RegisterCode_X64_fds:{result = REGS_RegCodeX64_fds;}break; -case RADDBGI_RegisterCode_X64_fip:{result = REGS_RegCodeX64_fip;}break; -case RADDBGI_RegisterCode_X64_fdp:{result = REGS_RegCodeX64_fdp;}break; -case RADDBGI_RegisterCode_X64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; -case RADDBGI_RegisterCode_X64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break; -case RADDBGI_RegisterCode_X64_ss:{result = REGS_RegCodeX64_ss;}break; -case RADDBGI_RegisterCode_X64_cs:{result = REGS_RegCodeX64_cs;}break; -case RADDBGI_RegisterCode_X64_ds:{result = REGS_RegCodeX64_ds;}break; -case RADDBGI_RegisterCode_X64_es:{result = REGS_RegCodeX64_es;}break; -case RADDBGI_RegisterCode_X64_fs:{result = REGS_RegCodeX64_fs;}break; -case RADDBGI_RegisterCode_X64_gs:{result = REGS_RegCodeX64_gs;}break; -case RADDBGI_RegisterCode_X64_ymm0:{result = REGS_RegCodeX64_ymm0;}break; -case RADDBGI_RegisterCode_X64_ymm1:{result = REGS_RegCodeX64_ymm1;}break; -case RADDBGI_RegisterCode_X64_ymm2:{result = REGS_RegCodeX64_ymm2;}break; -case RADDBGI_RegisterCode_X64_ymm3:{result = REGS_RegCodeX64_ymm3;}break; -case RADDBGI_RegisterCode_X64_ymm4:{result = REGS_RegCodeX64_ymm4;}break; -case RADDBGI_RegisterCode_X64_ymm5:{result = REGS_RegCodeX64_ymm5;}break; -case RADDBGI_RegisterCode_X64_ymm6:{result = REGS_RegCodeX64_ymm6;}break; -case RADDBGI_RegisterCode_X64_ymm7:{result = REGS_RegCodeX64_ymm7;}break; -case RADDBGI_RegisterCode_X64_ymm8:{result = REGS_RegCodeX64_ymm8;}break; -case RADDBGI_RegisterCode_X64_ymm9:{result = REGS_RegCodeX64_ymm9;}break; -case RADDBGI_RegisterCode_X64_ymm10:{result = REGS_RegCodeX64_ymm10;}break; -case RADDBGI_RegisterCode_X64_ymm11:{result = REGS_RegCodeX64_ymm11;}break; -case RADDBGI_RegisterCode_X64_ymm12:{result = REGS_RegCodeX64_ymm12;}break; -case RADDBGI_RegisterCode_X64_ymm13:{result = REGS_RegCodeX64_ymm13;}break; -case RADDBGI_RegisterCode_X64_ymm14:{result = REGS_RegCodeX64_ymm14;}break; -case RADDBGI_RegisterCode_X64_ymm15:{result = REGS_RegCodeX64_ymm15;}break; +case RDI_RegisterCode_X64_rax:{result = REGS_RegCodeX64_rax;}break; +case RDI_RegisterCode_X64_rcx:{result = REGS_RegCodeX64_rcx;}break; +case RDI_RegisterCode_X64_rdx:{result = REGS_RegCodeX64_rdx;}break; +case RDI_RegisterCode_X64_rbx:{result = REGS_RegCodeX64_rbx;}break; +case RDI_RegisterCode_X64_rsp:{result = REGS_RegCodeX64_rsp;}break; +case RDI_RegisterCode_X64_rbp:{result = REGS_RegCodeX64_rbp;}break; +case RDI_RegisterCode_X64_rsi:{result = REGS_RegCodeX64_rsi;}break; +case RDI_RegisterCode_X64_rdi:{result = REGS_RegCodeX64_rdi;}break; +case RDI_RegisterCode_X64_r8:{result = REGS_RegCodeX64_r8;}break; +case RDI_RegisterCode_X64_r9:{result = REGS_RegCodeX64_r9;}break; +case RDI_RegisterCode_X64_r10:{result = REGS_RegCodeX64_r10;}break; +case RDI_RegisterCode_X64_r11:{result = REGS_RegCodeX64_r11;}break; +case RDI_RegisterCode_X64_r12:{result = REGS_RegCodeX64_r12;}break; +case RDI_RegisterCode_X64_r13:{result = REGS_RegCodeX64_r13;}break; +case RDI_RegisterCode_X64_r14:{result = REGS_RegCodeX64_r14;}break; +case RDI_RegisterCode_X64_r15:{result = REGS_RegCodeX64_r15;}break; +case RDI_RegisterCode_X64_fsbase:{result = REGS_RegCodeX64_fsbase;}break; +case RDI_RegisterCode_X64_gsbase:{result = REGS_RegCodeX64_gsbase;}break; +case RDI_RegisterCode_X64_rip:{result = REGS_RegCodeX64_rip;}break; +case RDI_RegisterCode_X64_rflags:{result = REGS_RegCodeX64_rflags;}break; +case RDI_RegisterCode_X64_dr0:{result = REGS_RegCodeX64_dr0;}break; +case RDI_RegisterCode_X64_dr1:{result = REGS_RegCodeX64_dr1;}break; +case RDI_RegisterCode_X64_dr2:{result = REGS_RegCodeX64_dr2;}break; +case RDI_RegisterCode_X64_dr3:{result = REGS_RegCodeX64_dr3;}break; +case RDI_RegisterCode_X64_dr4:{result = REGS_RegCodeX64_dr4;}break; +case RDI_RegisterCode_X64_dr5:{result = REGS_RegCodeX64_dr5;}break; +case RDI_RegisterCode_X64_dr6:{result = REGS_RegCodeX64_dr6;}break; +case RDI_RegisterCode_X64_dr7:{result = REGS_RegCodeX64_dr7;}break; +case RDI_RegisterCode_X64_fpr0:{result = REGS_RegCodeX64_fpr0;}break; +case RDI_RegisterCode_X64_fpr1:{result = REGS_RegCodeX64_fpr1;}break; +case RDI_RegisterCode_X64_fpr2:{result = REGS_RegCodeX64_fpr2;}break; +case RDI_RegisterCode_X64_fpr3:{result = REGS_RegCodeX64_fpr3;}break; +case RDI_RegisterCode_X64_fpr4:{result = REGS_RegCodeX64_fpr4;}break; +case RDI_RegisterCode_X64_fpr5:{result = REGS_RegCodeX64_fpr5;}break; +case RDI_RegisterCode_X64_fpr6:{result = REGS_RegCodeX64_fpr6;}break; +case RDI_RegisterCode_X64_fpr7:{result = REGS_RegCodeX64_fpr7;}break; +case RDI_RegisterCode_X64_st0:{result = REGS_RegCodeX64_st0;}break; +case RDI_RegisterCode_X64_st1:{result = REGS_RegCodeX64_st1;}break; +case RDI_RegisterCode_X64_st2:{result = REGS_RegCodeX64_st2;}break; +case RDI_RegisterCode_X64_st3:{result = REGS_RegCodeX64_st3;}break; +case RDI_RegisterCode_X64_st4:{result = REGS_RegCodeX64_st4;}break; +case RDI_RegisterCode_X64_st5:{result = REGS_RegCodeX64_st5;}break; +case RDI_RegisterCode_X64_st6:{result = REGS_RegCodeX64_st6;}break; +case RDI_RegisterCode_X64_st7:{result = REGS_RegCodeX64_st7;}break; +case RDI_RegisterCode_X64_fcw:{result = REGS_RegCodeX64_fcw;}break; +case RDI_RegisterCode_X64_fsw:{result = REGS_RegCodeX64_fsw;}break; +case RDI_RegisterCode_X64_ftw:{result = REGS_RegCodeX64_ftw;}break; +case RDI_RegisterCode_X64_fop:{result = REGS_RegCodeX64_fop;}break; +case RDI_RegisterCode_X64_fcs:{result = REGS_RegCodeX64_fcs;}break; +case RDI_RegisterCode_X64_fds:{result = REGS_RegCodeX64_fds;}break; +case RDI_RegisterCode_X64_fip:{result = REGS_RegCodeX64_fip;}break; +case RDI_RegisterCode_X64_fdp:{result = REGS_RegCodeX64_fdp;}break; +case RDI_RegisterCode_X64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; +case RDI_RegisterCode_X64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break; +case RDI_RegisterCode_X64_ss:{result = REGS_RegCodeX64_ss;}break; +case RDI_RegisterCode_X64_cs:{result = REGS_RegCodeX64_cs;}break; +case RDI_RegisterCode_X64_ds:{result = REGS_RegCodeX64_ds;}break; +case RDI_RegisterCode_X64_es:{result = REGS_RegCodeX64_es;}break; +case RDI_RegisterCode_X64_fs:{result = REGS_RegCodeX64_fs;}break; +case RDI_RegisterCode_X64_gs:{result = REGS_RegCodeX64_gs;}break; +case RDI_RegisterCode_X64_ymm0:{result = REGS_RegCodeX64_ymm0;}break; +case RDI_RegisterCode_X64_ymm1:{result = REGS_RegCodeX64_ymm1;}break; +case RDI_RegisterCode_X64_ymm2:{result = REGS_RegCodeX64_ymm2;}break; +case RDI_RegisterCode_X64_ymm3:{result = REGS_RegCodeX64_ymm3;}break; +case RDI_RegisterCode_X64_ymm4:{result = REGS_RegCodeX64_ymm4;}break; +case RDI_RegisterCode_X64_ymm5:{result = REGS_RegCodeX64_ymm5;}break; +case RDI_RegisterCode_X64_ymm6:{result = REGS_RegCodeX64_ymm6;}break; +case RDI_RegisterCode_X64_ymm7:{result = REGS_RegCodeX64_ymm7;}break; +case RDI_RegisterCode_X64_ymm8:{result = REGS_RegCodeX64_ymm8;}break; +case RDI_RegisterCode_X64_ymm9:{result = REGS_RegCodeX64_ymm9;}break; +case RDI_RegisterCode_X64_ymm10:{result = REGS_RegCodeX64_ymm10;}break; +case RDI_RegisterCode_X64_ymm11:{result = REGS_RegCodeX64_ymm11;}break; +case RDI_RegisterCode_X64_ymm12:{result = REGS_RegCodeX64_ymm12;}break; +case RDI_RegisterCode_X64_ymm13:{result = REGS_RegCodeX64_ymm13;}break; +case RDI_RegisterCode_X64_ymm14:{result = REGS_RegCodeX64_ymm14;}break; +case RDI_RegisterCode_X64_ymm15:{result = REGS_RegCodeX64_ymm15;}break; } }break; case Architecture_x86: @@ -256,66 +256,66 @@ case Architecture_x86: switch(code) { default:{}break; -case RADDBGI_RegisterCode_X86_eax:{result = REGS_RegCodeX86_eax;}break; -case RADDBGI_RegisterCode_X86_ecx:{result = REGS_RegCodeX86_ecx;}break; -case RADDBGI_RegisterCode_X86_edx:{result = REGS_RegCodeX86_edx;}break; -case RADDBGI_RegisterCode_X86_ebx:{result = REGS_RegCodeX86_ebx;}break; -case RADDBGI_RegisterCode_X86_esp:{result = REGS_RegCodeX86_esp;}break; -case RADDBGI_RegisterCode_X86_ebp:{result = REGS_RegCodeX86_ebp;}break; -case RADDBGI_RegisterCode_X86_esi:{result = REGS_RegCodeX86_esi;}break; -case RADDBGI_RegisterCode_X86_edi:{result = REGS_RegCodeX86_edi;}break; -case RADDBGI_RegisterCode_X86_fsbase:{result = REGS_RegCodeX86_fsbase;}break; -case RADDBGI_RegisterCode_X86_gsbase:{result = REGS_RegCodeX86_gsbase;}break; -case RADDBGI_RegisterCode_X86_eflags:{result = REGS_RegCodeX86_eflags;}break; -case RADDBGI_RegisterCode_X86_eip:{result = REGS_RegCodeX86_eip;}break; -case RADDBGI_RegisterCode_X86_dr0:{result = REGS_RegCodeX86_dr0;}break; -case RADDBGI_RegisterCode_X86_dr1:{result = REGS_RegCodeX86_dr1;}break; -case RADDBGI_RegisterCode_X86_dr2:{result = REGS_RegCodeX86_dr2;}break; -case RADDBGI_RegisterCode_X86_dr3:{result = REGS_RegCodeX86_dr3;}break; -case RADDBGI_RegisterCode_X86_dr4:{result = REGS_RegCodeX86_dr4;}break; -case RADDBGI_RegisterCode_X86_dr5:{result = REGS_RegCodeX86_dr5;}break; -case RADDBGI_RegisterCode_X86_dr6:{result = REGS_RegCodeX86_dr6;}break; -case RADDBGI_RegisterCode_X86_dr7:{result = REGS_RegCodeX86_dr7;}break; -case RADDBGI_RegisterCode_X86_fpr0:{result = REGS_RegCodeX86_fpr0;}break; -case RADDBGI_RegisterCode_X86_fpr1:{result = REGS_RegCodeX86_fpr1;}break; -case RADDBGI_RegisterCode_X86_fpr2:{result = REGS_RegCodeX86_fpr2;}break; -case RADDBGI_RegisterCode_X86_fpr3:{result = REGS_RegCodeX86_fpr3;}break; -case RADDBGI_RegisterCode_X86_fpr4:{result = REGS_RegCodeX86_fpr4;}break; -case RADDBGI_RegisterCode_X86_fpr5:{result = REGS_RegCodeX86_fpr5;}break; -case RADDBGI_RegisterCode_X86_fpr6:{result = REGS_RegCodeX86_fpr6;}break; -case RADDBGI_RegisterCode_X86_fpr7:{result = REGS_RegCodeX86_fpr7;}break; -case RADDBGI_RegisterCode_X86_st0:{result = REGS_RegCodeX86_st0;}break; -case RADDBGI_RegisterCode_X86_st1:{result = REGS_RegCodeX86_st1;}break; -case RADDBGI_RegisterCode_X86_st2:{result = REGS_RegCodeX86_st2;}break; -case RADDBGI_RegisterCode_X86_st3:{result = REGS_RegCodeX86_st3;}break; -case RADDBGI_RegisterCode_X86_st4:{result = REGS_RegCodeX86_st4;}break; -case RADDBGI_RegisterCode_X86_st5:{result = REGS_RegCodeX86_st5;}break; -case RADDBGI_RegisterCode_X86_st6:{result = REGS_RegCodeX86_st6;}break; -case RADDBGI_RegisterCode_X86_st7:{result = REGS_RegCodeX86_st7;}break; -case RADDBGI_RegisterCode_X86_fcw:{result = REGS_RegCodeX86_fcw;}break; -case RADDBGI_RegisterCode_X86_fsw:{result = REGS_RegCodeX86_fsw;}break; -case RADDBGI_RegisterCode_X86_ftw:{result = REGS_RegCodeX86_ftw;}break; -case RADDBGI_RegisterCode_X86_fop:{result = REGS_RegCodeX86_fop;}break; -case RADDBGI_RegisterCode_X86_fcs:{result = REGS_RegCodeX86_fcs;}break; -case RADDBGI_RegisterCode_X86_fds:{result = REGS_RegCodeX86_fds;}break; -case RADDBGI_RegisterCode_X86_fip:{result = REGS_RegCodeX86_fip;}break; -case RADDBGI_RegisterCode_X86_fdp:{result = REGS_RegCodeX86_fdp;}break; -case RADDBGI_RegisterCode_X86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break; -case RADDBGI_RegisterCode_X86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break; -case RADDBGI_RegisterCode_X86_ss:{result = REGS_RegCodeX86_ss;}break; -case RADDBGI_RegisterCode_X86_cs:{result = REGS_RegCodeX86_cs;}break; -case RADDBGI_RegisterCode_X86_ds:{result = REGS_RegCodeX86_ds;}break; -case RADDBGI_RegisterCode_X86_es:{result = REGS_RegCodeX86_es;}break; -case RADDBGI_RegisterCode_X86_fs:{result = REGS_RegCodeX86_fs;}break; -case RADDBGI_RegisterCode_X86_gs:{result = REGS_RegCodeX86_gs;}break; -case RADDBGI_RegisterCode_X86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; -case RADDBGI_RegisterCode_X86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; -case RADDBGI_RegisterCode_X86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; -case RADDBGI_RegisterCode_X86_ymm3:{result = REGS_RegCodeX86_ymm3;}break; -case RADDBGI_RegisterCode_X86_ymm4:{result = REGS_RegCodeX86_ymm4;}break; -case RADDBGI_RegisterCode_X86_ymm5:{result = REGS_RegCodeX86_ymm5;}break; -case RADDBGI_RegisterCode_X86_ymm6:{result = REGS_RegCodeX86_ymm6;}break; -case RADDBGI_RegisterCode_X86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; +case RDI_RegisterCode_X86_eax:{result = REGS_RegCodeX86_eax;}break; +case RDI_RegisterCode_X86_ecx:{result = REGS_RegCodeX86_ecx;}break; +case RDI_RegisterCode_X86_edx:{result = REGS_RegCodeX86_edx;}break; +case RDI_RegisterCode_X86_ebx:{result = REGS_RegCodeX86_ebx;}break; +case RDI_RegisterCode_X86_esp:{result = REGS_RegCodeX86_esp;}break; +case RDI_RegisterCode_X86_ebp:{result = REGS_RegCodeX86_ebp;}break; +case RDI_RegisterCode_X86_esi:{result = REGS_RegCodeX86_esi;}break; +case RDI_RegisterCode_X86_edi:{result = REGS_RegCodeX86_edi;}break; +case RDI_RegisterCode_X86_fsbase:{result = REGS_RegCodeX86_fsbase;}break; +case RDI_RegisterCode_X86_gsbase:{result = REGS_RegCodeX86_gsbase;}break; +case RDI_RegisterCode_X86_eflags:{result = REGS_RegCodeX86_eflags;}break; +case RDI_RegisterCode_X86_eip:{result = REGS_RegCodeX86_eip;}break; +case RDI_RegisterCode_X86_dr0:{result = REGS_RegCodeX86_dr0;}break; +case RDI_RegisterCode_X86_dr1:{result = REGS_RegCodeX86_dr1;}break; +case RDI_RegisterCode_X86_dr2:{result = REGS_RegCodeX86_dr2;}break; +case RDI_RegisterCode_X86_dr3:{result = REGS_RegCodeX86_dr3;}break; +case RDI_RegisterCode_X86_dr4:{result = REGS_RegCodeX86_dr4;}break; +case RDI_RegisterCode_X86_dr5:{result = REGS_RegCodeX86_dr5;}break; +case RDI_RegisterCode_X86_dr6:{result = REGS_RegCodeX86_dr6;}break; +case RDI_RegisterCode_X86_dr7:{result = REGS_RegCodeX86_dr7;}break; +case RDI_RegisterCode_X86_fpr0:{result = REGS_RegCodeX86_fpr0;}break; +case RDI_RegisterCode_X86_fpr1:{result = REGS_RegCodeX86_fpr1;}break; +case RDI_RegisterCode_X86_fpr2:{result = REGS_RegCodeX86_fpr2;}break; +case RDI_RegisterCode_X86_fpr3:{result = REGS_RegCodeX86_fpr3;}break; +case RDI_RegisterCode_X86_fpr4:{result = REGS_RegCodeX86_fpr4;}break; +case RDI_RegisterCode_X86_fpr5:{result = REGS_RegCodeX86_fpr5;}break; +case RDI_RegisterCode_X86_fpr6:{result = REGS_RegCodeX86_fpr6;}break; +case RDI_RegisterCode_X86_fpr7:{result = REGS_RegCodeX86_fpr7;}break; +case RDI_RegisterCode_X86_st0:{result = REGS_RegCodeX86_st0;}break; +case RDI_RegisterCode_X86_st1:{result = REGS_RegCodeX86_st1;}break; +case RDI_RegisterCode_X86_st2:{result = REGS_RegCodeX86_st2;}break; +case RDI_RegisterCode_X86_st3:{result = REGS_RegCodeX86_st3;}break; +case RDI_RegisterCode_X86_st4:{result = REGS_RegCodeX86_st4;}break; +case RDI_RegisterCode_X86_st5:{result = REGS_RegCodeX86_st5;}break; +case RDI_RegisterCode_X86_st6:{result = REGS_RegCodeX86_st6;}break; +case RDI_RegisterCode_X86_st7:{result = REGS_RegCodeX86_st7;}break; +case RDI_RegisterCode_X86_fcw:{result = REGS_RegCodeX86_fcw;}break; +case RDI_RegisterCode_X86_fsw:{result = REGS_RegCodeX86_fsw;}break; +case RDI_RegisterCode_X86_ftw:{result = REGS_RegCodeX86_ftw;}break; +case RDI_RegisterCode_X86_fop:{result = REGS_RegCodeX86_fop;}break; +case RDI_RegisterCode_X86_fcs:{result = REGS_RegCodeX86_fcs;}break; +case RDI_RegisterCode_X86_fds:{result = REGS_RegCodeX86_fds;}break; +case RDI_RegisterCode_X86_fip:{result = REGS_RegCodeX86_fip;}break; +case RDI_RegisterCode_X86_fdp:{result = REGS_RegCodeX86_fdp;}break; +case RDI_RegisterCode_X86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break; +case RDI_RegisterCode_X86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break; +case RDI_RegisterCode_X86_ss:{result = REGS_RegCodeX86_ss;}break; +case RDI_RegisterCode_X86_cs:{result = REGS_RegCodeX86_cs;}break; +case RDI_RegisterCode_X86_ds:{result = REGS_RegCodeX86_ds;}break; +case RDI_RegisterCode_X86_es:{result = REGS_RegCodeX86_es;}break; +case RDI_RegisterCode_X86_fs:{result = REGS_RegCodeX86_fs;}break; +case RDI_RegisterCode_X86_gs:{result = REGS_RegCodeX86_gs;}break; +case RDI_RegisterCode_X86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; +case RDI_RegisterCode_X86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; +case RDI_RegisterCode_X86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; +case RDI_RegisterCode_X86_ymm3:{result = REGS_RegCodeX86_ymm3;}break; +case RDI_RegisterCode_X86_ymm4:{result = REGS_RegCodeX86_ymm4;}break; +case RDI_RegisterCode_X86_ymm5:{result = REGS_RegCodeX86_ymm5;}break; +case RDI_RegisterCode_X86_ymm6:{result = REGS_RegCodeX86_ymm6;}break; +case RDI_RegisterCode_X86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; } }break; } diff --git a/src/regs/raddbgi/regs_raddbgi.h b/src/regs/raddbgi/regs_raddbgi.h index 03b3a569..4049a5b1 100644 --- a/src/regs/raddbgi/regs_raddbgi.h +++ b/src/regs/raddbgi/regs_raddbgi.h @@ -4,7 +4,7 @@ #ifndef REGS_RADDBGI_H #define REGS_RADDBGI_H -internal RADDBGI_RegisterCode regs_raddbgi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code); -internal REGS_RegCode regs_reg_code_from_arch_raddbgi_code(Architecture arch, RADDBGI_RegisterCode reg); +internal RDI_RegisterCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code); +internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegisterCode reg); #endif //REGS_RADDBGI_H diff --git a/src/regs/raddbgi/regs_raddbgi.mdesk b/src/regs/raddbgi/regs_raddbgi.mdesk index 1059f06f..aad0e4ad 100644 --- a/src/regs/raddbgi/regs_raddbgi.mdesk +++ b/src/regs/raddbgi/regs_raddbgi.mdesk @@ -6,9 +6,9 @@ @gen @c_file { - `internal RADDBGI_RegisterCode regs_raddbgi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code)`; + `internal RDI_RegisterCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code)`; `{`; - `RADDBGI_RegisterCode result = 0;`; + `RDI_RegisterCode result = 0;`; `switch(arch)`; `{`; `default:{}break;`; @@ -17,7 +17,7 @@ `switch(code)` `{`; `default:{}break;`; - @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RADDBGI_RegisterCode_X64_$(a.name);}break;`; + @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RDI_RegisterCode_X64_$(a.name);}break;`; `}`; `}break;`; `case Architecture_x86:`; @@ -25,7 +25,7 @@ `switch(code)` `{`; `default:{}break;`; - @expand(REGS_RegTableX86 a) `case REGS_RegCodeX86_$(a.name):{result = RADDBGI_RegisterCode_X86_$(a.name);}break;`; + @expand(REGS_RegTableX86 a) `case REGS_RegCodeX86_$(a.name):{result = RDI_RegisterCode_X86_$(a.name);}break;`; `}`; `}break;`; `}`; @@ -35,7 +35,7 @@ @gen @c_file { - `internal REGS_RegCode regs_reg_code_from_arch_raddbgi_code(Architecture arch, RADDBGI_RegisterCode code)`; + `internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegisterCode code)`; `{`; `REGS_RegCode result = 0;`; `switch(arch)`; @@ -46,7 +46,7 @@ `switch(code)` `{`; `default:{}break;`; - @expand(REGS_RegTableX64 a) `case RADDBGI_RegisterCode_X64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`; + @expand(REGS_RegTableX64 a) `case RDI_RegisterCode_X64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`; `}`; `}break;`; `case Architecture_x86:`; @@ -54,7 +54,7 @@ `switch(code)` `{`; `default:{}break;`; - @expand(REGS_RegTableX86 a) `case RADDBGI_RegisterCode_X86_$(a.name):{result = REGS_RegCodeX86_$(a.name);}break;`; + @expand(REGS_RegTableX86 a) `case RDI_RegisterCode_X86_$(a.name):{result = REGS_RegCodeX86_$(a.name);}break;`; `}`; `}break;`; `}`; diff --git a/src/scratch/look_at_raddbg.c b/src/scratch/look_at_raddbg.c index a6aa5b8d..ba16ce58 100644 --- a/src/scratch/look_at_raddbg.c +++ b/src/scratch/look_at_raddbg.c @@ -6,10 +6,10 @@ #include #include -#include "raddbgi_format/raddbgi_format.h" -#include "raddbgi_format/raddbgi_format_parse.h" -#include "raddbgi_format/raddbgi_format.c" -#include "raddbgi_format/raddbgi_format_parse.c" +#include "rdi_format/rdi_format.h" +#include "rdi_format/rdi_format_parse.h" +#include "rdi_format/rdi_format.c" +#include "rdi_format/rdi_format_parse.c" int main(int argument_count, char **arguments) { @@ -22,16 +22,16 @@ int main(int argument_count, char **arguments) uint8_t *data = (uint8_t *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, data_size); // parse raw data as raddbg - RADDBGI_Parsed rdbg = {0}; - RADDBGI_ParseStatus parse_status = raddbgi_parse(data, data_size, &rdbg); + RDI_Parsed rdbg = {0}; + RDI_ParseStatus parse_status = rdi_parse(data, data_size, &rdbg); // usage example: print out all procedure symbol names #if 1 for(uint64_t procedure_idx = 0; procedure_idx < rdbg.procedure_count; procedure_idx += 1) { - RADDBGI_Procedure *procedure = &rdbg.procedures[procedure_idx]; + RDI_Procedure *procedure = &rdbg.procedures[procedure_idx]; uint64_t name_size = 0; - uint8_t *name = raddbgi_string_from_idx(&rdbg, procedure->name_string_idx, &name_size); + uint8_t *name = rdi_string_from_idx(&rdbg, procedure->name_string_idx, &name_size); printf("[%I64u] %.*s\n", procedure_idx, (int)name_size, name); } #endif @@ -40,15 +40,15 @@ int main(int argument_count, char **arguments) #if 0 for(uint64_t udt_idx = 0; udt_idx < rdbg.udt_count; udt_idx += 1) { - RADDBGI_UDT *udt = &rdbg.udts[udt_idx]; - RADDBGI_TypeNode *type = &rdbg.type_nodes[udt->self_type_idx]; + RDI_UDT *udt = &rdbg.udts[udt_idx]; + RDI_TypeNode *type = &rdbg.type_nodes[udt->self_type_idx]; uint64_t name_size = 0; - uint8_t *name = raddbgi_string_from_idx(&rdbg, type->user_defined.name_string_idx, &name_size); + uint8_t *name = rdi_string_from_idx(&rdbg, type->user_defined.name_string_idx, &name_size); printf("[%I64u] %.*s\n", udt_idx, (int)name_size, name); } #endif - // for getting more info, look at the `RADDBGI_Parsed` structure. all data is + // for getting more info, look at the `RDI_Parsed` structure. all data is // represented as a bunch of flat plain-old-data tables. data which must // reference other data uses indices into that other data's table. for // example, given a `type_idx`, I will index into `rdbg.type_nodes`. given a diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c index 63c12784..f03b39b6 100644 --- a/src/type_graph/type_graph.c +++ b/src/type_graph/type_graph.c @@ -59,85 +59,85 @@ tg_key_list_copy(Arena *arena, TG_KeyList *src) //~ rjf: RADDBG <-> TG Enum Conversions internal TG_Kind -tg_kind_from_raddbgi_type_kind(RADDBGI_TypeKind kind) +tg_kind_from_rdi_type_kind(RDI_TypeKind kind) { TG_Kind result = TG_Kind_Null; switch(kind) { default:{}break; - case RADDBGI_TypeKind_Void: {result = TG_Kind_Void;}break; - case RADDBGI_TypeKind_Handle: {result = TG_Kind_Handle;}break; - case RADDBGI_TypeKind_Char8: {result = TG_Kind_Char8;}break; - case RADDBGI_TypeKind_Char16: {result = TG_Kind_Char16;}break; - case RADDBGI_TypeKind_Char32: {result = TG_Kind_Char32;}break; - case RADDBGI_TypeKind_UChar8: {result = TG_Kind_UChar8;}break; - case RADDBGI_TypeKind_UChar16: {result = TG_Kind_UChar16;}break; - case RADDBGI_TypeKind_UChar32: {result = TG_Kind_UChar32;}break; - case RADDBGI_TypeKind_U8: {result = TG_Kind_U8;}break; - case RADDBGI_TypeKind_U16: {result = TG_Kind_U16;}break; - case RADDBGI_TypeKind_U32: {result = TG_Kind_U32;}break; - case RADDBGI_TypeKind_U64: {result = TG_Kind_U64;}break; - case RADDBGI_TypeKind_U128: {result = TG_Kind_U128;}break; - case RADDBGI_TypeKind_U256: {result = TG_Kind_U256;}break; - case RADDBGI_TypeKind_U512: {result = TG_Kind_U512;}break; - case RADDBGI_TypeKind_S8: {result = TG_Kind_S8;}break; - case RADDBGI_TypeKind_S16: {result = TG_Kind_S16;}break; - case RADDBGI_TypeKind_S32: {result = TG_Kind_S32;}break; - case RADDBGI_TypeKind_S64: {result = TG_Kind_S64;}break; - case RADDBGI_TypeKind_S128: {result = TG_Kind_S128;}break; - case RADDBGI_TypeKind_S256: {result = TG_Kind_S256;}break; - case RADDBGI_TypeKind_S512: {result = TG_Kind_S512;}break; - case RADDBGI_TypeKind_Bool: {result = TG_Kind_Bool;}break; - case RADDBGI_TypeKind_F16: {result = TG_Kind_F16;}break; - case RADDBGI_TypeKind_F32: {result = TG_Kind_F32;}break; - case RADDBGI_TypeKind_F32PP: {result = TG_Kind_F32PP;}break; - case RADDBGI_TypeKind_F48: {result = TG_Kind_F48;}break; - case RADDBGI_TypeKind_F64: {result = TG_Kind_F64;}break; - case RADDBGI_TypeKind_F80: {result = TG_Kind_F80;}break; - case RADDBGI_TypeKind_F128: {result = TG_Kind_F128;}break; - case RADDBGI_TypeKind_ComplexF32: {result = TG_Kind_ComplexF32;}break; - case RADDBGI_TypeKind_ComplexF64: {result = TG_Kind_ComplexF64;}break; - case RADDBGI_TypeKind_ComplexF80: {result = TG_Kind_ComplexF80;}break; - case RADDBGI_TypeKind_ComplexF128: {result = TG_Kind_ComplexF128;}break; - case RADDBGI_TypeKind_Modifier: {result = TG_Kind_Modifier;}break; - case RADDBGI_TypeKind_Ptr: {result = TG_Kind_Ptr;}break; - case RADDBGI_TypeKind_LRef: {result = TG_Kind_LRef;}break; - case RADDBGI_TypeKind_RRef: {result = TG_Kind_RRef;}break; - case RADDBGI_TypeKind_Array: {result = TG_Kind_Array;}break; - case RADDBGI_TypeKind_Function: {result = TG_Kind_Function;}break; - case RADDBGI_TypeKind_Method: {result = TG_Kind_Method;}break; - case RADDBGI_TypeKind_MemberPtr: {result = TG_Kind_MemberPtr;}break; - case RADDBGI_TypeKind_Struct: {result = TG_Kind_Struct;}break; - case RADDBGI_TypeKind_Class: {result = TG_Kind_Class;}break; - case RADDBGI_TypeKind_Union: {result = TG_Kind_Union;}break; - case RADDBGI_TypeKind_Enum: {result = TG_Kind_Enum;}break; - case RADDBGI_TypeKind_Alias: {result = TG_Kind_Alias;}break; - case RADDBGI_TypeKind_IncompleteStruct: {result = TG_Kind_IncompleteStruct;}break; - case RADDBGI_TypeKind_IncompleteUnion: {result = TG_Kind_IncompleteUnion;}break; - case RADDBGI_TypeKind_IncompleteClass: {result = TG_Kind_IncompleteClass;}break; - case RADDBGI_TypeKind_IncompleteEnum: {result = TG_Kind_IncompleteEnum;}break; - case RADDBGI_TypeKind_Bitfield: {result = TG_Kind_Bitfield;}break; - case RADDBGI_TypeKind_Variadic: {result = TG_Kind_Variadic;}break; + case RDI_TypeKind_Void: {result = TG_Kind_Void;}break; + case RDI_TypeKind_Handle: {result = TG_Kind_Handle;}break; + case RDI_TypeKind_Char8: {result = TG_Kind_Char8;}break; + case RDI_TypeKind_Char16: {result = TG_Kind_Char16;}break; + case RDI_TypeKind_Char32: {result = TG_Kind_Char32;}break; + case RDI_TypeKind_UChar8: {result = TG_Kind_UChar8;}break; + case RDI_TypeKind_UChar16: {result = TG_Kind_UChar16;}break; + case RDI_TypeKind_UChar32: {result = TG_Kind_UChar32;}break; + case RDI_TypeKind_U8: {result = TG_Kind_U8;}break; + case RDI_TypeKind_U16: {result = TG_Kind_U16;}break; + case RDI_TypeKind_U32: {result = TG_Kind_U32;}break; + case RDI_TypeKind_U64: {result = TG_Kind_U64;}break; + case RDI_TypeKind_U128: {result = TG_Kind_U128;}break; + case RDI_TypeKind_U256: {result = TG_Kind_U256;}break; + case RDI_TypeKind_U512: {result = TG_Kind_U512;}break; + case RDI_TypeKind_S8: {result = TG_Kind_S8;}break; + case RDI_TypeKind_S16: {result = TG_Kind_S16;}break; + case RDI_TypeKind_S32: {result = TG_Kind_S32;}break; + case RDI_TypeKind_S64: {result = TG_Kind_S64;}break; + case RDI_TypeKind_S128: {result = TG_Kind_S128;}break; + case RDI_TypeKind_S256: {result = TG_Kind_S256;}break; + case RDI_TypeKind_S512: {result = TG_Kind_S512;}break; + case RDI_TypeKind_Bool: {result = TG_Kind_Bool;}break; + case RDI_TypeKind_F16: {result = TG_Kind_F16;}break; + case RDI_TypeKind_F32: {result = TG_Kind_F32;}break; + case RDI_TypeKind_F32PP: {result = TG_Kind_F32PP;}break; + case RDI_TypeKind_F48: {result = TG_Kind_F48;}break; + case RDI_TypeKind_F64: {result = TG_Kind_F64;}break; + case RDI_TypeKind_F80: {result = TG_Kind_F80;}break; + case RDI_TypeKind_F128: {result = TG_Kind_F128;}break; + case RDI_TypeKind_ComplexF32: {result = TG_Kind_ComplexF32;}break; + case RDI_TypeKind_ComplexF64: {result = TG_Kind_ComplexF64;}break; + case RDI_TypeKind_ComplexF80: {result = TG_Kind_ComplexF80;}break; + case RDI_TypeKind_ComplexF128: {result = TG_Kind_ComplexF128;}break; + case RDI_TypeKind_Modifier: {result = TG_Kind_Modifier;}break; + case RDI_TypeKind_Ptr: {result = TG_Kind_Ptr;}break; + case RDI_TypeKind_LRef: {result = TG_Kind_LRef;}break; + case RDI_TypeKind_RRef: {result = TG_Kind_RRef;}break; + case RDI_TypeKind_Array: {result = TG_Kind_Array;}break; + case RDI_TypeKind_Function: {result = TG_Kind_Function;}break; + case RDI_TypeKind_Method: {result = TG_Kind_Method;}break; + case RDI_TypeKind_MemberPtr: {result = TG_Kind_MemberPtr;}break; + case RDI_TypeKind_Struct: {result = TG_Kind_Struct;}break; + case RDI_TypeKind_Class: {result = TG_Kind_Class;}break; + case RDI_TypeKind_Union: {result = TG_Kind_Union;}break; + case RDI_TypeKind_Enum: {result = TG_Kind_Enum;}break; + case RDI_TypeKind_Alias: {result = TG_Kind_Alias;}break; + case RDI_TypeKind_IncompleteStruct: {result = TG_Kind_IncompleteStruct;}break; + case RDI_TypeKind_IncompleteUnion: {result = TG_Kind_IncompleteUnion;}break; + case RDI_TypeKind_IncompleteClass: {result = TG_Kind_IncompleteClass;}break; + case RDI_TypeKind_IncompleteEnum: {result = TG_Kind_IncompleteEnum;}break; + case RDI_TypeKind_Bitfield: {result = TG_Kind_Bitfield;}break; + case RDI_TypeKind_Variadic: {result = TG_Kind_Variadic;}break; } return result; } internal TG_MemberKind -tg_member_kind_from_raddbgi_member_kind(RADDBGI_MemberKind kind) +tg_member_kind_from_rdi_member_kind(RDI_MemberKind kind) { TG_MemberKind result = TG_MemberKind_Null; switch(kind) { default:{}break; - case RADDBGI_MemberKind_DataField: {result = TG_MemberKind_DataField;}break; - case RADDBGI_MemberKind_StaticData: {result = TG_MemberKind_StaticData;}break; - case RADDBGI_MemberKind_Method: {result = TG_MemberKind_Method;}break; - case RADDBGI_MemberKind_StaticMethod: {result = TG_MemberKind_StaticMethod;}break; - case RADDBGI_MemberKind_VirtualMethod: {result = TG_MemberKind_VirtualMethod;}break; - case RADDBGI_MemberKind_VTablePtr: {result = TG_MemberKind_VTablePtr;}break; - case RADDBGI_MemberKind_Base: {result = TG_MemberKind_Base;}break; - case RADDBGI_MemberKind_VirtualBase: {result = TG_MemberKind_VirtualBase;}break; - case RADDBGI_MemberKind_NestedType: {result = TG_MemberKind_NestedType;}break; + case RDI_MemberKind_DataField: {result = TG_MemberKind_DataField;}break; + case RDI_MemberKind_StaticData: {result = TG_MemberKind_StaticData;}break; + case RDI_MemberKind_Method: {result = TG_MemberKind_Method;}break; + case RDI_MemberKind_StaticMethod: {result = TG_MemberKind_StaticMethod;}break; + case RDI_MemberKind_VirtualMethod: {result = TG_MemberKind_VirtualMethod;}break; + case RDI_MemberKind_VTablePtr: {result = TG_MemberKind_VTablePtr;}break; + case RDI_MemberKind_Base: {result = TG_MemberKind_Base;}break; + case RDI_MemberKind_VirtualBase: {result = TG_MemberKind_VirtualBase;}break; + case RDI_MemberKind_NestedType: {result = TG_MemberKind_NestedType;}break; } return result; } @@ -279,7 +279,7 @@ tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_type_key, U64 u64 //~ rjf: Graph Introspection API internal TG_Type * -tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { TG_Type *type = &tg_type_nil; U64 reg_byte_count = 0; @@ -324,7 +324,7 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd }break; case TG_Kind_Array: { - U64 ptee_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, cons_type->direct_type_key); + U64 ptee_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, cons_type->direct_type_key); type->byte_size = ptee_size * type->count; }break; } @@ -338,18 +338,18 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd U64 type_node_idx = key.u64[0]; if(0 <= type_node_idx && type_node_idx < rdbg->type_nodes_count) { - RADDBGI_TypeNode *rdbg_type = &rdbg->type_nodes[type_node_idx]; - TG_Kind kind = tg_kind_from_raddbgi_type_kind(rdbg_type->kind); + RDI_TypeNode *rdbg_type = &rdbg->type_nodes[type_node_idx]; + TG_Kind kind = tg_kind_from_rdi_type_kind(rdbg_type->kind); //- rjf: record types => unpack name * members & produce - if(RADDBGI_TypeKind_FirstRecord <= rdbg_type->kind && rdbg_type->kind <= RADDBGI_TypeKind_LastRecord) + if(RDI_TypeKind_FirstRecord <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastRecord) { // rjf: unpack name String8 name = {0}; - name.str = raddbgi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); // rjf: unpack UDT info - RADDBGI_UDT *udt = raddbgi_element_from_idx(rdbg, udts, rdbg_type->user_defined.udt_idx); + RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, rdbg_type->user_defined.udt_idx); // rjf: unpack members TG_Member *members = 0; @@ -363,17 +363,17 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd member_idx < udt->member_first+udt->member_count; member_idx += 1) { - RADDBGI_Member *src = &rdbg->members[member_idx]; + RDI_Member *src = &rdbg->members[member_idx]; TG_Kind member_type_kind = TG_Kind_Null; if(src->type_idx < rdbg->type_nodes_count) { - RADDBGI_TypeNode *member_type = &rdbg->type_nodes[src->type_idx]; - member_type_kind = tg_kind_from_raddbgi_type_kind(member_type->kind); + RDI_TypeNode *member_type = &rdbg->type_nodes[src->type_idx]; + member_type_kind = tg_kind_from_rdi_type_kind(member_type->kind); } TG_Member *dst = &members[member_idx-udt->member_first]; - dst->kind = tg_member_kind_from_raddbgi_member_kind(src->kind); + dst->kind = tg_member_kind_from_rdi_member_kind(src->kind); dst->type_key = tg_key_ext(member_type_kind, (U64)src->type_idx); - dst->name.str = raddbgi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); + dst->name.str = rdi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); dst->off = (U64)src->off; } } @@ -389,18 +389,18 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } //- rjf: enum types => unpack name * values & produce - else if(rdbg_type->kind == RADDBGI_TypeKind_Enum) + else if(rdbg_type->kind == RDI_TypeKind_Enum) { // rjf: unpack name String8 name = {0}; - name.str = raddbgi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); // rjf: unpack direct type TG_Key direct_type_key = zero_struct; if(rdbg_type->user_defined.direct_type_idx < type_node_idx) { - RADDBGI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; - TG_Kind direct_type_kind = tg_kind_from_raddbgi_type_kind(direct_type_node->kind); + RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; + TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->user_defined.direct_type_idx); } @@ -411,7 +411,7 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd U32 udt_idx = rdbg_type->user_defined.udt_idx; if(0 <= udt_idx && udt_idx < rdbg->udts_count) { - RADDBGI_UDT *udt = &rdbg->udts[udt_idx]; + RDI_UDT *udt = &rdbg->udts[udt_idx]; enum_vals_count = udt->member_count; enum_vals = push_array(arena, TG_EnumVal, enum_vals_count); if(0 <= udt->member_first && udt->member_first+udt->member_count < rdbg->enum_members_count) @@ -420,9 +420,9 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd member_idx < udt->member_first+udt->member_count; member_idx += 1) { - RADDBGI_EnumMember *src = &rdbg->enum_members[member_idx]; + RDI_EnumMember *src = &rdbg->enum_members[member_idx]; TG_EnumVal *dst = &enum_vals[member_idx-udt->member_first]; - dst->name.str = raddbgi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); + dst->name.str = rdi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); dst->val = src->val; } } @@ -440,7 +440,7 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } //- rjf: constructed types - if(RADDBGI_TypeKind_FirstConstructed <= rdbg_type->kind && rdbg_type->kind <= RADDBGI_TypeKind_LastConstructed) + if(RDI_TypeKind_FirstConstructed <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastConstructed) { // rjf: unpack direct type B32 direct_type_is_good = 0; @@ -448,8 +448,8 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd U64 direct_type_byte_size = 0; if(rdbg_type->constructed.direct_type_idx < type_node_idx) { - RADDBGI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->constructed.direct_type_idx]; - TG_Kind direct_type_kind = tg_kind_from_raddbgi_type_kind(direct_type_node->kind); + RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->constructed.direct_type_idx]; + TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->constructed.direct_type_idx); direct_type_is_good = 1; direct_type_byte_size = (U64)direct_type_node->byte_size; @@ -458,14 +458,14 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd // rjf: construct based on kind switch(rdbg_type->kind) { - case RADDBGI_TypeKind_Modifier: + case RDI_TypeKind_Modifier: { TG_Flags flags = 0; - if(rdbg_type->flags & RADDBGI_TypeModifierFlag_Const) + if(rdbg_type->flags & RDI_TypeModifierFlag_Const) { flags |= TG_Flag_Const; } - if(rdbg_type->flags & RADDBGI_TypeModifierFlag_Volatile) + if(rdbg_type->flags & RDI_TypeModifierFlag_Volatile) { flags |= TG_Flag_Volatile; } @@ -475,9 +475,9 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd type->byte_size = direct_type_byte_size; type->flags = flags; }break; - case RADDBGI_TypeKind_Ptr: - case RADDBGI_TypeKind_LRef: - case RADDBGI_TypeKind_RRef: + case RDI_TypeKind_Ptr: + case RDI_TypeKind_LRef: + case RDI_TypeKind_RRef: { type = push_array(arena, TG_Type, 1); type->kind = kind; @@ -485,7 +485,7 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd type->byte_size = graph->address_size; }break; - case RADDBGI_TypeKind_Array: + case RDI_TypeKind_Array: { type = push_array(arena, TG_Type, 1); type->kind = kind; @@ -493,12 +493,12 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd type->count = rdbg_type->constructed.count; type->byte_size = direct_type_byte_size * type->count; }break; - case RADDBGI_TypeKind_Function: + case RDI_TypeKind_Function: { U32 count = rdbg_type->constructed.count; U32 idx_run_first = rdbg_type->constructed.param_idx_run_first; U32 check_count = 0; - U32 *idx_run = raddbgi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); + U32 *idx_run = rdi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); if(check_count == count) { type = push_array(arena, TG_Type, 1); @@ -512,8 +512,8 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd U32 param_type_idx = idx_run[idx]; if(param_type_idx < type_node_idx) { - RADDBGI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; - TG_Kind param_kind = tg_kind_from_raddbgi_type_kind(param_type_node->kind); + RDI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; + TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind); type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); } else @@ -523,7 +523,7 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } } }break; - case RADDBGI_TypeKind_Method: + case RDI_TypeKind_Method: { // NOTE(rjf): for methods, the `direct` type points at the owner type. // the return type, instead of being encoded via the `direct` type, is @@ -531,7 +531,7 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd U32 count = rdbg_type->constructed.count; U32 idx_run_first = rdbg_type->constructed.param_idx_run_first; U32 check_count = 0; - U32 *idx_run = raddbgi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); + U32 *idx_run = rdi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); if(check_count == count) { type = push_array(arena, TG_Type, 1); @@ -545,8 +545,8 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd U32 param_type_idx = idx_run[idx]; if(param_type_idx < type_node_idx) { - RADDBGI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; - TG_Kind param_kind = tg_kind_from_raddbgi_type_kind(param_type_node->kind); + RDI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; + TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind); type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); } else @@ -562,14 +562,14 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } } }break; - case RADDBGI_TypeKind_MemberPtr: + case RDI_TypeKind_MemberPtr: { // rjf: unpack owner type TG_Key owner_type_key = zero_struct; if(rdbg_type->constructed.owner_type_idx < type_node_idx) { - RADDBGI_TypeNode *owner_type_node = &rdbg->type_nodes[rdbg_type->constructed.owner_type_idx]; - TG_Kind owner_type_kind = tg_kind_from_raddbgi_type_kind(owner_type_node->kind); + RDI_TypeNode *owner_type_node = &rdbg->type_nodes[rdbg_type->constructed.owner_type_idx]; + TG_Kind owner_type_kind = tg_kind_from_rdi_type_kind(owner_type_node->kind); owner_type_key = tg_key_ext(owner_type_kind, (U64)rdbg_type->constructed.owner_type_idx); } type = push_array(arena, TG_Type, 1); @@ -582,19 +582,19 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } //- rjf: alias types - else if(rdbg_type->kind == RADDBGI_TypeKind_Alias) + else if(rdbg_type->kind == RDI_TypeKind_Alias) { // rjf: unpack name String8 name = {0}; - name.str = raddbgi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); // rjf: unpack direct type TG_Key direct_type_key = zero_struct; U64 direct_type_byte_size = 0; if(rdbg_type->user_defined.direct_type_idx < type_node_idx) { - RADDBGI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; - TG_Kind direct_type_kind = tg_kind_from_raddbgi_type_kind(direct_type_node->kind); + RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; + TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->user_defined.direct_type_idx); direct_type_byte_size = direct_type_node->byte_size; } @@ -608,11 +608,11 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } //- rjf: incomplete types - else if(RADDBGI_TypeKind_FirstIncomplete <= rdbg_type->kind && rdbg_type->kind <= RADDBGI_TypeKind_LastIncomplete) + else if(RDI_TypeKind_FirstIncomplete <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastIncomplete) { // rjf: unpack name String8 name = {0}; - name.str = raddbgi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); // rjf: produce type = push_array(arena, TG_Type, 1); @@ -795,7 +795,7 @@ tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rd } internal TG_Key -tg_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { TG_Key result = zero_struct; switch(key.kind) @@ -805,7 +805,7 @@ tg_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key k case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); result = type->direct_type_key; scratch_end(scratch); }break; @@ -814,16 +814,16 @@ tg_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key k } internal TG_Key -tg_unwrapped_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { - key = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, key); - key = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); - key = tg_unwrapped_from_graph_raddbgi_key(graph, rdbg, key); + key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, key); + key = tg_direct_from_graph_rdi_key(graph, rdbg, key); + key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, key); return key; } internal TG_Key -tg_owner_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { TG_Key result = zero_struct; switch(key.kind) @@ -833,7 +833,7 @@ tg_owner_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key ke case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); result = type->owner_type_key; scratch_end(scratch); }break; @@ -842,14 +842,14 @@ tg_owner_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key ke } internal TG_Key -tg_ptee_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { TG_Key result = key; B32 passed_ptr = 0; for(;;) { TG_Kind kind = tg_kind_from_key(result); - result = tg_direct_from_graph_raddbgi_key(graph, rdbg, result); + result = tg_direct_from_graph_rdi_key(graph, rdbg, result); if(kind == TG_Kind_Ptr || kind == TG_Kind_LRef || kind == TG_Kind_RRef) { passed_ptr = 1; @@ -874,7 +874,7 @@ tg_ptee_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key } internal TG_Key -tg_unwrapped_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { TG_Key result = key; for(B32 good = 1; good;) @@ -884,7 +884,7 @@ tg_unwrapped_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Ke kind == TG_Kind_Modifier || kind == TG_Kind_Alias) { - result = tg_direct_from_graph_raddbgi_key(graph, rdbg, result); + result = tg_direct_from_graph_rdi_key(graph, rdbg, result); } else { @@ -895,7 +895,7 @@ tg_unwrapped_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Ke } internal U64 -tg_byte_size_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { U64 result = 0; switch(key.kind) @@ -910,7 +910,7 @@ tg_byte_size_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Ke case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); result = type->byte_size; scratch_end(scratch); }break; @@ -945,12 +945,12 @@ tg_member_copy(Arena *arena, TG_Member *src) } internal TG_MemberArray -tg_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { TG_MemberArray result = {0}; Temp scratch = scratch_begin(&arena, 1); { - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); if(type->members != 0) { result.count = type->count; @@ -967,7 +967,7 @@ tg_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed } internal TG_MemberArray -tg_data_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { Temp scratch = scratch_begin(&arena, 1); TG_Kind root_type_kind = tg_kind_from_key(key); @@ -976,7 +976,7 @@ tg_data_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Pa TG_MemberList members_list = {0}; B32 members_need_offset_sort = 0; { - TG_Type *root_type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *root_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); typedef struct Task Task; struct Task { @@ -1015,7 +1015,7 @@ tg_data_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Pa t->inheritance_chain = tg_key_list_copy(scratch.arena, &task->inheritance_chain); tg_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key); t->type_key = type->members[member_idx].type_key; - t->type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key); + t->type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key); SLLQueuePush(first_task, last_task, t); members_need_offset_sort = 1; } @@ -1064,7 +1064,7 @@ tg_data_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Pa TG_Member *member = &members.v[idx]; if(idx+1 < members.count) { - U64 member_byte_size = tg_byte_size_from_graph_raddbgi_key(graph, rdbg, member->type_key); + U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, member->type_key); Rng1U64 member_byte_range = r1u64(member->off, member->off + member_byte_size); if(member[1].off > member_byte_range.max) { @@ -1111,7 +1111,7 @@ tg_data_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Pa } internal void -tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return) +tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return) { String8 keyword = {0}; TG_Kind kind = tg_kind_from_key(key); @@ -1120,7 +1120,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K default: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, str8_lit(" ")); scratch_end(scratch); @@ -1128,14 +1128,14 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K case TG_Kind_Bitfield: { - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, prec, skip_return); }break; case TG_Kind_Modifier: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Key direct = type->direct_type_key; tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); if(type->flags & TG_Flag_Const) @@ -1161,7 +1161,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K case TG_Kind_Alias: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, str8_lit(" ")); scratch_end(scratch); @@ -1174,7 +1174,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K fwd_udt:; { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); str8_list_push(arena, out, keyword); str8_list_push(arena, out, str8_lit(" ")); str8_list_push(arena, out, push_str8_copy(arena, type->name)); @@ -1184,7 +1184,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K case TG_Kind_Array: { - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, skip_return); if(prec == 1) { @@ -1196,7 +1196,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K { if(!skip_return) { - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, 0); } if(prec == 1) @@ -1207,21 +1207,21 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K case TG_Kind_Ptr: { - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("*")); }break; case TG_Kind_LRef: { - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("&")); }break; case TG_Kind_RRef: { - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("&&")); }break; @@ -1229,10 +1229,10 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K case TG_Kind_MemberPtr: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Key direct = type->direct_type_key; tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); - TG_Type *container = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, type->owner_type_key); + TG_Type *container = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type->owner_type_key); if(container->kind != TG_Kind_Null) { str8_list_push(arena, out, push_str8_copy(arena, container->name)); @@ -1248,7 +1248,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K } internal void -tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec) +tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec) { TG_Kind kind = tg_kind_from_key(key); switch(kind) @@ -1257,7 +1257,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K case TG_Kind_Bitfield: { - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_rhs_string_from_key(arena, graph, rdbg, direct, out, prec); }break; @@ -1267,14 +1267,14 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K case TG_Kind_RRef: case TG_Kind_MemberPtr: { - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 1); }break; case TG_Kind_Array: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); if(prec == 1) { str8_list_push(arena, out, str8_lit(")")); @@ -1283,7 +1283,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K str8_list_push(arena, out, str8_lit("[")); str8_list_push(arena, out, count_str); str8_list_push(arena, out, str8_lit("]")); - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2); scratch_end(scratch); }break; @@ -1291,7 +1291,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K case TG_Kind_Function: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_raddbgi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); if(prec == 1) { str8_list_push(arena, out, str8_lit(")")); @@ -1320,7 +1320,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K } str8_list_push(arena, out, str8_lit(")")); } - TG_Key direct = tg_direct_from_graph_raddbgi_key(graph, rdbg, key); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2); scratch_end(scratch); }break; @@ -1328,7 +1328,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_K } internal String8 -tg_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key) +tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; diff --git a/src/type_graph/type_graph.h b/src/type_graph/type_graph.h index 9ce08056..1b20b86d 100644 --- a/src/type_graph/type_graph.h +++ b/src/type_graph/type_graph.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef TYPE_GRAPH_NEW_H -#define TYPE_GRAPH_NEW_H +#ifndef TYPE_GRAPH_H +#define TYPE_GRAPH_H //////////////////////////////// //~ rjf: Generated Code @@ -203,8 +203,8 @@ internal TG_KeyList tg_key_list_copy(Arena *arena, TG_KeyList *src); //////////////////////////////// //~ rjf: RADDBG <-> TG Enum Conversions -internal TG_Kind tg_kind_from_raddbgi_type_kind(RADDBGI_TypeKind kind); -internal TG_MemberKind tg_member_kind_from_raddbgi_member_kind(RADDBGI_MemberKind kind); +internal TG_Kind tg_kind_from_rdi_type_kind(RDI_TypeKind kind); +internal TG_MemberKind tg_member_kind_from_rdi_member_kind(RDI_MemberKind kind); //////////////////////////////// //~ rjf: Key Type Functions @@ -225,19 +225,19 @@ internal TG_Key tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_t //////////////////////////////// //~ rjf: Graph Introspection API -internal TG_Type *tg_type_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_unwrapped_direct_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_owner_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_ptee_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_unwrapped_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal U64 tg_byte_size_from_graph_raddbgi_key(TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_Type *tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_Key tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal U64 tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Kind tg_kind_from_key(TG_Key key); internal TG_Member *tg_member_copy(Arena *arena, TG_Member *src); -internal TG_MemberArray tg_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal TG_MemberArray tg_data_members_from_graph_raddbgi_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); -internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return); -internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec); -internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RADDBGI_Parsed *rdbg, TG_Key key); +internal TG_MemberArray tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_MemberArray tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return); +internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec); +internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -#endif // TYPE_GRAPH_NEW_H +#endif // TYPE_GRAPH_H From 816f94ef7192ccdfec5cbc80e6dafab5e45182de Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 15:56:30 -0800 Subject: [PATCH 064/275] further raddbgi -> rdi naming pass --- README.md | 2 +- src/ctrl/ctrl_core.c | 80 +++++------ src/dbgi/dbgi.c | 42 +++--- src/dbgi/dbgi.h | 4 +- src/df/core/df_core.c | 204 +++++++++++++-------------- src/df/core/df_core.h | 10 +- src/df/gfx/df_gfx.c | 82 +++++------ src/df/gfx/df_gfx.h | 2 +- src/df/gfx/df_view_rule_hooks.c | 40 +++--- src/df/gfx/df_views.c | 38 ++--- src/eval/eval_compiler.c | 236 ++++++++++++++++---------------- src/eval/eval_compiler.h | 20 +-- src/eval/eval_parser.c | 162 +++++++++++----------- src/eval/eval_parser.h | 8 +- src/scratch/look_at_raddbg.c | 24 ++-- src/type_graph/type_graph.c | 216 ++++++++++++++--------------- src/type_graph/type_graph.h | 24 ++-- 17 files changed, 597 insertions(+), 597 deletions(-) diff --git a/README.md b/README.md index 35b7a385..13d40cec 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ A list of the layers in the codebase and their associated namespaces is below: - `lib_raddbgi_make` (`RDIM_`): Standalone library for constructing RADDBGI debug info data. Does not depend on `base`, and can be independently relocated to other codebases. -- `lib_raddbgi_format` (`RADDBGI_`): Standalone library for defining the core +- `lib_raddbgi_format` (`RDI_`): Standalone library which defines the core RADDBGI types and helper functions for reading and writing the RADDBGI debug info file format. Does not depend on `base`, and can be independently relocated to other codebases. diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index e050523a..41d1cc8f 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -204,7 +204,7 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE DBGI_Scope *scope = dbgi_scope_open(); String8 exe_path = demon_full_path_from_module(scratch.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; U64 base_vaddr = demon_base_vaddr_from_module(module); for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) { @@ -229,16 +229,16 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE // rjf: filename -> src_id U32 src_id = 0; { - RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdbg, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, filename_normalized.str, filename_normalized.size); + rdi_name_map_parse(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { src_id = ids[0]; @@ -249,9 +249,9 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE // rjf: src_id * pt -> push { - RDI_SourceFile *src = rdi_element_from_idx(rdbg, source_files, src_id); + RDI_SourceFile *src = rdi_element_from_idx(rdi, source_files, src_id); RDI_ParsedLineMap line_map = {0}; - rdi_line_map_from_source_file(rdbg, src, &line_map); + rdi_line_map_from_source_file(rdi, src, &line_map); U32 voff_count = 0; U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); for(U32 i = 0; i < voff_count; i += 1) @@ -268,21 +268,21 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE { String8 symbol_name = bp->string; U64 voff = bp->u64; - if(rdbg != 0 && rdbg->procedures != 0) + if(rdi != 0 && rdi->procedures != 0) { - RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Procedures); + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); if(mapptr != 0) { RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdbg, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, symbol_name.str, symbol_name.size); + rdi_name_map_parse(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, symbol_name.str, symbol_name.size); if(node != 0) { U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); for(U32 match_i = 0; match_i < id_count; match_i += 1) { - U64 proc_voff = rdi_first_voff_from_proc(rdbg, ids[match_i]); + U64 proc_voff = rdi_first_voff_from_proc(rdi, ids[match_i]); U64 proc_vaddr = proc_voff + base_vaddr; DEMON_Trap trap = {process, proc_vaddr + voff, (U64)bp}; demon_trap_chunk_list_push(arena, traps_out, 256, &trap); @@ -1643,21 +1643,21 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c CTRL_Handle module = ctrl_handle_from_demon(modules.handles[0]); String8 module_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module)); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64); - RDI_Parsed *rdbg = &dbgi->rdbg; - RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_GlobalVariables); - if(rdbg->global_variables != 0 && unparsed_map != 0) + RDI_Parsed *rdi = &dbgi->rdi; + RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_GlobalVariables); + if(rdi->global_variables != 0 && unparsed_map != 0) { RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdbg, unparsed_map, &map); + rdi_name_map_parse(rdi, unparsed_map, &map); String8 name = str8_lit("__asan_shadow_memory_dynamic_address"); - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); if(node != 0) { U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { - RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, ids[0]); + RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, ids[0]); U64 global_var_voff = global_var->voff; U64 global_var_vaddr = global_var->voff + demon_base_vaddr_from_module(ctrl_demon_handle_from_ctrl(module)); Architecture arch = demon_arch_from_object(ev->thread); @@ -2148,10 +2148,10 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U64 module_base_vaddr = demon_base_vaddr_from_module(module); String8 exe_path = demon_full_path_from_module(scratch.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RDI_Parsed *rdbg = &dbgi->rdbg; - RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Procedures); + RDI_Parsed *rdi = &dbgi->rdi; + RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdbg, unparsed_map, &map); + rdi_name_map_parse(rdi, unparsed_map, &map); //- rjf: add trap for user-specified entry point, if specified B32 entries_found = 0; @@ -2162,15 +2162,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = n->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); if(voff != 0) { entries_found = 1; @@ -2188,15 +2188,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = n->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); if(voff != 0) { DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; @@ -2221,15 +2221,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = hi_entry_points[idx]; - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); if(voff != 0) { entries_found = 1; @@ -2265,15 +2265,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U32 procedure_id = 0; { String8 name = lo_entry_points[idx]; - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { procedure_id = ids[0]; } } - U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); if(voff != 0) { entries_found = 1; @@ -2871,7 +2871,7 @@ ctrl_thread__run(CTRL_Msg *msg) { String8 exe_path = demon_full_path_from_module(temp.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) { String8 string = condition_n->string; @@ -2879,12 +2879,12 @@ ctrl_thread__run(CTRL_Msg *msg) { parse_ctx.arch = arch; parse_ctx.ip_voff = thread_rip_voff; - parse_ctx.rdbg = rdbg; + parse_ctx.rdi = rdi; parse_ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256); parse_ctx.regs_map = ctrl_string2reg_from_arch(arch); parse_ctx.reg_alias_map = ctrl_string2alias_from_arch(arch); - parse_ctx.locals_map = eval_push_locals_map_from_rdi_voff(temp.arena, rdbg, thread_rip_voff); - parse_ctx.member_map = eval_push_member_map_from_rdi_voff(temp.arena, rdbg, thread_rip_voff); + parse_ctx.locals_map = eval_push_locals_map_from_rdi_voff(temp.arena, rdi, thread_rip_voff); + parse_ctx.member_map = eval_push_member_map_from_rdi_voff(temp.arena, rdi, thread_rip_voff); } EVAL_TokenArray tokens = eval_token_array_from_text(temp.arena, string); EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(temp.arena, &parse_ctx, string, &tokens); @@ -2894,7 +2894,7 @@ ctrl_thread__run(CTRL_Msg *msg) EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; if(parse_has_expr && errors.count == 0) { - ir_tree_and_type = eval_irtree_and_type_from_expr(temp.arena, parse_ctx.type_graph, rdbg, &eval_string2expr_map_nil, parse.expr, &errors); + ir_tree_and_type = eval_irtree_and_type_from_expr(temp.arena, parse_ctx.type_graph, rdi, &eval_string2expr_map_nil, parse.expr, &errors); } EVAL_OpList op_list = {0}; if(parse_has_expr && ir_tree_and_type.tree != &eval_irtree_nil) diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index e34dcf39..3b0c5980 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -111,7 +111,7 @@ dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemAr } internal String8 -dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RDI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx) +dbgi_fuzzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, DBGI_FuzzySearchTarget target, U64 element_idx) { String8 result = {0}; switch(target) @@ -119,31 +119,31 @@ dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RDI_Parsed *rdbg, DBGI_Fuzzy // NOTE(rjf): no default - warn if we miss a case case DBGI_FuzzySearchTarget_Procedures: { - RDI_Procedure *proc = rdi_element_from_idx(rdbg, procedures, element_idx); + RDI_Procedure *proc = rdi_element_from_idx(rdi, procedures, element_idx); U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdbg, proc->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdi, proc->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_GlobalVariables: { - RDI_GlobalVariable *gvar = rdi_element_from_idx(rdbg, global_variables, element_idx); + RDI_GlobalVariable *gvar = rdi_element_from_idx(rdi, global_variables, element_idx); U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdbg, gvar->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdi, gvar->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_ThreadVariables: { - RDI_ThreadVariable *tvar = rdi_element_from_idx(rdbg, thread_variables, element_idx); + RDI_ThreadVariable *tvar = rdi_element_from_idx(rdi, thread_variables, element_idx); U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdbg, tvar->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdi, tvar->name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_UDTs: { - RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, element_idx); - RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + RDI_UDT *udt = rdi_element_from_idx(rdi, udts, element_idx); + RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, udt->self_type_idx); U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdbg, type_node->user_defined.name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdi, type_node->user_defined.name_string_idx, &name_size); result = str8(name_base, name_size); }break; case DBGI_FuzzySearchTarget_COUNT:{}break; @@ -1017,7 +1017,7 @@ dbgi_parse_thread_entry_point(void *p) } //- rjf: parse raddbg info - RDI_Parsed rdi_parsed = dbgi_parse_nil.rdbg; + RDI_Parsed rdi_parsed = dbgi_parse_nil.rdi; U64 arch_addr_size = 8; if(do_task) { @@ -1053,7 +1053,7 @@ dbgi_parse_thread_entry_point(void *p) bin->parse.arena = parse_arena; bin->parse.dbg_path = push_str8_copy(parse_arena, dbg_path); MemoryCopyStruct(&bin->parse.pe, &exe_pe_info); - MemoryCopyStruct(&bin->parse.rdbg, &rdi_parsed); + MemoryCopyStruct(&bin->parse.rdi, &rdi_parsed); bin->parse.gen = bin->gen; break; } @@ -1197,9 +1197,9 @@ dbgi_fuzzy_thread__entry_point(void *p) //- rjf: exe_path -> dbgi_parse, raddbg DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; - //- rjf: rdbg * query -> item list + //- rjf: rdi * query -> item list U64 table_ptr_off = 0; U64 element_name_idx_off = 0; U64 element_count = 0; @@ -1212,34 +1212,34 @@ dbgi_fuzzy_thread__entry_point(void *p) { table_ptr_off = OffsetOf(RDI_Parsed, procedures); element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx); - element_count = rdbg->procedures_count; + element_count = rdi->procedures_count; element_size = sizeof(RDI_Procedure); }break; case DBGI_FuzzySearchTarget_GlobalVariables: { table_ptr_off = OffsetOf(RDI_Parsed, global_variables); element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx); - element_count = rdbg->global_variables_count; + element_count = rdi->global_variables_count; element_size = sizeof(RDI_GlobalVariable); }break; case DBGI_FuzzySearchTarget_ThreadVariables: { table_ptr_off = OffsetOf(RDI_Parsed, thread_variables); element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx); - element_count = rdbg->thread_variables_count; + element_count = rdi->thread_variables_count; element_size = sizeof(RDI_ThreadVariable); }break; case DBGI_FuzzySearchTarget_UDTs: { table_ptr_off = OffsetOf(RDI_Parsed, udts); - element_count = rdbg->udts_count; + element_count = rdi->udts_count; element_size = sizeof(RDI_UDT); }break; } DBGI_FuzzySearchItemChunkList items_list = {0}; if(task_is_good) { - void *table_base = (U8*)rdbg + table_ptr_off; + void *table_base = (U8*)rdi + table_ptr_off; for(U64 idx = 1; task_is_good && idx < element_count; idx += 1) { void *element = (U8 *)(*(void **)table_base) + element_size*idx; @@ -1247,12 +1247,12 @@ dbgi_fuzzy_thread__entry_point(void *p) if(target == DBGI_FuzzySearchTarget_UDTs) { RDI_UDT *udt = (RDI_UDT *)element; - RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, udt->self_type_idx); name_idx_ptr = &type_node->user_defined.name_string_idx; } U32 name_idx = *name_idx_ptr; U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdbg, name_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdi, name_idx, &name_size); String8 name = str8(name_base, name_size); if(name.size == 0) { continue; } FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query, name); diff --git a/src/dbgi/dbgi.h b/src/dbgi/dbgi.h index 0ba0f35b..80c01841 100644 --- a/src/dbgi/dbgi.h +++ b/src/dbgi/dbgi.h @@ -18,7 +18,7 @@ struct DBGI_Parse void *dbg_base; FileProperties dbg_props; PE_BinInfo pe; - RDI_Parsed rdbg; + RDI_Parsed rdi; }; //////////////////////////////// @@ -379,7 +379,7 @@ internal void dbgi_ensure_tctx_inited(void); internal U64 dbgi_hash_from_string(String8 string); internal U64 dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemArray *array, U64 element_idx); -internal String8 dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RDI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx); +internal String8 dbgi_fuzzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, DBGI_FuzzySearchTarget target, U64 element_idx); //////////////////////////////// //~ rjf: Forced Override Cache Functions diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 24f23489..664516fd 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1085,10 +1085,10 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, query); if(eval.errors.count == 0) { - TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, eval.type_key)); + TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, eval.type_key)); if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) { - eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdbg, ctrl_ctx, eval); + eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdi, ctrl_ctx, eval); prefer_imm = 1; } U64 u64 = !prefer_imm && eval.offset ? eval.offset : eval.imm_u64; @@ -3196,23 +3196,23 @@ df_symbol_name_from_binary_voff(Arena *arena, DF_Entity *binary, U64 voff) DBGI_Scope *scope = dbgi_scope_open(); String8 path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; - if(result.size == 0 && rdbg->scope_vmap != 0) + RDI_Parsed *rdi = &dbgi->rdi; + if(result.size == 0 && rdi->scope_vmap != 0) { - U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); - RDI_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff); + RDI_Scope *scope = &rdi->scopes[scope_idx]; U64 proc_idx = scope->proc_idx; - RDI_Procedure *procedure = &rdbg->procedures[proc_idx]; + RDI_Procedure *procedure = &rdi->procedures[proc_idx]; U64 name_size = 0; - U8 *name_ptr = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); result = push_str8_copy(arena, str8(name_ptr, name_size)); } - if(result.size == 0 && rdbg->global_vmap != 0) + if(result.size == 0 && rdi->global_vmap != 0) { - U64 global_idx = rdi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, voff); - RDI_GlobalVariable *global_var = &rdbg->global_variables[global_idx]; + U64 global_idx = rdi_vmap_idx_from_voff(rdi->global_vmap, rdi->global_vmap_count, voff); + RDI_GlobalVariable *global_var = &rdi->global_variables[global_idx]; U64 name_size = 0; - U8 *name_ptr = rdi_string_from_idx(rdbg, global_var->name_string_idx, &name_size); + U8 *name_ptr = rdi_string_from_idx(rdi, global_var->name_string_idx, &name_size); result = push_str8_copy(arena, str8(name_ptr, name_size)); } dbgi_scope_close(scope); @@ -3259,27 +3259,27 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit binary_n != 0; binary_n = binary_n->next) { - // rjf: binary -> rdbg + // rjf: binary -> rdi DF_Entity *binary = binary_n->entity; String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; - // rjf: file_path_normalized * rdbg -> src_id + // rjf: file_path_normalized * rdi -> src_id B32 good_src_id = 0; U32 src_id = 0; if(dbgi != &dbgi_parse_nil) { - RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdbg, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); + rdi_name_map_parse(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { good_src_id = 1; @@ -3292,9 +3292,9 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit // rjf: good src-id -> look up line info for visible range if(good_src_id) { - RDI_SourceFile *src = rdbg->source_files+src_id; + RDI_SourceFile *src = rdi->source_files+src_id; RDI_ParsedLineMap line_map = {0}; - rdi_line_map_from_source_file(rdbg, src, &line_map); + rdi_line_map_from_source_file(rdi, src, &line_map); U64 line_idx = 0; for(S64 line_num = line_num_range.min; line_num <= line_num_range.max; @@ -3306,10 +3306,10 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit for(U64 idx = 0; idx < voff_count; idx += 1) { U64 base_voff = voffs[idx]; - U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); - RDI_Unit *unit = &rdbg->units[unit_idx]; + U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, base_voff); + RDI_Unit *unit = &rdi->units[unit_idx]; RDI_ParsedLineInfo unit_line_info = {0}; - rdi_line_info_from_unit(rdbg, unit, &unit_line_info); + rdi_line_info_from_unit(rdi, unit, &unit_line_info); U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); if(unit_line_info.voffs != 0) { @@ -3347,23 +3347,23 @@ df_text_line_dasm2src_info_from_binary_voff(DF_Entity *binary, U64 voff) DBGI_Scope *scope = dbgi_scope_open(); String8 path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; DF_TextLineDasm2SrcInfo result = {0}; result.file = result.binary = &df_g_nil_entity; - if(rdbg->unit_vmap != 0 && rdbg->units != 0 && rdbg->source_files != 0) + if(rdi->unit_vmap != 0 && rdi->units != 0 && rdi->source_files != 0) { - U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, voff); - RDI_Unit *unit = &rdbg->units[unit_idx]; + U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, voff); + RDI_Unit *unit = &rdi->units[unit_idx]; RDI_ParsedLineInfo unit_line_info = {0}; - rdi_line_info_from_unit(rdbg, unit, &unit_line_info); + rdi_line_info_from_unit(rdi, unit, &unit_line_info); U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff); if(line_info_idx < unit_line_info.count) { RDI_Line *line = &unit_line_info.lines[line_info_idx]; RDI_Column *column = (line_info_idx < unit_line_info.col_count) ? &unit_line_info.cols[line_info_idx] : 0; - RDI_SourceFile *file = &rdbg->source_files[line->file_idx]; + RDI_SourceFile *file = &rdi->source_files[line->file_idx]; String8 file_normalized_full_path = {0}; - file_normalized_full_path.str = rdi_string_from_idx(rdbg, file->normal_full_path_string_idx, &file_normalized_full_path.size); + file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size); result.binary = binary; if(line->file_idx != 0 && file_normalized_full_path.size != 0) { @@ -3412,7 +3412,7 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) { String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; RDI_NameMapKind name_map_kinds[] = { RDI_NameMapKind_GlobalVariables, @@ -3425,10 +3425,10 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) name_map_kind_idx += 1) { RDI_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx]; - RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, name_map_kind); + RDI_NameMap *name_map = rdi_name_map_from_kind(rdi, name_map_kind); RDI_ParsedNameMap parsed_name_map = {0}; - rdi_name_map_parse(rdbg, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, symbol_name.str, symbol_name.size); + rdi_name_map_parse(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, symbol_name.str, symbol_name.size); // rjf: node -> num U64 entity_num = 0; @@ -3443,7 +3443,7 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) default: { U32 num = 0; - U32 *run = rdi_matches_from_map_node(rdbg, node, &num); + U32 *run = rdi_matches_from_map_node(rdi, node, &num); if(num != 0) { entity_num = run[0]+1; @@ -3459,14 +3459,14 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name) default:{}break; case RDI_NameMapKind_GlobalVariables: { - RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, entity_num-1); + RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, entity_num-1); voff = global_var->voff; }break; case RDI_NameMapKind_Procedures: { - RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, entity_num-1); - RDI_Scope *scope = rdi_element_from_idx(rdbg, scopes, procedure->root_scope_idx); - voff = rdbg->scope_voffs[scope->voff_range_first]; + RDI_Procedure *procedure = rdi_element_from_idx(rdi, procedures, entity_num-1); + RDI_Scope *scope = rdi_element_from_idx(rdi, scopes, procedure->root_scope_idx); + voff = rdi->scope_voffs[scope->voff_range_first]; }break; } @@ -3495,11 +3495,11 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name) { String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; - RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Types); + RDI_Parsed *rdi = &dbgi->rdi; + RDI_NameMap *name_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Types); RDI_ParsedNameMap parsed_name_map = {0}; - rdi_name_map_parse(rdbg, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); + rdi_name_map_parse(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size); U64 entity_num = 0; if(node != 0) { @@ -3512,7 +3512,7 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name) default: { U32 num = 0; - U32 *run = rdi_matches_from_map_node(rdbg, node, &num); + U32 *run = rdi_matches_from_map_node(rdi, node, &num); if(num != 0) { entity_num = run[0]+1; @@ -3697,8 +3697,8 @@ df_push_locals_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity * Temp scratch = scratch_begin(&arena, 1); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; - EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdbg, voff); + RDI_Parsed *rdi = &dbgi->rdi; + EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdi, voff); scratch_end(scratch); return result; } @@ -3709,8 +3709,8 @@ df_push_member_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity * Temp scratch = scratch_begin(&arena, 1); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; - EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdbg, voff); + RDI_Parsed *rdi = &dbgi->rdi; + EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdi, voff); scratch_end(scratch); return result; } @@ -3987,7 +3987,7 @@ df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 DF_Entity *binary = df_binary_file_from_module(module); String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; Architecture arch = df_architecture_from_entity(process); EVAL_String2NumMap *reg_map = ctrl_string2reg_from_arch(arch); EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch); @@ -3999,7 +3999,7 @@ df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 { ctx.arch = arch; ctx.ip_voff = voff; - ctx.rdbg = rdbg; + ctx.rdi = rdi; ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256); ctx.regs_map = reg_map; ctx.reg_alias_map = reg_alias_map; @@ -4031,26 +4031,26 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt) binary_n != 0; binary_n = binary_n->next) { - // rjf: binary -> rdbg + // rjf: binary -> rdi DF_Entity *binary = binary_n->entity; String8 binary_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; - // rjf: file_path_normalized * rdbg -> src_id + // rjf: file_path_normalized * rdi -> src_id B32 good_src_id = 0; U32 src_id = 0; { - RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_NormalSourcePaths); if(mapptr != 0) { RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdbg, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); + rdi_name_map_parse(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); if(node != 0) { U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { good_src_id = 1; @@ -4063,18 +4063,18 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt) // rjf: good src-id -> look up line info for visible range if(good_src_id) { - RDI_SourceFile *src = rdbg->source_files+src_id; + RDI_SourceFile *src = rdi->source_files+src_id; RDI_ParsedLineMap line_map = {0}; - rdi_line_map_from_source_file(rdbg, src, &line_map); + rdi_line_map_from_source_file(rdi, src, &line_map); U32 voff_count = 0; U64 *voffs = rdi_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count); for(U64 idx = 0; idx < voff_count; idx += 1) { U64 base_voff = voffs[idx]; - U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); - RDI_Unit *unit = &rdbg->units[unit_idx]; + U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, base_voff); + RDI_Unit *unit = &rdi->units[unit_idx]; RDI_ParsedLineInfo unit_line_info = {0}; - rdi_line_info_from_unit(rdbg, unit, &unit_line_info); + rdi_line_info_from_unit(rdi, unit, &unit_line_info); U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; @@ -4113,7 +4113,7 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt) //- rjf: bad ctx -> reset with graceful defaults if(good_ctx == 0) { - ctx.rdbg = &dbgi_parse_nil.rdbg; + ctx.rdi = &dbgi_parse_nil.rdi; ctx.type_graph = tg_graph_begin(8, 256); ctx.regs_map = &eval_string2num_map_nil; ctx.regs_map = &eval_string2num_map_nil; @@ -4179,7 +4179,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; if(parse_has_expr && errors.count == 0) { - ir_tree_and_type = eval_irtree_and_type_from_expr(arena, parse_ctx->type_graph, parse_ctx->rdbg, macro_map, parse.expr, &errors); + ir_tree_and_type = eval_irtree_and_type_from_expr(arena, parse_ctx->type_graph, parse_ctx->rdi, macro_map, parse.expr, &errors); } //- rjf: get list of ops @@ -4237,7 +4237,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ //- rjf: apply dynamic type overrides if(parse.expr != 0 && parse.expr->kind != EVAL_ExprKind_Cast) { - result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, result); + result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, result); } scratch_end(scratch); @@ -4246,7 +4246,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ } internal DF_Eval -df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) +df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) { ProfBeginFunction(); DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); @@ -4262,7 +4262,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl { TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= 8) { Temp scratch = scratch_begin(0, 0); @@ -4292,7 +4292,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl case EVAL_EvalMode_Reg: { TG_Key type_key = eval.type_key; - U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); U64 reg_off = eval.offset; CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); if(unwind.first != 0) @@ -4316,7 +4316,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl } internal DF_Eval -df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) +df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -4330,11 +4330,11 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCt TG_Kind type_kind = tg_kind_from_key(type_key); if(type_kind == TG_Kind_Ptr) { - TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, type_key); + TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, type_key); TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key); if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class) { - TG_Type *ptee_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, ptee_type_key); + TG_Type *ptee_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, ptee_type_key); B32 has_vtable = 0; for(U64 idx = 0; idx < ptee_type->count; idx += 1) { @@ -4363,12 +4363,12 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCt U64 vtable_vaddr = 0; MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size); U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr); - U64 global_idx = rdi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff); - RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, global_idx); + U64 global_idx = rdi_vmap_idx_from_voff(rdi->global_vmap, rdi->global_vmap_count, vtable_voff); + RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, global_idx); if(global_var->link_flags & RDI_LinkFlag_TypeScoped) { - RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, global_var->container_idx); - RDI_TypeNode *type = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + RDI_UDT *udt = rdi_element_from_idx(rdi, udts, global_var->container_idx); + RDI_TypeNode *type = rdi_element_from_idx(rdi, type_nodes, udt->self_type_idx); TG_Key derived_type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), (U64)udt->self_type_idx); TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0); eval.type_key = ptr_to_derived_type_key; @@ -4579,13 +4579,13 @@ df_string_from_ascii_value(Arena *arena, U8 val) } internal String8 -df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) +df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) { ProfBeginFunction(); String8 result = {0}; - TG_Key type_key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, eval.type_key); + TG_Key type_key = tg_unwrapped_from_graph_rdi_key(graph, rdi, eval.type_key); TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); + U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); U8 digit_group_separator = 0; if(!(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) { @@ -4653,7 +4653,7 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg case TG_Kind_Enum: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type_key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type_key); String8 constant_name = {0}; for(U64 val_idx = 0; val_idx < type->count; val_idx += 1) { @@ -4693,7 +4693,7 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg //- rjf: writing values back to child processes internal B32 -df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) +df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) { B32 result = 0; Temp scratch = scratch_begin(0, 0); @@ -4705,8 +4705,8 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF TG_Key src_type_key = src_eval.type_key; TG_Kind dst_type_kind = tg_kind_from_key(dst_type_key); TG_Kind src_type_kind = tg_kind_from_key(src_type_key); - U64 dst_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, dst_type_key); - U64 src_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, src_type_key); + U64 dst_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, dst_type_key); + U64 src_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, src_type_key); //- rjf: get commit data based on destination type String8 commit_data = {0}; @@ -4726,7 +4726,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF case TG_Kind_LRef: if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || src_type_kind == TG_Kind_Ptr) { - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); commit_data = push_str8_copy(scratch.arena, commit_data); }break; @@ -4749,7 +4749,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF case TG_Kind_Bool: if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) { - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); commit_data = push_str8_copy(scratch.arena, commit_data); }break; @@ -4761,7 +4761,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF src_type_kind == TG_Kind_F64) { F32 value = 0; - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); switch(src_type_kind) { case TG_Kind_F32:{value = value_eval.imm_f32;}break; @@ -4779,7 +4779,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF src_type_kind == TG_Kind_F64) { F64 value = 0; - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); switch(src_type_kind) { case TG_Kind_F32:{value = (F64)value_eval.imm_f32;}break; @@ -4794,7 +4794,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF case TG_Kind_Enum: if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) { - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); commit_data = push_str8_copy(scratch.arena, commit_data); }break; @@ -4914,7 +4914,7 @@ df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray mem } internal DF_EvalLinkBaseChunkList -df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap) +df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap) { DF_EvalLinkBaseChunkList list = {0}; for(DF_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;) @@ -4948,7 +4948,7 @@ df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed base_eval.mode, base_eval.offset + link_member_off, }; - DF_Eval link_member_value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, link_member_eval); + DF_Eval link_member_value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, link_member_eval); // rjf: advance to next link last_eval = base_eval; @@ -5047,13 +5047,13 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ////////////////////////////// //- rjf: apply view rules & resolve eval // - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, cfg_table); ////////////////////////////// //- rjf: unpack eval // - TG_Key eval_type_key = tg_unwrapped_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval.type_key); + TG_Key eval_type_key = tg_unwrapped_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, eval.type_key); TG_Kind eval_type_kind = tg_kind_from_key(eval_type_key); ////////////////////////////// @@ -5084,9 +5084,9 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie TG_Kind ptr_type_kind = TG_Kind_Null; if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) { - TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval_type_key); + TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, eval_type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); - DF_Eval ptr_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + DF_Eval ptr_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); // rjf: ptrs to udts if(parent_is_expanded && @@ -5199,7 +5199,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("build viz blocks for UDT members") { //- rjf: type -> filtered data members - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); //- rjf: build blocks for all members, split by sub-expansions @@ -5255,7 +5255,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("build viz blocks for UDT type-eval enums") { //- rjf: type -> full type info - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key); //- rjf: build block for all members (cannot be expanded) DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_EnumMembers, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); @@ -5277,7 +5277,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("(structs, unions, classes) descend to members & make block(s), with linked list view") { //- rjf: type -> data members - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key); //- rjf: find link member TG_Member *link_member = 0; @@ -5290,7 +5290,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie { link_member = mem; link_member_type_kind = tg_kind_from_key(link_member->type_key); - link_member_ptee_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, link_member->type_key); + link_member_ptee_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, link_member->type_key); break; } } @@ -5308,7 +5308,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie DF_EvalLinkBaseChunkList link_bases = {0}; if(link_member_is_good) { - link_bases = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, link_member->type_key, link_member->off, ctrl_ctx, udt_eval, 512); + link_bases = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, link_member->type_key, link_member->off, ctrl_ctx, udt_eval, 512); } //- rjf: build blocks for all links, split by sub-expansions @@ -5371,10 +5371,10 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie ProfScope("(arrays) descend to elements & make block(s)") { //- rjf: unpack array type info - TG_Type *array_type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, arr_eval.type_key); + TG_Type *array_type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, arr_eval.type_key); U64 array_count = array_type->count; TG_Key element_type_key = array_type->direct_type_key; - U64 element_type_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, element_type_key); + U64 element_type_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, element_type_key); //- rjf: build blocks for all elements, split by sub-expansions DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Elements, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); @@ -5612,7 +5612,7 @@ df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalViz // rjf: determine exandability, editability if(tg_kind_from_key(eval.type_key) != TG_Kind_Null) { - for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, t)) + for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, t)) { TG_Kind kind = tg_kind_from_key(t); if(kind == TG_Kind_Null) diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index e2d24277..3c39e548 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1579,8 +1579,8 @@ internal B32 df_eval_memory_read(void *u, void *out, U64 addr, U64 size); internal EVAL_ParseCtx df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 vaddr); internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt); internal DF_Eval df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, String8 string); -internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); -internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); +internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); +internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg); //////////////////////////////// @@ -1604,14 +1604,14 @@ internal String8 df_eval_view_rule_from_key(DF_EvalView *eval_view, DF_ExpandKey //- rjf: evaluation value string builder helpers internal String8 df_string_from_ascii_value(Arena *arena, U8 val); -internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); +internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); //- rjf: writing values back to child processes -internal B32 df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); +internal B32 df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); //- rjf: type helpers internal TG_MemberArray df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray members, DF_CfgTable *cfg); -internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); +internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); internal DF_EvalLinkBase df_eval_link_base_from_chunk_list_index(DF_EvalLinkBaseChunkList *list, U64 idx); internal DF_EvalLinkBaseArray df_eval_link_base_array_from_chunk_list(Arena *arena, DF_EvalLinkBaseChunkList *chunks); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 7c3d640d..4123f686 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -5232,7 +5232,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D default:{}break; case EVAL_EvalMode_Addr: { - U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); + U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key); size = Min(size, 64); Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); @@ -5289,7 +5289,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D { String8 commit_string = str8(ws->hover_eval_txt_buffer, ws->hover_eval_txt_size); DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, commit_string); - B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdbg, &ctrl_ctx, row->eval, write_eval); + B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdi, &ctrl_ctx, row->eval, write_eval); if(success == 0) { DF_CmdParams params = df_cmd_params_from_window(ws); @@ -6858,7 +6858,7 @@ df_eval_escaped_from_raw_string(Arena *arena, String8 raw) } internal String8List -df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table) +df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table) { ProfBeginFunction(); String8List list = {0}; @@ -6869,13 +6869,13 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags { if(opt_member != 0) { - U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, opt_member->type_key); + U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, opt_member->type_key); str8_list_pushf(arena, &list, "member (%I64u offset, %I64u byte%s)", opt_member->off, member_byte_size, member_byte_size > 1 ? "s" : ""); } else { String8 basic_type_kind_string = tg_kind_basic_string_table[tg_kind_from_key(eval.type_key)]; - U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, eval.type_key); + U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval.type_key); str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size > 1 ? "s" : ""); } } @@ -6883,7 +6883,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags //- rjf: non-type path: descend recursively & produce single-line value strings else if(max_size > 0) { - TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(graph, rdbg, eval.type_key)); + TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(graph, rdi, eval.type_key)); U32 radix = default_radix; DF_CfgVal *dec_cfg = df_cfg_val_from_string(cfg_table, str8_lit("dec")); DF_CfgVal *hex_cfg = df_cfg_val_from_string(cfg_table, str8_lit("hex")); @@ -6899,8 +6899,8 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags //- rjf: default - leaf cases default: { - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, eval); - String8 string = df_string_from_simple_typed_eval(arena, graph, rdbg, flags, radix, value_eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, eval); + String8 string = df_string_from_simple_typed_eval(arena, graph, rdi, flags, radix, value_eval); space_taken += f_dim_from_tag_size_string(font, font_size, string).x; str8_list_push(arena, &list, string); }break; @@ -6920,11 +6920,11 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags B32 has_array = (array_cfg != &df_g_nil_cfg_val); // rjf: get ptr value - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, eval); // rjf: get pointed-at info TG_Kind type_kind = tg_kind_from_key(eval.type_key); - TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(graph, rdbg, eval.type_key); + TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(graph, rdi, eval.type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); B32 direct_type_has_content = (direct_type_kind != TG_Kind_Null && direct_type_kind != TG_Kind_Void && value_eval.imm_u64 != 0); B32 direct_type_is_string = (direct_type_kind != TG_Kind_Null && value_eval.imm_u64 != 0 && @@ -6940,7 +6940,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(!no_addr || (direct_type_has_content == 0 && direct_type_is_string == 0)) { did_ptr_value = 1; - String8 string = df_string_from_simple_typed_eval(arena, graph, rdbg, flags, radix, value_eval); + String8 string = df_string_from_simple_typed_eval(arena, graph, rdi, flags, radix, value_eval); space_taken += f_dim_from_tag_size_string(font, font_size, string).x; str8_list_push(arena, &list, string); } @@ -6985,7 +6985,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags pted_eval.type_key = direct_type_key; pted_eval.mode = EVAL_EvalMode_Addr; pted_eval.offset = value_eval.imm_u64; - String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdbg, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table); + String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table); if(pted_strs.total_size == 0) { String8 unknown = str8_lit("???"); @@ -7011,7 +7011,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags case TG_Kind_Array: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *eval_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, eval.type_key); + TG_Type *eval_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, eval.type_key); TG_Key direct_type_key = eval_type->direct_type_key; TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); U64 array_count = eval_type->count; @@ -7055,7 +7055,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags { if(depth < 3) { - U64 direct_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct_type_key); + U64 direct_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type_key); for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) { DF_Eval element_eval = zero_struct; @@ -7063,7 +7063,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags element_eval.mode = eval.mode; element_eval.offset = eval.offset + direct_type_byte_size*idx; MemoryCopyArray(element_eval.imm_u128, eval.imm_u128); - String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdbg, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table); + String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table); space_taken += f_dim_from_tag_size_string_list(font, font_size, element_strs).x; str8_list_concat_in_place(&list, &element_strs); if(idx+1 < array_count) @@ -7111,7 +7111,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(depth < 4) { Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdbg, eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdi, eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); for(U64 member_idx = 0; member_idx < filtered_data_members.count && max_size > space_taken; member_idx += 1) { @@ -7121,7 +7121,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags member_eval.mode = eval.mode; member_eval.offset = eval.offset + mem->off; MemoryCopyArray(member_eval.imm_u128, eval.imm_u128); - String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdbg, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table); + String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table); space_taken += f_dim_from_tag_size_string_list(font, font_size, member_strs).x; str8_list_concat_in_place(&list, &member_strs); if(member_idx+1 < filtered_data_members.count) @@ -7286,8 +7286,8 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop case DF_EvalVizBlockKind_Root: if(visible_idx_range.max > visible_idx_range.min) { - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); + String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, block->key, block->eval); row->expr = block->string; row->display_value = str8_list_join(arena, &display_strings, 0); @@ -7312,7 +7312,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop case DF_EvalVizBlockKind_Members: if(block_type_kind != TG_Kind_Null) { - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, &block->cfg_table); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < filtered_data_members.count; idx += 1) { @@ -7337,13 +7337,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop // rjf: apply view rules to eval { - member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, member_eval); + member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, member_eval); member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, member_eval, &view_rule_table); } // rjf: build & push row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); + String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, member_eval); if(member->kind == TG_MemberKind_Padding) { @@ -7370,7 +7370,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop case DF_EvalVizBlockKind_EnumMembers: if(block_type_kind == TG_Kind_Enum) { - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < type->count; idx += 1) { TG_EnumVal *enum_val = &type->enum_vals[idx]; @@ -7391,13 +7391,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop // rjf: apply view rules to eval { - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table); } // rjf: build & push row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); + String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, eval); row->expr = push_str8_copy(arena, enum_val->name); row->display_value = str8_list_join(arena, &display_strings, 0); @@ -7414,9 +7414,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop // case DF_EvalVizBlockKind_Elements: { - TG_Key direct_type_key = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); + TG_Key direct_type_key = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); - U64 direct_type_key_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, direct_type_key); + U64 direct_type_key_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, direct_type_key); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) { // rjf: get keys for this row @@ -7438,13 +7438,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop // rjf: apply view rules to eval { - elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, elem_eval); + elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, elem_eval); elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, elem_eval, &view_rule_table); } // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); + String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, elem_eval); row->expr = push_str8f(arena, "[%I64u]", idx); row->display_value = str8_list_join(arena, &display_strings, 0); @@ -7465,7 +7465,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop // case DF_EvalVizBlockKind_Links: { - DF_EvalLinkBaseChunkList link_base_chunks = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->link_member_type_key, block->link_member_off, ctrl_ctx, block->eval, 512); + DF_EvalLinkBaseChunkList link_base_chunks = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->link_member_type_key, block->link_member_off, ctrl_ctx, block->eval, 512); DF_EvalLinkBaseArray link_bases = df_eval_link_base_array_from_chunk_list(scratch.arena, &link_base_chunks); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) { @@ -7489,13 +7489,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); // rjf: apply view rules to eval - link_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, link_eval); + link_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, link_eval); link_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, link_eval, &view_rule_table); TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key); // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); + String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, link_eval); row->expr = push_str8f(arena, "[%I64u]", idx); row->display_value = str8_list_join(arena, &display_strings, 0); @@ -7534,7 +7534,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) { // rjf: unpack info about this row - String8 name = dbgi_fuzzy_item_string_from_rdbg_target_element_idx(parse_ctx->rdbg, block->dbgi_target, block->backing_search_items.v[idx].idx); + String8 name = dbgi_fuzzy_item_string_from_rdi_target_element_idx(parse_ctx->rdi, block->dbgi_target, block->backing_search_items.v[idx].idx); // rjf: get keys for this row DF_ExpandKey parent_key = block->parent_key; @@ -7551,13 +7551,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop // rjf: apply view rules to eval { - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table); } // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); + String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, eval); row->expr = name; row->display_value = str8_list_join(arena, &display_strings, 0); @@ -9735,7 +9735,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ if(!tg_key_match(tg_key_zero(), eval.type_key)) { DF_CfgTable cfg_table = {0}; - String8List eval_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, 10, params->font, params->font_size, params->font_size*60.f, 0, eval, 0, &cfg_table); + String8List eval_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, 10, params->font, params->font_size, params->font_size*60.f, 0, eval, 0, &cfg_table); eval_string = str8_list_join(scratch.arena, &eval_strings, 0); } ui_spacer(ui_em(1.5f, 1.f)); diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index cb2637d9..c8399b4e 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -961,7 +961,7 @@ internal void df_window_update_and_render(Arena *arena, OS_EventList *events, DF //~ rjf: Eval Viz internal String8 df_eval_escaped_from_raw_string(Arena *arena, String8 raw); -internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table); +internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table); internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); //////////////////////////////// diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index cb43eda3..fd772b5f 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -223,10 +223,10 @@ df_view_rule_hooks__bitmap_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx String8 height_expr = str8_list_join(scratch.arena, &height_expr_strs, 0); String8 fmt_string = fmt_cfg->first->string; DF_Eval width_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, width_expr); - DF_Eval width_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, width_eval); + DF_Eval width_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, width_eval); info.width = width_eval_value.imm_u64; DF_Eval height_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, height_expr); - DF_Eval height_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, height_eval); + DF_Eval height_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, height_eval); info.height = height_eval_value.imm_u64; if(fmt_string.size != 0) { @@ -276,9 +276,9 @@ df_view_rule_hooks__geo_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ct DF_Eval count_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, count_expr); DF_Eval vertices_base_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_base_expr); DF_Eval vertices_size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_size_expr); - DF_Eval count_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, count_eval); - DF_Eval vertices_base_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, vertices_base_eval); - DF_Eval vertices_size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, vertices_size_eval); + DF_Eval count_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, count_eval); + DF_Eval vertices_base_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, vertices_base_eval); + DF_Eval vertices_size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, vertices_size_eval); U64 vertices_base_vaddr = vertices_base_val_eval.imm_u64 ? vertices_base_val_eval.imm_u64 : vertices_base_val_eval.offset; result.index_count = count_val_eval.imm_u64; result.vertices_vaddr_range = r1u64(vertices_base_vaddr, vertices_base_vaddr+vertices_size_val_eval.imm_u64); @@ -306,7 +306,7 @@ df_view_rule_hooks__txt_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ct lang_string = lang_cfg->first->string; String8 size_expr = str8_list_join(scratch.arena, &size_expr_strs, &join); DF_Eval size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, size_expr); - DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, size_eval); + DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, size_eval); result.lang = txt_lang_kind_from_extension(lang_string); result.size_cap = size_val_eval.imm_u64; } @@ -337,13 +337,13 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) } String8 array_size_expr = str8_list_join(scratch.arena, &array_size_expr_strs, 0); DF_Eval array_size_eval = df_eval_from_string(arena, dbgi_scope, ctrl_ctx, parse_ctx, macro_map, array_size_expr); - DF_Eval array_size_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, array_size_eval); + DF_Eval array_size_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, array_size_eval); eval_error_list_concat_in_place(&eval.errors, &array_size_eval.errors); array_size = array_size_eval_value.imm_u64; } // rjf: apply array size to type - TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); + TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, type_key); TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, array_size); eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); } @@ -373,13 +373,13 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap) Temp scratch = scratch_begin(&arena, 1); TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_size_bytes = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); + U64 type_size_bytes = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, type_key); if(TG_Kind_Char8 <= type_kind && type_kind <= TG_Kind_S256 && (type_size_bytes == 2 || type_size_bytes == 4 || type_size_bytes == 8)) { - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); if(value_eval.mode == EVAL_EvalMode_Value) { switch(type_size_bytes) @@ -498,8 +498,8 @@ DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba) DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); //- rjf: grab hsva - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); - Vec4F32 rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdbg, process); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); + Vec4F32 rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process); Vec4F32 hsva = hsva_from_rgba(rgba); //- rjf: build text box @@ -572,8 +572,8 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) } else { - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); - rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdbg, process); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); + rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process); state->hsva = hsva = hsva_from_rgba(rgba); state->memgen_idx = ctrl_memgen_idx(); } @@ -623,7 +623,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) if(commit) { Vec4F32 rgba = rgba_from_hsva(hsva); - df_view_rule_hooks__eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, rgba); + df_view_rule_hooks__eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, rgba); state->memgen_idx = ctrl_memgen_idx(); } @@ -678,7 +678,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) DF_TxtTopologyInfo top = df_view_rule_hooks__txt_topology_info_from_cfg(dbgi_scope, ctrl_ctx, parse_ctx, macro_map, cfg); //- rjf: resolve to address value & range - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); @@ -844,7 +844,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(bitmap) { - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; DF_BitmapTopologyInfo topology = df_view_rule_hooks__bitmap_topology_info_from_cfg(scope, ctrl_ctx, parse_ctx, macro_map, cfg); U64 expected_size = topology.width*topology.height*r_tex2d_format_bytes_per_pixel_table[topology.fmt]; @@ -865,7 +865,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) state->last_open_frame_idx = df_frame_index(); //- rjf: resolve to address value - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; //- rjf: unpack thread/process of eval @@ -1087,7 +1087,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(geo) { - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_labelf("0x%I64x -> Geometry", base_vaddr); @@ -1112,7 +1112,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo) state->last_open_frame_idx = df_frame_index(); //- rjf: resolve to address value - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; //- rjf: extract extra geo topology info from view rule diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index c6424a10..a93de0d0 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -751,7 +751,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF DF_Entity *binary = df_binary_file_from_module(module); String8 exe_path = df_full_path_from_entity(scratch.arena, binary); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; //- rjf: calculate top-level keys, expand root-level, grab root expansion node DF_ExpandKey parent_key = df_expand_key_make(5381, 0); @@ -842,7 +842,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF last_vb = df_eval_viz_block_split_and_continue(arena, &blocks, last_vb, sub_expand_item_idxs[sub_expand_idx]); // rjf: grab name for the expanded row - String8 name = dbgi_fuzzy_item_string_from_rdbg_target_element_idx(&dbgi->rdbg, dbgi_target, sub_expand_keys[sub_expand_idx].child_num); + String8 name = dbgi_fuzzy_item_string_from_rdi_target_element_idx(&dbgi->rdi, dbgi_target, sub_expand_keys[sub_expand_idx].child_num); // rjf: recurse for sub-expansion { @@ -1180,7 +1180,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW default:{}break; case EVAL_EvalMode_Addr: { - U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); + U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key); size = Min(size, 64); Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); @@ -1270,7 +1270,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW row->depth > 0 && !row_expanded) { - U64 next_off = (row->eval.offset + tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key)); + U64 next_off = (row->eval.offset + tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key)); if(next_off%64 != 0 && row->eval.offset/64 < next_off/64) { ui_set_next_fixed_x(0); @@ -1346,7 +1346,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW String8List inheritance_chain_type_names = {0}; for(TG_KeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next) { - String8 inherited_type_name = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, n->v); + String8 inherited_type_name = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, n->v); inherited_type_name = str8_skip_chop_whitespace(inherited_type_name); str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name); } @@ -1399,9 +1399,9 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW if(parse.expr != &eval_expr_nil && errors.count == 0) { ui_labelf("Type:"); - ir_tree_and_type = eval_irtree_and_type_from_expr(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, &eval_string2expr_map_nil, parse.expr, &errors); + ir_tree_and_type = eval_irtree_and_type_from_expr(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, &eval_string2expr_map_nil, parse.expr, &errors); TG_Key type_key = ir_tree_and_type.type_key; - String8 type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, type_key); + String8 type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, type_key); UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_label(type_string); } @@ -1554,7 +1554,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW UI_FocusActive((cell_selected && ewv->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) { TG_Key key = row->eval.type_key; - String8 string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, key); + String8 string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, key); string = str8_skip_chop_whitespace(string); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###type_%I64x", row_hash); if(!tg_key_match(key, tg_key_zero())) UI_Parent(box) @@ -1691,7 +1691,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW { Temp scratch = scratch_begin(0, 0); DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, ¯o_map, commit_string); - B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdbg, &ctrl_ctx, commit_row->eval, write_eval); + B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdi, &ctrl_ctx, commit_row->eval, write_eval); if(success == 0) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); @@ -2918,7 +2918,7 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) //- rjf: query -> raddbg, filtered items U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100); - RDI_Parsed *rdbg = &dbgi->rdbg; + RDI_Parsed *rdi = &dbgi->rdi; B32 items_stale = 0; DBGI_FuzzySearchItemArray items = dbgi_fuzzy_search_items_from_key_exe_query(scope, fuzzy_search_key, exe_path, query, DBGI_FuzzySearchTarget_Procedures, os_now_microseconds()+100, &items_stale); if(items_stale) @@ -2929,9 +2929,9 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) //- rjf: submit best match when hitting enter w/ no selection if(slv->cursor.y == 0 && items.count != 0 && os_key_press(ui_events(), ui_window(), 0, OS_Key_Return)) { - RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, items.v[0].idx); + RDI_Procedure *procedure = rdi_element_from_idx(rdi, procedures, items.v[0].idx); U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); String8 name = str8(name_base, name_size); if(name.size != 0) { @@ -2967,11 +2967,11 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) UI_Focus((slv->cursor.y == idx+1) ? UI_FocusKind_On : UI_FocusKind_Off) { DBGI_FuzzySearchItem *item = &items.v[idx]; - RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, item->idx); + RDI_Procedure *procedure = rdi_element_from_idx(rdi, procedures, item->idx); U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); + U8 *name_base = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); String8 name = str8(name_base, name_size); - RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, procedure->type_idx); + RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, procedure->type_idx); TG_Key type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), procedure->type_idx); ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| @@ -2987,7 +2987,7 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) ui_box_equip_fuzzy_match_ranges(box, &item->match_ranges); if(!tg_key_match(tg_key_zero(), type_key)) { - String8 type_string = tg_string_from_key(scratch.arena, graph, rdbg, type_key); + String8 type_string = tg_string_from_key(scratch.arena, graph, rdi, type_key); df_code_label(0.5f, 0, df_rgba_from_theme_color(DF_ThemeColor_WeakText), type_string); } } @@ -7902,7 +7902,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) DBGI_Scope *scope = dbgi_scope_open(); U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, thread_rip_vaddr); - RDI_Parsed *rdbg = parse_ctx.rdbg; + RDI_Parsed *rdi = parse_ctx.rdi; for(EVAL_String2NumMapNode *n = parse_ctx.locals_map->first; n != 0; n = n->order_next) { String8 local_name = n->string; @@ -7910,7 +7910,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) if(local_eval.mode == EVAL_EvalMode_Addr) { TG_Kind local_eval_type_kind = tg_kind_from_key(local_eval.type_key); - U64 local_eval_type_size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, rdbg, local_eval.type_key); + U64 local_eval_type_size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, rdi, local_eval.type_key); Rng1U64 vaddr_rng = r1u64(local_eval.offset, local_eval.offset+local_eval_type_size); Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng); if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min) @@ -7919,7 +7919,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) { annotation->name_string = push_str8_copy(scratch.arena, local_name); annotation->kind_string = str8_lit("Local"); - annotation->type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, local_eval.type_key); + annotation->type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, local_eval.type_key); annotation->color = color_gen_table[(vaddr_rng.min/8)%ArrayCount(color_gen_table)]; annotation->vaddr_range = vaddr_rng; } diff --git a/src/eval/eval_compiler.c b/src/eval/eval_compiler.c index afcd9812..792d1cb9 100644 --- a/src/eval/eval_compiler.c +++ b/src/eval/eval_compiler.c @@ -331,7 +331,7 @@ eval_type_group_from_kind(TG_Kind kind){ } internal TG_Key -eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { TG_Key result = key; for(B32 good = 1; good;) @@ -339,7 +339,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) TG_Kind kind = tg_kind_from_key(key); if(kind == TG_Kind_Enum) { - result = tg_direct_from_graph_rdi_key(graph, rdbg, result); + result = tg_direct_from_graph_rdi_key(graph, rdi, result); } else { @@ -350,7 +350,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) } internal TG_Key -eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key){ +eval_type_promote(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key){ TG_Key result = key; TG_Kind kind = tg_kind_from_key(key); if(kind == TG_Kind_Bool || @@ -365,17 +365,17 @@ eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key){ } internal TG_Key -eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ +eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r){ Assert(eval_kind_is_basic_or_enum(tg_kind_from_key(l)) && eval_kind_is_basic_or_enum(tg_kind_from_key(r))); // replace enums with corresponding ints - TG_Key lt = eval_type_unwrap_enum(graph, rdbg, l); - TG_Key rt = eval_type_unwrap_enum(graph, rdbg, r); + TG_Key lt = eval_type_unwrap_enum(graph, rdi, l); + TG_Key rt = eval_type_unwrap_enum(graph, rdi, r); // first promote each - TG_Key lp = eval_type_promote(graph, rdbg, lt); - TG_Key rp = eval_type_promote(graph, rdbg, rt); + TG_Key lp = eval_type_promote(graph, rdi, lt); + TG_Key rp = eval_type_promote(graph, rdi, rt); TG_Kind lk = tg_kind_from_key(lp); TG_Kind rk = tg_kind_from_key(rp); @@ -384,12 +384,12 @@ eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ } internal B32 -eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ +eval_type_match(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r){ B32 result = 0; // unwrap - TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l); - TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r); + TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdi, l); + TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdi, r); if (tg_key_match(lu, ru)){ result = 1; @@ -408,21 +408,21 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_LRef: case TG_Kind_RRef: { - TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu); - TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru); - if (eval_type_match(graph, rdbg, lud, rud)){ + TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu); + TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru); + if (eval_type_match(graph, rdi, lud, rud)){ result = 1; } }break; case TG_Kind_MemberPtr: { - TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu); - TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru); - TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdbg, lu); - TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdbg, ru); - if (eval_type_match(graph, rdbg, lud, rud) && - eval_type_match(graph, rdbg, luo, ruo)){ + TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu); + TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru); + TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdi, lu); + TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdi, ru); + if (eval_type_match(graph, rdi, lud, rud) && + eval_type_match(graph, rdi, luo, ruo)){ result = 1; } }break; @@ -430,9 +430,9 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Array: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); - if(lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key)) + TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l); + TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r); + if(lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key)) { result = 1; } @@ -442,9 +442,9 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Function: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); - if (lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key)) + TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l); + TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r); + if (lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key)) { B32 params_match = 1; TG_Key *lp = lt->param_type_keys; @@ -452,7 +452,7 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ U64 count = lt->count; for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) { - if(!eval_type_match(graph, rdbg, *lp, *rp)) + if(!eval_type_match(graph, rdi, *lp, *rp)) { params_match = 0; break; @@ -466,11 +466,11 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ case TG_Kind_Method: { Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); - TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); + TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l); + TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r); if (lt->count == rt->count && - eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key) && - eval_type_match(graph, rdbg, lt->owner_type_key, rt->owner_type_key)) + eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key) && + eval_type_match(graph, rdi, lt->owner_type_key, rt->owner_type_key)) { B32 params_match = 1; TG_Key *lp = lt->param_type_keys; @@ -478,7 +478,7 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ U64 count = lt->count; for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) { - if(!eval_type_match(graph, rdbg, *lp, *rp)) + if(!eval_type_match(graph, rdi, *lp, *rp)) { params_match = 0; break; @@ -589,8 +589,8 @@ eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode){ //~ allen: EVAL IR-Tree High Level Helpers internal EVAL_IRTree* -eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ - U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); +eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key){ + U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); EVAL_IRTree *result = &eval_irtree_nil; if (0 < byte_size && byte_size <= 8){ // build the read node @@ -629,9 +629,9 @@ eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_ } internal EVAL_IRTree* -eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ +eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key){ EVAL_IRTree *result = c; - U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); + U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); if (byte_size < 64){ RDI_EvalOp op = RDI_EvalOp_Trunc; TG_Kind kind = tg_kind_from_key(type_key); @@ -648,7 +648,7 @@ eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree * } internal EVAL_IRTree* -eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in){ +eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key out, TG_Key in){ EVAL_IRTree *result = c; TG_Kind in_kind = tg_kind_from_key(in); TG_Kind out_kind = tg_kind_from_key(out); @@ -659,24 +659,24 @@ eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRT { result = eval_irtree_convert_lo(arena, result, out_group, in_group); } - U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, in); - U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, out); + U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, in); + U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, out); if(out_byte_size < in_byte_size && eval_kind_is_integer(out_kind)) { - result = eval_irtree_trunc(arena, graph, rdbg, result, out); + result = eval_irtree_trunc(arena, graph, rdi, result, out); } return(result); } internal EVAL_IRTree* -eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_EvalMode from_mode, +eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key){ EVAL_IRTree *result = tree; switch (from_mode){ default:{}break; case EVAL_EvalMode_Addr: { - result = eval_irtree_mem_read_type(arena, graph, rdbg, tree, type_key); + result = eval_irtree_mem_read_type(arena, graph, rdi, tree, type_key); }break; case EVAL_EvalMode_Reg: { @@ -715,7 +715,7 @@ eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap } internal TG_Key -eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout){ +eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_Expr *expr, EVAL_ErrorList *eout){ TG_Key result = zero_struct; EVAL_ExprKind kind = expr->kind; @@ -732,14 +732,14 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_E case EVAL_ExprKind_Ptr: { - TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdbg, expr->children[0], eout); + TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdi, expr->children[0], eout); result = tg_cons_type_make(graph, TG_Kind_Ptr, direct_type_key, 0); }break; case EVAL_ExprKind_Array: { EVAL_Expr *child_expr = expr->child_and_constant.child; - TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdbg, child_expr, eout); + TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdi, child_expr, eout); result = tg_cons_type_make(graph, TG_Kind_Array, direct_type_key, expr->child_and_constant.u64); }break; @@ -758,7 +758,7 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_E } internal EVAL_IRTreeAndType -eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout) +eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout) { ProfBeginFunction(); EVAL_IRTreeAndType result = {0}; @@ -777,12 +777,12 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprr = expr->children[1]; - EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); - EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); + EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout); + EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout); if (l.tree->op != 0 && r.tree->op != 0){ - TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -795,8 +795,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index with this type."); } else{ - direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); - direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct_type); + direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype); + direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type); if (l_restype_kind == TG_Kind_Ptr){ if (direct_type_size == 0){ eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); @@ -829,7 +829,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, // generate ir tree if (can_generate){ // how to compute the index - EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); + EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype); if (direct_type_size > 1){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); index_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, index_tree, const_tree); @@ -838,7 +838,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, // how to compute the base address EVAL_IRTree *base_tree = l.tree; if (l_resolve){ - base_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, base_tree, l_restype); + base_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, base_tree, l_restype); } // how to compute the final address @@ -857,17 +857,17 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprr = expr->children[1]; - EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); + EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout); if (l.tree->op != 0 && !tg_key_match(tg_key_zero(), l.type_key)){ - TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); // determine which type to use TG_Key check_type_key = l_restype; TG_Kind check_type_kind = l_restype_kind; if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){ - check_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); + check_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype); check_type_kind = tg_kind_from_key(check_type_key); } @@ -921,7 +921,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, if (l_good && r_good){ Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray check_type_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdbg, check_type_key); + TG_MemberArray check_type_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdi, check_type_key); // lookup member String8 member_name = exprr->name; @@ -953,7 +953,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, if (can_generate){ EVAL_IRTree *new_tree = l.tree; if (l_resolve){ - new_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, new_tree, l_restype); + new_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, new_tree, l_restype); } if (r_off != 0){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, r_off); @@ -975,13 +975,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, { EVAL_Expr *exprc = expr->children[0]; - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); + EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); if (c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, c_restype); - U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype_direct); + TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, c_restype); + U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdi, c_restype_direct); // analyze situation B32 can_generate = 0; @@ -1018,7 +1018,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, if (can_generate){ EVAL_IRTree *new_tree = c.tree; if (c_resolve){ - new_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); + new_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype); } // fill result @@ -1032,10 +1032,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, case EVAL_ExprKind_Address: { EVAL_Expr *exprc = expr->children[0]; - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); + EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); if(c.tree->op != 0 && !tg_key_match(c.type_key, tg_key_zero())) { - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); // analyze situation @@ -1064,16 +1064,16 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprr = expr->children[1]; - TG_Key cast_type_key = eval_type_from_type_expr(arena, graph, rdbg, exprl, eout); + TG_Key cast_type_key = eval_type_from_type_expr(arena, graph, rdi, exprl, eout); TG_Kind cast_type_kind = tg_kind_from_key(cast_type_key); - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); + EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout); if(cast_type_kind != TG_Kind_Null && c.tree->op != 0) { - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype); - U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, cast_type_key); + U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, c_restype); + U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, cast_type_key); // analyze situation U8 in_group = eval_type_group_from_kind(c_restype_kind); @@ -1086,14 +1086,14 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, case RDI_EvalConversionKind_Noop: case RDI_EvalConversionKind_Legal: { - EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); + EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype); EVAL_IRTree *new_tree = in_tree; if (conversion_rule == RDI_EvalConversionKind_Legal){ new_tree = eval_irtree_convert_lo(arena, in_tree, out_group, in_group); } if (cast_type_byte_size < c_restype_byte_size && eval_kind_is_integer(cast_type_kind)){ - new_tree = eval_irtree_trunc(arena, graph, rdbg, in_tree, cast_type_key); + new_tree = eval_irtree_trunc(arena, graph, rdi, in_tree, cast_type_key); } result.tree = new_tree; @@ -1126,13 +1126,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, case EVAL_ExprKind_Array: case EVAL_ExprKind_Func: { - type_key = eval_type_from_type_expr(arena, graph, rdbg, exprc, eout); + type_key = eval_type_from_type_expr(arena, graph, rdi, exprc, eout); }break; // size of value expression default: { - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); + EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); type_key = c.type_key; }break; } @@ -1141,7 +1141,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Kind type_kind = tg_kind_from_key(type_key); if (type_kind != TG_Kind_Null){ can_generate = 1; - size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); + size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); } // generate ir tree @@ -1160,10 +1160,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, { EVAL_Expr *exprc = expr->children[0]; - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); + EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); if (c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); - TG_Key p_type = eval_type_promote(graph, rdbg, c_restype); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); + TG_Key p_type = eval_type_promote(graph, rdi, c_restype); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); // analyze situation @@ -1179,8 +1179,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, // generate ir tree if (can_generate){ - EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); - in_tree = eval_irtree_convert_hi(arena, graph, rdbg, in_tree, p_type, c_restype); + EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype); + in_tree = eval_irtree_convert_hi(arena, graph, rdi, in_tree, p_type, c_restype); EVAL_IRTree *new_tree = eval_irtree_unary_op(arena, op, c_group, in_tree); @@ -1214,12 +1214,12 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprr = expr->children[1]; - EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); - EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); + EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout); + EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout); if (l.tree->op != 0 && r.tree->op != 0){ - TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -1267,10 +1267,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, arith_path = EVAL_ArithPath_PtrAdd; } if (l_is_pointer_like && r_is_pointer_like){ - TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); - TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, r_restype); - U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, l_restype_direct); - U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, r_restype_direct); + TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype); + TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, r_restype); + U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, l_restype_direct); + U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, r_restype_direct); if (l_restype_direct_byte_size == r_restype_direct_byte_size){ arith_path = EVAL_ArithPath_PtrSub; } @@ -1289,9 +1289,9 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key cv_type_key = zero_struct; if (both_basic){ - cv_type_key = eval_type_coerce(graph, rdbg, l_restype, r_restype); + cv_type_key = eval_type_coerce(graph, rdi, l_restype, r_restype); } - else if (is_comparison && eval_type_match(graph, rdbg, l_restype, r_restype)){ + else if (is_comparison && eval_type_match(graph, rdi, l_restype, r_restype)){ cv_type_key = l_restype; } @@ -1313,11 +1313,11 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, final_type_key = tg_key_basic(TG_Kind_Bool); } - EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype); - l_tree = eval_irtree_convert_hi(arena, graph, rdbg, l_tree, cv_type_key, l_restype); + EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype); + l_tree = eval_irtree_convert_hi(arena, graph, rdi, l_tree, cv_type_key, l_restype); - EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); - r_tree = eval_irtree_convert_hi(arena, graph, rdbg, r_tree, cv_type_key, r_restype); + EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype); + r_tree = eval_irtree_convert_hi(arena, graph, rdi, r_tree, cv_type_key, r_restype); EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, cv_group, l_tree, r_tree); @@ -1339,16 +1339,16 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, ptr_is_decay = r_is_decay; } - TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, ptr->type_key); - U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct); + TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, ptr->type_key); + U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct); // generate ir tree EVAL_IRTree *ptr_tree = ptr->tree; if (!ptr_is_decay){ - ptr_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, ptr->mode, ptr_tree, ptr->type_key); + ptr_tree = eval_irtree_resolve_to_value(arena, graph, rdi, ptr->mode, ptr_tree, ptr->type_key); } - EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, integer->mode, integer->tree, integer->type_key); + EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdi, integer->mode, integer->tree, integer->type_key); if (direct_type_size > 1){ EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); integer_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, integer_tree, const_tree); @@ -1368,18 +1368,18 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, case EVAL_ArithPath_PtrSub: { - TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); - U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct); + TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype); + U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct); // generate ir tree EVAL_IRTree *l_tree = l.tree; if (!l_is_decay){ - l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype); + l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype); } EVAL_IRTree *r_tree = r.tree; if (!r_is_decay){ - r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); + r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype); } EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l_tree, r_tree); @@ -1404,15 +1404,15 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *exprl = expr->children[1]; EVAL_Expr *exprr = expr->children[2]; - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); - EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); - EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); + EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); + EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout); + EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout); if (l.tree->op != 0 && r.tree->op != 0 && c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); - TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); + TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); + TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key); + TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key); TG_Kind c_restype_kind = tg_kind_from_key(c_restype); TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype); @@ -1427,10 +1427,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, if (eval_kind_is_basic_or_enum(l_restype_kind) && eval_kind_is_basic_or_enum(r_restype_kind)){ can_generate = 1; - final_type = eval_type_coerce(graph, rdbg, l_restype, r_restype); + final_type = eval_type_coerce(graph, rdi, l_restype, r_restype); } else{ - if (eval_type_match(graph, rdbg, l_restype, r_restype)){ + if (eval_type_match(graph, rdi, l_restype, r_restype)){ if (l_restype_kind == TG_Kind_Ptr){ can_generate = 1; final_type = l_restype; @@ -1447,13 +1447,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, // generate ir tree if (can_generate){ - EVAL_IRTree *c_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); + EVAL_IRTree *c_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype); - EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype); - l_tree = eval_irtree_convert_hi(arena, graph, rdbg, l_tree, final_type, l_restype); + EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype); + l_tree = eval_irtree_convert_hi(arena, graph, rdi, l_tree, final_type, l_restype); - EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); - r_tree = eval_irtree_convert_hi(arena, graph, rdbg, r_tree, final_type, r_restype); + EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype); + r_tree = eval_irtree_convert_hi(arena, graph, rdi, r_tree, final_type, r_restype); EVAL_IRTree *new_tree = eval_irtree_conditional(arena, c_tree, l_tree, r_tree); @@ -1540,7 +1540,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, { eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Left side of assignment must be an identifier."); } - result = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, expr->children[1], eout); + result = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, expr->children[1], eout); }break; case EVAL_ExprKind_LeafIdent: { @@ -1553,7 +1553,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, else { eval_string2expr_map_inc_poison(leaf_ident_expr_map, name); - result = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, leaf_ident_expr, eout); + result = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, leaf_ident_expr, eout); eval_string2expr_map_dec_poison(leaf_ident_expr_map, name); } }break; diff --git a/src/eval/eval_compiler.h b/src/eval/eval_compiler.h index 910bbc07..4f44ee55 100644 --- a/src/eval/eval_compiler.h +++ b/src/eval/eval_compiler.h @@ -42,11 +42,11 @@ internal EVAL_Expr* eval_expr_leaf_type(Arena *arena, void *location, TG_Key typ internal RDI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind); -internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal TG_Key eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal TG_Key eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r); +internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal TG_Key eval_type_promote(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal TG_Key eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r); -internal B32 eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r); +internal B32 eval_type_match(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r); internal B32 eval_kind_is_integer(TG_Kind kind); internal B32 eval_kind_is_signed(TG_Kind kind); @@ -65,18 +65,18 @@ internal EVAL_IRTree* eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecod //////////////////////////////// //~ allen: EVAL IR-Tree High Level Helpers -internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key); internal EVAL_IRTree* eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in); -internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); -internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in); -internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key); +internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key out, TG_Key in); +internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key); //////////////////////////////// //~ allen: EVAL Compiler Phases internal void eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap *map, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout); +internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_Expr *expr, EVAL_ErrorList *eout); +internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout); internal void eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out); #endif //EVAL_COMPILER_H diff --git a/src/eval/eval_parser.c b/src/eval/eval_parser.c index a832bca4..8d5ec73e 100644 --- a/src/eval/eval_parser.c +++ b/src/eval/eval_parser.c @@ -57,7 +57,7 @@ global read_only S64 eval_g_max_precedence = 15; //~ rjf: Map Building Fast Paths internal EVAL_String2NumMap * -eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) +eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) { Temp scratch = scratch_begin(&arena, 1); @@ -73,10 +73,10 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) //- rjf: voff -> tightest scope RDI_Scope *tightest_scope = 0; - if(rdbg->scope_vmap != 0 && rdbg->scopes != 0) + if(rdi->scope_vmap != 0 && rdi->scopes != 0) { - U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); - RDI_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff); + RDI_Scope *scope = &rdi->scopes[scope_idx]; Task *task = push_array(scratch.arena, Task, 1); task->scope = scope; SLLQueuePush(first_task, last_task, task); @@ -84,10 +84,10 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) } //- rjf: voff-1 -> scope - if(voff > 0 && rdbg->scope_vmap != 0 && rdbg->scopes != 0) + if(voff > 0 && rdi->scope_vmap != 0 && rdi->scopes != 0) { - U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff-1); - RDI_Scope *scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff-1); + RDI_Scope *scope = &rdi->scopes[scope_idx]; if(scope != tightest_scope) { Task *task = push_array(scratch.arena, Task, 1); @@ -99,9 +99,9 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) //- rjf: tightest scope -> walk up the tree & build tasks for each parent scope if(tightest_scope != 0) { - for(RDI_Scope *scope = &rdbg->scopes[tightest_scope->parent_scope_idx]; - scope != 0 && scope != &rdbg->scopes[0]; - scope = &rdbg->scopes[scope->parent_scope_idx]) + for(RDI_Scope *scope = &rdi->scopes[tightest_scope->parent_scope_idx]; + scope != 0 && scope != &rdi->scopes[0]; + scope = &rdi->scopes[scope->parent_scope_idx]) { Task *task = push_array(scratch.arena, Task, 1); task->scope = scope; @@ -122,9 +122,9 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) U32 local_opl_idx = scope->local_first + scope->local_count; for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1) { - RDI_Local *local_var = &rdbg->locals[local_idx]; + RDI_Local *local_var = &rdi->locals[local_idx]; U64 local_name_size = 0; - U8 *local_name_str = rdi_string_from_idx(rdbg, local_var->name_string_idx, &local_name_size); + U8 *local_name_str = rdi_string_from_idx(rdi, local_var->name_string_idx, &local_name_size); String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size)); eval_string2num_map_insert(arena, map, name, (U64)local_idx+1); } @@ -136,35 +136,35 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) } internal EVAL_String2NumMap * -eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) +eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) { //- rjf: voff -> tightest scope RDI_Scope *tightest_scope = 0; - if(rdbg->scope_vmap != 0 && rdbg->scopes != 0) + if(rdi->scope_vmap != 0 && rdi->scopes != 0) { - U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); - tightest_scope = &rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff); + tightest_scope = &rdi->scopes[scope_idx]; } //- rjf: tightest scope -> procedure RDI_Procedure *procedure = 0; - if(tightest_scope != 0 && rdbg->procedures != 0) + if(tightest_scope != 0 && rdi->procedures != 0) { U32 proc_idx = tightest_scope->proc_idx; - if(0 < proc_idx && proc_idx < rdbg->procedures_count) + if(0 < proc_idx && proc_idx < rdi->procedures_count) { - procedure = &rdbg->procedures[proc_idx]; + procedure = &rdi->procedures[proc_idx]; } } //- rjf: procedure -> udt RDI_UDT *udt = 0; - if(procedure != 0 && rdbg->udts != 0 && procedure->link_flags & RDI_LinkFlag_TypeScoped) + if(procedure != 0 && rdi->udts != 0 && procedure->link_flags & RDI_LinkFlag_TypeScoped) { U32 udt_idx = procedure->container_idx; - if(0 < udt_idx && udt_idx < rdbg->udts_count) + if(0 < udt_idx && udt_idx < rdi->udts_count) { - udt = &rdbg->udts[udt_idx]; + udt = &rdi->udts[udt_idx]; } } @@ -173,22 +173,22 @@ eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) *map = eval_string2num_map_make(arena, 64); //- rjf: udt -> fill member map - if(udt != 0 && !(udt->flags & RDI_UserDefinedTypeFlag_EnumMembers) && rdbg->members != 0) + if(udt != 0 && !(udt->flags & RDI_UserDefinedTypeFlag_EnumMembers) && rdi->members != 0) { U64 data_member_num = 1; for(U32 member_idx = udt->member_first; member_idx < udt->member_first+udt->member_count; member_idx += 1) { - if(member_idx < 1 || rdbg->members_count <= member_idx) + if(member_idx < 1 || rdi->members_count <= member_idx) { break; } - RDI_Member *m = &rdbg->members[member_idx]; + RDI_Member *m = &rdi->members[member_idx]; if(m->kind == RDI_MemberKind_DataField) { String8 name = {0}; - name.str = rdi_string_from_idx(rdbg, m->name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdi, m->name_string_idx, &name.size); eval_string2num_map_insert(arena, map, name, data_member_num); data_member_num += 1; } @@ -464,23 +464,23 @@ eval_token_array_make_first_opl(EVAL_Token *first, EVAL_Token *opl) //~ rjf: Parser Functions internal TG_Key -eval_leaf_type_from_name(RDI_Parsed *rdbg, String8 name) +eval_leaf_type_from_name(RDI_Parsed *rdi, String8 name) { TG_Key key = zero_struct; B32 found = 0; - if(rdbg->type_nodes != 0) + if(rdi->type_nodes != 0) { - RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Types); + RDI_NameMap *name_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Types); RDI_ParsedNameMap parsed_name_map = {0}; - rdi_name_map_parse(rdbg, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); + rdi_name_map_parse(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size); if(node != 0) { U32 match_count = 0; - U32 *matches = rdi_matches_from_map_node(rdbg, node, &match_count); + U32 *matches = rdi_matches_from_map_node(rdi, node, &match_count); if(match_count != 0) { - RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, matches[0]); + RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, matches[0]); found = type_node->kind != RDI_TypeKind_NULL; key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)matches[0]); } @@ -569,7 +569,7 @@ eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, if(token.kind == EVAL_TokenKind_Identifier) { String8 token_string = str8_substr(text, token.range); - TG_Key type_key = eval_leaf_type_from_name(ctx->rdbg, token_string); + TG_Key type_key = eval_leaf_type_from_name(ctx->rdi, token_string); if(!tg_key_match(tg_key_zero(), type_key)) { token_it += 1; @@ -680,7 +680,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 String8 some_type_identifier_maybe_string = str8_substr(text, some_type_identifier_maybe.range); if(some_type_identifier_maybe.kind == EVAL_TokenKind_Identifier) { - TG_Key type_key = eval_leaf_type_from_name(ctx->rdbg, some_type_identifier_maybe_string); + TG_Key type_key = eval_leaf_type_from_name(ctx->rdi, some_type_identifier_maybe_string); if(!tg_key_match(type_key, tg_key_zero()) || str8_match(some_type_identifier_maybe_string, str8_lit("unsigned"), 0)) { // rjf: move past open paren @@ -798,14 +798,14 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: form namespaceified fallback versions of this lookup string String8List namespaceified_token_strings = {0}; - if(ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_vmap != 0) + if(ctx->rdi->procedures != 0 && ctx->rdi->scopes != 0 && ctx->rdi->scope_vmap != 0) { - U64 scope_idx = rdi_vmap_idx_from_voff(ctx->rdbg->scope_vmap, ctx->rdbg->scope_vmap_count, ctx->ip_voff); - RDI_Scope *scope = &ctx->rdbg->scopes[scope_idx]; + U64 scope_idx = rdi_vmap_idx_from_voff(ctx->rdi->scope_vmap, ctx->rdi->scope_vmap_count, ctx->ip_voff); + RDI_Scope *scope = &ctx->rdi->scopes[scope_idx]; U64 proc_idx = scope->proc_idx; - RDI_Procedure *procedure = &ctx->rdbg->procedures[proc_idx]; + RDI_Procedure *procedure = &ctx->rdi->procedures[proc_idx]; U64 name_size = 0; - U8 *name_ptr = rdi_string_from_idx(ctx->rdbg, procedure->name_string_idx, &name_size); + U8 *name_ptr = rdi_string_from_idx(ctx->rdi, procedure->name_string_idx, &name_size); String8 containing_procedure_name = str8(name_ptr, name_size); U64 last_past_scope_resolution_pos = 0; for(;;) @@ -843,8 +843,8 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 { mapped_identifier = 1; identifier_type_is_possibly_dynamically_overridden = 1; - RDI_Local *local_var = rdi_element_from_idx(ctx->rdbg, locals, local_num-1); - RDI_TypeNode *type_node = rdi_element_from_idx(ctx->rdbg, type_nodes, local_var->type_idx); + RDI_Local *local_var = rdi_element_from_idx(ctx->rdi, locals, local_num-1); + RDI_TypeNode *type_node = rdi_element_from_idx(ctx->rdi, type_nodes, local_var->type_idx); type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)local_var->type_idx); // rjf: grab location info @@ -852,19 +852,19 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 loc_block_idx < local_var->location_opl; loc_block_idx += 1) { - RDI_LocationBlock *block = &ctx->rdbg->location_blocks[loc_block_idx]; + RDI_LocationBlock *block = &ctx->rdi->location_blocks[loc_block_idx]; if(block->scope_off_first <= ctx->ip_voff && ctx->ip_voff < block->scope_off_opl) { - loc_kind = *((RDI_LocationKind *)(ctx->rdbg->location_data + block->location_data_off)); + loc_kind = *((RDI_LocationKind *)(ctx->rdi->location_data + block->location_data_off)); switch(loc_kind) { default:{mapped_identifier = 0;}break; case RDI_LocationKind_AddrBytecodeStream: case RDI_LocationKind_ValBytecodeStream: { - U8 *bytecode_base = ctx->rdbg->location_data + block->location_data_off + sizeof(RDI_LocationKind); + U8 *bytecode_base = ctx->rdi->location_data + block->location_data_off + sizeof(RDI_LocationKind); U64 bytecode_size = 0; - for(U64 idx = 0; idx < ctx->rdbg->location_data_size; idx += 1) + for(U64 idx = 0; idx < ctx->rdi->location_data_size; idx += 1) { U8 op = bytecode_base[idx]; if(op == 0) @@ -880,11 +880,11 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 case RDI_LocationKind_AddrRegisterPlusU16: case RDI_LocationKind_AddrAddrRegisterPlusU16: { - MemoryCopy(&loc_reg_u16, (ctx->rdbg->location_data + block->location_data_off), sizeof(loc_reg_u16)); + MemoryCopy(&loc_reg_u16, (ctx->rdi->location_data + block->location_data_off), sizeof(loc_reg_u16)); }break; case RDI_LocationKind_ValRegister: { - MemoryCopy(&loc_reg, (ctx->rdbg->location_data + block->location_data_off), sizeof(loc_reg)); + MemoryCopy(&loc_reg, (ctx->rdi->location_data + block->location_data_off), sizeof(loc_reg)); }break; } } @@ -919,21 +919,21 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try global variables if(mapped_identifier == 0) { - RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_GlobalVariables); - if(name_map != 0 && ctx->rdbg->global_variables != 0) + RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_GlobalVariables); + if(name_map != 0 && ctx->rdi->global_variables != 0) { RDI_ParsedNameMap parsed_name_map = {0}; - rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); } if(matches_count != 0) { @@ -942,15 +942,15 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 // don't know of a magic hash table fixup path in PDBs, so // in this case, I'm going to prefer the latest-added global. U32 match_idx = matches[matches_count-1]; - RDI_GlobalVariable *global_var = &ctx->rdbg->global_variables[match_idx]; + RDI_GlobalVariable *global_var = &ctx->rdi->global_variables[match_idx]; EVAL_OpList oplist = {0}; eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff); loc_kind = RDI_LocationKind_AddrBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = global_var->type_idx; - if(type_idx < ctx->rdbg->type_nodes_count) + if(type_idx < ctx->rdi->type_nodes_count) { - RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + RDI_TypeNode *type_node = &ctx->rdi->type_nodes[type_idx]; type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; @@ -961,34 +961,34 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try thread variables if(mapped_identifier == 0) { - RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_ThreadVariables); - if(name_map != 0 && ctx->rdbg->global_variables != 0) + RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_ThreadVariables); + if(name_map != 0 && ctx->rdi->global_variables != 0) { RDI_ParsedNameMap parsed_name_map = {0}; - rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); } if(matches_count != 0) { U32 match_idx = matches[0]; - RDI_ThreadVariable *thread_var = &ctx->rdbg->thread_variables[match_idx]; + RDI_ThreadVariable *thread_var = &ctx->rdi->thread_variables[match_idx]; EVAL_OpList oplist = {0}; eval_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off); loc_kind = RDI_LocationKind_AddrBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = thread_var->type_idx; - if(type_idx < ctx->rdbg->type_nodes_count) + if(type_idx < ctx->rdi->type_nodes_count) { - RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + RDI_TypeNode *type_node = &ctx->rdi->type_nodes[type_idx]; type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; @@ -999,36 +999,36 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try procedures if(mapped_identifier == 0) { - RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_Procedures); - if(name_map != 0 && ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_voffs) + RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_Procedures); + if(name_map != 0 && ctx->rdi->procedures != 0 && ctx->rdi->scopes != 0 && ctx->rdi->scope_voffs) { RDI_ParsedNameMap parsed_name_map = {0}; - rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); + rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; - U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); + U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); for(String8Node *n = namespaceified_token_strings.first; n != 0 && matches_count == 0; n = n->next) { - node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); + node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; - matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); + matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); } if(matches_count != 0) { U32 match_idx = matches[0]; - RDI_Procedure *procedure = &ctx->rdbg->procedures[match_idx]; - RDI_Scope *scope = &ctx->rdbg->scopes[procedure->root_scope_idx]; - U64 voff = ctx->rdbg->scope_voffs[scope->voff_range_first]; + RDI_Procedure *procedure = &ctx->rdi->procedures[match_idx]; + RDI_Scope *scope = &ctx->rdi->scopes[procedure->root_scope_idx]; + U64 voff = ctx->rdi->scope_voffs[scope->voff_range_first]; EVAL_OpList oplist = {0}; eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, voff); loc_kind = RDI_LocationKind_ValBytecodeStream; loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); U32 type_idx = procedure->type_idx; - if(type_idx < ctx->rdbg->type_nodes_count) + if(type_idx < ctx->rdi->type_nodes_count) { - RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; + RDI_TypeNode *type_node = &ctx->rdi->type_nodes[type_idx]; type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); } mapped_identifier = 1; @@ -1039,7 +1039,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 //- rjf: try types if(mapped_identifier == 0) { - type_key = eval_leaf_type_from_name(ctx->rdbg, token_string); + type_key = eval_leaf_type_from_name(ctx->rdi, token_string); if(!tg_key_match(tg_key_zero(), type_key)) { mapped_identifier = 1; diff --git a/src/eval/eval_parser.h b/src/eval/eval_parser.h index b534800e..d58ab206 100644 --- a/src/eval/eval_parser.h +++ b/src/eval/eval_parser.h @@ -67,7 +67,7 @@ struct EVAL_ParseCtx { Architecture arch; U64 ip_voff; - RDI_Parsed *rdbg; + RDI_Parsed *rdi; TG_Graph *type_graph; EVAL_String2NumMap *regs_map; EVAL_String2NumMap *reg_alias_map; @@ -85,8 +85,8 @@ global read_only EVAL_ParseResult eval_parse_result_nil = {0, &eval_expr_nil}; //////////////////////////////// //~ rjf: Debug-Info-Driven Map Building Fast Paths -internal EVAL_String2NumMap *eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff); -internal EVAL_String2NumMap *eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff); +internal EVAL_String2NumMap *eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); +internal EVAL_String2NumMap *eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); //////////////////////////////// //~ rjf: Tokenization Functions @@ -101,7 +101,7 @@ internal EVAL_TokenArray eval_token_array_make_first_opl(EVAL_Token *first, EVAL //////////////////////////////// //~ rjf: Parser Functions -internal TG_Key eval_leaf_type_from_name(RDI_Parsed *rdbg, String8 name); +internal TG_Key eval_leaf_type_from_name(RDI_Parsed *rdi, String8 name); internal EVAL_ParseResult eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); internal EVAL_ParseResult eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens, S64 max_precedence); internal EVAL_ParseResult eval_parse_expr_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); diff --git a/src/scratch/look_at_raddbg.c b/src/scratch/look_at_raddbg.c index ba16ce58..d141a7dd 100644 --- a/src/scratch/look_at_raddbg.c +++ b/src/scratch/look_at_raddbg.c @@ -22,28 +22,28 @@ int main(int argument_count, char **arguments) uint8_t *data = (uint8_t *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, data_size); // parse raw data as raddbg - RDI_Parsed rdbg = {0}; - RDI_ParseStatus parse_status = rdi_parse(data, data_size, &rdbg); + RDI_Parsed rdi = {0}; + RDI_ParseStatus parse_status = rdi_parse(data, data_size, &rdi); // usage example: print out all procedure symbol names #if 1 - for(uint64_t procedure_idx = 0; procedure_idx < rdbg.procedure_count; procedure_idx += 1) + for(uint64_t procedure_idx = 0; procedure_idx < rdi.procedure_count; procedure_idx += 1) { - RDI_Procedure *procedure = &rdbg.procedures[procedure_idx]; + RDI_Procedure *procedure = &rdi.procedures[procedure_idx]; uint64_t name_size = 0; - uint8_t *name = rdi_string_from_idx(&rdbg, procedure->name_string_idx, &name_size); + uint8_t *name = rdi_string_from_idx(&rdi, procedure->name_string_idx, &name_size); printf("[%I64u] %.*s\n", procedure_idx, (int)name_size, name); } #endif // usage example: print out all user-defined-type names #if 0 - for(uint64_t udt_idx = 0; udt_idx < rdbg.udt_count; udt_idx += 1) + for(uint64_t udt_idx = 0; udt_idx < rdi.udt_count; udt_idx += 1) { - RDI_UDT *udt = &rdbg.udts[udt_idx]; - RDI_TypeNode *type = &rdbg.type_nodes[udt->self_type_idx]; + RDI_UDT *udt = &rdi.udts[udt_idx]; + RDI_TypeNode *type = &rdi.type_nodes[udt->self_type_idx]; uint64_t name_size = 0; - uint8_t *name = rdi_string_from_idx(&rdbg, type->user_defined.name_string_idx, &name_size); + uint8_t *name = rdi_string_from_idx(&rdi, type->user_defined.name_string_idx, &name_size); printf("[%I64u] %.*s\n", udt_idx, (int)name_size, name); } #endif @@ -51,9 +51,9 @@ int main(int argument_count, char **arguments) // for getting more info, look at the `RDI_Parsed` structure. all data is // represented as a bunch of flat plain-old-data tables. data which must // reference other data uses indices into that other data's table. for - // example, given a `type_idx`, I will index into `rdbg.type_nodes`. given a - // `udt_idx`, I will index into `rdbg.udts`. given a `scope_idx`, I will - // index into `rdbg.scopes`. and so on. + // example, given a `type_idx`, I will index into `rdi.type_nodes`. given a + // `udt_idx`, I will index into `rdi.udts`. given a `scope_idx`, I will + // index into `rdi.scopes`. and so on. return 0; } diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c index f03b39b6..da172b03 100644 --- a/src/type_graph/type_graph.c +++ b/src/type_graph/type_graph.c @@ -279,7 +279,7 @@ tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_type_key, U64 u64 //~ rjf: Graph Introspection API internal TG_Type * -tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { TG_Type *type = &tg_type_nil; U64 reg_byte_count = 0; @@ -324,7 +324,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K }break; case TG_Kind_Array: { - U64 ptee_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, cons_type->direct_type_key); + U64 ptee_size = tg_byte_size_from_graph_rdi_key(graph, rdi, cons_type->direct_type_key); type->byte_size = ptee_size * type->count; }break; } @@ -336,20 +336,20 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K case TG_KeyKind_Ext: { U64 type_node_idx = key.u64[0]; - if(0 <= type_node_idx && type_node_idx < rdbg->type_nodes_count) + if(0 <= type_node_idx && type_node_idx < rdi->type_nodes_count) { - RDI_TypeNode *rdbg_type = &rdbg->type_nodes[type_node_idx]; - TG_Kind kind = tg_kind_from_rdi_type_kind(rdbg_type->kind); + RDI_TypeNode *rdi_type = &rdi->type_nodes[type_node_idx]; + TG_Kind kind = tg_kind_from_rdi_type_kind(rdi_type->kind); //- rjf: record types => unpack name * members & produce - if(RDI_TypeKind_FirstRecord <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastRecord) + if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord) { // rjf: unpack name String8 name = {0}; - name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); // rjf: unpack UDT info - RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, rdbg_type->user_defined.udt_idx); + RDI_UDT *udt = rdi_element_from_idx(rdi, udts, rdi_type->user_defined.udt_idx); // rjf: unpack members TG_Member *members = 0; @@ -357,23 +357,23 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K { members_count = udt->member_count; members = push_array(arena, TG_Member, members_count); - if(members_count != 0 && 0 <= udt->member_first && udt->member_first+udt->member_count <= rdbg->members_count) + if(members_count != 0 && 0 <= udt->member_first && udt->member_first+udt->member_count <= rdi->members_count) { for(U32 member_idx = udt->member_first; member_idx < udt->member_first+udt->member_count; member_idx += 1) { - RDI_Member *src = &rdbg->members[member_idx]; + RDI_Member *src = &rdi->members[member_idx]; TG_Kind member_type_kind = TG_Kind_Null; - if(src->type_idx < rdbg->type_nodes_count) + if(src->type_idx < rdi->type_nodes_count) { - RDI_TypeNode *member_type = &rdbg->type_nodes[src->type_idx]; + RDI_TypeNode *member_type = &rdi->type_nodes[src->type_idx]; member_type_kind = tg_kind_from_rdi_type_kind(member_type->kind); } TG_Member *dst = &members[member_idx-udt->member_first]; dst->kind = tg_member_kind_from_rdi_member_kind(src->kind); dst->type_key = tg_key_ext(member_type_kind, (U64)src->type_idx); - dst->name.str = rdi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); + dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size); dst->off = (U64)src->off; } } @@ -383,46 +383,46 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K type = push_array(arena, TG_Type, 1); type->kind = kind; type->name = push_str8_copy(arena, name); - type->byte_size = (U64)rdbg_type->byte_size; + type->byte_size = (U64)rdi_type->byte_size; type->count = members_count; type->members = members; } //- rjf: enum types => unpack name * values & produce - else if(rdbg_type->kind == RDI_TypeKind_Enum) + else if(rdi_type->kind == RDI_TypeKind_Enum) { // rjf: unpack name String8 name = {0}; - name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); // rjf: unpack direct type TG_Key direct_type_key = zero_struct; - if(rdbg_type->user_defined.direct_type_idx < type_node_idx) + if(rdi_type->user_defined.direct_type_idx < type_node_idx) { - RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; + RDI_TypeNode *direct_type_node = &rdi->type_nodes[rdi_type->user_defined.direct_type_idx]; TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); - direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->user_defined.direct_type_idx); + direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->user_defined.direct_type_idx); } // rjf: unpack members TG_EnumVal *enum_vals = 0; U32 enum_vals_count = 0; { - U32 udt_idx = rdbg_type->user_defined.udt_idx; - if(0 <= udt_idx && udt_idx < rdbg->udts_count) + U32 udt_idx = rdi_type->user_defined.udt_idx; + if(0 <= udt_idx && udt_idx < rdi->udts_count) { - RDI_UDT *udt = &rdbg->udts[udt_idx]; + RDI_UDT *udt = &rdi->udts[udt_idx]; enum_vals_count = udt->member_count; enum_vals = push_array(arena, TG_EnumVal, enum_vals_count); - if(0 <= udt->member_first && udt->member_first+udt->member_count < rdbg->enum_members_count) + if(0 <= udt->member_first && udt->member_first+udt->member_count < rdi->enum_members_count) { for(U32 member_idx = udt->member_first; member_idx < udt->member_first+udt->member_count; member_idx += 1) { - RDI_EnumMember *src = &rdbg->enum_members[member_idx]; + RDI_EnumMember *src = &rdi->enum_members[member_idx]; TG_EnumVal *dst = &enum_vals[member_idx-udt->member_first]; - dst->name.str = rdi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); + dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size); dst->val = src->val; } } @@ -433,39 +433,39 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K type = push_array(arena, TG_Type, 1); type->kind = kind; type->name = push_str8_copy(arena, name); - type->byte_size = (U64)rdbg_type->byte_size; + type->byte_size = (U64)rdi_type->byte_size; type->count = enum_vals_count; type->enum_vals = enum_vals; type->direct_type_key = direct_type_key; } //- rjf: constructed types - if(RDI_TypeKind_FirstConstructed <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastConstructed) + if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed) { // rjf: unpack direct type B32 direct_type_is_good = 0; TG_Key direct_type_key = zero_struct; U64 direct_type_byte_size = 0; - if(rdbg_type->constructed.direct_type_idx < type_node_idx) + if(rdi_type->constructed.direct_type_idx < type_node_idx) { - RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->constructed.direct_type_idx]; + RDI_TypeNode *direct_type_node = &rdi->type_nodes[rdi_type->constructed.direct_type_idx]; TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); - direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->constructed.direct_type_idx); + direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->constructed.direct_type_idx); direct_type_is_good = 1; direct_type_byte_size = (U64)direct_type_node->byte_size; } // rjf: construct based on kind - switch(rdbg_type->kind) + switch(rdi_type->kind) { case RDI_TypeKind_Modifier: { TG_Flags flags = 0; - if(rdbg_type->flags & RDI_TypeModifierFlag_Const) + if(rdi_type->flags & RDI_TypeModifierFlag_Const) { flags |= TG_Flag_Const; } - if(rdbg_type->flags & RDI_TypeModifierFlag_Volatile) + if(rdi_type->flags & RDI_TypeModifierFlag_Volatile) { flags |= TG_Flag_Volatile; } @@ -490,15 +490,15 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K type = push_array(arena, TG_Type, 1); type->kind = kind; type->direct_type_key = direct_type_key; - type->count = rdbg_type->constructed.count; + type->count = rdi_type->constructed.count; type->byte_size = direct_type_byte_size * type->count; }break; case RDI_TypeKind_Function: { - U32 count = rdbg_type->constructed.count; - U32 idx_run_first = rdbg_type->constructed.param_idx_run_first; + U32 count = rdi_type->constructed.count; + U32 idx_run_first = rdi_type->constructed.param_idx_run_first; U32 check_count = 0; - U32 *idx_run = rdi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); + U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count); if(check_count == count) { type = push_array(arena, TG_Type, 1); @@ -512,7 +512,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K U32 param_type_idx = idx_run[idx]; if(param_type_idx < type_node_idx) { - RDI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; + RDI_TypeNode *param_type_node = &rdi->type_nodes[param_type_idx]; TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind); type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); } @@ -528,10 +528,10 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K // NOTE(rjf): for methods, the `direct` type points at the owner type. // the return type, instead of being encoded via the `direct` type, is // encoded via the first parameter. - U32 count = rdbg_type->constructed.count; - U32 idx_run_first = rdbg_type->constructed.param_idx_run_first; + U32 count = rdi_type->constructed.count; + U32 idx_run_first = rdi_type->constructed.param_idx_run_first; U32 check_count = 0; - U32 *idx_run = rdi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); + U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count); if(check_count == count) { type = push_array(arena, TG_Type, 1); @@ -545,7 +545,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K U32 param_type_idx = idx_run[idx]; if(param_type_idx < type_node_idx) { - RDI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; + RDI_TypeNode *param_type_node = &rdi->type_nodes[param_type_idx]; TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind); type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); } @@ -566,11 +566,11 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K { // rjf: unpack owner type TG_Key owner_type_key = zero_struct; - if(rdbg_type->constructed.owner_type_idx < type_node_idx) + if(rdi_type->constructed.owner_type_idx < type_node_idx) { - RDI_TypeNode *owner_type_node = &rdbg->type_nodes[rdbg_type->constructed.owner_type_idx]; + RDI_TypeNode *owner_type_node = &rdi->type_nodes[rdi_type->constructed.owner_type_idx]; TG_Kind owner_type_kind = tg_kind_from_rdi_type_kind(owner_type_node->kind); - owner_type_key = tg_key_ext(owner_type_kind, (U64)rdbg_type->constructed.owner_type_idx); + owner_type_key = tg_key_ext(owner_type_kind, (U64)rdi_type->constructed.owner_type_idx); } type = push_array(arena, TG_Type, 1); type->kind = kind; @@ -582,20 +582,20 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K } //- rjf: alias types - else if(rdbg_type->kind == RDI_TypeKind_Alias) + else if(rdi_type->kind == RDI_TypeKind_Alias) { // rjf: unpack name String8 name = {0}; - name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); // rjf: unpack direct type TG_Key direct_type_key = zero_struct; U64 direct_type_byte_size = 0; - if(rdbg_type->user_defined.direct_type_idx < type_node_idx) + if(rdi_type->user_defined.direct_type_idx < type_node_idx) { - RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; + RDI_TypeNode *direct_type_node = &rdi->type_nodes[rdi_type->user_defined.direct_type_idx]; TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); - direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->user_defined.direct_type_idx); + direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->user_defined.direct_type_idx); direct_type_byte_size = direct_type_node->byte_size; } @@ -608,11 +608,11 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K } //- rjf: incomplete types - else if(RDI_TypeKind_FirstIncomplete <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastIncomplete) + else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete) { // rjf: unpack name String8 name = {0}; - name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); + name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); // rjf: produce type = push_array(arena, TG_Type, 1); @@ -795,7 +795,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K } internal TG_Key -tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { TG_Key result = zero_struct; switch(key.kind) @@ -805,7 +805,7 @@ tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); result = type->direct_type_key; scratch_end(scratch); }break; @@ -814,16 +814,16 @@ tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) } internal TG_Key -tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { - key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, key); - key = tg_direct_from_graph_rdi_key(graph, rdbg, key); - key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, key); + key = tg_unwrapped_from_graph_rdi_key(graph, rdi, key); + key = tg_direct_from_graph_rdi_key(graph, rdi, key); + key = tg_unwrapped_from_graph_rdi_key(graph, rdi, key); return key; } internal TG_Key -tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { TG_Key result = zero_struct; switch(key.kind) @@ -833,7 +833,7 @@ tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); result = type->owner_type_key; scratch_end(scratch); }break; @@ -842,14 +842,14 @@ tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) } internal TG_Key -tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { TG_Key result = key; B32 passed_ptr = 0; for(;;) { TG_Kind kind = tg_kind_from_key(result); - result = tg_direct_from_graph_rdi_key(graph, rdbg, result); + result = tg_direct_from_graph_rdi_key(graph, rdi, result); if(kind == TG_Kind_Ptr || kind == TG_Kind_LRef || kind == TG_Kind_RRef) { passed_ptr = 1; @@ -874,7 +874,7 @@ tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) } internal TG_Key -tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { TG_Key result = key; for(B32 good = 1; good;) @@ -884,7 +884,7 @@ tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) kind == TG_Kind_Modifier || kind == TG_Kind_Alias) { - result = tg_direct_from_graph_rdi_key(graph, rdbg, result); + result = tg_direct_from_graph_rdi_key(graph, rdi, result); } else { @@ -895,7 +895,7 @@ tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) } internal U64 -tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { U64 result = 0; switch(key.kind) @@ -910,7 +910,7 @@ tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) case TG_KeyKind_Cons: { Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); result = type->byte_size; scratch_end(scratch); }break; @@ -945,12 +945,12 @@ tg_member_copy(Arena *arena, TG_Member *src) } internal TG_MemberArray -tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { TG_MemberArray result = {0}; Temp scratch = scratch_begin(&arena, 1); { - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); if(type->members != 0) { result.count = type->count; @@ -967,7 +967,7 @@ tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, T } internal TG_MemberArray -tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { Temp scratch = scratch_begin(&arena, 1); TG_Kind root_type_kind = tg_kind_from_key(key); @@ -976,7 +976,7 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd TG_MemberList members_list = {0}; B32 members_need_offset_sort = 0; { - TG_Type *root_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *root_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); typedef struct Task Task; struct Task { @@ -1015,7 +1015,7 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd t->inheritance_chain = tg_key_list_copy(scratch.arena, &task->inheritance_chain); tg_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key); t->type_key = type->members[member_idx].type_key; - t->type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key); + t->type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type->members[member_idx].type_key); SLLQueuePush(first_task, last_task, t); members_need_offset_sort = 1; } @@ -1064,7 +1064,7 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd TG_Member *member = &members.v[idx]; if(idx+1 < members.count) { - U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, member->type_key); + U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, member->type_key); Rng1U64 member_byte_range = r1u64(member->off, member->off + member_byte_size); if(member[1].off > member_byte_range.max) { @@ -1111,7 +1111,7 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd } internal void -tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return) +tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec, B32 skip_return) { String8 keyword = {0}; TG_Kind kind = tg_kind_from_key(key); @@ -1120,7 +1120,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k default: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, str8_lit(" ")); scratch_end(scratch); @@ -1128,16 +1128,16 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k case TG_Kind_Bitfield: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_lhs_string_from_key(arena, graph, rdbg, direct, out, prec, skip_return); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_lhs_string_from_key(arena, graph, rdi, direct, out, prec, skip_return); }break; case TG_Kind_Modifier: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); TG_Key direct = type->direct_type_key; - tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); + tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); if(type->flags & TG_Flag_Const) { str8_list_push(arena, out, str8_lit("const ")); @@ -1161,7 +1161,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k case TG_Kind_Alias: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, str8_lit(" ")); scratch_end(scratch); @@ -1174,7 +1174,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k fwd_udt:; { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); str8_list_push(arena, out, keyword); str8_list_push(arena, out, str8_lit(" ")); str8_list_push(arena, out, push_str8_copy(arena, type->name)); @@ -1184,8 +1184,8 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k case TG_Kind_Array: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, skip_return); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_lhs_string_from_key(arena, graph, rdi, direct, out, 2, skip_return); if(prec == 1) { str8_list_push(arena, out, str8_lit("(")); @@ -1196,8 +1196,8 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k { if(!skip_return) { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, 0); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_lhs_string_from_key(arena, graph, rdi, direct, out, 2, 0); } if(prec == 1) { @@ -1207,32 +1207,32 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k case TG_Kind_Ptr: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("*")); }break; case TG_Kind_LRef: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("&")); }break; case TG_Kind_RRef: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("&&")); }break; case TG_Kind_MemberPtr: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); TG_Key direct = type->direct_type_key; - tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); - TG_Type *container = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type->owner_type_key); + tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); + TG_Type *container = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type->owner_type_key); if(container->kind != TG_Kind_Null) { str8_list_push(arena, out, push_str8_copy(arena, container->name)); @@ -1248,7 +1248,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k } internal void -tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec) +tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec) { TG_Kind kind = tg_kind_from_key(key); switch(kind) @@ -1257,8 +1257,8 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k case TG_Kind_Bitfield: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_rhs_string_from_key(arena, graph, rdbg, direct, out, prec); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_rhs_string_from_key(arena, graph, rdi, direct, out, prec); }break; case TG_Kind_Modifier: @@ -1267,14 +1267,14 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k case TG_Kind_RRef: case TG_Kind_MemberPtr: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 1); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_rhs_string_from_key(arena, graph, rdi, direct, out, 1); }break; case TG_Kind_Array: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); if(prec == 1) { str8_list_push(arena, out, str8_lit(")")); @@ -1283,15 +1283,15 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k str8_list_push(arena, out, str8_lit("[")); str8_list_push(arena, out, count_str); str8_list_push(arena, out, str8_lit("]")); - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_rhs_string_from_key(arena, graph, rdi, direct, out, 2); scratch_end(scratch); }break; case TG_Kind_Function: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); if(prec == 1) { str8_list_push(arena, out, str8_lit(")")); @@ -1310,7 +1310,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k for(U64 param_idx = 0; param_idx < param_count; param_idx += 1) { TG_Key param_type_key = param_type_keys[param_idx]; - String8 param_str = tg_string_from_key(arena, graph, rdbg, param_type_key); + String8 param_str = tg_string_from_key(arena, graph, rdi, param_type_key); String8 param_str_trimmed = str8_skip_chop_whitespace(param_str); str8_list_push(arena, out, param_str_trimmed); if(param_idx+1 < param_count) @@ -1320,20 +1320,20 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k } str8_list_push(arena, out, str8_lit(")")); } - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); - tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_rhs_string_from_key(arena, graph, rdi, direct, out, 2); scratch_end(scratch); }break; } } internal String8 -tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) +tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; - tg_lhs_string_from_key(scratch.arena, graph, rdbg, key, &list, 0, 0); - tg_rhs_string_from_key(scratch.arena, graph, rdbg, key, &list, 0); + tg_lhs_string_from_key(scratch.arena, graph, rdi, key, &list, 0, 0); + tg_rhs_string_from_key(scratch.arena, graph, rdi, key, &list, 0); String8 result = str8_list_join(arena, &list, 0); scratch_end(scratch); return result; diff --git a/src/type_graph/type_graph.h b/src/type_graph/type_graph.h index 1b20b86d..a413dc24 100644 --- a/src/type_graph/type_graph.h +++ b/src/type_graph/type_graph.h @@ -225,19 +225,19 @@ internal TG_Key tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_t //////////////////////////////// //~ rjf: Graph Introspection API -internal TG_Type *tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal TG_Key tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal U64 tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_Type *tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal TG_Key tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal TG_Key tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal TG_Key tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal TG_Key tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal TG_Key tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal U64 tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); internal TG_Kind tg_kind_from_key(TG_Key key); internal TG_Member *tg_member_copy(Arena *arena, TG_Member *src); -internal TG_MemberArray tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal TG_MemberArray tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); -internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return); -internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec); -internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); +internal TG_MemberArray tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal TG_MemberArray tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); +internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec, B32 skip_return); +internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec); +internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); #endif // TYPE_GRAPH_H From f18e2364316d22f5458293646cd26c5431e61175 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Feb 2024 16:06:56 -0800 Subject: [PATCH 065/275] a few more raddbgi, raddbgic -> rdi, rdim notes --- src/lib_raddbgi_make/raddbgi_make.c | 2 +- src/lib_raddbgi_make/raddbgi_make.h | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 3e5cde69..cab11028 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -595,7 +595,7 @@ rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String //- rjf: root creation -RDI_PROC RDIM_Root* +RDI_PROC RDIM_Root * rdim_root_alloc(RDIM_RootParams *params) { RDIM_Arena *arena = rdim_arena_alloc(); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index d2c2fba9..3e20d559 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -7,6 +7,9 @@ // Library for building loose data structures which contain // RADDBGI debug information, and baking that down into the // proper flattened RADDBGI format. +// +// Requires prior inclusion of the RAD Debug Info, (R)AD(D)BG(I) +// Format Library, in raddbgi_format.h. #ifndef RADDBGI_MAKE_H #define RADDBGI_MAKE_H @@ -159,7 +162,7 @@ struct RDIM_Arena //////////////////////////////// //~ rjf: Overrideable Thread-Local Scratch Arenas -// To override the default thread-local scratch arenas used b yhe library, +// To override the default thread-local scratch arenas used by the library, // do the following: // // #define RDIM_SCRATCH_OVERRIDE @@ -187,7 +190,7 @@ struct RDIM_Temp #endif //////////////////////////////// -//~ rjf: Linked List Helpers +//~ rjf: Linked List Helper Macros #define RDIM_CheckNil(nil,p) ((p) == 0 || (p) == nil) #define RDIM_SetNil(nil,p) ((p) = nil) @@ -1104,7 +1107,7 @@ RDI_PROC void *rdim_memcpy_fallback(void *dst, void *src, RDI_U64 size); #define rdim_memcpy_struct(dst, src) rdim_memcpy((dst), (src), sizeof(*(dst))) //- rjf: arenas -#if !defined (RDIM_ARENA_OVERRIDE) +#if !defined(RDIM_ARENA_OVERRIDE) RDI_PROC RDIM_Arena *rdim_arena_alloc_fallback(void); RDI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena); RDI_PROC RDI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena); @@ -1163,7 +1166,7 @@ RDI_PROC void rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *ma //- rjf: root creation RDI_PROC RDIM_Root* rdim_root_alloc(RDIM_RootParams *params); -RDI_PROC void rdim_root_release(RDIM_Root *root); +RDI_PROC void rdim_root_release(RDIM_Root *root); //- rjf: error accumulation RDI_PROC void rdim_push_error(RDIM_Root *root, RDIM_String8 string); @@ -1188,7 +1191,7 @@ RDI_PROC void rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RDI_U64 //- rjf: type info lookups/reservations RDI_PROC RDIM_Type* rdim_type_from_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash); RDI_PROC RDIM_Reservation* rdim_type_reserve_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash); -RDI_PROC void rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type); +RDI_PROC void rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type); //- rjf: nil/singleton types RDI_PROC RDI_S32 rdim_type_is_unhandled_nil(RDIM_Root *root, RDIM_Type *type); @@ -1276,7 +1279,7 @@ RDI_PROC RDI_U32 rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *dat //- rjf: paths baking RDI_PROC RDIM_String8 rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node); -RDI_PROC void rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out); +RDI_PROC void rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out); RDI_PROC RDIM_PathNode* rdim_paths_new_node(RDIM_BakeCtx *bctx); RDI_PROC RDIM_PathNode* rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir); RDI_PROC RDIM_PathNode* rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); From a118ff79cd4ffffdbe105c18123ab62008218f99 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 14 Feb 2024 13:34:39 -0800 Subject: [PATCH 066/275] partial first pass over converter & raddbgi make layer rewrites/optimizations --- src/codeview/codeview.h | 121 +- src/codeview/codeview.mdesk | 350 +++-- src/codeview/codeview_stringize.c | 11 - src/codeview/generated/codeview.meta.c | 173 +++ src/codeview/generated/codeview.meta.h | 61 + src/lib_raddbgi_make/raddbgi_make.c | 468 ++++--- src/lib_raddbgi_make/raddbgi_make.h | 550 ++++---- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 1710 +++++++++++++++++++++-- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 5 + 9 files changed, 2635 insertions(+), 814 deletions(-) diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index 4075934c..a037bee2 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -969,7 +969,9 @@ struct CV_RecHeader //////////////////////////////// //~ rjf: CodeView Format "Sym" Types +// // (per-compilation-unit info, variables, procedures, etc.) +// typedef U8 CV_ProcFlags; enum @@ -1931,8 +1933,10 @@ struct CV_SymInlinees }; //////////////////////////////// -//~ CodeView Format "Leaf" Types +//~ rjf: CodeView Format "Leaf" Types +// // (type info) +// #define CV_LeafIDKindXList(X) \ X(FUNC_ID, 0x1601)\ @@ -1952,70 +1956,6 @@ typedef enum CV_LeafIDKindEnum } CV_LeafIDKindEnum; -#define CV_BasicTypeXList(X) \ -X(NOTYPE, 0x00)\ -X(ABS, 0x01)\ -X(SEGMENT, 0x02)\ -X(VOID, 0x03)\ -X(CURRENCY, 0x04)\ -X(NBASICSTR, 0x05)\ -X(FBASICSTR, 0x06)\ -X(NOTTRANS, 0x07)\ -X(HRESULT, 0x08)\ -X(CHAR, 0x10)\ -X(SHORT, 0x11)\ -X(LONG, 0x12)\ -X(QUAD, 0x13)\ -X(OCT, 0x14)\ -X(UCHAR, 0x20)\ -X(USHORT, 0x21)\ -X(ULONG, 0x22)\ -X(UQUAD, 0x23)\ -X(UOCT, 0x24)\ -X(BOOL8, 0x30)\ -X(BOOL16, 0x31)\ -X(BOOL32, 0x32)\ -X(BOOL64, 0x33)\ -X(FLOAT32, 0x40)\ -X(FLOAT64, 0x41)\ -X(FLOAT80, 0x42)\ -X(FLOAT128, 0x43)\ -X(FLOAT48, 0x44)\ -X(FLOAT32PP, 0x45)\ -X(FLOAT16, 0x46)\ -X(COMPLEX32, 0x50)\ -X(COMPLEX64, 0x51)\ -X(COMPLEX80, 0x52)\ -X(COMPLEX128, 0x53)\ -X(BIT, 0x60)\ -X(PASCHAR, 0x61)\ -X(BOOL32FF, 0x62)\ -X(INT8, 0x68)\ -X(UINT8, 0x69)\ -X(RCHAR, 0x70)\ -X(WCHAR, 0x71)\ -X(INT16, 0x72)\ -X(UINT16, 0x73)\ -X(INT32, 0x74)\ -X(UINT32, 0x75)\ -X(INT64, 0x76)\ -X(UINT64, 0x77)\ -X(INT128, 0x78)\ -X(UINT128, 0x79)\ -X(CHAR16, 0x7a)\ -X(CHAR32, 0x7b)\ -X(CHAR8, 0x7c)\ -X(PTR, 0xf0) - -typedef U8 CV_BasicType; -typedef enum CV_BasicTypeEnum -{ -#define X(N,c) CV_BasicType_##N = c, - CV_BasicTypeXList(X) -#undef X -} -CV_BasicTypeEnum; - #define CV_TypeId_Variadic 0 #define CV_BasicPointerKindXList(X) \ @@ -2061,22 +2001,21 @@ CV_MoComUDTKindEnum; typedef U16 CV_TypeProps; enum { - CV_TypeProp_Packed = (1 << 0), - CV_TypeProp_HasConstructorsDestructors = (1 << 1), - CV_TypeProp_OverloadedOperators = (1 << 2), - CV_TypeProp_IsNested = (1 << 3), - CV_TypeProp_ContainsNested = (1 << 4), - CV_TypeProp_OverloadedAssignment = (1 << 5), - CV_TypeProp_OverloadedCasting = (1 << 6), - CV_TypeProp_FwdRef = (1 << 7), - CV_TypeProp_Scoped = (1 << 8), - CV_TypeProp_HasUniqueName = (1 << 9), - CV_TypeProp_Sealed = (1 << 10), + CV_TypeProp_Packed = (1<<0), + CV_TypeProp_HasConstructorsDestructors = (1<<1), + CV_TypeProp_OverloadedOperators = (1<<2), + CV_TypeProp_IsNested = (1<<3), + CV_TypeProp_ContainsNested = (1<<4), + CV_TypeProp_OverloadedAssignment = (1<<5), + CV_TypeProp_OverloadedCasting = (1<<6), + CV_TypeProp_FwdRef = (1<<7), + CV_TypeProp_Scoped = (1<<8), + CV_TypeProp_HasUniqueName = (1<<9), + CV_TypeProp_Sealed = (1<<10), // HFA: 11,12 - CV_TypeProp_Intrinsic = (1 << 13), + CV_TypeProp_Intrinsic = (1<<13), // MOCOM: 14,15 }; - #define CV_TypeProps_ExtractHFA(f) (((f)>>11)&0x3) #define CV_TypeProps_ExtractMOCOM(f) (((f)>>14)&0x3) @@ -2128,11 +2067,11 @@ CV_MemberPointerKindEnum; typedef U32 CV_VirtualTableShape; typedef enum CV_VirtualTableShapeEnum { - CV_VirtualTableShape_Near, // 16 bit ptr - CV_VirtualTableShape_Far, // 16:16 bit ptr - CV_VirtualTableShape_Thin, // ??? - CV_VirtualTableShape_Outer, // address point displacment to outermost class entry[-1] - CV_VirtualTableShape_Meta, // far pointer to metaclass descriptor entry[-2] + CV_VirtualTableShape_Near, // 16 bit ptr + CV_VirtualTableShape_Far, // 16:16 bit ptr + CV_VirtualTableShape_Thin, // ??? + CV_VirtualTableShape_Outer, // address point displacment to outermost class entry[-1] + CV_VirtualTableShape_Meta, // far pointer to metaclass descriptor entry[-2] CV_VirtualTableShape_Near32, // 32 bit ptr CV_VirtualTableShape_Far32, // ??? } @@ -2165,11 +2104,11 @@ enum { // Access: 0,1 // MethodProp: [2:4] - CV_FieldAttrib_Pseudo = (1 << 5), - CV_FieldAttrib_NoInherit = (1 << 6), - CV_FieldAttrib_NoConstruct = (1 << 7), - CV_FieldAttrib_CompilerGenated = (1 << 8), - CV_FieldAttrib_Sealed = (1 << 9), + CV_FieldAttrib_Pseudo = (1<<5), + CV_FieldAttrib_NoInherit = (1<<6), + CV_FieldAttrib_NoConstruct = (1<<7), + CV_FieldAttrib_CompilerGenated = (1<<8), + CV_FieldAttrib_Sealed = (1<<9), }; #define CV_FieldAttribs_ExtractAccess(f) ((f)&0x3) #define CV_FieldAttribs_ExtractMethodProp(f) (((f)>>2)&0x7) @@ -2185,9 +2124,9 @@ CV_LabelKindEnum; typedef U8 CV_FunctionAttribs; enum { - CV_FunctionAttrib_CxxReturnUDT = (1 << 0), - CV_FunctionAttrib_Constructor = (1 << 1), - CV_FunctionAttrib_ConstructorVBase = (1 << 2), + CV_FunctionAttrib_CxxReturnUDT = (1<<0), + CV_FunctionAttrib_Constructor = (1<<1), + CV_FunctionAttrib_ConstructorVBase = (1<<2), }; typedef U8 CV_CallKind; diff --git a/src/codeview/codeview.mdesk b/src/codeview/codeview.mdesk index 5b57fd39..1c10ebfe 100644 --- a/src/codeview/codeview.mdesk +++ b/src/codeview/codeview.mdesk @@ -380,138 +380,214 @@ cv_string_from_sym_kind: `}`; } +//////////////////////////////// +//~ rjf: CV Basic Types + +@table(name val type_name) +CV_BasicTypeTable: +{ + {NOTYPE 0x00 "" } + {ABS 0x01 "" } + {SEGMENT 0x02 "" } + {VOID 0x03 "void" } + {CURRENCY 0x04 "" } + {NBASICSTR 0x05 "" } + {FBASICSTR 0x06 "" } + {NOTTRANS 0x07 "" } + {HRESULT 0x08 "HRESULT" } + {CHAR 0x10 "char" } + {SHORT 0x11 "S16" } + {LONG 0x12 "S32" } + {QUAD 0x13 "S64" } + {OCT 0x14 "S128" } + {UCHAR 0x20 "UCHAR" } + {USHORT 0x21 "U16" } + {ULONG 0x22 "U32" } + {UQUAD 0x23 "U64" } + {UOCT 0x24 "U128" } + {BOOL8 0x30 "B8" } + {BOOL16 0x31 "B16" } + {BOOL32 0x32 "B32" } + {BOOL64 0x33 "B64" } + {FLOAT32 0x40 "F32" } + {FLOAT64 0x41 "F64" } + {FLOAT80 0x42 "F80" } + {FLOAT128 0x43 "F128" } + {FLOAT48 0x44 "F48" } + {FLOAT32PP 0x45 "F32PP" } + {FLOAT16 0x46 "F16" } + {COMPLEX32 0x50 "ComplexF32" } + {COMPLEX64 0x51 "ComplexF64" } + {COMPLEX80 0x52 "ComplexF80" } + {COMPLEX128 0x53 "ComplexF128" } + {BIT 0x60 "" } + {PASCHAR 0x61 "" } + {BOOL32FF 0x62 "B32FF" } + {INT8 0x68 "S8" } + {UINT8 0x69 "U8" } + {RCHAR 0x70 "char" } + {WCHAR 0x71 "WCHAR" } + {INT16 0x72 "S16" } + {UINT16 0x73 "U16" } + {INT32 0x74 "S32" } + {UINT32 0x75 "U32" } + {INT64 0x76 "S64" } + {UINT64 0x77 "U64" } + {INT128 0x78 "S128" } + {UINT128 0x79 "U128" } + {CHAR16 0x7a "CHAR16" } + {CHAR32 0x7b "CHAR32" } + {CHAR8 0x7c "char" } + {PTR 0xf0 "PTR" } +} + +@enum(U8) CV_BasicType: +{ + @expand(CV_BasicTypeTable a) `$(a.name) = $(a.val)` +} + +@enum2string_switch(CV_BasicType) cv_string_from_basic_type: +{ + @expand(CV_BasicTypeTable a) `case CV_BasicType_$(a.name):{result = str8_lit("$(a.name)");}break` +} + +@enum2string_switch(CV_BasicType) cv_type_name_from_basic_type: +{ + @expand(CV_BasicTypeTable a) `case CV_BasicType_$(a.name):{result = str8_lit("$(a.type_name)");}break` +} + //////////////////////////////// //~ rjf: CV Leaf -@table(name val) +@table(name header_type_name val) CV_LeafKindTable: { - {MODIFIER_16t 0x0001} - {POINTER_16t 0x0002} - {ARRAY_16t 0x0003} - {CLASS_16t 0x0004} - {STRUCTURE_16t 0x0005} - {UNION_16t 0x0006} - {ENUM_16t 0x0007} - {PROCEDURE_16t 0x0008} - {MFUNCTION_16t 0x0009} - {VTSHAPE 0x000a} - {COBOL0_16t 0x000b} - {COBOL1 0x000c} - {BARRAY_16t 0x000d} - {LABEL 0x000e} - {NULL 0x000f} - {NOTTRAN 0x0010} - {DIMARRAY_16t 0x0011} - {VFTPATH_16t 0x0012} - {PRECOMP_16t 0x0013} - {ENDPRECOMP 0x0014} - {OEM_16t 0x0015} - {TYPESERVER_ST 0x0016} - {SKIP_16t 0x0200} - {ARGLIST_16t 0x0201} - {DEFARG_16t 0x0202} - {LIST 0x0203} - {FIELDLIST_16t 0x0204} - {DERIVED_16t 0x0205} - {BITFIELD_16t 0x0206} - {METHODLIST_16t 0x0207} - {DIMCONU_16t 0x0208} - {DIMCONLU_16t 0x0209} - {DIMVARU_16t 0x020a} - {DIMVARLU_16t 0x020b} - {REFSYM 0x020c} - {BCLASS_16t 0x0400} - {VBCLASS_16t 0x0401} - {IVBCLASS_16t 0x0402} - {ENUMERATE_ST 0x0403} - {FRIENDFCN_16t 0x0404} - {INDEX_16t 0x0405} - {MEMBER_16t 0x0406} - {STMEMBER_16t 0x0407} - {METHOD_16t 0x0408} - {NESTTYPE_16t 0x0409} - {VFUNCTAB_16t 0x040a} - {FRIENDCLS_16t 0x040b} - {ONEMETHOD_16t 0x040c} - {VFUNCOFF_16t 0x040d} - {TI16_MAX 0x1000} - {MODIFIER 0x1001} - {POINTER 0x1002} - {ARRAY_ST 0x1003} - {CLASS_ST 0x1004} - {STRUCTURE_ST 0x1005} - {UNION_ST 0x1006} - {ENUM_ST 0x1007} - {PROCEDURE 0x1008} - {MFUNCTION 0x1009} - {COBOL0 0x100a} - {BARRAY 0x100b} - {DIMARRAY_ST 0x100c} - {VFTPATH 0x100d} - {PRECOMP_ST 0x100e} - {OEM 0x100f} - {ALIAS_ST 0x1010} - {OEM2 0x1011} - {SKIP 0x1200} - {ARGLIST 0x1201} - {DEFARG_ST 0x1202} - {FIELDLIST 0x1203} - {DERIVED 0x1204} - {BITFIELD 0x1205} - {METHODLIST 0x1206} - {DIMCONU 0x1207} - {DIMCONLU 0x1208} - {DIMVARU 0x1209} - {DIMVARLU 0x120a} - {BCLASS 0x1400} - {VBCLASS 0x1401} - {IVBCLASS 0x1402} - {FRIENDFCN_ST 0x1403} - {INDEX 0x1404} - {MEMBER_ST 0x1405} - {STMEMBER_ST 0x1406} - {METHOD_ST 0x1407} - {NESTTYPE_ST 0x1408} - {VFUNCTAB 0x1409} - {FRIENDCLS 0x140a} - {ONEMETHOD_ST 0x140b} - {VFUNCOFF 0x140c} - {NESTTYPEEX_ST 0x140d} - {MEMBERMODIFY_ST 0x140e} - {MANAGED_ST 0x140f} - {ST_MAX 0x1500} - {TYPESERVER 0x1501} - {ENUMERATE 0x1502} - {ARRAY 0x1503} - {CLASS 0x1504} - {STRUCTURE 0x1505} - {UNION 0x1506} - {ENUM 0x1507} - {DIMARRAY 0x1508} - {PRECOMP 0x1509} - {ALIAS 0x150a} - {DEFARG 0x150b} - {FRIENDFCN 0x150c} - {MEMBER 0x150d} - {STMEMBER 0x150e} - {METHOD 0x150f} - {NESTTYPE 0x1510} - {ONEMETHOD 0x1511} - {NESTTYPEEX 0x1512} - {MEMBERMODIFY 0x1513} - {MANAGED 0x1514} - {TYPESERVER2 0x1515} - {STRIDED_ARRAY 0x1516} - {HLSL 0x1517} - {MODIFIER_EX 0x1518} - {INTERFACE 0x1519} - {BINTERFACE 0x151a} - {VECTOR 0x151b} - {MATRIX 0x151c} - {VFTABLE 0x151d} - {CLASS2 0x1608} - {STRUCT2 0x1609} + {MODIFIER_16t - 0x0001} + {POINTER_16t - 0x0002} + {ARRAY_16t - 0x0003} + {CLASS_16t - 0x0004} + {STRUCTURE_16t - 0x0005} + {UNION_16t - 0x0006} + {ENUM_16t - 0x0007} + {PROCEDURE_16t - 0x0008} + {MFUNCTION_16t - 0x0009} + {VTSHAPE VTShape 0x000a} + {COBOL0_16t - 0x000b} + {COBOL1 - 0x000c} + {BARRAY_16t - 0x000d} + {LABEL Label 0x000e} + {NULL - 0x000f} + {NOTTRAN - 0x0010} + {DIMARRAY_16t - 0x0011} + {VFTPATH_16t - 0x0012} + {PRECOMP_16t - 0x0013} + {ENDPRECOMP - 0x0014} + {OEM_16t - 0x0015} + {TYPESERVER_ST - 0x0016} + {SKIP_16t - 0x0200} + {ARGLIST_16t - 0x0201} + {DEFARG_16t - 0x0202} + {LIST - 0x0203} + {FIELDLIST_16t - 0x0204} + {DERIVED_16t - 0x0205} + {BITFIELD_16t - 0x0206} + {METHODLIST_16t - 0x0207} + {DIMCONU_16t - 0x0208} + {DIMCONLU_16t - 0x0209} + {DIMVARU_16t - 0x020a} + {DIMVARLU_16t - 0x020b} + {REFSYM - 0x020c} + {BCLASS_16t - 0x0400} + {VBCLASS_16t - 0x0401} + {IVBCLASS_16t - 0x0402} + {ENUMERATE_ST - 0x0403} + {FRIENDFCN_16t - 0x0404} + {INDEX_16t - 0x0405} + {MEMBER_16t - 0x0406} + {STMEMBER_16t - 0x0407} + {METHOD_16t - 0x0408} + {NESTTYPE_16t - 0x0409} + {VFUNCTAB_16t - 0x040a} + {FRIENDCLS_16t - 0x040b} + {ONEMETHOD_16t - 0x040c} + {VFUNCOFF_16t - 0x040d} + {TI16_MAX - 0x1000} + {MODIFIER Modifier 0x1001} + {POINTER Pointer 0x1002} + {ARRAY_ST - 0x1003} + {CLASS_ST - 0x1004} + {STRUCTURE_ST - 0x1005} + {UNION_ST - 0x1006} + {ENUM_ST - 0x1007} + {PROCEDURE Procedure 0x1008} + {MFUNCTION MFunction 0x1009} + {COBOL0 - 0x100a} + {BARRAY - 0x100b} + {DIMARRAY_ST - 0x100c} + {VFTPATH VFPath 0x100d} + {PRECOMP_ST - 0x100e} + {OEM - 0x100f} + {ALIAS_ST - 0x1010} + {OEM2 - 0x1011} + {SKIP Skip 0x1200} + {ARGLIST ArgList 0x1201} + {DEFARG_ST - 0x1202} + {FIELDLIST - 0x1203} + {DERIVED - 0x1204} + {BITFIELD BitField 0x1205} + {METHODLIST MethodListMember 0x1206} + {DIMCONU - 0x1207} + {DIMCONLU - 0x1208} + {DIMVARU - 0x1209} + {DIMVARLU - 0x120a} + {BCLASS BClass 0x1400} + {VBCLASS VBClass 0x1401} + {IVBCLASS - 0x1402} + {FRIENDFCN_ST - 0x1403} + {INDEX Index 0x1404} + {MEMBER_ST - 0x1405} + {STMEMBER_ST - 0x1406} + {METHOD_ST - 0x1407} + {NESTTYPE_ST - 0x1408} + {VFUNCTAB VFuncTab 0x1409} + {FRIENDCLS - 0x140a} + {ONEMETHOD_ST - 0x140b} + {VFUNCOFF VFuncOff 0x140c} + {NESTTYPEEX_ST - 0x140d} + {MEMBERMODIFY_ST - 0x140e} + {MANAGED_ST - 0x140f} + {ST_MAX - 0x1500} + {TYPESERVER TypeServer 0x1501} + {ENUMERATE Enumerate 0x1502} + {ARRAY Array 0x1503} + {CLASS Struct 0x1504} + {STRUCTURE Struct 0x1505} + {UNION Union 0x1506} + {ENUM Enum 0x1507} + {DIMARRAY - 0x1508} + {PRECOMP PreComp 0x1509} + {ALIAS Alias 0x150a} + {DEFARG - 0x150b} + {FRIENDFCN - 0x150c} + {MEMBER Member 0x150d} + {STMEMBER StMember 0x150e} + {METHOD Method 0x150f} + {NESTTYPE NestType 0x1510} + {ONEMETHOD OneMethod 0x1511} + {NESTTYPEEX NestTypeEx 0x1512} + {MEMBERMODIFY - 0x1513} + {MANAGED - 0x1514} + {TYPESERVER2 TypeServer2 0x1515} + {STRIDED_ARRAY - 0x1516} + {HLSL - 0x1517} + {MODIFIER_EX - 0x1518} + {INTERFACE Struct 0x1519} + {BINTERFACE - 0x151a} + {VECTOR - 0x151b} + {MATRIX - 0x151c} + {VFTABLE - 0x151d} + {CLASS2 Struct2 0x1608} + {STRUCT2 Struct2 0x1609} } @enum(U16) CV_LeafKind: @@ -524,3 +600,23 @@ cv_string_from_leaf_kind: { @expand(CV_LeafKindTable a) `case CV_LeafKind_$(a.name):{result = str8_lit("$(a.name)");}break`; } + +@gen(functions) +{ + `internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v);`; +} + +@gen(functions) @c_file +{ + `internal U64`; + `cv_header_struct_size_from_leaf_kind(CV_LeafKind v)`; + `{`; + `U64 result = 0;`; + `switch(v)`; + `{`; + `default:{}break;`; + @expand(CV_LeafKindTable a) `$(a.header_type_name != "-" -> "case CV_LeafKind_"..a.name..":{result = sizeof(CV_Leaf"..a.header_type_name..");}break;")`; + `}`; + `return result;`; + `}`; +} diff --git a/src/codeview/codeview_stringize.c b/src/codeview/codeview_stringize.c index 983b078e..9c1245ae 100644 --- a/src/codeview/codeview_stringize.c +++ b/src/codeview/codeview_stringize.c @@ -48,17 +48,6 @@ cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, void *first, voi } } -internal String8 -cv_string_from_basic_type(CV_BasicType basic_type){ - String8 result = str8_lit("UNRECOGNIZED_BASIC_TYPE"); - switch (basic_type){ -#define X(N,c) case CV_BasicType_##N: result = str8_lit(#N); break; - CV_BasicTypeXList(X) -#undef X - } - return(result); -} - internal String8 cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind){ String8 result = str8_lit("UNRECOGNIZED_C13_SUB_SECTION_KIND"); diff --git a/src/codeview/generated/codeview.meta.c b/src/codeview/generated/codeview.meta.c index b65dc4fc..2aaef62e 100644 --- a/src/codeview/generated/codeview.meta.c +++ b/src/codeview/generated/codeview.meta.c @@ -312,6 +312,134 @@ case CV_SymKind_INLINEES:{result = str8_lit("INLINEES");}break; return result; } +internal String8 +cv_string_from_basic_type(CV_BasicType v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_BasicType_NOTYPE:{result = str8_lit("NOTYPE");}break; +case CV_BasicType_ABS:{result = str8_lit("ABS");}break; +case CV_BasicType_SEGMENT:{result = str8_lit("SEGMENT");}break; +case CV_BasicType_VOID:{result = str8_lit("VOID");}break; +case CV_BasicType_CURRENCY:{result = str8_lit("CURRENCY");}break; +case CV_BasicType_NBASICSTR:{result = str8_lit("NBASICSTR");}break; +case CV_BasicType_FBASICSTR:{result = str8_lit("FBASICSTR");}break; +case CV_BasicType_NOTTRANS:{result = str8_lit("NOTTRANS");}break; +case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; +case CV_BasicType_CHAR:{result = str8_lit("CHAR");}break; +case CV_BasicType_SHORT:{result = str8_lit("SHORT");}break; +case CV_BasicType_LONG:{result = str8_lit("LONG");}break; +case CV_BasicType_QUAD:{result = str8_lit("QUAD");}break; +case CV_BasicType_OCT:{result = str8_lit("OCT");}break; +case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; +case CV_BasicType_USHORT:{result = str8_lit("USHORT");}break; +case CV_BasicType_ULONG:{result = str8_lit("ULONG");}break; +case CV_BasicType_UQUAD:{result = str8_lit("UQUAD");}break; +case CV_BasicType_UOCT:{result = str8_lit("UOCT");}break; +case CV_BasicType_BOOL8:{result = str8_lit("BOOL8");}break; +case CV_BasicType_BOOL16:{result = str8_lit("BOOL16");}break; +case CV_BasicType_BOOL32:{result = str8_lit("BOOL32");}break; +case CV_BasicType_BOOL64:{result = str8_lit("BOOL64");}break; +case CV_BasicType_FLOAT32:{result = str8_lit("FLOAT32");}break; +case CV_BasicType_FLOAT64:{result = str8_lit("FLOAT64");}break; +case CV_BasicType_FLOAT80:{result = str8_lit("FLOAT80");}break; +case CV_BasicType_FLOAT128:{result = str8_lit("FLOAT128");}break; +case CV_BasicType_FLOAT48:{result = str8_lit("FLOAT48");}break; +case CV_BasicType_FLOAT32PP:{result = str8_lit("FLOAT32PP");}break; +case CV_BasicType_FLOAT16:{result = str8_lit("FLOAT16");}break; +case CV_BasicType_COMPLEX32:{result = str8_lit("COMPLEX32");}break; +case CV_BasicType_COMPLEX64:{result = str8_lit("COMPLEX64");}break; +case CV_BasicType_COMPLEX80:{result = str8_lit("COMPLEX80");}break; +case CV_BasicType_COMPLEX128:{result = str8_lit("COMPLEX128");}break; +case CV_BasicType_BIT:{result = str8_lit("BIT");}break; +case CV_BasicType_PASCHAR:{result = str8_lit("PASCHAR");}break; +case CV_BasicType_BOOL32FF:{result = str8_lit("BOOL32FF");}break; +case CV_BasicType_INT8:{result = str8_lit("INT8");}break; +case CV_BasicType_UINT8:{result = str8_lit("UINT8");}break; +case CV_BasicType_RCHAR:{result = str8_lit("RCHAR");}break; +case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; +case CV_BasicType_INT16:{result = str8_lit("INT16");}break; +case CV_BasicType_UINT16:{result = str8_lit("UINT16");}break; +case CV_BasicType_INT32:{result = str8_lit("INT32");}break; +case CV_BasicType_UINT32:{result = str8_lit("UINT32");}break; +case CV_BasicType_INT64:{result = str8_lit("INT64");}break; +case CV_BasicType_UINT64:{result = str8_lit("UINT64");}break; +case CV_BasicType_INT128:{result = str8_lit("INT128");}break; +case CV_BasicType_UINT128:{result = str8_lit("UINT128");}break; +case CV_BasicType_CHAR16:{result = str8_lit("CHAR16");}break; +case CV_BasicType_CHAR32:{result = str8_lit("CHAR32");}break; +case CV_BasicType_CHAR8:{result = str8_lit("CHAR8");}break; +case CV_BasicType_PTR:{result = str8_lit("PTR");}break; +} +return result; +} + +internal String8 +cv_type_name_from_basic_type(CV_BasicType v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_BasicType_NOTYPE:{result = str8_lit("");}break; +case CV_BasicType_ABS:{result = str8_lit("");}break; +case CV_BasicType_SEGMENT:{result = str8_lit("");}break; +case CV_BasicType_VOID:{result = str8_lit("void");}break; +case CV_BasicType_CURRENCY:{result = str8_lit("");}break; +case CV_BasicType_NBASICSTR:{result = str8_lit("");}break; +case CV_BasicType_FBASICSTR:{result = str8_lit("");}break; +case CV_BasicType_NOTTRANS:{result = str8_lit("");}break; +case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; +case CV_BasicType_CHAR:{result = str8_lit("char");}break; +case CV_BasicType_SHORT:{result = str8_lit("S16");}break; +case CV_BasicType_LONG:{result = str8_lit("S32");}break; +case CV_BasicType_QUAD:{result = str8_lit("S64");}break; +case CV_BasicType_OCT:{result = str8_lit("S128");}break; +case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; +case CV_BasicType_USHORT:{result = str8_lit("U16");}break; +case CV_BasicType_ULONG:{result = str8_lit("U32");}break; +case CV_BasicType_UQUAD:{result = str8_lit("U64");}break; +case CV_BasicType_UOCT:{result = str8_lit("U128");}break; +case CV_BasicType_BOOL8:{result = str8_lit("B8");}break; +case CV_BasicType_BOOL16:{result = str8_lit("B16");}break; +case CV_BasicType_BOOL32:{result = str8_lit("B32");}break; +case CV_BasicType_BOOL64:{result = str8_lit("B64");}break; +case CV_BasicType_FLOAT32:{result = str8_lit("F32");}break; +case CV_BasicType_FLOAT64:{result = str8_lit("F64");}break; +case CV_BasicType_FLOAT80:{result = str8_lit("F80");}break; +case CV_BasicType_FLOAT128:{result = str8_lit("F128");}break; +case CV_BasicType_FLOAT48:{result = str8_lit("F48");}break; +case CV_BasicType_FLOAT32PP:{result = str8_lit("F32PP");}break; +case CV_BasicType_FLOAT16:{result = str8_lit("F16");}break; +case CV_BasicType_COMPLEX32:{result = str8_lit("ComplexF32");}break; +case CV_BasicType_COMPLEX64:{result = str8_lit("ComplexF64");}break; +case CV_BasicType_COMPLEX80:{result = str8_lit("ComplexF80");}break; +case CV_BasicType_COMPLEX128:{result = str8_lit("ComplexF128");}break; +case CV_BasicType_BIT:{result = str8_lit("");}break; +case CV_BasicType_PASCHAR:{result = str8_lit("");}break; +case CV_BasicType_BOOL32FF:{result = str8_lit("B32FF");}break; +case CV_BasicType_INT8:{result = str8_lit("S8");}break; +case CV_BasicType_UINT8:{result = str8_lit("U8");}break; +case CV_BasicType_RCHAR:{result = str8_lit("char");}break; +case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; +case CV_BasicType_INT16:{result = str8_lit("S16");}break; +case CV_BasicType_UINT16:{result = str8_lit("U16");}break; +case CV_BasicType_INT32:{result = str8_lit("S32");}break; +case CV_BasicType_UINT32:{result = str8_lit("U32");}break; +case CV_BasicType_INT64:{result = str8_lit("S64");}break; +case CV_BasicType_UINT64:{result = str8_lit("U64");}break; +case CV_BasicType_INT128:{result = str8_lit("S128");}break; +case CV_BasicType_UINT128:{result = str8_lit("U128");}break; +case CV_BasicType_CHAR16:{result = str8_lit("CHAR16");}break; +case CV_BasicType_CHAR32:{result = str8_lit("CHAR32");}break; +case CV_BasicType_CHAR8:{result = str8_lit("char");}break; +case CV_BasicType_PTR:{result = str8_lit("PTR");}break; +} +return result; +} + internal String8 cv_string_from_leaf_kind(CV_LeafKind v) { @@ -528,6 +656,51 @@ case CV_SymKind_INLINEES:{result = sizeof(CV_SymInlinees);}break; } return result; } +internal U64 +cv_header_struct_size_from_leaf_kind(CV_LeafKind v) +{ +U64 result = 0; +switch(v) +{ +default:{}break; +case CV_LeafKind_VTSHAPE:{result = sizeof(CV_LeafVTShape);}break; +case CV_LeafKind_LABEL:{result = sizeof(CV_LeafLabel);}break; +case CV_LeafKind_MODIFIER:{result = sizeof(CV_LeafModifier);}break; +case CV_LeafKind_POINTER:{result = sizeof(CV_LeafPointer);}break; +case CV_LeafKind_PROCEDURE:{result = sizeof(CV_LeafProcedure);}break; +case CV_LeafKind_MFUNCTION:{result = sizeof(CV_LeafMFunction);}break; +case CV_LeafKind_VFTPATH:{result = sizeof(CV_LeafVFPath);}break; +case CV_LeafKind_SKIP:{result = sizeof(CV_LeafSkip);}break; +case CV_LeafKind_ARGLIST:{result = sizeof(CV_LeafArgList);}break; +case CV_LeafKind_BITFIELD:{result = sizeof(CV_LeafBitField);}break; +case CV_LeafKind_METHODLIST:{result = sizeof(CV_LeafMethodListMember);}break; +case CV_LeafKind_BCLASS:{result = sizeof(CV_LeafBClass);}break; +case CV_LeafKind_VBCLASS:{result = sizeof(CV_LeafVBClass);}break; +case CV_LeafKind_INDEX:{result = sizeof(CV_LeafIndex);}break; +case CV_LeafKind_VFUNCTAB:{result = sizeof(CV_LeafVFuncTab);}break; +case CV_LeafKind_VFUNCOFF:{result = sizeof(CV_LeafVFuncOff);}break; +case CV_LeafKind_TYPESERVER:{result = sizeof(CV_LeafTypeServer);}break; +case CV_LeafKind_ENUMERATE:{result = sizeof(CV_LeafEnumerate);}break; +case CV_LeafKind_ARRAY:{result = sizeof(CV_LeafArray);}break; +case CV_LeafKind_CLASS:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_STRUCTURE:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_UNION:{result = sizeof(CV_LeafUnion);}break; +case CV_LeafKind_ENUM:{result = sizeof(CV_LeafEnum);}break; +case CV_LeafKind_PRECOMP:{result = sizeof(CV_LeafPreComp);}break; +case CV_LeafKind_ALIAS:{result = sizeof(CV_LeafAlias);}break; +case CV_LeafKind_MEMBER:{result = sizeof(CV_LeafMember);}break; +case CV_LeafKind_STMEMBER:{result = sizeof(CV_LeafStMember);}break; +case CV_LeafKind_METHOD:{result = sizeof(CV_LeafMethod);}break; +case CV_LeafKind_NESTTYPE:{result = sizeof(CV_LeafNestType);}break; +case CV_LeafKind_ONEMETHOD:{result = sizeof(CV_LeafOneMethod);}break; +case CV_LeafKind_NESTTYPEEX:{result = sizeof(CV_LeafNestTypeEx);}break; +case CV_LeafKind_TYPESERVER2:{result = sizeof(CV_LeafTypeServer2);}break; +case CV_LeafKind_INTERFACE:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_CLASS2:{result = sizeof(CV_LeafStruct2);}break; +case CV_LeafKind_STRUCT2:{result = sizeof(CV_LeafStruct2);}break; +} +return result; +} C_LINKAGE_BEGIN C_LINKAGE_END diff --git a/src/codeview/generated/codeview.meta.h b/src/codeview/generated/codeview.meta.h index fe61870e..b30192a7 100644 --- a/src/codeview/generated/codeview.meta.h +++ b/src/codeview/generated/codeview.meta.h @@ -320,6 +320,64 @@ CV_SymKind_FASTLINK = 0x1167, CV_SymKind_INLINEES = 0x1168, } CV_SymKindEnum; +typedef U8 CV_BasicType; +typedef enum CV_BasicTypeEnum +{ +CV_BasicType_NOTYPE = 0x00, +CV_BasicType_ABS = 0x01, +CV_BasicType_SEGMENT = 0x02, +CV_BasicType_VOID = 0x03, +CV_BasicType_CURRENCY = 0x04, +CV_BasicType_NBASICSTR = 0x05, +CV_BasicType_FBASICSTR = 0x06, +CV_BasicType_NOTTRANS = 0x07, +CV_BasicType_HRESULT = 0x08, +CV_BasicType_CHAR = 0x10, +CV_BasicType_SHORT = 0x11, +CV_BasicType_LONG = 0x12, +CV_BasicType_QUAD = 0x13, +CV_BasicType_OCT = 0x14, +CV_BasicType_UCHAR = 0x20, +CV_BasicType_USHORT = 0x21, +CV_BasicType_ULONG = 0x22, +CV_BasicType_UQUAD = 0x23, +CV_BasicType_UOCT = 0x24, +CV_BasicType_BOOL8 = 0x30, +CV_BasicType_BOOL16 = 0x31, +CV_BasicType_BOOL32 = 0x32, +CV_BasicType_BOOL64 = 0x33, +CV_BasicType_FLOAT32 = 0x40, +CV_BasicType_FLOAT64 = 0x41, +CV_BasicType_FLOAT80 = 0x42, +CV_BasicType_FLOAT128 = 0x43, +CV_BasicType_FLOAT48 = 0x44, +CV_BasicType_FLOAT32PP = 0x45, +CV_BasicType_FLOAT16 = 0x46, +CV_BasicType_COMPLEX32 = 0x50, +CV_BasicType_COMPLEX64 = 0x51, +CV_BasicType_COMPLEX80 = 0x52, +CV_BasicType_COMPLEX128 = 0x53, +CV_BasicType_BIT = 0x60, +CV_BasicType_PASCHAR = 0x61, +CV_BasicType_BOOL32FF = 0x62, +CV_BasicType_INT8 = 0x68, +CV_BasicType_UINT8 = 0x69, +CV_BasicType_RCHAR = 0x70, +CV_BasicType_WCHAR = 0x71, +CV_BasicType_INT16 = 0x72, +CV_BasicType_UINT16 = 0x73, +CV_BasicType_INT32 = 0x74, +CV_BasicType_UINT32 = 0x75, +CV_BasicType_INT64 = 0x76, +CV_BasicType_UINT64 = 0x77, +CV_BasicType_INT128 = 0x78, +CV_BasicType_UINT128 = 0x79, +CV_BasicType_CHAR16 = 0x7a, +CV_BasicType_CHAR32 = 0x7b, +CV_BasicType_CHAR8 = 0x7c, +CV_BasicType_PTR = 0xf0, +} CV_BasicTypeEnum; + typedef U16 CV_LeafKind; typedef enum CV_LeafKindEnum { @@ -454,8 +512,11 @@ CV_LeafKind_STRUCT2 = 0x1609, internal String8 cv_string_from_numeric_kind(CV_NumericKind v); internal String8 cv_string_from_arch(CV_Arch v); internal String8 cv_string_from_sym_kind(CV_SymKind v); +internal String8 cv_string_from_basic_type(CV_BasicType v); +internal String8 cv_type_name_from_basic_type(CV_BasicType v); internal String8 cv_string_from_leaf_kind(CV_LeafKind v); internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v); +internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v); C_LINKAGE_BEGIN C_LINKAGE_END diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index cab11028..0a5c495d 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -4,8 +4,8 @@ //////////////////////////////// //~ rjf: API Implementation Helper Macros -#define rdim_require(root, b32, else_code, error_msg) do { if(!(b32)) {rdim_push_error((root), (error_msg)); else_code;} }while(0) -#define rdim_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {rdim_push_errorf((root), (fmt), __VA_ARGS__); else_code;} }while(0) +#define rdim_require(root, b32, else_code, error_msg) do { if(!(b32)) {rdim_push_msg((root), (error_msg)); else_code;} }while(0) +#define rdim_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {rdim_push_msgf((root), (fmt), __VA_ARGS__); else_code;} }while(0) //////////////////////////////// //~ rjf: Basic Helpers @@ -234,99 +234,6 @@ rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep) return result; } -//- rjf: type lists - -RDI_PROC void -rdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *type) -{ - RDIM_TypeNode *node = rdim_push_array(arena, RDIM_TypeNode, 1); - RDIM_SLLQueuePush(list->first, list->last, node); - list->count += 1; - node->type = type; -} - -//- rjf: bytecode lists - -RDI_PROC void -rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) -{ - RDI_U8 ctrlbits = rdi_eval_opcode_ctrlbits[op]; - RDI_U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - - RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1); - node->op = op; - node->p_size = p_size; - node->p = p; - - RDIM_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); - bytecode->op_count += 1; - bytecode->encoded_size += 1 + p_size; -} - -RDI_PROC void -rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x) -{ - if(x <= 0xFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, x); - } - else if(x <= 0xFFFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, x); - } - else if(x <= 0xFFFFFFFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, x); - } - else - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, x); - } -} - -RDI_PROC void -rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x) -{ - if(-0x80 <= x && x <= 0x7F) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); - } - else if(-0x8000 <= x && x <= 0x7FFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); - } - else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 32); - } - else - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)x); - } -} - -RDI_PROC void -rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed) -{ - if(right_destroyed->first_op != 0) - { - if(left_dst->first_op == 0) - { - rdim_memcpy_struct(left_dst, right_destroyed); - } - else - { - left_dst->last_op = right_destroyed->last_op; - left_dst->op_count += right_destroyed->op_count; - left_dst->encoded_size += right_destroyed->encoded_size; - } - rdim_memzero_struct(right_destroyed); - } -} - //- rjf: sortable range sorting RDI_PROC RDIM_SortKey* @@ -492,6 +399,17 @@ rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count) //////////////////////////////// //~ rjf: Auxiliary Data Structure Functions +//- rjf: rng1u64 list + +RDI_PROC void +rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r) +{ + RDIM_Rng1U64Node *n = rdim_push_array(arena, RDIM_Rng1U64Node, 1); + n->v = r; + RDIM_SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + //- rjf: u64 -> ptr map RDI_PROC void @@ -590,6 +508,247 @@ rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String map->pair_count += 1; } +//////////////////////////////// +//~ rjf: Binary Section List Building + +RDI_PROC RDIM_BinarySection * +rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list) +{ + RDIM_BinarySectionNode *n = rdim_push_array(arena, RDIM_BinarySectionNode, 1); + RDIM_SLLQueuePush(list->first, list->last, n); + list->count += 1; + RDIM_BinarySection *result = &n->v; + return result; +} + +//////////////////////////////// +//~ rjf: Unit List Building + +RDI_PROC RDIM_Unit * +rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list) +{ + RDIM_UnitChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_UnitChunkNode, 1); + n->cap = 512; + n->v = rdim_push_array_no_zero(arena, RDIM_Unit, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Unit *unit = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return unit; +} + +RDI_PROC RDIM_LineSequence * +rdim_line_sequence_list_push(RDIM_Arena *arena, RDIM_LineSequenceList *list) +{ + RDIM_LineSequenceNode *n = rdim_push_array(arena, RDIM_LineSequenceNode, 1); + RDIM_SLLQueuePush(list->first, list->last, n); + list->count += 1; + return &n->v; +} + +RDI_PROC RDIM_UnitArray +rdim_unit_array_from_chunk_list(RDIM_Arena *arena, RDIM_UnitChunkList *list) +{ + RDIM_UnitArray array = {0}; + array.count = list->total_count; + array.v = rdim_push_array_no_zero(arena, RDIM_Unit, array.count); + U64 idx = 0; + for(RDIM_UnitChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_memcpy(array.v+idx, n->v, sizeof(RDIM_Unit)*n->count); + idx += n->count; + } + return array; +} + +//////////////////////////////// +//~ rjf: Type Info Building + +RDI_PROC RDIM_Type * +rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap) +{ + RDIM_TypeChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_TypeChunkNode, 1); + n->cap = cap; + n->v = rdim_push_array_no_zero(arena, RDIM_Type, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Type *result = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC RDIM_UDT * +rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap) +{ + RDIM_UDTChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_UDTChunkNode, 1); + n->cap = cap; + n->v = rdim_push_array_no_zero(arena, RDIM_UDT, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_UDT *result = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC RDIM_UDTMember * +rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDT *udt) +{ + RDIM_UDTMember *mem = rdim_push_array(arena, RDIM_UDTMember, 1); + RDIM_SLLQueuePush(udt->first_member, udt->last_member, mem); + udt->member_count += 1; + return mem; +} + +RDI_PROC RDIM_UDTEnumVal * +rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDT *udt) +{ + RDIM_UDTEnumVal *mem = rdim_push_array(arena, RDIM_UDTEnumVal, 1); + RDIM_SLLQueuePush(udt->first_enum_val, udt->last_enum_val, mem); + udt->enum_val_count += 1; + return mem; +} + +//////////////////////////////// +//~ rjf: Location Info Building + +RDI_PROC void +rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) +{ + RDI_U8 ctrlbits = rdi_eval_opcode_ctrlbits[op]; + RDI_U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + + RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1); + node->op = op; + node->p_size = p_size; + node->p = p; + + RDIM_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); + bytecode->op_count += 1; + bytecode->encoded_size += 1 + p_size; +} + +RDI_PROC void +rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x) +{ + if(x <= 0xFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, x); + } + else if(x <= 0xFFFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, x); + } + else if(x <= 0xFFFFFFFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, x); + } + else + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, x); + } +} + +RDI_PROC void +rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x) +{ + if(-0x80 <= x && x <= 0x7F) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); + } + else if(-0x8000 <= x && x <= 0x7FFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); + } + else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 32); + } + else + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)x); + } +} + +RDI_PROC void +rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed) +{ + if(right_destroyed->first_op != 0) + { + if(left_dst->first_op == 0) + { + rdim_memcpy_struct(left_dst, right_destroyed); + } + else + { + left_dst->last_op = right_destroyed->last_op; + left_dst->op_count += right_destroyed->op_count; + left_dst->encoded_size += right_destroyed->encoded_size; + } + rdim_memzero_struct(right_destroyed); + } +} + +//////////////////////////////// +//~ rjf: Symbol Info Building + +RDI_PROC RDIM_Symbol * +rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap) +{ + RDIM_SymbolChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_SymbolChunkNode, 1); + n->cap = cap; + n->v = rdim_push_array_no_zero(arena, RDIM_Symbol, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Symbol *result = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return result; +} + +//////////////////////////////// +//~ rjf: Scope Info Building + +RDI_PROC RDIM_Scope * +rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap) +{ + RDIM_ScopeChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_ScopeChunkNode, 1); + n->cap = cap; + n->v = rdim_push_array_no_zero(arena, RDIM_Scope, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Scope *result = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return result; +} + +#if 0 //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions @@ -657,126 +816,28 @@ rdim_root_release(RDIM_Root *root) //- rjf: error accumulation RDI_PROC void -rdim_push_error(RDIM_Root *root, RDIM_String8 string) +rdim_push_msg(RDIM_Root *root, RDIM_String8 string) { - RDIM_Error *error = rdim_push_array(root->arena, RDIM_Error, 1); - SLLQueuePush(root->errors.first, root->errors.last, error); - root->errors.count += 1; - error->msg = string; + RDIM_Msg *msg = rdim_push_array(root->arena, RDIM_Msg, 1); + SLLQueuePush(root->msgs.first, root->msgs.last, msg); + root->msgs.count += 1; + msg->string = string; } RDI_PROC void -rdim_push_errorf(RDIM_Root *root, char *fmt, ...) +rdim_push_msgf(RDIM_Root *root, char *fmt, ...) { va_list args; va_start(args, fmt); RDIM_String8 str = rdim_str8fv(root->arena, fmt, args); - rdim_push_error(root, str); + rdim_push_msg(root, str); va_end(args); } -RDI_PROC RDIM_Error* -rdim_first_error_from_root(RDIM_Root *root) +RDI_PROC RDIM_Msg * +rdim_first_msg_from_root(RDIM_Root *root) { - return root->errors.first; -} - -//- rjf: top-level info specification - -RDI_PROC void -rdim_set_top_level_info(RDIM_Root *root, RDIM_TopLevelInfo *tli) -{ - rdim_requiref(root, !root->top_level_info_is_set, return, "Top level information set multiple times."); - rdim_memcpy_struct(&root->top_level_info, tli); - root->top_level_info_is_set = 1; -} - -//- rjf: binary section building - -RDI_PROC void -rdim_add_binary_section(RDIM_Root *root, RDIM_String8 name, RDI_BinarySectionFlags flags, RDI_U64 voff_first, RDI_U64 voff_opl, RDI_U64 foff_first, RDI_U64 foff_opl) -{ - RDIM_BinarySection *sec = rdim_push_array(root->arena, RDIM_BinarySection, 1); - SLLQueuePush(root->binary_section_first, root->binary_section_last, sec); - root->binary_section_count += 1; - sec->name = name; - sec->flags = flags; - sec->voff_first = voff_first; - sec->voff_opl = voff_opl; - sec->foff_first = foff_first; - sec->foff_opl = foff_opl; -} - -//- rjf: unit info building - -RDI_PROC RDIM_Unit* -rdim_unit_handle_from_user_id(RDIM_Root *root, RDI_U64 unit_user_id, RDI_U64 unit_user_id_hash) -{ - RDIM_U64ToPtrLookup lookup = {0}; - rdim_u64toptr_map_lookup(&root->unit_map, unit_user_id, unit_user_id_hash, &lookup); - RDIM_Unit *result = 0; - if(lookup.match != 0) - { - result = (RDIM_Unit*)lookup.match; - } - else - { - result = rdim_push_array(root->arena, RDIM_Unit, 1); - result->idx = root->unit_count; - RDIM_SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order); - root->unit_count += 1; - rdim_u64toptr_map_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result); - } - return result; -} - -RDI_PROC void -rdim_unit_set_info(RDIM_Root *root, RDIM_Unit *unit, RDIM_UnitInfo *info) -{ - rdim_requiref(root, !unit->info_is_set, return, "Unit information set multiple times."); - unit->info_is_set = 1; - unit->unit_name = rdim_str8_copy(root->arena, info->unit_name); - unit->compiler_name = rdim_str8_copy(root->arena, info->compiler_name); - unit->source_file = rdim_str8_copy(root->arena, info->source_file); - unit->object_file = rdim_str8_copy(root->arena, info->object_file); - unit->archive_file = rdim_str8_copy(root->arena, info->archive_file); - unit->build_path = rdim_str8_copy(root->arena, info->build_path); - unit->language = info->language; -} - -RDI_PROC void -rdim_unit_add_line_sequence(RDIM_Root *root, RDIM_Unit *unit, RDIM_LineSequence *line_sequence) -{ - RDIM_LineSequenceNode *node = rdim_push_array(root->arena, RDIM_LineSequenceNode, 1); - SLLQueuePush(unit->line_seq_first, unit->line_seq_last, node); - unit->line_seq_count += 1; - - node->line_seq.file_name = rdim_str8_copy(root->arena, line_sequence->file_name); - - node->line_seq.voffs = rdim_push_array(root->arena, RDI_U64, line_sequence->line_count + 1); - rdim_memcpy(node->line_seq.voffs, line_sequence->voffs, sizeof(RDI_U64)*(line_sequence->line_count + 1)); - - node->line_seq.line_nums = rdim_push_array(root->arena, RDI_U32, line_sequence->line_count); - rdim_memcpy(node->line_seq.line_nums, line_sequence->line_nums, sizeof(RDI_U32)*line_sequence->line_count); - - if(line_sequence->col_nums != 0) - { - node->line_seq.col_nums = rdim_push_array(root->arena, RDI_U16, line_sequence->line_count); - rdim_memcpy(node->line_seq.col_nums, line_sequence->col_nums, sizeof(RDI_U16)*line_sequence->line_count); - } - - node->line_seq.line_count = line_sequence->line_count; -} - -RDI_PROC void -rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RDI_U64 first, RDI_U64 opl) -{ - RDIM_UnitVMapRange *node = rdim_push_array(root->arena, RDIM_UnitVMapRange, 1); - SLLQueuePush(root->unit_vmap_range_first, root->unit_vmap_range_last, node); - root->unit_vmap_range_count += 1; - node->unit = unit; - node->first = first; - node->opl = opl; + return root->msgs.first; } //- rjf: type info lookups/reservations @@ -3671,3 +3732,4 @@ rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) rdim_bake_ctx_release(bctx); } +#endif diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 3e20d559..cf611926 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -280,26 +280,32 @@ RDIM_CheckNil(nil,p) ? \ #define rdim_noop ((void)0) //////////////////////////////// -//~ rjf: Error Types +//~ rjf: Auxiliary Data Structure Types -typedef struct RDIM_Error RDIM_Error; -struct RDIM_Error +//- rjf: 1-dimensional U64 ranges + +typedef struct RDIM_Rng1U64 RDIM_Rng1U64; +struct RDIM_Rng1U64 { - RDIM_Error *next; - RDIM_String8 msg; + RDI_U64 min; + RDI_U64 max; }; -typedef struct RDIM_ErrorList RDIM_ErrorList; -struct RDIM_ErrorList +typedef struct RDIM_Rng1U64Node RDIM_Rng1U64Node; +struct RDIM_Rng1U64Node { - RDIM_Error *first; - RDIM_Error *last; + RDIM_Rng1U64Node *next; + RDIM_Rng1U64 v; +}; + +typedef struct RDIM_Rng1U64List RDIM_Rng1U64List; +struct RDIM_Rng1U64List +{ + RDIM_Rng1U64Node *first; + RDIM_Rng1U64Node *last; RDI_U64 count; }; -//////////////////////////////// -//~ rjf: Auxiliary Data Structure Types - //- rjf: u64 -> pointer map typedef struct RDIM_U64ToPtrNode RDIM_U64ToPtrNode; @@ -365,13 +371,42 @@ struct RDIM_OrderedRange RDI_U64 opl; }; +//////////////////////////////// +//~ rjf: Error/Warning/Note Message Types + +typedef struct RDIM_Msg RDIM_Msg; +struct RDIM_Msg +{ + RDIM_Msg *next; + RDIM_String8 string; +}; + +typedef struct RDIM_MsgList RDIM_MsgList; +struct RDIM_MsgList +{ + RDIM_Msg *first; + RDIM_Msg *last; + RDI_U64 count; +}; + +//////////////////////////////// +//~ rjf: Top-Level Debug Info Types + +typedef struct RDIM_TopLevelInfo RDIM_TopLevelInfo; +struct RDIM_TopLevelInfo +{ + RDI_Arch arch; + RDIM_String8 exe_name; + RDI_U64 exe_hash; + RDI_U64 voff_max; +}; + //////////////////////////////// //~ rjf: Binary Section Types typedef struct RDIM_BinarySection RDIM_BinarySection; struct RDIM_BinarySection { - RDIM_BinarySection *next; RDIM_String8 name; RDI_BinarySectionFlags flags; RDI_U64 voff_first; @@ -380,6 +415,21 @@ struct RDIM_BinarySection RDI_U64 foff_opl; }; +typedef struct RDIM_BinarySectionNode RDIM_BinarySectionNode; +struct RDIM_BinarySectionNode +{ + RDIM_BinarySectionNode *next; + RDIM_BinarySection v; +}; + +typedef struct RDIM_BinarySectionList RDIM_BinarySectionList; +struct RDIM_BinarySectionList +{ + RDIM_BinarySectionNode *first; + RDIM_BinarySectionNode *last; + RDI_U64 count; +}; + //////////////////////////////// //~ rjf: Per-Compilation-Unit Info Types @@ -397,27 +447,20 @@ typedef struct RDIM_LineSequenceNode RDIM_LineSequenceNode; struct RDIM_LineSequenceNode { RDIM_LineSequenceNode *next; - RDIM_LineSequence line_seq; + RDIM_LineSequence v; }; -typedef struct RDIM_UnitInfo RDIM_UnitInfo; -struct RDIM_UnitInfo +typedef struct RDIM_LineSequenceList RDIM_LineSequenceList; +struct RDIM_LineSequenceList { - RDIM_String8 unit_name; - RDIM_String8 compiler_name; - RDIM_String8 source_file; - RDIM_String8 object_file; - RDIM_String8 archive_file; - RDIM_String8 build_path; - RDI_Language language; + RDIM_LineSequenceNode *first; + RDIM_LineSequenceNode *last; + RDI_U64 count; }; typedef struct RDIM_Unit RDIM_Unit; struct RDIM_Unit { - RDIM_Unit *next_order; - RDI_U32 idx; - RDI_S32 info_is_set; RDIM_String8 unit_name; RDIM_String8 compiler_name; RDIM_String8 source_file; @@ -425,61 +468,42 @@ struct RDIM_Unit RDIM_String8 archive_file; RDIM_String8 build_path; RDI_Language language; - RDIM_LineSequenceNode *line_seq_first; - RDIM_LineSequenceNode *line_seq_last; - RDI_U64 line_seq_count; + RDIM_LineSequenceList line_sequences; + RDIM_Rng1U64List voff_ranges; }; -typedef struct RDIM_UnitVMapRange RDIM_UnitVMapRange; -struct RDIM_UnitVMapRange +typedef struct RDIM_UnitChunkNode RDIM_UnitChunkNode; +struct RDIM_UnitChunkNode { - RDIM_UnitVMapRange *next; - RDIM_Unit *unit; - RDI_U64 first; - RDI_U64 opl; + RDIM_UnitChunkNode *next; + RDIM_Unit *v; + RDI_U64 count; + RDI_U64 cap; +}; + +typedef struct RDIM_UnitChunkList RDIM_UnitChunkList; +struct RDIM_UnitChunkList +{ + RDIM_UnitChunkNode *first; + RDIM_UnitChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +typedef struct RDIM_UnitArray RDIM_UnitArray; +struct RDIM_UnitArray +{ + RDIM_Unit *v; + RDI_U64 count; }; //////////////////////////////// -//~ rjf: Type Info Types - -typedef RDI_U8 RDIM_TypeConstructKind; -enum -{ - RDIM_TypeConstructKind_Basic, - RDIM_TypeConstructKind_Modifier, - RDIM_TypeConstructKind_Bitfield, - RDIM_TypeConstructKind_Pointer, - RDIM_TypeConstructKind_Array, - RDIM_TypeConstructKind_Procedure, - RDIM_TypeConstructKind_Method, -}; - -typedef struct RDIM_Reservation RDIM_Reservation; - -typedef struct RDIM_TypeMember RDIM_TypeMember; -struct RDIM_TypeMember -{ - RDIM_TypeMember *next; - RDI_MemberKind kind; - RDIM_String8 name; - struct RDIM_Type *type; - RDI_U32 off; -}; - -typedef struct RDIM_TypeEnumVal RDIM_TypeEnumVal; -struct RDIM_TypeEnumVal -{ - RDIM_TypeEnumVal *next; - RDIM_String8 name; - RDI_U64 val; -}; +//~ rjf: Type System Node Types typedef struct RDIM_Type RDIM_Type; struct RDIM_Type { - RDIM_Type *next_order; RDI_TypeKind kind; - RDI_U32 idx; RDI_U32 byte_size; RDI_U32 flags; RDI_U32 off; @@ -487,133 +511,86 @@ struct RDIM_Type RDIM_String8 name; RDIM_Type *direct_type; RDIM_Type **param_types; - struct RDIM_TypeUDT *udt; + struct RDIM_UDT *udt; }; -typedef struct RDIM_TypeUDT RDIM_TypeUDT; -struct RDIM_TypeUDT +typedef struct RDIM_TypeChunkNode RDIM_TypeChunkNode; +struct RDIM_TypeChunkNode +{ + RDIM_TypeChunkNode *next; + RDIM_Type *v; + RDI_U64 count; + RDI_U64 cap; +}; + +typedef struct RDIM_TypeChunkList RDIM_TypeChunkList; +struct RDIM_TypeChunkList +{ + RDIM_TypeChunkNode *first; + RDIM_TypeChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +typedef struct RDIM_TypeArray RDIM_TypeArray; +struct RDIM_TypeArray +{ + RDIM_Type *v; + RDI_U64 count; +}; + +//////////////////////////////// +//~ rjf: User-Defined-Type Info Types + +typedef struct RDIM_UDTMember RDIM_UDTMember; +struct RDIM_UDTMember +{ + RDIM_UDTMember *next; + RDI_MemberKind kind; + RDIM_String8 name; + RDIM_Type *type; + RDI_U32 off; +}; + +typedef struct RDIM_UDTEnumVal RDIM_UDTEnumVal; +struct RDIM_UDTEnumVal +{ + RDIM_UDTEnumVal *next; + RDIM_String8 name; + RDI_U64 val; +}; + +typedef struct RDIM_UDT RDIM_UDT; +struct RDIM_UDT { - RDIM_TypeUDT *next_order; - RDI_U32 idx; RDIM_Type *self_type; - RDIM_TypeMember *first_member; - RDIM_TypeMember *last_member; + RDIM_UDTMember *first_member; + RDIM_UDTMember *last_member; RDI_U64 member_count; - RDIM_TypeEnumVal *first_enum_val; - RDIM_TypeEnumVal *last_enum_val; + RDIM_UDTEnumVal *first_enum_val; + RDIM_UDTEnumVal *last_enum_val; RDI_U64 enum_val_count; RDIM_String8 source_path; RDI_U32 line; RDI_U32 col; }; -typedef struct RDIM_TypeNode RDIM_TypeNode; -struct RDIM_TypeNode +typedef struct RDIM_UDTChunkNode RDIM_UDTChunkNode; +struct RDIM_UDTChunkNode { - RDIM_TypeNode *next; - RDIM_Type *type; -}; - -typedef struct RDIM_TypeList RDIM_TypeList; -struct RDIM_TypeList -{ - RDIM_TypeNode *first; - RDIM_TypeNode *last; + RDIM_UDTChunkNode *next; + RDIM_UDT *v; RDI_U64 count; + RDI_U64 cap; }; -//////////////////////////////// -//~ rjf: Symbol Info Types - -typedef enum RDIM_SymbolKind +typedef struct RDIM_UDTChunkList RDIM_UDTChunkList; +struct RDIM_UDTChunkList { - RDIM_SymbolKind_NULL, - RDIM_SymbolKind_GlobalVariable, - RDIM_SymbolKind_ThreadVariable, - RDIM_SymbolKind_Procedure, - RDIM_SymbolKind_COUNT -} -RDIM_SymbolKind; - -typedef struct RDIM_SymbolInfo RDIM_SymbolInfo; -struct RDIM_SymbolInfo -{ - RDIM_SymbolKind kind; - RDIM_String8 name; - RDIM_String8 link_name; - RDIM_Type *type; - RDI_S32 is_extern; - RDI_U64 offset; - // TODO(allen): should this actually be "container scope"? - struct RDIM_Symbol *container_symbol; - RDIM_Type *container_type; - struct RDIM_Scope *root_scope; -}; - -typedef struct RDIM_Symbol RDIM_Symbol; -struct RDIM_Symbol -{ - RDIM_Symbol *next_order; - RDI_U32 idx; - RDIM_SymbolKind kind; - RDIM_String8 name; - RDIM_String8 link_name; - RDIM_Type *type; - RDI_S32 is_extern; - RDI_S8 offset_is_set; - RDI_U64 offset; - RDIM_Symbol *container_symbol; - RDIM_Type *container_type; - struct RDIM_Scope *root_scope; -}; - -//////////////////////////////// -//~ rjf: Scope Info Types - -typedef struct RDIM_LocalInfo RDIM_LocalInfo; -struct RDIM_LocalInfo -{ - RDI_LocalKind kind; - struct RDIM_Scope *scope; - RDIM_String8 name; - RDIM_Type *type; -}; - -typedef struct RDIM_Local RDIM_Local; -struct RDIM_Local -{ - RDIM_Local *next; - RDI_LocalKind kind; - RDIM_String8 name; - RDIM_Type *type; - struct RDIM_LocationSet *locset; -}; - -typedef struct RDIM_VOffRange RDIM_VOffRange; -struct RDIM_VOffRange -{ - RDIM_VOffRange *next; - RDI_U64 voff_first; - RDI_U64 voff_opl; -}; - -typedef struct RDIM_Scope RDIM_Scope; -struct RDIM_Scope -{ - RDIM_Scope *next_order; - RDIM_Symbol *symbol; - RDIM_Scope *parent_scope; - RDIM_Scope *first_child; - RDIM_Scope *last_child; - RDIM_Scope *next_sibling; - RDI_U64 voff_base; - RDIM_VOffRange *first_range; - RDIM_VOffRange *last_range; - RDI_U32 range_count; - RDI_U32 idx; - RDIM_Local *first_local; - RDIM_Local *last_local; - RDI_U32 local_count; + RDIM_UDTChunkNode *first; + RDIM_UDTChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; }; //////////////////////////////// @@ -663,6 +640,97 @@ struct RDIM_LocationSet RDI_U64 location_case_count; }; +//////////////////////////////// +//~ rjf: Symbol Info Types + +typedef enum RDIM_SymbolKind +{ + RDIM_SymbolKind_NULL, + RDIM_SymbolKind_GlobalVariable, + RDIM_SymbolKind_ThreadVariable, + RDIM_SymbolKind_Procedure, + RDIM_SymbolKind_COUNT +} +RDIM_SymbolKind; + +typedef struct RDIM_Symbol RDIM_Symbol; +struct RDIM_Symbol +{ + RDIM_SymbolKind kind; + RDI_S32 is_extern; + RDIM_String8 name; + RDIM_String8 link_name; + RDIM_Type *type; + RDI_U64 offset; + RDIM_Symbol *container_symbol; + RDIM_Type *container_type; + struct RDIM_Scope *root_scope; +}; + +typedef struct RDIM_SymbolChunkNode RDIM_SymbolChunkNode; +struct RDIM_SymbolChunkNode +{ + RDIM_SymbolChunkNode *next; + RDIM_Symbol *v; + RDI_U64 count; + RDI_U64 cap; +}; + +typedef struct RDIM_SymbolChunkList RDIM_SymbolChunkList; +struct RDIM_SymbolChunkList +{ + RDIM_SymbolChunkNode *first; + RDIM_SymbolChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +//////////////////////////////// +//~ rjf: Scope Info Types + +typedef struct RDIM_Local RDIM_Local; +struct RDIM_Local +{ + RDIM_Local *next; + RDI_LocalKind kind; + RDIM_String8 name; + RDIM_Type *type; + RDIM_LocationSet *locset; +}; + +typedef struct RDIM_Scope RDIM_Scope; +struct RDIM_Scope +{ + RDIM_Symbol *symbol; + RDIM_Scope *parent_scope; + RDIM_Scope *first_child; + RDIM_Scope *last_child; + RDIM_Scope *next_sibling; + RDI_U64 voff_base; + RDIM_Rng1U64List voff_ranges; + RDIM_Local *first_local; + RDIM_Local *last_local; + RDI_U32 local_count; +}; + +typedef struct RDIM_ScopeChunkNode RDIM_ScopeChunkNode; +struct RDIM_ScopeChunkNode +{ + RDIM_ScopeChunkNode *next; + RDIM_Scope *v; + RDI_U64 count; + RDI_U64 cap; +}; + +typedef struct RDIM_ScopeChunkList RDIM_ScopeChunkList; +struct RDIM_ScopeChunkList +{ + RDIM_ScopeChunkNode *first; + RDIM_ScopeChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + //////////////////////////////// //~ rjf: Name Map Types @@ -695,18 +763,6 @@ struct RDIM_NameMap RDI_U64 name_count; }; -//////////////////////////////// -//~ rjf: Top-Level Debug Info Types - -typedef struct RDIM_TopLevelInfo RDIM_TopLevelInfo; -struct RDIM_TopLevelInfo -{ - RDI_Arch architecture; - RDIM_String8 exe_name; - RDI_U64 exe_hash; - RDI_U64 voff_max; -}; - //////////////////////////////// //~ rjf: Root Construction Bundle Types @@ -726,7 +782,7 @@ typedef struct RDIM_Root RDIM_Root; struct RDIM_Root { RDIM_Arena *arena; - RDIM_ErrorList errors; + RDIM_MsgList msgs; //////// Contextual Information @@ -734,38 +790,6 @@ struct RDIM_Root //////// Info Declared By User - // top level info - RDI_S32 top_level_info_is_set; - RDIM_TopLevelInfo top_level_info; - - // binary layout - RDIM_BinarySection *binary_section_first; - RDIM_BinarySection *binary_section_last; - RDI_U64 binary_section_count; - - // compilation units - RDIM_Unit *unit_first; - RDIM_Unit *unit_last; - RDI_U64 unit_count; - - RDIM_UnitVMapRange *unit_vmap_range_first; - RDIM_UnitVMapRange *unit_vmap_range_last; - RDI_U64 unit_vmap_range_count; - - // types - RDIM_Type *first_type; - RDIM_Type *last_type; - RDI_U64 type_count; - - RDIM_Type *nil_type; - RDIM_Type *variadic_type; - - RDIM_Type handled_nil_type; - - RDIM_TypeUDT *first_udt; - RDIM_TypeUDT *last_udt; - RDI_U64 type_udt_count; - RDI_U64 total_member_count; RDI_U64 total_enum_val_count; @@ -1136,21 +1160,15 @@ RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatc RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep); -//- rjf: type lists -RDI_PROC void rdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *type); - -//- rjf: bytecode lists -RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); -RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); -RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); -RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); - //- rjf: sortable range sorting RDI_PROC RDIM_SortKey* rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count); //////////////////////////////// //~ rjf: Auxiliary Data Structure Functions +//- rjf: rng1u64 list +RDI_PROC void rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r); + //- rjf: u64 -> ptr map RDI_PROC void rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count); RDI_PROC void rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out); @@ -1161,6 +1179,46 @@ RDI_PROC void rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_PROC void*rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash); RDI_PROC void rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr); +//////////////////////////////// +//~ rjf: Binary Section Info Building + +RDI_PROC RDIM_BinarySection *rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list); + +//////////////////////////////// +//~ rjf: Unit Info Building + +RDI_PROC RDIM_Unit *rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list); +RDI_PROC RDIM_LineSequence *rdim_line_sequence_list_push(RDIM_Arena *arena, RDIM_LineSequenceList *list); +RDI_PROC RDIM_UnitArray rdim_unit_array_from_chunk_list(RDIM_Arena *arena, RDIM_UnitChunkList *list); + +//////////////////////////////// +//~ rjf: Type Info & UDT Building + +RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap); +RDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap); +RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDT *udt); +RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDT *udt); + +//////////////////////////////// +//~ rjf: Location Info Building + +RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); +RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); +RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); +RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); + +//////////////////////////////// +//~ rjf: Symbol Info Building + +RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap); + +//////////////////////////////// +//~ rjf: Scope Info Building + +RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap); + + +#if 0 //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions @@ -1169,24 +1227,9 @@ RDI_PROC RDIM_Root* rdim_root_alloc(RDIM_RootParams *params); RDI_PROC void rdim_root_release(RDIM_Root *root); //- rjf: error accumulation -RDI_PROC void rdim_push_error(RDIM_Root *root, RDIM_String8 string); -RDI_PROC void rdim_push_errorf(RDIM_Root *root, char *fmt, ...); -RDI_PROC RDIM_Error* rdim_first_error_from_root(RDIM_Root *root); - -//- rjf: top-level info specification -RDI_PROC void rdim_set_top_level_info(RDIM_Root *root, RDIM_TopLevelInfo *tli); - -//- rjf: binary section building -RDI_PROC void rdim_add_binary_section(RDIM_Root *root, - RDIM_String8 name, RDI_BinarySectionFlags flags, - RDI_U64 voff_first, RDI_U64 voff_opl, RDI_U64 foff_first, - RDI_U64 foff_opl); - -//- rjf: unit info building -RDI_PROC RDIM_Unit* rdim_unit_handle_from_user_id(RDIM_Root *root, RDI_U64 unit_user_id, RDI_U64 unit_user_id_hash); -RDI_PROC void rdim_unit_set_info(RDIM_Root *root, RDIM_Unit *unit, RDIM_UnitInfo *info); -RDI_PROC void rdim_unit_add_line_sequence(RDIM_Root *root, RDIM_Unit *unit, RDIM_LineSequence *line_sequence); -RDI_PROC void rdim_unit_vmap_add_range(RDIM_Root *root, RDIM_Unit *unit, RDI_U64 first, RDI_U64 opl); +RDI_PROC void rdim_push_msg(RDIM_Root *root, RDIM_String8 string); +RDI_PROC void rdim_push_msgf(RDIM_Root *root, char *fmt, ...); +RDI_PROC RDIM_Msg* rdim_first_msg_from_root(RDIM_Root *root); //- rjf: type info lookups/reservations RDI_PROC RDIM_Type* rdim_type_from_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash); @@ -1309,5 +1352,6 @@ RDI_PROC RDIM_NameMapBaked* rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *roo //- rjf: top-level baking entry point RDI_PROC void rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out); +#endif #endif // RDI_MAKE_H diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 94d9dcd8..0b2f23a1 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -298,6 +298,84 @@ rdi_language_from_cv_language(CV_Language cv_language) return(result); } +internal RDI_TypeKind +rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) +{ + RDI_TypeKind result = RDI_TypeKind_NULL; + switch(basic_type) + { + case CV_BasicType_VOID: {result = RDI_TypeKind_Void;}break; + case CV_BasicType_HRESULT: {result = RDI_TypeKind_Handle;}break; + + case CV_BasicType_RCHAR: + case CV_BasicType_CHAR: + case CV_BasicType_CHAR8: + {result = RDI_TypeKind_Char8;}break; + + case CV_BasicType_UCHAR: {result = RDI_TypeKind_UChar8;}break; + case CV_BasicType_WCHAR: {result = RDI_TypeKind_UChar16;}break; + case CV_BasicType_CHAR16: {result = RDI_TypeKind_Char16;}break; + case CV_BasicType_CHAR32: {result = RDI_TypeKind_Char32;}break; + + case CV_BasicType_BOOL8: + case CV_BasicType_INT8: + {result = RDI_TypeKind_S8;}break; + + case CV_BasicType_BOOL16: + case CV_BasicType_INT16: + case CV_BasicType_SHORT: + {result = RDI_TypeKind_S16;}break; + + case CV_BasicType_BOOL32: + case CV_BasicType_INT32: + case CV_BasicType_LONG: + {result = RDI_TypeKind_S32;}break; + + case CV_BasicType_BOOL64: + case CV_BasicType_INT64: + case CV_BasicType_QUAD: + {result = RDI_TypeKind_S64;}break; + + case CV_BasicType_INT128: + case CV_BasicType_OCT: + {result = RDI_TypeKind_S128;}break; + + case CV_BasicType_UINT8: {result = RDI_TypeKind_U8;}break; + + case CV_BasicType_UINT16: + case CV_BasicType_USHORT: + {result = RDI_TypeKind_U16;}break; + + case CV_BasicType_UINT32: + case CV_BasicType_ULONG: + {result = RDI_TypeKind_U32;}break; + + case CV_BasicType_UINT64: + case CV_BasicType_UQUAD: + {result = RDI_TypeKind_U64;}break; + + case CV_BasicType_UINT128: + case CV_BasicType_UOCT: + {result = RDI_TypeKind_U128;}break; + + case CV_BasicType_FLOAT16:{result = RDI_TypeKind_F16;}break; + case CV_BasicType_FLOAT32:{result = RDI_TypeKind_F32;}break; + case CV_BasicType_FLOAT32PP:{result = RDI_TypeKind_F32PP;}break; + case CV_BasicType_FLOAT48:{result = RDI_TypeKind_F48;}break; + case CV_BasicType_FLOAT64:{result = RDI_TypeKind_F64;}break; + case CV_BasicType_FLOAT80:{result = RDI_TypeKind_F80;}break; + case CV_BasicType_FLOAT128:{result = RDI_TypeKind_F128;}break; + case CV_BasicType_COMPLEX32:{result = RDI_TypeKind_ComplexF32;}break; + case CV_BasicType_COMPLEX64:{result = RDI_TypeKind_ComplexF64;}break; + case CV_BasicType_COMPLEX80:{result = RDI_TypeKind_ComplexF80;}break; + case CV_BasicType_COMPLEX128:{result = RDI_TypeKind_ComplexF128;}break; + case CV_BasicType_PTR:{result = RDI_TypeKind_Handle;}break; + } + return result; +} + +#if 0 + //////////////////////////////// //~ rjf: Conversion Implementation Helpers @@ -362,7 +440,7 @@ p2r_u32_from_numeric(P2R_Ctx *ctx, CV_NumericParsed *num) U32 n_u32 = (U32)n_u64; if(n_u64 > 0xFFFFFFFF) { - rdim_push_errorf(ctx->root, "constant too large"); + rdim_push_msgf(ctx->root, "constant too large"); n_u32 = 0; } return(n_u32); @@ -1053,8 +1131,8 @@ p2r_type_equip_members(P2R_Ctx *ctx, RDIM_Type *owner_type, CV_TypeId field_ityp default: { String8 kind_str = cv_string_from_leaf_kind(field_kind); - rdim_push_errorf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", - str8_varg(kind_str)); + rdim_push_msgf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", + str8_varg(kind_str)); }break; } @@ -1188,8 +1266,8 @@ p2r_type_equip_enumerates(P2R_Ctx *ctx, RDIM_Type *owner_type, CV_TypeId field_i default: { String8 kind_str = cv_string_from_leaf_kind(field_kind); - rdim_push_errorf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", - str8_varg(kind_str)); + rdim_push_msgf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", + str8_varg(kind_str)); }break; } @@ -1932,8 +2010,8 @@ p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) default: { String8 kind_str = cv_string_from_leaf_kind(range->hdr.kind); - rdim_push_errorf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", - str8_varg(kind_str), range->hdr.kind); + rdim_push_msgf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", + str8_varg(kind_str), range->hdr.kind); }break; } } @@ -1949,7 +2027,7 @@ p2r_type_resolve_and_check(P2R_Ctx *ctx, CV_TypeId itype) RDIM_Type *result = p2r_type_resolve_itype(ctx, itype); if(rdim_type_is_unhandled_nil(ctx->root, result)) { - rdim_push_errorf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); + rdim_push_msgf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); } return(result); } @@ -3193,90 +3271,86 @@ p2r_link_name_find(P2R_LinkNameMap *map, U64 voff) return(result); } +#endif + //////////////////////////////// -//~ Conversion Path +//~ rjf: Top-Level Conversion Entry Point internal P2R_Out * p2r_convert(Arena *arena, P2R_Params *params) { + Temp scratch = scratch_begin(&arena, 1); P2R_Out *out = push_array(arena, P2R_Out, 1); out->good_parse = 1; - // will we try to parse an input file? - B32 try_parse_input = (params->errors.node_count == 0); - -#define PARSE_CHECK_ERROR(p,fmt,...) do{ if((p) == 0){\ -out->good_parse = 0;\ -str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ -} }while(0) - - // parse msf file + ////////////////////////////////////////////////////////////// + //- rjf: parse MSF structure + // MSF_Parsed *msf = 0; - if(try_parse_input) ProfScope("parse msf") + if(params->errors.node_count == 0) ProfScope("parse MSF structure") { msf = msf_parsed_from_data(arena, params->input_pdb_data); - PARSE_CHECK_ERROR(msf, "MSF"); } - // parse pdb info + ////////////////////////////////////////////////////////////// + //- rjf: parse PDB auth_guid & named streams table + // PDB_NamedStreamTable *named_streams = 0; COFF_Guid auth_guid = {0}; - if(msf != 0) ProfScope("parse pdb info") + if(msf != 0) ProfScope("parse PDB auth_guid & named streams table") { Temp scratch = scratch_begin(&arena, 1); - String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_PdbInfo); PDB_Info *info = pdb_info_from_data(scratch.arena, info_data); named_streams = pdb_named_stream_table_from_info(arena, info); MemoryCopyStruct(&auth_guid, &info->auth_guid); - scratch_end(scratch); - - PARSE_CHECK_ERROR(named_streams, "named streams from pdb info"); } - // parse strtbl + ////////////////////////////////////////////////////////////// + //- rjf: parse PDB strtbl + // PDB_Strtbl *strtbl = 0; - if(named_streams != 0) ProfScope("parse strtbl") + if(named_streams != 0) ProfScope("parse PDB strtbl") { MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_STRTABLE]; String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); strtbl = pdb_strtbl_from_data(arena, strtbl_data); - - PARSE_CHECK_ERROR(strtbl, "string table"); } - // parse dbi + ////////////////////////////////////////////////////////////// + //- rjf: parse dbi + // PDB_DbiParsed *dbi = 0; if(msf != 0) ProfScope("parse dbi") { String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); dbi = pdb_dbi_from_data(arena, dbi_data); - - PARSE_CHECK_ERROR(dbi, "DBI"); } - // parse tpi + ////////////////////////////////////////////////////////////// + //- rjf: parse tpi + // PDB_TpiParsed *tpi = 0; if(msf != 0) ProfScope("parse tpi") { String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi); tpi = pdb_tpi_from_data(arena, tpi_data); - - PARSE_CHECK_ERROR(tpi, "TPI"); } - // parse ipi + ////////////////////////////////////////////////////////////// + //- rjf: parse ipi + // PDB_TpiParsed *ipi = 0; if(msf != 0) ProfScope("parse ipi") { String8 ipi_data = msf_data_from_stream(msf, PDB_FixedStream_Ipi); ipi = pdb_tpi_from_data(arena, ipi_data); - - PARSE_CHECK_ERROR(ipi, "IPI"); } - // parse coff sections + ////////////////////////////////////////////////////////////// + //- rjf: parse coff sections + // PDB_CoffSectionArray *coff_sections = 0; U64 coff_section_count = 0; if(dbi != 0) ProfScope("parse coff sections") @@ -3285,85 +3359,84 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 section_data = msf_data_from_stream(msf, section_stream); coff_sections = pdb_coff_section_array_from_data(arena, section_data); coff_section_count = coff_sections->count; - - PARSE_CHECK_ERROR(coff_sections, "coff sections"); } - // parse gsi + ////////////////////////////////////////////////////////////// + //- rjf: parse gsi + // PDB_GsiParsed *gsi = 0; if(dbi != 0) ProfScope("parse gsi") { String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn); gsi = pdb_gsi_from_data(arena, gsi_data); - - PARSE_CHECK_ERROR(gsi, "GSI"); } - // parse psi + ////////////////////////////////////////////////////////////// + //- rjf: parse psi + // PDB_GsiParsed *psi_gsi_part = 0; if(dbi != 0) ProfScope("parse psi") { String8 psi_data = msf_data_from_stream(msf, dbi->psi_sn); - String8 psi_data_gsi_part = str8_range(psi_data.str + sizeof(PDB_PsiHeader), - psi_data.str + psi_data.size); + String8 psi_data_gsi_part = str8_range(psi_data.str + sizeof(PDB_PsiHeader), psi_data.str + psi_data.size); psi_gsi_part = pdb_gsi_from_data(arena, psi_data_gsi_part); - - PARSE_CHECK_ERROR(psi_gsi_part, "PSI"); } - // parse tpi hash + ////////////////////////////////////////////////////////////// + //- rjf: parse tpi hash + // PDB_TpiHashParsed *tpi_hash = 0; if(tpi != 0) ProfScope("parse tpi hash") { String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn); String8 aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); tpi_hash = pdb_tpi_hash_from_data(arena, strtbl, tpi, hash_data, aux_data); - - PARSE_CHECK_ERROR(tpi_hash, "TPI hash table"); } - // parse tpi leaves + ////////////////////////////////////////////////////////////// + //- rjf: parse tpi leaves + // CV_LeafParsed *tpi_leaf = 0; if(tpi != 0) ProfScope("parse tpi leaves") { String8 leaf_data = pdb_leaf_data_from_tpi(tpi); tpi_leaf = cv_leaf_from_data(arena, leaf_data, tpi->itype_first); - - PARSE_CHECK_ERROR(tpi_leaf, "TPI leaf data"); } - // parse ipi hash + ////////////////////////////////////////////////////////////// + //- rjf: parse ipi hash + // PDB_TpiHashParsed *ipi_hash = 0; if(ipi != 0) ProfScope("parse ipi hash") { String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn); String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); ipi_hash = pdb_tpi_hash_from_data(arena, strtbl, ipi, hash_data, aux_data); - - PARSE_CHECK_ERROR(ipi_hash, "IPI hash table"); } - // parse ipi leaves + ////////////////////////////////////////////////////////////// + //- rjf: parse ipi leaves + // CV_LeafParsed *ipi_leaf = 0; if(ipi != 0) ProfScope("parse ipi leaves") { String8 leaf_data = pdb_leaf_data_from_tpi(ipi); ipi_leaf = cv_leaf_from_data(arena, leaf_data, ipi->itype_first); - - PARSE_CHECK_ERROR(ipi_leaf, "IPI leaf data"); } - // parse sym + ////////////////////////////////////////////////////////////// + //- rjf: parse sym + // CV_SymParsed *sym = 0; if(dbi != 0) ProfScope("parse sym") { String8 sym_data = msf_data_from_stream(msf, dbi->sym_sn); sym = cv_sym_from_data(arena, sym_data, 4); - - PARSE_CHECK_ERROR(sym, "public SYM data"); } - // parse compilation units + ////////////////////////////////////////////////////////////// + //- rjf: parse compilation units + // PDB_CompUnitArray *comp_units = 0; U64 comp_unit_count = 0; if(dbi != 0) ProfScope("parse compilation units") @@ -3371,42 +3444,37 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 mod_info_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); comp_units = pdb_comp_unit_array_from_data(arena, mod_info_data); comp_unit_count = comp_units->count; - - PARSE_CHECK_ERROR(comp_units, "module info"); } - // parse dbi's section contributions + ////////////////////////////////////////////////////////////// + //- rjf: parse dbi's section contributions + // PDB_CompUnitContributionArray *comp_unit_contributions = 0; U64 comp_unit_contribution_count = 0; if(dbi != 0 && coff_sections != 0) ProfScope("parse dbi section contributions") { String8 section_contribution_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon); - comp_unit_contributions = - pdb_comp_unit_contribution_array_from_data(arena, section_contribution_data, coff_sections); + comp_unit_contributions = pdb_comp_unit_contribution_array_from_data(arena, section_contribution_data, coff_sections); comp_unit_contribution_count = comp_unit_contributions->count; - - PARSE_CHECK_ERROR(comp_unit_contributions, "module contributions"); } - // parse syms for each compilation unit + ////////////////////////////////////////////////////////////// + //- rjf: parse syms for each compilation unit + // CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed*, comp_unit_count); if(comp_units != 0) ProfScope("parse symbols") { PDB_CompUnit **unit_ptr = comp_units->units; for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1) { - CV_SymParsed *unit_sym = 0; - { - String8 sym_data = pdb_data_from_unit_range(msf, *unit_ptr, PDB_DbiCompUnitRange_Symbols); - unit_sym = cv_sym_from_data(arena, sym_data, 4); - } - PARSE_CHECK_ERROR(unit_sym, "module (i=%llu) SYM data", i); - - sym_for_unit[i] = unit_sym; + String8 sym_data = pdb_data_from_unit_range(msf, *unit_ptr, PDB_DbiCompUnitRange_Symbols); + sym_for_unit[i] = cv_sym_from_data(arena, sym_data, 4); } } - // parse c13 for each compilation unit + ////////////////////////////////////////////////////////////// + //- rjf: parse c13 for each compilation unit + // CV_C13Parsed **c13_for_unit = push_array(arena, CV_C13Parsed*, comp_unit_count); if(comp_units != 0) ProfScope("parse c13s") { @@ -3418,81 +3486,1462 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ String8 c13_data = pdb_data_from_unit_range(msf, *unit_ptr, PDB_DbiCompUnitRange_C13); unit_c13 = cv_c13_from_data(arena, c13_data, strtbl, coff_sections); } - PARSE_CHECK_ERROR(unit_c13, "module (i=%llu) C13 line info", i); - c13_for_unit[i] = unit_c13; } } - // parsing error - if(try_parse_input && !out->good_parse && - !params->hide_errors.parsing) - { - str8_list_pushf(arena, &out->errors, "error(parsing): '%S' as a PDB\n", params->input_pdb_name); - } - - // exe hash + ////////////////////////////////////////////////////////////// + //- rjf: hash exe + // U64 exe_hash = 0; - if(out->good_parse && params->input_exe_data.size > 0) ProfScope("hash exe") + if(params->input_exe_data.size > 0) ProfScope("hash exe") { exe_hash = rdi_hash(params->input_exe_data.str, params->input_exe_data.size); } - // output generation - P2R_Ctx *p2r_ctx = 0; - if(params->output_name.size > 0) + ////////////////////////////////////////////////////////////// + //- rjf: calculate EXE's max voff + // + U64 exe_voff_max = 0; + { + COFF_SectionHeader *coff_sec_ptr = coff_sections->sections; + COFF_SectionHeader *coff_ptr_opl = coff_sec_ptr + coff_section_count; + for(;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) + { + U64 sec_voff_max = coff_sec_ptr->voff + coff_sec_ptr->vsize; + exe_voff_max = Max(exe_voff_max, sec_voff_max); + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: determine architecture + // + RDI_Arch arch = RDI_Arch_NULL; + U64 arch_addr_size = 0; { - - // determine arch - RDI_Arch architecture = RDI_Arch_NULL; // TODO(rjf): in some cases, the first compilation unit has a zero // architecture, as it's sometimes used as a "nil" unit. this causes bugs // in later stages of conversion - particularly, this was detected via // busted location info. so i've converted this to a scan-until-we-find-an- - // architecture. however, this is still fundamentally insufficient, because - // Nick has informed me that x86 units can be linked with x64 units, - // meaning the appropriate architecture at any point in time is not a top- - // level concept, and is rather dependent on to which compilation unit - // particular symbols belong. so in the future, to support that (odd) case, - // we'll need to not only have this be a top-level "contextual" piece of - // info, but to use the appropriate compilation unit's architecture when - // possible. - // + // architecture. however, this may still be fundamentally insufficient, + // because Nick has informed me that x86 units can be linked with x64 + // units, meaning the appropriate architecture at any point in time is not + // a top-level concept, and is rather dependent on to which compilation + // unit particular symbols belong. so in the future, to support that (odd) + // case, we'll need to not only have this be a top-level "contextual" piece + // of info, but to use the appropriate compilation unit's architecture when + // possible. assuming, of course, that we care about supporting that case. for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) { if(sym_for_unit[comp_unit_idx] != 0) { - architecture = rdi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); - if(architecture != 0) + arch = rdi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); + if(arch != RDI_Arch_NULL) { break; } } } - U64 addr_size = rdi_addr_size_from_arch(architecture); - - - // predict symbol counts - U64 symbol_count_prediction = 0; + arch_addr_size = rdi_addr_size_from_arch(arch); + } + + ////////////////////////////////////////////////////////////// + //- rjf: produce top-level-info + // + RDIM_TopLevelInfo top_level_info = {0}; + { + top_level_info.arch = arch; + top_level_info.exe_name = params->input_exe_name; + top_level_info.exe_hash = exe_hash; + top_level_info.voff_max = exe_voff_max; + } + + ////////////////////////////////////////////////////////////// + //- rjf: build binary sections list + // + RDIM_BinarySectionList binary_sections = {0}; + ProfScope("build binary section list") + { + COFF_SectionHeader *coff_ptr = coff_sections->sections; + COFF_SectionHeader *coff_opl = coff_ptr + coff_section_count; + for(;coff_ptr < coff_opl; coff_ptr += 1) { - U64 rec_range_count = 0; - if(sym != 0) + char *name_first = (char*)coff_ptr->name; + char *name_opl = name_first + sizeof(coff_ptr->name); + RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections); + sec->name = str8_cstring_capped(name_first, name_opl); + sec->flags = rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); + sec->voff_first = coff_ptr->voff; + sec->voff_opl = coff_ptr->voff+coff_ptr->vsize; + sec->foff_first = coff_ptr->foff; + sec->foff_opl = coff_ptr->foff+coff_ptr->fsize; + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: build unit array + // + RDIM_UnitArray units = {0}; + ProfScope("build unit array") + { + //- rjf: allocate + units.count = comp_unit_count; + units.v = push_array(arena, RDIM_Unit, units.count); + + //- rjf: pass 1: fill basic per-unit info & line info + for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) + { + PDB_CompUnit *pdb_unit = comp_units->units[comp_unit_idx]; + CV_SymParsed *pdb_unit_sym = sym_for_unit[comp_unit_idx]; + CV_C13Parsed *pdb_unit_c13 = c13_for_unit[comp_unit_idx]; + + //- rjf: produce unit name + String8 unit_name = pdb_unit->obj_name; + if(unit_name.size != 0) { - rec_range_count += sym->sym_ranges.count; + String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); + if(unit_name_past_last_slash.size != 0) + { + unit_name = unit_name_past_last_slash; + } } - for(U64 i = 0; i < comp_unit_count; i += 1) + + //- rjf: produce obj name + String8 obj_name = pdb_unit->obj_name; + if(str8_match(obj_name, str8_lit("* Linker *"), 0) || + str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) { - CV_SymParsed *unit_sym = sym_for_unit[i]; - rec_range_count += unit_sym->sym_ranges.count; + MemoryZeroStruct(&obj_name); } - symbol_count_prediction = rec_range_count/8; - if(symbol_count_prediction < 128) + + //- rjf: fill basic output unit info + RDIM_Unit *dst_unit = &units.v[comp_unit_idx]; + dst_unit->unit_name = unit_name; + dst_unit->compiler_name = pdb_unit_sym->info.compiler_name; + dst_unit->object_file = obj_name; + dst_unit->archive_file = pdb_unit->group_name; + dst_unit->language = rdi_language_from_cv_language(sym->info.language); + + //- rjf: fill unit line info + for(CV_C13SubSectionNode *node = pdb_unit_c13->first_sub_section; + node != 0; + node = node->next) { - symbol_count_prediction = 128; + if(node->kind == CV_C13_SubSectionKind_Lines) + { + for(CV_C13LinesParsedNode *lines_n = node->lines_first; + lines_n != 0; + lines_n = lines_n->next) + { + CV_C13LinesParsed *lines = &lines_n->v; + RDIM_LineSequence *seq = rdim_line_sequence_list_push(arena, &dst_unit->line_sequences); + seq->file_name = lines->file_name; + seq->voffs = lines->voffs; + seq->line_nums = lines->line_nums; + seq->col_nums = lines->col_nums; + seq->line_count = lines->line_count; + } + } } } + //- rjf: pass 2: build per-unit voff ranges from comp unit contributions table + PDB_CompUnitContribution *contrib_ptr = comp_unit_contributions->contributions; + PDB_CompUnitContribution *contrib_opl = contrib_ptr + comp_unit_contribution_count; + for(;contrib_ptr < contrib_opl; contrib_ptr += 1) + { + if(contrib_ptr->mod < comp_unit_count) + { + RDIM_Unit *unit = &units.v[contrib_ptr->mod]; + RDIM_Rng1U64 range = {contrib_ptr->voff_first, contrib_ptr->voff_opl}; + rdim_rng1u64_list_push(arena, &unit->voff_ranges, range); + } + } + } + + ////////////////////////////// + //- rjf: predict symbol count + // + U64 symbol_count_prediction = 0; + ProfScope("predict symbol count") + { + U64 rec_range_count = 0; + if(sym != 0) + { + rec_range_count += sym->sym_ranges.count; + } + for(U64 i = 0; i < comp_unit_count; i += 1) + { + CV_SymParsed *unit_sym = sym_for_unit[i]; + rec_range_count += unit_sym->sym_ranges.count; + } + symbol_count_prediction = rec_range_count/8; + if(symbol_count_prediction < 128) + { + symbol_count_prediction = 128; + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 0: produce type forward resolution map + // + U64 type_fwd_map_count = 0; + CV_TypeId *type_fwd_map = 0; + ProfScope("types pass 0: produce type forward resolution map") + { + CV_TypeId itype_first = tpi_leaf->itype_first; + CV_TypeId itype_opl = tpi_leaf->itype_opl; + type_fwd_map_count = (U64)(itype_opl-itype_first); + type_fwd_map = push_array(arena, CV_TypeId, type_fwd_map_count); + for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) + { + //- rjf: determine if this itype resolves to another + CV_TypeId itype_fwd = 0; + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: CLASS/STRUCTURE + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + // rjf: unpack leaf + CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_struct->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && + ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + // rjf: unpack leaf + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_struct->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && + ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + // rjf: unpack leaf + CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_union + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves tos + if(lf_union->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_union->props & CV_TypeProp_Scoped) != 0) && + ((lf_union->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + // rjf: unpack leaf + CV_LeafEnum *lf_enum = (CV_LeafEnum*)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf_enum + 1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_enum->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_enum->props & CV_TypeProp_Scoped) != 0) && + ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + } + } + + //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map + if(itype_fwd != 0 && itype_first <= itype_fwd && itype_fwd < itype_opl) + { + type_fwd_map[itype-itype_first] = itype_fwd; + } + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 1: construct all root/stub types from TPI + // + // this does NOT gather the following information, which is done by + // subsequent passes, as they all require full resolution of all itypes first + // (to allow for early itypes to reference later itypes): + // + // - function/method type parameters + // - modifier byte sizes + // - bitfield direct type byte sizes + // - struct/class/union members + // - array counts + // - direct type forward resolution + // + typedef struct P2R_TypeIdRevisitTask P2R_TypeIdRevisitTask; + struct P2R_TypeIdRevisitTask + { + P2R_TypeIdRevisitTask *next; + RDIM_Type *base_type; + CV_TypeId field_itype; + CV_TypeId this_itype; + }; + P2R_TypeIdRevisitTask *first_itype_revisit_task = 0; + P2R_TypeIdRevisitTask *last_itype_revisit_task = 0; + RDIM_TypeArray itype_types = {0}; // root type for per-TPI-itype + RDIM_TypeChunkList extra_types = {0}; // extra supplementary types we build, which do not have any itypes + ProfScope("types pass 1: construct all root/stub types from TPI") + { + RDI_U64 extra_types_chunk_cap = 1024; + CV_TypeId itype_first = tpi_leaf->itype_first; + CV_TypeId itype_opl = tpi_leaf->itype_opl; + itype_types.count = (U64)(itype_opl-itype_first); + itype_types.v = push_array(arena, RDIM_Type, itype_types.count); +#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) + for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) + { + RDIM_Type *dst_type = &itype_types.v[itype-itype_first]; + B32 itype_is_basic = (itype < 0x1000); + + ////////////////////////// + //- rjf: build basic type + // + if(itype_is_basic) + { + // rjf: unpack itype + CV_BasicPointerKind cv_basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); + CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); + + // rjf: get basic type slot, fill if unfilled + RDIM_Type *basic_type = &itype_types.v[cv_basic_type_code-itype_first]; + if(basic_type->kind == RDI_TypeKind_NULL) + { + RDI_TypeKind type_kind = rdi_type_kind_from_cv_basic_type(cv_basic_type_code); + U32 byte_size = rdi_size_from_basic_type_kind(type_kind); + if(byte_size == 0xffffffff) + { + byte_size = arch_addr_size; + } + basic_type->kind = type_kind; + basic_type->name = cv_type_name_from_basic_type(cv_basic_type_code); + basic_type->byte_size = byte_size; + } + + // rjf: nonzero ptr kind -> form ptr type to basic tpye + if(cv_basic_ptr_kind != 0) + { + dst_type->kind = RDI_TypeKind_Ptr; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = basic_type; + } + } + + ////////////////////////// + //- rjf: build non-basic type + // + if(!itype_is_basic) + { + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: + { + // rjf: unpack leaf + CV_LeafModifier *modifier = (CV_LeafModifier *)itype_leaf_first; + + // rjf: cv -> rdi flags + RDI_TypeModifierFlags flags = 0; + if(modifier->flags & CV_ModifierFlag_Const) {flags |= RDI_TypeModifierFlag_Const;} + if(modifier->flags & CV_ModifierFlag_Volatile) {flags |= RDI_TypeModifierFlag_Volatile;} + + // rjf: fill type + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = flags; + dst_type->direct_type = p2r_type_ptr_from_itype(modifier->itype); + }break; + + //- rjf: POINTER + case CV_LeafKind_POINTER: + { + // TODO(rjf): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead + + // rjf: unpack leaf + CV_LeafPointer *pointer = (CV_LeafPointer *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(pointer->itype); + CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(pointer->attribs); + CV_PointerMode ptr_mode = CV_PointerAttribs_ExtractMode(pointer->attribs); + U32 ptr_size = CV_PointerAttribs_ExtractSize(pointer->attribs); + + // rjf: cv -> rdi modifier flags + RDI_TypeModifierFlags modifier_flags = 0; + if(pointer->attribs & CV_PointerAttrib_Const) {modifier_flags |= RDI_TypeModifierFlag_Const;} + if(pointer->attribs & CV_PointerAttrib_Volatile) {modifier_flags |= RDI_TypeModifierFlag_Volatile;} + + // rjf: cv info -> rdi pointer type kind + RDI_TypeKind type_kind = RDI_TypeKind_Ptr; + { + if(pointer->attribs & CV_PointerAttrib_LRef) + { + type_kind = RDI_TypeKind_LRef; + } + else if(pointer->attribs & CV_PointerAttrib_RRef) + { + type_kind = RDI_TypeKind_RRef; + } + if(ptr_mode == CV_PointerMode_LRef) + { + type_kind = RDI_TypeKind_LRef; + } + else if(ptr_mode == CV_PointerMode_RRef) + { + type_kind = RDI_TypeKind_RRef; + } + } + + // rjf: fill type + if(modifier_flags != 0) + { + RDIM_Type *pointer_type = rdim_type_chunk_list_push(arena, &extra_types, extra_types_chunk_cap); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = modifier_flags; + dst_type->direct_type = pointer_type; + pointer_type->kind = type_kind; + pointer_type->byte_size = arch_addr_size; + pointer_type->direct_type = direct_type; + } + else + { + dst_type->kind = type_kind; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = direct_type; + } + + // rjf: push revisit task for full byte size of modifier type + if(modifier_flags != 0) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + } + }break; + + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: + { + // TODO(rjf): handle call_kind & attribs + + // rjf: unpack leaf + CV_LeafProcedure *procedure = (CV_LeafProcedure *)itype_leaf_first; + RDIM_Type *ret_type = p2r_type_ptr_from_itype(procedure->ret_itype); + + // rjf: fill type + dst_type->kind = RDI_TypeKind_Function; + dst_type->byte_size = arch_addr_size; + dst_type->count = procedure->arg_count; + dst_type->direct_type = ret_type; + + // rjf: push revisit task for parameters + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = procedure->arg_itype; + }break; + + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: + { + // TODO(rjf): handle call_kind & attribs + // TODO(rjf): preserve "this_adjust" + + // rjf: unpack leaf + CV_LeafMFunction *mfunction = (CV_LeafMFunction *)itype_leaf_first; + RDIM_Type *ret_type = p2r_type_ptr_from_itype(mfunction->ret_itype); + + // rjf: fill type + dst_type->kind = (mfunction->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function; + dst_type->byte_size = arch_addr_size; + dst_type->count = mfunction->arg_count; + dst_type->direct_type = ret_type; + + // rjf: push revisit task for parameters/this + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = mfunction->arg_itype; + t->this_itype = mfunction->this_itype; + }break; + + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: + { + // rjf: unpack leaf + CV_LeafBitField *bit_field = (CV_LeafBitField *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(bit_field->itype); + + // rjf: fill type + dst_type->kind = RDI_TypeKind_Bitfield; + dst_type->off = bit_field->pos; + dst_type->count = bit_field->len; + dst_type->direct_type = direct_type; + + // rjf: push revisit task for byte size + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + }break; + + //- rjf: ARRAY + case CV_LeafKind_ARRAY: + { + // rjf: unpack leaf + CV_LeafArray *array = (CV_LeafArray *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(array->entry_itype); + U8 *numeric_ptr = (U8*)(array + 1); + CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 full_size = cv_u64_from_numeric(&array_count); + + // rjf: fill type + dst_type->kind = RDI_TypeKind_Array; + dst_type->direct_type = direct_type; + dst_type->byte_size = full_size; + + // rjf: push revisit task for full count + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + }break; + + //- rjf: CLASS/STRUCTURE + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + if(lf_struct->props & CV_TypeProp_FwdRef) + { + dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); + dst_type->name = name; + } + else + { + dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct); + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + + // rjf: push revisit task for members + if(!(lf_struct->props & CV_TypeProp_FwdRef)) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = lf_struct->field_itype; + } + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + if(lf_struct->props & CV_TypeProp_FwdRef) + { + dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); + dst_type->name = name; + } + else + { + dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct); + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + + // rjf: push revisit task for members + if(!(lf_struct->props & CV_TypeProp_FwdRef)) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = lf_struct->field_itype; + } + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf_union + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + if(lf_union->props & CV_TypeProp_FwdRef) + { + dst_type->kind = RDI_TypeKind_IncompleteUnion; + dst_type->name = name; + } + else + { + dst_type->kind = RDI_TypeKind_Union; + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + + // rjf: push revisit task for members + if(!(lf_union->props & CV_TypeProp_FwdRef)) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = lf_union->field_itype; + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafEnum *lf_enum = (CV_LeafEnum *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf_enum->base_itype); + U8 *name_ptr = (U8 *)(lf_enum + 1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + if(lf_enum->props & CV_TypeProp_FwdRef) + { + dst_type->kind = RDI_TypeKind_IncompleteEnum; + dst_type->name = name; + } + else + { + dst_type->kind = RDI_TypeKind_Enum; + dst_type->direct_type = direct_type; + dst_type->name = name; + } + + // rjf: push revisit task for enumerates/size + if(!(lf_enum->props & CV_TypeProp_FwdRef)) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = lf_enum->field_itype; + } + }break; + } + } + } + } +#undef p2r_type_ptr_from_itype + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 2: attach cross-itype-relationship data to all types, build UDTs + // + // given the root/stub types for all itypes, this pass takes care of the + // following extra pieces of per-type information: + // + // - function/method type parameters + // - modifier byte sizes + // - bitfield direct type byte sizes + // - struct/class/union members + // - array counts + // - direct type forward resolution + // + RDIM_UDTChunkList udts = {0}; + ProfScope("types pass 2: attach cross-itype-relationship data to all types, build UDTs") + { + RDI_U64 udts_chunk_cap = 1024; + CV_TypeId itype_first = tpi_leaf->itype_first; + CV_TypeId itype_opl = tpi_leaf->itype_opl; +#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) + for(P2R_TypeIdRevisitTask *task = first_itype_revisit_task; task != 0; task = task->next) + { + RDIM_Type *dst_type = task->base_type; + switch(dst_type->kind) + { + default:{}break; + + //////////////////////// + //- rjf: bitfields/modifiers -> calculate byte size + // + case RDI_TypeKind_Bitfield: + case RDI_TypeKind_Modifier: + if(dst_type->direct_type != 0) + { + dst_type->byte_size = dst_type->direct_type->byte_size; + }break; + + //////////////////////// + //- rjf: functions -> equip parameters + // + case RDI_TypeKind_Function: + { + // rjf: unpack arglist range + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[task->field_itype-itype_first]; + if(range->hdr.kind != CV_LeafKind_ARGLIST || + range->hdr.size<2 || + range->off + range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + range->off + 2; + U8 *arglist_opl = arglist_first+range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: build param type array + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count); + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + params[idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + } + + // rjf: fill dst type + dst_type->count = arglist_itypes_count; + dst_type->param_types = params; + }break; + + //////////////////////// + //- rjf: methods -> equip this ptr + parameters + // + case RDI_TypeKind_Method: + { + // rjf: unpack arglist range + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[task->field_itype-itype_first]; + if(range->hdr.kind != CV_LeafKind_ARGLIST || + range->hdr.size<2 || + range->off + range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + range->off + 2; + U8 *arglist_opl = arglist_first+range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: build param type array + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count+1); + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + params[idx+1] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + } + params[0] = p2r_type_ptr_from_itype(task->this_itype); + + // rjf: fill dst type + dst_type->count = arglist_itypes_count+1; + dst_type->param_types = params; + }break; + + //////////////////////// + //- rjf: arrays -> calculate array count based on direct type size + // + case RDI_TypeKind_Array: + if(dst_type->direct_type != 0) + { + dst_type->count = dst_type->byte_size/dst_type->direct_type->byte_size; + }break; + + //////////////////////// + //- rjf: structs/unions/classes -> equip members + // + case RDI_TypeKind_Struct: + case RDI_TypeKind_Union: + case RDI_TypeKind_Class: + { + //- rjf: grab UDT info + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, &udts, udts_chunk_cap); + dst_udt->self_type = dst_type; + } + + //- rjf: gather all fields + typedef struct FieldListTask FieldListTask; + struct FieldListTask + { + FieldListTask *next; + CV_TypeId itype; + }; + FieldListTask start_fl_task = {0, task->field_itype}; + FieldListTask *fl_todo_stack = &start_fl_task; + FieldListTask *fl_done_stack = 0; + for(;fl_todo_stack != 0;) + { + //- rjf: take & unpack task + FieldListTask *fl_task = fl_todo_stack; + SLLStackPop(fl_todo_stack); + SLLStackPush(fl_done_stack, fl_task); + CV_TypeId field_list_itype = fl_task->itype; + + //- rjf: skip bad itypes + if(field_list_itype < itype_first || itype_opl <= field_list_itype) + { + continue; + } + + //- rjf: field list itype -> range + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-itype_first]; + + //- rjf: skip bad headers + if(range->off+range->hdr.size > tpi_leaf->data.size || + range->hdr.size < 2 || + range->hdr.kind != CV_LeafKind_FIELDLIST) + { + continue; + } + + //- rjf: loop over all fields + { + U8 *field_list_first = tpi_leaf->data.str+range->off+2; + U8 *field_list_opl = field_list_first+range->hdr.size-2; + for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; + read_ptr < field_list_opl; + read_ptr = next_read_ptr) + { + // rjf: unpack field + CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; + U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); + U8 *field_leaf_first = read_ptr+2; + U8 *field_leaf_opl = field_leaf_first+field_leaf_header_size; + next_read_ptr = field_leaf_opl; + + // rjf: skip out-of-bounds fields + if(field_leaf_opl > field_list_opl) + { + continue; + } + + // rjf: process field + switch(field_kind) + { + //- rjf: unhandled/invalid cases + default: + { + // TODO(rjf): log + }break; + + //- rjf: INDEX + case CV_LeafKind_INDEX: + { + // rjf: unpack leaf + CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; + CV_TypeId new_itype = lf->itype; + + // rjf: determine if index itype is new + B32 is_new = 1; + for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) + { + if(t->itype == new_itype) + { + is_new = 0; + break; + } + } + + // rjf: if new -> push task to follow new itype + if(is_new) + { + FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); + SLLStackPush(fl_todo_stack, new_task); + new_task->itype = new_itype; + } + }break; + + //- rjf: MEMBER + case CV_LeafKind_MEMBER: + { + // TODO(rjf): log on bad offset + + // rjf: unpack leaf + CV_LeafMember *lf = (CV_LeafMember *)field_leaf_first; + U8 *offset_ptr = (U8 *)(lf+1); + CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); + U64 offset64 = cv_u64_from_numeric(&offset); + U8 *name_ptr = offset_ptr + offset.encoded_size; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_DataField; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + mem->off = (U32)offset64; + }break; + + //- rjf: STMEMBER + case CV_LeafKind_STMEMBER: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafStMember *lf = (CV_LeafStMember *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_StaticData; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: METHOD + case CV_LeafKind_METHOD: + { + // rjf: unpack leaf + CV_LeafMethod *lf = (CV_LeafMethod *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + //- rjf: method list itype -> range + CV_RecRange *method_list_range = &tpi_leaf->leaf_ranges.ranges[lf->list_itype-itype_first]; + + //- rjf: skip bad method lists + if(method_list_range->off+method_list_range->hdr.size > tpi_leaf->data.size || + method_list_range->hdr.size < 2 || + method_list_range->hdr.kind != CV_LeafKind_METHODLIST) + { + break; + } + + //- rjf: loop through all methods & emit members + U8 *method_list_first = tpi_leaf->data.str + method_list_range->off + 2; + U8 *method_list_opl = method_list_first + method_list_range->hdr.size-2; + for(U8 *method_read_ptr = method_list_first, *next_method_read_ptr = method_list_opl; + method_read_ptr < method_list_opl; + method_read_ptr = next_method_read_ptr) + { + CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)method_read_ptr; + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); + RDIM_Type *method_type = p2r_type_ptr_from_itype(method->itype); + next_method_read_ptr = (U8 *)(method+1); + + // TODO(allen): PROBLEM + // We only get offsets for virtual functions (the "vbaseoff") from + // "Intro" and "PureIntro". In C++ inheritance, when we have a chain + // of inheritance (let's just talk single inheritance for now) the + // first class in the chain that introduces a new virtual function + // has this "Intro" method. If a later class in the chain redefines + // the virtual function it only has a "Virtual" method which does + // not update the offset. There is a "Virtual" and "PureVirtual" + // variant of "Virtual". The "Pure" in either case means there + // is no concrete procedure. When there is no "Pure" the method + // should have a corresponding procedure symbol id. + // + // The issue is we will want to mark all of our virtual methods as + // virtual and give them an offset, but that means we have to do + // some extra figuring to propogate offsets from "Intro" methods + // to "Virtual" methods in inheritance trees. That is - IF we want + // to start preserving the offsets of virtuals. There is room in + // the method struct to make this work, but for now I've just + // decided to drop this information. It is not urgently useful to + // us and greatly complicates matters. + + // rjf: read vbaseoff + U32 vbaseoff = 0; + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + if(next_method_read_ptr+4 <= method_list_opl) + { + vbaseoff = *(U32 *)next_method_read_ptr; + } + next_method_read_ptr += 4; + } + + // rjf: emit method + switch(prop) + { + default: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_Method; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Static: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_StaticMethod; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Virtual: + case CV_MethodProp_PureVirtual: + case CV_MethodProp_Intro: + case CV_MethodProp_PureIntro: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_VirtualMethod; + mem->name = name; + mem->type = method_type; + }break; + } + } + + }break; + + //- rjf: ONEMETHOD + case CV_LeafKind_ONEMETHOD: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafOneMethod *lf = (CV_LeafOneMethod *)field_leaf_first; + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(lf->attribs); + U8 *vbaseoff_ptr = (U8 *)(lf+1); + U8 *vbaseoff_opl_ptr = vbaseoff_ptr; + U32 vbaseoff = 0; + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + vbaseoff = *(U32 *)(vbaseoff_ptr); + vbaseoff_opl_ptr += sizeof(U32); + } + U8 *name_ptr = vbaseoff_opl_ptr; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + RDIM_Type *method_type = p2r_type_ptr_from_itype(lf->itype); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit method + switch(prop) + { + default: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_Method; + mem->name = name; + mem->type = method_type; + }break; + + case CV_MethodProp_Static: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_StaticMethod; + mem->name = name; + mem->type = method_type; + }break; + + case CV_MethodProp_Virtual: + case CV_MethodProp_PureVirtual: + case CV_MethodProp_Intro: + case CV_MethodProp_PureIntro: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_VirtualMethod; + mem->name = name; + mem->type = method_type; + }break; + } + }break; + + //- rjf: NESTTYPE + case CV_LeafKind_NESTTYPE: + { + // rjf: unpack leaf + CV_LeafNestType *lf = (CV_LeafNestType *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_NestedType; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: NESTTYPEEX + case CV_LeafKind_NESTTYPEEX: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafNestTypeEx *lf = (CV_LeafNestTypeEx *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_NestedType; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: BCLASS + case CV_LeafKind_BCLASS: + { + // TODO(rjf): log on bad offset + + // rjf: unpack leaf + CV_LeafBClass *lf = (CV_LeafBClass *)field_leaf_first; + U8 *offset_ptr = (U8 *)(lf+1); + CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); + U64 offset64 = cv_u64_from_numeric(&offset); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = offset_ptr+offset.encoded_size; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_Base; + mem->type = p2r_type_ptr_from_itype(lf->itype); + mem->off = (U32)offset64; + }break; + + //- rjf: VBCLASS/IVBCLASS + case CV_LeafKind_VBCLASS: + case CV_LeafKind_IVBCLASS: + { + // TODO(rjf): log on bad offsets + // TODO(rjf): handle attribs + // TODO(rjf): offsets? + + // rjf: unpack leaf + CV_LeafVBClass *lf = (CV_LeafVBClass *)field_leaf_first; + U8 *num1_ptr = (U8 *)(lf+1); + CV_NumericParsed num1 = cv_numeric_from_data_range(num1_ptr, field_leaf_opl); + U8 *num2_ptr = num1_ptr + num1.encoded_size; + CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + mem->kind = RDI_MemberKind_VirtualBase; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: VFUNCTAB + case CV_LeafKind_VFUNCTAB: + { + CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first; + // NOTE(rjf): currently no-op this case + (void)lf; + }break; + } + + // rjf: align-up next field + next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); + } + } + } + }break; + + //////////////////////// + //- rjf: enums -> equip enumerates + // + case RDI_TypeKind_Enum: + { + //- rjf: grab UDT info + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, &udts, udts_chunk_cap); + dst_udt->self_type = dst_type; + } + + //- rjf: gather all fields + typedef struct FieldListTask FieldListTask; + struct FieldListTask + { + FieldListTask *next; + CV_TypeId itype; + }; + FieldListTask start_fl_task = {0, task->field_itype}; + FieldListTask *fl_todo_stack = &start_fl_task; + FieldListTask *fl_done_stack = 0; + for(;fl_todo_stack != 0;) + { + //- rjf: take & unpack task + FieldListTask *fl_task = fl_todo_stack; + SLLStackPop(fl_todo_stack); + SLLStackPush(fl_done_stack, fl_task); + CV_TypeId field_list_itype = fl_task->itype; + + //- rjf: skip bad itypes + if(field_list_itype < itype_first || itype_opl <= field_list_itype) + { + continue; + } + + //- rjf: field list itype -> range + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-itype_first]; + + //- rjf: skip bad headers + if(range->off+range->hdr.size > tpi_leaf->data.size || + range->hdr.size < 2 || + range->hdr.kind != CV_LeafKind_FIELDLIST) + { + continue; + } + + //- rjf: loop over all fields + { + U8 *field_list_first = tpi_leaf->data.str+range->off+2; + U8 *field_list_opl = field_list_first+range->hdr.size-2; + for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; + read_ptr < field_list_opl; + read_ptr = next_read_ptr) + { + // rjf: unpack field + CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; + U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); + U8 *field_leaf_first = read_ptr+2; + U8 *field_leaf_opl = field_leaf_first+field_leaf_header_size; + next_read_ptr = field_leaf_opl; + + // rjf: skip out-of-bounds fields + if(field_leaf_opl > field_list_opl) + { + continue; + } + + // rjf: process field + switch(field_kind) + { + //- rjf: unhandled/invalid cases + default: + { + // TODO(rjf): log + }break; + + //- rjf: INDEX + case CV_LeafKind_INDEX: + { + // rjf: unpack leaf + CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; + CV_TypeId new_itype = lf->itype; + + // rjf: determine if index itype is new + B32 is_new = 1; + for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) + { + if(t->itype == new_itype) + { + is_new = 0; + break; + } + } + + // rjf: if new -> push task to follow new itype + if(is_new) + { + FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); + SLLStackPush(fl_todo_stack, new_task); + new_task->itype = new_itype; + } + }break; + + //- rjf: ENUMERATE + case CV_LeafKind_ENUMERATE: + { + // TODO(rjf): attribs + + // rjf: unpack leaf + CV_LeafEnumerate *lf = (CV_LeafEnumerate *)field_leaf_first; + U8 *val_ptr = (U8 *)(lf+1); + CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, field_leaf_opl); + U64 val64 = cv_u64_from_numeric(&val); + U8 *name_ptr = val_ptr + val.encoded_size; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, dst_udt); + enum_val->name = name; + enum_val->val = val64; + }break; + } + + // rjf: align-up next field + next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); + } + } + } + }break; + } + } +#undef p2r_type_ptr_from_itype + } + + ////////////////////////////////////////////////////////////// + //- rjf: produce link name map + // + P2R_LinkNameMap link_name_map = {0}; + ProfScope("produce link name map") + { + link_name_map.buckets_count = symbol_count_prediction; + link_name_map.buckets = push_array(arena, P2R_LinkNameNode *, link_name_map.buckets_count); + CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: unpack symbol range info + CV_SymKind kind = rec_range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_sym_kind(kind); + U8 *sym_first = sym->data.str + rec_range->off + 2; + U8 *sym_opl = sym_first + rec_range->hdr.size; + + //- rjf: skip bad ranges + if(sym_opl > sym->data.str + sym->data.size || sym_first + header_struct_size > sym->data.str + sym->data.size) + { + continue; + } + + //- rjf: consume symbol + switch(kind) + { + default:{}break; + case CV_SymKind_PUB32: + { + // rjf: unpack sym + CV_SymPub32 *pub32 = (CV_SymPub32 *)sym_first; + String8 name = str8_cstring_capped(pub32+1, sym_opl); + COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= coff_sections->count) ? &coff_sections->sections[pub32->sec-1] : 0; + U64 voff = 0; + if(section != 0) + { + voff = section->voff + pub32->off; + } + + // rjf: commit to link name map + U64 hash = (voff >> 3) ^ ((7 & voff) << 6); + U64 bucket_idx = hash%link_name_map.buckets_count; + P2R_LinkNameNode *node = push_array(arena, P2R_LinkNameNode, 1); + SLLStackPush(link_name_map.buckets[bucket_idx], node); + node->voff = voff; + node->name = name; + link_name_map.link_name_count += 1; + link_name_map.bucket_collision_count += (node->next != 0); + }break; + } + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: produce all symbols for all units + // + ProfScope("produce all symbols for all units") + { + } + + + //~ TODO(rjf): OLD vvvvvvvvvvvvvvvvvvv +#if 0 + + // output generation + P2R_Ctx *p2r_ctx = 0; + if(params->output_name.size > 0) + { // setup root RDIM_RootParams root_params = {0}; root_params.addr_size = addr_size; @@ -3673,11 +5122,11 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ // conversion errors if(!params->hide_errors.converting) { - for(RDIM_Error *error = rdim_first_error_from_root(root); - error != 0; - error = error->next) + for(RDIM_Msg *msg = rdim_first_msg_from_root(root); + msg != 0; + msg = msg->next) { - str8_list_push(arena, &out->errors, error->msg); + str8_list_push(arena, &out->errors, msg->string); } } } @@ -3916,5 +5365,8 @@ str8_list_pushf(arena, &out->errors, fmt, __VA_ARGS__);\ out->dump = dump; } +#endif + + scratch_end(scratch); return out; } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 42f382fa..308b5118 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -222,6 +222,9 @@ internal RDI_BinarySectionFlags rdi_binary_section_flags_from_coff_section_flags internal RDI_Arch rdi_arch_from_cv_arch(CV_Arch arch); internal RDI_RegisterCode rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code); internal RDI_Language rdi_language_from_cv_language(CV_Language language); +internal RDI_TypeKind rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); + +#if 0 //////////////////////////////// //~ rjf: Conversion Implementation Helpers @@ -327,6 +330,8 @@ internal void p2r_link_name_save(Arena *arena, P2R_LinkNameMap *map, U64 voff, String8 name); internal String8 p2r_link_name_find(P2R_LinkNameMap *map, U64 voff); +#endif + //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point From a9c5ec88780d35c26d9d0d5958742bff6bf7a7a2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 15 Feb 2024 12:00:02 -0800 Subject: [PATCH 067/275] symbol conversion passes in new converter --- src/lib_raddbgi_make/raddbgi_make.c | 89 ++- src/lib_raddbgi_make/raddbgi_make.h | 21 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 881 +++++++++++++++++++++++- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 39 ++ 4 files changed, 1008 insertions(+), 22 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 0a5c495d..6e092c64 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -408,6 +408,10 @@ rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r n->v = r; RDIM_SLLQueuePush(list->first, list->last, n); list->count += 1; + if(list->count == 1 || r.min < list->min) + { + list->min = r.min; + } } //- rjf: u64 -> ptr map @@ -532,7 +536,7 @@ rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list) { n = rdim_push_array(arena, RDIM_UnitChunkNode, 1); n->cap = 512; - n->v = rdim_push_array_no_zero(arena, RDIM_Unit, n->cap); + n->v = rdim_push_array(arena, RDIM_Unit, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } @@ -556,7 +560,7 @@ rdim_unit_array_from_chunk_list(RDIM_Arena *arena, RDIM_UnitChunkList *list) { RDIM_UnitArray array = {0}; array.count = list->total_count; - array.v = rdim_push_array_no_zero(arena, RDIM_Unit, array.count); + array.v = rdim_push_array(arena, RDIM_Unit, array.count); U64 idx = 0; for(RDIM_UnitChunkNode *n = list->first; n != 0; n = n->next) { @@ -577,7 +581,7 @@ rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 c { n = rdim_push_array(arena, RDIM_TypeChunkNode, 1); n->cap = cap; - n->v = rdim_push_array_no_zero(arena, RDIM_Type, n->cap); + n->v = rdim_push_array(arena, RDIM_Type, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } @@ -595,7 +599,7 @@ rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap { n = rdim_push_array(arena, RDIM_UDTChunkNode, 1); n->cap = cap; - n->v = rdim_push_array_no_zero(arena, RDIM_UDT, n->cap); + n->v = rdim_push_array(arena, RDIM_UDT, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } @@ -717,7 +721,7 @@ rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U { n = rdim_push_array(arena, RDIM_SymbolChunkNode, 1); n->cap = cap; - n->v = rdim_push_array_no_zero(arena, RDIM_Symbol, n->cap); + n->v = rdim_push_array(arena, RDIM_Symbol, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } @@ -738,7 +742,7 @@ rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 { n = rdim_push_array(arena, RDIM_ScopeChunkNode, 1); n->cap = cap; - n->v = rdim_push_array_no_zero(arena, RDIM_Scope, n->cap); + n->v = rdim_push_array(arena, RDIM_Scope, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } @@ -748,6 +752,79 @@ rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 return result; } +RDI_PROC RDIM_Local * +rdim_scope_push_local(RDIM_Arena *arena, RDIM_Scope *scope) +{ + RDIM_Local *local = rdim_push_array(arena, RDIM_Local, 1); + RDIM_SLLQueuePush(scope->first_local, scope->last_local, local); + scope->local_count += 1; + return local; +} + +//////////////////////////////// +//~ rjf: Location Info Building + +//- rjf: individual locations + +RDI_PROC RDIM_Location * +rdim_push_location_addr_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_AddrBytecodeStream; + result->bytecode = *bytecode; + return result; +} + +RDI_PROC RDIM_Location * +rdim_push_location_val_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_ValBytecodeStream; + result->bytecode = *bytecode; + return result; +} + +RDI_PROC RDIM_Location * +rdim_push_location_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_AddrRegisterPlusU16; + result->register_code = reg_code; + result->offset = offset; + return result; +} + +RDI_PROC RDIM_Location * +rdim_push_location_addr_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_AddrAddrRegisterPlusU16; + result->register_code = reg_code; + result->offset = offset; + return result; +} + +RDI_PROC RDIM_Location * +rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg_code) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_ValRegister; + result->register_code = reg_code; + return result; +} + +//- rjf: location sets + +RDI_PROC void +rdim_location_set_push_case(RDIM_Arena *arena, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location) +{ + RDIM_LocationCase *location_case = rdim_push_array(arena, RDIM_LocationCase, 1); + SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); + locset->location_case_count += 1; + location_case->voff_range = voff_range; + location_case->location = location; +} + #if 0 //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index cf611926..8d64b762 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -304,6 +304,7 @@ struct RDIM_Rng1U64List RDIM_Rng1U64Node *first; RDIM_Rng1U64Node *last; RDI_U64 count; + RDI_U64 min; }; //- rjf: u64 -> pointer map @@ -627,8 +628,7 @@ typedef struct RDIM_LocationCase RDIM_LocationCase; struct RDIM_LocationCase { RDIM_LocationCase *next; - RDI_U64 voff_first; - RDI_U64 voff_opl; + RDIM_Rng1U64 voff_range; RDIM_Location *location; }; @@ -695,7 +695,7 @@ struct RDIM_Local RDI_LocalKind kind; RDIM_String8 name; RDIM_Type *type; - RDIM_LocationSet *locset; + RDIM_LocationSet locset; }; typedef struct RDIM_Scope RDIM_Scope; @@ -706,7 +706,6 @@ struct RDIM_Scope RDIM_Scope *first_child; RDIM_Scope *last_child; RDIM_Scope *next_sibling; - RDI_U64 voff_base; RDIM_Rng1U64List voff_ranges; RDIM_Local *first_local; RDIM_Local *last_local; @@ -1216,6 +1215,20 @@ RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_Symbol //~ rjf: Scope Info Building RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap); +RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_Scope *scope); + +//////////////////////////////// +//~ rjf: Location Info Building + +//- rjf: individual locations +RDI_PROC RDIM_Location *rdim_push_location_addr_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode); +RDI_PROC RDIM_Location *rdim_push_location_val_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode); +RDI_PROC RDIM_Location *rdim_push_location_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset); +RDI_PROC RDIM_Location *rdim_push_location_addr_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset); +RDI_PROC RDIM_Location *rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg_code); + +//- rjf: location sets +RDI_PROC void rdim_location_set_push_case(RDIM_Arena *arena, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location); #if 0 diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 0b2f23a1..b96ccaef 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1,6 +1,30 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +p2r_end_of_cplusplus_container_name(String8 str) +{ + // NOTE: This finds the index one past the last "::" contained in str. + // if no "::" is contained in str, then the returned index is 0. + // The intent is that [0,clamp_bot(0,result - 2)) gives the + // "container name" and [result,str.size) gives the leaf name. + U64 result = 0; + if(str.size >= 2) + { + for(U64 i = str.size; i >= 2; i -= 1) + { + if(str.str[i - 2] == ':' && str.str[i - 1] == ':') + { + result = i; + break; + } + } + } + return(result); +} //////////////////////////////// //~ rjf: Command Line -> Conversion Parameters @@ -374,6 +398,139 @@ rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) return result; } +//////////////////////////////// +//~ rjf: Location Info Building Helpers + +internal RDIM_Location * +p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection) +{ + RDIM_Location *result = 0; + if(0 <= offset && offset <= (S64)max_U16) + { + if(extra_indirection) + { + result = rdim_push_location_addr_addr_reg_plus_u16(arena, reg_code, (U16)offset); + } + else + { + result = rdim_push_location_addr_reg_plus_u16(arena, reg_code, (U16)offset); + } + } + else + { + RDIM_EvalBytecode bytecode = {0}; + U32 regread_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, regread_param); + rdim_bytecode_push_sconst(arena, &bytecode, offset); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); + if(extra_indirection) + { + U64 addr_size = rdi_addr_size_from_arch(arch); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size); + } + result = rdim_push_location_addr_bytecode_stream(arena, &bytecode); + } + return result; +} + +internal CV_EncodedFramePtrReg +p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFrameproc *frameproc, B32 param_base) +{ + CV_EncodedFramePtrReg result = 0; + CV_FrameprocFlags flags = frameproc->flags; + if(param_base) + { + result = CV_FrameprocFlags_ExtractParamBasePointer(flags); + } + else + { + result = CV_FrameprocFlags_ExtractLocalBasePointer(flags); + } + return result; +} + +internal RDI_RegisterCode +p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg) +{ + RDI_RegisterCode result = 0; + switch(arch) + { + case RDI_Arch_X86: + { + switch(encoded_reg) + { + case CV_EncodedFramePtrReg_StackPtr: + { + // TODO(allen): support CV_AllReg_VFRAME + // TODO(allen): error + }break; + case CV_EncodedFramePtrReg_FramePtr: + { + result = RDI_RegisterCode_X86_ebp; + }break; + case CV_EncodedFramePtrReg_BasePtr: + { + result = RDI_RegisterCode_X86_ebx; + }break; + } + }break; + case RDI_Arch_X64: + { + switch(encoded_reg) + { + case CV_EncodedFramePtrReg_StackPtr: + { + result = RDI_RegisterCode_X64_rsp; + }break; + case CV_EncodedFramePtrReg_FramePtr: + { + result = RDI_RegisterCode_X64_rbp; + }break; + case CV_EncodedFramePtrReg_BasePtr: + { + result = RDI_RegisterCode_X64_r13; + }break; + } + }break; + } + return(result); +} + +internal void +p2r_location_over_lvar_addr_range(Arena *arena, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) +{ + //- rjf: extract range info + U64 voff_first = 0; + U64 voff_opl = 0; + if(section != 0) + { + voff_first = section->voff + range->off; + voff_opl = voff_first + range->len; + } + + //- rjf: emit ranges + CV_LvarAddrGap *gap_ptr = gaps; + U64 voff_cursor = voff_first; + for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) + { + U64 voff_gap_first = voff_first + gap_ptr->off; + U64 voff_gap_opl = voff_gap_first + gap_ptr->len; + if(voff_cursor < voff_gap_first) + { + RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first}; + rdim_location_set_push_case(arena, locset, voff_range, location); + } + voff_cursor = voff_gap_opl; + } + + //- rjf: emit remaining range + if(voff_cursor < voff_opl) + { + RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl}; + rdim_location_set_push_case(arena, locset, voff_range, location); + } +} + #if 0 //////////////////////////////// @@ -3670,9 +3827,9 @@ p2r_convert(Arena *arena, P2R_Params *params) { rec_range_count += sym->sym_ranges.count; } - for(U64 i = 0; i < comp_unit_count; i += 1) + for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) { - CV_SymParsed *unit_sym = sym_for_unit[i]; + CV_SymParsed *unit_sym = sym_for_unit[comp_unit_idx]; rec_range_count += unit_sym->sym_ranges.count; } symbol_count_prediction = rec_range_count/8; @@ -3683,11 +3840,11 @@ p2r_convert(Arena *arena, P2R_Params *params) } ////////////////////////////////////////////////////////////// - //- rjf: types pass 0: produce type forward resolution map + //- rjf: types pass 1: produce type forward resolution map // U64 type_fwd_map_count = 0; CV_TypeId *type_fwd_map = 0; - ProfScope("types pass 0: produce type forward resolution map") + ProfScope("types pass 1: produce type forward resolution map") { CV_TypeId itype_first = tpi_leaf->itype_first; CV_TypeId itype_opl = tpi_leaf->itype_opl; @@ -3805,7 +3962,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } ////////////////////////////////////////////////////////////// - //- rjf: types pass 1: construct all root/stub types from TPI + //- rjf: types pass 2: construct all root/stub types from TPI // // this does NOT gather the following information, which is done by // subsequent passes, as they all require full resolution of all itypes first @@ -3828,13 +3985,13 @@ p2r_convert(Arena *arena, P2R_Params *params) }; P2R_TypeIdRevisitTask *first_itype_revisit_task = 0; P2R_TypeIdRevisitTask *last_itype_revisit_task = 0; + CV_TypeId itype_first = tpi_leaf->itype_first; + CV_TypeId itype_opl = tpi_leaf->itype_opl; RDIM_TypeArray itype_types = {0}; // root type for per-TPI-itype RDIM_TypeChunkList extra_types = {0}; // extra supplementary types we build, which do not have any itypes - ProfScope("types pass 1: construct all root/stub types from TPI") + ProfScope("types pass 2: construct all root/stub types from TPI") { RDI_U64 extra_types_chunk_cap = 1024; - CV_TypeId itype_first = tpi_leaf->itype_first; - CV_TypeId itype_opl = tpi_leaf->itype_opl; itype_types.count = (U64)(itype_opl-itype_first); itype_types.v = push_array(arena, RDIM_Type, itype_types.count); #define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) @@ -4211,7 +4368,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } ////////////////////////////////////////////////////////////// - //- rjf: types pass 2: attach cross-itype-relationship data to all types, build UDTs + //- rjf: types pass 3: attach cross-itype-relationship data to all types, build UDTs // // given the root/stub types for all itypes, this pass takes care of the // following extra pieces of per-type information: @@ -4224,7 +4381,7 @@ p2r_convert(Arena *arena, P2R_Params *params) // - direct type forward resolution // RDIM_UDTChunkList udts = {0}; - ProfScope("types pass 2: attach cross-itype-relationship data to all types, build UDTs") + ProfScope("types pass 3: attach cross-itype-relationship data to all types, build UDTs") { RDI_U64 udts_chunk_cap = 1024; CV_TypeId itype_first = tpi_leaf->itype_first; @@ -4927,11 +5084,711 @@ p2r_convert(Arena *arena, P2R_Params *params) } ////////////////////////////////////////////////////////////// - //- rjf: produce all symbols for all units + //- rjf: produce symbols from all sym streams // - ProfScope("produce all symbols for all units") + ProfScope("produce symbols from all sym streams") { +#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) + //////////////////////////// + //- rjf: produce array of all symbol streams + // + U64 syms_count = 1 + comp_unit_count; + CV_SymParsed **syms = push_array(scratch.arena, CV_SymParsed *, syms_count); + { + syms[0] = sym; + for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) + { + syms[comp_unit_idx+1] = sym_for_unit[comp_unit_idx]; + } + } + + //////////////////////////// + //- rjf: produce symbols + // + for(U64 sym_idx = 0; sym_idx < syms_count; sym_idx += 1) + { + CV_SymParsed *sym = syms[sym_idx]; + Temp scratch = scratch_begin(&arena, 1); + + ////////////////////////// + //- rjf: set up outputs for this sym stream + // + RDIM_SymbolChunkList sym_procedures = {0}; + RDIM_SymbolChunkList sym_global_variables = {0}; + RDIM_SymbolChunkList sym_thread_variables = {0}; + RDIM_ScopeChunkList sym_scopes = {0}; + U64 sym_procedures_chunk_cap = 1024; + U64 sym_global_variables_chunk_cap = 1024; + U64 sym_thread_variables_chunk_cap = 1024; + U64 sym_scopes_chunk_cap = 1024; + + ////////////////////////// + //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) + // + U64 procedure_frameprocs_count = 0; + U64 procedure_frameprocs_cap = sym->sym_ranges.count; + CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); + ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") + { + U64 procedure_num = 0; + CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = sym->data.str + sym_off_first; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind + switch(kind) + { + default:{}break; + + //- rjf: FRAMEPROC + case CV_SymKind_FRAMEPROC: + { + if(procedure_num == 0) { break; } + if(procedure_num > procedure_frameprocs_cap) { break; } + CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; + procedure_frameprocs[procedure_num-1] = frameproc; + procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + procedure_num += 1; + }break; + } + } + U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); + arena_put_back(scratch.arena, scratch_overkill); + } + + ////////////////////////// + //- rjf: symbols pass 2: construct all symbols, given procedure frame info map + // + ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") + { + RDIM_LocationSet *defrange_target = 0; + B32 defrange_target_is_param = 0; + U64 procedure_num = 0; + CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; + typedef struct P2R_ScopeNode P2R_ScopeNode; + struct P2R_ScopeNode + { + P2R_ScopeNode *next; + RDIM_Scope *scope; + }; + P2R_ScopeNode *top_scope_node = 0; + P2R_ScopeNode *free_scope_node = 0; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = sym->data.str + sym_off_first; + void *sym_data_opl = sym->data.str + sym_off_opl; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind + switch(kind) + { + default:{}break; + + //- rjf: END + case CV_SymKind_END: + { + P2R_ScopeNode *n = top_scope_node; + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + defrange_target = 0; + defrange_target_is_param = 0; + }break; + + //- rjf: BLOCK32 + case CV_SymKind_BLOCK32: + { + // rjf: unpack sym + CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base; + + // rjf: build scope, insert into current parent scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + { + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= coff_sections->count) ? &coff_sections->sections[block32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + block32->off; + U64 voff_last = voff_first + block32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_rng1u64_list_push(arena, &scope->voff_ranges, voff_range); + } + } + + // rjf: push this scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + }break; + + //- rjf: LDATA32/GDATA32 + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + // rjf: unpack sym + CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(data32+1, sym_data_opl); + COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= coff_sections->count) ? &coff_sections->sections[data32->sec-1] : 0; + U64 voff = (section ? section->voff : 0) + data32->off; + + // rjf: determine if this is an exact duplicate global + // + // PDB likes to have duplicates of these spread across different + // symbol streams so we deduplicate across the entire translation + // context. + // + B32 is_duplicate = 0; + { + // TODO(rjf): @important global symbol dedup + } + + // rjf: is not duplicate -> push new global + if(!is_duplicate) + { + // rjf: unpack global variable's type + RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); + + // rjf: unpack global's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + // TODO(rjf): @important type name maps + // container_type = p2r_type_from_name(ctx, container_name); + } + + // rjf: unpack global's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build symbol + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, &sym_global_variables, sym_global_variables_chunk_cap); + symbol->kind = RDIM_SymbolKind_GlobalVariable; + symbol->is_extern = (kind == CV_SymKind_GDATA32); + symbol->name = name; + symbol->type = type; + symbol->offset = voff; + symbol->container_symbol = container_symbol; + symbol->container_type = container_type; + } + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + // rjf: unpack sym + CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(proc32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); + + // rjf: unpack proc's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + // TODO(rjf): @important type name maps + // container_type = p2r_type_from_name(ctx, container_name); + } + + // rjf: unpack proc's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build procedure's root scope + // + // NOTE: even if there could be a containing scope at this point (which should be + // illegal in C/C++ but not necessarily in another language) we would not use + // it here because these scopes refer to the ranges of code that make up a + // procedure *not* the namespaces, so a procedure's root scope always has + // no parent. + RDIM_Scope *procedure_root_scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + { + COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections->count) ? &coff_sections->sections[proc32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + proc32->off; + U64 voff_last = voff_first + proc32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_rng1u64_list_push(arena, &procedure_root_scope->voff_ranges, voff_range); + } + } + + // rjf: root scope voff minimum range -> link name + String8 link_name = {0}; + if(procedure_root_scope->voff_ranges.min != 0) + { + // TODO(rjf): @important link names + } + + // rjf: build procedure symbol + RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, &sym_procedures, sym_procedures_chunk_cap); + procedure_symbol->kind = RDIM_SymbolKind_Procedure; + procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); + procedure_symbol->name = name; + procedure_symbol->link_name = link_name; + procedure_symbol->type = type; + procedure_symbol->container_symbol = container_symbol; + procedure_symbol->container_type = container_type; + + // rjf: fill root scope's symbol + procedure_root_scope->symbol = procedure_symbol; + + // rjf: push scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = procedure_root_scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: increment procedure counter + procedure_num += 1; + }break; + + //- rjf: REGREL32 + case CV_SymKind_REGREL32: + { + // TODO(rjf): apparently some of the information here may end up being + // redundant with "better" information from CV_SymKind_LOCAL record. + // we don't currently handle this, but if those cases arise then it + // will obviously be better to prefer the better information from both + // records. + + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); + CV_Reg cv_reg = regrel32->reg; + U32 var_off = regrel32->reg_off; + + // rjf: determine if this is a parameter + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + { + B32 is_stack_reg = 0; + switch(arch) + { + default:{}break; + case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP);}break; + case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP);}break; + } + if(is_stack_reg) + { + U32 frame_size = 0xFFFFFFFF; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; + frame_size = frameproc->frame_size; + } + if(var_off > frame_size) + { + local_kind = RDI_LocalKind_Parameter; + } + } + } + + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, scope); + local->kind = local_kind; + local->name = name; + local->type = type; + + // rjf: add location info to local + { + // rjf: determine if we need an extra indirection to the value + B32 extra_indirection_to_value = 0; + switch(arch) + { + case RDI_Arch_X86: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))); + }break; + case RDI_Arch_X64: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); + }break; + } + + // rjf: get raddbg register code + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); + // TODO(rjf): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // rjf: set location case + RDIM_Location *loc = p2r_location_from_addr_reg_off(arena, arch, register_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_set_push_case(arena, &local->locset, voff_range, loc); + } + }break; + + //- rjf: LTHREAD32/GTHREAD32 + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + { + // rjf: unpack sym + CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(thread32+1, sym_data_opl); + U32 tls_off = thread32->tls_off; + RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); + + // rjf: unpack thread variable's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + // TODO(rjf): @important type name maps + // container_type = p2r_type_from_name(ctx, container_name); + } + + // rjf: unpack thread variable's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build symbol + RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, &sym_thread_variables, sym_thread_variables_chunk_cap); + tvar->kind = RDIM_SymbolKind_ThreadVariable; + tvar->name = name; + tvar->type = type; + tvar->is_extern = (kind == CV_SymKind_GTHREAD32); + tvar->offset = tls_off; + tvar->container_type = container_type; + tvar->container_symbol = container_symbol; + }break; + + //- rjf: LOCAL + case CV_SymKind_LOCAL: + { + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base; + String8 name = str8_cstring_capped(slocal+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); + + // rjf: determine if this symbol encodes the beginning of a global modification + B32 is_global_modification = 0; + if((slocal->flags & CV_LocalFlag_Global) || + (slocal->flags & CV_LocalFlag_Static)) + { + is_global_modification = 1; + } + + // rjf: is global modification -> emit global modification symbol + if(is_global_modification) + { + // TODO(rjf): add global modification symbols + defrange_target = 0; + defrange_target_is_param = 0; + } + + // rjf: is not a global modification -> emit a local variable + if(!is_global_modification) + { + // rjf: determine local kind + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + if(slocal->flags & CV_LocalFlag_Param) + { + local_kind = RDI_LocalKind_Parameter; + } + + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, scope); + local->kind = local_kind; + local->name = name; + local->type = type; + + // rjf: save defrange target, for subsequent defrange symbols + defrange_target = &local->locset; + defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); + } + }break; + + //- rjf: DEFRANGE_REGISTESR + case CV_SymKind_DEFRANGE_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; + CV_Reg cv_reg = defrange_register->reg; + CV_LvarAddrRange *range = &defrange_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections->count) ? &coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); + + // rjf: build location + RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; + CV_LvarAddrRange *range = &defrange_fprel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections->count) ? &coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: select frame pointer register + CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); + RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = arch_addr_size; + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel->off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_SUBFIELD_REGISTER + case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; + CV_Reg cv_reg = defrange_subfield_register->reg; + CV_LvarAddrRange *range = &defrange_subfield_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections->count) ? &coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); + + // rjf: skip "subfield" location info - currently not supported + if(defrange_subfield_register->field_offset != 0) + { + break; + } + + // rjf: build location + RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; + CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); + RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = arch_addr_size; + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel_full_scope->off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit location over ranges + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_set_push_case(arena, defrange_target, voff_range, location); + }break; + + //- rjf: DEFRANGE_REGISTER_REL + case CV_SymKind_DEFRANGE_REGISTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; + CV_Reg cv_reg = defrange_register_rel->reg; + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); + CV_LvarAddrRange *range = &defrange_register_rel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections->count) ? &coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: build location + // TODO(rjf): offset & size from cv_reg code + U32 byte_size = arch_addr_size; + U32 byte_pos = 0; + B32 extra_indirection_to_value = 0; + S64 var_off = defrange_register_rel->reg_off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, register_code, byte_size, byte_pos, var_off, extra_indirection_to_value); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: FILESTATIC + case CV_SymKind_FILESTATIC: + { + CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; + String8 name = str8_cstring_capped(file_static+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); + // TODO(rjf): emit a global modifier symbol + defrange_target = 0; + defrange_target_is_param = 0; + }break; + } + } + } + + scratch_end(scratch); + } + +#undef p2r_type_ptr_from_itype } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 308b5118..22ebf9fd 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -39,6 +39,30 @@ struct P2R_Params String8List errors; }; +//////////////////////////////// +//~ rjf: Conversion Data Structure Types + +//- rjf: link name map (voff -> string) + +typedef struct P2R_LinkNameNode P2R_LinkNameNode; +struct P2R_LinkNameNode +{ + P2R_LinkNameNode *next; + U64 voff; + String8 name; +}; + +typedef struct P2R_LinkNameMap P2R_LinkNameMap; +struct P2R_LinkNameMap +{ + P2R_LinkNameNode **buckets; + U64 buckets_count; + U64 bucket_collision_count; + U64 link_name_count; +}; + +#if 0 + //////////////////////////////// //~ rjf: PDB Type & Symbol Info Translation Helper Types @@ -193,6 +217,7 @@ struct P2R_Ctx P2R_KnownGlobalSet known_globals; P2R_LinkNameMap link_names; }; +#endif //////////////////////////////// //~ Conversion Output Type @@ -206,6 +231,11 @@ struct P2R_Out String8List errors; }; +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 p2r_end_of_cplusplus_container_name(String8 str); + //////////////////////////////// //~ rjf: Command Line -> Conversion Parameters @@ -224,6 +254,15 @@ internal RDI_RegisterCode rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg re internal RDI_Language rdi_language_from_cv_language(CV_Language language); internal RDI_TypeKind rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); +//////////////////////////////// +//~ rjf: Location Info Building Helpers + +internal RDIM_Location *p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); +internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFrameproc *frameproc, B32 param_base); +internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); +internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); + + #if 0 //////////////////////////////// From c3c1906d43fb72a50c3339aba356a55b17ef57ce Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 15 Feb 2024 15:44:24 -0800 Subject: [PATCH 068/275] first pass over raddbgi make baking phase rewrite/cleanup pass, getting off of old cons API --- project.4coder | 2 +- src/lib_raddbgi_make/raddbgi_make.c | 897 ++++++++++++++++--- src/lib_raddbgi_make/raddbgi_make.h | 237 ++++- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 111 ++- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 35 +- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 89 +- 6 files changed, 1141 insertions(+), 230 deletions(-) diff --git a/project.4coder b/project.4coder index 21a2732d..afc8e60c 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build raddbg telemetry", + .win = "build raddbgi_from_pdb telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 6e092c64..53926748 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -44,31 +44,34 @@ RDI_PROC RDIM_Arena * rdim_arena_alloc_fallback(void) { RDIM_Arena *arena = 0; + // TODO(rjf) return arena; } RDI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena) { - + // TODO(rjf) } RDI_PROC RDI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena) { + // TODO(rjf) return 0; } RDI_PROC void * rdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 size) { + // TODO(rjf) return 0; } RDI_PROC void rdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos) { - + // TODO(rjf) } #endif @@ -205,6 +208,19 @@ rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 stri list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; } +RDI_PROC void +rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align) +{ + RDI_U64 total_size_pre_align = list->total_size; + RDI_U64 total_size_post_align = (total_size_pre_align + (align-1))&(~(align-1)); + RDI_U64 needed_size = total_size_post_align - total_size_pre_align; + if(needed_size != 0) + { + RDI_U8 *padding = rdim_push_array(arena, RDI_U8, needed_size); + rdim_str8_list_push(arena, list, rdim_str8(padding, needed_size)); + } +} + RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep) { @@ -236,7 +252,7 @@ rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep) //- rjf: sortable range sorting -RDI_PROC RDIM_SortKey* +RDI_PROC RDIM_SortKey * rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count) { // This sort is designed to take advantage of lots of pre-existing sorted ranges. @@ -387,7 +403,8 @@ rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count) #if 0 // assert sortedness - for(RDI_U64 i = 1; i < count; i += 1){ + for(RDI_U64 i = 1; i < count; i += 1) + { rdim_assert(result[i - 1].key <= result[i].key); } #endif @@ -396,9 +413,6 @@ rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count) return result; } -//////////////////////////////// -//~ rjf: Auxiliary Data Structure Functions - //- rjf: rng1u64 list RDI_PROC void @@ -414,104 +428,6 @@ rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r } } -//- rjf: u64 -> ptr map - -RDI_PROC void -rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count) -{ - rdim_assert(IsPow2OrZero(bucket_count) && bucket_count > 0); - map->buckets = rdim_push_array(arena, RDIM_U64ToPtrNode*, bucket_count); - map->buckets_count = bucket_count; -} - -RDI_PROC void -rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out) -{ - RDI_U64 bucket_idx = hash&(map->buckets_count - 1); - RDIM_U64ToPtrNode *check_node = map->buckets[bucket_idx]; - for(;check_node != 0; check_node = check_node->next){ - for(RDI_U32 k = 0; k < ArrayCount(check_node->key); k += 1){ - if(check_node->ptr[k] == 0){ - lookup_out->fill_node = check_node; - lookup_out->fill_k = k; - break; - } - else if(check_node->key[k] == key){ - lookup_out->match = check_node->ptr[k]; - break; - } - } - } -} - -RDI_PROC void -rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr) -{ - if(lookup->fill_node != 0) - { - RDIM_U64ToPtrNode *node = lookup->fill_node; - RDI_U32 k = lookup->fill_k; - node->key[k] = key; - node->ptr[k] = ptr; - } - else - { - RDI_U64 bucket_idx = hash&(map->buckets_count - 1); - - RDIM_U64ToPtrNode *node = rdim_push_array(arena, RDIM_U64ToPtrNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - node->key[0] = key; - node->ptr[0] = ptr; - - lookup->fill_node = node; - lookup->fill_k = 0; - - map->pair_count += 1; - map->bucket_collision_count += (node->next != 0); - } -} - -//- rjf: string8 -> ptr map - -RDI_PROC void -rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_U64 bucket_count) -{ - map->buckets_count = bucket_count; - map->buckets = rdim_push_array(arena, RDIM_Str8ToPtrNode*, map->buckets_count); -} - -RDI_PROC void* -rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash) -{ - void *result = 0; - RDI_U64 bucket_idx = hash%map->buckets_count; - for(RDIM_Str8ToPtrNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->hash == hash && rdim_str8_match(node->key, key, 0)) - { - result = node->ptr; - break; - } - } - return result; -} - -RDI_PROC void -rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr) -{ - RDI_U64 bucket_idx = hash%map->buckets_count; - RDIM_Str8ToPtrNode *node = rdim_push_array(arena, RDIM_Str8ToPtrNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - - node->key = rdim_str8_copy(arena, key); - node->hash = hash; - node->ptr = ptr; - map->bucket_collision_count += (node->next != 0); - map->pair_count += 1; -} - //////////////////////////////// //~ rjf: Binary Section List Building @@ -546,6 +462,35 @@ rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list) return unit; } +RDI_PROC void +rdim_unit_chunk_list_push_array(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDIM_UnitArray *array) +{ + RDIM_UnitChunkNode *n = rdim_push_array(arena, RDIM_UnitChunkNode, 1); + RDIM_SLLQueuePush(list->first, list->last, n); + n->count = array->count; + n->cap = array->count; + n->v = array->v; + list->total_count += n->count; + list->chunk_count += 1; +} + +RDI_PROC void +rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + RDI_PROC RDIM_LineSequence * rdim_line_sequence_list_push(RDIM_Arena *arena, RDIM_LineSequenceList *list) { @@ -591,6 +536,35 @@ rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 c return result; } +RDI_PROC void +rdim_type_chunk_list_push_array(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDIM_TypeArray *array) +{ + RDIM_TypeChunkNode *n = rdim_push_array(arena, RDIM_TypeChunkNode, 1); + RDIM_SLLQueuePush(list->first, list->last, n); + n->count = array->count; + n->cap = array->count; + n->v = array->v; + list->total_count += n->count; + list->chunk_count += 1; +} + +RDI_PROC void +rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + RDI_PROC RDIM_UDT * rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap) { @@ -609,6 +583,23 @@ rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap return result; } +RDI_PROC void +rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + RDI_PROC RDIM_UDTMember * rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDT *udt) { @@ -731,6 +722,23 @@ rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U return result; } +RDI_PROC void +rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + //////////////////////////////// //~ rjf: Scope Info Building @@ -752,6 +760,23 @@ rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 return result; } +RDI_PROC void +rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + RDI_PROC RDIM_Local * rdim_scope_push_local(RDIM_Arena *arena, RDIM_Scope *scope) { @@ -825,10 +850,672 @@ rdim_location_set_push_case(RDIM_Arena *arena, RDIM_LocationSet *locset, RDIM_Rn location_case->location = location; } +//////////////////////////////// +//~ rjf: Baking + +//- rjf: data section list building helpers + +RDI_PROC RDIM_BakeSection * +rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list) +{ + RDIM_BakeSectionNode *n = rdim_push_array(arena, RDIM_BakeSectionNode, 1); + RDIM_SLLQueuePush(list->first, list->last, n); + list->count += 1; + RDIM_BakeSection *result = &n->v; + return result; +} + +RDI_PROC RDIM_BakeSection * +rdim_bake_section_list_push_new(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_DataSectionTag tag) +{ + RDIM_BakeSection *section = rdim_bake_section_list_push(arena, list); + section->data = data; + section->size = size; + section->tag = tag; + return section; +} + +//- rjf: interned string building + +RDI_PROC RDI_U32 +rdim_bake_string(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string) +{ + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeStringNode *node = 0; + for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash && rdim_str8_match(n->string, string, 0)) + { + node = n; + break; + } + } + + // rjf: no node -> make new node + if(node == 0) + { + node = rdim_push_array_no_zero(arena, RDIM_BakeStringNode, 1); + node->string = rdim_str8_copy(arena, string); + node->hash = hash; + node->idx = map->count; + map->count += 1; + RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); + RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); + map->slot_collision_count += (node->hash_next != 0); + } + + // rjf: node -> index + RDI_U32 result = node->idx; + return result; +} + +//- rjf: interned index run building + +RDI_PROC RDI_U64 +rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count) +{ + RDI_U64 hash = 5381; + RDI_U32 *ptr = idx_run; + RDI_U32 *opl = idx_run + count; + for(;ptr < opl; ptr += 1) + { + hash = ((hash << 5) + hash) + (*ptr); + } + return hash; +} + +RDI_PROC RDI_U32 +rdim_bake_idx_run(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count) +{ + RDI_U64 hash = rdim_hash_from_idx_run(idx_run, count); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeIdxRunNode *node = 0; + for(RDIM_BakeIdxRunNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash) + { + RDI_S32 is_match = 1; + RDI_U32 *n_idx = n->idx_run; + for(RDI_U32 i = 0; i < count; i += 1) + { + if(n_idx[i] != idx_run[i]) + { + is_match = 0; + break; + } + } + if(is_match) + { + node = n; + break; + } + } + } + + // rjf: no node -> make new node + if(node == 0) + { + node = rdim_push_array_no_zero(arena, RDIM_BakeIdxRunNode, 1); + RDI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RDI_U32, count); + for(RDI_U32 i = 0; i < count; i += 1) + { + idx_run_copy[i] = idx_run[i]; + } + node->idx_run = idx_run_copy; + node->hash = hash; + node->count = count; + node->first_idx = map->idx_count; + map->count += 1; + map->idx_count += count; + RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); + RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); + map->slot_collision_count += (node->hash_next != 0); + } + + // rjf: node -> index + RDI_U32 result = node->first_idx; + return result; +} + +//- rjf: interned path/file building + +RDI_PROC RDIM_String8 +rdim_normal_string_from_bake_path_node(RDIM_Arena *arena, RDIM_BakePathNode *node) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + RDIM_String8List list = {0}; + for(RDIM_BakePathNode *n = node; n != 0; n = n->parent) + { + if(n->name.size != 0) + { + rdim_str8_list_push(scratch.arena, &list, n->name); + } + } + RDIM_String8 result = rdim_str8_list_join(arena, &list, rdim_str8_lit("/")); + { + RDI_U8 *ptr = result.str; + RDI_U8 *opl = result.str + result.size; + for(;ptr < opl; ptr += 1) + { + RDI_U8 c = *ptr; + if('A' <= c && c <= 'Z') { c += 'a' - 'A'; } + *ptr = c; + } + } + scratch_end(scratch); + return result; +} + +RDI_PROC RDIM_BakePathNode * +rdim_bake_path_node_from_string(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) +{ + RDIM_BakePathNode *node = &tree->root; + RDI_U8 *ptr = string.str; + RDI_U8 *opl = string.str + string.size; + for(;ptr < opl;) + { + // rjf: skip past slashes + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: save beginning of non-slash range + RDI_U8 *range_first = ptr; + + // rjf: skip past non-slashes + for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: empty range -> continue + if(range_first >= ptr) + { + continue; + } + + // rjf: range -> sub-directory string + RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); + + // rjf: sub-directory string -> find child of node + RDIM_BakePathNode *sub_dir_node = 0; + for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling) + { + if(rdim_str8_match(child->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) + { + sub_dir_node = child; + } + } + + // rjf: no child -> make one + if(sub_dir_node == 0) + { + sub_dir_node = rdim_push_array(arena, RDIM_BakePathNode, 1); + RDIM_SLLQueuePush_N(tree->first, tree->last, sub_dir_node, next_order); + sub_dir_node->parent = node; + RDIM_SLLQueuePush_N(node->first_child, node->last_child, sub_dir_node, next_sibling); + sub_dir_node->name = rdim_str8_copy(arena, sub_dir); + sub_dir_node->idx = tree->count; + tree->count += 1; + } + + // rjf: descend to child + node = sub_dir_node; + } + return node; +} + +RDI_PROC RDIM_BakeSrcNode * +rdim_bake_src_node_from_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_BakePathNode *path_node) +{ + RDIM_BakeSrcNode *src_node = path_node->src_file; + if(src_node == 0) + { + src_node = rdim_push_array(arena, RDIM_BakeSrcNode, 1); + path_node->src_file = src_node; + src_node->path_node = path_node; + src_node->normal_full_path = rdim_normal_string_from_bake_path_node(arena, path_node); + src_node->idx = tree->src_count; + tree->src_count += 1; + RDIM_SLLQueuePush(tree->src_first, tree->src_last, src_node); + } + return src_node; +} + +RDI_PROC RDI_U32 +rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) +{ + RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(arena, tree, string); + return path_node->idx; +} + +//- rjf: main baking entry point + +RDI_PROC RDIM_String8List +rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) +{ + RDIM_String8List blobs; + rdim_memzero_struct(&blobs); + + ////////////////////////////// + //- rjf: set up intermediate baking data structures + // + RDIM_BakeSectionList sections = {0}; + RDIM_BakeStringMap strings = {0}; + RDIM_BakeIdxRunMap idx_runs = {0}; + RDIM_BakePathTree path_tree = {0}; + { + rdim_bake_section_list_push_new(arena, §ions, 0, 0, RDI_DataSectionTag_NULL); + strings.slots_count = 65536; + strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count); + idx_runs.slots_count = 65536; + idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count); + } + + ////////////////////////////// + //- rjf: build section for top-level-info + // + ProfScope("build section for top-level-info") + { + RDI_TopLevelInfo *dst_tli = rdim_push_array(arena, RDI_TopLevelInfo, 1); + RDIM_TopLevelInfo *src_tli = ¶ms->top_level_info; + dst_tli->architecture = src_tli->arch; + dst_tli->exe_name_string_idx = rdim_bake_string(arena, &strings, src_tli->exe_name); + dst_tli->exe_hash = src_tli->exe_hash; + dst_tli->voff_max = src_tli->voff_max; + rdim_bake_section_list_push_new(arena, §ions, dst_tli, sizeof(*dst_tli), RDI_DataSectionTag_TopLevelInfo); + } + + ////////////////////////////// + //- rjf: build section for binary sections + // + ProfScope("build section for binary sections") + { + RDIM_BinarySectionList *src_list = ¶ms->binary_sections; + RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src_list->count); + U64 dst_idx = 0; + for(RDIM_BinarySectionNode *src_n = src_list->first; src_n != 0; src_n = src_n->next, dst_idx += 1) + { + RDIM_BinarySection *src = &src_n->v; + RDI_BinarySection *dst = &dst_base[dst_idx]; + dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->flags = src->flags; + dst->voff_first = src->voff_first; + dst->voff_opl = src->voff_opl; + dst->foff_first = src->foff_first; + dst->foff_opl = src->foff_opl; + } + rdim_bake_section_list_push_new(arena, §ions, dst_base, sizeof(*dst_base)*dst_idx, RDI_DataSectionTag_BinarySections); + } + + ////////////////////////////// + //- rjf: build sections for units + // + ProfScope("build sections for units") + { + RDIM_UnitChunkList *src_list = ¶ms->units; + RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, src_list->total_count); + RDI_U64 dst_idx = 0; + for(RDIM_UnitChunkNode *src_n = src_list->first; src_n != 0; src_n = src_n->next) + { + for(RDI_U64 src_chunk_idx = 0; src_chunk_idx < src_n->count; src_chunk_idx += 1, dst_idx += 1) + { + RDIM_Unit *src = &src_n->v[src_chunk_idx]; + RDI_Unit *dst = &dst_base[dst_idx]; + + //////////////////////// + //- rjf: produce combined unit line info + // + RDI_U64 *unit_voffs = 0; + RDI_Line *unit_lines = 0; + RDI_U16 *unit_cols = 0; + RDI_U32 unit_line_count = 0; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: gather up all line info into two arrays: + // + // [1] keys: sortable array; pairs voffs with line info records; null records are sequence enders + // [2] recs: contains all the source coordinates for a range of voffs + // + typedef struct RDIM_LineRec RDIM_LineRec; + struct RDIM_LineRec + { + RDI_U32 file_id; + RDI_U32 line_num; + RDI_U16 col_first; + RDI_U16 col_opl; + }; + RDI_U64 line_count = 0; + RDI_U64 seq_count = 0; + for(RDIM_LineSequenceNode *seq_n = src->line_sequences.first; seq_n != 0; seq_n = seq_n->next) + { + seq_count += 1; + line_count += seq_n->v.line_count; + } + RDI_U64 key_count = line_count + seq_count; + RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); + RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); + { + RDIM_SortKey *key_ptr = line_keys; + RDIM_LineRec *rec_ptr = line_recs; + for(RDIM_LineSequenceNode *seq_n = src->line_sequences.first; seq_n != 0; seq_n = seq_n->next) + { + RDIM_LineSequence *seq = &seq_n->v; + RDIM_BakePathNode *src_path = rdim_bake_path_node_from_string(arena, &path_tree, seq->file_name); + RDIM_BakeSrcNode *src_file = rdim_bake_src_node_from_path_node(arena, &path_tree, src_path); + for(RDI_U64 line_idx = 0; line_idx < seq->line_count; line_idx += 1) + { + key_ptr->key = seq->voffs[line_idx]; + key_ptr->val = rec_ptr; + key_ptr += 1; + rec_ptr->file_id = src_file->idx; + rec_ptr->line_num = seq->line_nums[line_idx]; + if(seq->col_nums != 0) + { + rec_ptr->col_first = seq->col_nums[line_idx*2]; + rec_ptr->col_opl = seq->col_nums[line_idx*2 + 1]; + } + rec_ptr += 1; + } + key_ptr->key = seq->voffs[seq->line_count]; + key_ptr->val = 0; + key_ptr += 1; + + RDIM_BakeLineMapFragment *fragment = rdim_push_array(arena, RDIM_BakeLineMapFragment, 1); + RDIM_SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); + fragment->seq = seq; + } + } + + //- rjf: sort + RDIM_SortKey *sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); + + // TODO(rjf): do a pass over sorted keys to make sure duplicate keys + // are sorted with null record first, and no more than one null + // record and one non-null record + + //- rjf: arrange output + RDI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RDI_U64, key_count + 1); + RDI_Line *arranged_lines = rdim_push_array_no_zero(arena, RDI_Line, key_count); + for(RDI_U64 i = 0; i < key_count; i += 1) + { + arranged_voffs[i] = sorted_line_keys[i].key; + } + arranged_voffs[key_count] = ~0ull; + for(RDI_U64 i = 0; i < key_count; i += 1) + { + RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; + if(rec != 0) + { + arranged_lines[i].file_idx = rec->file_id; + arranged_lines[i].line_num = rec->line_num; + } + else + { + arranged_lines[i].file_idx = 0; + arranged_lines[i].line_num = 0; + } + } + + //- rjf: fill output + unit_voffs = arranged_voffs; + unit_lines = arranged_lines; + unit_cols = 0; + unit_line_count = key_count; + scratch_end(scratch); + } + + //////////////////////// + //- rjf: build line info sections + // + RDI_U32 line_info_voffs_data_idx = (RDI_U32)sections.count; + RDI_U32 line_info_data_idx = line_info_voffs_data_idx+1; + RDI_U32 line_info_col_data_idx = unit_cols ? line_info_voffs_data_idx+2 : 0; + rdim_bake_section_list_push_new(arena, §ions, unit_voffs, sizeof(RDI_U64)*(unit_line_count+1), RDI_DataSectionTag_LineInfoVoffs); + rdim_bake_section_list_push_new(arena, §ions, unit_lines, sizeof(RDI_Line)*unit_line_count, RDI_DataSectionTag_LineInfoData); + if(unit_cols != 0) + { + rdim_bake_section_list_push_new(arena, §ions, unit_cols, sizeof(RDI_Column)*unit_line_count, RDI_DataSectionTag_LineInfoColumns); + } + + //////////////////////// + //- rjf: fill output + // + dst->unit_name_string_idx = rdim_bake_string(arena, &strings, src->unit_name); + dst->compiler_name_string_idx = rdim_bake_string(arena, &strings, src->compiler_name); + dst->source_file_path_node = rdim_bake_path(arena, &path_tree, src->source_file); + dst->object_file_path_node = rdim_bake_path(arena, &path_tree, src->object_file); + dst->archive_file_path_node = rdim_bake_path(arena, &path_tree, src->archive_file); + dst->build_path_node = rdim_bake_path(arena, &path_tree, src->build_path); + dst->language = src->language; + dst->line_info_voffs_data_idx = line_info_voffs_data_idx; + dst->line_info_data_idx = line_info_data_idx; + dst->line_info_col_data_idx = line_info_col_data_idx; + } + } + rdim_bake_section_list_push_new(arena, §ions, dst_base, sizeof(*dst_base)*dst_idx, RDI_DataSectionTag_Units); + } + + ////////////////////////////// + //- rjf: build section for per-source-file line info + // + ProfScope("build section for per-source-file line info") + { + + } + + ////////////////////////////// + //- rjf: build section for unit vmap + // + ProfScope("build section for unit vmap") + { + + } + + ////////////////////////////// + //- rjf: build sections for type info + // + ProfScope("build sections for type info") + { + + } + + ////////////////////////////// + //- rjf: build sections for symbol info + // + ProfScope("build sections for type info") + { + + } + + ////////////////////////////// + //- rjf: build sections for name maps + // + ProfScope("build sections for name maps") + { + + } + + ////////////////////////////// + //- rjf: build sections for file paths + // + ProfScope("build sections for file paths") + { + + } + + ////////////////////////////// + //- rjf: build sections for source files + // + ProfScope("build sections for source files") + { + + } + + ////////////////////////////// + //- rjf: build sections for strings + // + ProfScope("build sections for strings") + { + + } + + ////////////////////////////// + //- rjf: build section for index runs + // + ProfScope("build section for index runs") + { + + } + + ////////////////////////////// + //- rjf: build blob strings for header & all sections + // + ProfScope("build blob strings for header & all sections") + { + // rjf: push empty header & data section table + RDI_Header *baked_rdi_header = rdim_push_array(arena, RDI_Header, 1); + RDI_DataSection *baked_rdi_sections = rdim_push_array(arena, RDI_DataSection, sections.count); + rdim_str8_list_push(arena, &blobs, rdim_str8_struct(baked_rdi_header)); + rdim_str8_list_push_align(arena, &blobs, 8); + U32 data_section_off = (U32)blobs.total_size; + rdim_str8_list_push(arena, &blobs, rdim_str8((RDI_U8 *)baked_rdi_sections, sizeof(RDI_DataSection)*sections.count)); + + // rjf: fill baked header + { + baked_rdi_header->magic = RDI_MAGIC_CONSTANT; + baked_rdi_header->encoding_version = RDI_ENCODING_VERSION; + baked_rdi_header->data_section_off = data_section_off; + baked_rdi_header->data_section_count = sections.count; + } + + // rjf: fill baked data section table + U64 dst_idx = 0; + for(RDIM_BakeSectionNode *src_n = sections.first; src_n != 0; src_n = src_n->next, dst_idx += 1) + { + RDIM_BakeSection *src = &src_n->v; + RDI_DataSection *dst = baked_rdi_sections + dst_idx; + U64 data_section_off = 0; + if(src->size != 0) + { + rdim_str8_list_push_align(arena, &blobs, 8); + data_section_off = blobs.total_size; + rdim_str8_list_push(arena, &blobs, rdim_str8((RDI_U8 *)src->data, src->size)); + } + dst->tag = src->tag; + dst->encoding = RDI_DataSectionEncoding_Unpacked; + dst->off = data_section_off; + dst->encoded_size = src->size; + dst->unpacked_size = src->size; + } + } + + return blobs; +} + #if 0 //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions +//- rjf: u64 -> ptr map + +RDI_PROC void +rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count) +{ + rdim_assert(IsPow2OrZero(bucket_count) && bucket_count > 0); + map->buckets = rdim_push_array(arena, RDIM_U64ToPtrNode*, bucket_count); + map->buckets_count = bucket_count; +} + +RDI_PROC void +rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out) +{ + RDI_U64 bucket_idx = hash&(map->buckets_count - 1); + RDIM_U64ToPtrNode *check_node = map->buckets[bucket_idx]; + for(;check_node != 0; check_node = check_node->next){ + for(RDI_U32 k = 0; k < ArrayCount(check_node->key); k += 1){ + if(check_node->ptr[k] == 0){ + lookup_out->fill_node = check_node; + lookup_out->fill_k = k; + break; + } + else if(check_node->key[k] == key){ + lookup_out->match = check_node->ptr[k]; + break; + } + } + } +} + +RDI_PROC void +rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr) +{ + if(lookup->fill_node != 0) + { + RDIM_U64ToPtrNode *node = lookup->fill_node; + RDI_U32 k = lookup->fill_k; + node->key[k] = key; + node->ptr[k] = ptr; + } + else + { + RDI_U64 bucket_idx = hash&(map->buckets_count - 1); + + RDIM_U64ToPtrNode *node = rdim_push_array(arena, RDIM_U64ToPtrNode, 1); + SLLStackPush(map->buckets[bucket_idx], node); + node->key[0] = key; + node->ptr[0] = ptr; + + lookup->fill_node = node; + lookup->fill_k = 0; + + map->pair_count += 1; + map->bucket_collision_count += (node->next != 0); + } +} + +//- rjf: string8 -> ptr map + +RDI_PROC void +rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_U64 bucket_count) +{ + map->buckets_count = bucket_count; + map->buckets = rdim_push_array(arena, RDIM_Str8ToPtrNode*, map->buckets_count); +} + +RDI_PROC void* +rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash) +{ + void *result = 0; + RDI_U64 bucket_idx = hash%map->buckets_count; + for(RDIM_Str8ToPtrNode *node = map->buckets[bucket_idx]; + node != 0; + node = node->next) + { + if(node->hash == hash && rdim_str8_match(node->key, key, 0)) + { + result = node->ptr; + break; + } + } + return result; +} + +RDI_PROC void +rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr) +{ + RDI_U64 bucket_idx = hash%map->buckets_count; + RDIM_Str8ToPtrNode *node = rdim_push_array(arena, RDIM_Str8ToPtrNode, 1); + SLLStackPush(map->buckets[bucket_idx], node); + + node->key = rdim_str8_copy(arena, key); + node->hash = hash; + node->ptr = ptr; + map->bucket_collision_count += (node->next != 0); + map->pair_count += 1; +} + //- rjf: root creation RDI_PROC RDIM_Root * diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 8d64b762..3ce7351a 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -762,6 +762,162 @@ struct RDIM_NameMap RDI_U64 name_count; }; +//////////////////////////////// +//~ rjf: Baking Types + +//- rjf: bake parameters + +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_SymbolChunkList global_variables; + RDIM_SymbolChunkList thread_variables; + RDIM_SymbolChunkList procedures; + RDIM_ScopeChunkList scopes; +}; + +//- rjf: data sections + +typedef struct RDIM_BakeSection RDIM_BakeSection; +struct RDIM_BakeSection +{ + void *data; + RDI_U64 size; + RDI_DataSectionTag tag; +}; + +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: interned strings + +typedef struct RDIM_BakeStringNode RDIM_BakeStringNode; +struct RDIM_BakeStringNode +{ + RDIM_BakeStringNode *hash_next; + RDIM_BakeStringNode *order_next; + RDIM_String8 string; + RDI_U64 hash; + RDI_U32 idx; +}; + +typedef struct RDIM_BakeStringMap RDIM_BakeStringMap; +struct RDIM_BakeStringMap +{ + RDIM_BakeStringNode *order_first; + RDIM_BakeStringNode *order_last; + RDIM_BakeStringNode **slots; + RDI_U64 slots_count; + RDI_U64 slot_collision_count; + RDI_U32 count; +}; + +//- rjf: index runs + +typedef struct RDIM_BakeIdxRunNode RDIM_BakeIdxRunNode; +struct RDIM_BakeIdxRunNode +{ + RDIM_BakeIdxRunNode *hash_next; + RDIM_BakeIdxRunNode *order_next; + RDI_U32 *idx_run; + RDI_U64 hash; + RDI_U32 count; + RDI_U32 first_idx; +}; + +typedef struct RDIM_BakeIdxRunMap RDIM_BakeIdxRunMap; +struct RDIM_BakeIdxRunMap +{ + RDIM_BakeIdxRunNode *order_first; + RDIM_BakeIdxRunNode *order_last; + RDIM_BakeIdxRunNode **slots; + RDI_U64 slots_count; + RDI_U64 slot_collision_count; + RDI_U32 count; + RDI_U32 idx_count; +}; + +//- rjf: line info + +typedef struct RDIM_LineRec RDIM_LineRec; +struct RDIM_LineRec +{ + RDI_U32 file_id; + RDI_U32 line_num; + RDI_U16 col_first; + RDI_U16 col_opl; +}; + +//- rjf: source info & path tree + +typedef struct RDIM_BakePathNode RDIM_BakePathNode; +struct RDIM_BakePathNode +{ + RDIM_BakePathNode *next_order; + RDIM_BakePathNode *parent; + RDIM_BakePathNode *first_child; + RDIM_BakePathNode *last_child; + RDIM_BakePathNode *next_sibling; + RDIM_String8 name; + struct RDIM_BakeSrcNode *src_file; + RDI_U32 idx; +}; + +typedef struct RDIM_BakeLineMapFragment RDIM_BakeLineMapFragment; +struct RDIM_BakeLineMapFragment +{ + RDIM_BakeLineMapFragment *next; + RDIM_LineSequence *seq; +}; + +typedef struct RDIM_BakeSrcNode RDIM_BakeSrcNode; +struct RDIM_BakeSrcNode +{ + RDIM_BakeSrcNode *next; + RDIM_BakePathNode *path_node; + RDI_U32 idx; + RDIM_String8 normal_full_path; + + // rjf: line info attached to this src file + RDIM_BakeLineMapFragment *first_fragment; + RDIM_BakeLineMapFragment *last_fragment; + + // rjf: final baked version of this file's line map + RDI_U32 line_map_nums_data_idx; + RDI_U32 line_map_range_data_idx; + RDI_U32 line_map_count; + RDI_U32 line_map_voff_data_idx; +}; + +typedef struct RDIM_BakePathTree RDIM_BakePathTree; +struct RDIM_BakePathTree +{ + RDIM_BakePathNode *first; + RDIM_BakePathNode *last; + RDI_U32 count; + RDIM_BakePathNode root; + RDIM_BakeSrcNode *src_first; + RDIM_BakeSrcNode *src_last; + RDI_U32 src_count; +}; + +#if 0 //////////////////////////////// //~ rjf: Root Construction Bundle Types @@ -950,15 +1106,6 @@ struct RDIM_PathTree //- rjf: line info baking data structures -typedef struct RDIM_LineRec RDIM_LineRec; -struct RDIM_LineRec -{ - RDI_U32 file_id; - RDI_U32 line_num; - RDI_U16 col_first; - RDI_U16 col_opl; -}; - typedef struct RDIM_UnitLinesCombined RDIM_UnitLinesCombined; struct RDIM_UnitLinesCombined { @@ -1114,6 +1261,7 @@ struct RDIM_BakeCtx RDIM_IdxRuns idxs; RDIM_PathTree *tree; }; +#endif //////////////////////////////// //~ rjf: Basic Helpers @@ -1157,27 +1305,15 @@ RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatc //- rjf: string lists RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); +RDI_PROC void rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align); RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep); //- rjf: sortable range sorting -RDI_PROC RDIM_SortKey* rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count); - -//////////////////////////////// -//~ rjf: Auxiliary Data Structure Functions +RDI_PROC RDIM_SortKey *rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count); //- rjf: rng1u64 list RDI_PROC void rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r); -//- rjf: u64 -> ptr map -RDI_PROC void rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count); -RDI_PROC void rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out); -RDI_PROC void rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr); - -//- rjf: string8 -> ptr map -RDI_PROC void rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_U64 bucket_count); -RDI_PROC void*rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash); -RDI_PROC void rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr); - //////////////////////////////// //~ rjf: Binary Section Info Building @@ -1187,6 +1323,8 @@ RDI_PROC RDIM_BinarySection *rdim_binary_section_list_push(RDIM_Arena *arena, RD //~ rjf: Unit Info Building RDI_PROC RDIM_Unit *rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list); +RDI_PROC void rdim_unit_chunk_list_push_array(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDIM_UnitArray *array); +RDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push); RDI_PROC RDIM_LineSequence *rdim_line_sequence_list_push(RDIM_Arena *arena, RDIM_LineSequenceList *list); RDI_PROC RDIM_UnitArray rdim_unit_array_from_chunk_list(RDIM_Arena *arena, RDIM_UnitChunkList *list); @@ -1194,7 +1332,10 @@ RDI_PROC RDIM_UnitArray rdim_unit_array_from_chunk_list(RDIM_Arena *arena, RDIM_ //~ rjf: Type Info & UDT Building RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap); +RDI_PROC void rdim_type_chunk_list_push_array(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDIM_TypeArray *array); +RDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push); RDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap); +RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push); RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDT *udt); RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDT *udt); @@ -1210,11 +1351,13 @@ RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_Ev //~ rjf: Symbol Info Building RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap); +RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push); //////////////////////////////// //~ rjf: Scope Info Building RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap); +RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push); RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_Scope *scope); //////////////////////////////// @@ -1230,11 +1373,44 @@ RDI_PROC RDIM_Location *rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg //- rjf: location sets RDI_PROC void rdim_location_set_push_case(RDIM_Arena *arena, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location); +//////////////////////////////// +//~ rjf: Baking + +//- 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); + +//- rjf: interned string building +RDI_PROC RDI_U32 rdim_bake_string(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string); + +//- rjf: interned index run building +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); + +//- 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 RDIM_BakeSrcNode *rdim_bake_src_node_from_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_BakePathNode *path_node); +RDI_PROC RDI_U32 rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string); + +//- rjf: main baking entry point +RDI_PROC RDIM_String8List rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params); + #if 0 //////////////////////////////// //~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions +//- rjf: u64 -> ptr map +RDI_PROC void rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count); +RDI_PROC void rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out); +RDI_PROC void rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr); + +//- rjf: string8 -> ptr map +RDI_PROC void rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_U64 bucket_count); +RDI_PROC void*rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash); +RDI_PROC void rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr); + //- rjf: root creation RDI_PROC RDIM_Root* rdim_root_alloc(RDIM_RootParams *params); RDI_PROC void rdim_root_release(RDIM_Root *root); @@ -1334,14 +1510,13 @@ RDI_PROC RDI_U32 rdim_idx_run(RDIM_BakeCtx *bctx, RDI_U32 *idx_run, RDI_U32 coun RDI_PROC RDI_U32 rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RDI_U64 size, RDI_DataSectionTag tag); //- rjf: paths baking -RDI_PROC RDIM_String8 rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node); -RDI_PROC void rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out); -RDI_PROC RDIM_PathNode* rdim_paths_new_node(RDIM_BakeCtx *bctx); -RDI_PROC RDIM_PathNode* rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir); -RDI_PROC RDIM_PathNode* rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); -RDI_PROC RDI_U32 rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); -RDI_PROC RDIM_SrcNode* rdim_paths_new_src_node(RDIM_BakeCtx *bctx); -RDI_PROC RDIM_SrcNode* rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node); +RDI_PROC RDIM_String8 rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node); +RDI_PROC RDIM_BakePathNode *rdim_bake_path_tree_push_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree); +RDI_PROC RDIM_BakePathNode *rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir); +RDI_PROC RDIM_BakePathNode *rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); +RDI_PROC RDI_U32 rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); +RDI_PROC RDIM_BakeSrcNode * rdim_paths_new_src_node(RDIM_BakeCtx *bctx); +RDI_PROC RDIM_BakeSrcNode * rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node); //- rjf: per-unit line info baking RDI_PROC RDIM_UnitLinesCombined* rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequenceNode *first_seq); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index b96ccaef..6a2ae202 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -25,15 +25,16 @@ p2r_end_of_cplusplus_container_name(String8 str) } return(result); } -//////////////////////////////// -//~ rjf: Command Line -> Conversion Parameters -internal P2R_Params* -p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline) +//////////////////////////////// +//~ rjf: Command Line -> Conversion Inputs + +internal P2R_ConvertIn * +p2r_convert_in_from_cmd_line(Arena *arena, CmdLine *cmdline) { - P2R_Params *result = push_array(arena, P2R_Params, 1); + P2R_ConvertIn *result = push_array(arena, P2R_ConvertIn, 1); - // get input pdb + //- rjf: get input pdb { String8 input_name = cmd_line_string(cmdline, str8_lit("pdb")); if(input_name.size == 0) @@ -55,7 +56,7 @@ p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline) } } - // get input exe + //- rjf: get input exe { String8 input_name = cmd_line_string(cmdline, str8_lit("exe")); if(input_name.size > 0) @@ -73,12 +74,12 @@ p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline) } } - // get output name + //- rjf: get output name { result->output_name = cmd_line_string(cmdline, str8_lit("out")); } - // error options + //- rjf: error options if(cmd_line_has_flag(cmdline, str8_lit("hide_errors"))) { String8List vals = cmd_line_strings(cmdline, str8_lit("hide_errors")); @@ -116,7 +117,7 @@ p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline) } } - // dump options + //- rjf: dump options if(cmd_line_has_flag(cmdline, str8_lit("dump"))) { result->dump = 1; @@ -169,7 +170,7 @@ p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline) } } - return(result); + return result; } //////////////////////////////// @@ -3433,20 +3434,18 @@ p2r_link_name_find(P2R_LinkNameMap *map, U64 voff) //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point -internal P2R_Out * -p2r_convert(Arena *arena, P2R_Params *params) +internal P2R_ConvertOut * +p2r_convert(Arena *arena, P2R_ConvertIn *in) { Temp scratch = scratch_begin(&arena, 1); - P2R_Out *out = push_array(arena, P2R_Out, 1); - out->good_parse = 1; ////////////////////////////////////////////////////////////// //- rjf: parse MSF structure // MSF_Parsed *msf = 0; - if(params->errors.node_count == 0) ProfScope("parse MSF structure") + if(in->input_pdb_data.size != 0) ProfScope("parse MSF structure") { - msf = msf_parsed_from_data(arena, params->input_pdb_data); + msf = msf_parsed_from_data(arena, in->input_pdb_data); } ////////////////////////////////////////////////////////////// @@ -3651,9 +3650,9 @@ p2r_convert(Arena *arena, P2R_Params *params) //- rjf: hash exe // U64 exe_hash = 0; - if(params->input_exe_data.size > 0) ProfScope("hash exe") + if(in->input_exe_data.size > 0) ProfScope("hash exe") { - exe_hash = rdi_hash(params->input_exe_data.str, params->input_exe_data.size); + exe_hash = rdi_hash(in->input_exe_data.str, in->input_exe_data.size); } ////////////////////////////////////////////////////////////// @@ -3708,7 +3707,7 @@ p2r_convert(Arena *arena, P2R_Params *params) RDIM_TopLevelInfo top_level_info = {0}; { top_level_info.arch = arch; - top_level_info.exe_name = params->input_exe_name; + top_level_info.exe_name = in->input_exe_name; top_level_info.exe_hash = exe_hash; top_level_info.voff_max = exe_voff_max; } @@ -3844,11 +3843,11 @@ p2r_convert(Arena *arena, P2R_Params *params) // U64 type_fwd_map_count = 0; CV_TypeId *type_fwd_map = 0; + CV_TypeId itype_first = 0; + CV_TypeId itype_opl = tpi_leaf->itype_opl; ProfScope("types pass 1: produce type forward resolution map") { - CV_TypeId itype_first = tpi_leaf->itype_first; - CV_TypeId itype_opl = tpi_leaf->itype_opl; - type_fwd_map_count = (U64)(itype_opl-itype_first); + type_fwd_map_count = (U64)itype_opl; type_fwd_map = push_array(arena, CV_TypeId, type_fwd_map_count); for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) { @@ -3985,8 +3984,6 @@ p2r_convert(Arena *arena, P2R_Params *params) }; P2R_TypeIdRevisitTask *first_itype_revisit_task = 0; P2R_TypeIdRevisitTask *last_itype_revisit_task = 0; - CV_TypeId itype_first = tpi_leaf->itype_first; - CV_TypeId itype_opl = tpi_leaf->itype_opl; RDIM_TypeArray itype_types = {0}; // root type for per-TPI-itype RDIM_TypeChunkList extra_types = {0}; // extra supplementary types we build, which do not have any itypes ProfScope("types pass 2: construct all root/stub types from TPI") @@ -4384,8 +4381,6 @@ p2r_convert(Arena *arena, P2R_Params *params) ProfScope("types pass 3: attach cross-itype-relationship data to all types, build UDTs") { RDI_U64 udts_chunk_cap = 1024; - CV_TypeId itype_first = tpi_leaf->itype_first; - CV_TypeId itype_opl = tpi_leaf->itype_opl; #define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) for(P2R_TypeIdRevisitTask *task = first_itype_revisit_task; task != 0; task = task->next) { @@ -4483,7 +4478,7 @@ p2r_convert(Arena *arena, P2R_Params *params) //- rjf: arrays -> calculate array count based on direct type size // case RDI_TypeKind_Array: - if(dst_type->direct_type != 0) + if(dst_type->direct_type != 0 && dst_type->direct_type->byte_size != 0) { dst_type->count = dst_type->byte_size/dst_type->direct_type->byte_size; }break; @@ -5086,6 +5081,10 @@ p2r_convert(Arena *arena, P2R_Params *params) ////////////////////////////////////////////////////////////// //- rjf: produce symbols from all sym streams // + RDIM_SymbolChunkList all_procedures = {0}; + RDIM_SymbolChunkList all_global_variables = {0}; + RDIM_SymbolChunkList all_thread_variables = {0}; + RDIM_ScopeChunkList all_scopes = {0}; ProfScope("produce symbols from all sym streams") { #define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) @@ -5239,8 +5238,11 @@ p2r_convert(Arena *arena, P2R_Params *params) case CV_SymKind_END: { P2R_ScopeNode *n = top_scope_node; - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } defrange_target = 0; defrange_target_is_param = 0; }break; @@ -5785,19 +5787,42 @@ p2r_convert(Arena *arena, P2R_Params *params) } } + ////////////////////////// + //- rjf: merge this stream's outputs with collated list + // + rdim_symbol_chunk_list_concat_in_place(&all_procedures, &sym_procedures); + rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &sym_global_variables); + rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &sym_thread_variables); + rdim_scope_chunk_list_concat_in_place(&all_scopes, &sym_scopes); + scratch_end(scratch); } #undef p2r_type_ptr_from_itype } + ////////////////////////////////////////////////////////////// + //- rjf: fill output + // + P2R_ConvertOut *out = push_array(arena, P2R_ConvertOut, 1); + { + out->top_level_info = top_level_info; + out->binary_sections = binary_sections; + rdim_unit_chunk_list_push_array(arena, &out->units, &units); + rdim_type_chunk_list_push_array(arena, &out->types, &itype_types); + rdim_type_chunk_list_concat_in_place(&out->types, &extra_types); + out->global_variables = all_global_variables; + out->thread_variables = all_thread_variables; + out->procedures = all_procedures; + out->scopes = all_scopes; + } //~ TODO(rjf): OLD vvvvvvvvvvvvvvvvvvv #if 0 // output generation P2R_Ctx *p2r_ctx = 0; - if(params->output_name.size > 0) + if(in->output_name.size > 0) { // setup root RDIM_RootParams root_params = {0}; @@ -5830,7 +5855,7 @@ p2r_convert(Arena *arena, P2R_Params *params) // set top level info RDIM_TopLevelInfo tli = {0}; tli.architecture = architecture; - tli.exe_name = params->input_exe_name; + tli.exe_name = in->input_exe_name; tli.exe_hash = exe_hash; tli.voff_max = voff_max; @@ -5977,7 +6002,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } // conversion errors - if(!params->hide_errors.converting) + if(!in->hide_errors.converting) { for(RDIM_Msg *msg = rdim_first_msg_from_root(root); msg != 0; @@ -5989,7 +6014,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } // dump - if(params->dump) ProfScope("dump") + if(in->dump) ProfScope("dump") { String8List dump = {0}; @@ -6007,7 +6032,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } // MSF - if(params->dump_msf) + if(in->dump_msf) { if(msf != 0) { @@ -6033,7 +6058,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } // DBI - if(params->dump_sym) + if(in->dump_sym) { if(sym != 0) { @@ -6047,7 +6072,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } // TPI - if(params->dump_tpi_hash) + if(in->dump_tpi_hash) { if(tpi_hash != 0) { @@ -6071,7 +6096,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } // LEAF - if(params->dump_leaf) + if(in->dump_leaf) { if(tpi_leaf != 0) { @@ -6095,7 +6120,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } // BINARY SECTIONS - if(params->dump_coff_sections) + if(in->dump_coff_sections) { if(coff_sections != 0) { @@ -6130,8 +6155,8 @@ p2r_convert(Arena *arena, P2R_Params *params) // UNITS if(comp_units != 0) { - B32 dump_sym = params->dump_sym; - B32 dump_c13 = params->dump_c13; + B32 dump_sym = in->dump_sym; + B32 dump_c13 = in->dump_c13; B32 dump_units = (dump_sym || dump_c13); @@ -6163,7 +6188,7 @@ p2r_convert(Arena *arena, P2R_Params *params) // UNIT CONTRIBUTIONS if(comp_unit_contributions != 0) { - if(params->dump_contributions) + if(in->dump_contributions) { str8_list_push(arena, &dump, str8_lit("################################" @@ -6181,7 +6206,7 @@ p2r_convert(Arena *arena, P2R_Params *params) } // rjf: dump table diagnostics - if(params->dump_table_diagnostics) + if(in->dump_table_diagnostics) { str8_list_push(arena, &dump, str8_lit("################################" diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 22ebf9fd..7d1943f3 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -5,10 +5,10 @@ #define RDI_FROM_PDB_H //////////////////////////////// -//~ rjf: Conversion Parameters Type +//~ rjf: Conversion Inputs/Outputs -typedef struct P2R_Params P2R_Params; -struct P2R_Params +typedef struct P2R_ConvertIn P2R_ConvertIn; +struct P2R_ConvertIn { String8 input_pdb_name; String8 input_pdb_data; @@ -39,6 +39,19 @@ struct P2R_Params String8List errors; }; +typedef struct P2R_ConvertOut P2R_ConvertOut; +struct P2R_ConvertOut +{ + RDIM_TopLevelInfo top_level_info; + RDIM_BinarySectionList binary_sections; + RDIM_UnitChunkList units; + RDIM_TypeChunkList types; + RDIM_SymbolChunkList global_variables; + RDIM_SymbolChunkList thread_variables; + RDIM_SymbolChunkList procedures; + RDIM_ScopeChunkList scopes; +}; + //////////////////////////////// //~ rjf: Conversion Data Structure Types @@ -217,7 +230,6 @@ struct P2R_Ctx P2R_KnownGlobalSet known_globals; P2R_LinkNameMap link_names; }; -#endif //////////////////////////////// //~ Conversion Output Type @@ -230,6 +242,7 @@ struct P2R_Out String8List dump; String8List errors; }; +#endif //////////////////////////////// //~ rjf: Basic Helpers @@ -237,9 +250,9 @@ struct P2R_Out internal U64 p2r_end_of_cplusplus_container_name(String8 str); //////////////////////////////// -//~ rjf: Command Line -> Conversion Parameters +//~ rjf: Command Line -> Conversion Inputs -internal P2R_Params *p2r_params_from_cmd_line(Arena *arena, CmdLine *cmdline); +internal P2R_ConvertIn *p2r_convert_in_from_cmd_line(Arena *arena, CmdLine *cmdline); //////////////////////////////// //~ rjf: COFF => RADDBGI Canonical Conversions @@ -263,6 +276,11 @@ internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, C internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); +//////////////////////////////// +//~ rjf: Top-Level Conversion Entry Point + +internal P2R_ConvertOut *p2r_convert(Arena *arena, P2R_ConvertIn *in); + #if 0 //////////////////////////////// @@ -371,9 +389,4 @@ internal String8 p2r_link_name_find(P2R_LinkNameMap *map, U64 voff); #endif -//////////////////////////////// -//~ rjf: Top-Level Conversion Entry Point - -internal P2R_Out *p2r_convert(Arena *arena, P2R_Params *params); - #endif // RDI_FROM_PDB_H diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 9468bddb..1c183fb0 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -1,9 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//- rjf: [lib] #include "lib_raddbgi_format/raddbgi_format.h" #include "lib_raddbgi_format/raddbgi_format.c" +//- rjf: [h] #include "base/base_inc.h" #include "os/os_inc.h" #include "raddbgi_make_local/raddbgi_make_local.h" @@ -13,9 +15,9 @@ #include "msf/msf.h" #include "pdb/pdb.h" #include "pdb/pdb_stringize.h" - #include "raddbgi_from_pdb.h" +//- rjf: [c] #include "base/base_inc.c" #include "os/os_inc.c" #include "raddbgi_make_local/raddbgi_make_local.c" @@ -25,11 +27,13 @@ #include "msf/msf.c" #include "pdb/pdb.c" #include "pdb/pdb_stringize.c" - #include "raddbgi_from_pdb.c" +//- rjf: entry point + int -main(int argc, char **argv){ +main(int argc, char **argv) +{ local_persist TCTX main_thread_tctx = {0}; tctx_init_and_equip(&main_thread_tctx); #if PROFILE_TELEMETRY @@ -40,69 +44,76 @@ main(int argc, char **argv){ tmSetMaxThreadCount(1024); tmInitialize(tm_data_size, tm_data); #endif - ThreadName("[main]"); + //- rjf: initialize dependencies + os_init(argc, argv); + + //- rjf: initialize state, parse command line Arena *arena = arena_alloc(); 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); - ProfBeginCapture("raddbgi_from_pdb"); - - //- rjf: parse arguments - P2R_Params *params = p2r_params_from_cmd_line(arena, &cmdline); - - //- rjf: show input errors - if (params->errors.node_count > 0 && - !params->hide_errors.input){ - for (String8Node *node = params->errors.first; - node != 0; - node = node->next){ - fprintf(stderr, "error(input): %.*s\n", str8_varg(node->string)); - } + //- rjf: begin capture + if(should_capture) + { + ProfBeginCapture(argv[0]); } - //- rjf: open output file - String8 output_name = push_str8_copy(arena, params->output_name); - FILE *out_file = fopen((char*)output_name.str, "wb"); - if(out_file == 0 && !params->hide_errors.output) + //- rjf: display errors with input + if(convert_in->errors.node_count > 0 && !convert_in->hide_errors.input) { - fprintf(stderr, "error(output): could not open output file\n"); + for(String8Node *n = convert_in->errors.first; n != 0; n = n->next) + { + fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); + } } //- rjf: convert - P2R_Out *out = 0; - if(out_file != 0) + P2R_ConvertOut *convert_out = 0; + ProfScope("convert") { - out = p2r_convert(arena, params); + convert_out = p2r_convert(arena, convert_in); } - //- rjf: print dump - if(out != 0) + //- rjf: bake + String8List bake_strings = {0}; + ProfScope("bake") { - for(String8Node *node = out->dump.first; node != 0; node = node->next) + RDIM_BakeParams bake_params = {0}; { - fwrite(node->string.str, 1, node->string.size, stdout); + bake_params.top_level_info = convert_out->top_level_info; + bake_params.binary_sections = convert_out->binary_sections; + bake_params.types = convert_out->types; + bake_params.global_variables = convert_out->global_variables; + bake_params.thread_variables = convert_out->thread_variables; + bake_params.procedures = convert_out->procedures; + bake_params.scopes = convert_out->scopes; } + bake_strings = rdim_bake(arena, &bake_params); } - //- rjf: bake file - if(out != 0 && out->good_parse && params->output_name.size > 0 && out->good_parse) + //- rjf: write + ProfScope("write") { - String8List baked = {0}; - rdim_bake_file(arena, out->root, &baked); - for(String8Node *node = baked.first; node != 0; node = node->next) + OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, convert_in->output_name); + U64 off = 0; + for(String8Node *n = bake_strings.first; n != 0; n = n->next) { - fwrite(node->string.str, node->string.size, 1, out_file); + os_file_write(output_file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; } + os_file_close(output_file); } - //- rjf: close output file - if(out_file != 0) + + //- rjf: end capture + if(should_capture) { - fclose(out_file); + ProfEndCapture(); } - ProfEndCapture(); return(0); } From 5f1ab8fdb4a1ade090d6be68aa63d3cedbeee47d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 15 Feb 2024 15:56:20 -0800 Subject: [PATCH 069/275] move over per-source-file line info baking --- src/lib_raddbgi_make/raddbgi_make.c | 152 +++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 1 deletion(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 53926748..c1357efd 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1302,7 +1302,157 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // ProfScope("build section for per-source-file line info") { - + for(RDIM_BakeSrcNode *src_file_node = path_tree.src_first; + src_file_node != 0; + src_file_node = src_file_node->next) + { + ////////////////////////// + //- rjf: produce combined source file line info + // + RDI_U32 *src_file_line_nums = 0; + RDI_U32 *src_file_line_ranges = 0; + RDI_U64 *src_file_voffs = 0; + RDI_U32 src_file_line_count = 0; + RDI_U32 src_file_voff_count = 0; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: gather line number map + typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; + struct RDIM_SrcLineMapVoffBlock + { + RDIM_SrcLineMapVoffBlock *next; + RDI_U64 voff; + }; + typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; + struct RDIM_SrcLineMapBucket + { + RDIM_SrcLineMapBucket *order_next; + RDIM_SrcLineMapBucket *hash_next; + RDI_U32 line_num; + RDIM_SrcLineMapVoffBlock *first_voff_block; + RDIM_SrcLineMapVoffBlock *last_voff_block; + RDI_U64 voff_count; + }; + RDIM_SrcLineMapBucket *first_bucket = 0; + RDIM_SrcLineMapBucket *last_bucket = 0; + RDI_U64 line_hash_slots_count = 2048; + RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); + RDI_U64 line_count = 0; + RDI_U64 voff_count = 0; + RDI_U64 max_line_num = 0; + { + for(RDIM_BakeLineMapFragment *map_fragment = src_file_node->first_fragment; + map_fragment != 0; + map_fragment = map_fragment->next) + { + RDIM_LineSequence *sequence = map_fragment->seq; + RDI_U64 *seq_voffs = sequence->voffs; + RDI_U32 *seq_line_nums = sequence->line_nums; + RDI_U64 seq_line_count = sequence->line_count; + for(RDI_U64 i = 0; i < seq_line_count; i += 1) + { + RDI_U32 line_num = seq_line_nums[i]; + RDI_U64 voff = seq_voffs[i]; + RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; + + // rjf: update unique voff counter & max line number + voff_count += 1; + max_line_num = Max(max_line_num, line_num); + + // rjf: find match + RDIM_SrcLineMapBucket *match = 0; + { + for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + node != 0; + node = node->hash_next) + { + if(node->line_num == line_num) + { + match = node; + break; + } + } + } + + // rjf: introduce new map if no match + if(match == 0) + { + match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); + RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); + RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); + match->line_num = line_num; + line_count += 1; + } + + // rjf: insert new voff + { + RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); + RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); + match->voff_count += 1; + block->voff = voff; + } + } + } + } + + //- rjf: bake sortable keys array + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); + { + RDIM_SortKey *key_ptr = keys; + for(RDIM_SrcLineMapBucket *node = first_bucket; + node != 0; + node = node->order_next, key_ptr += 1){ + key_ptr->key = node->line_num; + key_ptr->val = node; + } + } + + // sort + RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); + + // bake result + RDI_U32 *line_nums = rdim_push_array_no_zero(arena, RDI_U32, line_count); + RDI_U32 *line_ranges = rdim_push_array_no_zero(arena, RDI_U32, line_count + 1); + RDI_U64 *voffs = rdim_push_array_no_zero(arena, RDI_U64, voff_count); + { + RDI_U64 *voff_ptr = voffs; + for(RDI_U32 i = 0; i < line_count; i += 1){ + line_nums[i] = sorted_keys[i].key; + line_ranges[i] = (RDI_U32)(voff_ptr - voffs); + RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; + for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; + node != 0; + node = node->next){ + *voff_ptr = node->voff; + voff_ptr += 1; + } + } + line_ranges[line_count] = voff_count; + } + + src_file_line_nums = line_nums; + src_file_line_ranges = line_ranges; + src_file_line_count = line_count; + src_file_voffs = voffs; + src_file_voff_count = voff_count; + scratch_end(scratch); + } + + ////////////////////////// + //- rjf: produce data sections for this source file's line info tables + // + if(src_file_line_count != 0) + { + src_file_node->line_map_count = src_file_line_count; + src_file_node->line_map_nums_data_idx = (RDI_U32)sections.count; + src_file_node->line_map_range_data_idx = src_file_node->line_map_nums_data_idx+1; + src_file_node->line_map_voff_data_idx = src_file_node->line_map_nums_data_idx+2; + rdim_bake_section_list_push_new(arena, §ions, src_file_line_nums, sizeof(*src_file_line_nums)*src_file_line_count, RDI_DataSectionTag_LineMapNumbers); + rdim_bake_section_list_push_new(arena, §ions, src_file_line_ranges, sizeof(*src_file_line_ranges)*(src_file_line_count + 1), RDI_DataSectionTag_LineMapRanges); + rdim_bake_section_list_push_new(arena, §ions, src_file_voffs, sizeof(*src_file_voffs)*src_file_voff_count, RDI_DataSectionTag_LineMapVoffs); + } + } } ////////////////////////////// From e8ca5483609dcb75268b54bf2d0d8011b33a9128 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 15 Feb 2024 16:11:24 -0800 Subject: [PATCH 070/275] transfer over unit vmap baking --- src/lib_raddbgi_make/raddbgi_make.c | 223 +++++++++++++++++++++++++++- src/lib_raddbgi_make/raddbgi_make.h | 19 +++ 2 files changed, 235 insertions(+), 7 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index c1357efd..d7fa2c3b 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1089,6 +1089,149 @@ rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) return path_node->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) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: sort markers + RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, marker_count); + + //- rjf: determine if an extra vmap entry for zero is needed + RDI_U32 extra_vmap_entry = 0; + if(marker_count > 0 && sorted_keys[0].key != 0) + { + extra_vmap_entry = 1; + } + + //- rjf: fill output vmap entries + RDI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; + RDI_VMapEntry *vmap = rdim_push_array_no_zero(arena, RDI_VMapEntry, vmap_count_raw + 1); + RDI_U32 vmap_entry_count_pass_1 = 0; + { + typedef struct RDIM_VMapRangeTracker RDIM_VMapRangeTracker; + struct RDIM_VMapRangeTracker + { + RDIM_VMapRangeTracker *next; + RDI_U32 idx; + }; + RDI_VMapEntry *vmap_ptr = vmap; + if(extra_vmap_entry) + { + vmap_ptr->voff = 0; + vmap_ptr->idx = 0; + vmap_ptr += 1; + } + RDIM_VMapRangeTracker *tracker_stack = 0; + RDIM_VMapRangeTracker *tracker_free = 0; + RDIM_SortKey *key_ptr = sorted_keys; + RDIM_SortKey *key_opl = sorted_keys + marker_count; + for(;key_ptr < key_opl;) + { + // rjf: get initial map state from tracker stack + RDI_U32 initial_idx = (RDI_U32)0xffffffff; + if(tracker_stack != 0) + { + initial_idx = tracker_stack->idx; + } + + // rjf: update tracker stack + // + // * we must process _all_ of the changes that apply at this voff before moving on + // + RDI_U64 voff = key_ptr->key; + + for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1) + { + RDIM_VMapMarker *marker = (RDIM_VMapMarker*)key_ptr->val; + RDI_U32 idx = marker->idx; + + // rjf: range begin -> push to stack + if(marker->begin_range) + { + RDIM_VMapRangeTracker *new_tracker = tracker_free; + if(new_tracker != 0) + { + RDIM_SLLStackPop(tracker_free); + } + else + { + new_tracker = rdim_push_array(scratch.arena, RDIM_VMapRangeTracker, 1); + } + RDIM_SLLStackPush(tracker_stack, new_tracker); + new_tracker->idx = idx; + } + + // rjf: range ending -> pop matching node from stack (not always the top) + else + { + RDIM_VMapRangeTracker **ptr_in = &tracker_stack; + RDIM_VMapRangeTracker *match = 0; + for(RDIM_VMapRangeTracker *node = tracker_stack; node != 0;) + { + if(node->idx == idx) + { + match = node; + break; + } + ptr_in = &node->next; + node = node->next; + } + if(match != 0) + { + *ptr_in = match->next; + RDIM_SLLStackPush(tracker_free, match); + } + } + } + + // rjf: get final map state from tracker stack + RDI_U32 final_idx = 0; + if(tracker_stack != 0) + { + final_idx = tracker_stack->idx; + } + + // rjf: if final is different from initial - emit new vmap entry + if(final_idx != initial_idx) + { + vmap_ptr->voff = voff; + vmap_ptr->idx = final_idx; + vmap_ptr += 1; + } + } + + vmap_entry_count_pass_1 = (RDI_U32)(vmap_ptr - vmap); + } + + //- rjf: combine duplicate neighbors + RDI_U32 vmap_entry_count = 0; + { + RDI_VMapEntry *vmap_ptr = vmap; + RDI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; + RDI_VMapEntry *vmap_out = vmap; + for(;vmap_ptr < vmap_opl;) + { + RDI_VMapEntry *vmap_range_first = vmap_ptr; + RDI_U64 idx = vmap_ptr->idx; + vmap_ptr += 1; + for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; + rdim_memcpy_struct(vmap_out, vmap_range_first); + vmap_out += 1; + } + vmap_entry_count = (RDI_U32)(vmap_out - vmap); + } + + //- rjf: fill result + RDIM_VMap result = {0}; + result.vmap = vmap; + result.count = vmap_entry_count-1; + rdim_scratch_end(scratch); + return result; +} + //- rjf: main baking entry point RDI_PROC RDIM_String8List @@ -1408,22 +1551,22 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) } } - // sort + //- rjf: sort keys array RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); - // bake result + //- rjf: bake result RDI_U32 *line_nums = rdim_push_array_no_zero(arena, RDI_U32, line_count); RDI_U32 *line_ranges = rdim_push_array_no_zero(arena, RDI_U32, line_count + 1); RDI_U64 *voffs = rdim_push_array_no_zero(arena, RDI_U64, voff_count); { RDI_U64 *voff_ptr = voffs; - for(RDI_U32 i = 0; i < line_count; i += 1){ + for(RDI_U32 i = 0; i < line_count; i += 1) + { line_nums[i] = sorted_keys[i].key; line_ranges[i] = (RDI_U32)(voff_ptr - voffs); RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; - for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; - node != 0; - node = node->next){ + for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next) + { *voff_ptr = node->voff; voff_ptr += 1; } @@ -1431,6 +1574,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) line_ranges[line_count] = voff_count; } + //- rjf: fill output src_file_line_nums = line_nums; src_file_line_ranges = line_ranges; src_file_line_count = line_count; @@ -1460,7 +1604,72 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // ProfScope("build section for unit vmap") { + //- rjf: build vmap from unit voff ranges + RDIM_VMap unit_vmap = {0}; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: count voff ranges + RDI_U64 voff_range_count = 0; + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDIM_Unit *unit = &n->v[idx]; + voff_range_count += unit->voff_ranges.count; + } + } + + // rjf: count necessary markers + RDI_U64 marker_count = voff_range_count*2; + + // rjf: build keys/markers arrays + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + RDI_U32 unit_idx = 0; + for(RDIM_UnitChunkNode *unit_chunk_n = params->units.first; + unit_chunk_n != 0; + unit_chunk_n = unit_chunk_n->next) + { + for(RDI_U64 idx = 0; idx < unit_chunk_n->count; idx += 1) + { + RDIM_Unit *unit = &unit_chunk_n->v[idx]; + for(RDIM_Rng1U64Node *n = unit->voff_ranges.first; n != 0; n = n->next) + { + RDIM_Rng1U64 range = n->v; + if(range.min < range.max) + { + key_ptr->key = range.min; + key_ptr->val = marker_ptr; + marker_ptr->idx = unit_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = range.max; + key_ptr->val = marker_ptr; + marker_ptr->idx = unit_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + unit_idx += 1; + } + } + } + + // rjf: keys/markers -> unit vmap + unit_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); + rdim_scratch_end(scratch); + } + //- rjf: build section + RDI_U64 unit_vmap_size = sizeof(unit_vmap.vmap[0])*(unit_vmap.count+1); + rdim_bake_section_list_push_new(arena, §ions, unit_vmap.vmap, unit_vmap_size, RDI_DataSectionTag_UnitVmap); } ////////////////////////////// @@ -3376,7 +3585,7 @@ rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first) } //- rjf: vmap baking -RDI_PROC RDIM_VMap* +RDI_PROC RDIM_VMap rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 3ce7351a..aa39b08e 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -917,6 +917,22 @@ struct RDIM_BakePathTree RDI_U32 src_count; }; +//- rjf: vmaps + +typedef struct RDIM_VMap RDIM_VMap; +struct RDIM_VMap +{ + RDI_VMapEntry *vmap; // [count + 1] + RDI_U32 count; +}; + +typedef struct RDIM_VMapMarker RDIM_VMapMarker; +struct RDIM_VMapMarker +{ + RDI_U32 idx; + RDI_U32 begin_range; +}; + #if 0 //////////////////////////////// //~ rjf: Root Construction Bundle Types @@ -1393,6 +1409,9 @@ RDI_PROC RDIM_BakePathNode *rdim_bake_path_node_from_string(RDIM_Arena *arena, R RDI_PROC RDIM_BakeSrcNode *rdim_bake_src_node_from_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_BakePathNode *path_node); RDI_PROC RDI_U32 rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string); +//- 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: main baking entry point RDI_PROC RDIM_String8List rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params); From 7646487a9010dd548810dd207a098e608b6f2675 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 07:28:55 -0800 Subject: [PATCH 071/275] raddbgi_from_pdb: type info baking --- src/lib_raddbgi_make/raddbgi_make.c | 146 ++++++++++++++++++- src/lib_raddbgi_make/raddbgi_make.h | 13 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 28 ++-- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 1 + src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 1 + 5 files changed, 167 insertions(+), 22 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index d7fa2c3b..0ef52b47 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -531,6 +531,7 @@ rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 c list->chunk_count += 1; } RDIM_Type *result = &n->v[n->count]; + result->idx = (RDI_U32)list->total_count; n->count += 1; list->total_count += 1; return result; @@ -578,6 +579,7 @@ rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap list->chunk_count += 1; } RDIM_UDT *result = &n->v[n->count]; + result->idx = (RDI_U32)list->total_count; n->count += 1; list->total_count += 1; return result; @@ -601,20 +603,22 @@ rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *t } RDI_PROC RDIM_UDTMember * -rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDT *udt) +rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt) { RDIM_UDTMember *mem = rdim_push_array(arena, RDIM_UDTMember, 1); RDIM_SLLQueuePush(udt->first_member, udt->last_member, mem); udt->member_count += 1; + list->total_member_count += 1; return mem; } RDI_PROC RDIM_UDTEnumVal * -rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDT *udt) +rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt) { RDIM_UDTEnumVal *mem = rdim_push_array(arena, RDIM_UDTEnumVal, 1); RDIM_SLLQueuePush(udt->first_enum_val, udt->last_enum_val, mem); udt->enum_val_count += 1; + list->total_enum_val_count += 1; return mem; } @@ -1677,13 +1681,145 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // ProfScope("build sections for type info") { + //////////////////////////// + //- rjf: build all type nodes + // + RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count); + { + RDI_U64 dst_idx = 0; + for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Type *src = &n->v[chunk_idx]; + RDI_TypeNode *dst = &type_nodes[dst_idx]; + + //- rjf: fill shared type node info + dst->kind = src->kind; + dst->byte_size = src->byte_size; + + //- rjf: fill built-in-only type node info + if(RDI_TypeKind_FirstBuiltIn <= dst->kind && dst->kind <= RDI_TypeKind_LastBuiltIn) + { + dst->built_in.name_string_idx = rdim_bake_string(arena, &strings, src->name); + } + + //- rjf: fill constructed type node info + else if(RDI_TypeKind_FirstConstructed <= dst->kind && dst->kind <= RDI_TypeKind_LastConstructed) + { + dst->constructed.direct_type_idx = src->direct_type ? src->direct_type->idx : 0; + dst->constructed.count = src->count; + if(dst->kind == RDI_TypeKind_Function || dst->kind == RDI_TypeKind_Method) + { + RDI_U32 param_idx_run_count = src->count; + RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); + for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) + { + param_idx_run[idx] = src->param_types[idx]->idx; + } + dst->constructed.param_idx_run_first = rdim_bake_idx_run(arena, &idx_runs, param_idx_run, param_idx_run_count); + } + else if(dst->kind == RDI_TypeKind_MemberPtr) + { + // TODO(rjf): member pointers not currently supported. + } + } + + //- rjf: fill user-defined-type info + else if(RDI_TypeKind_FirstUserDefined <= dst->kind && dst->kind <= RDI_TypeKind_LastUserDefined) + { + dst->user_defined.name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->user_defined.udt_idx = src->udt ? src->udt->idx : 0; + dst->user_defined.direct_type_idx = src->direct_type ? src->direct_type->idx : 0; + } + + //- rjf: fill bitfield info + else if(dst->kind == RDI_TypeKind_Bitfield) + { + dst->bitfield.off = src->off; + dst->bitfield.size = src->count; + } + } + } + } + //////////////////////////// + //- rjf: build all udts & members + // + RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count); + RDI_Member * members = push_array(arena, RDI_Member, params->udts.total_member_count); + RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, params->udts.total_enum_val_count); + { + RDI_U32 dst_udt_idx = 0; + RDI_U32 dst_member_idx = 0; + RDI_U32 dst_enum_member_idx = 0; + for(RDIM_UDTChunkNode *n = params->udts.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_udt_idx += 1) + { + RDIM_UDT *src_udt = &n->v[chunk_idx]; + RDI_UDT *dst_udt = &udts[dst_udt_idx]; + + //- rjf: fill basics + dst_udt->self_type_idx = src_udt->self_type ? src_udt->self_type->idx : 0; + if(src_udt->source_path.size != 0) + { + RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(arena, &path_tree, src_udt->source_path); + RDIM_BakeSrcNode *src_node = rdim_bake_src_node_from_path_node(arena, &path_tree, path_node); + dst_udt->file_idx = src_node->idx; + } + dst_udt->line = src_udt->line; + dst_udt->col = src_udt->col; + + //- rjf: fill members + if(src_udt->member_count != 0) + { + dst_udt->member_first = dst_member_idx; + dst_udt->member_count = src_udt->member_count; + for(RDIM_UDTMember *src_member = src_udt->first_member; + src_member != 0; + src_member = src_member->next, dst_member_idx += 1) + { + RDI_Member *dst_member = &members[dst_member_idx]; + dst_member->kind = src_member->kind; + dst_member->name_string_idx = rdim_bake_string(arena, &strings, src_member->name); + dst_member->type_idx = src_member->type ? src_member->type->idx : 0; + dst_member->off = src_member->off; + } + } + + //- rjf: fill enum members + else if(src_udt->enum_val_count != 0) + { + dst_udt->flags |= RDI_UserDefinedTypeFlag_EnumMembers; + dst_udt->member_first = dst_enum_member_idx; + dst_udt->member_count = src_udt->enum_val_count; + for(RDIM_UDTEnumVal *src_member = src_udt->first_enum_val; + src_member != 0; + src_member = src_member->next, dst_enum_member_idx += 1) + { + RDI_EnumMember *dst_member = &enum_members[dst_enum_member_idx]; + dst_member->name_string_idx = rdim_bake_string(arena, &strings, src_member->name); + dst_member->val = src_member->val; + } + } + } + } + } + + //////////////////////////// + //- rjf: push all type info sections + // + rdim_bake_section_list_push_new(arena, §ions, type_nodes, sizeof(RDI_TypeNode) * params->types.total_count, RDI_DataSectionTag_TypeNodes); + rdim_bake_section_list_push_new(arena, §ions, udts, sizeof(RDI_UDT) * params->udts.total_count, RDI_DataSectionTag_UDTs); + rdim_bake_section_list_push_new(arena, §ions, members , sizeof(RDI_Member) * params->udts.total_member_count, RDI_DataSectionTag_Members); + rdim_bake_section_list_push_new(arena, §ions, enum_members, sizeof(RDI_EnumMember) * params->udts.total_enum_val_count, RDI_DataSectionTag_EnumMembers); } ////////////////////////////// //- rjf: build sections for symbol info // - ProfScope("build sections for type info") + ProfScope("build sections for symbol info") { } @@ -1729,9 +1865,9 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) } ////////////////////////////// - //- rjf: build blob strings for header & all sections + //- rjf: finalize: build blob strings for header & all sections // - ProfScope("build blob strings for header & all sections") + ProfScope("finalize: build blob strings for header & all sections") { // rjf: push empty header & data section table RDI_Header *baked_rdi_header = rdim_push_array(arena, RDI_Header, 1); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index aa39b08e..e784acef 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -505,6 +505,7 @@ typedef struct RDIM_Type RDIM_Type; struct RDIM_Type { RDI_TypeKind kind; + RDI_U32 idx; RDI_U32 byte_size; RDI_U32 flags; RDI_U32 off; @@ -564,13 +565,14 @@ struct RDIM_UDTEnumVal typedef struct RDIM_UDT RDIM_UDT; struct RDIM_UDT { + RDI_U32 idx; RDIM_Type *self_type; RDIM_UDTMember *first_member; RDIM_UDTMember *last_member; - RDI_U64 member_count; RDIM_UDTEnumVal *first_enum_val; RDIM_UDTEnumVal *last_enum_val; - RDI_U64 enum_val_count; + RDI_U32 member_count; + RDI_U32 enum_val_count; RDIM_String8 source_path; RDI_U32 line; RDI_U32 col; @@ -592,6 +594,8 @@ struct RDIM_UDTChunkList RDIM_UDTChunkNode *last; RDI_U64 chunk_count; RDI_U64 total_count; + RDI_U64 total_member_count; + RDI_U64 total_enum_val_count; }; //////////////////////////////// @@ -774,6 +778,7 @@ struct RDIM_BakeParams RDIM_BinarySectionList binary_sections; RDIM_UnitChunkList units; RDIM_TypeChunkList types; + RDIM_UDTChunkList udts; RDIM_SymbolChunkList global_variables; RDIM_SymbolChunkList thread_variables; RDIM_SymbolChunkList procedures; @@ -1352,8 +1357,8 @@ RDI_PROC void rdim_type_chunk_list_push_array(RDIM_Arena *arena, RDIM_TypeChunkL RDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push); RDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap); RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push); -RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDT *udt); -RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDT *udt); +RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); +RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); //////////////////////////////// //~ rjf: Location Info Building diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 6a2ae202..6feead4c 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -4025,6 +4025,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) if(cv_basic_ptr_kind != 0) { dst_type->kind = RDI_TypeKind_Ptr; + dst_type->idx = (RDI_U32)(itype-itype_first); dst_type->byte_size = arch_addr_size; dst_type->direct_type = basic_type; } @@ -4607,7 +4608,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_DataField; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -4628,7 +4629,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_StaticData; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -4705,14 +4706,14 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { default: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_Method; mem->name = name; mem->type = method_type; }break; case CV_MethodProp_Static: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_StaticMethod; mem->name = name; mem->type = method_type; @@ -4722,7 +4723,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_VirtualMethod; mem->name = name; mem->type = method_type; @@ -4760,7 +4761,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { default: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_Method; mem->name = name; mem->type = method_type; @@ -4768,7 +4769,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) case CV_MethodProp_Static: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_StaticMethod; mem->name = name; mem->type = method_type; @@ -4779,7 +4780,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_VirtualMethod; mem->name = name; mem->type = method_type; @@ -4799,7 +4800,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_NestedType; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -4819,7 +4820,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_NestedType; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -4840,7 +4841,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = offset_ptr+offset.encoded_size; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_Base; mem->type = p2r_type_ptr_from_itype(lf->itype); mem->off = (U32)offset64; @@ -4862,7 +4863,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); mem->kind = RDI_MemberKind_VirtualBase; mem->type = p2r_type_ptr_from_itype(lf->itype); }break; @@ -5005,7 +5006,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, dst_udt); + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, &udts, dst_udt); enum_val->name = name; enum_val->val = val64; }break; @@ -5811,6 +5812,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) rdim_unit_chunk_list_push_array(arena, &out->units, &units); rdim_type_chunk_list_push_array(arena, &out->types, &itype_types); rdim_type_chunk_list_concat_in_place(&out->types, &extra_types); + out->udts = udts; out->global_variables = all_global_variables; out->thread_variables = all_thread_variables; out->procedures = all_procedures; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 7d1943f3..07bcd9dc 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -46,6 +46,7 @@ struct P2R_ConvertOut RDIM_BinarySectionList binary_sections; RDIM_UnitChunkList units; RDIM_TypeChunkList types; + RDIM_UDTChunkList udts; RDIM_SymbolChunkList global_variables; RDIM_SymbolChunkList thread_variables; RDIM_SymbolChunkList procedures; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 1c183fb0..d06b3e0b 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -87,6 +87,7 @@ main(int argc, char **argv) bake_params.top_level_info = convert_out->top_level_info; bake_params.binary_sections = convert_out->binary_sections; bake_params.types = convert_out->types; + bake_params.udts = convert_out->udts; bake_params.global_variables = convert_out->global_variables; bake_params.thread_variables = convert_out->thread_variables; bake_params.procedures = convert_out->procedures; From 5ae9259253dc6b732560d457ecab4f3ee64c788d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 09:04:15 -0800 Subject: [PATCH 072/275] raddbgi_from_pdb: global variable, thread variable, procedure, scope, local, location info baking --- src/lib_raddbgi_make/raddbgi_make.c | 600 ++++++++++++++++++++---- src/lib_raddbgi_make/raddbgi_make.h | 26 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 22 +- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 2 +- 4 files changed, 525 insertions(+), 125 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 0ef52b47..2ef8f731 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -531,7 +531,6 @@ rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 c list->chunk_count += 1; } RDIM_Type *result = &n->v[n->count]; - result->idx = (RDI_U32)list->total_count; n->count += 1; list->total_count += 1; return result; @@ -579,7 +578,6 @@ rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap list->chunk_count += 1; } RDIM_UDT *result = &n->v[n->count]; - result->idx = (RDI_U32)list->total_count; n->count += 1; list->total_count += 1; return result; @@ -623,7 +621,101 @@ rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt } //////////////////////////////// -//~ rjf: Location Info Building +//~ rjf: Symbol Info Building + +RDI_PROC RDIM_Symbol * +rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap) +{ + RDIM_SymbolChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_SymbolChunkNode, 1); + n->cap = cap; + n->v = rdim_push_array(arena, RDIM_Symbol, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Symbol *result = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC void +rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +//////////////////////////////// +//~ rjf: Scope Info Building + +//- rjf: scopes + +RDI_PROC RDIM_Scope * +rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap) +{ + RDIM_ScopeChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_ScopeChunkNode, 1); + n->cap = cap; + n->v = rdim_push_array(arena, RDIM_Scope, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Scope *result = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC void +rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC void +rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range) +{ + rdim_rng1u64_list_push(arena, &scope->voff_ranges, range); + list->scope_voff_count += 2; +} + +RDI_PROC RDIM_Local * +rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope) +{ + RDIM_Local *local = rdim_push_array(arena, RDIM_Local, 1); + RDIM_SLLQueuePush(scope->first_local, scope->last_local, local); + scope->local_count += 1; + scopes->local_count += 1; + return local; +} + +//- rjf: bytecode RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) @@ -705,94 +797,6 @@ rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *ri } } -//////////////////////////////// -//~ rjf: Symbol Info Building - -RDI_PROC RDIM_Symbol * -rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap) -{ - RDIM_SymbolChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_SymbolChunkNode, 1); - n->cap = cap; - n->v = rdim_push_array(arena, RDIM_Symbol, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_Symbol *result = &n->v[n->count]; - n->count += 1; - list->total_count += 1; - return result; -} - -RDI_PROC void -rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push) -{ - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -//////////////////////////////// -//~ rjf: Scope Info Building - -RDI_PROC RDIM_Scope * -rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap) -{ - RDIM_ScopeChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_ScopeChunkNode, 1); - n->cap = cap; - n->v = rdim_push_array(arena, RDIM_Scope, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_Scope *result = &n->v[n->count]; - n->count += 1; - list->total_count += 1; - return result; -} - -RDI_PROC void -rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push) -{ - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -RDI_PROC RDIM_Local * -rdim_scope_push_local(RDIM_Arena *arena, RDIM_Scope *scope) -{ - RDIM_Local *local = rdim_push_array(arena, RDIM_Local, 1); - RDIM_SLLQueuePush(scope->first_local, scope->last_local, local); - scope->local_count += 1; - return local; -} - -//////////////////////////////// -//~ rjf: Location Info Building - //- rjf: individual locations RDI_PROC RDIM_Location * @@ -845,13 +849,14 @@ rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg_code) //- rjf: location sets RDI_PROC void -rdim_location_set_push_case(RDIM_Arena *arena, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location) +rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location) { RDIM_LocationCase *location_case = rdim_push_array(arena, RDIM_LocationCase, 1); SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); locset->location_case_count += 1; location_case->voff_range = voff_range; location_case->location = location; + scopes->location_count +=1; } //////////////////////////////// @@ -1207,7 +1212,7 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey } } - vmap_entry_count_pass_1 = (RDI_U32)(vmap_ptr - vmap); + vmap_entry_count_pass_1 = (RDI_U32)(vmap_ptr - vmap); // TODO(rjf): @u64_to_u32 } //- rjf: combine duplicate neighbors @@ -1225,7 +1230,7 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey rdim_memcpy_struct(vmap_out, vmap_range_first); vmap_out += 1; } - vmap_entry_count = (RDI_U32)(vmap_out - vmap); + vmap_entry_count = (RDI_U32)(vmap_out - vmap); // TODO(rjf): @u64_to_u32 } //- rjf: fill result @@ -1241,6 +1246,7 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey RDI_PROC RDIM_String8List rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); RDIM_String8List blobs; rdim_memzero_struct(&blobs); @@ -1416,7 +1422,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////// //- rjf: build line info sections // - RDI_U32 line_info_voffs_data_idx = (RDI_U32)sections.count; + RDI_U32 line_info_voffs_data_idx = (RDI_U32)sections.count; // TODO(rjf): @u64_to_u32 RDI_U32 line_info_data_idx = line_info_voffs_data_idx+1; RDI_U32 line_info_col_data_idx = unit_cols ? line_info_voffs_data_idx+2 : 0; rdim_bake_section_list_push_new(arena, §ions, unit_voffs, sizeof(RDI_U64)*(unit_line_count+1), RDI_DataSectionTag_LineInfoVoffs); @@ -1567,7 +1573,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) for(RDI_U32 i = 0; i < line_count; i += 1) { line_nums[i] = sorted_keys[i].key; - line_ranges[i] = (RDI_U32)(voff_ptr - voffs); + line_ranges[i] = (RDI_U32)(voff_ptr - voffs); // TODO(rjf): @u64_to_u32 RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next) { @@ -1593,7 +1599,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) if(src_file_line_count != 0) { src_file_node->line_map_count = src_file_line_count; - src_file_node->line_map_nums_data_idx = (RDI_U32)sections.count; + src_file_node->line_map_nums_data_idx = (RDI_U32)sections.count; // TODO(rjf): @u64_to_u32 src_file_node->line_map_range_data_idx = src_file_node->line_map_nums_data_idx+1; src_file_node->line_map_voff_data_idx = src_file_node->line_map_nums_data_idx+2; rdim_bake_section_list_push_new(arena, §ions, src_file_line_nums, sizeof(*src_file_line_nums)*src_file_line_count, RDI_DataSectionTag_LineMapNumbers); @@ -1685,6 +1691,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: build all type nodes // RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count); + ProfScope("push all type nodes") { RDI_U64 dst_idx = 0; for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) @@ -1749,6 +1756,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count); RDI_Member * members = push_array(arena, RDI_Member, params->udts.total_member_count); RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, params->udts.total_enum_val_count); + ProfScope("build all udts & members") { RDI_U32 dst_udt_idx = 0; RDI_U32 dst_member_idx = 0; @@ -1810,10 +1818,13 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: push all type info sections // - rdim_bake_section_list_push_new(arena, §ions, type_nodes, sizeof(RDI_TypeNode) * params->types.total_count, RDI_DataSectionTag_TypeNodes); - rdim_bake_section_list_push_new(arena, §ions, udts, sizeof(RDI_UDT) * params->udts.total_count, RDI_DataSectionTag_UDTs); - rdim_bake_section_list_push_new(arena, §ions, members , sizeof(RDI_Member) * params->udts.total_member_count, RDI_DataSectionTag_Members); - rdim_bake_section_list_push_new(arena, §ions, enum_members, sizeof(RDI_EnumMember) * params->udts.total_enum_val_count, RDI_DataSectionTag_EnumMembers); + ProfScope("push all type info sections") + { + rdim_bake_section_list_push_new(arena, §ions, type_nodes, sizeof(RDI_TypeNode) * params->types.total_count, RDI_DataSectionTag_TypeNodes); + rdim_bake_section_list_push_new(arena, §ions, udts, sizeof(RDI_UDT) * params->udts.total_count, RDI_DataSectionTag_UDTs); + rdim_bake_section_list_push_new(arena, §ions, members , sizeof(RDI_Member) * params->udts.total_member_count, RDI_DataSectionTag_Members); + rdim_bake_section_list_push_new(arena, §ions, enum_members, sizeof(RDI_EnumMember) * params->udts.total_enum_val_count, RDI_DataSectionTag_EnumMembers); + } } ////////////////////////////// @@ -1821,7 +1832,393 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // ProfScope("build sections for symbol info") { + //////////////////////////// + //- rjf: build all global variables + // + RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count); + ProfScope("build all global variables") + { + RDI_U32 dst_idx = 0; + for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_GlobalVariable *dst = &global_variables[dst_idx]; + dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->voff = src->offset; + dst->type_idx = src->type ? src->type->idx : 0;; + if(src->is_extern) + { + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type && src->container_type->udt ? src->container_type->udt->idx : 0;; + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = src->container_symbol->idx; + } + } + } + } + //////////////////////////// + //- rjf: build all thread variables + // + RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count); + ProfScope("build all thread variables") + { + RDI_U32 dst_idx = 0; + for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_ThreadVariable *dst = &thread_variables[dst_idx]; + dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 + dst->type_idx = src->type ? src->type->idx : 0;; + if(src->is_extern) + { + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type && src->container_type->udt ? src->container_type->udt->idx : 0;; + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = src->container_symbol->idx; + } + } + } + } + + //////////////////////////// + //- rjf: build all procedures + // + RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count); + ProfScope("build all procedures") + { + RDI_U32 dst_idx = 0; + for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_Procedure *dst = &procedures[dst_idx]; + dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->link_name_string_idx = rdim_bake_string(arena, &strings, src->link_name); + if(src->is_extern) + { + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type && src->container_type->udt ? src->container_type->udt->idx : 0;; + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = src->container_symbol->idx; + } + dst->type_idx = src->type ? src->type->idx : 0; + dst->root_scope_idx = src->root_scope ? src->root_scope->idx : 0; + } + } + } + + //////////////////////////// + //- rjf: build global vmap + // + RDIM_VMap global_vmap = {0}; + ProfScope("build global vmap") + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: allocate keys/markers + RDI_U64 marker_count = params->global_variables.total_count*2; + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + //- rjf: fill + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + + // rjf: fill actual globals + for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + RDIM_Symbol *global_var = &n->v[chunk_idx]; + RDI_U32 global_var_idx = global_var->idx; + + RDI_U64 first = global_var->offset; + RDI_U64 opl = first + global_var->type->byte_size; + + key_ptr->key = first; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_var_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_var_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + + // rjf: fill nil global + { + RDI_U32 global_idx = 0; + RDI_U64 first = 0; + RDI_U64 opl = 0xffffffffffffffffull; + key_ptr->key = first; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + key_ptr->key = opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + + // rjf: construct vmap + global_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); + + rdim_scratch_end(scratch); + } + + //////////////////////////// + //- rjf: build all scopes, scope voffs, locals, and location blocks + // + RDI_Scope * scopes = rdim_push_array(arena, RDI_Scope, params->scopes.total_count); + RDI_U64 * scope_voffs = rdim_push_array(arena, RDI_U64, params->scopes.scope_voff_count); + RDI_Local * locals = rdim_push_array(arena, RDI_Local, params->scopes.local_count); + RDI_LocationBlock * location_blocks = rdim_push_array(arena, RDI_LocationBlock, params->scopes.location_count); + RDIM_String8List location_data_blobs = {0}; + ProfScope("build all scopes, scope voffs, locals, and location blocks") + { + RDI_U64 dst_scope_idx = 0; + RDI_U64 dst_scope_voff_idx = 0; + RDI_U64 dst_local_idx = 0; + RDI_U64 dst_location_block_idx = 0; + for(RDIM_ScopeChunkNode *chunk_n = params->scopes.first; chunk_n != 0; chunk_n = chunk_n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1, dst_scope_idx += 1) + { + RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; + RDI_Scope *dst_scope = &scopes[dst_scope_idx]; + + //- rjf: push scope's voffs + RDI_U64 voff_idx_first = dst_scope_voff_idx; + { + for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) + { + scope_voffs[dst_scope_voff_idx] = n->v.min; + dst_scope_voff_idx += 1; + scope_voffs[dst_scope_voff_idx] = n->v.max; + dst_scope_voff_idx += 1; + } + } + RDI_U64 voff_idx_opl = dst_scope_voff_idx; + + //- rjf: push locals + RDI_U64 local_idx_first = dst_local_idx; + for(RDIM_Local *src_local = src_scope->first_local; + src_local != 0; + src_local = src_local->next, dst_local_idx += 1) + { + //- rjf: push local's locations + RDI_U64 location_block_idx_first = dst_location_block_idx; + for(RDIM_LocationCase *loccase = src_local->locset.first_location_case; + loccase != 0; + loccase = loccase->next, dst_location_block_idx += 1) + { + // rjf: fill location block + RDI_LocationBlock *dst_locblock = &location_blocks[dst_location_block_idx]; + dst_locblock->scope_off_first = loccase->voff_range.min; + dst_locblock->scope_off_opl = loccase->voff_range.max; + dst_locblock->location_data_off = location_data_blobs.total_size; + + // rjf: serialize location into location data + RDIM_Location *src_location = loccase->location; + { + // rjf: nil location + if(src_location == 0) + { + rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); + } + + // rjf: valid location + else switch(src_location->kind) + { + // rjf: catchall unsupported case + default: + { + rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); + }break; + + // rjf: bytecode streams + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: + { + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&src_location->kind))); + for(RDIM_EvalBytecodeOp *op_node = src_location->bytecode.first_op; + op_node != 0; + op_node = op_node->next) + { + RDI_U8 op_data[9]; + op_data[0] = op_node->op; + rdim_memcpy(op_data + 1, &op_node->p, op_node->p_size); + RDIM_String8 op_data_str = rdim_str8(op_data, 1 + op_node->p_size); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, op_data_str)); + } + { + RDI_U64 data = 0; + RDIM_String8 data_str = rdim_str8((RDI_U8 *)&data, 1); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, data_str)); + } + }break; + + // rjf: simple addr+off cases + case RDI_LocationKind_AddrRegisterPlusU16: + case RDI_LocationKind_AddrAddrRegisterPlusU16: + { + RDI_LocationRegisterPlusU16 loc = {0}; + loc.kind = src_location->kind; + loc.register_code = src_location->register_code; + loc.offset = src_location->offset; + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); + }break; + + // rjf: register cases + case RDI_LocationKind_ValRegister: + { + RDI_LocationRegister loc = {0}; + loc.kind = src_location->kind; + loc.register_code = src_location->register_code; + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); + }break; + } + } + } + RDI_U64 location_block_idx_opl = dst_location_block_idx; + + //- rjf: fill local + RDI_Local *dst_local = &locals[dst_local_idx]; + dst_local->kind = src_local->kind; + dst_local->name_string_idx = rdim_bake_string(arena, &strings, src_local->name); + dst_local->type_idx = src_local->type ? src_local->type->idx : 0; + dst_local->location_first = (RDI_U32)location_block_idx_first; // TODO(rjf): @u64_to_u32 + dst_local->location_opl = (RDI_U32)location_block_idx_opl; // TODO(rjf): @u64_to_u32 + } + RDI_U64 local_idx_opl = dst_local_idx; + + //- rjf: fill scope + dst_scope->proc_idx = src_scope->symbol? src_scope->symbol->idx :0; + dst_scope->parent_scope_idx = src_scope->parent_scope? src_scope->parent_scope->idx :0; + dst_scope->first_child_scope_idx = src_scope->first_child? src_scope->first_child->idx :0; + dst_scope->next_sibling_scope_idx = src_scope->next_sibling? src_scope->next_sibling->idx :0; + dst_scope->voff_range_first = (RDI_U32)voff_idx_first; // TODO(rjf): @u64_to_u32 + dst_scope->voff_range_opl = (RDI_U32)voff_idx_opl; // TODO(rjf): @u64_to_u32 + dst_scope->local_first = (RDI_U32)local_idx_first; // TODO(rjf): @u64_to_u32 + dst_scope->local_count = (RDI_U32)(local_idx_opl - local_idx_first); // TODO(rjf): @u64_to_u32 + } + } + } + + //////////////////////////// + //- rjf: build flattened location data + // + RDIM_String8 location_data_blob = {0}; + ProfScope("build flattened location data") + { + location_data_blob = rdim_str8_list_join(arena, &location_data_blobs, rdim_str8_lit("")); + } + + //////////////////////////// + //- rjf: build scope vmap + // + RDIM_VMap scope_vmap = {0}; + ProfScope("build scope vmap") + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: allocate keys/markers + RDI_U64 marker_count = params->scopes.scope_voff_count; + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + // rjf: fill + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + for(RDIM_ScopeChunkNode *chunk_n = params->scopes.first; chunk_n != 0; chunk_n = chunk_n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1) + { + RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; + RDI_U32 scope_idx = src_scope->idx; + for(RDIM_Rng1U64Node *n = 0; n != 0; n = n->next) + { + key_ptr->key = n->v.min; + key_ptr->val = marker_ptr; + marker_ptr->idx = scope_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = n->v.max; + key_ptr->val = marker_ptr; + marker_ptr->idx = scope_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + } + } + + // rjf: produce vmap + scope_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); + rdim_scratch_end(scratch); + } + + //////////////////////////// + //- rjf: push all symbol info sections + // + ProfScope("push all symbol info sections") + { + rdim_bake_section_list_push_new(arena, §ions, global_variables, sizeof(RDI_GlobalVariable) * params->global_variables.total_count, RDI_DataSectionTag_GlobalVariables); + rdim_bake_section_list_push_new(arena, §ions, global_vmap.vmap, sizeof(RDI_U64) * (global_vmap.count+1), RDI_DataSectionTag_GlobalVmap); + rdim_bake_section_list_push_new(arena, §ions, thread_variables, sizeof(RDI_ThreadVariable) * params->thread_variables.total_count, RDI_DataSectionTag_ThreadVariables); + rdim_bake_section_list_push_new(arena, §ions, procedures, sizeof(RDI_Procedure) * params->procedures.total_count, RDI_DataSectionTag_Procedures); + rdim_bake_section_list_push_new(arena, §ions, scopes, sizeof(RDI_Scope) * params->scopes.total_count, RDI_DataSectionTag_Scopes); + rdim_bake_section_list_push_new(arena, §ions, scope_vmap.vmap, sizeof(RDI_U64) * (scope_vmap.count+1), RDI_DataSectionTag_ScopeVmap); + rdim_bake_section_list_push_new(arena, §ions, locals, sizeof(RDI_Local) * params->scopes.local_count, RDI_DataSectionTag_Locals); + rdim_bake_section_list_push_new(arena, §ions, location_blocks, sizeof(RDI_LocationBlock) * params->scopes.location_count, RDI_DataSectionTag_LocationBlocks); + rdim_bake_section_list_push_new(arena, §ions, location_data_blob.str, location_data_blob.size, RDI_DataSectionTag_LocationData); + } } ////////////////////////////// @@ -1906,6 +2303,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) } } + rdim_scratch_end(scratch); return blobs; } diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index e784acef..08f9aff1 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -661,6 +661,7 @@ typedef struct RDIM_Symbol RDIM_Symbol; struct RDIM_Symbol { RDIM_SymbolKind kind; + RDI_U32 idx; RDI_S32 is_extern; RDIM_String8 name; RDIM_String8 link_name; @@ -714,6 +715,7 @@ struct RDIM_Scope RDIM_Local *first_local; RDIM_Local *last_local; RDI_U32 local_count; + RDI_U32 idx; }; typedef struct RDIM_ScopeChunkNode RDIM_ScopeChunkNode; @@ -732,6 +734,9 @@ struct RDIM_ScopeChunkList RDIM_ScopeChunkNode *last; RDI_U64 chunk_count; RDI_U64 total_count; + RDI_U64 scope_voff_count; + RDI_U64 local_count; + RDI_U64 location_count; }; //////////////////////////////// @@ -1360,14 +1365,6 @@ RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_U RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); -//////////////////////////////// -//~ rjf: Location Info Building - -RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); -RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); -RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); -RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); - //////////////////////////////// //~ rjf: Symbol Info Building @@ -1377,12 +1374,17 @@ RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, //////////////////////////////// //~ rjf: Scope Info Building +//- rjf: scopes RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap); RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push); -RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_Scope *scope); +RDI_PROC void rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range); +RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope); -//////////////////////////////// -//~ rjf: Location Info Building +//- rjf: bytecode +RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); +RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); +RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); +RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); //- rjf: individual locations RDI_PROC RDIM_Location *rdim_push_location_addr_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode); @@ -1392,7 +1394,7 @@ RDI_PROC RDIM_Location *rdim_push_location_addr_addr_reg_plus_u16(RDIM_Arena *ar RDI_PROC RDIM_Location *rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg_code); //- rjf: location sets -RDI_PROC void rdim_location_set_push_case(RDIM_Arena *arena, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location); +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 diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 6feead4c..5d37335c 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -498,7 +498,7 @@ p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encod } internal void -p2r_location_over_lvar_addr_range(Arena *arena, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) +p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) { //- rjf: extract range info U64 voff_first = 0; @@ -519,7 +519,7 @@ p2r_location_over_lvar_addr_range(Arena *arena, RDIM_LocationSet *locset, RDIM_L if(voff_cursor < voff_gap_first) { RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first}; - rdim_location_set_push_case(arena, locset, voff_range, location); + rdim_location_set_push_case(arena, scopes, locset, voff_range, location); } voff_cursor = voff_gap_opl; } @@ -528,7 +528,7 @@ p2r_location_over_lvar_addr_range(Arena *arena, RDIM_LocationSet *locset, RDIM_L if(voff_cursor < voff_opl) { RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl}; - rdim_location_set_push_case(arena, locset, voff_range, location); + rdim_location_set_push_case(arena, scopes, locset, voff_range, location); } } @@ -5472,7 +5472,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: build local RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, scope); + RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); local->kind = local_kind; local->name = name; local->type = type; @@ -5502,7 +5502,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: set location case RDIM_Location *loc = p2r_location_from_addr_reg_off(arena, arch, register_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_set_push_case(arena, &local->locset, voff_range, loc); + rdim_location_set_push_case(arena, &sym_scopes, &local->locset, voff_range, loc); } }break; @@ -5587,7 +5587,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: build local RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, scope); + RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); local->kind = local_kind; local->name = name; local->type = type; @@ -5621,7 +5621,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, defrange_target, location, range, range_section, gaps, gap_count); + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_FRAMEPOINTER_REL @@ -5667,7 +5667,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, defrange_target, location, range, range_section, gaps, gap_count); + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_SUBFIELD_REGISTER @@ -5699,7 +5699,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, defrange_target, location, range, range_section, gaps, gap_count); + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE @@ -5740,7 +5740,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: emit location over ranges RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_set_push_case(arena, defrange_target, voff_range, location); + rdim_location_set_push_case(arena, &sym_scopes, defrange_target, voff_range, location); }break; //- rjf: DEFRANGE_REGISTER_REL @@ -5771,7 +5771,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, register_code, byte_size, byte_pos, var_off, extra_indirection_to_value); // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, defrange_target, location, range, range_section, gaps, gap_count); + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); }break; //- rjf: FILESTATIC diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 07bcd9dc..ab565d69 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -274,7 +274,7 @@ internal RDI_TypeKind rdi_type_kind_from_cv_basic_type(CV_BasicType basic_ty internal RDIM_Location *p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegisterCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFrameproc *frameproc, B32 param_base); internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); -internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); +internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); //////////////////////////////// From a38241ebe01a92b0171a9bec848fbe1c6e8e1bcc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 11:18:48 -0800 Subject: [PATCH 073/275] raddbgi_make: overrideable profile macros; raddbgi_from_pdb: itype name resolution, link anme resolution --- src/lib_raddbgi_make/raddbgi_make.c | 66 +++++++++++++-------- src/lib_raddbgi_make/raddbgi_make.h | 17 ++++++ src/raddbgi_from_pdb/raddbgi_from_pdb.c | 34 ++++++++--- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 1 + src/raddbgi_make_local/raddbgi_make_local.h | 4 ++ 5 files changed, 90 insertions(+), 32 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 2ef8f731..0387adba 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1250,6 +1250,24 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDIM_String8List blobs; rdim_memzero_struct(&blobs); + ////////////////////////////// + //- NOTE(rjf): On the ordering of baking phases: + // + // Baking is the process of taking all loose data structures passed in via + // `params`, or constructed on-the-fly (e.g. the `BakeStringMap`), and + // serializing them down into flat plain-old-data tables which can be + // written directly into a RADDBGI file. + // + // Perhaps unsurprisingly, after each loose data structure is baked, it can + // no longer be mutated and touched (otherwise you'd need to re-bake to + // preserve new information added to the loose data structure). + // + // The phases of baking in this baking algorithm are organized such that re- + // baking never occurs. This means that common baking data structures, like + // the string interning map (`BakeStringMap`), the index run interning map + // (`BakeIdxRunMap`), and so on, are serialized *last*, because they are + // used in previous stages of the bake. + ////////////////////////////// //- rjf: set up intermediate baking data structures // @@ -1268,7 +1286,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build section for top-level-info // - ProfScope("build section for top-level-info") + RDIM_ProfScope("build section for top-level-info") { RDI_TopLevelInfo *dst_tli = rdim_push_array(arena, RDI_TopLevelInfo, 1); RDIM_TopLevelInfo *src_tli = ¶ms->top_level_info; @@ -1282,7 +1300,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build section for binary sections // - ProfScope("build section for binary sections") + RDIM_ProfScope("build section for binary sections") { RDIM_BinarySectionList *src_list = ¶ms->binary_sections; RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src_list->count); @@ -1304,7 +1322,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build sections for units // - ProfScope("build sections for units") + RDIM_ProfScope("build sections for units") { RDIM_UnitChunkList *src_list = ¶ms->units; RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, src_list->total_count); @@ -1453,7 +1471,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build section for per-source-file line info // - ProfScope("build section for per-source-file line info") + RDIM_ProfScope("build section for per-source-file line info") { for(RDIM_BakeSrcNode *src_file_node = path_tree.src_first; src_file_node != 0; @@ -1612,7 +1630,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build section for unit vmap // - ProfScope("build section for unit vmap") + RDIM_ProfScope("build section for unit vmap") { //- rjf: build vmap from unit voff ranges RDIM_VMap unit_vmap = {0}; @@ -1685,13 +1703,13 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build sections for type info // - ProfScope("build sections for type info") + RDIM_ProfScope("build sections for type info") { //////////////////////////// //- rjf: build all type nodes // RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count); - ProfScope("push all type nodes") + RDIM_ProfScope("push all type nodes") { RDI_U64 dst_idx = 0; for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) @@ -1756,7 +1774,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count); RDI_Member * members = push_array(arena, RDI_Member, params->udts.total_member_count); RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, params->udts.total_enum_val_count); - ProfScope("build all udts & members") + RDIM_ProfScope("build all udts & members") { RDI_U32 dst_udt_idx = 0; RDI_U32 dst_member_idx = 0; @@ -1818,7 +1836,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: push all type info sections // - ProfScope("push all type info sections") + RDIM_ProfScope("push all type info sections") { rdim_bake_section_list_push_new(arena, §ions, type_nodes, sizeof(RDI_TypeNode) * params->types.total_count, RDI_DataSectionTag_TypeNodes); rdim_bake_section_list_push_new(arena, §ions, udts, sizeof(RDI_UDT) * params->udts.total_count, RDI_DataSectionTag_UDTs); @@ -1830,13 +1848,13 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build sections for symbol info // - ProfScope("build sections for symbol info") + RDIM_ProfScope("build sections for symbol info") { //////////////////////////// //- rjf: build all global variables // RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count); - ProfScope("build all global variables") + RDIM_ProfScope("build all global variables") { RDI_U32 dst_idx = 0; for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) @@ -1870,7 +1888,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: build all thread variables // RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count); - ProfScope("build all thread variables") + RDIM_ProfScope("build all thread variables") { RDI_U32 dst_idx = 0; for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) @@ -1904,7 +1922,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: build all procedures // RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count); - ProfScope("build all procedures") + RDIM_ProfScope("build all procedures") { RDI_U32 dst_idx = 0; for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) @@ -1939,7 +1957,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: build global vmap // RDIM_VMap global_vmap = {0}; - ProfScope("build global vmap") + RDIM_ProfScope("build global vmap") { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -2014,7 +2032,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_Local * locals = rdim_push_array(arena, RDI_Local, params->scopes.local_count); RDI_LocationBlock * location_blocks = rdim_push_array(arena, RDI_LocationBlock, params->scopes.location_count); RDIM_String8List location_data_blobs = {0}; - ProfScope("build all scopes, scope voffs, locals, and location blocks") + RDIM_ProfScope("build all scopes, scope voffs, locals, and location blocks") { RDI_U64 dst_scope_idx = 0; RDI_U64 dst_scope_voff_idx = 0; @@ -2151,7 +2169,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: build flattened location data // RDIM_String8 location_data_blob = {0}; - ProfScope("build flattened location data") + RDIM_ProfScope("build flattened location data") { location_data_blob = rdim_str8_list_join(arena, &location_data_blobs, rdim_str8_lit("")); } @@ -2160,7 +2178,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: build scope vmap // RDIM_VMap scope_vmap = {0}; - ProfScope("build scope vmap") + RDIM_ProfScope("build scope vmap") { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -2207,7 +2225,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: push all symbol info sections // - ProfScope("push all symbol info sections") + RDIM_ProfScope("push all symbol info sections") { rdim_bake_section_list_push_new(arena, §ions, global_variables, sizeof(RDI_GlobalVariable) * params->global_variables.total_count, RDI_DataSectionTag_GlobalVariables); rdim_bake_section_list_push_new(arena, §ions, global_vmap.vmap, sizeof(RDI_U64) * (global_vmap.count+1), RDI_DataSectionTag_GlobalVmap); @@ -2224,7 +2242,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build sections for name maps // - ProfScope("build sections for name maps") + RDIM_ProfScope("build sections for name maps") { } @@ -2232,7 +2250,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build sections for file paths // - ProfScope("build sections for file paths") + RDIM_ProfScope("build sections for file paths") { } @@ -2240,7 +2258,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build sections for source files // - ProfScope("build sections for source files") + RDIM_ProfScope("build sections for source files") { } @@ -2248,7 +2266,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build sections for strings // - ProfScope("build sections for strings") + RDIM_ProfScope("build sections for strings") { } @@ -2256,7 +2274,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: build section for index runs // - ProfScope("build section for index runs") + RDIM_ProfScope("build section for index runs") { } @@ -2264,7 +2282,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: finalize: build blob strings for header & all sections // - ProfScope("finalize: build blob strings for header & all sections") + RDIM_ProfScope("finalize: build blob strings for header & all sections") { // rjf: push empty header & data section table RDI_Header *baked_rdi_header = rdim_push_array(arena, RDI_Header, 1); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 08f9aff1..ea5ac395 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -189,6 +189,23 @@ struct RDIM_Temp # define rdim_scratch_end rdim_scratch_end_fallback #endif +//////////////////////////////// +//~ rjf: Overrideable Profile Markup + +// To override the default profiling markup, do the following: +// +// #define RDIM_ProfBegin(...) +// #define RDIM_ProfEnd() + +#if !defined(RDIM_ProfBegin) +# define RDIM_ProfBegin(...) ((void)0) +#endif +#if !defined(RDIM_ProfEnd) +# define RDIM_ProfEnd() ((void)0) +#endif + +#define RDIM_ProfScope(...) for(int _i_ = ((RDIM_ProfBegin(__VA_ARGS__)), 0); !_i_; _i_ += 1, (RDIM_ProfEnd())) + //////////////////////////////// //~ rjf: Linked List Helper Macros diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 5d37335c..a295b4db 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -26,6 +26,13 @@ p2r_end_of_cplusplus_container_name(String8 str) return(result); } +internal U64 +p2r_hash_from_voff(U64 voff) +{ + U64 hash = (voff >> 3) ^ ((7 & voff) << 6); + return hash; +} + //////////////////////////////// //~ rjf: Command Line -> Conversion Inputs @@ -5066,7 +5073,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } // rjf: commit to link name map - U64 hash = (voff >> 3) ^ ((7 & voff) << 6); + U64 hash = p2r_hash_from_voff(voff); U64 bucket_idx = hash%link_name_map.buckets_count; P2R_LinkNameNode *node = push_array(arena, P2R_LinkNameNode, 1); SLLStackPush(link_name_map.buckets[bucket_idx], node); @@ -5321,8 +5328,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) if(container_name_opl > 2) { String8 container_name = str8(name.str, container_name_opl - 2); - // TODO(rjf): @important type name maps - // container_type = p2r_type_from_name(ctx, container_name); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); } // rjf: unpack global's container symbol @@ -5359,8 +5366,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) if(container_name_opl > 2) { String8 container_name = str8(name.str, container_name_opl - 2); - // TODO(rjf): @important type name maps - // container_type = p2r_type_from_name(ctx, container_name); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); } // rjf: unpack proc's container symbol @@ -5393,7 +5400,18 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) String8 link_name = {0}; if(procedure_root_scope->voff_ranges.min != 0) { - // TODO(rjf): @important link names + U64 voff = procedure_root_scope->voff_ranges.min; + U64 hash = p2r_hash_from_voff(voff); + U64 bucket_idx = hash%link_name_map.buckets_count; + P2R_LinkNameNode *node = 0; + for(P2R_LinkNameNode *n = link_name_map.buckets[bucket_idx]; n != 0; n = n->next) + { + if(n->voff == voff) + { + link_name = n->name; + break; + } + } } // rjf: build procedure symbol @@ -5522,8 +5540,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) if(container_name_opl > 2) { String8 container_name = str8(name.str, container_name_opl - 2); - // TODO(rjf): @important type name maps - // container_type = p2r_type_from_name(ctx, container_name); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); } // rjf: unpack thread variable's container symbol diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index ab565d69..d2ac7334 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -249,6 +249,7 @@ struct P2R_Out //~ rjf: Basic Helpers internal U64 p2r_end_of_cplusplus_container_name(String8 str); +internal U64 p2r_hash_from_voff(U64 voff); //////////////////////////////// //~ rjf: Command Line -> Conversion Inputs diff --git a/src/raddbgi_make_local/raddbgi_make_local.h b/src/raddbgi_make_local/raddbgi_make_local.h index 2f3236da..d4201e24 100644 --- a/src/raddbgi_make_local/raddbgi_make_local.h +++ b/src/raddbgi_make_local/raddbgi_make_local.h @@ -41,6 +41,10 @@ #define rdim_scratch_begin scratch_begin #define rdim_scratch_end scratch_end +// rjf: base layer profiling markup overrides +#define RDIM_ProfBegin(...) ProfBeginDynamic(__VA_ARGS__) +#define RDIM_ProfEnd(...) ProfEnd() + #include "lib_raddbgi_make/raddbgi_make.h" #endif // RDI_CONS_LOCAL_H From 335f22e00be318a4f0a858158edbce7486de1f80 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 11:53:03 -0800 Subject: [PATCH 074/275] raddbgi_make & raddbgi_from_pdb: solve multithreaded 'indexing' problem - how do we correllate loose pointer relationships, constructed by various threads, with final indices in the baked file --- src/lib_raddbgi_make/raddbgi_make.c | 164 +++++++++++++++--------- src/lib_raddbgi_make/raddbgi_make.h | 31 ++--- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 39 +++--- 3 files changed, 138 insertions(+), 96 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 0387adba..328d4e60 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -445,38 +445,43 @@ rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list) //~ rjf: Unit List Building RDI_PROC RDIM_Unit * -rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list) +rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap) { RDIM_UnitChunkNode *n = list->last; if(n == 0 || n->count >= n->cap) { n = rdim_push_array(arena, RDIM_UnitChunkNode, 1); - n->cap = 512; + n->cap = cap; + n->base_idx = list->total_count; n->v = rdim_push_array(arena, RDIM_Unit, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } RDIM_Unit *unit = &n->v[n->count]; + unit->chunk = n; n->count += 1; list->total_count += 1; return unit; } -RDI_PROC void -rdim_unit_chunk_list_push_array(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDIM_UnitArray *array) +RDI_PROC RDI_U64 +rdim_idx_from_unit(RDIM_Unit *unit) { - RDIM_UnitChunkNode *n = rdim_push_array(arena, RDIM_UnitChunkNode, 1); - RDIM_SLLQueuePush(list->first, list->last, n); - n->count = array->count; - n->cap = array->count; - n->v = array->v; - list->total_count += n->count; - list->chunk_count += 1; + RDI_U64 idx = 0; + if(unit != 0 && unit->chunk != 0) + { + idx = unit->chunk->base_idx + (unit - unit->chunk->v); + } + return idx; } RDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push) { + for(RDIM_UnitChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } if(dst->last != 0 && to_push->first != 0) { dst->last->next = to_push->first; @@ -500,21 +505,6 @@ rdim_line_sequence_list_push(RDIM_Arena *arena, RDIM_LineSequenceList *list) return &n->v; } -RDI_PROC RDIM_UnitArray -rdim_unit_array_from_chunk_list(RDIM_Arena *arena, RDIM_UnitChunkList *list) -{ - RDIM_UnitArray array = {0}; - array.count = list->total_count; - array.v = rdim_push_array(arena, RDIM_Unit, array.count); - U64 idx = 0; - for(RDIM_UnitChunkNode *n = list->first; n != 0; n = n->next) - { - rdim_memcpy(array.v+idx, n->v, sizeof(RDIM_Unit)*n->count); - idx += n->count; - } - return array; -} - //////////////////////////////// //~ rjf: Type Info Building @@ -526,31 +516,36 @@ rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 c { n = rdim_push_array(arena, RDIM_TypeChunkNode, 1); n->cap = cap; + n->base_idx = list->total_count; n->v = rdim_push_array(arena, RDIM_Type, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } RDIM_Type *result = &n->v[n->count]; + result->chunk = n; n->count += 1; list->total_count += 1; return result; } -RDI_PROC void -rdim_type_chunk_list_push_array(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDIM_TypeArray *array) +RDI_PROC RDI_U64 +rdim_idx_from_type(RDIM_Type *type) { - RDIM_TypeChunkNode *n = rdim_push_array(arena, RDIM_TypeChunkNode, 1); - RDIM_SLLQueuePush(list->first, list->last, n); - n->count = array->count; - n->cap = array->count; - n->v = array->v; - list->total_count += n->count; - list->chunk_count += 1; + RDI_U64 idx = 0; + if(type != 0 && type->chunk != 0) + { + idx = type->chunk->base_idx + (type - type->chunk->v); + } + return idx; } RDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push) { + for(RDIM_TypeChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } if(dst->last != 0 && to_push->first != 0) { dst->last->next = to_push->first; @@ -573,19 +568,36 @@ rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap { n = rdim_push_array(arena, RDIM_UDTChunkNode, 1); n->cap = cap; + n->base_idx = list->total_count; n->v = rdim_push_array(arena, RDIM_UDT, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } RDIM_UDT *result = &n->v[n->count]; + result->chunk = n; n->count += 1; list->total_count += 1; return result; } +RDI_PROC RDI_U64 +rdim_idx_from_udt(RDIM_UDT *udt) +{ + RDI_U64 idx = 0; + if(udt != 0 && udt->chunk != 0) + { + idx = udt->chunk->base_idx + (udt - udt->chunk->v); + } + return idx; +} + RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push) { + for(RDIM_UDTChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } if(dst->last != 0 && to_push->first != 0) { dst->last->next = to_push->first; @@ -631,19 +643,36 @@ rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U { n = rdim_push_array(arena, RDIM_SymbolChunkNode, 1); n->cap = cap; + n->base_idx = list->total_count; n->v = rdim_push_array(arena, RDIM_Symbol, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } RDIM_Symbol *result = &n->v[n->count]; + result->chunk = n; n->count += 1; list->total_count += 1; return result; } +RDI_PROC RDI_U64 +rdim_idx_from_symbol(RDIM_Symbol *symbol) +{ + RDI_U64 idx = 0; + if(symbol != 0 && symbol->chunk != 0) + { + idx = symbol->chunk->base_idx + (symbol - symbol->chunk->v); + } + return idx; +} + RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push) { + for(RDIM_SymbolChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } if(dst->last != 0 && to_push->first != 0) { dst->last->next = to_push->first; @@ -671,19 +700,36 @@ rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 { n = rdim_push_array(arena, RDIM_ScopeChunkNode, 1); n->cap = cap; + n->base_idx = list->total_count; n->v = rdim_push_array(arena, RDIM_Scope, n->cap); RDIM_SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } RDIM_Scope *result = &n->v[n->count]; + result->chunk = n; n->count += 1; list->total_count += 1; return result; } +RDI_PROC RDI_U64 +rdim_idx_from_scope(RDIM_Scope *scope) +{ + RDI_U64 idx = 0; + if(scope != 0 && scope->chunk != 0) + { + idx = scope->chunk->base_idx + (scope - scope->chunk->v); + } + return idx; +} + RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push) { + for(RDIM_ScopeChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } if(dst->last != 0 && to_push->first != 0) { dst->last->next = to_push->first; @@ -906,7 +952,7 @@ rdim_bake_string(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string // rjf: no node -> make new node if(node == 0) { - node = rdim_push_array_no_zero(arena, RDIM_BakeStringNode, 1); + node = rdim_push_array(arena, RDIM_BakeStringNode, 1); node->string = rdim_str8_copy(arena, string); node->hash = hash; node->idx = map->count; @@ -1732,7 +1778,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: fill constructed type node info else if(RDI_TypeKind_FirstConstructed <= dst->kind && dst->kind <= RDI_TypeKind_LastConstructed) { - dst->constructed.direct_type_idx = src->direct_type ? src->direct_type->idx : 0; + dst->constructed.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 dst->constructed.count = src->count; if(dst->kind == RDI_TypeKind_Function || dst->kind == RDI_TypeKind_Method) { @@ -1740,7 +1786,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) { - param_idx_run[idx] = src->param_types[idx]->idx; + param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(src->param_types[idx]); // TODO(rjf): @u64_to_u32 } dst->constructed.param_idx_run_first = rdim_bake_idx_run(arena, &idx_runs, param_idx_run, param_idx_run_count); } @@ -1754,8 +1800,8 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) else if(RDI_TypeKind_FirstUserDefined <= dst->kind && dst->kind <= RDI_TypeKind_LastUserDefined) { dst->user_defined.name_string_idx = rdim_bake_string(arena, &strings, src->name); - dst->user_defined.udt_idx = src->udt ? src->udt->idx : 0; - dst->user_defined.direct_type_idx = src->direct_type ? src->direct_type->idx : 0; + dst->user_defined.udt_idx = (RDI_U32)rdim_idx_from_udt(src->udt); // TODO(rjf): @u64_to_u32 + dst->user_defined.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 } //- rjf: fill bitfield info @@ -1787,7 +1833,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_UDT *dst_udt = &udts[dst_udt_idx]; //- rjf: fill basics - dst_udt->self_type_idx = src_udt->self_type ? src_udt->self_type->idx : 0; + dst_udt->self_type_idx = (RDI_U32)rdim_idx_from_type(src_udt->self_type); // TODO(rjf): @u64_to_u32 if(src_udt->source_path.size != 0) { RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(arena, &path_tree, src_udt->source_path); @@ -1809,7 +1855,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_Member *dst_member = &members[dst_member_idx]; dst_member->kind = src_member->kind; dst_member->name_string_idx = rdim_bake_string(arena, &strings, src_member->name); - dst_member->type_idx = src_member->type ? src_member->type->idx : 0; + dst_member->type_idx = (RDI_U32)rdim_idx_from_type(src_member->type); // TODO(rjf): @u64_to_u32 dst_member->off = src_member->off; } } @@ -1865,7 +1911,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_GlobalVariable *dst = &global_variables[dst_idx]; dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); dst->voff = src->offset; - dst->type_idx = src->type ? src->type->idx : 0;; + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 if(src->is_extern) { dst->link_flags |= RDI_LinkFlag_External; @@ -1873,12 +1919,12 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) if(src->container_type != 0) { dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type && src->container_type->udt ? src->container_type->udt->idx : 0;; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 } else if(src->container_symbol != 0) { dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = src->container_symbol->idx; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 } } } @@ -1899,7 +1945,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_ThreadVariable *dst = &thread_variables[dst_idx]; dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 - dst->type_idx = src->type ? src->type->idx : 0;; + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); if(src->is_extern) { dst->link_flags |= RDI_LinkFlag_External; @@ -1907,12 +1953,12 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) if(src->container_type != 0) { dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type && src->container_type->udt ? src->container_type->udt->idx : 0;; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 } else if(src->container_symbol != 0) { dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = src->container_symbol->idx; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 } } } @@ -1940,15 +1986,15 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) if(src->container_type != 0) { dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type && src->container_type->udt ? src->container_type->udt->idx : 0;; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 } else if(src->container_symbol != 0) { dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = src->container_symbol->idx; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 } - dst->type_idx = src->type ? src->type->idx : 0; - dst->root_scope_idx = src->root_scope ? src->root_scope->idx : 0; + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 + dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 } } } @@ -1977,7 +2023,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) { RDIM_Symbol *global_var = &n->v[chunk_idx]; - RDI_U32 global_var_idx = global_var->idx; + RDI_U32 global_var_idx = (RDI_U32)rdim_idx_from_symbol(global_var); // TODO(rjf): @u64_to_u32 RDI_U64 first = global_var->offset; RDI_U64 opl = first + global_var->type->byte_size; @@ -2146,17 +2192,17 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_Local *dst_local = &locals[dst_local_idx]; dst_local->kind = src_local->kind; dst_local->name_string_idx = rdim_bake_string(arena, &strings, src_local->name); - dst_local->type_idx = src_local->type ? src_local->type->idx : 0; + dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 dst_local->location_first = (RDI_U32)location_block_idx_first; // TODO(rjf): @u64_to_u32 dst_local->location_opl = (RDI_U32)location_block_idx_opl; // TODO(rjf): @u64_to_u32 } RDI_U64 local_idx_opl = dst_local_idx; //- rjf: fill scope - dst_scope->proc_idx = src_scope->symbol? src_scope->symbol->idx :0; - dst_scope->parent_scope_idx = src_scope->parent_scope? src_scope->parent_scope->idx :0; - dst_scope->first_child_scope_idx = src_scope->first_child? src_scope->first_child->idx :0; - dst_scope->next_sibling_scope_idx = src_scope->next_sibling? src_scope->next_sibling->idx :0; + dst_scope->proc_idx = (RDI_U32)rdim_idx_from_symbol(src_scope->symbol); // TODO(rjf): @u64_to_u32 + dst_scope->parent_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->parent_scope); // TODO(rjf): @u64_to_u32 + dst_scope->first_child_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->first_child); // TODO(rjf): @u64_to_u32 + dst_scope->next_sibling_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->next_sibling); // TODO(rjf): @u64_to_u32 dst_scope->voff_range_first = (RDI_U32)voff_idx_first; // TODO(rjf): @u64_to_u32 dst_scope->voff_range_opl = (RDI_U32)voff_idx_opl; // TODO(rjf): @u64_to_u32 dst_scope->local_first = (RDI_U32)local_idx_first; // TODO(rjf): @u64_to_u32 @@ -2196,7 +2242,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1) { RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; - RDI_U32 scope_idx = src_scope->idx; + RDI_U32 scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope); // TODO(rjf): @u64_to_u32 for(RDIM_Rng1U64Node *n = 0; n != 0; n = n->next) { key_ptr->key = n->v.min; diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index ea5ac395..1959c2bf 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -479,6 +479,7 @@ struct RDIM_LineSequenceList typedef struct RDIM_Unit RDIM_Unit; struct RDIM_Unit { + struct RDIM_UnitChunkNode *chunk; RDIM_String8 unit_name; RDIM_String8 compiler_name; RDIM_String8 source_file; @@ -497,6 +498,7 @@ struct RDIM_UnitChunkNode RDIM_Unit *v; RDI_U64 count; RDI_U64 cap; + RDI_U64 base_idx; }; typedef struct RDIM_UnitChunkList RDIM_UnitChunkList; @@ -508,21 +510,14 @@ struct RDIM_UnitChunkList RDI_U64 total_count; }; -typedef struct RDIM_UnitArray RDIM_UnitArray; -struct RDIM_UnitArray -{ - RDIM_Unit *v; - RDI_U64 count; -}; - //////////////////////////////// //~ rjf: Type System Node Types typedef struct RDIM_Type RDIM_Type; struct RDIM_Type { + struct RDIM_TypeChunkNode *chunk; RDI_TypeKind kind; - RDI_U32 idx; RDI_U32 byte_size; RDI_U32 flags; RDI_U32 off; @@ -540,6 +535,7 @@ struct RDIM_TypeChunkNode RDIM_Type *v; RDI_U64 count; RDI_U64 cap; + RDI_U64 base_idx; }; typedef struct RDIM_TypeChunkList RDIM_TypeChunkList; @@ -582,7 +578,7 @@ struct RDIM_UDTEnumVal typedef struct RDIM_UDT RDIM_UDT; struct RDIM_UDT { - RDI_U32 idx; + struct RDIM_UDTChunkNode *chunk; RDIM_Type *self_type; RDIM_UDTMember *first_member; RDIM_UDTMember *last_member; @@ -602,6 +598,7 @@ struct RDIM_UDTChunkNode RDIM_UDT *v; RDI_U64 count; RDI_U64 cap; + RDI_U64 base_idx; }; typedef struct RDIM_UDTChunkList RDIM_UDTChunkList; @@ -677,8 +674,8 @@ RDIM_SymbolKind; typedef struct RDIM_Symbol RDIM_Symbol; struct RDIM_Symbol { + struct RDIM_SymbolChunkNode *chunk; RDIM_SymbolKind kind; - RDI_U32 idx; RDI_S32 is_extern; RDIM_String8 name; RDIM_String8 link_name; @@ -696,6 +693,7 @@ struct RDIM_SymbolChunkNode RDIM_Symbol *v; RDI_U64 count; RDI_U64 cap; + RDI_U64 base_idx; }; typedef struct RDIM_SymbolChunkList RDIM_SymbolChunkList; @@ -723,6 +721,7 @@ struct RDIM_Local typedef struct RDIM_Scope RDIM_Scope; struct RDIM_Scope { + struct RDIM_ScopeChunkNode *chunk; RDIM_Symbol *symbol; RDIM_Scope *parent_scope; RDIM_Scope *first_child; @@ -732,7 +731,6 @@ struct RDIM_Scope RDIM_Local *first_local; RDIM_Local *last_local; RDI_U32 local_count; - RDI_U32 idx; }; typedef struct RDIM_ScopeChunkNode RDIM_ScopeChunkNode; @@ -742,6 +740,7 @@ struct RDIM_ScopeChunkNode RDIM_Scope *v; RDI_U64 count; RDI_U64 cap; + RDI_U64 base_idx; }; typedef struct RDIM_ScopeChunkList RDIM_ScopeChunkList; @@ -1365,19 +1364,19 @@ RDI_PROC RDIM_BinarySection *rdim_binary_section_list_push(RDIM_Arena *arena, RD //////////////////////////////// //~ rjf: Unit Info Building -RDI_PROC RDIM_Unit *rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list); -RDI_PROC void rdim_unit_chunk_list_push_array(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDIM_UnitArray *array); +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); RDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push); RDI_PROC RDIM_LineSequence *rdim_line_sequence_list_push(RDIM_Arena *arena, RDIM_LineSequenceList *list); -RDI_PROC RDIM_UnitArray rdim_unit_array_from_chunk_list(RDIM_Arena *arena, RDIM_UnitChunkList *list); //////////////////////////////// //~ rjf: Type Info & UDT Building RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap); -RDI_PROC void rdim_type_chunk_list_push_array(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDIM_TypeArray *array); +RDI_PROC RDI_U64 rdim_idx_from_type(RDIM_Type *type); RDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push); RDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_udt(RDIM_UDT *udt); RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push); RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); @@ -1386,6 +1385,7 @@ RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChun //~ rjf: 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); //////////////////////////////// @@ -1393,6 +1393,7 @@ RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, //- rjf: scopes RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_scope(RDIM_Scope *scope); RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push); RDI_PROC void rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range); RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index a295b4db..f00deacc 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3744,12 +3744,10 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ////////////////////////////////////////////////////////////// //- rjf: build unit array // - RDIM_UnitArray units = {0}; + RDIM_UnitChunkList units = {0}; ProfScope("build unit array") { - //- rjf: allocate - units.count = comp_unit_count; - units.v = push_array(arena, RDIM_Unit, units.count); + U64 units_chunk_cap = comp_unit_count; //- rjf: pass 1: fill basic per-unit info & line info for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) @@ -3777,8 +3775,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) MemoryZeroStruct(&obj_name); } - //- rjf: fill basic output unit info - RDIM_Unit *dst_unit = &units.v[comp_unit_idx]; + //- rjf: build unit + RDIM_Unit *dst_unit = rdim_unit_chunk_list_push(arena, &units, units_chunk_cap); dst_unit->unit_name = unit_name; dst_unit->compiler_name = pdb_unit_sym->info.compiler_name; dst_unit->object_file = obj_name; @@ -3815,7 +3813,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { if(contrib_ptr->mod < comp_unit_count) { - RDIM_Unit *unit = &units.v[contrib_ptr->mod]; + RDIM_Unit *unit = &units.first->v[contrib_ptr->mod]; RDIM_Rng1U64 range = {contrib_ptr->voff_first, contrib_ptr->voff_opl}; rdim_rng1u64_list_push(arena, &unit->voff_ranges, range); } @@ -3991,17 +3989,17 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) }; P2R_TypeIdRevisitTask *first_itype_revisit_task = 0; P2R_TypeIdRevisitTask *last_itype_revisit_task = 0; - RDIM_TypeArray itype_types = {0}; // root type for per-TPI-itype - RDIM_TypeChunkList extra_types = {0}; // extra supplementary types we build, which do not have any itypes + RDIM_TypeChunkList itype_types = {0}; // fixed chunk list for itypes + RDIM_TypeChunkList extra_types = {0}; // extra constructed types, for types which don't correspond to the PDB ProfScope("types pass 2: construct all root/stub types from TPI") { + RDI_U64 itype_types_cap = (U64)(itype_opl-itype_first); RDI_U64 extra_types_chunk_cap = 1024; - itype_types.count = (U64)(itype_opl-itype_first); - itype_types.v = push_array(arena, RDIM_Type, itype_types.count); -#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) - for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) + rdim_type_chunk_list_push(arena, &itype_types, itype_types_cap); +#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) + for(CV_TypeId itype = itype_first+1; itype < itype_opl; itype += 1) { - RDIM_Type *dst_type = &itype_types.v[itype-itype_first]; + RDIM_Type *dst_type = rdim_type_chunk_list_push(arena, &itype_types, itype_types_cap); B32 itype_is_basic = (itype < 0x1000); ////////////////////////// @@ -4014,7 +4012,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); // rjf: get basic type slot, fill if unfilled - RDIM_Type *basic_type = &itype_types.v[cv_basic_type_code-itype_first]; + RDIM_Type *basic_type = &itype_types.first->v[cv_basic_type_code-itype_first]; if(basic_type->kind == RDI_TypeKind_NULL) { RDI_TypeKind type_kind = rdi_type_kind_from_cv_basic_type(cv_basic_type_code); @@ -4032,7 +4030,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) if(cv_basic_ptr_kind != 0) { dst_type->kind = RDI_TypeKind_Ptr; - dst_type->idx = (RDI_U32)(itype-itype_first); dst_type->byte_size = arch_addr_size; dst_type->direct_type = basic_type; } @@ -4148,7 +4145,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: fill type dst_type->kind = RDI_TypeKind_Function; dst_type->byte_size = arch_addr_size; - dst_type->count = procedure->arg_count; dst_type->direct_type = ret_type; // rjf: push revisit task for parameters @@ -4171,7 +4167,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: fill type dst_type->kind = (mfunction->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function; dst_type->byte_size = arch_addr_size; - dst_type->count = mfunction->arg_count; dst_type->direct_type = ret_type; // rjf: push revisit task for parameters/this @@ -4389,7 +4384,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ProfScope("types pass 3: attach cross-itype-relationship data to all types, build UDTs") { RDI_U64 udts_chunk_cap = 1024; -#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) +#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) for(P2R_TypeIdRevisitTask *task = first_itype_revisit_task; task != 0; task = task->next) { RDIM_Type *dst_type = task->base_type; @@ -5095,7 +5090,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_ScopeChunkList all_scopes = {0}; ProfScope("produce symbols from all sym streams") { -#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) +#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) //////////////////////////// //- rjf: produce array of all symbol streams @@ -5827,8 +5822,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { out->top_level_info = top_level_info; out->binary_sections = binary_sections; - rdim_unit_chunk_list_push_array(arena, &out->units, &units); - rdim_type_chunk_list_push_array(arena, &out->types, &itype_types); + out->units = units; + rdim_type_chunk_list_concat_in_place(&out->types, &itype_types); rdim_type_chunk_list_concat_in_place(&out->types, &extra_types); out->udts = udts; out->global_variables = all_global_variables; From 7597bccd4686be2a18fa6319162628fd39fdaa03 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 12:51:17 -0800 Subject: [PATCH 075/275] raddbgi from pdb: fix chunk list concats --- src/lib_raddbgi_make/raddbgi_make.c | 9 +++++++-- src/lib_raddbgi_make/raddbgi_make.h | 22 +++++++++++----------- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 2 +- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 328d4e60..3b285875 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -604,6 +604,8 @@ rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *t dst->last = to_push->last; dst->chunk_count += to_push->chunk_count; dst->total_count += to_push->total_count; + dst->total_member_count += to_push->total_member_count; + dst->total_enum_val_count += to_push->total_enum_val_count; } else if(dst->first == 0) { @@ -736,6 +738,9 @@ rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkL dst->last = to_push->last; dst->chunk_count += to_push->chunk_count; dst->total_count += to_push->total_count; + dst->scope_voff_count += to_push->scope_voff_count; + dst->local_count += to_push->local_count; + dst->location_count += to_push->location_count; } else if(dst->first == 0) { @@ -1480,7 +1485,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) unit_lines = arranged_lines; unit_cols = 0; unit_line_count = key_count; - scratch_end(scratch); + rdim_scratch_end(scratch); } //////////////////////// @@ -1654,7 +1659,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) src_file_line_count = line_count; src_file_voffs = voffs; src_file_voff_count = voff_count; - scratch_end(scratch); + rdim_scratch_end(scratch); } ////////////////////////// diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 1959c2bf..0dd37153 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -758,30 +758,30 @@ struct RDIM_ScopeChunkList //////////////////////////////// //~ rjf: Name Map Types -typedef struct RDIM_NameMapIdxNode RDIM_NameMapIdxNode; -struct RDIM_NameMapIdxNode +typedef struct RDIM_NameMapValNode RDIM_NameMapValNode; +struct RDIM_NameMapValNode { - RDIM_NameMapIdxNode *next; - RDI_U32 idx[8]; + RDIM_NameMapValNode *next; + void *val[8]; }; typedef struct RDIM_NameMapNode RDIM_NameMapNode; struct RDIM_NameMapNode { - RDIM_NameMapNode *bucket_next; + RDIM_NameMapNode *slot_next; RDIM_NameMapNode *order_next; RDIM_String8 string; - RDIM_NameMapIdxNode *idx_first; - RDIM_NameMapIdxNode *idx_last; - RDI_U64 idx_count; + RDIM_NameMapValNode *val_first; + RDIM_NameMapValNode *val_last; + RDI_U64 val_count; }; typedef struct RDIM_NameMap RDIM_NameMap; struct RDIM_NameMap { - RDIM_NameMapNode **buckets; - RDI_U64 buckets_count; - RDI_U64 bucket_collision_count; + RDIM_NameMapNode **slots; + RDI_U64 slots_count; + RDI_U64 slot_collision_count; RDIM_NameMapNode *first; RDIM_NameMapNode *last; RDI_U64 name_count; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index f00deacc..8b6b2704 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3742,7 +3742,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } ////////////////////////////////////////////////////////////// - //- rjf: build unit array + //- rjf: build units // RDIM_UnitChunkList units = {0}; ProfScope("build unit array") From 3fb632c23d84a3d4e744df75dcf59a6cbbbb29a6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:11:57 -0800 Subject: [PATCH 076/275] raddbgi_make: name maps --- src/lib_raddbgi_make/raddbgi_make.c | 84 +++++++++++++++++++- src/lib_raddbgi_make/raddbgi_make.h | 66 +++++++-------- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 11 ++- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 1 - 4 files changed, 124 insertions(+), 38 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 3b285875..ae20b9a7 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1149,6 +1149,70 @@ rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) return path_node->idx; } +//- rjf: name maps + +RDI_PROC void +rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx) +{ + // rjf: hash + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeNameMapNode *node = 0; + for(RDIM_BakeNameMapNode *n = map->slots[slot_idx]; n != 0; n = n->slot_next) + { + if(rdim_str8_match(string, n->string, 0)) + { + node = n; + break; + } + } + + // rjf: make node if necessary + if(node == 0) + { + node = rdim_push_array(arena, RDIM_BakeNameMapNode, 1); + node->string = rdim_str8_copy(arena, string); + RDIM_SLLStackPush_N(map->slots[slot_idx], node, slot_next); + RDIM_SLLQueuePush_N(map->first, map->last, node, order_next); + map->name_count += 1; + map->slot_collision_count += (node->slot_next != 0); + } + + // rjf: find existing idx + RDI_S32 existing_idx = 0; + for(RDIM_BakeNameMapValNode *n = node->val_first; n != 0; n = n->next) + { + for(RDI_U32 i = 0; i < sizeof(n->val)/sizeof(n->val[0]); i += 1) + { + if(n->val[i] == 0) + { + break; + } + if(n->val[i] == idx) + { + existing_idx = 1; + break; + } + } + } + + // rjf: insert new idx if necessary + if(!existing_idx) + { + RDIM_BakeNameMapValNode *val_node = node->val_last; + RDI_U32 insert_i = node->val_count%(sizeof(val_node->val)/sizeof(val_node->val[0])); + if(insert_i == 0) + { + val_node = rdim_push_array(arena, RDIM_BakeNameMapValNode, 1); + SLLQueuePush(node->val_first, node->val_last, val_node); + } + val_node->val[insert_i] = idx; + node->val_count += 1; + } +} + //- rjf: vmap baking RDI_PROC RDIM_VMap @@ -1326,12 +1390,21 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDIM_BakeStringMap strings = {0}; RDIM_BakeIdxRunMap idx_runs = {0}; RDIM_BakePathTree path_tree = {0}; + RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; { + // TODO(rjf): adjust slots based on good estimates from params rdim_bake_section_list_push_new(arena, §ions, 0, 0, RDI_DataSectionTag_NULL); strings.slots_count = 65536; strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count); idx_runs.slots_count = 65536; idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count); + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + name_maps[k].slots_count = 65536; + name_maps[k].slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, name_maps[k].slots_count); + } } ////////////////////////////// @@ -1762,7 +1835,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count); RDIM_ProfScope("push all type nodes") { - RDI_U64 dst_idx = 0; + RDI_U32 dst_idx = 0; for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) { for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) @@ -1778,6 +1851,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) if(RDI_TypeKind_FirstBuiltIn <= dst->kind && dst->kind <= RDI_TypeKind_LastBuiltIn) { dst->built_in.name_string_idx = rdim_bake_string(arena, &strings, src->name); + rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Types], src->name, dst_idx); } //- rjf: fill constructed type node info @@ -1807,6 +1881,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) dst->user_defined.name_string_idx = rdim_bake_string(arena, &strings, src->name); dst->user_defined.udt_idx = (RDI_U32)rdim_idx_from_udt(src->udt); // TODO(rjf): @u64_to_u32 dst->user_defined.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Types], src->name, dst_idx); } //- rjf: fill bitfield info @@ -1931,6 +2006,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) dst->link_flags |= RDI_LinkFlag_ProcScoped; dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 } + rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_GlobalVariables], src->name, dst_idx); } } } @@ -1965,6 +2041,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) dst->link_flags |= RDI_LinkFlag_ProcScoped; dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 } + rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_ThreadVariables], src->name, dst_idx); } } } @@ -2000,6 +2077,11 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) } dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Procedures], src->name, dst_idx); + if(src->link_name.size > 0) + { + rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_LinkNameProcedures], src->link_name, dst_idx); + } } } } diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 0dd37153..0554d5a3 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -755,38 +755,6 @@ struct RDIM_ScopeChunkList RDI_U64 location_count; }; -//////////////////////////////// -//~ rjf: Name Map Types - -typedef struct RDIM_NameMapValNode RDIM_NameMapValNode; -struct RDIM_NameMapValNode -{ - RDIM_NameMapValNode *next; - void *val[8]; -}; - -typedef struct RDIM_NameMapNode RDIM_NameMapNode; -struct RDIM_NameMapNode -{ - RDIM_NameMapNode *slot_next; - RDIM_NameMapNode *order_next; - RDIM_String8 string; - RDIM_NameMapValNode *val_first; - RDIM_NameMapValNode *val_last; - RDI_U64 val_count; -}; - -typedef struct RDIM_NameMap RDIM_NameMap; -struct RDIM_NameMap -{ - RDIM_NameMapNode **slots; - RDI_U64 slots_count; - RDI_U64 slot_collision_count; - RDIM_NameMapNode *first; - RDIM_NameMapNode *last; - RDI_U64 name_count; -}; - //////////////////////////////// //~ rjf: Baking Types @@ -943,6 +911,37 @@ struct RDIM_BakePathTree RDI_U32 src_count; }; +//- rjf: name maps + +typedef struct RDIM_BakeNameMapValNode RDIM_BakeNameMapValNode; +struct RDIM_BakeNameMapValNode +{ + RDIM_BakeNameMapValNode *next; + RDI_U32 val[6]; +}; + +typedef struct RDIM_BakeNameMapNode RDIM_BakeNameMapNode; +struct RDIM_BakeNameMapNode +{ + RDIM_BakeNameMapNode *slot_next; + RDIM_BakeNameMapNode *order_next; + RDIM_String8 string; + RDIM_BakeNameMapValNode *val_first; + RDIM_BakeNameMapValNode *val_last; + RDI_U64 val_count; +}; + +typedef struct RDIM_BakeNameMap RDIM_BakeNameMap; +struct RDIM_BakeNameMap +{ + RDIM_BakeNameMapNode **slots; + RDI_U64 slots_count; + RDI_U64 slot_collision_count; + RDIM_BakeNameMapNode *first; + RDIM_BakeNameMapNode *last; + RDI_U64 name_count; +}; + //- rjf: vmaps typedef struct RDIM_VMap RDIM_VMap; @@ -1434,6 +1433,9 @@ RDI_PROC RDIM_BakePathNode *rdim_bake_path_node_from_string(RDIM_Arena *arena, R RDI_PROC RDIM_BakeSrcNode *rdim_bake_src_node_from_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_BakePathNode *path_node); RDI_PROC RDI_U32 rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string); +//- rjf: name maps +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); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 8b6b2704..e92700c8 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -5804,10 +5804,13 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ////////////////////////// //- rjf: merge this stream's outputs with collated list // - rdim_symbol_chunk_list_concat_in_place(&all_procedures, &sym_procedures); - rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &sym_global_variables); - rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &sym_thread_variables); - rdim_scope_chunk_list_concat_in_place(&all_scopes, &sym_scopes); + ProfScope("merge this stream's outputs with collated list") + { + rdim_symbol_chunk_list_concat_in_place(&all_procedures, &sym_procedures); + rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &sym_global_variables); + rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &sym_thread_variables); + rdim_scope_chunk_list_concat_in_place(&all_scopes, &sym_scopes); + } scratch_end(scratch); } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index d06b3e0b..4f379ee5 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -109,7 +109,6 @@ main(int argc, char **argv) os_file_close(output_file); } - //- rjf: end capture if(should_capture) { From c64fba90a18d51a29f08475fa17b13884bcbbef9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:26:43 -0800 Subject: [PATCH 077/275] transfer over name map baking --- src/lib_raddbgi_make/raddbgi_make.c | 142 ++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index ae20b9a7..645d1465 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1751,6 +1751,19 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) } } + ////////////////////////////// + //- rjf: push each source file into source file name map + // + RDIM_ProfScope("build section for per-source-file line info") + { + for(RDIM_BakeSrcNode *src_file_node = path_tree.src_first; + src_file_node != 0; + src_file_node = src_file_node->next) + { + rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_NormalSourcePaths], src_file_node->normal_full_path, src_file_node->idx); + } + } + ////////////////////////////// //- rjf: build section for unit vmap // @@ -2377,7 +2390,136 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // RDIM_ProfScope("build sections for name maps") { + //- rjf: count the # of name maps we have with any content + RDI_U32 name_map_count = 0; + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + if(name_maps[k].name_count != 0) + { + name_map_count += 1; + } + } + //- rjf: allocate & fill baked name maps + RDI_NameMap *dst_maps = rdim_push_array(arena, RDI_NameMap, name_map_count); + { + RDI_U64 dst_map_idx = 0; + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + RDI_NameMap *dst_map = &dst_maps[dst_map_idx]; + RDIM_BakeNameMap *src_map = &name_maps[k]; + if(src_map->name_count == 0) { continue; } + + // rjf: bake name map + RDI_U32 baked_buckets_count = src_map->name_count; + RDI_U32 baked_nodes_count = src_map->name_count; + RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count); + RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count); + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: setup the final bucket layouts + typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; + struct RDIM_NameMapSemiNode + { + RDIM_NameMapSemiNode *next; + RDIM_BakeNameMapNode *node; + }; + typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; + struct RDIM_NameMapSemiBucket + { + RDIM_NameMapSemiNode *first; + RDIM_NameMapSemiNode *last; + RDI_U64 count; + }; + RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count); + for(RDIM_BakeNameMapNode *node = src_map->first; + node != 0; + node = node->order_next) + { + RDI_U64 hash = rdi_hash(node->string.str, node->string.size); + RDI_U64 bi = hash%baked_buckets_count; + RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); + SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); + snode->node = node; + sbuckets[bi].count += 1; + } + + // rjf: convert to serialized buckets & nodes + { + RDI_NameMapBucket *bucket_ptr = baked_buckets; + RDI_NameMapNode *node_ptr = baked_nodes; + for(RDI_U32 i = 0; i < baked_buckets_count; i += 1, bucket_ptr += 1) + { + bucket_ptr->first_node = (RDI_U32)(node_ptr - baked_nodes); + bucket_ptr->node_count = sbuckets[i].count; + for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; + snode != 0; + snode = snode->next) + { + RDIM_BakeNameMapNode *node = snode->node; + + // rjf: cons name and index(es) + RDI_U32 string_idx = rdim_bake_string(arena, &strings, node->string); + RDI_U32 match_count = node->val_count; + RDI_U32 idx = 0; + if(match_count == 1) + { + idx = node->val_first->val[0]; + } + else + { + RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); + RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); + RDI_U32 *idx_ptr = idx_run; + for(RDIM_BakeNameMapValNode *idxnode = node->val_first; + idxnode != 0; + idxnode = idxnode->next) + { + for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) + { + if(idxnode->val[i] == 0) + { + goto dblbreak; + } + *idx_ptr = idxnode->val[i]; + idx_ptr += 1; + } + } + dblbreak:; + idx = rdim_bake_idx_run(arena, &idx_runs, idx_run, match_count); + rdim_arena_pop_to(scratch.arena, temp_pos); + } + + // rjf: write to node + node_ptr->string_idx = string_idx; + node_ptr->match_count = match_count; + node_ptr->match_idx_or_idx_run_first = idx; + node_ptr += 1; + } + } + } + rdim_scratch_end(scratch); + } + + // rjf: fill output header, and push sections for buckets/nodes + dst_map->kind = k; + dst_map->bucket_data_idx = (RDI_U32)sections.count+0; // TODO(rjf): @u64_to_u32 + dst_map->node_data_idx = (RDI_U32)sections.count+1; // TODO(rjf): @u64_to_u32 + rdim_bake_section_list_push_new(arena, §ions, baked_buckets, sizeof(RDI_NameMapBucket)* baked_buckets_count, RDI_DataSectionTag_NameMapBuckets); + rdim_bake_section_list_push_new(arena, §ions, baked_nodes, sizeof(RDI_NameMapNode) * baked_nodes_count, RDI_DataSectionTag_NameMapNodes); + + // rjf: inc + dst_map_idx += 1; + } + } + + // rjf: push section for all name maps + rdim_bake_section_list_push_new(arena, §ions, dst_maps, sizeof(RDI_NameMap)*name_map_count, RDI_DataSectionTag_NameMaps); } ////////////////////////////// From 75263c58339649dbef8a0c8bc7626cb4c2b45f91 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:29:26 -0800 Subject: [PATCH 078/275] path node tree baking --- src/lib_raddbgi_make/raddbgi_make.c | 30 ++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 645d1465..3ce28292 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2527,7 +2527,35 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // RDIM_ProfScope("build sections for file paths") { - + RDI_U32 dst_nodes_count = path_tree.count; + RDI_FilePathNode *dst_nodes = rdim_push_array(arena, RDI_FilePathNode, dst_nodes_count); + { + RDI_U32 dst_node_idx = 0; + for(RDIM_BakePathNode *src_node = path_tree.first; + src_node != 0; + src_node = src_node->next_order, dst_node_idx += 1) + { + RDI_FilePathNode *dst_node = &dst_nodes[dst_node_idx]; + dst_node->name_string_idx = rdim_bake_string(arena, &strings, src_node->name); + if(src_node->parent != 0) + { + dst_node->parent_path_node = src_node->parent->idx; + } + if(src_node->first_child != 0) + { + dst_node->first_child = src_node->first_child->idx; + } + if(src_node->next_sibling != 0) + { + dst_node->next_sibling = src_node->next_sibling->idx; + } + if(src_node->src_file != 0) + { + dst_node->source_file_idx = src_node->src_file->idx; + } + } + } + rdim_bake_section_list_push_new(arena, §ions, dst_nodes, sizeof(RDI_FilePathNode)*dst_nodes_count, RDI_DataSectionTag_FilePathNodes); } ////////////////////////////// From 3735e825799d83be50be293d92e96638365480e8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:31:58 -0800 Subject: [PATCH 079/275] source file baking --- src/lib_raddbgi_make/raddbgi_make.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 3ce28292..d6fa628a 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2563,7 +2563,24 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // RDIM_ProfScope("build sections for source files") { - + RDI_U32 dst_files_count = path_tree.src_count; + RDI_SourceFile *dst_files = rdim_push_array(arena, RDI_SourceFile, dst_files_count); + { + RDI_U64 dst_file_idx = 0; + for(RDIM_BakeSrcNode *src_node = path_tree.src_first; + src_node != 0; + src_node = src_node->next, dst_file_idx += 1) + { + RDI_SourceFile *dst_file = &dst_files[dst_file_idx]; + dst_file->file_path_node_idx = src_node->path_node->idx; + dst_file->normal_full_path_string_idx = rdim_bake_string(arena, &strings, src_node->normal_full_path); + dst_file->line_map_nums_data_idx = src_node->line_map_nums_data_idx; + dst_file->line_map_range_data_idx = src_node->line_map_range_data_idx; + dst_file->line_map_count = src_node->line_map_count; + dst_file->line_map_voff_data_idx = src_node->line_map_voff_data_idx; + } + } + rdim_bake_section_list_push_new(arena, §ions, dst_files, sizeof(RDI_SourceFile)*dst_files_count, RDI_DataSectionTag_SourceFiles); } ////////////////////////////// From 9cccabfa2188024060507eefda6d07cb04993e87 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:33:45 -0800 Subject: [PATCH 080/275] transfer over string baking --- src/lib_raddbgi_make/raddbgi_make.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index d6fa628a..10f4218ab7 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2588,7 +2588,34 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // RDIM_ProfScope("build sections for strings") { - + RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, strings.count + 1); + RDI_U32 off_cursor = 0; + { + RDI_U32 *off_ptr = str_offs; + *off_ptr = 0; + off_ptr += 1; + for(RDIM_BakeStringNode *node = strings.order_first; + node != 0; + node = node->order_next) + { + off_cursor += node->string.size; + *off_ptr = off_cursor; + off_ptr += 1; + } + } + RDI_U8 *buf = rdim_push_array(arena, RDI_U8, off_cursor); + { + RDI_U8 *ptr = buf; + for(RDIM_BakeStringNode *node = strings.order_first; + node != 0; + node = node->order_next) + { + rdim_memcpy(ptr, node->string.str, node->string.size); + ptr += node->string.size; + } + } + rdim_bake_section_list_push_new(arena, §ions, str_offs, sizeof(RDI_U32)*(strings.count+1), RDI_DataSectionTag_StringTable); + rdim_bake_section_list_push_new(arena, §ions, buf, off_cursor, RDI_DataSectionTag_StringData); } ////////////////////////////// From 178719c4792ec4896a5d99d44bb9c2c4c1f5a2f9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:35:00 -0800 Subject: [PATCH 081/275] transfer over idx run baking --- src/lib_raddbgi_make/raddbgi_make.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 10f4218ab7..09a15480 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2623,7 +2623,19 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) // RDIM_ProfScope("build section for index runs") { - + RDI_U32 *idx_data = rdim_push_array_no_zero(arena, RDI_U32, idx_runs.idx_count); + { + RDI_U32 *out_ptr = idx_data; + RDI_U32 *opl = out_ptr + idx_runs.idx_count; + for(RDIM_BakeIdxRunNode *node = idx_runs.order_first; + node != 0 && out_ptr < opl; + node = node->order_next) + { + rdim_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); + out_ptr += node->count; + } + } + rdim_bake_section_list_push_new(arena, §ions, idx_data, sizeof(RDI_U32)*idx_runs.idx_count, RDI_DataSectionTag_IndexRuns); } ////////////////////////////// From 626ad29b91b47fe25c9f22014a0f37725729ea73 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:39:52 -0800 Subject: [PATCH 082/275] converge raddbg to new conversion/raddbgi-make layers --- src/lib_raddbgi_make/raddbgi_make.h | 11 -------- src/raddbg/raddbg.c | 40 ++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 0554d5a3..28eaa664 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -847,17 +847,6 @@ struct RDIM_BakeIdxRunMap RDI_U32 idx_count; }; -//- rjf: line info - -typedef struct RDIM_LineRec RDIM_LineRec; -struct RDIM_LineRec -{ - RDI_U32 file_id; - RDI_U32 line_num; - RDI_U16 col_first; - RDI_U16 col_opl; -}; - //- rjf: source info & path tree typedef struct RDIM_BakePathNode RDIM_BakePathNode; diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 2111864e..0f379eeb 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -616,30 +616,46 @@ entry_point(int argc, char **argv) Temp scratch = scratch_begin(0, 0); //- rjf: parse arguments - P2R_Params *params = p2r_params_from_cmd_line(scratch.arena, &cmdln); + P2R_ConvertIn *convert_in = p2r_convert_in_from_cmd_line(scratch.arena, &cmdln); //- rjf: open output file - String8 output_name = push_str8_copy(scratch.arena, params->output_name); + String8 output_name = push_str8_copy(scratch.arena, convert_in->output_name); OS_Handle out_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, output_name); B32 out_file_is_good = !os_handle_match(out_file, os_handle_zero()); //- rjf: convert - P2R_Out *out = 0; + P2R_ConvertOut *convert_out = 0; if(out_file_is_good) { - out = p2r_convert(scratch.arena, params); + convert_out = p2r_convert(scratch.arena, convert_in); } - //- rjf: bake file - if(out != 0 && params->output_name.size > 0) + //- rjf: bake + String8List bake_strings = {0}; + if(convert_out != 0 && convert_in->output_name.size > 0) { - String8List baked = {0}; - rdim_bake_file(scratch.arena, out->root, &baked); - U64 off = 0; - for(String8Node *node = baked.first; node != 0; node = node->next) + RDIM_BakeParams bake_params = {0}; { - os_file_write(out_file, r1u64(off, off+node->string.size), node->string.str); - off += node->string.size; + bake_params.top_level_info = convert_out->top_level_info; + bake_params.binary_sections = convert_out->binary_sections; + bake_params.types = convert_out->types; + bake_params.udts = convert_out->udts; + bake_params.global_variables = convert_out->global_variables; + bake_params.thread_variables = convert_out->thread_variables; + bake_params.procedures = convert_out->procedures; + bake_params.scopes = convert_out->scopes; + } + bake_strings = rdim_bake(scratch.arena, &bake_params); + } + + //- rjf: write + if(out_file_is_good) + { + U64 off = 0; + for(String8Node *n = bake_strings.first; n != 0; n = n->next) + { + os_file_write(out_file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; } } From 51905304171683a37cbaf6bf96b635fb22afdf7d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:44:42 -0800 Subject: [PATCH 083/275] oops, remember units... --- src/raddbg/raddbg.c | 1 + src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 0f379eeb..b23b5993 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -638,6 +638,7 @@ entry_point(int argc, char **argv) { bake_params.top_level_info = convert_out->top_level_info; bake_params.binary_sections = convert_out->binary_sections; + bake_params.units = convert_out->units; bake_params.types = convert_out->types; bake_params.udts = convert_out->udts; bake_params.global_variables = convert_out->global_variables; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 4f379ee5..a67f8920 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -86,6 +86,7 @@ main(int argc, char **argv) { bake_params.top_level_info = convert_out->top_level_info; bake_params.binary_sections = convert_out->binary_sections; + bake_params.units = convert_out->units; bake_params.types = convert_out->types; bake_params.udts = convert_out->udts; bake_params.global_variables = convert_out->global_variables; From e9d2cb82b2e328ed17888681d0acf4fe8f4ae1f3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 16 Feb 2024 13:46:55 -0800 Subject: [PATCH 084/275] eliminate all old raddbgi_make and raddbgi_from_pdb code --- src/lib_raddbgi_make/raddbgi_make.c | 3084 --------------------- src/lib_raddbgi_make/raddbgi_make.h | 492 ---- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 3331 ----------------------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 278 -- 4 files changed, 7185 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 09a15480..b93900e8 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2683,3087 +2683,3 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) rdim_scratch_end(scratch); return blobs; } - -#if 0 -//////////////////////////////// -//~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions - -//- rjf: u64 -> ptr map - -RDI_PROC void -rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count) -{ - rdim_assert(IsPow2OrZero(bucket_count) && bucket_count > 0); - map->buckets = rdim_push_array(arena, RDIM_U64ToPtrNode*, bucket_count); - map->buckets_count = bucket_count; -} - -RDI_PROC void -rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out) -{ - RDI_U64 bucket_idx = hash&(map->buckets_count - 1); - RDIM_U64ToPtrNode *check_node = map->buckets[bucket_idx]; - for(;check_node != 0; check_node = check_node->next){ - for(RDI_U32 k = 0; k < ArrayCount(check_node->key); k += 1){ - if(check_node->ptr[k] == 0){ - lookup_out->fill_node = check_node; - lookup_out->fill_k = k; - break; - } - else if(check_node->key[k] == key){ - lookup_out->match = check_node->ptr[k]; - break; - } - } - } -} - -RDI_PROC void -rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr) -{ - if(lookup->fill_node != 0) - { - RDIM_U64ToPtrNode *node = lookup->fill_node; - RDI_U32 k = lookup->fill_k; - node->key[k] = key; - node->ptr[k] = ptr; - } - else - { - RDI_U64 bucket_idx = hash&(map->buckets_count - 1); - - RDIM_U64ToPtrNode *node = rdim_push_array(arena, RDIM_U64ToPtrNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - node->key[0] = key; - node->ptr[0] = ptr; - - lookup->fill_node = node; - lookup->fill_k = 0; - - map->pair_count += 1; - map->bucket_collision_count += (node->next != 0); - } -} - -//- rjf: string8 -> ptr map - -RDI_PROC void -rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_U64 bucket_count) -{ - map->buckets_count = bucket_count; - map->buckets = rdim_push_array(arena, RDIM_Str8ToPtrNode*, map->buckets_count); -} - -RDI_PROC void* -rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash) -{ - void *result = 0; - RDI_U64 bucket_idx = hash%map->buckets_count; - for(RDIM_Str8ToPtrNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->hash == hash && rdim_str8_match(node->key, key, 0)) - { - result = node->ptr; - break; - } - } - return result; -} - -RDI_PROC void -rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr) -{ - RDI_U64 bucket_idx = hash%map->buckets_count; - RDIM_Str8ToPtrNode *node = rdim_push_array(arena, RDIM_Str8ToPtrNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - - node->key = rdim_str8_copy(arena, key); - node->hash = hash; - node->ptr = ptr; - map->bucket_collision_count += (node->next != 0); - map->pair_count += 1; -} - -//- rjf: root creation - -RDI_PROC RDIM_Root * -rdim_root_alloc(RDIM_RootParams *params) -{ - RDIM_Arena *arena = rdim_arena_alloc(); - RDIM_Root *result = rdim_push_array(arena, RDIM_Root, 1); - result->arena = arena; - - // fill in root parameters - { - result->addr_size = params->addr_size; - } - - // setup singular types - { - result->nil_type = rdim_type_new(result); - result->variadic_type = rdim_type_new(result); - result->variadic_type->kind = RDI_TypeKind_Variadic; - - // references to "handled nil type" should be emitted as - // references to nil - but should not generate error - // messages when they are detected - they are expected! - rdim_assert(result->nil_type->idx == result->handled_nil_type.idx); - } - - // setup a null scope - { - RDIM_Scope *scope = rdim_push_array(result->arena, RDIM_Scope, 1); - RDIM_SLLQueuePush_N(result->first_scope, result->last_scope, scope, next_order); - result->scope_count += 1; - } - - // rjf: setup null UDT - { - rdim_type_udt_from_any_type(result, result->nil_type); - } - - // initialize maps - { -#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(128)) - - rdim_u64toptr_map_init(arena, &result->unit_map, BKTCOUNT(params->bucket_count_units)); - rdim_u64toptr_map_init(arena, &result->symbol_map, BKTCOUNT(params->bucket_count_symbols)); - rdim_u64toptr_map_init(arena, &result->scope_map, BKTCOUNT(params->bucket_count_scopes)); - rdim_u64toptr_map_init(arena, &result->local_map, BKTCOUNT(params->bucket_count_locals)); - rdim_u64toptr_map_init(arena, &result->type_from_id_map, BKTCOUNT(params->bucket_count_types)); - rdim_str8toptr_map_init(arena, &result->construct_map, BKTCOUNT(params->bucket_count_type_constructs)); - -#undef BKTCOUNT - } - - return result; -} - -RDI_PROC void -rdim_root_release(RDIM_Root *root) -{ - arena_release(root->arena); -} - -//- rjf: error accumulation - -RDI_PROC void -rdim_push_msg(RDIM_Root *root, RDIM_String8 string) -{ - RDIM_Msg *msg = rdim_push_array(root->arena, RDIM_Msg, 1); - SLLQueuePush(root->msgs.first, root->msgs.last, msg); - root->msgs.count += 1; - msg->string = string; -} - -RDI_PROC void -rdim_push_msgf(RDIM_Root *root, char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - RDIM_String8 str = rdim_str8fv(root->arena, fmt, args); - rdim_push_msg(root, str); - va_end(args); -} - -RDI_PROC RDIM_Msg * -rdim_first_msg_from_root(RDIM_Root *root) -{ - return root->msgs.first; -} - -//- rjf: type info lookups/reservations - -RDI_PROC RDIM_Type* -rdim_type_from_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash) -{ - RDIM_U64ToPtrLookup lookup = {0}; - rdim_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); - RDIM_Type *result = (RDIM_Type*)lookup.match; - return result; -} - -RDI_PROC RDIM_Reservation* -rdim_type_reserve_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash) -{ - RDIM_Reservation *result = 0; - RDIM_U64ToPtrLookup lookup = {0}; - rdim_u64toptr_map_lookup(&root->type_from_id_map, type_user_id, type_user_id_hash, &lookup); - if(lookup.match == 0) - { - rdim_u64toptr_map_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id_hash, &lookup, root->nil_type); - void **slot = &lookup.fill_node->ptr[lookup.fill_k]; - result = (RDIM_Reservation*)slot; - } - return result; -} - -RDI_PROC void -rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type) -{ - if(res != 0 && type != 0) - { - *(void**)res = type; - } -} - -//- rjf: nil/singleton types - -RDI_PROC RDI_S32 -rdim_type_is_unhandled_nil(RDIM_Root *root, RDIM_Type *type) -{ - RDI_S32 result = (type->kind == RDI_TypeKind_NULL && type != &root->handled_nil_type); - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_handled_nil(RDIM_Root *root) -{ - return &root->handled_nil_type; -} - -RDI_PROC RDIM_Type* -rdim_type_nil(RDIM_Root *root) -{ - return root->nil_type; -} - -RDI_PROC RDIM_Type* -rdim_type_variadic(RDIM_Root *root) -{ - return root->variadic_type; -} - -//- rjf: base type info constructors - -RDI_PROC RDIM_Type* -rdim_type_new(RDIM_Root *root) -{ - RDIM_Type *result = rdim_push_array(root->arena, RDIM_Type, 1); - result->idx = root->type_count; - RDIM_SLLQueuePush_N(root->first_type, root->last_type, result, next_order); - root->type_count += 1; - return result; -} - -RDI_PROC RDIM_TypeUDT* -rdim_type_udt_from_any_type(RDIM_Root *root, RDIM_Type *type) -{ - if(type->udt == 0) - { - RDIM_TypeUDT *new_udt = rdim_push_array(root->arena, RDIM_TypeUDT, 1); - new_udt->idx = root->type_udt_count; - RDIM_SLLQueuePush_N(root->first_udt, root->last_udt, new_udt, next_order); - root->type_udt_count += 1; - new_udt->self_type = type; - type->udt = new_udt; - } - RDIM_TypeUDT *result = type->udt; - return result; -} - -RDI_PROC RDIM_TypeUDT* -rdim_type_udt_from_record_type(RDIM_Root *root, RDIM_Type *type) -{ - rdim_requiref(root, (type->kind == RDI_TypeKind_Struct || - type->kind == RDI_TypeKind_Class || - type->kind == RDI_TypeKind_Union), - return 0, - "Tried to use non-user-defined-type-kind to create user-defined-type."); - RDIM_TypeUDT *result = 0; - result = rdim_type_udt_from_any_type(root, type); - return result; -} - -//- rjf: basic/operator type construction helpers - -RDI_PROC RDIM_Type* -rdim_type_basic(RDIM_Root *root, RDI_TypeKind type_kind, RDIM_String8 name) -{ - rdim_requiref(root, (RDI_TypeKind_FirstBuiltIn <= type_kind && type_kind <= RDI_TypeKind_LastBuiltIn), return root->nil_type, "Non-basic type kind passed to construct basic type."); - RDIM_Type *result = root->nil_type; - RDIM_Temp scratch = rdim_scratch_begin(0, 0); - - // setup construct buffer - RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(type_kind) + name.size; - RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); - { - RDI_U8 *ptr = buf; - // "basic" - *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Basic; - ptr += sizeof(RDIM_TypeConstructKind); - // type_kind - rdim_memcpy(ptr, &type_kind, sizeof(type_kind)); - ptr += sizeof(type_kind); - // name - rdim_memcpy(ptr, name.str, name.size); - ptr += name.size; - } - - // check for duplicate construct - RDIM_String8 blob = rdim_str8(buf, buf_size); - RDI_U64 blob_hash = rdi_hash(buf, buf_size); - void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RDIM_Type*)lookup_ptr; - if(result == 0) - { - // calculate size - RDI_U32 byte_size = rdi_size_from_basic_type_kind(type_kind); - if(byte_size == 0xFFFFFFFF) - { - byte_size = root->addr_size; - } - - // setup new node - result = rdim_type_new(root); - result->kind = type_kind; - result->name = rdim_str8_copy(root->arena, name); - result->byte_size = byte_size; - - // save in construct map - rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - - // save in name map - { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); - rdim_name_map_add_pair(root, map, result->name, result->idx); - } - } - - scratch_end(scratch); - rdim_assert(result != 0); - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RDI_TypeModifierFlags flags) -{ - RDIM_Type *result = root->nil_type; - RDIM_Temp scratch = rdim_scratch_begin(0, 0); - - // setup construct buffer - RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(flags) + sizeof(direct_type->idx); - RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); - { - RDI_U8 *ptr = buf; - // "modifier" - *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Modifier; - ptr += sizeof(RDIM_TypeConstructKind); - // flags - rdim_memcpy(ptr, &flags, sizeof(flags)); - ptr += sizeof(flags); - // direct_type->idx - rdim_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - } - - // check for duplicate construct - RDIM_String8 blob = rdim_str8(buf, buf_size); - RDI_U64 blob_hash = rdi_hash(buf, buf_size); - void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RDIM_Type*)lookup_ptr; - if(result == 0){ - - // setup new node - result = rdim_type_new(root); - result->kind = RDI_TypeKind_Modifier; - result->flags = flags; - result->byte_size = direct_type->byte_size; - result->direct_type = direct_type; - - // save in construct map - rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - rdim_scratch_end(scratch); - rdim_assert(result != 0); - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RDI_U32 bit_off, RDI_U32 bit_count) -{ - RDIM_Type *result = root->nil_type; - RDIM_Temp scratch = rdim_scratch_begin(0, 0); - - // setup construct buffer - RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(RDI_U32)*2; - RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); - { - RDI_U8 *ptr = buf; - // "bitfield" - *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Bitfield; - ptr += sizeof(RDIM_TypeConstructKind); - // direct_type->idx - rdim_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - // bit_off - rdim_memcpy(ptr, &bit_off, sizeof(bit_off)); - ptr += sizeof(bit_off); - // bit_count - rdim_memcpy(ptr, &bit_count, sizeof(bit_count)); - ptr += sizeof(bit_count); - } - - // check for duplicate construct - RDIM_String8 blob = rdim_str8(buf, buf_size); - RDI_U64 blob_hash = rdi_hash(buf, buf_size); - void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RDIM_Type*)lookup_ptr; - if(result == 0) - { - // setup new node - result = rdim_type_new(root); - result->kind = RDI_TypeKind_Bitfield; - result->byte_size = direct_type->byte_size; - result->off = bit_off; - result->count = bit_count; - result->direct_type = direct_type; - - // save in construct map - rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - rdim_scratch_end(scratch); - rdim_assert(result != 0); - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RDI_TypeKind ptr_type_kind) -{ - rdim_requiref(root, (ptr_type_kind == RDI_TypeKind_Ptr || - ptr_type_kind == RDI_TypeKind_LRef || - ptr_type_kind == RDI_TypeKind_RRef), - return root->nil_type, - "Non-pointer type kind used to construct pointer type."); - RDIM_Type *result = root->nil_type; - RDIM_Temp scratch = rdim_scratch_begin(0, 0); - - // setup construct buffer - RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(ptr_type_kind) + sizeof(direct_type->idx); - RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); - { - RDI_U8 *ptr = buf; - // "pointer" - *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Pointer; - ptr += sizeof(RDIM_TypeConstructKind); - // type_kind - rdim_memcpy(ptr, &ptr_type_kind, sizeof(ptr_type_kind)); - ptr += sizeof(ptr_type_kind); - // direct_type->idx - rdim_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - } - - // check for duplicate construct - RDIM_String8 blob = rdim_str8(buf, buf_size); - RDI_U64 blob_hash = rdi_hash(buf, buf_size); - void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RDIM_Type*)lookup_ptr; - if(result == 0) - { - // setup new node - result = rdim_type_new(root); - result->kind = ptr_type_kind; - result->byte_size = root->addr_size; - result->direct_type = direct_type; - - // save in construct map - rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - rdim_scratch_end(scratch); - rdim_assert(result != 0); - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RDI_U64 count) -{ - RDIM_Type *result = root->nil_type; - RDIM_Temp scratch = rdim_scratch_begin(0, 0); - - // setup construct buffer - RDI_U64 buf_size = - sizeof(RDIM_TypeConstructKind) + sizeof(direct_type->idx) + sizeof(count); - RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); - { - RDI_U8 *ptr = buf; - // "array" - *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Array; - ptr += sizeof(RDIM_TypeConstructKind); - // direct_type->idx - rdim_memcpy(ptr, &direct_type->idx, sizeof(direct_type->idx)); - ptr += sizeof(direct_type->idx); - // count - rdim_memcpy(ptr, &count, sizeof(count)); - ptr += sizeof(count); - } - - // check for duplicate construct - RDIM_String8 blob = rdim_str8(buf, buf_size); - RDI_U64 blob_hash = rdi_hash(buf, buf_size); - void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RDIM_Type*)lookup_ptr; - if(result == 0) - { - // setup new node - result = rdim_type_new(root); - result->kind = RDI_TypeKind_Array; - result->count = count; - result->direct_type = direct_type; - result->byte_size = direct_type->byte_size*count; - - // save in construct map - rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - scratch_end(scratch); - rdim_assert(result != 0); - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *params) -{ - RDIM_Type *result = root->nil_type; - RDIM_Temp scratch = rdim_scratch_begin(0, 0); - - // setup construct buffer - RDI_U64 buf_size = sizeof(RDIM_TypeConstructKind) + sizeof(return_type->idx)*(1 + params->count); - RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); - { - RDI_U8 *ptr = buf; - // "procedure" - *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Procedure; - ptr += sizeof(RDIM_TypeConstructKind); - // ret_type->idx - rdim_memcpy(ptr, &return_type->idx, sizeof(return_type->idx)); - ptr += sizeof(return_type->idx); - // (params ...)->idx - for(RDIM_TypeNode *node = params->first; - node != 0; - node = node->next) - { - rdim_memcpy(ptr, &node->type->idx, sizeof(node->type->idx)); - ptr += sizeof(node->type->idx); - } - } - - // check for duplicate construct - RDIM_String8 blob = rdim_str8(buf, buf_size); - RDI_U64 blob_hash = rdi_hash(buf, buf_size); - void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RDIM_Type*)lookup_ptr; - if(result == 0) - { - // setup param buffer - RDIM_Type **param_types = rdim_push_array(root->arena, RDIM_Type*, params->count); - { - RDIM_Type **ptr = param_types; - for(RDIM_TypeNode *node = params->first; - node != 0; - node = node->next) - { - *ptr = node->type; - ptr += 1; - } - } - - // setup new node - result = rdim_type_new(root); - result->kind = RDI_TypeKind_Function; - result->byte_size = root->addr_size; - result->count = params->count; - result->direct_type = return_type; - result->param_types = param_types; - - // save in construct map - rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - rdim_scratch_end(scratch); - rdim_assert(result != 0); - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, struct RDIM_TypeList *params) -{ - RDIM_Type *result = root->nil_type; - RDIM_Temp scratch = rdim_scratch_begin(0, 0); - - // setup construct buffer - RDI_U64 buf_size = - sizeof(RDIM_TypeConstructKind) + sizeof(return_type->idx)*(2 + params->count); - RDI_U8 *buf = rdim_push_array(rdim_temp_arena(scratch), RDI_U8, buf_size); - { - RDI_U8 *ptr = buf; - // "method" - *(RDIM_TypeConstructKind*)ptr = RDIM_TypeConstructKind_Method; - ptr += sizeof(RDIM_TypeConstructKind); - // ret_type->idx - rdim_memcpy(ptr, &return_type->idx, sizeof(return_type->idx)); - ptr += sizeof(return_type->idx); - // this_type->idx - rdim_memcpy(ptr, &this_type->idx, sizeof(this_type->idx)); - ptr += sizeof(this_type->idx); - // (params ...)->idx - for(RDIM_TypeNode *node = params->first; - node != 0; - node = node->next) - { - rdim_memcpy(ptr, &node->type->idx, sizeof(node->type->idx)); - ptr += sizeof(node->type->idx); - } - } - - // check for duplicate construct - RDIM_String8 blob = rdim_str8(buf, buf_size); - RDI_U64 blob_hash = rdi_hash(buf, buf_size); - void *lookup_ptr = rdim_str8toptr_map_lookup(&root->construct_map, blob, blob_hash); - result = (RDIM_Type*)lookup_ptr; - if(result == 0) - { - // setup param buffer - RDIM_Type **param_types = rdim_push_array(root->arena, RDIM_Type*, params->count + 1); - { - RDIM_Type **ptr = param_types; - { - *ptr = this_type; - ptr += 1; - } - for(RDIM_TypeNode *node = params->first; - node != 0; - node = node->next) - { - *ptr = node->type; - ptr += 1; - } - } - - // setup new node - result = rdim_type_new(root); - result->kind = RDI_TypeKind_Method; - result->byte_size = root->addr_size; - result->count = params->count; - result->direct_type = return_type; - result->param_types = param_types; - - // save in construct map - rdim_str8toptr_map_insert(root->arena, &root->construct_map, blob, blob_hash, result); - } - - rdim_scratch_end(scratch); - rdim_assert(result != 0); - return result; -} - -//- rjf: udt type constructors - -RDI_PROC RDIM_Type* -rdim_type_udt(RDIM_Root *root, RDI_TypeKind record_type_kind, RDIM_String8 name, RDI_U64 size) -{ - rdim_requiref(root, (record_type_kind == RDI_TypeKind_Struct || - record_type_kind == RDI_TypeKind_Class || - record_type_kind == RDI_TypeKind_Union), - return root->nil_type, - "Non-user-defined-type-kind used to create user-defined type."); - - // rjf: make type - RDIM_Type *result = rdim_type_new(root); - result->kind = record_type_kind; - result->byte_size = size; - result->name = rdim_str8_copy(root->arena, name); - - // rjf: save in name map - { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); - rdim_name_map_add_pair(root, map, result->name, result->idx); - } - - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_enum(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name) -{ - // rjf: make type - RDIM_Type *result = rdim_type_new(root); - result->kind = RDI_TypeKind_Enum; - result->byte_size = direct_type->byte_size; - result->name = rdim_str8_copy(root->arena, name); - result->direct_type = direct_type; - - // rjf: save in name map - { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); - rdim_name_map_add_pair(root, map, result->name, result->idx); - } - - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_alias(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name) -{ - // rjf: make type - RDIM_Type *result = rdim_type_new(root); - result->kind = RDI_TypeKind_Alias; - result->byte_size = direct_type->byte_size; - result->name = rdim_str8_copy(root->arena, name); - result->direct_type = direct_type; - - // rjf: save in name map - { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); - rdim_name_map_add_pair(root, map, result->name, result->idx); - } - - return result; -} - -RDI_PROC RDIM_Type* -rdim_type_incomplete(RDIM_Root *root, RDI_TypeKind type_kind, RDIM_String8 name) -{ - rdim_requiref(root, (type_kind == RDI_TypeKind_IncompleteStruct || - type_kind == RDI_TypeKind_IncompleteClass || - type_kind == RDI_TypeKind_IncompleteUnion || - type_kind == RDI_TypeKind_IncompleteEnum), - return root->nil_type, - "Non-incomplete-type-kind used to create incomplete type."); - - // rjf: make type - RDIM_Type *result = rdim_type_new(root); - result->kind = type_kind; - result->name = rdim_str8_copy(root->arena, name); - - // save in name map - { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_Types); - rdim_name_map_add_pair(root, map, result->name, result->idx); - } - - return result; -} - -//- rjf: type member building - -RDI_PROC void -rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type, RDI_U32 off) -{ - RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RDI_MemberKind_DataField; - member->name = rdim_str8_copy(root->arena, name); - member->type = mem_type; - member->off = off; - } -} - -RDI_PROC void -rdim_type_add_member_static_data(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) -{ - RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RDI_MemberKind_StaticData; - member->name = rdim_str8_copy(root->arena, name); - member->type = mem_type; - } -} - -RDI_PROC void -rdim_type_add_member_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) -{ - RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RDI_MemberKind_Method; - member->name = rdim_str8_copy(root->arena, name); - member->type = mem_type; - } -} - -RDI_PROC void -rdim_type_add_member_static_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) -{ - RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - - root->total_member_count += 1; - - member->kind = RDI_MemberKind_StaticMethod; - member->name = rdim_str8_copy(root->arena, name); - member->type = mem_type; - } -} - -RDI_PROC void -rdim_type_add_member_virtual_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type) -{ - RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RDI_MemberKind_VirtualMethod; - member->name = rdim_str8_copy(root->arena, name); - member->type = mem_type; - } -} - -RDI_PROC void -rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RDI_U32 off) -{ - RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RDI_MemberKind_Base; - member->type = base_type; - member->off = off; - } -} - -RDI_PROC void -rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RDI_U32 vptr_off, RDI_U32 vtable_off) -{ - RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RDI_MemberKind_VirtualBase; - member->type = base_type; - // TODO(allen): what to do with the two offsets in this case? - } -} - -RDI_PROC void -rdim_type_add_member_nested_type(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *nested_type) -{ - RDIM_TypeUDT *udt = rdim_type_udt_from_record_type(root, record_type); - if(udt != 0) - { - RDIM_TypeMember *member = rdim_push_array(root->arena, RDIM_TypeMember, 1); - SLLQueuePush(udt->first_member, udt->last_member, member); - udt->member_count += 1; - root->total_member_count += 1; - member->kind = RDI_MemberKind_NestedType; - member->type = nested_type; - } -} - -RDI_PROC void -rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, RDI_U64 val) -{ - rdim_requiref(root, (enum_type->kind == RDI_TypeKind_Enum), return, "Tried to add enum value to non-enum type."); - RDIM_TypeUDT *udt = rdim_type_udt_from_any_type(root, enum_type); - if(udt != 0) - { - RDIM_TypeEnumVal *enum_val = rdim_push_array(root->arena, RDIM_TypeEnumVal, 1); - SLLQueuePush(udt->first_enum_val, udt->last_enum_val, enum_val); - udt->enum_val_count += 1; - root->total_enum_val_count += 1; - enum_val->name = rdim_str8_copy(root->arena, name); - enum_val->val = val; - } -} - -//- rjf: type source coordinate specifications -RDI_PROC void -rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_String8 source_path, RDI_U32 line, RDI_U32 col) -{ - rdim_requiref(root, (RDI_TypeKind_FirstUserDefined <= defined_type->kind && defined_type->kind <= RDI_TypeKind_LastUserDefined), - return, "Tried to add source coordinates to non-user-defined type."); - RDIM_TypeUDT *udt = rdim_type_udt_from_any_type(root, defined_type); - if(udt != 0) - { - udt->source_path = rdim_str8_copy(root->arena, source_path); - udt->line = line; - udt->col = col; - } -} - -//- rjf: symbol info building - -RDI_PROC RDIM_Symbol* -rdim_symbol_handle_from_user_id(RDIM_Root *root, RDI_U64 symbol_user_id, RDI_U64 symbol_user_id_hash) -{ - RDIM_U64ToPtrLookup lookup = {0}; - rdim_u64toptr_map_lookup(&root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup); - RDIM_Symbol *result = 0; - if(lookup.match != 0) - { - result = (RDIM_Symbol*)lookup.match; - } - else - { - result = rdim_push_array(root->arena, RDIM_Symbol, 1); - RDIM_SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order); - root->symbol_count += 1; - rdim_u64toptr_map_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_user_id_hash, &lookup, result); - } - return result; -} - -RDI_PROC void -rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info) -{ - // rjf: unpack - RDIM_SymbolKind kind = info->kind; - RDIM_Symbol *container_symbol = info->container_symbol; - RDIM_Type *container_type = info->container_type; - - // rjf: requirements - rdim_requiref(root, RDIM_SymbolKind_NULL == symbol->kind, return, "Symbol information set multiple times."); - rdim_requiref(root, RDIM_SymbolKind_NULL < info->kind && info->kind < RDIM_SymbolKind_COUNT, return, "Invalid symbol kind used to initialize symbol."); - rdim_requiref(root, info->type != 0, return, "Invalid type used to initialize symbol."); - rdim_requiref(root, info->container_symbol == 0 || info->container_type == 0, container_type = 0, "Symbol initialized with both a containing symbol and containing type, when only one is allowed."); - - // rjf: fill - root->symbol_kind_counts[kind] += 1; - symbol->idx = root->symbol_kind_counts[kind]; - symbol->kind = kind; - symbol->name = rdim_str8_copy(root->arena, info->name); - symbol->link_name = rdim_str8_copy(root->arena, info->link_name); - symbol->type = info->type; - symbol->is_extern = info->is_extern; - symbol->offset = info->offset; - symbol->container_symbol = container_symbol; - symbol->container_type = container_type; - - // rjf: set root scope - switch(kind) - { - default:{}break; - case RDIM_SymbolKind_GlobalVariable: - case RDIM_SymbolKind_ThreadVariable: - { - rdim_requiref(root, info->root_scope == 0, rdim_noop, "Global or thread variable initialized with root scope."); - }break; - case RDIM_SymbolKind_Procedure: - { - rdim_requiref(root, info->root_scope != 0, rdim_noop, "Procedure symbol initialized without root scope."); - symbol->root_scope = info->root_scope; - rdim_scope_recursive_set_symbol(info->root_scope, symbol); - }break; - } - - // save name map - { - RDIM_NameMap *map = 0; - switch(kind) - { - default:{}break; - case RDIM_SymbolKind_GlobalVariable: - { - map = rdim_name_map_for_kind(root, RDI_NameMapKind_GlobalVariables); - }break; - case RDIM_SymbolKind_ThreadVariable: - { - map = rdim_name_map_for_kind(root, RDI_NameMapKind_ThreadVariables); - }break; - case RDIM_SymbolKind_Procedure: - { - map = rdim_name_map_for_kind(root, RDI_NameMapKind_Procedures); - }break; - } - if(map != 0) - { - rdim_name_map_add_pair(root, map, symbol->name, symbol->idx); - } - } - - // save link name map - if(kind == RDIM_SymbolKind_Procedure && symbol->link_name.size > 0) - { - RDIM_NameMap *map = rdim_name_map_for_kind(root, RDI_NameMapKind_LinkNameProcedures); - rdim_name_map_add_pair(root, map, symbol->link_name, symbol->idx); - } -} - -//- rjf: scope info building - -RDI_PROC RDIM_Scope * -rdim_scope_handle_from_user_id(RDIM_Root *root, RDI_U64 scope_user_id, RDI_U64 scope_user_id_hash) -{ - RDIM_Scope *result = 0; - RDIM_U64ToPtrLookup lookup = {0}; - rdim_u64toptr_map_lookup(&root->scope_map, scope_user_id, scope_user_id_hash, &lookup); - if(lookup.match != 0) - { - result = (RDIM_Scope*)lookup.match; - } - else - { - result = rdim_push_array(root->arena, RDIM_Scope, 1); - result->idx = root->scope_count; - RDIM_SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order); - root->scope_count += 1; - rdim_u64toptr_map_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id_hash, &lookup, result); - } - return result; -} - -RDI_PROC void -rdim_scope_set_parent(RDIM_Root *root, RDIM_Scope *scope, RDIM_Scope *parent) -{ - rdim_requiref(root, scope->parent_scope == 0, return, "Scope parent set multiple times."); - rdim_requiref(root, parent != 0, return, "Tried to set invalid parent as scope parent."); - scope->symbol = parent->symbol; - scope->parent_scope = parent; - RDIM_SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); -} - -RDI_PROC void -rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RDI_U64 voff_first, RDI_U64 voff_opl) -{ - RDIM_VOffRange *range = rdim_push_array(root->arena, RDIM_VOffRange, 1); - SLLQueuePush(scope->first_range, scope->last_range, range); - scope->range_count += 1; - range->voff_first = voff_first; - range->voff_opl = voff_opl; - scope->voff_base = Min(scope->voff_base, voff_first); - root->scope_voff_count += 2; -} - -RDI_PROC void -rdim_scope_recursive_set_symbol(RDIM_Scope *scope, RDIM_Symbol *symbol) -{ - scope->symbol = symbol; - for(RDIM_Scope *node = scope->first_child; - node != 0; - node = node->next_sibling) - { - rdim_scope_recursive_set_symbol(node, symbol); - } -} - -//- rjf: local info building - -RDI_PROC RDIM_Local* -rdim_local_handle_from_user_id(RDIM_Root *root, RDI_U64 local_user_id, RDI_U64 local_user_id_hash) -{ - RDIM_Local *result = 0; - RDIM_U64ToPtrLookup lookup = {0}; - rdim_u64toptr_map_lookup(&root->local_map, local_user_id, local_user_id_hash, &lookup); - if(lookup.match != 0) - { - result = (RDIM_Local*)lookup.match; - } - else - { - result = rdim_push_array(root->arena, RDIM_Local, 1); - rdim_u64toptr_map_insert(root->arena, &root->local_map, local_user_id, local_user_id_hash, &lookup, result); - } - return result; -} - -RDI_PROC void -rdim_local_set_basic_info(RDIM_Root *root, RDIM_Local *local, RDIM_LocalInfo *info) -{ - rdim_requiref(root, local->kind == RDI_LocalKind_NULL, return, "Local information set multiple times."); - rdim_requiref(root, info->scope != 0, return, "Tried to set invalid scope as local's containing scope."); - rdim_requiref(root, RDI_LocalKind_NULL < info->kind && info->kind < RDI_LocalKind_COUNT, return, "Invalid local kind."); - rdim_requiref(root, info->type != 0, return, "Tried to set invalid type as local's type."); - RDIM_Scope *scope = info->scope; - SLLQueuePush(scope->first_local, scope->last_local, local); - scope->local_count += 1; - root->local_count += 1; - local->kind = info->kind; - local->name = rdim_str8_copy(root->arena, info->name); - local->type = info->type; -} - -RDI_PROC RDIM_LocationSet* -rdim_location_set_from_local(RDIM_Root *root, RDIM_Local *local) -{ - RDIM_LocationSet *result = local->locset; - if(result == 0) - { - local->locset = rdim_push_array(root->arena, RDIM_LocationSet, 1); - result = local->locset; - } - return result; -} - -//- rjf: location info building - -RDI_PROC void -rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RDI_U64 voff_first, RDI_U64 voff_opl, RDIM_Location *location) -{ - RDIM_LocationCase *location_case = rdim_push_array(root->arena, RDIM_LocationCase, 1); - SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); - locset->location_case_count += 1; - root->location_count += 1; - location_case->voff_first = voff_first; - location_case->voff_opl = voff_opl; - location_case->location = location; -} - -RDI_PROC RDIM_Location* -rdim_location_addr_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode) -{ - RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_AddrBytecodeStream; - result->bytecode = *bytecode; - return result; -} - -RDI_PROC RDIM_Location* -rdim_location_val_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode) -{ - RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_ValBytecodeStream; - result->bytecode = *bytecode; - return result; -} - -RDI_PROC RDIM_Location* -rdim_location_addr_reg_plus_u16(RDIM_Root *root, RDI_U8 reg_code, RDI_U16 offset) -{ - RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_AddrRegisterPlusU16; - result->register_code = reg_code; - result->offset = offset; - return result; -} - -RDI_PROC RDIM_Location* -rdim_location_addr_addr_reg_plus_u16(RDIM_Root *root, RDI_U8 reg_code, RDI_U16 offset) -{ - RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_AddrAddrRegisterPlusU16; - result->register_code = reg_code; - result->offset = offset; - return result; -} - -RDI_PROC RDIM_Location* -rdim_location_val_reg(RDIM_Root *root, RDI_U8 reg_code) -{ - RDIM_Location *result = rdim_push_array(root->arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_ValRegister; - result->register_code = reg_code; - return result; -} - -//- rjf: name map building - -RDI_PROC RDIM_NameMap* -rdim_name_map_for_kind(RDIM_Root *root, RDI_NameMapKind kind) -{ - RDIM_NameMap *result = 0; - if(kind < RDI_NameMapKind_COUNT) - { - if(root->name_maps[kind] == 0) - { - root->name_maps[kind] = rdim_push_array(root->arena, RDIM_NameMap, 1); - root->name_maps[kind]->buckets_count = 16384; - root->name_maps[kind]->buckets = rdim_push_array(root->arena, RDIM_NameMapNode *, root->name_maps[kind]->buckets_count); - } - result = root->name_maps[kind]; - } - return result; -} - -RDI_PROC void -rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 string, RDI_U32 idx) -{ - // hash - RDI_U64 hash = rdi_hash(string.str, string.size); - RDI_U64 bucket_idx = hash%map->buckets_count; - - // find existing name node - RDIM_NameMapNode *match = 0; - for(RDIM_NameMapNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->bucket_next) - { - if(rdim_str8_match(string, node->string, 0)) - { - match = node; - break; - } - } - - // make name node if necessary - if(match == 0) - { - match = rdim_push_array(root->arena, RDIM_NameMapNode, 1); - match->string = rdim_str8_copy(root->arena, string); - RDIM_SLLStackPush_N(map->buckets[bucket_idx], match, bucket_next); - RDIM_SLLQueuePush_N(map->first, map->last, match, order_next); - map->name_count += 1; - map->bucket_collision_count += (match->bucket_next != 0); - } - - // find existing idx - RDI_S32 existing_idx = 0; - for(RDIM_NameMapIdxNode *node = match->idx_first; - node != 0; - node = node->next) - { - for(RDI_U32 i = 0; i < ArrayCount(node->idx); i += 1) - { - if(node->idx[i] == 0) - { - break; - } - if(node->idx[i] == idx) - { - existing_idx = 1; - break; - } - } - } - - // insert new idx if necessary - if(!existing_idx) - { - RDIM_NameMapIdxNode *idx_node = match->idx_last; - RDI_U32 insert_i = match->idx_count%ArrayCount(idx_node->idx); - if(insert_i == 0) - { - idx_node = rdim_push_array(root->arena, RDIM_NameMapIdxNode, 1); - SLLQueuePush(match->idx_first, match->idx_last, idx_node); - } - - idx_node->idx[insert_i] = idx; - match->idx_count += 1; - } -} - -//////////////////////////////// -//~ rjf: Debug Info Baking (Loose -> Tight) Functions - -//- rjf: bake context construction - -RDI_PROC RDIM_BakeCtx* -rdim_bake_ctx_begin(RDIM_BakeParams *params) -{ - RDIM_Arena *arena = rdim_arena_alloc(); - RDIM_BakeCtx *result = rdim_push_array(arena, RDIM_BakeCtx, 1); - result->arena = arena; -#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) - result->strs.buckets_count = BKTCOUNT(params->strings_bucket_count); - result->idxs.buckets_count = BKTCOUNT(params->idx_runs_bucket_count); -#undef BKTCOUNT - result->strs.buckets = rdim_push_array(arena, RDIM_StringNode *, result->strs.buckets_count); - result->idxs.buckets = rdim_push_array(arena, RDIM_IdxRunNode *, result->idxs.buckets_count); - - rdim_string(result, rdim_str8_lit("")); - rdim_idx_run(result, 0, 0); - - result->tree = rdim_push_array(arena, RDIM_PathTree, 1); - { - RDIM_PathNode *nil_path_node = rdim_paths_new_node(result); - nil_path_node->name = rdim_str8_lit(""); - RDIM_SrcNode *nil_src_node = rdim_paths_new_src_node(result); - nil_src_node->path_node = nil_path_node; - nil_src_node->normal_full_path = rdim_str8_lit(""); - nil_path_node->src_file = nil_src_node; - } - - return result; -} - -RDI_PROC void -rdim_bake_ctx_release(RDIM_BakeCtx *bake_ctx) -{ - arena_release(bake_ctx->arena); -} - -//- rjf: string baking - -RDI_PROC RDI_U32 -rdim_string(RDIM_BakeCtx *bctx, RDIM_String8 str) -{ - RDIM_Arena *arena = bctx->arena; - RDIM_Strings *strs = &bctx->strs; - RDI_U64 hash = rdi_hash(str.str, str.size); - RDI_U64 bucket_idx = hash%strs->buckets_count; - - // look for a match - RDIM_StringNode *match = 0; - for(RDIM_StringNode *node = strs->buckets[bucket_idx]; - node != 0; - node = node->bucket_next) - { - if(node->hash == hash && rdim_str8_match(node->str, str, 0)) - { - match = node; - break; - } - } - - // insert new node if no match - if(match == 0) - { - RDIM_StringNode *node = rdim_push_array_no_zero(arena, RDIM_StringNode, 1); - node->str = rdim_str8_copy(arena, str); - node->hash = hash; - node->idx = strs->count; - strs->count += 1; - RDIM_SLLQueuePush_N(strs->order_first, strs->order_last, node, order_next); - RDIM_SLLStackPush_N(strs->buckets[bucket_idx], node, bucket_next); - match = node; - strs->bucket_collision_count += (node->bucket_next != 0); - } - - // extract idx to return - rdim_assert(match != 0); - RDI_U32 result = match->idx; - return result; -} - -//- rjf: idx run baking - -RDI_PROC RDI_U64 -rdim_idx_run_hash(RDI_U32 *idx_run, RDI_U32 count) -{ - RDI_U64 hash = 5381; - RDI_U32 *ptr = idx_run; - RDI_U32 *opl = idx_run + count; - for(;ptr < opl; ptr += 1) - { - hash = ((hash << 5) + hash) + (*ptr); - } - return(hash); -} - -RDI_PROC RDI_U32 -rdim_idx_run(RDIM_BakeCtx *bctx, RDI_U32 *idx_run, RDI_U32 count) -{ - RDIM_Arena *arena = bctx->arena; - RDIM_IdxRuns *idxs = &bctx->idxs; - - RDI_U64 hash = rdim_idx_run_hash(idx_run, count); - RDI_U64 bucket_idx = hash%idxs->buckets_count; - - // look for a match - RDIM_IdxRunNode *match = 0; - for(RDIM_IdxRunNode *node = idxs->buckets[bucket_idx]; - node != 0; - node = node->bucket_next) - { - if(node->hash == hash) - { - RDI_S32 is_match = 1; - RDI_U32 *node_idx = node->idx_run; - for(RDI_U32 i = 0; i < count; i += 1) - { - if(node_idx[i] != idx_run[i]) - { - is_match = 0; - break; - } - } - if(is_match) - { - match = node; - break; - } - } - } - - // insert new node if no match - if(match == 0) - { - RDIM_IdxRunNode *node = rdim_push_array_no_zero(arena, RDIM_IdxRunNode, 1); - RDI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RDI_U32, count); - for(RDI_U32 i = 0; i < count; i += 1) - { - idx_run_copy[i] = idx_run[i]; - } - node->idx_run = idx_run_copy; - node->hash = hash; - node->count = count; - node->first_idx = idxs->idx_count; - idxs->count += 1; - idxs->idx_count += count; - RDIM_SLLQueuePush_N(idxs->order_first, idxs->order_last, node, order_next); - RDIM_SLLStackPush_N(idxs->buckets[bucket_idx], node, bucket_next); - match = node; - idxs->bucket_collision_count += (node->bucket_next != 0); - } - - // extract idx to return - rdim_assert(match != 0); - RDI_U32 result = match->first_idx; - return result; -} - -//- rjf: data section baking - -RDI_PROC RDI_U32 -rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RDI_U64 size, RDI_DataSectionTag tag) -{ - RDI_U32 result = dss->count; - RDIM_DSectionNode *node = rdim_push_array(arena, RDIM_DSectionNode, 1); - SLLQueuePush(dss->first, dss->last, node); - node->data = data; - node->size = size; - node->tag = tag; - dss->count += 1; - return result; -} - -//- rjf: paths baking - -RDI_PROC RDIM_String8 -rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - RDIM_String8List list = {0}; - if(node != 0) - { - rdim_normal_string_from_path_node_build(scratch.arena, node, &list); - } - RDIM_String8 result = rdim_str8_list_join(arena, &list, rdim_str8_lit("/")); - { - RDI_U8 *ptr = result.str; - RDI_U8 *opl = result.str + result.size; - for(; ptr < opl; ptr += 1) - { - RDI_U8 c = *ptr; - if('A' <= c && c <= 'Z') { c += 'a' - 'A'; } - *ptr = c; - } - } - scratch_end(scratch); - return result; -} - -RDI_PROC void -rdim_normal_string_from_path_node_build(RDIM_Arena *arena, RDIM_PathNode *node, RDIM_String8List *out) -{ - // TODO(rjf): why is this recursive... - if(node->parent != 0) - { - rdim_normal_string_from_path_node_build(arena, node->parent, out); - } - if(node->name.size > 0) - { - rdim_str8_list_push(arena, out, node->name); - } -} - -RDI_PROC RDIM_PathNode* -rdim_paths_new_node(RDIM_BakeCtx *bctx) -{ - RDIM_PathTree *tree = bctx->tree; - RDIM_PathNode *result = rdim_push_array(bctx->arena, RDIM_PathNode, 1); - RDIM_SLLQueuePush_N(tree->first, tree->last, result, next_order); - result->idx = tree->count; - tree->count += 1; - return result; -} - -RDI_PROC RDIM_PathNode* -rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir) -{ - // look for existing match - RDIM_PathNode *match = 0; - for(RDIM_PathNode *node = dir->first_child; - node != 0; - node = node->next_sibling) - { - if(rdim_str8_match(node->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) - { - match = node; - break; - } - } - - // construct new node if no match - RDIM_PathNode *new_node = 0; - if(match == 0){ - new_node = rdim_paths_new_node(bctx); - new_node->parent = dir; - RDIM_SLLQueuePush_N(dir->first_child, dir->last_child, new_node, next_sibling); - new_node->name = rdim_str8_copy(bctx->arena, sub_dir); - } - - // select result from the two paths - RDIM_PathNode *result = match; - if(match == 0){ - result = new_node; - } - - return result; -} - -RDI_PROC RDIM_PathNode* -rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path) -{ - RDIM_PathNode *node_cursor = &bctx->tree->root; - - RDI_U8 *ptr = path.str; - RDI_U8 *opl = path.str + path.size; - for(;ptr < opl;){ - // skip past slashes - for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); - - // save beginning of non-slash range - RDI_U8 *range_first = ptr; - - // skip past non-slashes - for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); - - // if range is non-empty advance the node cursor - if(range_first < ptr){ - RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); - node_cursor = rdim_paths_sub_path(bctx, node_cursor, sub_dir); - } - } - - RDIM_PathNode *result = node_cursor; - return result; -} - -RDI_PROC RDI_U32 -rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path) -{ - RDIM_PathNode *node = rdim_paths_node_from_path(bctx, path); - RDI_U32 result = node->idx; - return result; -} - -RDI_PROC RDIM_SrcNode* -rdim_paths_new_src_node(RDIM_BakeCtx *bctx) -{ - RDIM_PathTree *tree = bctx->tree; - RDIM_SrcNode *result = rdim_push_array(bctx->arena, RDIM_SrcNode, 1); - SLLQueuePush(tree->src_first, tree->src_last, result); - result->idx = tree->src_count; - tree->src_count += 1; - return result; -} - -RDI_PROC RDIM_SrcNode* -rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node) -{ - RDIM_SrcNode *result = path_node->src_file; - if(result == 0) - { - RDIM_SrcNode *new_node = rdim_paths_new_src_node(bctx); - new_node->path_node = path_node; - new_node->normal_full_path = rdim_normal_string_from_path_node(bctx->arena, path_node); - result = path_node->src_file = new_node; - } - return result; -} - -//- rjf: per-unit line info baking - -RDI_PROC RDIM_UnitLinesCombined* -rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequenceNode *first_seq) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // gather up all line info into two arrays - // keys: sortable array; pairs voffs with line info records; null records are sequence enders - // recs: contains all the source coordinates for a range of voffs - RDI_U64 line_count = 0; - RDI_U64 seq_count = 0; - for(RDIM_LineSequenceNode *node = first_seq; - node != 0; - node = node->next) - { - seq_count += 1; - line_count += node->line_seq.line_count; - } - - RDI_U64 key_count = line_count + seq_count; - RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); - RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); - - { - RDIM_SortKey *key_ptr = line_keys; - RDIM_LineRec *rec_ptr = line_recs; - - for(RDIM_LineSequenceNode *node = first_seq; - node != 0; - node = node->next) - { - RDIM_PathNode *src_path = - rdim_paths_node_from_path(bctx, node->line_seq.file_name); - RDIM_SrcNode *src_file = rdim_paths_src_node_from_path_node(bctx, src_path); - RDI_U32 file_id = src_file->idx; - - RDI_U64 node_line_count = node->line_seq.line_count; - for(RDI_U64 i = 0; i < node_line_count; i += 1){ - key_ptr->key = node->line_seq.voffs[i]; - key_ptr->val = rec_ptr; - key_ptr += 1; - - rec_ptr->file_id = file_id; - rec_ptr->line_num = node->line_seq.line_nums[i]; - if(node->line_seq.col_nums != 0){ - rec_ptr->col_first = node->line_seq.col_nums[i*2]; - rec_ptr->col_opl = node->line_seq.col_nums[i*2 + 1]; - } - rec_ptr += 1; - } - - key_ptr->key = node->line_seq.voffs[node_line_count]; - key_ptr->val = 0; - key_ptr += 1; - - RDIM_LineMapFragment *fragment = rdim_push_array(arena, RDIM_LineMapFragment, 1); - RDIM_SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); - fragment->sequence = node; - } - } - - // sort - RDIM_SortKey *sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); - - // TODO(allen): do a pass over sorted keys to make sure duplicate keys are sorted with - // null record first, and no more than one null record and one non-null record - - // arrange output - RDI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RDI_U64, key_count + 1); - RDI_Line *arranged_lines = rdim_push_array_no_zero(arena, RDI_Line, key_count); - - for(RDI_U64 i = 0; i < key_count; i += 1){ - arranged_voffs[i] = sorted_line_keys[i].key; - } - arranged_voffs[key_count] = ~0ull; - for(RDI_U64 i = 0; i < key_count; i += 1){ - RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; - if(rec != 0){ - arranged_lines[i].file_idx = rec->file_id; - arranged_lines[i].line_num = rec->line_num; - } - else{ - arranged_lines[i].file_idx = 0; - arranged_lines[i].line_num = 0; - } - } - - RDIM_UnitLinesCombined *result = rdim_push_array(arena, RDIM_UnitLinesCombined, 1); - result->voffs = arranged_voffs; - result->lines = arranged_lines; - result->cols = 0; - result->line_count = key_count; - - scratch_end(scratch); - return result; -} - -//- rjf: per-src line info baking - -RDI_PROC RDIM_SrcLinesCombined* -rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // gather line number map - RDIM_SrcLineMapBucket *first_bucket = 0; - RDIM_SrcLineMapBucket *last_bucket = 0; - RDI_U64 line_hash_slots_count = 1024; - RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); - RDI_U64 line_count = 0; - RDI_U64 voff_count = 0; - RDI_U64 max_line_num = 0; - { - for(RDIM_LineMapFragment *map_fragment = first; - map_fragment != 0; - map_fragment = map_fragment->next) - { - RDIM_LineSequence *sequence = &map_fragment->sequence->line_seq; - - RDI_U64 *seq_voffs = sequence->voffs; - RDI_U32 *seq_line_nums = sequence->line_nums; - RDI_U64 seq_line_count = sequence->line_count; - for(RDI_U64 i = 0; i < seq_line_count; i += 1){ - RDI_U32 line_num = seq_line_nums[i]; - RDI_U64 voff = seq_voffs[i]; - RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; - - // update unique voff counter & max line number - voff_count += 1; - max_line_num = Max(max_line_num, line_num); - - // find match - RDIM_SrcLineMapBucket *match = 0; - { - for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; - node != 0; - node = node->hash_next){ - if(node->line_num == line_num){ - match = node; - break; - } - } - } - - // introduce new line if no match - if(match == 0){ - match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); - RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); - RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); - match->line_num = line_num; - line_count += 1; - } - - // insert new voff - { - RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); - RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); - match->voff_count += 1; - block->voff = voff; - } - } - } - } - - // bake sortable keys array - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); - { - RDIM_SortKey *key_ptr = keys; - for(RDIM_SrcLineMapBucket *node = first_bucket; - node != 0; - node = node->order_next, key_ptr += 1){ - key_ptr->key = node->line_num; - key_ptr->val = node; - } - } - - // sort - RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); - - // bake result - RDI_U32 *line_nums = rdim_push_array_no_zero(arena, RDI_U32, line_count); - RDI_U32 *line_ranges = rdim_push_array_no_zero(arena, RDI_U32, line_count + 1); - RDI_U64 *voffs = rdim_push_array_no_zero(arena, RDI_U64, voff_count); - { - RDI_U64 *voff_ptr = voffs; - for(RDI_U32 i = 0; i < line_count; i += 1){ - line_nums[i] = sorted_keys[i].key; - line_ranges[i] = (RDI_U32)(voff_ptr - voffs); - RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; - for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; - node != 0; - node = node->next){ - *voff_ptr = node->voff; - voff_ptr += 1; - } - } - line_ranges[line_count] = voff_count; - } - - RDIM_SrcLinesCombined *result = rdim_push_array(arena, RDIM_SrcLinesCombined, 1); - result->line_nums = line_nums; - result->line_ranges = line_ranges; - result->line_count = line_count; - result->voffs = voffs; - result->voff_count = voff_count; - - scratch_end(scratch); - return result; -} - -//- rjf: vmap baking -RDI_PROC RDIM_VMap -rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // sort markers - RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, marker_count); - - // determine if an extra vmap entry for zero is needed - RDI_U32 extra_vmap_entry = 0; - if(marker_count > 0 && sorted_keys[0].key != 0){ - extra_vmap_entry = 1; - } - - // fill output vmap entries - RDI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; - RDI_VMapEntry *vmap = rdim_push_array_no_zero(arena, RDI_VMapEntry, vmap_count_raw + 1); - RDI_U32 vmap_entry_count_pass_1 = 0; - - { - RDI_VMapEntry *vmap_ptr = vmap; - - if(extra_vmap_entry){ - vmap_ptr->voff = 0; - vmap_ptr->idx = 0; - vmap_ptr += 1; - } - - RDIM_VMapRangeTracker *tracker_stack = 0; - RDIM_VMapRangeTracker *tracker_free = 0; - - RDIM_SortKey *key_ptr = sorted_keys; - RDIM_SortKey *key_opl = sorted_keys + marker_count; - for(;key_ptr < key_opl;){ - // get initial map state from tracker stack - RDI_U32 initial_idx = (RDI_U32)0xffffffff; - if(tracker_stack != 0){ - initial_idx = tracker_stack->idx; - } - - // update tracker stack - // * we must process _all_ of the changes that apply at this voff before moving on - RDI_U64 voff = key_ptr->key; - - for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1){ - RDIM_VMapMarker *marker = (RDIM_VMapMarker*)key_ptr->val; - RDI_U32 idx = marker->idx; - - // push to stack - if(marker->begin_range){ - RDIM_VMapRangeTracker *new_tracker = tracker_free; - if(new_tracker != 0){ - RDIM_SLLStackPop(tracker_free); - } - else{ - new_tracker = rdim_push_array(scratch.arena, RDIM_VMapRangeTracker, 1); - } - RDIM_SLLStackPush(tracker_stack, new_tracker); - new_tracker->idx = idx; - } - - // pop matching node from stack (not always the top) - else{ - RDIM_VMapRangeTracker **ptr_in = &tracker_stack; - RDIM_VMapRangeTracker *match = 0; - for(RDIM_VMapRangeTracker *node = tracker_stack; - node != 0;){ - if(node->idx == idx){ - match = node; - break; - } - ptr_in = &node->next; - node = node->next; - } - if(match != 0){ - *ptr_in = match->next; - RDIM_SLLStackPush(tracker_free, match); - } - } - } - - // get final map state from tracker stack - RDI_U32 final_idx = 0; - if(tracker_stack != 0){ - final_idx = tracker_stack->idx; - } - - // if final is different from initial - emit new vmap entry - if(final_idx != initial_idx){ - vmap_ptr->voff = voff; - vmap_ptr->idx = final_idx; - vmap_ptr += 1; - } - } - - vmap_entry_count_pass_1 = (RDI_U32)(vmap_ptr - vmap); - } - - // replace zero unit indexes that follow a non-zero - // TODO(rjf): 0 *is* a real unit index right now - if(0) - { - // (the last entry is not replaced because it acts as a terminator) - RDI_U32 last = vmap_entry_count_pass_1 - 1; - - RDI_VMapEntry *vmap_ptr = vmap; - RDI_U64 real_idx = 0; - - for(RDI_U32 i = 0; i < last; i += 1, vmap_ptr += 1){ - // is this a zero after a real index? - if(vmap_ptr->idx == 0){ - vmap_ptr->idx = real_idx; - } - - // remember a real index - else{ - real_idx = vmap_ptr->idx; - } - } - } - - // combine duplicate neighbors - RDI_U32 vmap_entry_count = 0; - { - RDI_VMapEntry *vmap_ptr = vmap; - RDI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; - RDI_VMapEntry *vmap_out = vmap; - - for(;vmap_ptr < vmap_opl;){ - RDI_VMapEntry *vmap_range_first = vmap_ptr; - RDI_U64 idx = vmap_ptr->idx; - vmap_ptr += 1; - for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; - rdim_memcpy_struct(vmap_out, vmap_range_first); - vmap_out += 1; - } - - vmap_entry_count = (RDI_U32)(vmap_out - vmap); - } - - // fill result - RDIM_VMap *result = rdim_push_array(arena, RDIM_VMap, 1); - result->vmap = vmap; - result->count = vmap_entry_count - 1; - - rdim_scratch_end(scratch); - - return result; -} - -RDI_PROC RDIM_VMap* -rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RDI_U64 count) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // count necessary markers - RDI_U64 marker_count = count*2; - - // fill markers - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - - { - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - for(RDIM_UnitVMapRange *range = first; - range != 0; - range = range->next){ - if(range->first < range->opl){ - RDI_U32 unit_idx = range->unit->idx; - - key_ptr->key = range->first; - key_ptr->val = marker_ptr; - marker_ptr->idx = unit_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = range->opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = unit_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - } - - // construct vmap - RDIM_VMap *result = rdim_vmap_from_markers(arena, markers, keys, marker_count); - rdim_scratch_end(scratch); - return result; -} - -//- rjf: type info baking - -RDI_PROC RDI_U32* -rdim_idx_run_from_types(RDIM_Arena *arena, RDIM_Type **types, RDI_U32 count) -{ - RDI_U32 *result = rdim_push_array(arena, RDI_U32, count); - for(RDI_U32 i = 0; i < count; i += 1){ - result[i] = types[i]->idx; - } - return result; -} - -RDI_PROC RDIM_TypeData* -rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // fill type nodes - RDI_U32 type_count = root->type_count; - RDI_TypeNode *type_nodes = rdim_push_array_no_zero(arena, RDI_TypeNode, type_count); - - { - RDI_TypeNode *ptr = type_nodes; - RDI_TypeNode *opl = ptr + type_count; - RDIM_Type *loose_type = root->first_type; - for(;loose_type != 0 && ptr < opl; - loose_type = loose_type->next_order, ptr += 1){ - - RDI_TypeKind kind = loose_type->kind; - - // shared - ptr->kind = kind; - ptr->flags = loose_type->flags; - ptr->byte_size = loose_type->byte_size; - - // built-in - if(RDI_TypeKind_FirstBuiltIn <= kind && kind <= RDI_TypeKind_LastBuiltIn){ - ptr->built_in.name_string_idx = rdim_string(bctx, loose_type->name); - } - - // constructed - else if(RDI_TypeKind_FirstConstructed <= kind && kind <= RDI_TypeKind_LastConstructed){ - ptr->constructed.direct_type_idx = loose_type->direct_type->idx; - - switch (kind){ - case RDI_TypeKind_Array: - { - ptr->constructed.count = loose_type->count; - }break; - - case RDI_TypeKind_Function: - { - // parameters - RDI_U32 count = loose_type->count; - RDI_U32 *idx_run = rdim_idx_run_from_types(scratch.arena, loose_type->param_types, count); - ptr->constructed.param_idx_run_first = rdim_idx_run(bctx, idx_run, count); - ptr->constructed.count = count; - }break; - - case RDI_TypeKind_Method: - { - // parameters - RDI_U32 count = loose_type->count; - RDI_U32 *idx_run = rdim_idx_run_from_types(scratch.arena, loose_type->param_types, count); - ptr->constructed.param_idx_run_first = rdim_idx_run(bctx, idx_run, count); - ptr->constructed.count = count; - }break; - } - } - - // user-defined - else if(RDI_TypeKind_FirstUserDefined <= kind && kind <= RDI_TypeKind_LastUserDefined){ - ptr->user_defined.name_string_idx = rdim_string(bctx, loose_type->name); - if(loose_type->udt != 0){ - ptr->user_defined.udt_idx = loose_type->udt->idx; - } - if(loose_type->direct_type != 0){ - ptr->user_defined.direct_type_idx = loose_type->direct_type->idx; - } - } - - // bitfield - else if(kind == RDI_TypeKind_Bitfield){ - ptr->bitfield.off = loose_type->off; - ptr->bitfield.size = loose_type->count; - } - - rdim_scratch_end(scratch); - } - - // both iterators should end at the same time - rdim_assert(loose_type == 0); - rdim_assert(ptr == opl); - } - - - // fill udts - RDI_U32 udt_count = root->type_udt_count; - RDI_UDT *udts = rdim_push_array_no_zero(arena, RDI_UDT, udt_count); - - RDI_U32 member_count = root->total_member_count; - RDI_Member *members = rdim_push_array_no_zero(arena, RDI_Member, member_count); - - RDI_U32 enum_member_count = root->total_enum_val_count; - RDI_EnumMember *enum_members = rdim_push_array_no_zero(arena, RDI_EnumMember, enum_member_count); - - { - RDI_UDT *ptr = udts; - RDI_UDT *opl = ptr + udt_count; - - RDI_Member *member_ptr = members; - RDI_Member *member_opl = members + member_count; - - RDI_EnumMember *enum_member_ptr = enum_members; - RDI_EnumMember *enum_member_opl = enum_members + enum_member_count; - - RDIM_TypeUDT *loose_udt = root->first_udt; - for(;loose_udt != 0 && ptr < opl; - loose_udt = loose_udt->next_order, ptr += 1){ - ptr->self_type_idx = loose_udt->self_type->idx; - - rdim_assert(loose_udt->member_count == 0 || - loose_udt->enum_val_count == 0); - - // enum members - if(loose_udt->enum_val_count != 0){ - ptr->flags |= RDI_UserDefinedTypeFlag_EnumMembers; - - ptr->member_first = (RDI_U32)(enum_member_ptr - enum_members); - ptr->member_count = loose_udt->enum_val_count; - - RDI_U32 local_enum_val_count = loose_udt->enum_val_count; - RDIM_TypeEnumVal *loose_enum_val = loose_udt->first_enum_val; - for(RDI_U32 i = 0; - i < local_enum_val_count; - i += 1, enum_member_ptr += 1, loose_enum_val = loose_enum_val->next){ - enum_member_ptr->name_string_idx = rdim_string(bctx, loose_enum_val->name); - enum_member_ptr->val = loose_enum_val->val; - } - } - - // struct/class/union members - else{ - ptr->member_first = (RDI_U32)(member_ptr - members); - ptr->member_count = loose_udt->member_count; - - RDI_U32 local_member_count = loose_udt->member_count; - RDIM_TypeMember *loose_member = loose_udt->first_member; - for(RDI_U32 i = 0; - i < local_member_count; - i += 1, member_ptr += 1, loose_member = loose_member->next){ - member_ptr->kind = loose_member->kind; - // TODO(allen): member_ptr->visibility = ; - member_ptr->name_string_idx = rdim_string(bctx, loose_member->name); - member_ptr->off = loose_member->off; - member_ptr->type_idx = loose_member->type->idx; - - // TODO(allen): - if(loose_member->kind == RDI_MemberKind_Method){ - //loose_member_ptr->unit_idx = ; - //loose_member_ptr->proc_symbol_idx = ; - } - } - - } - - RDI_U32 file_idx = 0; - if(loose_udt->source_path.size > 0){ - RDIM_PathNode *path_node = rdim_paths_node_from_path(bctx, loose_udt->source_path); - RDIM_SrcNode *src_node = rdim_paths_src_node_from_path_node(bctx, path_node); - file_idx = src_node->idx; - } - - ptr->file_idx = file_idx; - ptr->line = loose_udt->line; - ptr->col = loose_udt->col; - } - - // all iterators should end at the same time - rdim_assert(loose_udt == 0); - rdim_assert(ptr == opl); - rdim_assert(member_ptr == member_opl); - rdim_assert(enum_member_ptr == enum_member_opl); - } - - - // fill result - RDIM_TypeData *result = rdim_push_array(arena, RDIM_TypeData, 1); - result->type_nodes = type_nodes; - result->type_node_count = type_count; - result->udts = udts; - result->udt_count = udt_count; - result->members = members; - result->member_count = member_count; - result->enum_members = enum_members; - result->enum_member_count = enum_member_count; - - rdim_scratch_end(scratch); - return result; -} - -//- rjf: symbol data baking - -RDI_PROC RDIM_SymbolData* -rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // count symbol kinds - RDI_U32 globalvar_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_GlobalVariable]; - RDI_U32 threadvar_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_ThreadVariable]; - RDI_U32 procedure_count = 1 + root->symbol_kind_counts[RDIM_SymbolKind_Procedure]; - - // allocate symbol arrays - RDI_GlobalVariable *global_variables = - rdim_push_array(arena, RDI_GlobalVariable, globalvar_count); - - RDI_ThreadVariable *thread_variables = - rdim_push_array(arena, RDI_ThreadVariable, threadvar_count); - - RDI_Procedure *procedures = rdim_push_array(arena, RDI_Procedure, procedure_count); - - // fill symbol arrays - { - RDI_GlobalVariable *global_ptr = global_variables; - RDI_ThreadVariable *thread_local_ptr = thread_variables; - RDI_Procedure *procedure_ptr = procedures; - - // nils - global_ptr += 1; - thread_local_ptr += 1; - procedure_ptr += 1; - - // symbol nodes - for(RDIM_Symbol *node = root->first_symbol; - node != 0; - node = node->next_order){ - RDI_U32 name_string_idx = rdim_string(bctx, node->name); - RDI_U32 link_name_string_idx = rdim_string(bctx, node->link_name); - RDI_U32 type_idx = node->type->idx; - - RDI_LinkFlags link_flags = 0; - RDI_U32 container_idx = 0; - { - if(node->is_extern){ - link_flags |= RDI_LinkFlag_External; - } - if(node->container_symbol != 0){ - container_idx = node->container_symbol->idx; - link_flags |= RDI_LinkFlag_ProcScoped; - } - else if(node->container_type != 0 && node->container_type->udt != 0){ - container_idx = node->container_type->udt->idx; - link_flags |= RDI_LinkFlag_TypeScoped; - } - } - - switch (node->kind){ - default:{}break; - - case RDIM_SymbolKind_GlobalVariable: - { - global_ptr->name_string_idx = name_string_idx; - global_ptr->link_flags = link_flags; - global_ptr->voff = node->offset; - global_ptr->type_idx = type_idx; - global_ptr->container_idx = container_idx; - global_ptr += 1; - }break; - - case RDIM_SymbolKind_ThreadVariable: - { - thread_local_ptr->name_string_idx = name_string_idx; - thread_local_ptr->link_flags = link_flags; - thread_local_ptr->tls_off = (RDI_U32)node->offset; - thread_local_ptr->type_idx = type_idx; - thread_local_ptr->container_idx = container_idx; - thread_local_ptr += 1; - }break; - - case RDIM_SymbolKind_Procedure: - { - procedure_ptr->name_string_idx = name_string_idx; - procedure_ptr->link_name_string_idx = link_name_string_idx; - procedure_ptr->link_flags = link_flags; - procedure_ptr->type_idx = type_idx; - procedure_ptr->root_scope_idx = node->root_scope->idx; - procedure_ptr->container_idx = container_idx; - procedure_ptr += 1; - }break; - } - } - - rdim_assert(global_ptr - global_variables == globalvar_count); - rdim_assert(thread_local_ptr - thread_variables == threadvar_count); - rdim_assert(procedure_ptr - procedures == procedure_count); - } - - // global vmap - RDIM_VMap *global_vmap = 0; - { - // count necessary markers - RDI_U32 marker_count = globalvar_count*2; - - // fill markers - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - - // real globals - for(RDIM_Symbol *node = root->first_symbol; - node != 0; - node = node->next_order){ - if(node->kind == RDIM_SymbolKind_GlobalVariable){ - RDI_U32 global_idx = node->idx; - - RDI_U64 first = node->offset; - RDI_U64 opl = first + node->type->byte_size; - - key_ptr->key = first; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - - // nil global - { - RDI_U32 global_idx = 0; - - RDI_U64 first = 0; - RDI_U64 opl = (RDI_U64)0xffffffffffffffffull; - - key_ptr->key = first; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - - // assert we filled all the markers - rdim_assert(key_ptr - keys == marker_count && - marker_ptr - markers == marker_count); - - // construct vmap - global_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); - } - - // allocate scope array - - // (assert there is a nil scope) - rdim_assert(root->first_scope != 0 && - root->first_scope->symbol == 0 && - root->first_scope->first_child == 0 && - root->first_scope->next_sibling == 0 && - root->first_scope->range_count == 0); - - RDI_U32 scope_count = root->scope_count; - RDI_Scope *scopes = rdim_push_array(arena, RDI_Scope, scope_count); - - RDI_U32 scope_voff_count = root->scope_voff_count; - RDI_U64 *scope_voffs = rdim_push_array(arena, RDI_U64, scope_voff_count); - - RDI_U32 local_count = root->local_count; - RDI_Local *locals = rdim_push_array(arena, RDI_Local, local_count); - - RDI_U32 location_block_count = root->location_count; - RDI_LocationBlock *location_blocks = - rdim_push_array(arena, RDI_LocationBlock, location_block_count); - - RDIM_String8List location_data = {0}; - - // iterate scopes, locals, and locations - // fill scope voffs, locals, and location information - { - RDI_Scope *scope_ptr = scopes; - RDI_U64 *scope_voff_ptr = scope_voffs; - RDI_Local *local_ptr = locals; - RDI_LocationBlock *location_block_ptr = location_blocks; - - for(RDIM_Scope *node = root->first_scope; - node != 0; - node = node->next_order, scope_ptr += 1){ - - // emit voffs - RDI_U32 voff_first = (RDI_U32)(scope_voff_ptr - scope_voffs); - for(RDIM_VOffRange *range = node->first_range; - range != 0; - range = range->next){ - *scope_voff_ptr = range->voff_first; - scope_voff_ptr += 1; - *scope_voff_ptr = range->voff_opl; - scope_voff_ptr += 1; - } - RDI_U32 voff_opl = (RDI_U32)(scope_voff_ptr - scope_voffs); - - // emit locals - RDI_U32 scope_local_count = node->local_count; - RDI_U32 scope_local_first = (RDI_U32)(local_ptr - locals); - for(RDIM_Local *slocal = node->first_local; - slocal != 0; - slocal = slocal->next, local_ptr += 1){ - local_ptr->kind = slocal->kind; - local_ptr->name_string_idx = rdim_string(bctx, slocal->name); - local_ptr->type_idx = slocal->type->idx; - - RDIM_LocationSet *locset = slocal->locset; - if(locset != 0){ - RDI_U32 location_first = (RDI_U32)(location_block_ptr - location_blocks); - RDI_U32 location_opl = location_first + locset->location_case_count; - local_ptr->location_first = location_first; - local_ptr->location_opl = location_opl; - - for(RDIM_LocationCase *location_case = locset->first_location_case; - location_case != 0; - location_case = location_case->next){ - location_block_ptr->scope_off_first = location_case->voff_first; - location_block_ptr->scope_off_opl = location_case->voff_opl; - location_block_ptr->location_data_off = location_data.total_size; - location_block_ptr += 1; - - RDIM_Location *location = location_case->location; - if(location == 0){ - RDI_U64 data = 0; - str8_serial_push_align(scratch.arena, &location_data, 8); - str8_serial_push_data(scratch.arena, &location_data, &data, 1); - } - else{ - switch (location->kind){ - default: - { - RDI_U64 data = 0; - str8_serial_push_align(scratch.arena, &location_data, 8); - str8_serial_push_data(scratch.arena, &location_data, &data, 1); - }break; - - case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_ValBytecodeStream: - { - rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&location->kind))); - for(RDIM_EvalBytecodeOp *op_node = location->bytecode.first_op; - op_node != 0; - op_node = op_node->next){ - RDI_U8 op_data[9]; - op_data[0] = op_node->op; - rdim_memcpy(op_data + 1, &op_node->p, op_node->p_size); - RDIM_String8 op_data_str = rdim_str8(op_data, 1 + op_node->p_size); - rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, op_data_str)); - } - { - RDI_U64 data = 0; - RDIM_String8 data_str = rdim_str8((RDI_U8 *)&data, 1); - rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, data_str)); - } - }break; - - case RDI_LocationKind_AddrRegisterPlusU16: - case RDI_LocationKind_AddrAddrRegisterPlusU16: - { - RDI_LocationRegisterPlusU16 loc = {0}; - loc.kind = location->kind; - loc.register_code = location->register_code; - loc.offset = location->offset; - rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); - }break; - - case RDI_LocationKind_ValRegister: - { - RDI_LocationRegister loc = {0}; - loc.kind = location->kind; - loc.register_code = location->register_code; - rdim_str8_list_push(scratch.arena, &location_data, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); - }break; - } - } - } - - rdim_assert(location_block_ptr - location_blocks == location_opl); - } - } - - rdim_assert(local_ptr - locals == scope_local_first + scope_local_count); - - // emit scope - scope_ptr->proc_idx = (node->symbol == 0)?0:node->symbol->idx; - scope_ptr->parent_scope_idx = (node->parent_scope == 0)?0:node->parent_scope->idx; - scope_ptr->first_child_scope_idx = (node->first_child == 0)?0:node->first_child->idx; - scope_ptr->next_sibling_scope_idx = (node->next_sibling == 0)?0:node->next_sibling->idx; - scope_ptr->voff_range_first = voff_first; - scope_ptr->voff_range_opl = voff_opl; - scope_ptr->local_first = scope_local_first; - scope_ptr->local_count = scope_local_count; - - // TODO(allen): - //scope_ptr->static_local_idx_run_first = ; - //scope_ptr->static_local_count = ; - } - - rdim_assert(scope_ptr - scopes == scope_count); - rdim_assert(local_ptr - locals == local_count); - } - - // flatten location data - RDIM_String8 location_data_str = rdim_str8_list_join(arena, &location_data, rdim_str8_lit("")); - - // scope vmap - RDIM_VMap *scope_vmap = 0; - { - // count necessary markers - RDI_U32 marker_count = scope_voff_count; - - // fill markers - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - - for(RDIM_Scope *node = root->first_scope; - node != 0; - node = node->next_order){ - RDI_U32 scope_idx = node->idx; - - for(RDIM_VOffRange *range = node->first_range; - range != 0; - range = range->next){ - key_ptr->key = range->voff_first; - key_ptr->val = marker_ptr; - marker_ptr->idx = scope_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = range->voff_opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = scope_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - - scope_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); - } - - // fill result - RDIM_SymbolData *result = rdim_push_array(arena, RDIM_SymbolData, 1); - result->global_variables = global_variables; - result->global_variable_count = globalvar_count; - result->global_vmap = global_vmap; - result->thread_variables = thread_variables; - result->thread_variable_count = threadvar_count; - result->procedures = procedures; - result->procedure_count = procedure_count; - result->scopes = scopes; - result->scope_count = scope_count; - result->scope_voffs = scope_voffs; - result->scope_voff_count = scope_voff_count; - result->scope_vmap = scope_vmap; - result->locals = locals; - result->local_count = local_count; - result->location_blocks = location_blocks; - result->location_block_count = location_block_count; - result->location_data = location_data_str.str; - result->location_data_size = location_data_str.size; - - rdim_scratch_end(scratch); - return result; -} - -//- rjf: name map baking - -RDI_PROC RDIM_NameMapBaked* -rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_NameMap *map) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - RDI_U32 bucket_count = map->name_count; - RDI_U32 node_count = map->name_count; - - // setup the final bucket layouts - RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, bucket_count); - for(RDIM_NameMapNode *node = map->first; - node != 0; - node = node->order_next){ - RDI_U64 hash = rdi_hash(node->string.str, node->string.size); - RDI_U64 bi = hash%bucket_count; - RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); - SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); - snode->node = node; - sbuckets[bi].count += 1; - } - - // allocate tables - RDI_NameMapBucket *buckets = rdim_push_array(arena, RDI_NameMapBucket, bucket_count); - RDI_NameMapNode *nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, node_count); - - // convert to serialized buckets & nodes - { - RDI_NameMapBucket *bucket_ptr = buckets; - RDI_NameMapNode *node_ptr = nodes; - for(RDI_U32 i = 0; i < bucket_count; i += 1, bucket_ptr += 1){ - bucket_ptr->first_node = (RDI_U32)(node_ptr - nodes); - bucket_ptr->node_count = sbuckets[i].count; - - for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; - snode != 0; - snode = snode->next){ - RDIM_NameMapNode *node = snode->node; - - // cons name and index(es) - RDI_U32 string_idx = rdim_string(bctx, node->string); - RDI_U32 match_count = node->idx_count; - RDI_U32 idx = 0; - if(match_count == 1){ - idx = node->idx_first->idx[0]; - } - else{ - RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); - RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); - RDI_U32 *idx_ptr = idx_run; - for(RDIM_NameMapIdxNode *idxnode = node->idx_first; - idxnode != 0; - idxnode = idxnode->next){ - for(RDI_U32 i = 0; i < ArrayCount(idxnode->idx); i += 1){ - if(idxnode->idx[i] == 0){ - goto dblbreak; - } - *idx_ptr = idxnode->idx[i]; - idx_ptr += 1; - } - } - dblbreak:; - rdim_assert(idx_ptr == idx_run + match_count); - idx = rdim_idx_run(bctx, idx_run, match_count); - rdim_arena_pop_to(scratch.arena, temp_pos); - } - - // write to node - node_ptr->string_idx = string_idx; - node_ptr->match_count = match_count; - node_ptr->match_idx_or_idx_run_first = idx; - node_ptr += 1; - } - } - rdim_assert(node_ptr - nodes == node_count); - } - - rdim_scratch_end(scratch); - - RDIM_NameMapBaked *result = rdim_push_array(arena, RDIM_NameMapBaked, 1); - result->buckets = buckets; - result->nodes = nodes; - result->bucket_count = bucket_count; - result->node_count = node_count; - return result; -} - -//- rjf: top-level baking entry point - -RDI_PROC void -rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out) -{ - str8_serial_begin(arena, out); - - // setup cons helpers - RDIM_DSections dss = {0}; - rdim_dsection(arena, &dss, 0, 0, RDI_DataSectionTag_NULL); - - RDIM_BakeParams bctx_params = {0}; - { - bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); - bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); - } - RDIM_BakeCtx *bctx = rdim_bake_ctx_begin(&bctx_params); - - //////////////////////////////// - // MAIN PART: allocating and filling out sections of the file - - // top level info - RDI_TopLevelInfo *tli = rdim_push_array(arena, RDI_TopLevelInfo, 1); - { - RDIM_TopLevelInfo *rdim_tli = &root->top_level_info; - tli->architecture = rdim_tli->architecture; - tli->exe_name_string_idx = rdim_string(bctx, rdim_tli->exe_name); - tli->exe_hash = rdim_tli->exe_hash; - tli->voff_max = rdim_tli->voff_max; - } - rdim_dsection(arena, &dss, tli, sizeof(*tli), RDI_DataSectionTag_TopLevelInfo); - - // binary sections array - { - RDI_U32 count = root->binary_section_count; - RDI_BinarySection *sections = rdim_push_array(arena, RDI_BinarySection, count); - RDI_BinarySection *dsec = sections; - for(RDIM_BinarySection *ssec = root->binary_section_first; - ssec != 0; - ssec = ssec->next, dsec += 1){ - dsec->name_string_idx = rdim_string(bctx, ssec->name); - dsec->flags = ssec->flags; - dsec->voff_first = ssec->voff_first; - dsec->voff_opl = ssec->voff_opl; - dsec->foff_first = ssec->foff_first; - dsec->foff_opl = ssec->foff_opl; - } - rdim_dsection(arena, &dss, sections, sizeof(*sections)*count, RDI_DataSectionTag_BinarySections); - } - - // units array - // * pass for per-unit information including: - // * top-level unit information - // * combining line info for whole unit - { - RDI_U32 count = root->unit_count; - RDI_Unit *units = rdim_push_array(arena, RDI_Unit, count); - RDI_Unit *dunit = units; - for(RDIM_Unit *sunit = root->unit_first; - sunit != 0; - sunit = sunit->next_order, dunit += 1){ - // strings & paths - RDI_U32 unit_name = rdim_string(bctx, sunit->unit_name); - RDI_U32 cmp_name = rdim_string(bctx, sunit->compiler_name); - - RDI_U32 src_path = rdim_paths_idx_from_path(bctx, sunit->source_file); - RDI_U32 obj_path = rdim_paths_idx_from_path(bctx, sunit->object_file); - RDI_U32 archive_path = rdim_paths_idx_from_path(bctx, sunit->archive_file); - RDI_U32 build_path = rdim_paths_idx_from_path(bctx, sunit->build_path); - - dunit->unit_name_string_idx = unit_name; - dunit->compiler_name_string_idx = cmp_name; - dunit->source_file_path_node = src_path; - dunit->object_file_path_node = obj_path; - dunit->archive_file_path_node = archive_path; - dunit->build_path_node = build_path; - dunit->language = sunit->language; - - // line info (voff -> file*line*col) - RDIM_LineSequenceNode *first_seq = sunit->line_seq_first; - RDIM_UnitLinesCombined *lines = rdim_unit_combine_lines(arena, bctx, first_seq); - - RDI_U32 line_count = lines->line_count; - if(line_count > 0){ - dunit->line_info_voffs_data_idx = - rdim_dsection(arena, &dss, lines->voffs, sizeof(RDI_U64)*(line_count + 1), - RDI_DataSectionTag_LineInfoVoffs); - dunit->line_info_data_idx = - rdim_dsection(arena, &dss, lines->lines, sizeof(RDI_Line)*line_count, - RDI_DataSectionTag_LineInfoData); - if(lines->cols != 0){ - dunit->line_info_col_data_idx = - rdim_dsection(arena, &dss, lines->cols, sizeof(RDI_Column)*line_count, - RDI_DataSectionTag_LineInfoColumns); - } - dunit->line_info_count = line_count; - } - } - - rdim_dsection(arena, &dss, units, sizeof(*units)*count, RDI_DataSectionTag_Units); - } - - // source file line info baking - // * pass for "source_combine_line" for each source file - - // * can only be run after a pass that does "unit_combine_lines" for each unit. - for(RDIM_SrcNode *src_node = bctx->tree->src_first; - src_node != 0; - src_node = src_node->next){ - RDIM_LineMapFragment *first_fragment = src_node->first_fragment; - RDIM_SrcLinesCombined *lines = rdim_source_combine_lines(arena, first_fragment); - RDI_U32 line_count = lines->line_count; - - if(line_count > 0){ - src_node->line_map_count = line_count; - - src_node->line_map_nums_data_idx = - rdim_dsection(arena, &dss, lines->line_nums, sizeof(*lines->line_nums)*line_count, - RDI_DataSectionTag_LineMapNumbers); - - src_node->line_map_range_data_idx = - rdim_dsection(arena, &dss, lines->line_ranges, sizeof(*lines->line_ranges)*(line_count + 1), - RDI_DataSectionTag_LineMapRanges); - - src_node->line_map_voff_data_idx = - rdim_dsection(arena, &dss, lines->voffs, sizeof(*lines->voffs)*lines->voff_count, - RDI_DataSectionTag_LineMapVoffs); - } - } - - // source file name mapping - { - RDIM_NameMap* map = rdim_name_map_for_kind(root, RDI_NameMapKind_NormalSourcePaths); - for(RDIM_SrcNode *src_node = bctx->tree->src_first; - src_node != 0; - src_node = src_node->next){ - if(src_node->idx != 0){ - rdim_name_map_add_pair(root, map, src_node->normal_full_path, src_node->idx); - } - } - } - - // unit vmap baking - { - RDIM_VMap *vmap = rdim_vmap_from_unit_ranges(arena, - root->unit_vmap_range_first, - root->unit_vmap_range_count); - - RDI_U64 vmap_size = sizeof(*vmap->vmap)*(vmap->count + 1); - rdim_dsection(arena, &dss, vmap->vmap, vmap_size, RDI_DataSectionTag_UnitVmap); - } - - // type info baking - { - RDIM_TypeData *types = rdim_type_data_combine(arena, root, bctx); - - RDI_U64 type_nodes_size = sizeof(*types->type_nodes)*types->type_node_count; - rdim_dsection(arena, &dss, types->type_nodes, type_nodes_size, RDI_DataSectionTag_TypeNodes); - - RDI_U64 udt_size = sizeof(*types->udts)*types->udt_count; - rdim_dsection(arena, &dss, types->udts, udt_size, RDI_DataSectionTag_UDTs); - - RDI_U64 member_size = sizeof(*types->members)*types->member_count; - rdim_dsection(arena, &dss, types->members, member_size, RDI_DataSectionTag_Members); - - RDI_U64 enum_member_size = sizeof(*types->enum_members)*types->enum_member_count; - rdim_dsection(arena, &dss, types->enum_members, enum_member_size, RDI_DataSectionTag_EnumMembers); - } - - // symbol info baking - { - RDIM_SymbolData *symbol_data = rdim_symbol_data_combine(arena, root, bctx); - - RDI_U64 global_variables_size = - sizeof(*symbol_data->global_variables)*symbol_data->global_variable_count; - rdim_dsection(arena, &dss, symbol_data->global_variables, global_variables_size, - RDI_DataSectionTag_GlobalVariables); - - RDIM_VMap *global_vmap = symbol_data->global_vmap; - RDI_U64 global_vmap_size = sizeof(*global_vmap->vmap)*(global_vmap->count + 1); - rdim_dsection(arena, &dss, global_vmap->vmap, global_vmap_size, - RDI_DataSectionTag_GlobalVmap); - - RDI_U64 thread_variables_size = - sizeof(*symbol_data->thread_variables)*symbol_data->thread_variable_count; - rdim_dsection(arena, &dss, symbol_data->thread_variables, thread_variables_size, - RDI_DataSectionTag_ThreadVariables); - - RDI_U64 procedures_size = sizeof(*symbol_data->procedures)*symbol_data->procedure_count; - rdim_dsection(arena, &dss, symbol_data->procedures, procedures_size, - RDI_DataSectionTag_Procedures); - - RDI_U64 scopes_size = sizeof(*symbol_data->scopes)*symbol_data->scope_count; - rdim_dsection(arena, &dss, symbol_data->scopes, scopes_size, RDI_DataSectionTag_Scopes); - - RDI_U64 scope_voffs_size = sizeof(*symbol_data->scope_voffs)*symbol_data->scope_voff_count; - rdim_dsection(arena, &dss, symbol_data->scope_voffs, scope_voffs_size, - RDI_DataSectionTag_ScopeVoffData); - - RDIM_VMap *scope_vmap = symbol_data->scope_vmap; - RDI_U64 scope_vmap_size = sizeof(*scope_vmap->vmap)*(scope_vmap->count + 1); - rdim_dsection(arena, &dss, scope_vmap->vmap, scope_vmap_size, RDI_DataSectionTag_ScopeVmap); - - RDI_U64 local_size = sizeof(*symbol_data->locals)*symbol_data->local_count; - rdim_dsection(arena, &dss, symbol_data->locals, local_size, RDI_DataSectionTag_Locals); - - RDI_U64 location_blocks_size = - sizeof(*symbol_data->location_blocks)*symbol_data->location_block_count; - rdim_dsection(arena, &dss, symbol_data->location_blocks, location_blocks_size, - RDI_DataSectionTag_LocationBlocks); - - RDI_U64 location_data_size = symbol_data->location_data_size; - rdim_dsection(arena, &dss, symbol_data->location_data, location_data_size, - RDI_DataSectionTag_LocationData); - } - - // name map baking - { - RDI_U32 name_map_count = 0; - for(RDI_U32 i = 0; i < RDI_NameMapKind_COUNT; i += 1){ - if(root->name_maps[i] != 0){ - name_map_count += 1; - } - } - - RDI_NameMap *name_maps = rdim_push_array(arena, RDI_NameMap, name_map_count); - - RDI_NameMap *name_map_ptr = name_maps; - for(RDI_U32 i = 0; i < RDI_NameMapKind_COUNT; i += 1){ - RDIM_NameMap *map = root->name_maps[i]; - if(map != 0){ - RDIM_NameMapBaked *baked = rdim_name_map_bake(arena, root, bctx, map); - - name_map_ptr->kind = i; - name_map_ptr->bucket_data_idx = - rdim_dsection(arena, &dss, baked->buckets, sizeof(*baked->buckets)*baked->bucket_count, - RDI_DataSectionTag_NameMapBuckets); - name_map_ptr->node_data_idx = - rdim_dsection(arena, &dss, baked->nodes, sizeof(*baked->nodes)*baked->node_count, - RDI_DataSectionTag_NameMapNodes); - name_map_ptr += 1; - } - } - - rdim_dsection(arena, &dss, name_maps, sizeof(*name_maps)*name_map_count, - RDI_DataSectionTag_NameMaps); - } - - //////////////////////////////// - // LATE PART: baking loose structures and creating final layout - - // generate data sections for file paths - { - RDI_U32 count = bctx->tree->count; - RDI_FilePathNode *nodes = rdim_push_array(arena, RDI_FilePathNode, count); - - RDI_FilePathNode *out_node = nodes; - for(RDIM_PathNode *node = bctx->tree->first; - node != 0; - node = node->next_order, out_node += 1){ - out_node->name_string_idx = rdim_string(bctx, node->name); - if(node->parent != 0){ - out_node->parent_path_node = node->parent->idx; - } - if(node->first_child != 0){ - out_node->first_child = node->first_child->idx; - } - if(node->next_sibling != 0){ - out_node->next_sibling = node->next_sibling->idx; - } - if(node->src_file != 0){ - out_node->source_file_idx = node->src_file->idx; - } - } - - rdim_dsection(arena, &dss, nodes, sizeof(*nodes)*count, RDI_DataSectionTag_FilePathNodes); - } - - // generate data sections for files - { - RDI_U32 count = bctx->tree->src_count; - RDI_SourceFile *src_files = rdim_push_array(arena, RDI_SourceFile, count); - - RDI_SourceFile *out_src_file = src_files; - for(RDIM_SrcNode *node = bctx->tree->src_first; - node != 0; - node = node->next, out_src_file += 1){ - out_src_file->file_path_node_idx = node->path_node->idx; - out_src_file->normal_full_path_string_idx = rdim_string(bctx, node->normal_full_path); - out_src_file->line_map_nums_data_idx = node->line_map_nums_data_idx; - out_src_file->line_map_range_data_idx = node->line_map_range_data_idx; - out_src_file->line_map_count = node->line_map_count; - out_src_file->line_map_voff_data_idx = node->line_map_voff_data_idx; - } - - rdim_dsection(arena, &dss, src_files, sizeof(*src_files)*count, RDI_DataSectionTag_SourceFiles); - } - - // generate data sections for strings - { - RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, bctx->strs.count + 1); - - RDI_U32 off_cursor = 0; - { - RDI_U32 *off_ptr = str_offs; - *off_ptr = 0; - off_ptr += 1; - for(RDIM_StringNode *node = bctx->strs.order_first; - node != 0; - node = node->order_next){ - off_cursor += node->str.size; - *off_ptr = off_cursor; - off_ptr += 1; - } - } - - RDI_U8 *buf = rdim_push_array(arena, RDI_U8, off_cursor); - { - RDI_U8 *ptr = buf; - for(RDIM_StringNode *node = bctx->strs.order_first; - node != 0; - node = node->order_next){ - rdim_memcpy(ptr, node->str.str, node->str.size); - ptr += node->str.size; - } - } - - rdim_dsection(arena, &dss, str_offs, sizeof(*str_offs)*(bctx->strs.count + 1), - RDI_DataSectionTag_StringTable); - rdim_dsection(arena, &dss, buf, off_cursor, RDI_DataSectionTag_StringData); - } - - // generate data sections for index runs - { - RDI_U32 *idx_data = rdim_push_array_no_zero(arena, RDI_U32, bctx->idxs.idx_count); - - { - RDI_U32 *out_ptr = idx_data; - RDI_U32 *opl = out_ptr + bctx->idxs.idx_count; - RDIM_IdxRunNode *node = bctx->idxs.order_first; - for(;node != 0 && out_ptr < opl; - node = node->order_next){ - rdim_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); - out_ptr += node->count; - } - rdim_assert(out_ptr == opl); - } - - rdim_dsection(arena, &dss, idx_data, sizeof(*idx_data)*bctx->idxs.idx_count, - RDI_DataSectionTag_IndexRuns); - } - - // layout - // * the header and data section table have to be initialized "out of order" - // * so that the rest of the system can avoid this tricky order-layout interdependence stuff - RDI_Header *header = rdim_push_array(arena, RDI_Header, 1); - RDI_DataSection *dstable = rdim_push_array(arena, RDI_DataSection, dss.count); - str8_serial_push_align(arena, out, 8); - RDI_U64 header_off = out->total_size; - str8_list_push(arena, out, str8_struct(header)); - str8_serial_push_align(arena, out, 8); - RDI_U64 data_section_off = out->total_size; - str8_list_push(arena, out, str8((RDI_U8 *)dstable, sizeof(*dstable)*dss.count)); - { - header->magic = RDI_MAGIC_CONSTANT; - header->encoding_version = RDI_ENCODING_VERSION; - header->data_section_off = data_section_off; - header->data_section_count = dss.count; - } - { - RDI_U64 test_dss_count = 0; - for(RDIM_DSectionNode *node = dss.first; - node != 0; - node = node->next){ - test_dss_count += 1; - } - rdim_assert(test_dss_count == dss.count); - - RDI_DataSection *ptr = dstable; - for(RDIM_DSectionNode *node = dss.first; - node != 0; - node = node->next, ptr += 1){ - RDI_U64 data_section_offset = 0; - if(node->size != 0) - { - str8_serial_push_align(arena, out, 8); - data_section_offset = out->total_size; - str8_list_push(arena, out, str8((RDI_U8 *)node->data, node->size)); - } - ptr->tag = node->tag; - ptr->encoding = RDI_DataSectionEncoding_Unpacked; - ptr->off = data_section_offset; - ptr->encoded_size = node->size; - ptr->unpacked_size = node->size; - } - rdim_assert(ptr == dstable + dss.count); - } - - rdim_bake_ctx_release(bctx); -} -#endif diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 28eaa664..e23f9595 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -947,352 +947,6 @@ struct RDIM_VMapMarker RDI_U32 begin_range; }; -#if 0 -//////////////////////////////// -//~ rjf: Root Construction Bundle Types - -typedef struct RDIM_RootParams RDIM_RootParams; -struct RDIM_RootParams -{ - RDI_U64 addr_size; - RDI_U32 bucket_count_units; // optional; default chosen if 0 - RDI_U32 bucket_count_symbols; // optional; default chosen if 0 - RDI_U32 bucket_count_scopes; // optional; default chosen if 0 - RDI_U32 bucket_count_locals; // optional; default chosen if 0 - RDI_U32 bucket_count_types; // optional; default chosen if 0 - RDI_U64 bucket_count_type_constructs; // optional; default chosen if 0 -}; - -typedef struct RDIM_Root RDIM_Root; -struct RDIM_Root -{ - RDIM_Arena *arena; - RDIM_MsgList msgs; - - //////// Contextual Information - - RDI_U64 addr_size; - - //////// Info Declared By User - - RDI_U64 total_member_count; - RDI_U64 total_enum_val_count; - - // symbols - RDIM_Symbol *first_symbol; - RDIM_Symbol *last_symbol; - union - { - RDI_U64 symbol_count; - RDI_U64 symbol_kind_counts[RDIM_SymbolKind_COUNT]; - }; - - RDIM_Scope *first_scope; - RDIM_Scope *last_scope; - RDI_U64 scope_count; - RDI_U64 scope_voff_count; - - RDIM_Local *first_local; - RDIM_Local *last_local; - RDI_U64 local_count; - RDI_U64 location_count; - - // name maps - RDIM_NameMap *name_maps[RDI_NameMapKind_COUNT]; - - //////// Handle Relationship Maps - - RDIM_U64ToPtrMap unit_map; - RDIM_U64ToPtrMap symbol_map; - RDIM_U64ToPtrMap scope_map; - RDIM_U64ToPtrMap local_map; - RDIM_U64ToPtrMap type_from_id_map; - RDIM_Str8ToPtrMap construct_map; -}; - -//////////////////////////////// -//~ rjf: Baking Phase Types - -//- rjf: bake data section data structure - -typedef struct RDIM_DSectionNode RDIM_DSectionNode; -struct RDIM_DSectionNode -{ - RDIM_DSectionNode *next; - void *data; - RDI_U64 size; - RDI_DataSectionTag tag; -}; - -typedef struct RDIM_DSections RDIM_DSections; -struct RDIM_DSections -{ - RDIM_DSectionNode *first; - RDIM_DSectionNode *last; - RDI_U32 count; -}; - -//- rjf: bake string data structure - -typedef struct RDIM_StringNode RDIM_StringNode; -struct RDIM_StringNode -{ - RDIM_StringNode *order_next; - RDIM_StringNode *bucket_next; - RDIM_String8 str; - RDI_U64 hash; - RDI_U32 idx; -}; - -typedef struct RDIM_Strings RDIM_Strings; -struct RDIM_Strings -{ - RDIM_StringNode *order_first; - RDIM_StringNode *order_last; - RDIM_StringNode **buckets; - RDI_U64 buckets_count; - RDI_U64 bucket_collision_count; - RDI_U32 count; -}; - -//- rjf: index run baking data structure - -typedef struct RDIM_IdxRunNode RDIM_IdxRunNode; -struct RDIM_IdxRunNode -{ - RDIM_IdxRunNode *order_next; - RDIM_IdxRunNode *bucket_next; - RDI_U32 *idx_run; - RDI_U64 hash; - RDI_U32 count; - RDI_U32 first_idx; -}; - -typedef struct RDIM_IdxRuns RDIM_IdxRuns; -struct RDIM_IdxRuns -{ - RDIM_IdxRunNode *order_first; - RDIM_IdxRunNode *order_last; - RDIM_IdxRunNode **buckets; - RDI_U64 buckets_count; - RDI_U64 bucket_collision_count; - RDI_U32 count; - RDI_U32 idx_count; -}; - -//- rjf: source file & file path baking data structures - -typedef struct RDIM_PathNode RDIM_PathNode; -struct RDIM_PathNode -{ - RDIM_PathNode *next_order; - RDIM_PathNode *parent; - RDIM_PathNode *first_child; - RDIM_PathNode *last_child; - RDIM_PathNode *next_sibling; - RDIM_String8 name; - struct RDIM_SrcNode *src_file; - RDI_U32 idx; -}; - -typedef struct RDIM_LineMapFragment RDIM_LineMapFragment; -struct RDIM_LineMapFragment -{ - RDIM_LineMapFragment *next; - RDIM_LineSequenceNode *sequence; -}; - -typedef struct RDIM_SrcNode RDIM_SrcNode; -struct RDIM_SrcNode -{ - RDIM_SrcNode *next; - RDIM_PathNode *path_node; - RDI_U32 idx; - - RDIM_String8 normal_full_path; - - // place to gather the line info attached to this src file - RDIM_LineMapFragment *first_fragment; - RDIM_LineMapFragment *last_fragment; - - // place to put the final baked version of this file's line map - RDI_U32 line_map_nums_data_idx; - RDI_U32 line_map_range_data_idx; - RDI_U32 line_map_count; - RDI_U32 line_map_voff_data_idx; -}; - -typedef struct RDIM_PathTree RDIM_PathTree; -struct RDIM_PathTree -{ - RDIM_PathNode *first; - RDIM_PathNode *last; - RDI_U32 count; - RDIM_PathNode root; - RDIM_SrcNode *src_first; - RDIM_SrcNode *src_last; - RDI_U32 src_count; -}; - -//- rjf: line info baking data structures - -typedef struct RDIM_UnitLinesCombined RDIM_UnitLinesCombined; -struct RDIM_UnitLinesCombined -{ - RDI_U64 *voffs; - RDI_Line *lines; - RDI_U16 *cols; - RDI_U32 line_count; -}; - -typedef struct RDIM_SrcLinesCombined RDIM_SrcLinesCombined; -struct RDIM_SrcLinesCombined -{ - RDI_U32 *line_nums; - RDI_U32 *line_ranges; - RDI_U64 *voffs; - RDI_U32 line_count; - RDI_U32 voff_count; -}; - -typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; -struct RDIM_SrcLineMapVoffBlock -{ - RDIM_SrcLineMapVoffBlock *next; - RDI_U64 voff; -}; - -typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; -struct RDIM_SrcLineMapBucket -{ - RDIM_SrcLineMapBucket *order_next; - RDIM_SrcLineMapBucket *hash_next; - RDI_U32 line_num; - RDIM_SrcLineMapVoffBlock *first_voff_block; - RDIM_SrcLineMapVoffBlock *last_voff_block; - RDI_U64 voff_count; -}; - -//- rjf: vmap baking data structure - -typedef struct RDIM_VMap RDIM_VMap; -struct RDIM_VMap -{ - RDI_VMapEntry *vmap; // [count + 1] - RDI_U32 count; -}; - -typedef struct RDIM_VMapMarker RDIM_VMapMarker; -struct RDIM_VMapMarker -{ - RDI_U32 idx; - RDI_U32 begin_range; -}; - -typedef struct RDIM_VMapRangeTracker RDIM_VMapRangeTracker; -struct RDIM_VMapRangeTracker -{ - RDIM_VMapRangeTracker *next; - RDI_U32 idx; -}; - -//- rjf: type data baking types - -typedef struct RDIM_TypeData RDIM_TypeData; -struct RDIM_TypeData -{ - RDI_TypeNode *type_nodes; - RDI_U32 type_node_count; - - RDI_UDT *udts; - RDI_U32 udt_count; - - RDI_Member *members; - RDI_U32 member_count; - - RDI_EnumMember *enum_members; - RDI_U32 enum_member_count; -}; - -//- rjf: symbol data baking types - -typedef struct RDIM_SymbolData RDIM_SymbolData; -struct RDIM_SymbolData -{ - RDI_GlobalVariable *global_variables; - RDI_U32 global_variable_count; - - RDIM_VMap *global_vmap; - - RDI_ThreadVariable *thread_variables; - RDI_U32 thread_variable_count; - - RDI_Procedure *procedures; - RDI_U32 procedure_count; - - RDI_Scope *scopes; - RDI_U32 scope_count; - - RDI_U64 *scope_voffs; - RDI_U32 scope_voff_count; - - RDIM_VMap *scope_vmap; - - RDI_Local *locals; - RDI_U32 local_count; - - RDI_LocationBlock *location_blocks; - RDI_U32 location_block_count; - - void *location_data; - RDI_U32 location_data_size; -}; - -//- rjf: name map baking types - -typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; -struct RDIM_NameMapSemiNode -{ - RDIM_NameMapSemiNode *next; - RDIM_NameMapNode *node; -}; - -typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; -struct RDIM_NameMapSemiBucket -{ - RDIM_NameMapSemiNode *first; - RDIM_NameMapSemiNode *last; - RDI_U64 count; -}; - -typedef struct RDIM_NameMapBaked RDIM_NameMapBaked; -struct RDIM_NameMapBaked -{ - RDI_NameMapBucket *buckets; - RDI_NameMapNode *nodes; - RDI_U32 bucket_count; - RDI_U32 node_count; -}; - -//- rjf: bundle baking context type - -typedef struct RDIM_BakeParams RDIM_BakeParams; -struct RDIM_BakeParams -{ - RDI_U64 strings_bucket_count; - RDI_U64 idx_runs_bucket_count; -}; - -typedef struct RDIM_BakeCtx RDIM_BakeCtx; -struct RDIM_BakeCtx -{ - RDIM_Arena *arena; - RDIM_Strings strs; - RDIM_IdxRuns idxs; - RDIM_PathTree *tree; -}; -#endif - //////////////////////////////// //~ rjf: Basic Helpers @@ -1431,150 +1085,4 @@ RDI_PROC RDIM_VMap rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *ma //- rjf: main baking entry point RDI_PROC RDIM_String8List rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params); - -#if 0 -//////////////////////////////// -//~ rjf: Loose Debug Info Construction (Anything -> Loose) Functions - -//- rjf: u64 -> ptr map -RDI_PROC void rdim_u64toptr_map_init(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 bucket_count); -RDI_PROC void rdim_u64toptr_map_lookup(RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup_out); -RDI_PROC void rdim_u64toptr_map_insert(RDIM_Arena *arena, RDIM_U64ToPtrMap *map, RDI_U64 key, RDI_U64 hash, RDIM_U64ToPtrLookup *lookup, void *ptr); - -//- rjf: string8 -> ptr map -RDI_PROC void rdim_str8toptr_map_init(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDI_U64 bucket_count); -RDI_PROC void*rdim_str8toptr_map_lookup(RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash); -RDI_PROC void rdim_str8toptr_map_insert(RDIM_Arena *arena, RDIM_Str8ToPtrMap *map, RDIM_String8 key, RDI_U64 hash, void *ptr); - -//- rjf: root creation -RDI_PROC RDIM_Root* rdim_root_alloc(RDIM_RootParams *params); -RDI_PROC void rdim_root_release(RDIM_Root *root); - -//- rjf: error accumulation -RDI_PROC void rdim_push_msg(RDIM_Root *root, RDIM_String8 string); -RDI_PROC void rdim_push_msgf(RDIM_Root *root, char *fmt, ...); -RDI_PROC RDIM_Msg* rdim_first_msg_from_root(RDIM_Root *root); - -//- rjf: type info lookups/reservations -RDI_PROC RDIM_Type* rdim_type_from_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash); -RDI_PROC RDIM_Reservation* rdim_type_reserve_id(RDIM_Root *root, RDI_U64 type_user_id, RDI_U64 type_user_id_hash); -RDI_PROC void rdim_type_fill_id(RDIM_Root *root, RDIM_Reservation *res, RDIM_Type *type); - -//- rjf: nil/singleton types -RDI_PROC RDI_S32 rdim_type_is_unhandled_nil(RDIM_Root *root, RDIM_Type *type); -RDI_PROC RDIM_Type* rdim_type_handled_nil(RDIM_Root *root); -RDI_PROC RDIM_Type* rdim_type_nil(RDIM_Root *root); -RDI_PROC RDIM_Type* rdim_type_variadic(RDIM_Root *root); - -//- rjf: base type info constructors -RDI_PROC RDIM_Type* rdim_type_new(RDIM_Root *root); -RDI_PROC RDIM_TypeUDT* rdim_type_udt_from_any_type(RDIM_Root *root, RDIM_Type *type); -RDI_PROC RDIM_TypeUDT* rdim_type_udt_from_record_type(RDIM_Root *root, RDIM_Type *type); - -//- rjf: basic/operator type construction helpers -RDI_PROC RDIM_Type* rdim_type_basic(RDIM_Root *root, RDI_TypeKind type_kind, RDIM_String8 name); -RDI_PROC RDIM_Type* rdim_type_modifier(RDIM_Root *root, RDIM_Type *direct_type, RDI_TypeModifierFlags flags); -RDI_PROC RDIM_Type* rdim_type_bitfield(RDIM_Root *root, RDIM_Type *direct_type, RDI_U32 bit_off, RDI_U32 bit_count); -RDI_PROC RDIM_Type* rdim_type_pointer(RDIM_Root *root, RDIM_Type *direct_type, RDI_TypeKind ptr_type_kind); -RDI_PROC RDIM_Type* rdim_type_array(RDIM_Root *root, RDIM_Type *direct_type, RDI_U64 count); -RDI_PROC RDIM_Type* rdim_type_proc(RDIM_Root *root, RDIM_Type *return_type, struct RDIM_TypeList *params); -RDI_PROC RDIM_Type* rdim_type_method(RDIM_Root *root, RDIM_Type *this_type, RDIM_Type *return_type, struct RDIM_TypeList *params); - -//- rjf: udt type constructors -RDI_PROC RDIM_Type* rdim_type_udt(RDIM_Root *root, RDI_TypeKind record_type_kind, RDIM_String8 name, RDI_U64 size); -RDI_PROC RDIM_Type* rdim_type_enum(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name); -RDI_PROC RDIM_Type* rdim_type_alias(RDIM_Root *root, RDIM_Type *direct_type, RDIM_String8 name); -RDI_PROC RDIM_Type* rdim_type_incomplete(RDIM_Root *root, RDI_TypeKind type_kind, RDIM_String8 name); - -//- rjf: type member building -RDI_PROC void rdim_type_add_member_data_field(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type, RDI_U32 off); -RDI_PROC void rdim_type_add_member_static_data(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); -RDI_PROC void rdim_type_add_member_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); -RDI_PROC void rdim_type_add_member_static_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); -RDI_PROC void rdim_type_add_member_virtual_method(RDIM_Root *root, RDIM_Type *record_type, RDIM_String8 name, RDIM_Type *mem_type); -RDI_PROC void rdim_type_add_member_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RDI_U32 off); -RDI_PROC void rdim_type_add_member_virtual_base(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *base_type, RDI_U32 vptr_off, RDI_U32 vtable_off); -RDI_PROC void rdim_type_add_member_nested_type(RDIM_Root *root, RDIM_Type *record_type, RDIM_Type *nested_type); -RDI_PROC void rdim_type_add_enum_val(RDIM_Root *root, RDIM_Type *enum_type, RDIM_String8 name, RDI_U64 val); - -//- rjf: type source coordinate specifications -RDI_PROC void rdim_type_set_source_coordinates(RDIM_Root *root, RDIM_Type *defined_type, RDIM_String8 source_path, RDI_U32 line, RDI_U32 col); - -//- rjf: symbol info building -RDI_PROC RDIM_Symbol* rdim_symbol_handle_from_user_id(RDIM_Root *root, RDI_U64 symbol_user_id, RDI_U64 symbol_user_id_hash); -RDI_PROC void rdim_symbol_set_info(RDIM_Root *root, RDIM_Symbol *symbol, RDIM_SymbolInfo *info); - -//- rjf: scope info building -RDI_PROC RDIM_Scope *rdim_scope_handle_from_user_id(RDIM_Root *root, RDI_U64 scope_user_id, RDI_U64 scope_user_id_hash); -RDI_PROC void rdim_scope_set_parent(RDIM_Root *root, RDIM_Scope *scope, RDIM_Scope *parent); -RDI_PROC void rdim_scope_add_voff_range(RDIM_Root *root, RDIM_Scope *scope, RDI_U64 voff_first, RDI_U64 voff_opl); -RDI_PROC void rdim_scope_recursive_set_symbol(RDIM_Scope *scope, RDIM_Symbol *symbol); - -//- rjf: local info building -RDI_PROC RDIM_Local* rdim_local_handle_from_user_id(RDIM_Root *root, RDI_U64 local_user_id, RDI_U64 local_user_id_hash); -RDI_PROC void rdim_local_set_basic_info(RDIM_Root *root, RDIM_Local *local, RDIM_LocalInfo *info); -RDI_PROC RDIM_LocationSet* rdim_location_set_from_local(RDIM_Root *root, RDIM_Local *local); - -//- rjf: location info building -RDI_PROC void rdim_location_set_add_case(RDIM_Root *root, RDIM_LocationSet *locset, RDI_U64 voff_first, RDI_U64 voff_opl, RDIM_Location *location); -RDI_PROC RDIM_Location* rdim_location_addr_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode); -RDI_PROC RDIM_Location* rdim_location_val_bytecode_stream(RDIM_Root *root, struct RDIM_EvalBytecode *bytecode); -RDI_PROC RDIM_Location* rdim_location_addr_reg_plus_u16(RDIM_Root *root, RDI_U8 reg_code, RDI_U16 offset); -RDI_PROC RDIM_Location* rdim_location_addr_addr_reg_plus_u16(RDIM_Root *root, RDI_U8 reg_code, RDI_U16 offset); -RDI_PROC RDIM_Location* rdim_location_val_reg(RDIM_Root *root, RDI_U8 reg_code); - -//- rjf: name map building -RDI_PROC RDIM_NameMap* rdim_name_map_for_kind(RDIM_Root *root, RDI_NameMapKind kind); -RDI_PROC void rdim_name_map_add_pair(RDIM_Root *root, RDIM_NameMap *map, RDIM_String8 name, RDI_U32 idx); - -//////////////////////////////// -//~ rjf: Debug Info Baking (Loose -> Tight) Functions - -//- rjf: bake context construction -RDI_PROC RDIM_BakeCtx* rdim_bake_ctx_begin(RDIM_BakeParams *params); -RDI_PROC void rdim_bake_ctx_release(RDIM_BakeCtx *bake_ctx); - -//- rjf: string baking -RDI_PROC RDI_U32 rdim_string(RDIM_BakeCtx *bctx, RDIM_String8 str); - -//- rjf: idx run baking -RDI_PROC RDI_U64 rdim_idx_run_hash(RDI_U32 *idx_run, RDI_U32 count); -RDI_PROC RDI_U32 rdim_idx_run(RDIM_BakeCtx *bctx, RDI_U32 *idx_run, RDI_U32 count); - -//- rjf: data section baking -RDI_PROC RDI_U32 rdim_dsection(RDIM_Arena *arena, RDIM_DSections *dss, void *data, RDI_U64 size, RDI_DataSectionTag tag); - -//- rjf: paths baking -RDI_PROC RDIM_String8 rdim_normal_string_from_path_node(RDIM_Arena *arena, RDIM_PathNode *node); -RDI_PROC RDIM_BakePathNode *rdim_bake_path_tree_push_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree); -RDI_PROC RDIM_BakePathNode *rdim_paths_sub_path(RDIM_BakeCtx *bctx, RDIM_PathNode *dir, RDIM_String8 sub_dir); -RDI_PROC RDIM_BakePathNode *rdim_paths_node_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); -RDI_PROC RDI_U32 rdim_paths_idx_from_path(RDIM_BakeCtx *bctx, RDIM_String8 path); -RDI_PROC RDIM_BakeSrcNode * rdim_paths_new_src_node(RDIM_BakeCtx *bctx); -RDI_PROC RDIM_BakeSrcNode * rdim_paths_src_node_from_path_node(RDIM_BakeCtx *bctx, RDIM_PathNode *path_node); - -//- rjf: per-unit line info baking -RDI_PROC RDIM_UnitLinesCombined* rdim_unit_combine_lines(RDIM_Arena *arena, RDIM_BakeCtx *bctx, RDIM_LineSequenceNode *first_seq); - -//- rjf: per-src line info baking -RDI_PROC RDIM_SrcLinesCombined* rdim_source_combine_lines(RDIM_Arena *arena, RDIM_LineMapFragment *first); - -//- rjf: vmap baking -RDI_PROC RDIM_VMap* rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count); -RDI_PROC RDIM_VMap* rdim_vmap_from_unit_ranges(RDIM_Arena *arena, RDIM_UnitVMapRange *first, RDI_U64 count); - -//- rjf: type info baking -RDI_PROC RDI_U32* rdim_idx_run_from_types(RDIM_Arena *arena, RDIM_Type **types, RDI_U32 count); -RDI_PROC RDIM_TypeData* rdim_type_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx); - -//- rjf: symbol data baking -RDI_PROC RDIM_SymbolData* rdim_symbol_data_combine(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx); - -//- rjf: name map baking -RDI_PROC RDIM_NameMapBaked* rdim_name_map_bake(RDIM_Arena *arena, RDIM_Root *root, RDIM_BakeCtx *bctx, RDIM_NameMap *map); - -//- rjf: top-level baking entry point -RDI_PROC void rdim_bake_file(RDIM_Arena *arena, RDIM_Root *root, RDIM_String8List *out); -#endif - #endif // RDI_MAKE_H diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index e92700c8..68503c7c 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -539,2905 +539,6 @@ p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDI } } -#if 0 - -//////////////////////////////// -//~ rjf: Conversion Implementation Helpers - -//- rjf: pdb conversion context creation - -internal P2R_Ctx * -p2r_ctx_alloc(P2R_CtxParams *params, RDIM_Root *out_root) -{ - Arena *arena = arena_alloc(); - P2R_Ctx *pdb_ctx = push_array(arena, P2R_Ctx, 1); - pdb_ctx->arena = arena; - pdb_ctx->arch = params->arch; - pdb_ctx->addr_size = rdi_addr_size_from_arch(pdb_ctx->arch); - pdb_ctx->hash = params->tpi_hash; - pdb_ctx->leaf = params->tpi_leaf; - pdb_ctx->sections = params->sections->sections; - pdb_ctx->section_count = params->sections->count; - pdb_ctx->root = out_root; -#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(4096)) - pdb_ctx->fwd_map.buckets_count = BKTCOUNT(params->fwd_map_bucket_count); - pdb_ctx->frame_proc_map.buckets_count = BKTCOUNT(params->frame_proc_map_bucket_count); - pdb_ctx->known_globals.buckets_count = BKTCOUNT(params->known_global_map_bucket_count); - pdb_ctx->link_names.buckets_count = BKTCOUNT(params->link_name_map_bucket_count); -#undef BKTCOUNT - pdb_ctx->fwd_map.buckets = push_array(pdb_ctx->arena, P2R_FwdNode *, pdb_ctx->fwd_map.buckets_count); - pdb_ctx->frame_proc_map.buckets = push_array(pdb_ctx->arena, P2R_FrameProcNode *, pdb_ctx->frame_proc_map.buckets_count); - pdb_ctx->known_globals.buckets = push_array(pdb_ctx->arena, P2R_KnownGlobalNode *, pdb_ctx->known_globals.buckets_count); - pdb_ctx->link_names.buckets = push_array(pdb_ctx->arena, P2R_LinkNameNode *, pdb_ctx->link_names.buckets_count); - return pdb_ctx; -} - -//- rjf: pdb types and symbols - -internal void -p2r_types_and_symbols(P2R_Ctx *pdb_ctx, P2R_TypesSymbolsParams *params) -{ - ProfBeginFunction(); - - // convert types - p2r_type_cons_main_passes(pdb_ctx); - if(params->sym != 0) - { - p2r_gather_link_names(pdb_ctx, params->sym); - p2r_symbol_cons(pdb_ctx, params->sym, 0); - } - U64 unit_count = params->unit_count; - for(U64 i = 0; i < unit_count; i += 1) - { - CV_SymParsed *unit_sym = params->sym_for_unit[i]; - p2r_symbol_cons(pdb_ctx, unit_sym, 1 + i); - } - - ProfEnd(); -} - -//- rjf: decoding helpers - -internal U32 -p2r_u32_from_numeric(P2R_Ctx *ctx, CV_NumericParsed *num) -{ - U64 n_u64 = cv_u64_from_numeric(num); - U32 n_u32 = (U32)n_u64; - if(n_u64 > 0xFFFFFFFF) - { - rdim_push_msgf(ctx->root, "constant too large"); - n_u32 = 0; - } - return(n_u32); -} - -internal COFF_SectionHeader * -p2r_sec_header_from_sec_num(P2R_Ctx *ctx, U32 sec_num) -{ - COFF_SectionHeader *result = 0; - if(0 < sec_num && sec_num <= ctx->section_count) - { - result = ctx->sections + sec_num - 1; - } - return(result); -} - -//- rjf: type info - -internal void -p2r_type_cons_main_passes(P2R_Ctx *ctx) -{ - ProfBeginFunction(); - CV_TypeId itype_first = ctx->leaf->itype_first; - CV_TypeId itype_opl = ctx->leaf->itype_opl; - - // setup variadic itype -> node - ProfScope("setup variadic itype -> node") - { - RDIM_Type *variadic_type = rdim_type_variadic(ctx->root); - RDIM_Reservation *res = rdim_type_reserve_id(ctx->root, CV_TypeId_Variadic, CV_TypeId_Variadic); - rdim_type_fill_id(ctx->root, res, variadic_type); - } - - // resolve forward references - ProfScope("resolve forward references") - { - for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) - { - p2r_type_resolve_fwd(ctx, itype); - } - } - - // construct type info - ProfScope("construct type info") - { - for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) - { - p2r_type_resolve_itype(ctx, itype); - } - } - - // construct member info - ProfScope("construct member info") - { - for(P2R_TypeRev *rev = ctx->member_revisit_first; - rev != 0; - rev = rev->next) - { - p2r_type_equip_members(ctx, rev->owner_type, rev->field_itype); - } - } - - // construct enum info - ProfScope("construct enum info") - { - for(P2R_TypeRev *rev = ctx->enum_revisit_first; - rev != 0; - rev = rev->next) - { - p2r_type_equip_enumerates(ctx, rev->owner_type, rev->field_itype); - } - } - - // TODO(allen): equip udts with location information - ProfEnd(); -} - -internal CV_TypeId -p2r_type_resolve_fwd(P2R_Ctx *ctx, CV_TypeId itype) -{ - ProfBeginFunction(); - Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); - - CV_TypeId result = 0; - - CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[itype - ctx->leaf->itype_first]; - String8 data = ctx->leaf->data; - if(range->off + range->hdr.size <= data.size) - { - U8 *first = data.str + range->off + 2; - U64 cap = range->hdr.size - 2; - - // figure out if this itype resolves to another - switch (range->hdr.kind) - { - default:break; - - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafStruct) <= cap) - { - CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; - - // size - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - - // name - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - - // unique name - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, first + cap); - - if(lf_struct->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = ((lf_struct->props & CV_TypeProp_Scoped) != 0) && - ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0); - if(do_unique_name_lookup) - { - result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, unique_name, 1); - } - else - { - result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); - } - } - } - }break; - - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafStruct2) <= cap) - { - CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first; - - // size - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - - // name - U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - - // unique name - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, first + cap); - - if(lf_struct->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = ((lf_struct->props & CV_TypeProp_Scoped) != 0) && - ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0); - if(do_unique_name_lookup) - { - result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, unique_name, 1); - } - else - { - result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); - } - } - } - }break; - - case CV_LeafKind_UNION: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafUnion) <= cap) - { - CV_LeafUnion *lf_union = (CV_LeafUnion*)first; - - // size - U8 *numeric_ptr = (U8*)(lf_union + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - - // name - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - - // unique name - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, first + cap); - - if(lf_union->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = ((lf_union->props & CV_TypeProp_Scoped) != 0) && - ((lf_union->props & CV_TypeProp_HasUniqueName) != 0); - if(do_unique_name_lookup) - { - result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, unique_name, 1); - } - else - { - result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); - } - } - } - }break; - - case CV_LeafKind_ENUM: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafEnum) <= cap) - { - CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; - - // name - U8 *name_ptr = (U8*)(lf_enum + 1); - String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - - // unique name - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, first + cap); - - if(lf_enum->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = ((lf_enum->props & CV_TypeProp_Scoped) != 0) && - ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0); - if(do_unique_name_lookup) - { - result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, unique_name, 1); - } - else - { - result = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); - } - } - } - }break; - } - } - - // save in map - if(result != 0) - { - p2r_type_fwd_map_set(ctx->arena, &ctx->fwd_map, itype, result); - } - - ProfEnd(); - return(result); -} - -internal RDIM_Type* -p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype) -{ - B32 is_basic = (itype < 0x1000); - - // convert fwd references to real types - if(!is_basic) - { - CV_TypeId resolved_itype = p2r_type_fwd_map_get(&ctx->fwd_map, itype); - if(resolved_itype != 0) - { - itype = resolved_itype; - } - } - - // type handle from id - RDIM_Type *result = rdim_type_from_id(ctx->root, itype, itype); - - // basic type - if(result == 0 && is_basic) - { - result = p2r_type_cons_basic(ctx, itype); - } - - // leaf decode - if(result == 0 && (ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl)) - { - result = p2r_type_cons_leaf_record(ctx, itype); - } - - // never return null, return "nil" instead - if(result == 0) - { - result = rdim_type_nil(ctx->root); - } - - return(result); -} - -internal void -p2r_type_equip_members(P2R_Ctx *ctx, RDIM_Type *owner_type, CV_TypeId field_itype) -{ - Temp scratch = scratch_begin(0, 0); - - String8 data = ctx->leaf->data; - - // field stack - // TODO(allen): add notes about field tasks - struct FieldTask{ - struct FieldTask *next; - CV_TypeId itype; - }; - struct FieldTask *handled = 0; - struct FieldTask *todo = 0; - { - struct FieldTask *task = push_array(scratch.arena, struct FieldTask, 1); - SLLStackPush(todo, task); - task->itype = field_itype; - } - - for(;;) - { - // exit condition - if(todo == 0) - { - break; - } - - // determine itype - CV_TypeId field_itype = todo->itype; - { - struct FieldTask *task = todo; - SLLStackPop(todo); - SLLStackPush(handled, task); - } - - // get leaf range - // TODO(allen): error if this itype is bad - U8 *first = 0; - U64 cap = 0; - if(ctx->leaf->itype_first <= field_itype && field_itype < ctx->leaf->itype_opl) - { - CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[field_itype - ctx->leaf->itype_first]; - // check valid arglist - if(range->hdr.kind == CV_LeafKind_FIELDLIST && - range->off + range->hdr.size <= data.size) - { - first = data.str + range->off + 2; - cap = range->hdr.size - 2; - } - } - - U64 cursor = 0; - for(;cursor + sizeof(CV_LeafKind) <= cap;) - { - CV_LeafKind field_kind = *(CV_LeafKind*)(first + cursor); - - U64 list_item_off = cursor + 2; - // if we hit an error or forget to set next cursor for a case - // default to exiting the loop - U64 list_item_opl_off = cap; - - switch (field_kind) - { - case CV_LeafKind_INDEX: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafIndex) <= cap) - { - // compute whole layout - CV_LeafIndex *index = (CV_LeafIndex*)(first + list_item_off); - - list_item_opl_off = list_item_off + sizeof(*index); - - // create new todo task - CV_TypeId new_itype = index->itype; - B32 is_new = 1; - for(struct FieldTask *task = handled; - task != 0; - task = task->next) - { - if(task->itype == new_itype) - { - is_new = 0; - break; - } - } - if(is_new) - { - struct FieldTask *task = push_array(scratch.arena, struct FieldTask, 1); - SLLStackPush(todo, task); - task->itype = new_itype; - } - } - }break; - - case CV_LeafKind_MEMBER: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafMember) <= cap) - { - // compute whole layout - CV_LeafMember *member = (CV_LeafMember*)(first + list_item_off); - - U64 offset_off = list_item_off + sizeof(*member); - CV_NumericParsed offset = cv_numeric_from_data_range(first + offset_off, first + cap); - - U64 name_off = offset_off + offset.encoded_size; - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // emit member - RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, member->itype); - U32 offset_u32 = p2r_u32_from_numeric(ctx, &offset); - rdim_type_add_member_data_field(ctx->root, owner_type, name, mem_type, offset_u32); - } - }break; - - case CV_LeafKind_STMEMBER: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafStMember) <= cap) - { - // compute whole layout - CV_LeafStMember *stmember = (CV_LeafStMember*)(first + list_item_off); - - U64 name_off = list_item_off + sizeof(*stmember); - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // TODO(allen): handle attribs - - // emit member - RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, stmember->itype); - rdim_type_add_member_static_data(ctx->root, owner_type, name, mem_type); - } - }break; - - case CV_LeafKind_METHOD: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafMethod) <= cap) - { - // compute whole layout - CV_LeafMethod *method = (CV_LeafMethod*)(first + list_item_off); - - U64 name_off = list_item_off + sizeof(*method); - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // extract method list - U8 *first = 0; - U64 cap = 0; - - // TODO(allen): error if bad itype - CV_TypeId methodlist_itype = method->list_itype; - if(ctx->leaf->itype_first <= methodlist_itype && - methodlist_itype < ctx->leaf->itype_opl) - { - CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[methodlist_itype - ctx->leaf->itype_first]; - - // check valid methodlist - if(range->hdr.kind == CV_LeafKind_METHODLIST && - range->off + range->hdr.size <= data.size) - { - first = data.str + range->off + 2; - cap = range->hdr.size - 2; - } - } - - // emit loop - U64 cursor = 0; - for(;cursor + sizeof(CV_LeafMethodListMember) <= cap;) - { - CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)(first + cursor); - - CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); - - // TODO(allen): PROBLEM - // We only get offsets for virtual functions (the "vbaseoff") from - // "Intro" and "PureIntro". In C++ inheritance, when we have a chain - // of inheritance (let's just talk single inheritance for now) the - // first class in the chain that introduces a new virtual function - // has this "Intro" method. If a later class in the chain redefines - // the virtual function it only has a "Virtual" method which does - // not update the offset. There is a "Virtual" and "PureVirtual" - // variant of "Virtual". The "Pure" in either case means there - // is no concrete procedure. When there is no "Pure" the method - // should have a corresponding procedure symbol id. - // - // The issue is we will want to mark all of our virtual methods as - // virtual and give them an offset, but that means we have to do - // some extra figuring to propogate offsets from "Intro" methods - // to "Virtual" methods in inheritance trees. That is - IF we want - // to start preserving the offsets of virtuals. There is room in - // the method struct to make this work, but for now I've just - // decided to drop this information. It is not urgently useful to - // us and greatly complicates matters. - - // extract vbaseoff - U64 next_cursor = cursor + sizeof(*method); - U32 vbaseoff = 0; - if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) - { - if(cursor + sizeof(*method) + 4 <= cap) - { - vbaseoff = *(U32*)(method + 1); - } - next_cursor += 4; - } - - // update cursor - cursor = next_cursor; - - // TODO(allen): handle attribs - - // emit - RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, method->itype); - - switch (prop) - { - default: - { - rdim_type_add_member_method(ctx->root, owner_type, name, mem_type); - }break; - - case CV_MethodProp_Static: - { - rdim_type_add_member_static_method(ctx->root, owner_type, name, mem_type); - }break; - - case CV_MethodProp_Virtual: - case CV_MethodProp_PureVirtual: - case CV_MethodProp_Intro: - case CV_MethodProp_PureIntro: - { - rdim_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); - }break; - } - } - - } - }break; - - case CV_LeafKind_ONEMETHOD: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafOneMethod) <= cap) - { - // compute whole layout - CV_LeafOneMethod *one_method = (CV_LeafOneMethod*)(first + list_item_off); - - CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(one_method->attribs); - - U64 vbaseoff_off = list_item_off + sizeof(*one_method); - U64 vbaseoff_opl_off = vbaseoff_off; - U32 vbaseoff = 0; - if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) - { - vbaseoff = *(U32*)(first + vbaseoff_off); - vbaseoff_opl_off += sizeof(vbaseoff); - } - - U64 name_off = vbaseoff_opl_off; - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // TODO(allen): handle attribs - - // emit - RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, one_method->itype); - - switch (prop) - { - default: - { - rdim_type_add_member_method(ctx->root, owner_type, name, mem_type); - }break; - - case CV_MethodProp_Static: - { - rdim_type_add_member_static_method(ctx->root, owner_type, name, mem_type); - }break; - - case CV_MethodProp_Virtual: - case CV_MethodProp_PureVirtual: - case CV_MethodProp_Intro: - case CV_MethodProp_PureIntro: - { - rdim_type_add_member_virtual_method(ctx->root, owner_type, name, mem_type); - }break; - } - } - }break; - - case CV_LeafKind_NESTTYPE: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafNestType) <= cap) - { - // compute whole layout - CV_LeafNestType *nest_type = (CV_LeafNestType*)(first + list_item_off); - - U64 name_off = list_item_off + sizeof(*nest_type); - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // emit member - RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, nest_type->itype); - rdim_type_add_member_nested_type(ctx->root, owner_type, mem_type); - } - }break; - - case CV_LeafKind_NESTTYPEEX: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafNestTypeEx) <= cap) - { - // compute whole layout - CV_LeafNestTypeEx *nest_type = (CV_LeafNestTypeEx*)(first + list_item_off); - - U64 name_off = list_item_off + sizeof(*nest_type); - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // TODO(allen): handle attribs - - // emit member - RDIM_Type *mem_type = p2r_type_resolve_itype(ctx, nest_type->itype); - rdim_type_add_member_nested_type(ctx->root, owner_type, mem_type); - } - }break; - - case CV_LeafKind_BCLASS: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafBClass) <= cap) - { - // compute whole layout - CV_LeafBClass *bclass = (CV_LeafBClass*)(first + list_item_off); - - U64 offset_off = list_item_off + sizeof(*bclass); - CV_NumericParsed offset = cv_numeric_from_data_range(first + offset_off, first + cap); - - list_item_opl_off = offset_off + offset.encoded_size; - - // TODO(allen): handle attribs - - // emit member - RDIM_Type *base_type = p2r_type_resolve_itype(ctx, bclass->itype); - U32 offset_u32 = p2r_u32_from_numeric(ctx, &offset); - rdim_type_add_member_base(ctx->root, owner_type, base_type, offset_u32); - } - }break; - - case CV_LeafKind_VBCLASS: - case CV_LeafKind_IVBCLASS: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafVBClass) <= cap) - { - // compute whole layout - CV_LeafVBClass *vbclass = (CV_LeafVBClass*)(first + list_item_off); - - U64 num1_off = list_item_off + sizeof(*vbclass); - CV_NumericParsed num1 = cv_numeric_from_data_range(first + num1_off, first + cap); - - U64 num2_off = num1_off + num1.encoded_size; - CV_NumericParsed num2 = cv_numeric_from_data_range(first + num2_off, first + cap); - - list_item_opl_off = num2_off + num2.encoded_size; - - // TODO(allen): handle attribs - - // emit member - RDIM_Type *base_type = p2r_type_resolve_itype(ctx, vbclass->itype); - U32 vbptr_offset_u32 = p2r_u32_from_numeric(ctx, &num1); - U32 vtable_offset_u32 = p2r_u32_from_numeric(ctx, &num2); - rdim_type_add_member_virtual_base(ctx->root, owner_type, base_type, - vbptr_offset_u32, vtable_offset_u32); - } - }break; - - // discard cases - we don't currently do anything with these - case CV_LeafKind_VFUNCTAB: - { - // TODO(rjf): error if bad range - if(list_item_off + sizeof(CV_LeafVFuncTab) <= cap) - { - list_item_opl_off = list_item_off + sizeof(CV_LeafVFuncTab); - } - }break; - - // unhandled or invalid cases - default: - { - String8 kind_str = cv_string_from_leaf_kind(field_kind); - rdim_push_msgf(ctx->root, "unhandled/invalid case: equip_members -> %.*s", - str8_varg(kind_str)); - }break; - } - - // update cursor - U64 next_cursor = AlignPow2(list_item_opl_off, 4); - cursor = next_cursor; - } - } - - scratch_end(scratch); -} - -internal void -p2r_type_equip_enumerates(P2R_Ctx *ctx, RDIM_Type *owner_type, CV_TypeId field_itype) -{ - Temp scratch = scratch_begin(0, 0); - - String8 data = ctx->leaf->data; - - // field stack - // TODO(allen): add notes about field tasks - struct FieldTask{ - struct FieldTask *next; - CV_TypeId itype; - }; - struct FieldTask *handled = 0; - struct FieldTask *todo = 0; - { - struct FieldTask *task = push_array(scratch.arena, struct FieldTask, 1); - SLLStackPush(todo, task); - task->itype = field_itype; - } - - for(;;) - { - // exit condition - if(todo == 0) - { - break; - } - - // determine itype - CV_TypeId field_itype = todo->itype; - { - struct FieldTask *task = todo; - SLLStackPop(todo); - SLLStackPush(handled, task); - } - - // get leaf range - // TODO(allen): error if this itype is bad - U8 *first = 0; - U64 cap = 0; - if(ctx->leaf->itype_first <= field_itype && field_itype < ctx->leaf->itype_opl) - { - CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[field_itype - ctx->leaf->itype_first]; - // check valid arglist - if(range->hdr.kind == CV_LeafKind_FIELDLIST && - range->off + range->hdr.size <= data.size) - { - first = data.str + range->off + 2; - cap = range->hdr.size - 2; - } - } - - U64 cursor = 0; - for(;cursor + sizeof(CV_LeafKind) <= cap;) - { - CV_LeafKind field_kind = *(CV_LeafKind*)(first + cursor); - - U64 list_item_off = cursor + 2; - // if we hit an error or forget to set next cursor for a case - // default to exiting the loop - U64 list_item_opl_off = cap; - - switch (field_kind) - { - case CV_LeafKind_INDEX: - { - // TODO(allen): error if bad range - if(list_item_off + sizeof(CV_LeafIndex) <= cap) - { - // compute whole layout - CV_LeafIndex *index = (CV_LeafIndex*)(first + list_item_off); - - list_item_opl_off = list_item_off + sizeof(*index); - - // create new todo task - CV_TypeId new_itype = index->itype; - B32 is_new = 1; - for(struct FieldTask *task = handled; - task != 0; - task = task->next) - { - if(task->itype == new_itype) - { - is_new = 0; - break; - } - } - if(is_new) - { - struct FieldTask *task = push_array(scratch.arena, struct FieldTask, 1); - SLLStackPush(todo, task); - task->itype = new_itype; - } - } - }break; - - case CV_LeafKind_ENUMERATE: - { - // compute whole layout - CV_LeafEnumerate *enumerate = (CV_LeafEnumerate*)(first + list_item_off); - - U64 val_off = list_item_off + sizeof(*enumerate); - CV_NumericParsed val = cv_numeric_from_data_range(first + val_off, first + cap); - - U64 name_off = val_off + val.encoded_size; - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // TODO(allen): handle attribs - - // emit enum val - U64 val_u64 = cv_u64_from_numeric(&val); - rdim_type_add_enum_val(ctx->root, owner_type, name, val_u64); - }break; - - // unhandled or invalid cases - default: - { - String8 kind_str = cv_string_from_leaf_kind(field_kind); - rdim_push_msgf(ctx->root, "unhandled/invalid case: equip_enumerates -> %.*s", - str8_varg(kind_str)); - }break; - } - - // update cursor - U64 next_cursor = AlignPow2(list_item_opl_off, 4); - cursor = next_cursor; - } - } - - scratch_end(scratch); -} - -internal RDIM_Type* -p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype) -{ - Assert(itype < 0x1000); - - CV_BasicPointerKind basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); - CV_BasicType basic_type_code = CV_BasicTypeFromTypeId(itype); - - RDIM_Reservation *basic_res = rdim_type_reserve_id(ctx->root, basic_type_code, basic_type_code); - - RDIM_Type *basic_type = 0; - switch (basic_type_code) - { - case CV_BasicType_VOID: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Void, str8_lit("void")); - }break; - - case CV_BasicType_HRESULT: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Handle, str8_lit("HRESULT")); - }break; - - case CV_BasicType_RCHAR: - case CV_BasicType_CHAR: - case CV_BasicType_CHAR8: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Char8, str8_lit("char")); - }break; - - case CV_BasicType_UCHAR: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_UChar8, str8_lit("UCHAR")); - }break; - - case CV_BasicType_WCHAR: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_UChar16, str8_lit("WCHAR")); - }break; - - case CV_BasicType_CHAR16: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Char16, str8_lit("CHAR16")); - }break; - - case CV_BasicType_CHAR32: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Char32, str8_lit("CHAR32")); - }break; - - case CV_BasicType_BOOL8: - case CV_BasicType_INT8: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S8, str8_lit("S8")); - }break; - - case CV_BasicType_BOOL16: - case CV_BasicType_INT16: - case CV_BasicType_SHORT: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S16, str8_lit("S16")); - }break; - - case CV_BasicType_BOOL32: - case CV_BasicType_INT32: - case CV_BasicType_LONG: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S32, str8_lit("S32")); - }break; - - case CV_BasicType_BOOL64: - case CV_BasicType_INT64: - case CV_BasicType_QUAD: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S64, str8_lit("S64")); - }break; - - case CV_BasicType_INT128: - case CV_BasicType_OCT: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_S128, str8_lit("S128")); - }break; - - case CV_BasicType_UINT8: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U8, str8_lit("U8")); - }break; - - case CV_BasicType_UINT16: - case CV_BasicType_USHORT: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U16, str8_lit("U16")); - }break; - - case CV_BasicType_UINT32: - case CV_BasicType_ULONG: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U32, str8_lit("U32")); - }break; - - case CV_BasicType_UINT64: - case CV_BasicType_UQUAD: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U64, str8_lit("U64")); - }break; - - case CV_BasicType_UINT128: - case CV_BasicType_UOCT: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_U128, str8_lit("U128")); - }break; - - case CV_BasicType_FLOAT16: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F16, str8_lit("F16")); - }break; - - case CV_BasicType_FLOAT32: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F32, str8_lit("F32")); - }break; - - case CV_BasicType_FLOAT32PP: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F32PP, str8_lit("F32PP")); - }break; - - case CV_BasicType_FLOAT48: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F48, str8_lit("F48")); - }break; - - case CV_BasicType_FLOAT64: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F64, str8_lit("F64")); - }break; - - case CV_BasicType_FLOAT80: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F80, str8_lit("F80")); - }break; - - case CV_BasicType_FLOAT128: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_F128, str8_lit("F128")); - }break; - - case CV_BasicType_COMPLEX32: - { - basic_type = - rdim_type_basic(ctx->root, RDI_TypeKind_ComplexF32, str8_lit("ComplexF32")); - }break; - - case CV_BasicType_COMPLEX64: - { - basic_type = - rdim_type_basic(ctx->root, RDI_TypeKind_ComplexF64, str8_lit("ComplexF64")); - }break; - - case CV_BasicType_COMPLEX80: - { - basic_type = - rdim_type_basic(ctx->root, RDI_TypeKind_ComplexF80, str8_lit("ComplexF80")); - }break; - - case CV_BasicType_COMPLEX128: - { - basic_type = - rdim_type_basic(ctx->root, RDI_TypeKind_ComplexF128, str8_lit("ComplexF128")); - }break; - - case CV_BasicType_PTR: - { - basic_type = rdim_type_basic(ctx->root, RDI_TypeKind_Handle, str8_lit("PTR")); - }break; - } - - // basic resolve - rdim_type_fill_id(ctx->root, basic_res, basic_type); - - // wrap in constructed type - RDIM_Type *constructed_type = 0; - if(basic_ptr_kind != 0 && basic_type != 0) - { - RDIM_Reservation *constructed_res = rdim_type_reserve_id(ctx->root, itype, itype); - - switch (basic_ptr_kind) - { - case CV_BasicPointerKind_16BIT: - case CV_BasicPointerKind_FAR_16BIT: - case CV_BasicPointerKind_HUGE_16BIT: - case CV_BasicPointerKind_32BIT: - case CV_BasicPointerKind_16_32BIT: - case CV_BasicPointerKind_64BIT: - { - constructed_type = rdim_type_pointer(ctx->root, basic_type, RDI_TypeKind_Ptr); - }break; - } - - // constructed resolve - rdim_type_fill_id(ctx->root, constructed_res, constructed_type); - } - - // select output - RDIM_Type *result = basic_type; - if(basic_ptr_kind != 0) - { - result = constructed_type; - } - - return(result); -} - -internal RDIM_Type* -p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype) -{ - Assert(ctx->leaf->itype_first <= itype && itype < ctx->leaf->itype_opl); - - RDIM_Reservation *res = rdim_type_reserve_id(ctx->root, itype, itype); - - CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[itype - ctx->leaf->itype_first]; - String8 data = ctx->leaf->data; - - RDIM_Type *result = 0; - if(range->off + range->hdr.size <= data.size) - { - U8 *first = data.str + range->off + 2; - U64 cap = range->hdr.size - 2; - - switch (range->hdr.kind) - { - case CV_LeafKind_MODIFIER: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafModifier) <= cap) - { - CV_LeafModifier *modifier = (CV_LeafModifier*)first; - - RDI_TypeModifierFlags flags = 0; - if(modifier->flags & CV_ModifierFlag_Const) - { - flags |= RDI_TypeModifierFlag_Const; - } - if(modifier->flags & CV_ModifierFlag_Volatile) - { - flags |= RDI_TypeModifierFlag_Volatile; - } - - RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, modifier->itype); - if(flags != 0) - { - result = rdim_type_modifier(ctx->root, direct_type, flags); - } - else - { - result = direct_type; - } - } - }break; - - case CV_LeafKind_POINTER: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafPointer) <= cap) - { - CV_LeafPointer *pointer = (CV_LeafPointer*)first; - - CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(pointer->attribs); - CV_PointerMode ptr_mode = CV_PointerAttribs_ExtractMode(pointer->attribs); - U32 ptr_size = CV_PointerAttribs_ExtractSize(pointer->attribs); - - // TODO(allen): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead - - // extract modifier flags - RDI_TypeModifierFlags modifier_flags = 0; - if(pointer->attribs & CV_PointerAttrib_Const) - { - modifier_flags |= RDI_TypeModifierFlag_Const; - } - if(pointer->attribs & CV_PointerAttrib_Volatile) - { - modifier_flags |= RDI_TypeModifierFlag_Volatile; - } - - // determine type kind - RDI_TypeKind type_kind = RDI_TypeKind_Ptr; - if(pointer->attribs & CV_PointerAttrib_LRef) - { - type_kind = RDI_TypeKind_LRef; - } - else if(pointer->attribs & CV_PointerAttrib_RRef) - { - type_kind = RDI_TypeKind_RRef; - } - if(ptr_mode == CV_PointerMode_LRef) - { - type_kind = RDI_TypeKind_LRef; - } - else if(ptr_mode == CV_PointerMode_RRef) - { - type_kind = RDI_TypeKind_RRef; - } - - RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, pointer->itype); - RDIM_Type *ptr_type = rdim_type_pointer(ctx->root, direct_type, type_kind); - - result = ptr_type; - if(modifier_flags != 0) - { - result = rdim_type_modifier(ctx->root, ptr_type, modifier_flags); - } - } - }break; - - case CV_LeafKind_PROCEDURE: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafProcedure) <= cap) - { - CV_LeafProcedure *procedure = (CV_LeafProcedure*)first; - - Temp scratch = scratch_begin(0, 0); - - // TODO(allen): handle call_kind & attribs - - RDIM_Type *ret_type = p2r_type_resolve_and_check(ctx, procedure->ret_itype); - - RDIM_TypeList param_list = {0}; - p2r_type_resolve_arglist(scratch.arena, ¶m_list, ctx, procedure->arg_itype); - - result = rdim_type_proc(ctx->root, ret_type, ¶m_list); - - scratch_end(scratch); - } - }break; - - case CV_LeafKind_MFUNCTION: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafMFunction) <= cap) - { - CV_LeafMFunction *mfunction = (CV_LeafMFunction*)first; - - Temp scratch = scratch_begin(0, 0); - - // TODO(allen): handle call_kind & attribs - // TODO(allen): preserve "this_adjust" - - RDIM_Type *ret_type = p2r_type_resolve_and_check(ctx, mfunction->ret_itype); - - RDIM_TypeList param_list = {0}; - p2r_type_resolve_arglist(scratch.arena, ¶m_list, ctx, mfunction->arg_itype); - - RDIM_Type *this_type = 0; - if(mfunction->this_itype != 0) - { - this_type = p2r_type_resolve_and_check(ctx, mfunction->this_itype); - result = rdim_type_method(ctx->root, this_type, ret_type, ¶m_list); - } - else - { - result = rdim_type_proc(ctx->root, ret_type, ¶m_list); - } - - scratch_end(scratch); - } - }break; - - case CV_LeafKind_BITFIELD: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafBitField) <= cap) - { - CV_LeafBitField *bit_field = (CV_LeafBitField*)first; - RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, bit_field->itype); - result = rdim_type_bitfield(ctx->root, direct_type, bit_field->pos, bit_field->len); - } - }break; - - case CV_LeafKind_ARRAY: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafArray) <= cap) - { - CV_LeafArray *array = (CV_LeafArray*)first; - - // parse count - U8 *numeric_ptr = (U8*)(array + 1); - CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, first + cap); - - U64 full_size = cv_u64_from_numeric(&array_count); - - RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, array->entry_itype); - U64 count = full_size; - if(direct_type != 0 && direct_type->byte_size != 0) - { - count /= direct_type->byte_size; - } - - // build type - result = rdim_type_array(ctx->root, direct_type, count); - } - }break; - - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafStruct) <= cap) - { - CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; - - // TODO(allen): handle props - - // size - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - U64 size_u64 = cv_u64_from_numeric(&size); - - // name - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - - // incomplete type - if(lf_struct->props & CV_TypeProp_FwdRef) - { - RDI_TypeKind type_kind = RDI_TypeKind_IncompleteStruct; - if(range->hdr.kind == CV_LeafKind_CLASS) - { - type_kind = RDI_TypeKind_IncompleteClass; - } - result = rdim_type_incomplete(ctx->root, type_kind, name); - } - - // complete type - else - { - RDI_TypeKind type_kind = RDI_TypeKind_Struct; - if(range->hdr.kind == CV_LeafKind_CLASS) - { - type_kind = RDI_TypeKind_Class; - } - result = rdim_type_udt(ctx->root, type_kind, name, size_u64); - - // remember to revisit this for members - { - P2R_TypeRev *rev = push_array(ctx->arena, P2R_TypeRev, 1); - rev->owner_type = result; - rev->field_itype = lf_struct->field_itype; - SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); - } - } - } - }break; - - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafStruct2) <= cap) - { - CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first; - - // TODO(allen): handle props - - // size - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - U64 size_u64 = cv_u64_from_numeric(&size); - - // name - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - - // incomplete type - if(lf_struct->props & CV_TypeProp_FwdRef) - { - RDI_TypeKind type_kind = RDI_TypeKind_IncompleteStruct; - if(range->hdr.kind == CV_LeafKind_CLASS2) - { - type_kind = RDI_TypeKind_IncompleteClass; - } - result = rdim_type_incomplete(ctx->root, type_kind, name); - } - - // complete type - else - { - RDI_TypeKind type_kind = RDI_TypeKind_Struct; - if(range->hdr.kind == CV_LeafKind_CLASS2) - { - type_kind = RDI_TypeKind_Class; - } - result = rdim_type_udt(ctx->root, type_kind, name, size_u64); - - // remember to revisit this for members - { - P2R_TypeRev *rev = push_array(ctx->arena, P2R_TypeRev, 1); - rev->owner_type = result; - rev->field_itype = lf_struct->field_itype; - SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); - } - } - } - }break; - - case CV_LeafKind_UNION: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafUnion) <= cap) - { - CV_LeafUnion *lf_union = (CV_LeafUnion*)first; - - // TODO(allen): handle props - - // size - U8 *numeric_ptr = (U8*)(lf_union + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - U64 size_u64 = cv_u64_from_numeric(&size); - - // name - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - - // incomplete type - if(lf_union->props & CV_TypeProp_FwdRef) - { - result = - rdim_type_incomplete(ctx->root, RDI_TypeKind_IncompleteUnion, name); - } - - // complete type - else - { - result = rdim_type_udt(ctx->root, RDI_TypeKind_Union, name, size_u64); - - // remember to revisit this for members - { - P2R_TypeRev *rev = push_array(ctx->arena, P2R_TypeRev, 1); - rev->owner_type = result; - rev->field_itype = lf_union->field_itype; - SLLQueuePush(ctx->member_revisit_first, ctx->member_revisit_last, rev); - } - } - } - }break; - - case CV_LeafKind_ENUM: - { - // TODO(allen): error if bad range - if(sizeof(CV_LeafEnum) <= cap) - { - CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; - - // TODO(allen): handle props - - // name - U8 *name_ptr = (U8*)(lf_enum + 1); - String8 name = str8_cstring_capped((char*)name_ptr, first + cap); - - // incomplete type - if(lf_enum->props & CV_TypeProp_FwdRef) - { - result = rdim_type_incomplete(ctx->root, RDI_TypeKind_IncompleteEnum, name); - } - - // complete type - else - { - RDIM_Type *direct_type = p2r_type_resolve_and_check(ctx, lf_enum->base_itype); - result = rdim_type_enum(ctx->root, direct_type, name); - - // remember to revisit this for enumerates - { - P2R_TypeRev *rev = push_array(ctx->arena, P2R_TypeRev, 1); - rev->owner_type = result; - rev->field_itype = lf_enum->field_itype; - SLLQueuePush(ctx->enum_revisit_first, ctx->enum_revisit_last, rev); - } - } - } - }break; - - // discard cases - we currently discard these these intentionally - // so we mark them as "handled nil" - case CV_LeafKind_VTSHAPE: - case CV_LeafKind_VFTABLE: - case CV_LeafKind_LABEL: - { - result = rdim_type_handled_nil(ctx->root); - }break; - - // do nothing cases - these get handled in special passes and - // they should not be appearing as direct types - // or parameter types for any other types - // so if the input data is valid we won't get - // error messages even if they resolve to nil - case CV_LeafKind_FIELDLIST: - case CV_LeafKind_ARGLIST: - case CV_LeafKind_METHODLIST: - {}break; - - // Leaf Kinds - case CV_LeafKind_MODIFIER_16t: - case CV_LeafKind_POINTER_16t: - case CV_LeafKind_ARRAY_16t: - case CV_LeafKind_CLASS_16t: - case CV_LeafKind_STRUCTURE_16t: - case CV_LeafKind_UNION_16t: - case CV_LeafKind_ENUM_16t: - case CV_LeafKind_PROCEDURE_16t: - case CV_LeafKind_MFUNCTION_16t: - //case CV_LeafKind_VTSHAPE: - case CV_LeafKind_COBOL0_16t: - case CV_LeafKind_COBOL1: - case CV_LeafKind_BARRAY_16t: - //case CV_LeafKind_LABEL: - case CV_LeafKind_NULL: - case CV_LeafKind_NOTTRAN: - case CV_LeafKind_DIMARRAY_16t: - case CV_LeafKind_VFTPATH_16t: - case CV_LeafKind_PRECOMP_16t: - case CV_LeafKind_ENDPRECOMP: - case CV_LeafKind_OEM_16t: - case CV_LeafKind_TYPESERVER_ST: - case CV_LeafKind_SKIP_16t: - case CV_LeafKind_ARGLIST_16t: - case CV_LeafKind_DEFARG_16t: - case CV_LeafKind_LIST: - case CV_LeafKind_FIELDLIST_16t: - case CV_LeafKind_DERIVED_16t: - case CV_LeafKind_BITFIELD_16t: - case CV_LeafKind_METHODLIST_16t: - case CV_LeafKind_DIMCONU_16t: - case CV_LeafKind_DIMCONLU_16t: - case CV_LeafKind_DIMVARU_16t: - case CV_LeafKind_DIMVARLU_16t: - case CV_LeafKind_REFSYM: - case CV_LeafKind_BCLASS_16t: - case CV_LeafKind_VBCLASS_16t: - case CV_LeafKind_IVBCLASS_16t: - case CV_LeafKind_ENUMERATE_ST: - case CV_LeafKind_FRIENDFCN_16t: - case CV_LeafKind_INDEX_16t: - case CV_LeafKind_MEMBER_16t: - case CV_LeafKind_STMEMBER_16t: - case CV_LeafKind_METHOD_16t: - case CV_LeafKind_NESTTYPE_16t: - case CV_LeafKind_VFUNCTAB_16t: - case CV_LeafKind_FRIENDCLS_16t: - case CV_LeafKind_ONEMETHOD_16t: - case CV_LeafKind_VFUNCOFF_16t: - case CV_LeafKind_TI16_MAX: - //case CV_LeafKind_MODIFIER: - //case CV_LeafKind_POINTER: - case CV_LeafKind_ARRAY_ST: - case CV_LeafKind_CLASS_ST: - case CV_LeafKind_STRUCTURE_ST: - case CV_LeafKind_UNION_ST: - case CV_LeafKind_ENUM_ST: - //case CV_LeafKind_PROCEDURE: - //case CV_LeafKind_MFUNCTION: - case CV_LeafKind_COBOL0: - case CV_LeafKind_BARRAY: - case CV_LeafKind_DIMARRAY_ST: - case CV_LeafKind_VFTPATH: - case CV_LeafKind_PRECOMP_ST: - case CV_LeafKind_OEM: - case CV_LeafKind_ALIAS_ST: - case CV_LeafKind_OEM2: - case CV_LeafKind_SKIP: - //case CV_LeafKind_ARGLIST: - case CV_LeafKind_DEFARG_ST: - //case CV_LeafKind_FIELDLIST: - case CV_LeafKind_DERIVED: - //case CV_LeafKind_BITFIELD: - //case CV_LeafKind_METHODLIST: - case CV_LeafKind_DIMCONU: - case CV_LeafKind_DIMCONLU: - case CV_LeafKind_DIMVARU: - case CV_LeafKind_DIMVARLU: - case CV_LeafKind_BCLASS: - case CV_LeafKind_VBCLASS: - case CV_LeafKind_IVBCLASS: - case CV_LeafKind_FRIENDFCN_ST: - case CV_LeafKind_INDEX: - case CV_LeafKind_MEMBER_ST: - case CV_LeafKind_STMEMBER_ST: - case CV_LeafKind_METHOD_ST: - case CV_LeafKind_NESTTYPE_ST: - case CV_LeafKind_VFUNCTAB: - case CV_LeafKind_FRIENDCLS: - case CV_LeafKind_ONEMETHOD_ST: - case CV_LeafKind_VFUNCOFF: - case CV_LeafKind_NESTTYPEEX_ST: - case CV_LeafKind_MEMBERMODIFY_ST: - case CV_LeafKind_MANAGED_ST: - case CV_LeafKind_ST_MAX: - case CV_LeafKind_TYPESERVER: - case CV_LeafKind_ENUMERATE: - //case CV_LeafKind_ARRAY: - //case CV_LeafKind_CLASS: - //case CV_LeafKind_STRUCTURE: - //case CV_LeafKind_UNION: - //case CV_LeafKind_ENUM: - case CV_LeafKind_DIMARRAY: - case CV_LeafKind_PRECOMP: - case CV_LeafKind_ALIAS: - case CV_LeafKind_DEFARG: - case CV_LeafKind_FRIENDFCN: - case CV_LeafKind_MEMBER: - case CV_LeafKind_STMEMBER: - case CV_LeafKind_METHOD: - case CV_LeafKind_NESTTYPE: - case CV_LeafKind_ONEMETHOD: - case CV_LeafKind_NESTTYPEEX: - case CV_LeafKind_MEMBERMODIFY: - case CV_LeafKind_MANAGED: - case CV_LeafKind_TYPESERVER2: - case CV_LeafKind_STRIDED_ARRAY: - case CV_LeafKind_HLSL: - case CV_LeafKind_MODIFIER_EX: - case CV_LeafKind_INTERFACE: - case CV_LeafKind_BINTERFACE: - case CV_LeafKind_VECTOR: - case CV_LeafKind_MATRIX: - //case CV_LeafKind_VFTABLE: - default: - { - String8 kind_str = cv_string_from_leaf_kind(range->hdr.kind); - rdim_push_msgf(ctx->root, "pdbconv: unhandled leaf case %.*s (0x%x)", - str8_varg(kind_str), range->hdr.kind); - }break; - } - } - - rdim_type_fill_id(ctx->root, res, result); - - return(result); -} - -internal RDIM_Type* -p2r_type_resolve_and_check(P2R_Ctx *ctx, CV_TypeId itype) -{ - RDIM_Type *result = p2r_type_resolve_itype(ctx, itype); - if(rdim_type_is_unhandled_nil(ctx->root, result)) - { - rdim_push_msgf(ctx->root, "pdbconv: could not resolve itype (itype = %u)", itype); - } - return(result); -} - -internal void -p2r_type_resolve_arglist(Arena *arena, RDIM_TypeList *out, - P2R_Ctx *ctx, CV_TypeId arglist_itype) -{ - ProfBeginFunction(); - - // get leaf range - if(ctx->leaf->itype_first <= arglist_itype && arglist_itype < ctx->leaf->itype_opl) - { - CV_RecRange *range = &ctx->leaf->leaf_ranges.ranges[arglist_itype - ctx->leaf->itype_first]; - - // check valid arglist - String8 data = ctx->leaf->data; - if(range->hdr.kind == CV_LeafKind_ARGLIST && - range->off + range->hdr.size <= data.size) - { - U8 *first = data.str + range->off + 2; - U64 cap = range->hdr.size - 2; - if(sizeof(CV_LeafArgList) <= cap) - { - - // resolve parameters - CV_LeafArgList *arglist = (CV_LeafArgList*)first; - CV_TypeId *itypes = (CV_TypeId*)(arglist + 1); - U32 max_count = (cap - sizeof(*arglist))/sizeof(CV_TypeId); - U32 clamped_count = ClampTop(arglist->count, max_count); - for(U32 i = 0; i < clamped_count; i += 1) - { - RDIM_Type *param_type = p2r_type_resolve_and_check(ctx, itypes[i]); - rdim_type_list_push(arena, out, param_type); - } - - } - } - } - - ProfEnd(); -} - -internal RDIM_Type* -p2r_type_from_name(P2R_Ctx *ctx, String8 name) -{ - // TODO(rjf): no idea if this is correct - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(ctx->hash, ctx->leaf, name, 0); - RDIM_Type *result = rdim_type_from_id(ctx->root, cv_type_id, cv_type_id); - return(result); -} - -internal void -p2r_type_fwd_map_set(Arena *arena, P2R_FwdMap *map, CV_TypeId key, CV_TypeId val) -{ - U64 bucket_idx = key%map->buckets_count; - - // search for an existing match - P2R_FwdNode *match = 0; - for(P2R_FwdNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->key == key) - { - match = node; - break; - } - } - - // create a new node if no match - if(match == 0) - { - match = push_array(arena, P2R_FwdNode, 1); - SLLStackPush(map->buckets[bucket_idx], match); - match->key = key; - map->pair_count += 1; - map->bucket_collision_count += (match->next != 0); - } - - // set node's val - match->val = val; -} - -internal CV_TypeId -p2r_type_fwd_map_get(P2R_FwdMap *map, CV_TypeId key) -{ - U64 bucket_idx = key%map->buckets_count; - - // search for an existing match - P2R_FwdNode *match = 0; - for(P2R_FwdNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->key == key) - { - match = node; - break; - } - } - - // extract result - CV_TypeId result = 0; - if(match != 0) - { - result = match->val; - } - - return(result); -} - -//- symbols - -internal U64 -p2r_hash_from_local_user_id(U64 sym_hash, U64 id) -{ - U64 hash = id ^ (sym_hash<<1) ^ (sym_hash<<4); - return hash; -} - -internal U64 -p2r_hash_from_scope_user_id(U64 sym_hash, U64 id) -{ - U64 hash = id ^ (sym_hash<<1) ^ (sym_hash<<4); - return hash; -} - -internal U64 -p2r_hash_from_symbol_user_id(U64 sym_hash, U64 id) -{ - U64 hash = id/8 + id ^ (sym_hash<<1) ^ (sym_hash<<4); - return hash; -} - -internal void -p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - String8 data = sym->data; - U64 user_id_base = (((U64)sym_unique_id) << 32); - U64 sym_unique_id_hash = rdi_hash((U8*)&sym_unique_id, sizeof(sym_unique_id)); - - ////////////////////////////// - //- rjf: PASS 1: map out data associations - // - ProfScope("map out data associations") - { - RDIM_Symbol *current_proc = 0; - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > data.size || sym_off_first > data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = data.str + sym_off_first; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) - { - default:{}break; - - //- rjf: FRAMEPROC - case CV_SymKind_FRAMEPROC: - { - if(current_proc == 0) { break; } - CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; - P2R_FrameProcData data = {0}; - data.frame_size = frameproc->frame_size; - data.flags = frameproc->flags; - p2r_symbol_frame_proc_write(ctx, current_proc, &data); - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - U64 symbol_id = user_id_base + sym_off_first; - U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - current_proc = rdim_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - }break; - } - } - } - - ////////////////////////////// - //- rjf: PASS 2: main symbol construction pass - // - ProfScope("main symbol construction pass") - { - RDIM_LocationSet *defrange_target = 0; - B32 defrange_target_is_param = 0; - U64 local_num = 1; - U64 scope_num = 1; - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > data.size || sym_off_first > data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = data.str + sym_off_first; - void *sym_data_opl = data.str + sym_off_opl; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: unpack current state - RDIM_Scope *current_scope = p2r_symbol_current_scope(ctx); - RDIM_Symbol *current_procedure = 0; - if(current_scope != 0) - { - current_procedure = current_scope->symbol; - } - - //- rjf: consume symbol based on kind - switch(kind) - { - default:{}break; - - //- rjf: END - case CV_SymKind_END: - { - p2r_symbol_pop_scope(ctx); - defrange_target = 0; - defrange_target_is_param = 0; - }break; - - //- rjf: BLOCK32 - case CV_SymKind_BLOCK32: - { - CV_SymBlock32 *block32 = (CV_SymBlock32*)sym_header_struct_base; - - // scope - U64 scope_id = user_id_base + scope_num; - scope_num += 1; - U64 scope_hash = p2r_hash_from_scope_user_id(sym_unique_id_hash, scope_id); - RDIM_Scope *block_scope = rdim_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); - rdim_scope_set_parent(ctx->root, block_scope, current_scope); - p2r_symbol_push_scope(ctx, block_scope, current_procedure); - - // set voff range - COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, block32->sec); - if(section != 0) - { - U64 voff_first = section->voff + block32->off; - U64 voff_last = voff_first + block32->len; - rdim_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last); - } - }break; - - //- rjf: LDATA32/GDATA32 - case CV_SymKind_LDATA32: - case CV_SymKind_GDATA32: - { - CV_SymData32 *data32 = (CV_SymData32*)sym_header_struct_base; - String8 name = str8_cstring_capped(data32+1, sym_data_opl); - - // determine voff - COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, data32->sec); - U64 voff = ((section != 0)?section->voff:0) + data32->off; - - // deduplicate global variable symbols with the same name & offset - // * PDB likes to have duplicates of these spread across - // * different symbol streams so we deduplicate across the - // * entire translation context. - if(!p2r_known_global_lookup(&ctx->known_globals, name, voff)) - { - p2r_known_global_insert(ctx->arena, &ctx->known_globals, name, voff); - - // type of variable - RDIM_Type *type = p2r_type_resolve_itype(ctx, data32->itype); - - // container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - container_type = p2r_type_from_name(ctx, container_name); - } - - // container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0) - { - container_symbol = current_procedure; - } - - // determine link kind - B32 is_extern = (kind == CV_SymKind_GDATA32); - - // cons this symbol - U64 symbol_id = user_id_base + sym_off_first; - U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RDIM_Symbol *symbol = rdim_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - - RDIM_SymbolInfo info = zero_struct; - info.kind = RDIM_SymbolKind_GlobalVariable; - info.name = name; - info.type = type; - info.is_extern = is_extern; - info.offset = voff; - info.container_type = container_type; - info.container_symbol = container_symbol; - - rdim_symbol_set_info(ctx->root, symbol, &info); - } - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - CV_SymProc32 *proc32 = (CV_SymProc32*)sym_header_struct_base; - String8 name = str8_cstring_capped(proc32+1, sym_data_opl); - RDIM_Type *type = p2r_type_resolve_itype(ctx, proc32->itype); - - // container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - container_type = p2r_type_from_name(ctx, container_name); - } - - // container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0) - { - container_symbol = current_procedure; - } - - // get this symbol handle - U64 symbol_id = user_id_base + sym_off_first; - U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RDIM_Symbol *proc_symbol = rdim_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - - // scope - - // NOTE: even if there could be a containing scope at this point (which should be - // illegal in C/C++ but not necessarily in another language) we would not pass - // it here because these scopes refer to the ranges of code that make up a - // procedure *not* the namespaces, so a procedure's root scope always has - // no parent. - U64 scope_id = user_id_base + scope_num; - U64 scope_hash = p2r_hash_from_scope_user_id(sym_unique_id_hash, scope_id); - RDIM_Scope *root_scope = rdim_scope_handle_from_user_id(ctx->root, scope_id, scope_hash); - p2r_symbol_push_scope(ctx, root_scope, proc_symbol); - scope_num += 1; - - // set voff range - U64 voff = 0; - COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, proc32->sec); - if(section != 0) - { - U64 voff_first = section->voff + proc32->off; - U64 voff_last = voff_first + proc32->len; - rdim_scope_add_voff_range(ctx->root, root_scope, voff_first, voff_last); - - voff = voff_first; - } - - // link name - String8 link_name = {0}; - if(voff != 0) - { - link_name = p2r_link_name_find(&ctx->link_names, voff); - } - - // determine link kind - B32 is_extern = (kind == CV_SymKind_GPROC32); - - // set symbol info - RDIM_SymbolInfo info = zero_struct; - info.kind = RDIM_SymbolKind_Procedure; - info.name = name; - info.link_name = link_name; - info.type = type; - info.is_extern = is_extern; - info.container_type = container_type; - info.container_symbol = container_symbol; - info.root_scope = root_scope; - - rdim_symbol_set_info(ctx->root, proc_symbol, &info); - }break; - - //- rjf: REGREL32 - case CV_SymKind_REGREL32: - { - // TODO(allen): hide this when it's redundant with better information - // from a CV_SymKind_LOCAL record. - - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)sym_header_struct_base; - String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); - RDIM_Type *type = p2r_type_resolve_itype(ctx, regrel32->itype); - - // extract regrel's info - CV_Reg cv_reg = regrel32->reg; - U32 var_off = regrel32->reg_off; - - // need arch for analyzing register stuff - RDI_Arch arch = ctx->arch; - U64 addr_size = ctx->addr_size; - - // determine if this is a parameter - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - { - B32 is_stack_reg = 0; - switch (arch) - { - case RDI_Arch_X86: is_stack_reg = (cv_reg == CV_Regx86_ESP); break; - case RDI_Arch_X64: is_stack_reg = (cv_reg == CV_Regx64_RSP); break; - } - if(is_stack_reg) - { - U32 frame_size = 0xFFFFFFFF; - if(current_procedure != 0) - { - P2R_FrameProcData *frameproc = - p2r_symbol_frame_proc_read(ctx, current_procedure); - frame_size = frameproc->frame_size; - } - if(var_off > frame_size) - { - local_kind = RDI_LocalKind_Parameter; - } - } - } - - // emit local - U64 local_id = user_id_base + local_num;; - U64 local_id_hash = p2r_hash_from_local_user_id(sym_unique_id_hash, local_id); - RDIM_Local *local_var = rdim_local_handle_from_user_id(ctx->root, local_id, local_id_hash); - local_num += 1; - - RDIM_LocalInfo info = {0}; - info.kind = local_kind; - info.scope = current_scope; - info.name = name; - info.type = type; - rdim_local_set_basic_info(ctx->root, local_var, &info); - - // add location to local - { - // will there be an extra indirection to the value - B32 extra_indirection_to_value = 0; - switch (arch) - { - case RDI_Arch_X86: - { - if(local_kind == RDI_LocalKind_Parameter && - (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))) - { - extra_indirection_to_value = 1; - } - }break; - - case RDI_Arch_X64: - { - if(local_kind == RDI_LocalKind_Parameter && - (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))) - { - extra_indirection_to_value = 1; - } - }break; - } - - // get raddbg register code - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); - // TODO(allen): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; - - // set location case - RDIM_Location *loc = - p2r_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, - (S64)(S32)var_off, extra_indirection_to_value); - - RDIM_LocationSet *locset = rdim_location_set_from_local(ctx->root, local_var); - rdim_location_set_add_case(ctx->root, locset, 0, max_U64, loc); - } - }break; - - //- rjf: LTHREAD32/GTHREAD32 - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - { - CV_SymThread32 *thread32 = (CV_SymThread32*)sym_header_struct_base; - String8 name = str8_cstring_capped(thread32+1, sym_data_opl); - U32 tls_off = thread32->tls_off; - RDIM_Type *type = p2r_type_resolve_itype(ctx, thread32->itype); - - // container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - container_type = p2r_type_from_name(ctx, container_name); - } - - // container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0) - { - container_symbol = current_procedure; - } - - // determine link kind - B32 is_extern = (kind == CV_SymKind_GTHREAD32); - - // setup symbol - U64 symbol_id = user_id_base + sym_off_first; - U64 symbol_hash = p2r_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id); - RDIM_Symbol *symbol = rdim_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash); - - RDIM_SymbolInfo info = zero_struct; - info.kind = RDIM_SymbolKind_ThreadVariable; - info.name = name; - info.type = type; - info.is_extern = is_extern; - info.offset = tls_off; - info.container_type = container_type; - info.container_symbol = container_symbol; - - rdim_symbol_set_info(ctx->root, symbol, &info); - }break; - - //- rjf: LOCAL - case CV_SymKind_LOCAL: - { - CV_SymLocal *slocal = (CV_SymLocal*)sym_header_struct_base; - String8 name = str8_cstring_capped(slocal+1, sym_data_opl); - RDIM_Type *type = p2r_type_resolve_itype(ctx, slocal->itype); - - // determine how to handle - B32 begin_a_global_modification = 0; - if((slocal->flags & CV_LocalFlag_Global) || - (slocal->flags & CV_LocalFlag_Static)) - { - begin_a_global_modification = 1; - } - - // emit a global modification - if(begin_a_global_modification) - { - // TODO(allen): add global modification symbols - defrange_target = 0; - defrange_target_is_param = 0; - } - - // emit a local variable - else - { - // local kind - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - if(slocal->flags & CV_LocalFlag_Param) - { - local_kind = RDI_LocalKind_Parameter; - } - - // emit local - U64 local_id = user_id_base + local_num; - U64 local_id_hash = p2r_hash_from_local_user_id(sym_unique_id_hash, local_id); - RDIM_Local *local_var = rdim_local_handle_from_user_id(ctx->root, local_id, local_id_hash); - local_num += 1; - local_var->kind = local_kind; - local_var->name = name; - local_var->type = type; - - RDIM_LocalInfo info = {0}; - info.kind = local_kind; - info.scope = current_scope; - info.name = name; - info.type = type; - rdim_local_set_basic_info(ctx->root, local_var, &info); - - defrange_target = rdim_location_set_from_local(ctx->root, local_var); - defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); - } - }break; - - //- rjf: DEFRANGE_REGISTESR - case CV_SymKind_DEFRANGE_REGISTER: - { - if(defrange_target == 0) { break; } - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; - - // TODO(allen): offset & size from cv_reg code - RDI_Arch arch = ctx->arch; - CV_Reg cv_reg = defrange_register->reg; - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); - - // setup location - RDIM_Location *location = rdim_location_val_reg(ctx->root, register_code); - - // extract range info - CV_LvarAddrRange *range = &defrange_register->range; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // emit locations - p2r_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - { - if(defrange_target == 0) { break; } - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; - - // select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = - p2r_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); - RDI_RegisterCode fp_register_code = - p2r_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); - - // setup location - B32 extra_indirection = 0; - U32 byte_size = ctx->addr_size; - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel->off; - RDIM_Location *location = - p2r_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, - var_off, extra_indirection); - - // extract range info - CV_LvarAddrRange *range = &defrange_fprel->range; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // emit locations - p2r_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_SUBFIELD_REGISTER - case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - { - if(defrange_target == 0) { break; } - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; - - // TODO(allen): full "subfield" location system - if(defrange_subfield_register->field_offset == 0) - { - - // TODO(allen): offset & size from cv_reg code - RDI_Arch arch = ctx->arch; - CV_Reg cv_reg = defrange_subfield_register->reg; - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); - - // setup location - RDIM_Location *location = rdim_location_val_reg(ctx->root, register_code); - - // extract range info - CV_LvarAddrRange *range = &defrange_subfield_register->range; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // emit locations - p2r_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); - } - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - { - if(defrange_target == 0) { break; } - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = - (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; - - // select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = - p2r_cv_encoded_fp_reg_from_proc(ctx, current_procedure, defrange_target_is_param); - RDI_RegisterCode fp_register_code = - p2r_reg_code_from_arch_encoded_fp_reg(ctx->arch, encoded_fp_reg); - - // setup location - B32 extra_indirection = 0; - U32 byte_size = ctx->addr_size; - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel_full_scope->off; - RDIM_Location *location = - p2r_location_from_addr_reg_off(ctx, fp_register_code, byte_size, byte_pos, - var_off, extra_indirection); - - - // emit location - rdim_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location); - }break; - - //- rjf: DEFRANGE_REGISTER_REL - case CV_SymKind_DEFRANGE_REGISTER_REL: - { - if(defrange_target == 0) { break; } - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; - - // TODO(allen): offset & size from cv_reg code - RDI_Arch arch = ctx->arch; - CV_Reg cv_reg = defrange_register_rel->reg; - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); - U32 byte_size = ctx->addr_size; - U32 byte_pos = 0; - - B32 extra_indirection_to_value = 0; - S64 var_off = defrange_register_rel->reg_off; - - // setup location - RDIM_Location *location = - p2r_location_from_addr_reg_off(ctx, register_code, byte_size, byte_pos, - var_off, extra_indirection_to_value); - - // extract range info - CV_LvarAddrRange *range = &defrange_register_rel->range; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // emit locations - p2r_location_over_lvar_addr_range(ctx, defrange_target, location, - range, gaps, gap_count); - }break; - - //- rjf: FILESTATIC - case CV_SymKind_FILESTATIC: - { - CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; - String8 name = str8_cstring_capped(file_static+1, sym_data_opl); - RDIM_Type *type = p2r_type_resolve_itype(ctx, file_static->itype); - - // TODO(allen): emit a global modifier symbol - - // defrange records from this point attach to this location information - defrange_target = 0; - defrange_target_is_param = 0; - }break; - } - } - - //- rjf: non-empty scope stack? -> error - { - RDIM_Scope *scope = p2r_symbol_current_scope(ctx); - if(scope != 0) - { - // TODO(allen): emit error - } - } - - //- rjf: clear scope stack - p2r_symbol_clear_scope_stack(ctx); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -p2r_gather_link_names(P2R_Ctx *ctx, CV_SymParsed *sym) -{ - ProfBeginFunction(); - // extract important values from parameters - String8 data = sym->data; - - // loop - CV_RecRange *rec_range = sym->sym_ranges.ranges; - CV_RecRange *opl = rec_range + sym->sym_ranges.count; - for(;rec_range < opl; rec_range += 1) - { - // symbol data range - U64 opl_off_raw = rec_range->off + rec_range->hdr.size; - U64 opl_off = ClampTop(opl_off_raw, data.size); - - U64 off_raw = rec_range->off + 2; - U64 off = ClampTop(off_raw, opl_off); - - U8 *first = data.str + off; - U64 cap = (opl_off - off); - - CV_SymKind kind = rec_range->hdr.kind; - switch (kind) - { - default: break; - - case CV_SymKind_PUB32: - { - if(sizeof(CV_SymPub32) > cap) - { - // TODO(allen): error - } - else - { - CV_SymPub32 *pub32 = (CV_SymPub32*)first; - - // name - String8 name = str8_cstring_capped((char*)(pub32 + 1), first + cap); - - // calculate voff - U64 voff = 0; - COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, pub32->sec); - if(section != 0) - { - voff = section->voff + pub32->off; - } - - // save link name - p2r_link_name_save(ctx->arena, &ctx->link_names, voff, name); - } - }break; - } - } - ProfEnd(); -} - -// "frameproc" map - -internal void -p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RDIM_Symbol *key,P2R_FrameProcData *data) -{ - ProfBeginFunction(); - U64 key_int = IntFromPtr(key); - P2R_FrameProcMap *map = &ctx->frame_proc_map; - U32 bucket_idx = key_int%map->buckets_count; - - // find match - P2R_FrameProcNode *match = 0; - for(P2R_FrameProcNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->key == key) - { - match = node; - break; - } - } - - // if there is already a match emit error - if(match != 0) - { - // TODO(allen): error - } - - // insert new association if no match - if(match == 0) - { - match = push_array(ctx->arena, P2R_FrameProcNode, 1); - SLLStackPush(map->buckets[bucket_idx], match); - match->key = key; - MemoryCopyStruct(&match->data, data); - map->pair_count += 1; - map->bucket_collision_count += (match->next != 0); - } - ProfEnd(); -} - -internal P2R_FrameProcData* -p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RDIM_Symbol *key) -{ - U64 key_int = IntFromPtr(key); - P2R_FrameProcMap *map = &ctx->frame_proc_map; - U32 bucket_idx = key_int%map->buckets_count; - - // find match - P2R_FrameProcData *result = 0; - for(P2R_FrameProcNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->key == key) - { - result = &node->data; - break; - } - } - - return(result); -} - -// scope stack -internal void -p2r_symbol_push_scope(P2R_Ctx *ctx, RDIM_Scope *scope, RDIM_Symbol *symbol) -{ - P2R_ScopeNode *node = ctx->scope_node_free; - if(node == 0) - { - node = push_array(ctx->arena, P2R_ScopeNode, 1); - } - else - { - SLLStackPop(ctx->scope_node_free); - } - SLLStackPush(ctx->scope_stack, node); - node->scope = scope; - node->symbol = symbol; -} - -internal void -p2r_symbol_pop_scope(P2R_Ctx *ctx) -{ - P2R_ScopeNode *node = ctx->scope_stack; - if(node != 0) - { - SLLStackPop(ctx->scope_stack); - SLLStackPush(ctx->scope_node_free, node); - } -} - -internal void -p2r_symbol_clear_scope_stack(P2R_Ctx *ctx) -{ - for(;;) - { - P2R_ScopeNode *node = ctx->scope_stack; - if(node == 0) - { - break; - } - SLLStackPop(ctx->scope_stack); - SLLStackPush(ctx->scope_node_free, node); - } -} - -// PDB/C++ name parsing helper - -internal U64 -p2r_end_of_cplusplus_container_name(String8 str) -{ - // NOTE: This finds the index one past the last "::" contained in str. - // if no "::" is contained in str, then the returned index is 0. - // The intent is that [0,clamp_bot(0,result - 2)) gives the - // "container name" and [result,str.size) gives the leaf name. - U64 result = 0; - if(str.size >= 2) - { - for(U64 i = str.size; i >= 2; i -= 1) - { - if(str.str[i - 2] == ':' && str.str[i - 1] == ':') - { - result = i; - break; - } - } - } - return(result); -} - -// known global set - -internal U64 -p2r_known_global_hash(String8 name, U64 voff) -{ - U64 result = 5381 ^ voff; - U8 *ptr = name.str; - U8 *opl = ptr + name.size; - for(; ptr < opl; ptr += 1) - { - result = ((result << 5) + result) + *ptr; - } - return(result); -} - -internal B32 -p2r_known_global_lookup(P2R_KnownGlobalSet *set, String8 name, U64 voff) -{ - U64 hash = p2r_known_global_hash(name, voff); - U64 bucket_idx = hash%set->buckets_count; - - P2R_KnownGlobalNode *match = 0; - for(P2R_KnownGlobalNode *node = set->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->hash == hash && - node->key_voff == voff && - str8_match(node->key_name, name, 0)) - { - match = node; - break; - } - } - - B32 result = (match != 0); - return(result); -} - -internal void -p2r_known_global_insert(Arena *arena, P2R_KnownGlobalSet *set, String8 name, U64 voff) -{ - U64 hash = p2r_known_global_hash(name, voff); - U64 bucket_idx = hash%set->buckets_count; - - P2R_KnownGlobalNode *match = 0; - for(P2R_KnownGlobalNode *node = set->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->hash == hash && - node->key_voff == voff && - str8_match(node->key_name, name, 0)) - { - match = node; - break; - } - } - - if(match == 0) - { - P2R_KnownGlobalNode *node = push_array(arena, P2R_KnownGlobalNode, 1); - SLLStackPush(set->buckets[bucket_idx], node); - node->key_name = push_str8_copy(arena, name); - node->key_voff = voff; - node->hash = hash; - set->global_count += 1; - set->bucket_collision_count += (node->next != 0); - } -} - -// location info helpers - -internal RDIM_Location* -p2r_location_from_addr_reg_off(P2R_Ctx *ctx, - RDI_RegisterCode reg_code, - U32 reg_byte_size, - U32 reg_byte_pos, - S64 offset, - B32 extra_indirection) -{ - RDIM_Location *result = 0; - if(0 <= offset && offset <= (S64)max_U16) - { - if(extra_indirection) - { - result = rdim_location_addr_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); - } - else - { - result = rdim_location_addr_reg_plus_u16(ctx->root, reg_code, (U16)offset); - } - } - else - { - Arena *arena = ctx->arena; - - RDIM_EvalBytecode bytecode = {0}; - U32 regread_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, regread_param); - rdim_bytecode_push_sconst(arena, &bytecode, offset); - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); - if(extra_indirection) - { - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, ctx->addr_size); - } - - result = rdim_location_addr_bytecode_stream(ctx->root, &bytecode); - } - - return(result); -} - -internal CV_EncodedFramePtrReg -p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, RDIM_Symbol *proc, B32 param_base) -{ - CV_EncodedFramePtrReg result = 0; - if(proc != 0) - { - P2R_FrameProcData *frame_proc = p2r_symbol_frame_proc_read(ctx, proc); - CV_FrameprocFlags flags = frame_proc->flags; - if(param_base) - { - result = CV_FrameprocFlags_ExtractParamBasePointer(flags); - } - else - { - result = CV_FrameprocFlags_ExtractLocalBasePointer(flags); - } - } - return(result); -} - -internal RDI_RegisterCode -p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg) -{ - RDI_RegisterCode result = 0; - - switch (arch) - { - case RDI_Arch_X86: - { - switch (encoded_reg) - { - case CV_EncodedFramePtrReg_StackPtr: - { - // TODO(allen): support CV_AllReg_VFRAME - // TODO(allen): error - }break; - case CV_EncodedFramePtrReg_FramePtr: - { - result = RDI_RegisterCode_X86_ebp; - }break; - case CV_EncodedFramePtrReg_BasePtr: - { - result = RDI_RegisterCode_X86_ebx; - }break; - } - }break; - - case RDI_Arch_X64: - { - switch (encoded_reg) - { - case CV_EncodedFramePtrReg_StackPtr: - { - result = RDI_RegisterCode_X64_rsp; - }break; - case CV_EncodedFramePtrReg_FramePtr: - { - result = RDI_RegisterCode_X64_rbp; - }break; - case CV_EncodedFramePtrReg_BasePtr: - { - result = RDI_RegisterCode_X64_r13; - }break; - } - }break; - } - - return(result); -} - -internal void -p2r_location_over_lvar_addr_range(P2R_Ctx *ctx, - RDIM_LocationSet *locset, - RDIM_Location *location, - CV_LvarAddrRange *range, - CV_LvarAddrGap *gaps, U64 gap_count) -{ - // extract range info - U64 voff_first = 0; - U64 voff_opl = 0; - { - COFF_SectionHeader *section = p2r_sec_header_from_sec_num(ctx, range->sec); - if(section != 0) - { - voff_first = section->voff + range->off; - voff_opl = voff_first + range->len; - } - } - - // emit ranges - CV_LvarAddrGap *gap_ptr = gaps; - U64 voff_cursor = voff_first; - for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) - { - U64 voff_gap_first = voff_first + gap_ptr->off; - U64 voff_gap_opl = voff_gap_first + gap_ptr->len; - if(voff_cursor < voff_gap_first) - { - rdim_location_set_add_case(ctx->root, locset, voff_cursor, voff_gap_first, location); - } - voff_cursor = voff_gap_opl; - } - - if(voff_cursor < voff_opl) - { - rdim_location_set_add_case(ctx->root, locset, voff_cursor, voff_opl, location); - } -} - -// link names - -internal void -p2r_link_name_save(Arena *arena, P2R_LinkNameMap *map, U64 voff, String8 name) -{ - U64 hash = (voff >> 3) ^ ((7 & voff) << 6); - U64 bucket_idx = hash%map->buckets_count; - - P2R_LinkNameNode *node = push_array(arena, P2R_LinkNameNode, 1); - SLLStackPush(map->buckets[bucket_idx], node); - node->voff = voff; - node->name = push_str8_copy(arena, name); - map->link_name_count += 1; - map->bucket_collision_count += (node->next != 0); -} - -internal String8 -p2r_link_name_find(P2R_LinkNameMap *map, U64 voff) -{ - U64 hash = (voff >> 3) ^ ((7 & voff) << 6); - U64 bucket_idx = hash%map->buckets_count; - - String8 result = {0}; - for(P2R_LinkNameNode *node = map->buckets[bucket_idx]; - node != 0; - node = node->next) - { - if(node->voff == voff) - { - result = node->name; - break; - } - } - - return(result); -} - -#endif - //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point @@ -5835,438 +2936,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) out->scopes = all_scopes; } - //~ TODO(rjf): OLD vvvvvvvvvvvvvvvvvvv -#if 0 - - // output generation - P2R_Ctx *p2r_ctx = 0; - if(in->output_name.size > 0) - { - // setup root - RDIM_RootParams root_params = {0}; - root_params.addr_size = addr_size; - - root_params.bucket_count_units = comp_unit_count; - root_params.bucket_count_symbols = symbol_count_prediction; - root_params.bucket_count_scopes = symbol_count_prediction; - root_params.bucket_count_locals = symbol_count_prediction*2; - root_params.bucket_count_types = tpi->itype_opl; - root_params.bucket_count_type_constructs = tpi->itype_opl; - - RDIM_Root *root = rdim_root_alloc(&root_params); - out->root = root; - - // top level info - { - // calculate voff max - U64 voff_max = 0; - { - COFF_SectionHeader *coff_sec_ptr = coff_sections->sections; - COFF_SectionHeader *coff_ptr_opl = coff_sec_ptr + coff_section_count; - for(;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) - { - U64 sec_voff_max = coff_sec_ptr->voff + coff_sec_ptr->vsize; - voff_max = Max(voff_max, sec_voff_max); - } - } - - // set top level info - RDIM_TopLevelInfo tli = {0}; - tli.architecture = architecture; - tli.exe_name = in->input_exe_name; - tli.exe_hash = exe_hash; - tli.voff_max = voff_max; - - rdim_set_top_level_info(root, &tli); - } - - - // setup binary sections - { - COFF_SectionHeader *coff_ptr = coff_sections->sections; - COFF_SectionHeader *coff_opl = coff_ptr + coff_section_count; - for(;coff_ptr < coff_opl; coff_ptr += 1) - { - char *name_first = (char*)coff_ptr->name; - char *name_opl = name_first + sizeof(coff_ptr->name); - String8 name = str8_cstring_capped(name_first, name_opl); - RDI_BinarySectionFlags flags = - rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); - rdim_add_binary_section(root, name, flags, - coff_ptr->voff, coff_ptr->voff + coff_ptr->vsize, - coff_ptr->foff, coff_ptr->foff + coff_ptr->fsize); - } - } - - - // setup compilation units - { - PDB_CompUnit **units = comp_units->units; - for(U64 i = 0; i < comp_unit_count; i += 1) - { - PDB_CompUnit *unit = units[i]; - CV_SymParsed *unit_sym = sym_for_unit[i]; - CV_C13Parsed *unit_c13 = c13_for_unit[i]; - - // resolve names - String8 raw_name = unit->obj_name; - - String8 unit_name = raw_name; - { - U64 first_after_slashes = 0; - for(S64 i = unit_name.size - 1; i >= 0; i -= 1) - { - if(unit_name.str[i] == '/' || unit_name.str[i] == '\\') - { - first_after_slashes = i + 1; - break; - } - } - unit_name = str8_range(raw_name.str + first_after_slashes, - raw_name.str + raw_name.size); - } - - String8 obj_name = raw_name; - if(str8_match(obj_name, str8_lit("* Linker *"), 0) || - str8_match(obj_name, str8_lit("Import:"), - StringMatchFlag_RightSideSloppy)) - { - MemoryZeroStruct(&obj_name); - } - - String8 compiler_name = unit_sym->info.compiler_name; - String8 archive_file = unit->group_name; - - // extract langauge - RDI_Language lang = rdi_language_from_cv_language(sym->info.language); - - // basic per unit info - RDIM_Unit *unit_handle = rdim_unit_handle_from_user_id(root, i, i); - - RDIM_UnitInfo info = {0}; - info.unit_name = unit_name; - info.compiler_name = compiler_name; - info.object_file = obj_name; - info.archive_file = archive_file; - info.language = lang; - - rdim_unit_set_info(root, unit_handle, &info); - - // unit's line info - for(CV_C13SubSectionNode *node = unit_c13->first_sub_section; - node != 0; - node = node->next) - { - if(node->kind == CV_C13_SubSectionKind_Lines) - { - for(CV_C13LinesParsedNode *lines_n = node->lines_first; - lines_n != 0; - lines_n = lines_n->next) - { - CV_C13LinesParsed *lines = &lines_n->v; - RDIM_LineSequence seq = {0}; - seq.file_name = lines->file_name; - seq.voffs = lines->voffs; - seq.line_nums = lines->line_nums; - seq.col_nums = lines->col_nums; - seq.line_count = lines->line_count; - rdim_unit_add_line_sequence(root, unit_handle, &seq); - } - } - } - } - } - - - // unit vmap ranges - { - PDB_CompUnitContribution *contrib_ptr = comp_unit_contributions->contributions; - PDB_CompUnitContribution *contrib_opl = contrib_ptr + comp_unit_contribution_count; - for(;contrib_ptr < contrib_opl; contrib_ptr += 1) - { - if(contrib_ptr->mod < root->unit_count) - { - RDIM_Unit *unit_handle = rdim_unit_handle_from_user_id(root, contrib_ptr->mod, contrib_ptr->mod); - rdim_unit_vmap_add_range(root, unit_handle, - contrib_ptr->voff_first, - contrib_ptr->voff_opl); - } - } - } - - // rjf: produce pdb conversion context - { - P2R_CtxParams p = {0}; - { - p.arch = architecture; - p.tpi_hash = tpi_hash; - p.tpi_leaf = tpi_leaf; - p.sections = coff_sections; - p.fwd_map_bucket_count = tpi->itype_opl/10; - p.frame_proc_map_bucket_count = symbol_count_prediction; - p.known_global_map_bucket_count = symbol_count_prediction; - p.link_name_map_bucket_count = symbol_count_prediction; - } - p2r_ctx = p2r_ctx_alloc(&p, root); - } - - // types & symbols - { - P2R_TypesSymbolsParams p = {0}; - p.sym = sym; - p.sym_for_unit = sym_for_unit; - p.unit_count = comp_unit_count; - p2r_types_and_symbols(p2r_ctx, &p); - } - - // conversion errors - if(!in->hide_errors.converting) - { - for(RDIM_Msg *msg = rdim_first_msg_from_root(root); - msg != 0; - msg = msg->next) - { - str8_list_push(arena, &out->errors, msg->string); - } - } - } - - // dump - if(in->dump) ProfScope("dump") - { - String8List dump = {0}; - - // EXE - if(out->good_parse) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "EXE INFO:\n")); - { - str8_list_pushf(arena, &dump, "HASH: %016llX\n", exe_hash); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // MSF - if(in->dump_msf) - { - if(msf != 0) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "MSF:\n")); - - str8_list_pushf(arena, &dump, " block_size=%llu\n", msf->block_size); - str8_list_pushf(arena, &dump, " block_count=%llu\n", msf->block_count); - str8_list_pushf(arena, &dump, " stream_count=%llu\n", msf->stream_count); - - String8 *stream_ptr = msf->streams; - U64 stream_count = msf->stream_count; - for(U64 i = 0; i < stream_count; i += 1, stream_ptr += 1) - { - str8_list_pushf(arena, &dump, " stream[%u].size=%llu\n", - i, stream_ptr->size); - } - - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // DBI - if(in->dump_sym) - { - if(sym != 0) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DBI SYM:\n")); - cv_stringize_sym_parsed(arena, &dump, sym); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // TPI - if(in->dump_tpi_hash) - { - if(tpi_hash != 0) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "TPI HASH:\n")); - pdb_stringize_tpi_hash(arena, &dump, tpi_hash); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - if(ipi_hash != 0) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "IPI HASH:\n")); - pdb_stringize_tpi_hash(arena, &dump, ipi_hash); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // LEAF - if(in->dump_leaf) - { - if(tpi_leaf != 0) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "TPI LEAF:\n")); - cv_stringize_leaf_parsed(arena, &dump, tpi_leaf); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - if(ipi_leaf != 0) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "IPI LEAF:\n")); - cv_stringize_leaf_parsed(arena, &dump, ipi_leaf); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // BINARY SECTIONS - if(in->dump_coff_sections) - { - if(coff_sections != 0) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "COFF SECTIONS:\n")); - COFF_SectionHeader *section_ptr = coff_sections->sections; - for(U64 i = 0; i < coff_section_count; i += 1, section_ptr += 1) - { - // TODO(allen): probably should pull this out into a separate stringize path - // for the coff section type - char *first = (char*)section_ptr->name; - char *opl = first + sizeof(section_ptr->name); - String8 name = str8_cstring_capped(first, opl); - str8_list_pushf(arena, &dump, " %.*s:\n", str8_varg(name)); - str8_list_pushf(arena, &dump, " vsize=%u\n", section_ptr->vsize); - str8_list_pushf(arena, &dump, " voff =0x%x\n", section_ptr->voff); - str8_list_pushf(arena, &dump, " fsize=%u\n", section_ptr->fsize); - str8_list_pushf(arena, &dump, " foff =0x%x\n", section_ptr->foff); - str8_list_pushf(arena, &dump, " relocs_foff=0x%x\n", section_ptr->relocs_foff); - str8_list_pushf(arena, &dump, " lines_foff =0x%x\n", section_ptr->lines_foff); - str8_list_pushf(arena, &dump, " reloc_count=%u\n", section_ptr->reloc_count); - str8_list_pushf(arena, &dump, " line_count =%u\n", section_ptr->line_count); - // TODO(allen): better flags - str8_list_pushf(arena, &dump, " flags=%x\n", section_ptr->flags); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - } - - // UNITS - if(comp_units != 0) - { - B32 dump_sym = in->dump_sym; - B32 dump_c13 = in->dump_c13; - - B32 dump_units = (dump_sym || dump_c13); - - if(dump_units) - { - PDB_CompUnit **unit_ptr = comp_units->units; - for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n")); - String8 name = (*unit_ptr)->obj_name; - String8 group_name = (*unit_ptr)->group_name; - str8_list_pushf(arena, &dump, "[%llu] %.*s\n(%.*s):\n", - i, str8_varg(name), str8_varg(group_name)); - if(dump_sym) - { - cv_stringize_sym_parsed(arena, &dump, sym_for_unit[i]); - } - if(dump_c13) - { - cv_stringize_c13_parsed(arena, &dump, c13_for_unit[i]); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - } - - // UNIT CONTRIBUTIONS - if(comp_unit_contributions != 0) - { - if(in->dump_contributions) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "UNIT CONTRIBUTIONS:\n")); - PDB_CompUnitContribution *contrib_ptr = comp_unit_contributions->contributions; - for(U64 i = 0; i < comp_unit_contribution_count; i += 1, contrib_ptr += 1) - { - str8_list_pushf(arena, &dump, - " { mod = %5u; voff_first = %08llx; voff_opl = %08llx; }\n", - contrib_ptr->mod, contrib_ptr->voff_first, contrib_ptr->voff_opl); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // rjf: dump table diagnostics - if(in->dump_table_diagnostics) - { - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "TABLE DIAGNOSTICS:\n")); - struct - { - String8 name; - U64 bucket_count; - U64 value_count; - U64 collision_count; - } - table_info[] = - { - {str8_lit("p2r_ctx fwd_map"), p2r_ctx?p2r_ctx->fwd_map.buckets_count:0, p2r_ctx?p2r_ctx->fwd_map.pair_count:0, p2r_ctx?p2r_ctx->fwd_map.bucket_collision_count:0}, - {str8_lit("p2r_ctx frame_proc_map"), p2r_ctx?p2r_ctx->frame_proc_map.buckets_count:0, p2r_ctx?p2r_ctx->frame_proc_map.pair_count:0, p2r_ctx?p2r_ctx->frame_proc_map.bucket_collision_count:0}, - {str8_lit("p2r_ctx known_globals"), p2r_ctx?p2r_ctx->known_globals.buckets_count:0, p2r_ctx?p2r_ctx->known_globals.global_count:0, p2r_ctx?p2r_ctx->known_globals.bucket_collision_count:0}, - {str8_lit("p2r_ctx link_names"), p2r_ctx?p2r_ctx->link_names.buckets_count:0, p2r_ctx?p2r_ctx->link_names.link_name_count:0, p2r_ctx?p2r_ctx->link_names.bucket_collision_count:0}, - {str8_lit("rdim_root unit_map"), out->root->unit_map.buckets_count, out->root->unit_map.pair_count, out->root->unit_map.bucket_collision_count}, - {str8_lit("rdim_root symbol_map"), out->root->symbol_map.buckets_count, out->root->symbol_map.pair_count, out->root->symbol_map.bucket_collision_count}, - {str8_lit("rdim_root scope_map"), out->root->scope_map.buckets_count, out->root->scope_map.pair_count, out->root->scope_map.bucket_collision_count}, - {str8_lit("rdim_root local_map"), out->root->local_map.buckets_count, out->root->local_map.pair_count, out->root->local_map.bucket_collision_count}, - {str8_lit("rdim_root type_from_id_map"), out->root->type_from_id_map.buckets_count, out->root->type_from_id_map.pair_count, out->root->type_from_id_map.bucket_collision_count}, - {str8_lit("rdim_root construct_map"), out->root->construct_map.buckets_count, out->root->construct_map.pair_count, out->root->construct_map.bucket_collision_count}, - }; - for(U64 idx = 0; idx < ArrayCount(table_info); idx += 1) - { - str8_list_pushf(arena, &dump, "%S: %I64u values in %I64u buckets, with %I64u collisions (%f fill)\n", - table_info[idx].name, - table_info[idx].value_count, - table_info[idx].bucket_count, - table_info[idx].collision_count, - (F64)table_info[idx].value_count / (F64)table_info[idx].bucket_count); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - out->dump = dump; - } - -#endif - scratch_end(scratch); return out; } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index d2ac7334..1cb9f460 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -75,176 +75,6 @@ struct P2R_LinkNameMap U64 link_name_count; }; -#if 0 - -//////////////////////////////// -//~ rjf: PDB Type & Symbol Info Translation Helper Types - -//- rjf: typeid forward reference map - -typedef struct P2R_FwdNode P2R_FwdNode; -struct P2R_FwdNode -{ - P2R_FwdNode *next; - CV_TypeId key; - CV_TypeId val; -}; - -typedef struct P2R_FwdMap P2R_FwdMap; -struct P2R_FwdMap -{ - P2R_FwdNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 pair_count; -}; - -//- rjf: type revisit lists - -typedef struct P2R_TypeRev P2R_TypeRev; -struct P2R_TypeRev -{ - P2R_TypeRev *next; - RDIM_Type *owner_type; - CV_TypeId field_itype; -}; - -//- rjf: frame proc maps - -typedef struct P2R_FrameProcData P2R_FrameProcData; -struct P2R_FrameProcData -{ - U32 frame_size; - CV_FrameprocFlags flags; -}; - -typedef struct P2R_FrameProcNode P2R_FrameProcNode; -struct P2R_FrameProcNode -{ - P2R_FrameProcNode *next; - RDIM_Symbol *key; - P2R_FrameProcData data; -}; - -typedef struct P2R_FrameProcMap P2R_FrameProcMap; -struct P2R_FrameProcMap -{ - P2R_FrameProcNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 pair_count; -}; - -//- rjf: scopes - -typedef struct P2R_ScopeNode P2R_ScopeNode; -struct P2R_ScopeNode -{ - P2R_ScopeNode *next; - RDIM_Scope *scope; - RDIM_Symbol *symbol; -}; - -//- rjf: known global map - -typedef struct P2R_KnownGlobalNode P2R_KnownGlobalNode; -struct P2R_KnownGlobalNode -{ - P2R_KnownGlobalNode *next; - String8 key_name; - U64 key_voff; - U64 hash; -}; - -typedef struct P2R_KnownGlobalSet P2R_KnownGlobalSet; -struct P2R_KnownGlobalSet -{ - P2R_KnownGlobalNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 global_count; -}; - -typedef struct P2R_CtxParams P2R_CtxParams; -struct P2R_CtxParams -{ - RDI_Arch arch; - PDB_TpiHashParsed *tpi_hash; - CV_LeafParsed *tpi_leaf; - PDB_CoffSectionArray *sections; - U64 fwd_map_bucket_count; - U64 frame_proc_map_bucket_count; - U64 known_global_map_bucket_count; - U64 link_name_map_bucket_count; -}; - -typedef struct P2R_TypesSymbolsParams P2R_TypesSymbolsParams; -struct P2R_TypesSymbolsParams -{ - CV_SymParsed *sym; - CV_SymParsed **sym_for_unit; - U64 unit_count; -}; - -typedef struct P2R_LinkNameNode P2R_LinkNameNode; -struct P2R_LinkNameNode -{ - P2R_LinkNameNode *next; - U64 voff; - String8 name; -}; - -typedef struct P2R_LinkNameMap P2R_LinkNameMap; -struct P2R_LinkNameMap -{ - P2R_LinkNameNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 link_name_count; -}; - -typedef struct P2R_Ctx P2R_Ctx; -struct P2R_Ctx -{ - Arena *arena; - - // INPUT data - RDI_Arch arch; - U64 addr_size; - PDB_TpiHashParsed *hash; - CV_LeafParsed *leaf; - COFF_SectionHeader *sections; - U64 section_count; - - // OUTPUT data - RDIM_Root *root; - - // TEMPORARY STATE - P2R_FwdMap fwd_map; - P2R_TypeRev *member_revisit_first; - P2R_TypeRev *member_revisit_last; - P2R_TypeRev *enum_revisit_first; - P2R_TypeRev *enum_revisit_last; - P2R_FrameProcMap frame_proc_map; - P2R_ScopeNode *scope_stack; - P2R_ScopeNode *scope_node_free; - P2R_KnownGlobalSet known_globals; - P2R_LinkNameMap link_names; -}; - -//////////////////////////////// -//~ Conversion Output Type - -typedef struct P2R_Out P2R_Out; -struct P2R_Out -{ - B32 good_parse; - RDIM_Root *root; - String8List dump; - String8List errors; -}; -#endif - //////////////////////////////// //~ rjf: Basic Helpers @@ -283,112 +113,4 @@ internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkLis internal P2R_ConvertOut *p2r_convert(Arena *arena, P2R_ConvertIn *in); -#if 0 - -//////////////////////////////// -//~ rjf: Conversion Implementation Helpers - -//- rjf: pdb conversion context creation -internal P2R_Ctx *p2r_ctx_alloc(P2R_CtxParams *params, RDIM_Root *out_root); - -//- rjf: pdb types and symbols -internal void p2r_types_and_symbols(P2R_Ctx *pdb_ctx, P2R_TypesSymbolsParams *params); - -//- rjf: decoding helpers -internal U32 p2r_u32_from_numeric(P2R_Ctx *ctx, CV_NumericParsed *num); -internal COFF_SectionHeader* p2r_sec_header_from_sec_num(P2R_Ctx *ctx, U32 sec_num); - -//- rjf: type info -// -// TODO(allen): explain the overarching pattern of PDB type info translation here -// 1. main passes (out of order necessity) & after -// 2. resolve forward -// 3. cons type info -// 4. "resolve itype" -// 5. equipping members & enumerates -// 6. equipping source coordinates - -// type info construction passes -internal void p2r_type_cons_main_passes(P2R_Ctx *ctx); -internal CV_TypeId p2r_type_resolve_fwd(P2R_Ctx *ctx, CV_TypeId itype); -internal RDIM_Type* p2r_type_resolve_itype(P2R_Ctx *ctx, CV_TypeId itype); -internal void p2r_type_equip_members(P2R_Ctx *ctx, RDIM_Type *owern_type, CV_TypeId field_itype); -internal void p2r_type_equip_enumerates(P2R_Ctx *ctx, RDIM_Type *owner_type, CV_TypeId field_itype); - -// type info construction helpers -internal RDIM_Type* p2r_type_cons_basic(P2R_Ctx *ctx, CV_TypeId itype); -internal RDIM_Type* p2r_type_cons_leaf_record(P2R_Ctx *ctx, CV_TypeId itype); -internal RDIM_Type* p2r_type_resolve_and_check(P2R_Ctx *ctx, CV_TypeId itype); -internal void p2r_type_resolve_arglist(Arena *arena, RDIM_TypeList *out, - P2R_Ctx *ctx, CV_TypeId arglist_itype); - -// type info resolution helpers -internal RDIM_Type* p2r_type_from_name(P2R_Ctx *ctx, String8 name); - -// type fwd map -internal void p2r_type_fwd_map_set(Arena *arena, P2R_FwdMap *map, - CV_TypeId key, CV_TypeId val); -internal CV_TypeId p2r_type_fwd_map_get(P2R_FwdMap *map, CV_TypeId key); - -//- rjf: symbol info - -// symbol info construction -internal U64 p2r_hash_from_local_user_id(U64 sym_hash, U64 id); -internal U64 p2r_hash_from_scope_user_id(U64 sym_hash, U64 id); -internal U64 p2r_hash_from_symbol_user_id(U64 sym_hash, U64 id); -internal void p2r_symbol_cons(P2R_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id); -internal void p2r_gather_link_names(P2R_Ctx *ctx, CV_SymParsed *sym); - -// "frameproc" map -internal void p2r_symbol_frame_proc_write(P2R_Ctx *ctx,RDIM_Symbol *key, - P2R_FrameProcData *data); -internal P2R_FrameProcData* p2r_symbol_frame_proc_read(P2R_Ctx *ctx, RDIM_Symbol *key); - -// scope stack -internal void p2r_symbol_push_scope(P2R_Ctx *ctx, RDIM_Scope *scope, RDIM_Symbol *symbol); -internal void p2r_symbol_pop_scope(P2R_Ctx *ctx); -internal void p2r_symbol_clear_scope_stack(P2R_Ctx *ctx); - -#define p2r_symbol_current_scope(ctx) ((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->scope) -#define p2r_symbol_current_symbol(ctx) ((ctx)->scope_stack == 0)?0:((ctx)->scope_stack->symbol) - -// PDB/C++ name parsing helper -internal U64 p2r_end_of_cplusplus_container_name(String8 str); - -// global deduplication -internal U64 p2r_known_global_hash(String8 name, U64 voff); - -internal B32 p2r_known_global_lookup(P2R_KnownGlobalSet *set, String8 name, U64 voff); -internal void p2r_known_global_insert(Arena *arena, P2R_KnownGlobalSet *set, - String8 name, U64 voff); - - -// location info helpers -internal RDIM_Location* p2r_location_from_addr_reg_off(P2R_Ctx *ctx, - RDI_RegisterCode reg_code, - U32 reg_byte_size, - U32 reg_byte_pos, - S64 offset, - B32 extra_indirection); - -internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_proc(P2R_Ctx *ctx, - RDIM_Symbol *proc, - B32 param_base); - -internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, - CV_EncodedFramePtrReg encoded_reg); - -internal void p2r_location_over_lvar_addr_range(P2R_Ctx *ctx, - RDIM_LocationSet *locset, - RDIM_Location *location, - CV_LvarAddrRange *range, - CV_LvarAddrGap *gaps, U64 gap_count); - -// link names -internal void p2r_link_name_save(Arena *arena, P2R_LinkNameMap *map, - U64 voff, String8 name); -internal String8 p2r_link_name_find(P2R_LinkNameMap *map, U64 voff); - -#endif - #endif // RDI_FROM_PDB_H From 4f9e3bb4f57f1c3c84b275a35fb0f603d476ae41 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 17 Feb 2024 08:41:27 -0800 Subject: [PATCH 085/275] clean up / debugging / bugfixes in new converter --- src/lib_raddbgi_make/raddbgi_make.c | 17 +++++++++++------ src/lib_raddbgi_make/raddbgi_make.h | 1 - src/raddbgi_from_pdb/raddbgi_from_pdb.c | 8 +++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index b93900e8..bf1597d7 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -736,11 +736,11 @@ rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkL { dst->last->next = to_push->first; dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; dst->scope_voff_count += to_push->scope_voff_count; - dst->local_count += to_push->local_count; - dst->location_count += to_push->location_count; + dst->local_count += to_push->local_count; + dst->location_count += to_push->location_count; } else if(dst->first == 0) { @@ -1405,6 +1405,11 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) name_maps[k].slots_count = 65536; name_maps[k].slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, name_maps[k].slots_count); } + RDIM_BakePathNode *nil_path = rdim_bake_path_node_from_string(arena, &path_tree, rdim_str8_lit("")); + RDIM_BakeSrcNode *nil_src = rdim_bake_src_node_from_path_node(arena, &path_tree, nil_path); + (void)nil_src; + rdim_bake_string(arena, &strings, rdim_str8_lit("")); + rdim_bake_idx_run(arena, &idx_runs, 0, 0); } ////////////////////////////// @@ -2066,7 +2071,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDIM_ProfScope("build all procedures") { RDI_U32 dst_idx = 0; - for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) { for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) { @@ -2343,7 +2348,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) { RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; RDI_U32 scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope); // TODO(rjf): @u64_to_u32 - for(RDIM_Rng1U64Node *n = 0; n != 0; n = n->next) + for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) { key_ptr->key = n->v.min; key_ptr->val = marker_ptr; diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index e23f9595..45fcb703 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -675,7 +675,6 @@ typedef struct RDIM_Symbol RDIM_Symbol; struct RDIM_Symbol { struct RDIM_SymbolChunkNode *chunk; - RDIM_SymbolKind kind; RDI_S32 is_extern; RDIM_String8 name; RDIM_String8 link_name; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 68503c7c..36ef1135 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -2377,7 +2377,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) U64 voff_first = section->voff + block32->off; U64 voff_last = voff_first + block32->len; RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_rng1u64_list_push(arena, &scope->voff_ranges, voff_range); + rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); } } @@ -2437,7 +2437,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: build symbol RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, &sym_global_variables, sym_global_variables_chunk_cap); - symbol->kind = RDIM_SymbolKind_GlobalVariable; symbol->is_extern = (kind == CV_SymKind_GDATA32); symbol->name = name; symbol->type = type; @@ -2488,7 +2487,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) U64 voff_first = section->voff + proc32->off; U64 voff_last = voff_first + proc32->len; RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_rng1u64_list_push(arena, &procedure_root_scope->voff_ranges, voff_range); + rdim_scope_push_voff_range(arena, &sym_scopes, procedure_root_scope, voff_range); } } @@ -2512,13 +2511,13 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: build procedure symbol RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, &sym_procedures, sym_procedures_chunk_cap); - procedure_symbol->kind = RDIM_SymbolKind_Procedure; procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); procedure_symbol->name = name; procedure_symbol->link_name = link_name; procedure_symbol->type = type; procedure_symbol->container_symbol = container_symbol; procedure_symbol->container_type = container_type; + procedure_symbol->root_scope = procedure_root_scope; // rjf: fill root scope's symbol procedure_root_scope->symbol = procedure_symbol; @@ -2649,7 +2648,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // rjf: build symbol RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, &sym_thread_variables, sym_thread_variables_chunk_cap); - tvar->kind = RDIM_SymbolKind_ThreadVariable; tvar->name = name; tvar->type = type; tvar->is_extern = (kind == CV_SymKind_GTHREAD32); From c790ee3de023b9111b7497ce944582d722638d42 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 17 Feb 2024 08:44:55 -0800 Subject: [PATCH 086/275] fix reversed-order path building --- src/lib_raddbgi_make/raddbgi_make.c | 12 +++++++++++- src/lib_raddbgi_make/raddbgi_make.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index bf1597d7..560f4bf8 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -208,6 +208,16 @@ rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 stri list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; } +RDI_PROC void +rdim_str8_list_push_front(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string) +{ + RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1); + n->RDIM_String8Node_StringMember = string; + RDIM_SLLQueuePushFront_N(list->RDIM_String8List_FirstMember, list->RDIM_String8List_LastMember, n, RDIM_String8Node_NextPtrMember); + list->RDIM_String8List_NodeCountMember += 1; + list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; +} + RDI_PROC void rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align) { @@ -1053,7 +1063,7 @@ rdim_normal_string_from_bake_path_node(RDIM_Arena *arena, RDIM_BakePathNode *nod { if(n->name.size != 0) { - rdim_str8_list_push(scratch.arena, &list, n->name); + rdim_str8_list_push_front(scratch.arena, &list, n->name); } } RDIM_String8 result = rdim_str8_list_join(arena, &list, rdim_str8_lit("/")); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 45fcb703..d55dfe3d 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -988,6 +988,7 @@ RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatc //- rjf: string lists RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); +RDI_PROC void rdim_str8_list_push_front(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); RDI_PROC void rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align); RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep); From d0fe5b9e042bd296a0baf970f5f1ef314dc1e0ba Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 17 Feb 2024 10:36:07 -0800 Subject: [PATCH 087/275] raddbgi make: export scope voffs section --- src/lib_raddbgi_make/raddbgi_make.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 560f4bf8..6feb38eb 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2393,6 +2393,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) rdim_bake_section_list_push_new(arena, §ions, thread_variables, sizeof(RDI_ThreadVariable) * params->thread_variables.total_count, RDI_DataSectionTag_ThreadVariables); rdim_bake_section_list_push_new(arena, §ions, procedures, sizeof(RDI_Procedure) * params->procedures.total_count, RDI_DataSectionTag_Procedures); rdim_bake_section_list_push_new(arena, §ions, scopes, sizeof(RDI_Scope) * params->scopes.total_count, RDI_DataSectionTag_Scopes); + rdim_bake_section_list_push_new(arena, §ions, scope_voffs, sizeof(RDI_U64) * params->scopes.scope_voff_count, RDI_DataSectionTag_ScopeVoffData); rdim_bake_section_list_push_new(arena, §ions, scope_vmap.vmap, sizeof(RDI_U64) * (scope_vmap.count+1), RDI_DataSectionTag_ScopeVmap); rdim_bake_section_list_push_new(arena, §ions, locals, sizeof(RDI_Local) * params->scopes.local_count, RDI_DataSectionTag_Locals); rdim_bake_section_list_push_new(arena, §ions, location_blocks, sizeof(RDI_LocationBlock) * params->scopes.location_count, RDI_DataSectionTag_LocationBlocks); From e752eebfc9c26d0edbae81d1f795a708e8c21612 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 17 Feb 2024 10:50:56 -0800 Subject: [PATCH 088/275] fix itype conversion --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 36ef1135..cccf95d6 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -949,7 +949,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // U64 type_fwd_map_count = 0; CV_TypeId *type_fwd_map = 0; - CV_TypeId itype_first = 0; + CV_TypeId itype_first = tpi_leaf->itype_first; CV_TypeId itype_opl = tpi_leaf->itype_opl; ProfScope("types pass 1: produce type forward resolution map") { @@ -1059,9 +1059,9 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map - if(itype_fwd != 0 && itype_first <= itype_fwd && itype_fwd < itype_opl) + if(itype_fwd != 0 && itype_fwd < itype_opl) { - type_fwd_map[itype-itype_first] = itype_fwd; + type_fwd_map[itype] = itype_fwd; } } } @@ -1094,11 +1094,11 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_TypeChunkList extra_types = {0}; // extra constructed types, for types which don't correspond to the PDB ProfScope("types pass 2: construct all root/stub types from TPI") { - RDI_U64 itype_types_cap = (U64)(itype_opl-itype_first); + RDI_U64 itype_types_cap = (U64)(itype_opl); RDI_U64 extra_types_chunk_cap = 1024; rdim_type_chunk_list_push(arena, &itype_types, itype_types_cap); -#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) - for(CV_TypeId itype = itype_first+1; itype < itype_opl; itype += 1) +#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) + for(CV_TypeId itype = 0; itype < itype_opl; itype += 1) { RDIM_Type *dst_type = rdim_type_chunk_list_push(arena, &itype_types, itype_types_cap); B32 itype_is_basic = (itype < 0x1000); @@ -1113,7 +1113,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); // rjf: get basic type slot, fill if unfilled - RDIM_Type *basic_type = &itype_types.first->v[cv_basic_type_code-itype_first]; + RDIM_Type *basic_type = &itype_types.first->v[cv_basic_type_code]; if(basic_type->kind == RDI_TypeKind_NULL) { RDI_TypeKind type_kind = rdi_type_kind_from_cv_basic_type(cv_basic_type_code); @@ -1485,7 +1485,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ProfScope("types pass 3: attach cross-itype-relationship data to all types, build UDTs") { RDI_U64 udts_chunk_cap = 1024; -#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) +#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) for(P2R_TypeIdRevisitTask *task = first_itype_revisit_task; task != 0; task = task->next) { RDIM_Type *dst_type = task->base_type; @@ -2191,7 +2191,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_ScopeChunkList all_scopes = {0}; ProfScope("produce symbols from all sym streams") { -#define p2r_type_ptr_from_itype(itype) ((itype_first <= (itype) && (itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)-itype_first] ? type_fwd_map[(itype)-itype_first] : (itype))-itype_first]) : 0) +#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) //////////////////////////// //- rjf: produce array of all symbol streams From cfe089de8c8bc236646e032175de600818167c07 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 17 Feb 2024 12:31:15 -0800 Subject: [PATCH 089/275] eliminate forward reference parsing work in non-forward-reference cases --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 38 ++++++++++++++----------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index cccf95d6..f40e27d7 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -947,14 +947,12 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ////////////////////////////////////////////////////////////// //- rjf: types pass 1: produce type forward resolution map // - U64 type_fwd_map_count = 0; CV_TypeId *type_fwd_map = 0; CV_TypeId itype_first = tpi_leaf->itype_first; CV_TypeId itype_opl = tpi_leaf->itype_opl; ProfScope("types pass 1: produce type forward resolution map") { - type_fwd_map_count = (U64)itype_opl; - type_fwd_map = push_array(arena, CV_TypeId, type_fwd_map_count); + type_fwd_map = push_array(arena, CV_TypeId, (U64)itype_opl); for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) { //- rjf: determine if this itype resolves to another @@ -976,18 +974,21 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) case CV_LeafKind_CLASS: case CV_LeafKind_STRUCTURE: { - // rjf: unpack leaf + // rjf: unpack leaf header CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); // rjf: has fwd ref flag -> lookup itype that this itype resolves to if(lf_struct->props & CV_TypeProp_FwdRef) { + // rjf: unpack rest of leaf + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: lookup B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); @@ -998,18 +999,21 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) case CV_LeafKind_CLASS2: case CV_LeafKind_STRUCT2: { - // rjf: unpack leaf + // rjf: unpack leaf header CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); // rjf: has fwd ref flag -> lookup itype that this itype resolves to if(lf_struct->props & CV_TypeProp_FwdRef) { + // rjf: unpack rest of leaf + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: lookup B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); From b93bb5904afdd4b7b7a87497e30fe77a5e5a279d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 17 Feb 2024 17:14:11 -0800 Subject: [PATCH 090/275] more itype generation fixes --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index f40e27d7..38e0c6c8 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1100,7 +1100,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { RDI_U64 itype_types_cap = (U64)(itype_opl); RDI_U64 extra_types_chunk_cap = 1024; - rdim_type_chunk_list_push(arena, &itype_types, itype_types_cap); #define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) for(CV_TypeId itype = 0; itype < itype_opl; itype += 1) { @@ -1143,7 +1142,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ////////////////////////// //- rjf: build non-basic type // - if(!itype_is_basic) + if(!itype_is_basic && itype >= itype_first) { CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; CV_LeafKind kind = range->hdr.kind; @@ -2562,6 +2561,11 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_Reg cv_reg = regrel32->reg; U32 var_off = regrel32->reg_off; + if(str8_match(name, str8_lit("basics"), 0)) + { + int x = 0; + } + // rjf: determine if this is a parameter RDI_LocalKind local_kind = RDI_LocalKind_Variable; { From e44128de96825d0a67661e8f2975d1067d2fa968 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 17 Feb 2024 21:26:23 -0800 Subject: [PATCH 091/275] bugfix udt member parsing --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 38e0c6c8..e109e588 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1652,11 +1652,11 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); U8 *field_leaf_first = read_ptr+2; - U8 *field_leaf_opl = field_leaf_first+field_leaf_header_size; + U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; next_read_ptr = field_leaf_opl; // rjf: skip out-of-bounds fields - if(field_leaf_opl > field_list_opl) + if(field_leaf_first+field_leaf_header_size > field_list_opl) { continue; } @@ -2561,11 +2561,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_Reg cv_reg = regrel32->reg; U32 var_off = regrel32->reg_off; - if(str8_match(name, str8_lit("basics"), 0)) - { - int x = 0; - } - // rjf: determine if this is a parameter RDI_LocalKind local_kind = RDI_LocalKind_Variable; { From 694e9d27d68052301273c38f9daebdeb29799420 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Feb 2024 11:13:29 -0800 Subject: [PATCH 092/275] raddbgi_from_pdb: adjust itype -> type node building strategy; do initial pass of finding dependent itypes from a given itype, since those *must* be built first in order to comply with raddbgi's rule of type nodes only ever referencing earlier type nodes; then do a single itype build pass where you build all itypes by iterating their dependency chains --- src/codeview/codeview.mdesk | 2 +- src/df/gfx/df_gfx.c | 4 +- src/raddbg/raddbg.h | 1 + src/raddbgi_from_pdb/raddbgi_from_pdb.c | 1196 +++++++++++++---------- 4 files changed, 709 insertions(+), 494 deletions(-) diff --git a/src/codeview/codeview.mdesk b/src/codeview/codeview.mdesk index 1c10ebfe..e004557c 100644 --- a/src/codeview/codeview.mdesk +++ b/src/codeview/codeview.mdesk @@ -457,7 +457,7 @@ CV_BasicTypeTable: } //////////////////////////////// -//~ rjf: CV Leaf +//~ rjf: CV Leaf Kinds @table(name header_type_name val) CV_LeafKindTable: diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 4123f686..53537625 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6870,13 +6870,13 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(opt_member != 0) { U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, opt_member->type_key); - str8_list_pushf(arena, &list, "member (%I64u offset, %I64u byte%s)", opt_member->off, member_byte_size, member_byte_size > 1 ? "s" : ""); + str8_list_pushf(arena, &list, "member (%I64u offset, %I64u byte%s)", opt_member->off, member_byte_size, member_byte_size == 1 ? "s" : ""); } else { String8 basic_type_kind_string = tg_kind_basic_string_table[tg_kind_from_key(eval.type_key)]; U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval.type_key); - str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size > 1 ? "s" : ""); + str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size == 1 ? "s" : ""); } } diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 30ce9ea5..777c2b15 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -49,6 +49,7 @@ //////////////////////////////// //~ rjf: Hot, High Priority Tasks (Complete Unusability, Crashes, Fire-Worthy) // +// [ ] DBGI layer is case-sensitive even on case-insensitive systems // [ ] Jump table thunks, on code w/o /INCREMENTAL:NO // // [ ] ** Thread/process control bullet-proofing, including solo-step mode diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index e109e588..454fb413 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -938,15 +938,21 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) rec_range_count += unit_sym->sym_ranges.count; } symbol_count_prediction = rec_range_count/8; - if(symbol_count_prediction < 128) + if(symbol_count_prediction < 256) { - symbol_count_prediction = 128; + symbol_count_prediction = 256; } } ////////////////////////////////////////////////////////////// //- rjf: types pass 1: produce type forward resolution map // + // this map is used to resolve usage of "incomplete structs" in codeview's + // type info. this often happens when e.g. "struct Foo" is used to refer to + // a later-defined "Foo", which actually contains members and so on. we want + // to hook types up to their actual destination complete types wherever + // possible, and so this map can be used to do that in subsequent stages. + // CV_TypeId *type_fwd_map = 0; CV_TypeId itype_first = tpi_leaf->itype_first; CV_TypeId itype_opl = tpi_leaf->itype_opl; @@ -1071,18 +1077,259 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } ////////////////////////////////////////////////////////////// - //- rjf: types pass 2: construct all root/stub types from TPI + //- rjf: types pass 2: produce per-itype itype chain // - // this does NOT gather the following information, which is done by - // subsequent passes, as they all require full resolution of all itypes first - // (to allow for early itypes to reference later itypes): + // this pass is to ensure that subsequent passes always produce types for + // dependent itypes first - guaranteeing raddbgi's "only reference backward" + // rule (which eliminates cycles). each itype slot gets a list of itypes, + // starting with the deepest dependency - when types are produced per-itype, + // this chain is walked, so that deeper dependencies are built first, and + // as such, always show up *earlier* in the actually built types. // - // - function/method type parameters - // - modifier byte sizes - // - bitfield direct type byte sizes - // - struct/class/union members - // - array counts - // - direct type forward resolution + typedef struct P2R_TypeIdChain P2R_TypeIdChain; + struct P2R_TypeIdChain + { + P2R_TypeIdChain *next; + CV_TypeId itype; + }; + P2R_TypeIdChain **itype_chains = 0; + ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") + { + Temp scratch = scratch_begin(&arena, 1); + itype_chains = push_array(arena, P2R_TypeIdChain *, (U64)itype_opl); + for(CV_TypeId itype = 0; itype < itype_opl; itype += 1) + { + //- rjf: push initial itype - should be final-visited-itype for this itype + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = itype; + SLLStackPush(itype_chains[itype], c); + } + + //- rjf: skip basic types for dependency walk + if(itype < itype_first) + { + continue; + } + + //- rjf: walk dependent types, push to chain + P2R_TypeIdChain start_walk_task = {0, itype}; + P2R_TypeIdChain *first_walk_task = &start_walk_task; + P2R_TypeIdChain *last_walk_task = &start_walk_task; + for(P2R_TypeIdChain *walk_task = first_walk_task; + walk_task != 0; + walk_task = walk_task->next) + { + CV_TypeId walk_itype = type_fwd_map[walk_task->itype] ? type_fwd_map[walk_task->itype] : walk_task->itype; + if(walk_itype < itype_first) + { + continue; + } + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[walk_itype-itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: + { + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: POINTER + case CV_LeafKind_POINTER: + { + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: + { + CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: + { + CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLStackPush(itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: + { + CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: ARRAY + case CV_LeafKind_ARRAY: + { + CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLStackPush(itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + } + } + } + } + scratch_end(scratch); + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 3: construct all types from TPI + // + // this doesn't gather struct/class/union/enum members, which is done by + // subsequent passes, to build RADDBGI "UDT" information, which is distinct + // from regular type info. // typedef struct P2R_TypeIdRevisitTask P2R_TypeIdRevisitTask; struct P2R_TypeIdRevisitTask @@ -1094,401 +1341,468 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) }; P2R_TypeIdRevisitTask *first_itype_revisit_task = 0; P2R_TypeIdRevisitTask *last_itype_revisit_task = 0; - RDIM_TypeChunkList itype_types = {0}; // fixed chunk list for itypes - RDIM_TypeChunkList extra_types = {0}; // extra constructed types, for types which don't correspond to the PDB - ProfScope("types pass 2: construct all root/stub types from TPI") + RDIM_Type **itype_type_ptrs = 0; + RDIM_TypeChunkList all_types = {0}; +#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (itype_type_ptrs[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) + ProfScope("types pass 3: construct all root/stub types from TPI") { - RDI_U64 itype_types_cap = (U64)(itype_opl); - RDI_U64 extra_types_chunk_cap = 1024; -#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) - for(CV_TypeId itype = 0; itype < itype_opl; itype += 1) + itype_type_ptrs = push_array(arena, RDIM_Type *, (U64)(itype_opl)); + for(CV_TypeId root_itype = 0; root_itype < itype_opl; root_itype += 1) { - RDIM_Type *dst_type = rdim_type_chunk_list_push(arena, &itype_types, itype_types_cap); - B32 itype_is_basic = (itype < 0x1000); - - ////////////////////////// - //- rjf: build basic type - // - if(itype_is_basic) + for(P2R_TypeIdChain *itype_chain = itype_chains[root_itype]; + itype_chain != 0; + itype_chain = itype_chain->next) { - // rjf: unpack itype - CV_BasicPointerKind cv_basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); - CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); + CV_TypeId itype = (root_itype != itype_chain->itype && itype_chain->itype < itype_opl && type_fwd_map[itype_chain->itype]) ? type_fwd_map[itype_chain->itype] : itype_chain->itype; + B32 itype_is_basic = (itype < 0x1000); - // rjf: get basic type slot, fill if unfilled - RDIM_Type *basic_type = &itype_types.first->v[cv_basic_type_code]; - if(basic_type->kind == RDI_TypeKind_NULL) + ////////////////////////// + //- rjf: skip forward-reference itypes - all future resolutions will + // reference whatever this itype resolves to, and so there is no point + // in filling out this slot + // + if(type_fwd_map[root_itype] != 0) { - RDI_TypeKind type_kind = rdi_type_kind_from_cv_basic_type(cv_basic_type_code); - U32 byte_size = rdi_size_from_basic_type_kind(type_kind); - if(byte_size == 0xffffffff) + continue; + } + + ////////////////////////// + //- rjf: skip already produced dependencies + // + if(itype_type_ptrs[itype] != 0) + { + continue; + } + + ////////////////////////// + //- rjf: build basic type + // + if(itype_is_basic) + { + RDIM_Type *dst_type = 0; + + // rjf: unpack itype + CV_BasicPointerKind cv_basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); + CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); + + // rjf: get basic type slot, fill if unfilled + RDIM_Type *basic_type = itype_type_ptrs[cv_basic_type_code]; + if(basic_type == 0) { - byte_size = arch_addr_size; + RDI_TypeKind type_kind = rdi_type_kind_from_cv_basic_type(cv_basic_type_code); + U32 byte_size = rdi_size_from_basic_type_kind(type_kind); + basic_type = dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(byte_size == 0xffffffff) + { + byte_size = arch_addr_size; + } + basic_type->kind = type_kind; + basic_type->name = cv_type_name_from_basic_type(cv_basic_type_code); + basic_type->byte_size = byte_size; } - basic_type->kind = type_kind; - basic_type->name = cv_type_name_from_basic_type(cv_basic_type_code); - basic_type->byte_size = byte_size; + + // rjf: nonzero ptr kind -> form ptr type to basic tpye + if(cv_basic_ptr_kind != 0) + { + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Ptr; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = basic_type; + } + + // rjf: fill this itype's slot with the finished type + itype_type_ptrs[itype] = dst_type; } - // rjf: nonzero ptr kind -> form ptr type to basic tpye - if(cv_basic_ptr_kind != 0) + ////////////////////////// + //- rjf: build non-basic type + // + if(!itype_is_basic && itype >= itype_first) { - dst_type->kind = RDI_TypeKind_Ptr; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = basic_type; - } - } - - ////////////////////////// - //- rjf: build non-basic type - // - if(!itype_is_basic && itype >= itype_first) - { - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= tpi_leaf->data.size && - range->off+2+header_struct_size <= tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) + RDIM_Type *dst_type = 0; + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) { - //- rjf: MODIFIER - case CV_LeafKind_MODIFIER: + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) { - // rjf: unpack leaf - CV_LeafModifier *modifier = (CV_LeafModifier *)itype_leaf_first; - - // rjf: cv -> rdi flags - RDI_TypeModifierFlags flags = 0; - if(modifier->flags & CV_ModifierFlag_Const) {flags |= RDI_TypeModifierFlag_Const;} - if(modifier->flags & CV_ModifierFlag_Volatile) {flags |= RDI_TypeModifierFlag_Volatile;} - - // rjf: fill type - dst_type->kind = RDI_TypeKind_Modifier; - dst_type->flags = flags; - dst_type->direct_type = p2r_type_ptr_from_itype(modifier->itype); - }break; - - //- rjf: POINTER - case CV_LeafKind_POINTER: - { - // TODO(rjf): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead - - // rjf: unpack leaf - CV_LeafPointer *pointer = (CV_LeafPointer *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(pointer->itype); - CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(pointer->attribs); - CV_PointerMode ptr_mode = CV_PointerAttribs_ExtractMode(pointer->attribs); - U32 ptr_size = CV_PointerAttribs_ExtractSize(pointer->attribs); - - // rjf: cv -> rdi modifier flags - RDI_TypeModifierFlags modifier_flags = 0; - if(pointer->attribs & CV_PointerAttrib_Const) {modifier_flags |= RDI_TypeModifierFlag_Const;} - if(pointer->attribs & CV_PointerAttrib_Volatile) {modifier_flags |= RDI_TypeModifierFlag_Volatile;} - - // rjf: cv info -> rdi pointer type kind - RDI_TypeKind type_kind = RDI_TypeKind_Ptr; + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: { - if(pointer->attribs & CV_PointerAttrib_LRef) - { - type_kind = RDI_TypeKind_LRef; - } - else if(pointer->attribs & CV_PointerAttrib_RRef) - { - type_kind = RDI_TypeKind_RRef; - } - if(ptr_mode == CV_PointerMode_LRef) - { - type_kind = RDI_TypeKind_LRef; - } - else if(ptr_mode == CV_PointerMode_RRef) - { - type_kind = RDI_TypeKind_RRef; - } - } + // rjf: unpack leaf + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: cv -> rdi flags + RDI_TypeModifierFlags flags = 0; + if(lf->flags & CV_ModifierFlag_Const) {flags |= RDI_TypeModifierFlag_Const;} + if(lf->flags & CV_ModifierFlag_Volatile) {flags |= RDI_TypeModifierFlag_Volatile;} + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = flags; + dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype); + dst_type->byte_size = dst_type->direct_type ? dst_type->direct_type->byte_size : 0; + }break; - // rjf: fill type - if(modifier_flags != 0) + //- rjf: POINTER + case CV_LeafKind_POINTER: { - RDIM_Type *pointer_type = rdim_type_chunk_list_push(arena, &extra_types, extra_types_chunk_cap); - dst_type->kind = RDI_TypeKind_Modifier; - dst_type->flags = modifier_flags; - dst_type->direct_type = pointer_type; - pointer_type->kind = type_kind; - pointer_type->byte_size = arch_addr_size; - pointer_type->direct_type = direct_type; - } - else + // TODO(rjf): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead + + // rjf: unpack leaf + CV_LeafPointer *lf = (CV_LeafPointer *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); + CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(lf->attribs); + CV_PointerMode ptr_mode = CV_PointerAttribs_ExtractMode(lf->attribs); + U32 ptr_size = CV_PointerAttribs_ExtractSize(lf->attribs); + + // rjf: cv -> rdi modifier flags + RDI_TypeModifierFlags modifier_flags = 0; + if(lf->attribs & CV_PointerAttrib_Const) {modifier_flags |= RDI_TypeModifierFlag_Const;} + if(lf->attribs & CV_PointerAttrib_Volatile) {modifier_flags |= RDI_TypeModifierFlag_Volatile;} + + // rjf: cv info -> rdi pointer type kind + RDI_TypeKind type_kind = RDI_TypeKind_Ptr; + { + if(lf->attribs & CV_PointerAttrib_LRef) + { + type_kind = RDI_TypeKind_LRef; + } + else if(lf->attribs & CV_PointerAttrib_RRef) + { + type_kind = RDI_TypeKind_RRef; + } + if(ptr_mode == CV_PointerMode_LRef) + { + type_kind = RDI_TypeKind_LRef; + } + else if(ptr_mode == CV_PointerMode_RRef) + { + type_kind = RDI_TypeKind_RRef; + } + } + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(modifier_flags != 0) + { + RDIM_Type *pointer_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = modifier_flags; + dst_type->direct_type = pointer_type; + dst_type->byte_size = arch_addr_size; + pointer_type->kind = type_kind; + pointer_type->byte_size = arch_addr_size; + pointer_type->direct_type = direct_type; + } + else + { + dst_type->kind = type_kind; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = direct_type; + } + }break; + + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: { - dst_type->kind = type_kind; + // TODO(rjf): handle call_kind & attribs + + // rjf: unpack leaf + CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); + + // rjf: fill type's basics + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Function; dst_type->byte_size = arch_addr_size; + dst_type->direct_type = ret_type; + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: build param type array + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count); + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + params[idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + } + + // rjf: fill dst type + dst_type->count = arglist_itypes_count; + dst_type->param_types = params; + }break; + + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: + { + // TODO(rjf): handle call_kind & attribs + // TODO(rjf): preserve "this_adjust" + + // rjf: unpack leaf + CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; + RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = (lf->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = ret_type; + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: build param type array + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count+1); + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + params[idx+1] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + } + params[0] = p2r_type_ptr_from_itype(lf->this_itype); + + // rjf: fill dst type + dst_type->count = arglist_itypes_count+1; + dst_type->param_types = params; + }break; + + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: + { + // rjf: unpack leaf + CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Bitfield; + dst_type->off = lf->pos; + dst_type->count = lf->len; + dst_type->byte_size = direct_type?direct_type->byte_size:0; dst_type->direct_type = direct_type; - } + }break; - // rjf: push revisit task for full byte size of modifier type - if(modifier_flags != 0) + //- rjf: ARRAY + case CV_LeafKind_ARRAY: { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - } - }break; - - //- rjf: PROCEDURE - case CV_LeafKind_PROCEDURE: - { - // TODO(rjf): handle call_kind & attribs - - // rjf: unpack leaf - CV_LeafProcedure *procedure = (CV_LeafProcedure *)itype_leaf_first; - RDIM_Type *ret_type = p2r_type_ptr_from_itype(procedure->ret_itype); - - // rjf: fill type - dst_type->kind = RDI_TypeKind_Function; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = ret_type; - - // rjf: push revisit task for parameters - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = procedure->arg_itype; - }break; - - //- rjf: MFUNCTION - case CV_LeafKind_MFUNCTION: - { - // TODO(rjf): handle call_kind & attribs - // TODO(rjf): preserve "this_adjust" - - // rjf: unpack leaf - CV_LeafMFunction *mfunction = (CV_LeafMFunction *)itype_leaf_first; - RDIM_Type *ret_type = p2r_type_ptr_from_itype(mfunction->ret_itype); - - // rjf: fill type - dst_type->kind = (mfunction->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = ret_type; - - // rjf: push revisit task for parameters/this - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = mfunction->arg_itype; - t->this_itype = mfunction->this_itype; - }break; - - //- rjf: BITFIELD - case CV_LeafKind_BITFIELD: - { - // rjf: unpack leaf - CV_LeafBitField *bit_field = (CV_LeafBitField *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(bit_field->itype); - - // rjf: fill type - dst_type->kind = RDI_TypeKind_Bitfield; - dst_type->off = bit_field->pos; - dst_type->count = bit_field->len; - dst_type->direct_type = direct_type; - - // rjf: push revisit task for byte size - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - }break; - - //- rjf: ARRAY - case CV_LeafKind_ARRAY: - { - // rjf: unpack leaf - CV_LeafArray *array = (CV_LeafArray *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(array->entry_itype); - U8 *numeric_ptr = (U8*)(array + 1); - CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 full_size = cv_u64_from_numeric(&array_count); - - // rjf: fill type - dst_type->kind = RDI_TypeKind_Array; - dst_type->direct_type = direct_type; - dst_type->byte_size = full_size; - - // rjf: push revisit task for full count - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - }break; - - //- rjf: CLASS/STRUCTURE - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - if(lf_struct->props & CV_TypeProp_FwdRef) - { - dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); - dst_type->name = name; - } - else - { - dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct); - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - - // rjf: push revisit task for members - if(!(lf_struct->props & CV_TypeProp_FwdRef)) - { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = lf_struct->field_itype; - } - }break; - - //- rjf: CLASS2/STRUCT2 - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - if(lf_struct->props & CV_TypeProp_FwdRef) - { - dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); - dst_type->name = name; - } - else - { - dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct); - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - - // rjf: push revisit task for members - if(!(lf_struct->props & CV_TypeProp_FwdRef)) - { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = lf_struct->field_itype; - } - }break; - - //- rjf: UNION - case CV_LeafKind_UNION: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf_union + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - if(lf_union->props & CV_TypeProp_FwdRef) - { - dst_type->kind = RDI_TypeKind_IncompleteUnion; - dst_type->name = name; - } - else - { - dst_type->kind = RDI_TypeKind_Union; - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - - // rjf: push revisit task for members - if(!(lf_union->props & CV_TypeProp_FwdRef)) - { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = lf_union->field_itype; - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafEnum *lf_enum = (CV_LeafEnum *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf_enum->base_itype); - U8 *name_ptr = (U8 *)(lf_enum + 1); - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - if(lf_enum->props & CV_TypeProp_FwdRef) - { - dst_type->kind = RDI_TypeKind_IncompleteEnum; - dst_type->name = name; - } - else - { - dst_type->kind = RDI_TypeKind_Enum; + // rjf: unpack leaf + CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->entry_itype); + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 full_size = cv_u64_from_numeric(&array_count); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Array; dst_type->direct_type = direct_type; - dst_type->name = name; - } + dst_type->byte_size = full_size; + dst_type->count = (direct_type && direct_type->byte_size) ? (dst_type->byte_size/direct_type->byte_size) : 0; + }break; - // rjf: push revisit task for enumerates/size - if(!(lf_enum->props & CV_TypeProp_FwdRef)) + //- rjf: CLASS/STRUCTURE + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = lf_enum->field_itype; - } - }break; + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); + dst_type->name = name; + } + else + { + dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct); + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + + // rjf: push revisit task for members + if(!(lf->props & CV_TypeProp_FwdRef)) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = lf->field_itype; + } + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); + dst_type->name = name; + } + else + { + dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct); + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + + // rjf: push revisit task for members + if(!(lf->props & CV_TypeProp_FwdRef)) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = lf->field_itype; + } + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = RDI_TypeKind_IncompleteUnion; + dst_type->name = name; + } + else + { + dst_type->kind = RDI_TypeKind_Union; + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + + // rjf: push revisit task for members + if(!(lf->props & CV_TypeProp_FwdRef)) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = lf->field_itype; + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->base_itype); + U8 *name_ptr = (U8 *)(lf + 1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = RDI_TypeKind_IncompleteEnum; + dst_type->name = name; + } + else + { + dst_type->kind = RDI_TypeKind_Enum; + dst_type->direct_type = direct_type; + dst_type->name = name; + } + + // rjf: push revisit task for enumerates/size + if(!(lf->props & CV_TypeProp_FwdRef)) + { + P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); + SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); + t->base_type = dst_type; + t->field_itype = lf->field_itype; + } + }break; + } } + + //- rjf: store finalized type to this itype's slot + itype_type_ptrs[itype] = dst_type; } } } -#undef p2r_type_ptr_from_itype } ////////////////////////////////////////////////////////////// - //- rjf: types pass 3: attach cross-itype-relationship data to all types, build UDTs + //- rjf: types pass 4: build UDTs // - // given the root/stub types for all itypes, this pass takes care of the - // following extra pieces of per-type information: - // - // - function/method type parameters - // - modifier byte sizes - // - bitfield direct type byte sizes - // - struct/class/union members - // - array counts - // - direct type forward resolution - // - RDIM_UDTChunkList udts = {0}; - ProfScope("types pass 3: attach cross-itype-relationship data to all types, build UDTs") + RDIM_UDTChunkList all_udts = {0}; + ProfScope("types pass 4: build UDTs") { RDI_U64 udts_chunk_cap = 1024; -#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) for(P2R_TypeIdRevisitTask *task = first_itype_revisit_task; task != 0; task = task->next) { RDIM_Type *dst_type = task->base_type; @@ -1496,100 +1810,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { default:{}break; - //////////////////////// - //- rjf: bitfields/modifiers -> calculate byte size - // - case RDI_TypeKind_Bitfield: - case RDI_TypeKind_Modifier: - if(dst_type->direct_type != 0) - { - dst_type->byte_size = dst_type->direct_type->byte_size; - }break; - - //////////////////////// - //- rjf: functions -> equip parameters - // - case RDI_TypeKind_Function: - { - // rjf: unpack arglist range - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[task->field_itype-itype_first]; - if(range->hdr.kind != CV_LeafKind_ARGLIST || - range->hdr.size<2 || - range->off + range->hdr.size > tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = tpi_leaf->data.str + range->off + 2; - U8 *arglist_opl = arglist_first+range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: build param type array - RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count); - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - params[idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); - } - - // rjf: fill dst type - dst_type->count = arglist_itypes_count; - dst_type->param_types = params; - }break; - - //////////////////////// - //- rjf: methods -> equip this ptr + parameters - // - case RDI_TypeKind_Method: - { - // rjf: unpack arglist range - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[task->field_itype-itype_first]; - if(range->hdr.kind != CV_LeafKind_ARGLIST || - range->hdr.size<2 || - range->off + range->hdr.size > tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = tpi_leaf->data.str + range->off + 2; - U8 *arglist_opl = arglist_first+range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: build param type array - RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count+1); - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - params[idx+1] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); - } - params[0] = p2r_type_ptr_from_itype(task->this_itype); - - // rjf: fill dst type - dst_type->count = arglist_itypes_count+1; - dst_type->param_types = params; - }break; - - //////////////////////// - //- rjf: arrays -> calculate array count based on direct type size - // - case RDI_TypeKind_Array: - if(dst_type->direct_type != 0 && dst_type->direct_type->byte_size != 0) - { - dst_type->count = dst_type->byte_size/dst_type->direct_type->byte_size; - }break; - //////////////////////// //- rjf: structs/unions/classes -> equip members // @@ -1601,7 +1821,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_UDT *dst_udt = dst_type->udt; if(dst_udt == 0) { - dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, &udts, udts_chunk_cap); + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, &all_udts, udts_chunk_cap); dst_udt->self_type = dst_type; } @@ -1714,7 +1934,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_DataField; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -1735,7 +1955,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_StaticData; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -1812,14 +2032,14 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { default: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_Method; mem->name = name; mem->type = method_type; }break; case CV_MethodProp_Static: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_StaticMethod; mem->name = name; mem->type = method_type; @@ -1829,7 +2049,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_VirtualMethod; mem->name = name; mem->type = method_type; @@ -1867,7 +2087,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { default: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_Method; mem->name = name; mem->type = method_type; @@ -1875,7 +2095,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) case CV_MethodProp_Static: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_StaticMethod; mem->name = name; mem->type = method_type; @@ -1886,7 +2106,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_VirtualMethod; mem->name = name; mem->type = method_type; @@ -1906,7 +2126,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_NestedType; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -1926,7 +2146,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_NestedType; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -1947,7 +2167,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = offset_ptr+offset.encoded_size; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_Base; mem->type = p2r_type_ptr_from_itype(lf->itype); mem->off = (U32)offset64; @@ -1969,7 +2189,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &udts, dst_udt); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); mem->kind = RDI_MemberKind_VirtualBase; mem->type = p2r_type_ptr_from_itype(lf->itype); }break; @@ -1999,7 +2219,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_UDT *dst_udt = dst_type->udt; if(dst_udt == 0) { - dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, &udts, udts_chunk_cap); + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, &all_udts, udts_chunk_cap); dst_udt->self_type = dst_type; } @@ -2112,7 +2332,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, &udts, dst_udt); + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, &all_udts, dst_udt); enum_val->name = name; enum_val->val = val64; }break; @@ -2126,7 +2346,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) }break; } } -#undef p2r_type_ptr_from_itype } ////////////////////////////////////////////////////////////// @@ -2194,8 +2413,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_ScopeChunkList all_scopes = {0}; ProfScope("produce symbols from all sym streams") { -#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (&itype_types.first->v[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) - //////////////////////////// //- rjf: produce array of all symbol streams // @@ -2916,8 +3133,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) scratch_end(scratch); } - -#undef p2r_type_ptr_from_itype } ////////////////////////////////////////////////////////////// @@ -2928,9 +3143,8 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) out->top_level_info = top_level_info; out->binary_sections = binary_sections; out->units = units; - rdim_type_chunk_list_concat_in_place(&out->types, &itype_types); - rdim_type_chunk_list_concat_in_place(&out->types, &extra_types); - out->udts = udts; + out->types = all_types; + out->udts = all_udts; out->global_variables = all_global_variables; out->thread_variables = all_thread_variables; out->procedures = all_procedures; From f7f57a2c7addf9f9272422ba5f2d418b828966c6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Feb 2024 11:18:34 -0800 Subject: [PATCH 093/275] fix enumerate parsing --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 454fb413..566c7c52 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1774,10 +1774,11 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { dst_type->kind = RDI_TypeKind_Enum; dst_type->direct_type = direct_type; + dst_type->byte_size = direct_type ? direct_type->byte_size : 0; dst_type->name = name; } - // rjf: push revisit task for enumerates/size + // rjf: push revisit task for enumerates if(!(lf->props & CV_TypeProp_FwdRef)) { P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); @@ -2270,11 +2271,11 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); U8 *field_leaf_first = read_ptr+2; - U8 *field_leaf_opl = field_leaf_first+field_leaf_header_size; + U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; next_read_ptr = field_leaf_opl; // rjf: skip out-of-bounds fields - if(field_leaf_opl > field_list_opl) + if(field_leaf_first+field_leaf_header_size > field_list_opl) { continue; } From 29c21b43afe887dfa185db3537cff6a339ab14c7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Feb 2024 11:52:28 -0800 Subject: [PATCH 094/275] fix busted vmap section size --- src/lib_raddbgi_make/raddbgi_make.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 6feb38eb..0107cd2e 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2389,12 +2389,12 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDIM_ProfScope("push all symbol info sections") { rdim_bake_section_list_push_new(arena, §ions, global_variables, sizeof(RDI_GlobalVariable) * params->global_variables.total_count, RDI_DataSectionTag_GlobalVariables); - rdim_bake_section_list_push_new(arena, §ions, global_vmap.vmap, sizeof(RDI_U64) * (global_vmap.count+1), RDI_DataSectionTag_GlobalVmap); + rdim_bake_section_list_push_new(arena, §ions, global_vmap.vmap, sizeof(RDI_VMapEntry) * (global_vmap.count+1), RDI_DataSectionTag_GlobalVmap); rdim_bake_section_list_push_new(arena, §ions, thread_variables, sizeof(RDI_ThreadVariable) * params->thread_variables.total_count, RDI_DataSectionTag_ThreadVariables); rdim_bake_section_list_push_new(arena, §ions, procedures, sizeof(RDI_Procedure) * params->procedures.total_count, RDI_DataSectionTag_Procedures); rdim_bake_section_list_push_new(arena, §ions, scopes, sizeof(RDI_Scope) * params->scopes.total_count, RDI_DataSectionTag_Scopes); rdim_bake_section_list_push_new(arena, §ions, scope_voffs, sizeof(RDI_U64) * params->scopes.scope_voff_count, RDI_DataSectionTag_ScopeVoffData); - rdim_bake_section_list_push_new(arena, §ions, scope_vmap.vmap, sizeof(RDI_U64) * (scope_vmap.count+1), RDI_DataSectionTag_ScopeVmap); + rdim_bake_section_list_push_new(arena, §ions, scope_vmap.vmap, sizeof(RDI_VMapEntry) * (scope_vmap.count+1), RDI_DataSectionTag_ScopeVmap); rdim_bake_section_list_push_new(arena, §ions, locals, sizeof(RDI_Local) * params->scopes.local_count, RDI_DataSectionTag_Locals); rdim_bake_section_list_push_new(arena, §ions, location_blocks, sizeof(RDI_LocationBlock) * params->scopes.location_count, RDI_DataSectionTag_LocationBlocks); rdim_bake_section_list_push_new(arena, §ions, location_data_blob.str, location_data_blob.size, RDI_DataSectionTag_LocationData); From 5cd5503db1e961405204523237beb54f4a9b3014 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Feb 2024 12:13:42 -0800 Subject: [PATCH 095/275] raddbgi_make: adjust baking-phase bucket counts based on estimates from parameters --- src/lib_raddbgi_make/raddbgi_make.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 0107cd2e..c48a651a 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1402,17 +1402,16 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDIM_BakePathTree path_tree = {0}; RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; { - // TODO(rjf): adjust slots based on good estimates from params rdim_bake_section_list_push_new(arena, §ions, 0, 0, RDI_DataSectionTag_NULL); - strings.slots_count = 65536; + strings.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count); - idx_runs.slots_count = 65536; + idx_runs.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count); for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); k < RDI_NameMapKind_COUNT; k = (RDI_NameMapKind)(k+1)) { - name_maps[k].slots_count = 65536; + name_maps[k].slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; name_maps[k].slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, name_maps[k].slots_count); } RDIM_BakePathNode *nil_path = rdim_bake_path_node_from_string(arena, &path_tree, rdim_str8_lit("")); From 86ee3cb4b6d0ed6ab00a1f409897a22ccc826faa Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Feb 2024 14:42:13 -0800 Subject: [PATCH 096/275] raddbgi_from_pdb: multithread per-unit symbol conversion --- src/os/core/os_core.h | 1 + src/os/core/win32/os_core_win32.c | 9 + src/raddbgi_from_pdb/raddbgi_from_pdb.c | 1504 ++++++++++++----------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 49 + 4 files changed, 862 insertions(+), 701 deletions(-) diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h index 3ee15bd4..1edd321a 100644 --- a/src/os/core/os_core.h +++ b/src/os/core/os_core.h @@ -306,6 +306,7 @@ internal void os_process_release_handle(OS_Handle handle); //~ rjf: @os_hooks Threads (Implemented Per-OS) internal OS_Handle os_launch_thread(OS_ThreadFunctionType *func, void *ptr, void *params); +internal B32 os_thread_wait(OS_Handle handle, U64 endt_us); internal void os_release_thread_handle(OS_Handle thread); //////////////////////////////// diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index d0ced51b..aec356f8 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1233,6 +1233,15 @@ os_launch_thread(OS_ThreadFunctionType *func, void *ptr, void *params){ return(result); } +internal B32 +os_thread_wait(OS_Handle handle, U64 endt_us) +{ + DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us); + W32_Entity *entity = (W32_Entity *)PtrFromInt(handle.u64[0]); + DWORD wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); + return (wait_result == WAIT_OBJECT_0); +} + internal void os_release_thread_handle(OS_Handle thread){ W32_Entity *entity = (W32_Entity*)PtrFromInt(thread.u64[0]); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 566c7c52..21436fa7 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -539,6 +539,739 @@ p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDI } } +//////////////////////////////// +//~ rjf: Per-Unit Symbol Conversion Pass Thread Entry Point + +internal P2R_UnitSymbolConvertOut * +p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in) +{ + Temp scratch = scratch_begin(&arena, 1); +#define p2r_type_ptr_from_itype(itype) (((itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) + + ////////////////////////// + //- rjf: set up outputs for this sym stream + // + U64 sym_procedures_chunk_cap = 1024; + U64 sym_global_variables_chunk_cap = 1024; + U64 sym_thread_variables_chunk_cap = 1024; + U64 sym_scopes_chunk_cap = 1024; + RDIM_SymbolChunkList sym_procedures = {0}; + RDIM_SymbolChunkList sym_global_variables = {0}; + RDIM_SymbolChunkList sym_thread_variables = {0}; + RDIM_ScopeChunkList sym_scopes = {0}; + + ////////////////////////// + //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) + // + U64 procedure_frameprocs_count = 0; + U64 procedure_frameprocs_cap = in->sym->sym_ranges.count; + CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); + ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") + { + U64 procedure_num = 0; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + in->sym->sym_ranges.count; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = in->sym->data.str + sym_off_first; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind + switch(kind) + { + default:{}break; + + //- rjf: FRAMEPROC + case CV_SymKind_FRAMEPROC: + { + if(procedure_num == 0) { break; } + if(procedure_num > procedure_frameprocs_cap) { break; } + CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; + procedure_frameprocs[procedure_num-1] = frameproc; + procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + procedure_num += 1; + }break; + } + } + U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); + arena_put_back(scratch.arena, scratch_overkill); + } + + ////////////////////////// + //- rjf: symbols pass 2: construct all symbols, given procedure frame info map + // + ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") + { + RDIM_LocationSet *defrange_target = 0; + B32 defrange_target_is_param = 0; + U64 procedure_num = 0; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + in->sym->sym_ranges.count; + typedef struct P2R_ScopeNode P2R_ScopeNode; + struct P2R_ScopeNode + { + P2R_ScopeNode *next; + RDIM_Scope *scope; + }; + P2R_ScopeNode *top_scope_node = 0; + P2R_ScopeNode *free_scope_node = 0; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = in->sym->data.str + sym_off_first; + void *sym_data_opl = in->sym->data.str + sym_off_opl; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind + switch(kind) + { + default:{}break; + + //- rjf: END + case CV_SymKind_END: + { + P2R_ScopeNode *n = top_scope_node; + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } + defrange_target = 0; + defrange_target_is_param = 0; + }break; + + //- rjf: BLOCK32 + case CV_SymKind_BLOCK32: + { + // rjf: unpack sym + CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base; + + // rjf: build scope, insert into current parent scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + { + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[block32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + block32->off; + U64 voff_last = voff_first + block32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); + } + } + + // rjf: push this scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + }break; + + //- rjf: LDATA32/GDATA32 + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + // rjf: unpack sym + CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(data32+1, sym_data_opl); + COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[data32->sec-1] : 0; + U64 voff = (section ? section->voff : 0) + data32->off; + + // rjf: determine if this is an exact duplicate global + // + // PDB likes to have duplicates of these spread across different + // symbol streams so we deduplicate across the entire translation + // context. + // + B32 is_duplicate = 0; + { + // TODO(rjf): @important global symbol dedup + } + + // rjf: is not duplicate -> push new global + if(!is_duplicate) + { + // rjf: unpack global variable's type + RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); + + // rjf: unpack global's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack global's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build symbol + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, &sym_global_variables, sym_global_variables_chunk_cap); + symbol->is_extern = (kind == CV_SymKind_GDATA32); + symbol->name = name; + symbol->type = type; + symbol->offset = voff; + symbol->container_symbol = container_symbol; + symbol->container_type = container_type; + } + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + // rjf: unpack sym + CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(proc32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); + + // rjf: unpack proc's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack proc's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build procedure's root scope + // + // NOTE: even if there could be a containing scope at this point (which should be + // illegal in C/C++ but not necessarily in another language) we would not use + // it here because these scopes refer to the ranges of code that make up a + // procedure *not* the namespaces, so a procedure's root scope always has + // no parent. + RDIM_Scope *procedure_root_scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + { + COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[proc32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + proc32->off; + U64 voff_last = voff_first + proc32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, &sym_scopes, procedure_root_scope, voff_range); + } + } + + // rjf: root scope voff minimum range -> link name + String8 link_name = {0}; + if(procedure_root_scope->voff_ranges.min != 0) + { + U64 voff = procedure_root_scope->voff_ranges.min; + U64 hash = p2r_hash_from_voff(voff); + U64 bucket_idx = hash%in->link_name_map->buckets_count; + P2R_LinkNameNode *node = 0; + for(P2R_LinkNameNode *n = in->link_name_map->buckets[bucket_idx]; n != 0; n = n->next) + { + if(n->voff == voff) + { + link_name = n->name; + break; + } + } + } + + // rjf: build procedure symbol + RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, &sym_procedures, sym_procedures_chunk_cap); + procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); + procedure_symbol->name = name; + procedure_symbol->link_name = link_name; + procedure_symbol->type = type; + procedure_symbol->container_symbol = container_symbol; + procedure_symbol->container_type = container_type; + procedure_symbol->root_scope = procedure_root_scope; + + // rjf: fill root scope's symbol + procedure_root_scope->symbol = procedure_symbol; + + // rjf: push scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = procedure_root_scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: increment procedure counter + procedure_num += 1; + }break; + + //- rjf: REGREL32 + case CV_SymKind_REGREL32: + { + // TODO(rjf): apparently some of the information here may end up being + // redundant with "better" information from CV_SymKind_LOCAL record. + // we don't currently handle this, but if those cases arise then it + // will obviously be better to prefer the better information from both + // records. + + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); + CV_Reg cv_reg = regrel32->reg; + U32 var_off = regrel32->reg_off; + + // rjf: determine if this is a parameter + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + { + B32 is_stack_reg = 0; + switch(in->arch) + { + default:{}break; + case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP);}break; + case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP);}break; + } + if(is_stack_reg) + { + U32 frame_size = 0xFFFFFFFF; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; + frame_size = frameproc->frame_size; + } + if(var_off > frame_size) + { + local_kind = RDI_LocalKind_Parameter; + } + } + } + + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); + local->kind = local_kind; + local->name = name; + local->type = type; + + // rjf: add location info to local + { + // rjf: determine if we need an extra indirection to the value + B32 extra_indirection_to_value = 0; + switch(in->arch) + { + case RDI_Arch_X86: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))); + }break; + case RDI_Arch_X64: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); + }break; + } + + // rjf: get raddbg register code + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + // TODO(rjf): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // rjf: set location case + RDIM_Location *loc = p2r_location_from_addr_reg_off(arena, in->arch, register_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_set_push_case(arena, &sym_scopes, &local->locset, voff_range, loc); + } + }break; + + //- rjf: LTHREAD32/GTHREAD32 + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + { + // rjf: unpack sym + CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(thread32+1, sym_data_opl); + U32 tls_off = thread32->tls_off; + RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); + + // rjf: unpack thread variable's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack thread variable's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build symbol + RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, &sym_thread_variables, sym_thread_variables_chunk_cap); + tvar->name = name; + tvar->type = type; + tvar->is_extern = (kind == CV_SymKind_GTHREAD32); + tvar->offset = tls_off; + tvar->container_type = container_type; + tvar->container_symbol = container_symbol; + }break; + + //- rjf: LOCAL + case CV_SymKind_LOCAL: + { + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base; + String8 name = str8_cstring_capped(slocal+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); + + // rjf: determine if this symbol encodes the beginning of a global modification + B32 is_global_modification = 0; + if((slocal->flags & CV_LocalFlag_Global) || + (slocal->flags & CV_LocalFlag_Static)) + { + is_global_modification = 1; + } + + // rjf: is global modification -> emit global modification symbol + if(is_global_modification) + { + // TODO(rjf): add global modification symbols + defrange_target = 0; + defrange_target_is_param = 0; + } + + // rjf: is not a global modification -> emit a local variable + if(!is_global_modification) + { + // rjf: determine local kind + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + if(slocal->flags & CV_LocalFlag_Param) + { + local_kind = RDI_LocalKind_Parameter; + } + + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); + local->kind = local_kind; + local->name = name; + local->type = type; + + // rjf: save defrange target, for subsequent defrange symbols + defrange_target = &local->locset; + defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); + } + }break; + + //- rjf: DEFRANGE_REGISTESR + case CV_SymKind_DEFRANGE_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; + CV_Reg cv_reg = defrange_register->reg; + CV_LvarAddrRange *range = &defrange_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + + // rjf: build location + RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; + CV_LvarAddrRange *range = &defrange_fprel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: select frame pointer register + CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); + RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel->off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_SUBFIELD_REGISTER + case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; + CV_Reg cv_reg = defrange_subfield_register->reg; + CV_LvarAddrRange *range = &defrange_subfield_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + + // rjf: skip "subfield" location info - currently not supported + if(defrange_subfield_register->field_offset != 0) + { + break; + } + + // rjf: build location + RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; + CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); + RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel_full_scope->off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit location over ranges + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_set_push_case(arena, &sym_scopes, defrange_target, voff_range, location); + }break; + + //- rjf: DEFRANGE_REGISTER_REL + case CV_SymKind_DEFRANGE_REGISTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; + CV_Reg cv_reg = defrange_register_rel->reg; + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + CV_LvarAddrRange *range = &defrange_register_rel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: build location + // TODO(rjf): offset & size from cv_reg code + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + B32 extra_indirection_to_value = 0; + S64 var_off = defrange_register_rel->reg_off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, register_code, byte_size, byte_pos, var_off, extra_indirection_to_value); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: FILESTATIC + case CV_SymKind_FILESTATIC: + { + CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; + String8 name = str8_cstring_capped(file_static+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); + // TODO(rjf): emit a global modifier symbol + defrange_target = 0; + defrange_target_is_param = 0; + }break; + } + } + } + + ////////////////////////// + //- rjf: allocate & fill output + // + P2R_UnitSymbolConvertOut *out = push_array(arena, P2R_UnitSymbolConvertOut, 1); + { + out->procedures = sym_procedures; + out->global_variables = sym_global_variables; + out->thread_variables = sym_thread_variables; + out->scopes = sym_scopes; + } + +#undef p2r_type_ptr_from_itype + scratch_end(scratch); + return out; +} + +internal void +p2r_unit_symbol_convert_task_thread__entry_point(void *p) +{ + TCTX tctx_; + tctx_init_and_equip(&tctx_); + P2R_UnitSymbolTaskBatch *batch = (P2R_UnitSymbolTaskBatch *)p; + ThreadName("[p2r] unit symbol thread"); + for(;;) + { + U64 next_task_num = ins_atomic_u64_inc_eval(batch->num_tasks_taken_ptr); + if(next_task_num > batch->tasks_count || 1 > next_task_num) + { + break; + } + P2R_UnitSymbolTask *task = &batch->tasks[next_task_num-1]; + ProfScope("convert") + { + task->convert_out = p2r_unit_symbol_convert(task->out_arena, &task->convert_in); + } + } +} + //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point @@ -2415,724 +3148,93 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ProfScope("produce symbols from all sym streams") { //////////////////////////// - //- rjf: produce array of all symbol streams + //- rjf: produce per-task info // - U64 syms_count = 1 + comp_unit_count; - CV_SymParsed **syms = push_array(scratch.arena, CV_SymParsed *, syms_count); + U64 tasks_count = 1+comp_unit_count; + P2R_UnitSymbolTask *tasks = push_array(scratch.arena, P2R_UnitSymbolTask, tasks_count); { - syms[0] = sym; - for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) + tasks[0].convert_in.sym = sym; + for(U64 idx = 0; idx < tasks_count; idx += 1) { - syms[comp_unit_idx+1] = sym_for_unit[comp_unit_idx]; + tasks[idx].convert_in.arch = arch; + tasks[idx].convert_in.coff_sections = coff_sections; + tasks[idx].convert_in.tpi_hash = tpi_hash; + tasks[idx].convert_in.tpi_leaf = tpi_leaf; + tasks[idx].convert_in.itype_fwd_map = type_fwd_map; + tasks[idx].convert_in.itype_type_ptrs = itype_type_ptrs; + tasks[idx].convert_in.link_name_map = &link_name_map; + tasks[idx].out_arena = arena_alloc(); + if(idx > 0) + { + tasks[idx].convert_in.sym = sym_for_unit[idx-1]; + } } } //////////////////////////// - //- rjf: produce symbols + //- rjf: produce task batch info // - for(U64 sym_idx = 0; sym_idx < syms_count; sym_idx += 1) + U64 num_tasks_taken = 0; + P2R_UnitSymbolTaskBatch task_batch = {0}; { - CV_SymParsed *sym = syms[sym_idx]; - Temp scratch = scratch_begin(&arena, 1); - - ////////////////////////// - //- rjf: set up outputs for this sym stream - // - RDIM_SymbolChunkList sym_procedures = {0}; - RDIM_SymbolChunkList sym_global_variables = {0}; - RDIM_SymbolChunkList sym_thread_variables = {0}; - RDIM_ScopeChunkList sym_scopes = {0}; - U64 sym_procedures_chunk_cap = 1024; - U64 sym_global_variables_chunk_cap = 1024; - U64 sym_thread_variables_chunk_cap = 1024; - U64 sym_scopes_chunk_cap = 1024; - - ////////////////////////// - //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) - // - U64 procedure_frameprocs_count = 0; - U64 procedure_frameprocs_cap = sym->sym_ranges.count; - CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); - ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") + task_batch.tasks = tasks; + task_batch.tasks_count = tasks_count; + task_batch.num_tasks_taken_ptr = &num_tasks_taken; + } + + //////////////////////////// + //- rjf: launch task threads + // + U64 task_threads_count = os_logical_core_count()-1; + OS_Handle *task_threads = push_array(scratch.arena, OS_Handle, task_threads_count); + for(U64 idx = 0; idx < task_threads_count; idx += 1) + { + task_threads[idx] = os_launch_thread(p2r_unit_symbol_convert_task_thread__entry_point, &task_batch, 0); + } + + //////////////////////////// + //- rjf: perform tasks on the main thread + // + ProfScope("perform tasks on the main thread") + { + for(;;) { - U64 procedure_num = 0; - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) + U64 next_task_num = ins_atomic_u64_inc_eval(task_batch.num_tasks_taken_ptr); + if(next_task_num > task_batch.tasks_count || 1 > next_task_num) { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = sym->data.str + sym_off_first; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) - { - default:{}break; - - //- rjf: FRAMEPROC - case CV_SymKind_FRAMEPROC: - { - if(procedure_num == 0) { break; } - if(procedure_num > procedure_frameprocs_cap) { break; } - CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; - procedure_frameprocs[procedure_num-1] = frameproc; - procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - procedure_num += 1; - }break; - } + break; } - U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); - arena_put_back(scratch.arena, scratch_overkill); - } - - ////////////////////////// - //- rjf: symbols pass 2: construct all symbols, given procedure frame info map - // - ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") - { - RDIM_LocationSet *defrange_target = 0; - B32 defrange_target_is_param = 0; - U64 procedure_num = 0; - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; - typedef struct P2R_ScopeNode P2R_ScopeNode; - struct P2R_ScopeNode + P2R_UnitSymbolTask *task = &task_batch.tasks[next_task_num-1]; + ProfScope("convert") { - P2R_ScopeNode *next; - RDIM_Scope *scope; - }; - P2R_ScopeNode *top_scope_node = 0; - P2R_ScopeNode *free_scope_node = 0; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = sym->data.str + sym_off_first; - void *sym_data_opl = sym->data.str + sym_off_opl; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) - { - default:{}break; - - //- rjf: END - case CV_SymKind_END: - { - P2R_ScopeNode *n = top_scope_node; - if(n != 0) - { - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); - } - defrange_target = 0; - defrange_target_is_param = 0; - }break; - - //- rjf: BLOCK32 - case CV_SymKind_BLOCK32: - { - // rjf: unpack sym - CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base; - - // rjf: build scope, insert into current parent scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); - { - if(top_scope_node == 0) - { - // TODO(rjf): log - } - if(top_scope_node != 0) - { - RDIM_Scope *top_scope = top_scope_node->scope; - SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); - scope->parent_scope = top_scope; - scope->symbol = top_scope->symbol; - } - COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= coff_sections->count) ? &coff_sections->sections[block32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + block32->off; - U64 voff_last = voff_first + block32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); - } - } - - // rjf: push this scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = scope; - SLLStackPush(top_scope_node, node); - } - }break; - - //- rjf: LDATA32/GDATA32 - case CV_SymKind_LDATA32: - case CV_SymKind_GDATA32: - { - // rjf: unpack sym - CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(data32+1, sym_data_opl); - COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= coff_sections->count) ? &coff_sections->sections[data32->sec-1] : 0; - U64 voff = (section ? section->voff : 0) + data32->off; - - // rjf: determine if this is an exact duplicate global - // - // PDB likes to have duplicates of these spread across different - // symbol streams so we deduplicate across the entire translation - // context. - // - B32 is_duplicate = 0; - { - // TODO(rjf): @important global symbol dedup - } - - // rjf: is not duplicate -> push new global - if(!is_duplicate) - { - // rjf: unpack global variable's type - RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); - - // rjf: unpack global's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack global's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build symbol - RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, &sym_global_variables, sym_global_variables_chunk_cap); - symbol->is_extern = (kind == CV_SymKind_GDATA32); - symbol->name = name; - symbol->type = type; - symbol->offset = voff; - symbol->container_symbol = container_symbol; - symbol->container_type = container_type; - } - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - // rjf: unpack sym - CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(proc32+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); - - // rjf: unpack proc's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack proc's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build procedure's root scope - // - // NOTE: even if there could be a containing scope at this point (which should be - // illegal in C/C++ but not necessarily in another language) we would not use - // it here because these scopes refer to the ranges of code that make up a - // procedure *not* the namespaces, so a procedure's root scope always has - // no parent. - RDIM_Scope *procedure_root_scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); - { - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections->count) ? &coff_sections->sections[proc32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + proc32->off; - U64 voff_last = voff_first + proc32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, &sym_scopes, procedure_root_scope, voff_range); - } - } - - // rjf: root scope voff minimum range -> link name - String8 link_name = {0}; - if(procedure_root_scope->voff_ranges.min != 0) - { - U64 voff = procedure_root_scope->voff_ranges.min; - U64 hash = p2r_hash_from_voff(voff); - U64 bucket_idx = hash%link_name_map.buckets_count; - P2R_LinkNameNode *node = 0; - for(P2R_LinkNameNode *n = link_name_map.buckets[bucket_idx]; n != 0; n = n->next) - { - if(n->voff == voff) - { - link_name = n->name; - break; - } - } - } - - // rjf: build procedure symbol - RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, &sym_procedures, sym_procedures_chunk_cap); - procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); - procedure_symbol->name = name; - procedure_symbol->link_name = link_name; - procedure_symbol->type = type; - procedure_symbol->container_symbol = container_symbol; - procedure_symbol->container_type = container_type; - procedure_symbol->root_scope = procedure_root_scope; - - // rjf: fill root scope's symbol - procedure_root_scope->symbol = procedure_symbol; - - // rjf: push scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = procedure_root_scope; - SLLStackPush(top_scope_node, node); - } - - // rjf: increment procedure counter - procedure_num += 1; - }break; - - //- rjf: REGREL32 - case CV_SymKind_REGREL32: - { - // TODO(rjf): apparently some of the information here may end up being - // redundant with "better" information from CV_SymKind_LOCAL record. - // we don't currently handle this, but if those cases arise then it - // will obviously be better to prefer the better information from both - // records. - - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); - CV_Reg cv_reg = regrel32->reg; - U32 var_off = regrel32->reg_off; - - // rjf: determine if this is a parameter - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - { - B32 is_stack_reg = 0; - switch(arch) - { - default:{}break; - case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP);}break; - case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP);}break; - } - if(is_stack_reg) - { - U32 frame_size = 0xFFFFFFFF; - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) - { - CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; - frame_size = frameproc->frame_size; - } - if(var_off > frame_size) - { - local_kind = RDI_LocalKind_Parameter; - } - } - } - - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; - - // rjf: add location info to local - { - // rjf: determine if we need an extra indirection to the value - B32 extra_indirection_to_value = 0; - switch(arch) - { - case RDI_Arch_X86: - { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))); - }break; - case RDI_Arch_X64: - { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); - }break; - } - - // rjf: get raddbg register code - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); - // TODO(rjf): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; - - // rjf: set location case - RDIM_Location *loc = p2r_location_from_addr_reg_off(arena, arch, register_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_set_push_case(arena, &sym_scopes, &local->locset, voff_range, loc); - } - }break; - - //- rjf: LTHREAD32/GTHREAD32 - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - { - // rjf: unpack sym - CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(thread32+1, sym_data_opl); - U32 tls_off = thread32->tls_off; - RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); - - // rjf: unpack thread variable's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack thread variable's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build symbol - RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, &sym_thread_variables, sym_thread_variables_chunk_cap); - tvar->name = name; - tvar->type = type; - tvar->is_extern = (kind == CV_SymKind_GTHREAD32); - tvar->offset = tls_off; - tvar->container_type = container_type; - tvar->container_symbol = container_symbol; - }break; - - //- rjf: LOCAL - case CV_SymKind_LOCAL: - { - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base; - String8 name = str8_cstring_capped(slocal+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); - - // rjf: determine if this symbol encodes the beginning of a global modification - B32 is_global_modification = 0; - if((slocal->flags & CV_LocalFlag_Global) || - (slocal->flags & CV_LocalFlag_Static)) - { - is_global_modification = 1; - } - - // rjf: is global modification -> emit global modification symbol - if(is_global_modification) - { - // TODO(rjf): add global modification symbols - defrange_target = 0; - defrange_target_is_param = 0; - } - - // rjf: is not a global modification -> emit a local variable - if(!is_global_modification) - { - // rjf: determine local kind - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - if(slocal->flags & CV_LocalFlag_Param) - { - local_kind = RDI_LocalKind_Parameter; - } - - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; - - // rjf: save defrange target, for subsequent defrange symbols - defrange_target = &local->locset; - defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); - } - }break; - - //- rjf: DEFRANGE_REGISTESR - case CV_SymKind_DEFRANGE_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; - CV_Reg cv_reg = defrange_register->reg; - CV_LvarAddrRange *range = &defrange_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections->count) ? &coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); - - // rjf: build location - RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; - CV_LvarAddrRange *range = &defrange_fprel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections->count) ? &coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); - RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = arch_addr_size; - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel->off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_SUBFIELD_REGISTER - case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; - CV_Reg cv_reg = defrange_subfield_register->reg; - CV_LvarAddrRange *range = &defrange_subfield_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections->count) ? &coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); - - // rjf: skip "subfield" location info - currently not supported - if(defrange_subfield_register->field_offset != 0) - { - break; - } - - // rjf: build location - RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; - CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); - RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = arch_addr_size; - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel_full_scope->off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit location over ranges - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_set_push_case(arena, &sym_scopes, defrange_target, voff_range, location); - }break; - - //- rjf: DEFRANGE_REGISTER_REL - case CV_SymKind_DEFRANGE_REGISTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; - CV_Reg cv_reg = defrange_register_rel->reg; - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(arch, cv_reg); - CV_LvarAddrRange *range = &defrange_register_rel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections->count) ? &coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: build location - // TODO(rjf): offset & size from cv_reg code - U32 byte_size = arch_addr_size; - U32 byte_pos = 0; - B32 extra_indirection_to_value = 0; - S64 var_off = defrange_register_rel->reg_off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, register_code, byte_size, byte_pos, var_off, extra_indirection_to_value); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: FILESTATIC - case CV_SymKind_FILESTATIC: - { - CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; - String8 name = str8_cstring_capped(file_static+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); - // TODO(rjf): emit a global modifier symbol - defrange_target = 0; - defrange_target_is_param = 0; - }break; - } + task->convert_out = p2r_unit_symbol_convert(task->out_arena, &task->convert_in); } } - - ////////////////////////// - //- rjf: merge this stream's outputs with collated list - // - ProfScope("merge this stream's outputs with collated list") + } + + //////////////////////////// + //- rjf: wait for task threads + // + ProfScope("wait for task threads") + { + for(U64 idx = 0; idx < task_threads_count; idx += 1) { - rdim_symbol_chunk_list_concat_in_place(&all_procedures, &sym_procedures); - rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &sym_global_variables); - rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &sym_thread_variables); - rdim_scope_chunk_list_concat_in_place(&all_scopes, &sym_scopes); + os_thread_wait(task_threads[idx], max_U64); + } + } + + //////////////////////////// + //- rjf: merge artifacts from all tasks + // + ProfScope("merge artifacts from all tasks") + { + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + rdim_symbol_chunk_list_concat_in_place(&all_procedures, &tasks[idx].convert_out->procedures); + rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &tasks[idx].convert_out->global_variables); + rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &tasks[idx].convert_out->thread_variables); + rdim_scope_chunk_list_concat_in_place(&all_scopes, &tasks[idx].convert_out->scopes); } - - scratch_end(scratch); } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 1cb9f460..b4c318e4 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -75,6 +75,49 @@ struct P2R_LinkNameMap U64 link_name_count; }; +//- rjf: per-unit symbol conversion + +typedef struct P2R_UnitSymbolConvertIn P2R_UnitSymbolConvertIn; +struct P2R_UnitSymbolConvertIn +{ + RDI_Arch arch; + PDB_CoffSectionArray *coff_sections; + PDB_TpiHashParsed *tpi_hash; + CV_LeafParsed *tpi_leaf; + CV_SymParsed *sym; + CV_TypeId *itype_fwd_map; + RDIM_Type **itype_type_ptrs; + P2R_LinkNameMap *link_name_map; +}; + +typedef struct P2R_UnitSymbolConvertOut P2R_UnitSymbolConvertOut; +struct P2R_UnitSymbolConvertOut +{ + RDIM_SymbolChunkList procedures; + RDIM_SymbolChunkList global_variables; + RDIM_SymbolChunkList thread_variables; + RDIM_ScopeChunkList scopes; +}; + +typedef struct P2R_UnitSymbolTask P2R_UnitSymbolTask; +struct P2R_UnitSymbolTask +{ + // rjf: inputs + P2R_UnitSymbolConvertIn convert_in; + + // rjf: outputs + Arena *out_arena; + P2R_UnitSymbolConvertOut *convert_out; +}; + +typedef struct P2R_UnitSymbolTaskBatch P2R_UnitSymbolTaskBatch; +struct P2R_UnitSymbolTaskBatch +{ + P2R_UnitSymbolTask *tasks; + U64 tasks_count; + U64 *num_tasks_taken_ptr; +}; + //////////////////////////////// //~ rjf: Basic Helpers @@ -108,6 +151,12 @@ internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, C internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); +//////////////////////////////// +//~ rjf: Per-Unit Symbol Conversion Pass Thread Entry Point + +internal P2R_UnitSymbolConvertOut *p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in); +internal void p2r_unit_symbol_convert_task_thread__entry_point(void *p); + //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point From 83696370269ac4c77414dd391ed7ae270a796109 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Feb 2024 15:07:25 -0800 Subject: [PATCH 097/275] raddbgi_from_pdb: multithread itype forward resolution map building --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 329 +++++++++++++++--------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 33 ++- 2 files changed, 244 insertions(+), 118 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 21436fa7..d28214bb 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -539,6 +539,151 @@ p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDI } } +//////////////////////////////// +//~ rjf: Type Forward Resolution Map Build / Thread + +internal void +p2r_itype_fwd_map_fill(P2R_ITypeFwdMapFillIn *in) +{ + for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) + { + //- rjf: determine if this itype resolves to another + CV_TypeId itype_fwd = 0; + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[itype-in->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= in->tpi_leaf->data.size && + range->off+2+header_struct_size <= in->tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: CLASS/STRUCTURE + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + // rjf: unpack leaf header + CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_struct->props & CV_TypeProp_FwdRef) + { + // rjf: unpack rest of leaf + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: lookup + B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && + ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + // rjf: unpack leaf header + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_struct->props & CV_TypeProp_FwdRef) + { + // rjf: unpack rest of leaf + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: lookup + B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && + ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + // rjf: unpack leaf + CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_union + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves tos + if(lf_union->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_union->props & CV_TypeProp_Scoped) != 0) && + ((lf_union->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + // rjf: unpack leaf + CV_LeafEnum *lf_enum = (CV_LeafEnum*)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf_enum + 1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_enum->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_enum->props & CV_TypeProp_Scoped) != 0) && + ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + } + } + + //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map + if(itype_fwd != 0 && itype_fwd < in->tpi_leaf->itype_opl) + { + in->itype_fwd_map[itype-in->itype_first] = itype_fwd; + } + } +} + +internal void +p2r_itype_fwd_map_fill_task_thread__entry_point(void *p) +{ + TCTX tctx_; + tctx_init_and_equip(&tctx_); + P2R_ITypeFwdMapFillTaskBatch *batch = (P2R_ITypeFwdMapFillTaskBatch *)p; + ThreadName("[p2r] itype fwd map fill thread"); + for(;;) + { + U64 next_task_num = ins_atomic_u64_inc_eval(batch->num_tasks_taken_ptr); + if(next_task_num > batch->tasks_count || 1 > next_task_num) + { + break; + } + P2R_ITypeFwdMapFillTask *task = &batch->tasks[next_task_num-1]; + ProfScope("convert (task #%I64u)", next_task_num) + { + p2r_itype_fwd_map_fill(&task->fill_in); + } + } +} + //////////////////////////////// //~ rjf: Per-Unit Symbol Conversion Pass Thread Entry Point @@ -1265,7 +1410,7 @@ p2r_unit_symbol_convert_task_thread__entry_point(void *p) break; } P2R_UnitSymbolTask *task = &batch->tasks[next_task_num-1]; - ProfScope("convert") + ProfScope("convert (task #%I64u)", next_task_num) { task->convert_out = p2r_unit_symbol_convert(task->out_arena, &task->convert_in); } @@ -1686,125 +1831,75 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // to hook types up to their actual destination complete types wherever // possible, and so this map can be used to do that in subsequent stages. // - CV_TypeId *type_fwd_map = 0; + CV_TypeId *itype_fwd_map = 0; CV_TypeId itype_first = tpi_leaf->itype_first; - CV_TypeId itype_opl = tpi_leaf->itype_opl; + CV_TypeId itype_opl = tpi_leaf->itype_opl; ProfScope("types pass 1: produce type forward resolution map") { - type_fwd_map = push_array(arena, CV_TypeId, (U64)itype_opl); - for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) + //////////////////////////// + //- rjf: allocate forward resolution map + // + itype_fwd_map = push_array(arena, CV_TypeId, (U64)itype_opl); + + //////////////////////////// + //- rjf: produce task batch + // + U64 num_tasks_taken = 0; + P2R_ITypeFwdMapFillTaskBatch task_batch = {0}; { - //- rjf: determine if this itype resolves to another - CV_TypeId itype_fwd = 0; - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= tpi_leaf->data.size && - range->off+2+header_struct_size <= tpi_leaf->data.size && - range->hdr.size >= 2) + U64 task_size_itypes = 4096; + task_batch.tasks_count = (U64)itype_opl/task_size_itypes; + task_batch.tasks = push_array(scratch.arena, P2R_ITypeFwdMapFillTask, task_batch.tasks_count); + task_batch.num_tasks_taken_ptr = &num_tasks_taken; + for(U64 task_idx = 0; task_idx < task_batch.tasks_count; task_idx += 1) { - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) + P2R_ITypeFwdMapFillTask *task = &task_batch.tasks[task_idx]; + task->fill_in.tpi_hash = tpi_hash; + task->fill_in.tpi_leaf = tpi_leaf; + task->fill_in.itype_first = task_idx*task_size_itypes; + task->fill_in.itype_opl = task->fill_in.itype_first + task_size_itypes; + task->fill_in.itype_fwd_map = itype_fwd_map; + } + } + + //////////////////////////// + //- rjf: launch task threads + // + U64 task_threads_count = os_logical_core_count()-1; + OS_Handle *task_threads = push_array(scratch.arena, OS_Handle, task_threads_count); + for(U64 idx = 0; idx < task_threads_count; idx += 1) + { + task_threads[idx] = os_launch_thread(p2r_itype_fwd_map_fill_task_thread__entry_point, &task_batch, 0); + } + + //////////////////////////// + //- rjf: perform tasks on the main thread + // + ProfScope("perform tasks on the main thread") + { + for(;;) + { + U64 next_task_num = ins_atomic_u64_inc_eval(task_batch.num_tasks_taken_ptr); + if(next_task_num > task_batch.tasks_count || 1 > next_task_num) { - default:{}break; - - //- rjf: CLASS/STRUCTURE - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - // rjf: unpack leaf header - CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_struct->props & CV_TypeProp_FwdRef) - { - // rjf: unpack rest of leaf - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: lookup - B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && - ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: CLASS2/STRUCT2 - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - // rjf: unpack leaf header - CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_struct->props & CV_TypeProp_FwdRef) - { - // rjf: unpack rest of leaf - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: lookup - B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && - ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: UNION - case CV_LeafKind_UNION: - { - // rjf: unpack leaf - CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; - U8 *numeric_ptr = (U8 *)(lf_union + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: has fwd ref flag -> lookup itype that this itype resolves tos - if(lf_union->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = (((lf_union->props & CV_TypeProp_Scoped) != 0) && - ((lf_union->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - // rjf: unpack leaf - CV_LeafEnum *lf_enum = (CV_LeafEnum*)itype_leaf_first; - U8 *name_ptr = (U8 *)(lf_enum + 1); - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_enum->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = (((lf_enum->props & CV_TypeProp_Scoped) != 0) && - ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; + break; + } + P2R_ITypeFwdMapFillTask *task = &task_batch.tasks[next_task_num-1]; + ProfScope("convert (task #%I64u)", next_task_num) + { + p2r_itype_fwd_map_fill(&task->fill_in); } } - - //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map - if(itype_fwd != 0 && itype_fwd < itype_opl) + } + + //////////////////////////// + //- rjf: wait for task threads + // + ProfScope("wait for task threads") + { + for(U64 idx = 0; idx < task_threads_count; idx += 1) { - type_fwd_map[itype] = itype_fwd; + os_thread_wait(task_threads[idx], max_U64); } } } @@ -1853,7 +1948,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) walk_task != 0; walk_task = walk_task->next) { - CV_TypeId walk_itype = type_fwd_map[walk_task->itype] ? type_fwd_map[walk_task->itype] : walk_task->itype; + CV_TypeId walk_itype = itype_fwd_map[walk_task->itype] ? itype_fwd_map[walk_task->itype] : walk_task->itype; if(walk_itype < itype_first) { continue; @@ -2076,7 +2171,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) P2R_TypeIdRevisitTask *last_itype_revisit_task = 0; RDIM_Type **itype_type_ptrs = 0; RDIM_TypeChunkList all_types = {0}; -#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (itype_type_ptrs[(type_fwd_map[(itype)] ? type_fwd_map[(itype)] : (itype))]) : 0) +#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) ProfScope("types pass 3: construct all root/stub types from TPI") { itype_type_ptrs = push_array(arena, RDIM_Type *, (U64)(itype_opl)); @@ -2086,7 +2181,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) itype_chain != 0; itype_chain = itype_chain->next) { - CV_TypeId itype = (root_itype != itype_chain->itype && itype_chain->itype < itype_opl && type_fwd_map[itype_chain->itype]) ? type_fwd_map[itype_chain->itype] : itype_chain->itype; + CV_TypeId itype = (root_itype != itype_chain->itype && itype_chain->itype < itype_opl && itype_fwd_map[itype_chain->itype]) ? itype_fwd_map[itype_chain->itype] : itype_chain->itype; B32 itype_is_basic = (itype < 0x1000); ////////////////////////// @@ -2094,7 +2189,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // reference whatever this itype resolves to, and so there is no point // in filling out this slot // - if(type_fwd_map[root_itype] != 0) + if(itype_fwd_map[root_itype] != 0) { continue; } @@ -3160,7 +3255,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) tasks[idx].convert_in.coff_sections = coff_sections; tasks[idx].convert_in.tpi_hash = tpi_hash; tasks[idx].convert_in.tpi_leaf = tpi_leaf; - tasks[idx].convert_in.itype_fwd_map = type_fwd_map; + tasks[idx].convert_in.itype_fwd_map = itype_fwd_map; tasks[idx].convert_in.itype_type_ptrs = itype_type_ptrs; tasks[idx].convert_in.link_name_map = &link_name_map; tasks[idx].out_arena = arena_alloc(); @@ -3205,7 +3300,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) break; } P2R_UnitSymbolTask *task = &task_batch.tasks[next_task_num-1]; - ProfScope("convert") + ProfScope("convert (task #%I64u)", next_task_num) { task->convert_out = p2r_unit_symbol_convert(task->out_arena, &task->convert_in); } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index b4c318e4..772b7436 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -75,6 +75,32 @@ struct P2R_LinkNameMap U64 link_name_count; }; +//- rjf: type forward resolution map build + +typedef struct P2R_ITypeFwdMapFillIn P2R_ITypeFwdMapFillIn; +struct P2R_ITypeFwdMapFillIn +{ + PDB_TpiHashParsed *tpi_hash; + CV_LeafParsed *tpi_leaf; + CV_TypeId itype_first; + CV_TypeId itype_opl; + CV_TypeId *itype_fwd_map; +}; + +typedef struct P2R_ITypeFwdMapFillTask P2R_ITypeFwdMapFillTask; +struct P2R_ITypeFwdMapFillTask +{ + P2R_ITypeFwdMapFillIn fill_in; +}; + +typedef struct P2R_ITypeFwdMapFillTaskBatch P2R_ITypeFwdMapFillTaskBatch; +struct P2R_ITypeFwdMapFillTaskBatch +{ + P2R_ITypeFwdMapFillTask *tasks; + U64 tasks_count; + U64 *num_tasks_taken_ptr; +}; + //- rjf: per-unit symbol conversion typedef struct P2R_UnitSymbolConvertIn P2R_UnitSymbolConvertIn; @@ -150,9 +176,14 @@ internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFramep internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); +//////////////////////////////// +//~ rjf: Type Forward Resolution Map Build / Thread + +internal void p2r_itype_fwd_map_fill(P2R_ITypeFwdMapFillIn *in); +internal void p2r_itype_fwd_map_fill_task_thread__entry_point(void *p); //////////////////////////////// -//~ rjf: Per-Unit Symbol Conversion Pass Thread Entry Point +//~ rjf: Per-Unit Symbol Conversion / Thread internal P2R_UnitSymbolConvertOut *p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in); internal void p2r_unit_symbol_convert_task_thread__entry_point(void *p); From 0b73582b87e1c93a04c5ba127b32cda233edba85 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Feb 2024 15:52:26 -0800 Subject: [PATCH 098/275] raddbgi_from_pdb: multithread initial independent parsing/preparation phases of converter --- src/base/base_thread_context.c | 9 ++ src/base/base_thread_context.h | 1 + src/ctrl/ctrl_core.c | 4 - src/dasm/dasm.c | 2 - src/dbgi/dbgi.c | 4 - src/df/gfx/df_gfx.c | 2 - src/file_stream/file_stream.c | 2 - src/geo_cache/geo_cache.c | 2 - src/lib_raddbgi_make/raddbgi_make.c | 36 +++--- src/os/core/linux/os_core_linux.c | 2 +- src/os/core/win32/os_core_win32.c | 9 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 152 ++++++++++++++++-------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 61 ++++++++++ src/text_cache/text_cache.c | 2 - src/texture_cache/texture_cache.c | 2 - src/txti/txti.c | 5 - 16 files changed, 207 insertions(+), 88 deletions(-) diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index 1efd6e60..33ae9e50 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -19,6 +19,15 @@ tctx_init_and_equip(TCTX *tctx){ tctx_thread_local = tctx; } +internal void +tctx_release(void) +{ + for(U64 i = 0; i < ArrayCount(tctx_thread_local->arenas); i += 1) + { + arena_release(tctx_thread_local->arenas[i]); + } +} + internal TCTX* tctx_get_equipped(void){ return(tctx_thread_local); diff --git a/src/base/base_thread_context.h b/src/base/base_thread_context.h index ce05d47f..4f61d009 100644 --- a/src/base/base_thread_context.h +++ b/src/base/base_thread_context.h @@ -23,6 +23,7 @@ struct TCTX // NOTE(allen): Thread Context Functions internal void tctx_init_and_equip(TCTX *tctx); +internal void tctx_release(void); internal TCTX* tctx_get_equipped(void); internal Arena* tctx_get_scratch(Arena **conflicts, U64 count); diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 41d1cc8f..081e1af3 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1518,8 +1518,6 @@ ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, CTRL_Handle *out_process, internal void ctrl_thread__entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); ThreadName("[ctrl] thread"); ProfBeginFunction(); demon_primary_thread_begin(); @@ -3274,8 +3272,6 @@ ctrl_thread__single_step(CTRL_Msg *msg) internal void ctrl_mem_stream_thread__entry_point(void *p) { - TCTX tctx_ = {0}; - tctx_init_and_equip(&tctx_); CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; for(;;) { diff --git a/src/dasm/dasm.c b/src/dasm/dasm.c index 0561dfb4..734b35f5 100644 --- a/src/dasm/dasm.c +++ b/src/dasm/dasm.c @@ -372,8 +372,6 @@ dasm_u2d_dequeue_request(void) internal void dasm_decode_thread_entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); for(;;) { Temp scratch = scratch_begin(0, 0); diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index 3b0c5980..f171abb0 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -632,8 +632,6 @@ dbgi_p2u_pop_events(Arena *arena, U64 endt_us) internal void dbgi_parse_thread_entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); ProfThreadName("[dbgi] parse #%I64U", (U64)p); for(;;) { @@ -1154,8 +1152,6 @@ dbgi_qsort_compare_fuzzy_search_items(DBGI_FuzzySearchItem *a, DBGI_FuzzySearchI internal void dbgi_fuzzy_thread__entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); ProfThreadName("[dbgi] fuzzy search #%I64U", (U64)p); DBGI_FuzzySearchThread *thread = &dbgi_shared->fuzzy_threads[(U64)p]; for(;;) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 53537625..938269ff 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -7753,8 +7753,6 @@ df_text_search_little_hash_from_hash(U128 hash) internal void df_text_search_thread_entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); #if 0 // TODO(rjf): [ ] @de2ctrl text searcher -- wound up in DE_Hash diff --git a/src/file_stream/file_stream.c b/src/file_stream/file_stream.c index 2bf6fe57..84e81c6d 100644 --- a/src/file_stream/file_stream.c +++ b/src/file_stream/file_stream.c @@ -140,8 +140,6 @@ fs_u2s_dequeue_path(Arena *arena) internal void fs_streamer_thread__entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); ThreadName("[fs] streamer #%I64u", (U64)p); for(;;) { diff --git a/src/geo_cache/geo_cache.c b/src/geo_cache/geo_cache.c index 09bdbbe4..b871f951 100644 --- a/src/geo_cache/geo_cache.c +++ b/src/geo_cache/geo_cache.c @@ -293,8 +293,6 @@ geo_u2x_dequeue_req(U128 *key_out, U128 *hash_out) internal void geo_xfer_thread__entry_point(void *p) { - TCTX tctx_ = {0}; - tctx_init_and_equip(&tctx_); for(;;) { HS_Scope *scope = hs_scope_open(); diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index c48a651a..fc7331a1 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1479,6 +1479,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) RDI_Line *unit_lines = 0; RDI_U16 *unit_cols = 0; RDI_U32 unit_line_count = 0; + RDIM_ProfScope("produce combined unit line info") { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -1538,7 +1539,11 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) } //- rjf: sort - RDIM_SortKey *sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); + RDIM_SortKey *sorted_line_keys = 0; + RDIM_ProfScope("sort") + { + sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); + } // TODO(rjf): do a pass over sorted keys to make sure duplicate keys // are sorted with null record first, and no more than one null @@ -1547,23 +1552,26 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: arrange output RDI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RDI_U64, key_count + 1); RDI_Line *arranged_lines = rdim_push_array_no_zero(arena, RDI_Line, key_count); - for(RDI_U64 i = 0; i < key_count; i += 1) + RDIM_ProfScope("arrange output") { - arranged_voffs[i] = sorted_line_keys[i].key; - } - arranged_voffs[key_count] = ~0ull; - for(RDI_U64 i = 0; i < key_count; i += 1) - { - RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; - if(rec != 0) + for(RDI_U64 i = 0; i < key_count; i += 1) { - arranged_lines[i].file_idx = rec->file_id; - arranged_lines[i].line_num = rec->line_num; + arranged_voffs[i] = sorted_line_keys[i].key; } - else + arranged_voffs[key_count] = ~0ull; + for(RDI_U64 i = 0; i < key_count; i += 1) { - arranged_lines[i].file_idx = 0; - arranged_lines[i].line_num = 0; + RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; + if(rec != 0) + { + arranged_lines[i].file_idx = rec->file_id; + arranged_lines[i].line_num = rec->line_num; + } + else + { + arranged_lines[i].file_idx = 0; + arranged_lines[i].line_num = 0; + } } } diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 2907ffac..bb5e8ee1 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -788,8 +788,8 @@ lnx_thread_base(void *ptr){ TCTX tctx_; tctx_init_and_equip(&tctx_); - func(thread_ptr); + tctx_release(); // remove my bit U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x2); diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index aec356f8..b86e27d9 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -167,7 +167,10 @@ w32_thread_base(void *ptr){ OS_ThreadFunctionType *func = entity->thread.func; void *thread_ptr = entity->thread.ptr; + TCTX tctx_; + tctx_init_and_equip(&tctx_); func(thread_ptr); + tctx_release(); // remove my bit LONG result = InterlockedAnd((LONG*)&entity->reference_mask, ~0x2); @@ -1238,7 +1241,11 @@ os_thread_wait(OS_Handle handle, U64 endt_us) { DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us); W32_Entity *entity = (W32_Entity *)PtrFromInt(handle.u64[0]); - DWORD wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); + DWORD wait_result = WAIT_OBJECT_0; + if(entity != 0) + { + wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); + } return (wait_result == WAIT_OBJECT_0); } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index d28214bb..dfd48c0a 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -539,6 +539,33 @@ p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDI } } +//////////////////////////////// +//~ rjf: Initial PDB Parsing Pass Threads + +internal void +p2r_tpi_hash_parse_thread__entry_point(void *p) +{ + ThreadName("[p2r] tpi hash parse thread"); + P2R_TPIHashParseTask *task = (P2R_TPIHashParseTask *)p; + task->out = pdb_tpi_hash_from_data(task->out_arena, task->in.strtbl, task->in.tpi, task->in.hash_data, task->in.aux_data); +} + +internal void +p2r_tpi_leaf_parse_thread__entry_point(void *p) +{ + ThreadName("[p2r] tpi leaf parse thread"); + P2R_TPILeafParseTask *task = (P2R_TPILeafParseTask *)p; + task->out = cv_leaf_from_data(task->out_arena, task->in.leaf_data, task->in.itype_first); +} + +internal void +p2r_exe_hash_thread__entry_point(void *p) +{ + ThreadName("[p2r] exe hash thread"); + P2R_EXEHashTask *task = (P2R_EXEHashTask *)p; + ProfScope("hash exe") task->out = rdi_hash(task->in.exe_data.str, task->in.exe_data.size); +} + //////////////////////////////// //~ rjf: Type Forward Resolution Map Build / Thread @@ -665,8 +692,6 @@ p2r_itype_fwd_map_fill(P2R_ITypeFwdMapFillIn *in) internal void p2r_itype_fwd_map_fill_task_thread__entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); P2R_ITypeFwdMapFillTaskBatch *batch = (P2R_ITypeFwdMapFillTaskBatch *)p; ThreadName("[p2r] itype fwd map fill thread"); for(;;) @@ -1398,8 +1423,6 @@ p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in) internal void p2r_unit_symbol_convert_task_thread__entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); P2R_UnitSymbolTaskBatch *batch = (P2R_UnitSymbolTaskBatch *)p; ThreadName("[p2r] unit symbol thread"); for(;;) @@ -1525,45 +1548,88 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } ////////////////////////////////////////////////////////////// - //- rjf: parse tpi hash + //- rjf: do independent parsing & preparation passes // + U64 exe_hash = 0; PDB_TpiHashParsed *tpi_hash = 0; - if(tpi != 0) ProfScope("parse tpi hash") - { - String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn); - String8 aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); - tpi_hash = pdb_tpi_hash_from_data(arena, strtbl, tpi, hash_data, aux_data); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse tpi leaves - // CV_LeafParsed *tpi_leaf = 0; - if(tpi != 0) ProfScope("parse tpi leaves") - { - String8 leaf_data = pdb_leaf_data_from_tpi(tpi); - tpi_leaf = cv_leaf_from_data(arena, leaf_data, tpi->itype_first); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse ipi hash - // PDB_TpiHashParsed *ipi_hash = 0; - if(ipi != 0) ProfScope("parse ipi hash") - { - String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn); - String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); - ipi_hash = pdb_tpi_hash_from_data(arena, strtbl, ipi, hash_data, aux_data); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse ipi leaves - // CV_LeafParsed *ipi_leaf = 0; - if(ipi != 0) ProfScope("parse ipi leaves") + ProfScope("do independent parsing & preparation passess") { - String8 leaf_data = pdb_leaf_data_from_tpi(ipi); - ipi_leaf = cv_leaf_from_data(arena, leaf_data, ipi->itype_first); + //- rjf: kick off exe hash + OS_Handle exe_hash_thread = {0}; + P2R_EXEHashTask exe_hash_task = {0}; + { + exe_hash_task.in.exe_data = in->input_exe_data; + exe_hash_thread = os_launch_thread(p2r_exe_hash_thread__entry_point, &exe_hash_task, 0); + } + + //- rjf: kick off tpi hash parse + OS_Handle tpi_hash_thread = {0}; + P2R_TPIHashParseTask tpi_hash_task = {0}; + if(tpi != 0) + { + tpi_hash_task.in.strtbl = strtbl; + tpi_hash_task.in.tpi = tpi; + tpi_hash_task.in.hash_data = msf_data_from_stream(msf, tpi->hash_sn); + tpi_hash_task.in.aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); + tpi_hash_task.out_arena = arena_alloc(); + tpi_hash_thread = os_launch_thread(p2r_tpi_hash_parse_thread__entry_point, &tpi_hash_task, 0); + } + + //- rjf: kick off tpi leaf parse + OS_Handle tpi_leaf_thread = {0}; + P2R_TPILeafParseTask tpi_leaf_task = {0}; + if(tpi != 0) + { + tpi_leaf_task.in.leaf_data = pdb_leaf_data_from_tpi(tpi); + tpi_leaf_task.in.itype_first = tpi->itype_first; + tpi_leaf_task.out_arena = arena_alloc(); + tpi_leaf_thread = os_launch_thread(p2r_tpi_leaf_parse_thread__entry_point, &tpi_leaf_task, 0); + } + + //- rjf: kick off ipi hash parse + OS_Handle ipi_hash_thread = {0}; + P2R_TPIHashParseTask ipi_hash_task = {0}; + if(ipi != 0) + { + ipi_hash_task.in.strtbl = strtbl; + ipi_hash_task.in.tpi = ipi; + ipi_hash_task.in.hash_data = msf_data_from_stream(msf, ipi->hash_sn); + ipi_hash_task.in.aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); + ipi_hash_task.out_arena = arena_alloc(); + ipi_hash_thread = os_launch_thread(p2r_tpi_hash_parse_thread__entry_point, &ipi_hash_task, 0); + } + + //- rjf: kick off ipi leaf parse + OS_Handle ipi_leaf_thread = {0}; + P2R_TPILeafParseTask ipi_leaf_task = {0}; + if(ipi != 0) + { + ipi_leaf_task.in.leaf_data = pdb_leaf_data_from_tpi(ipi); + ipi_leaf_task.in.itype_first = ipi->itype_first; + ipi_leaf_task.out_arena = arena_alloc(); + ipi_leaf_thread = os_launch_thread(p2r_tpi_leaf_parse_thread__entry_point, &ipi_leaf_task, 0); + } + + //- rjf: join all independent task threads + os_thread_wait(exe_hash_thread, max_U64); + os_thread_wait(tpi_hash_thread, max_U64); + os_thread_wait(tpi_leaf_thread, max_U64); + os_thread_wait(ipi_hash_thread, max_U64); + os_thread_wait(ipi_leaf_thread, max_U64); + + //- rjf: fill/absorb exports from completed tasks + exe_hash = exe_hash_task.out; + tpi_hash = tpi_hash_task.out; + tpi_leaf = tpi_leaf_task.out; + ipi_hash = ipi_hash_task.out; + ipi_leaf = ipi_leaf_task.out; + arena_absorb(arena, tpi_hash_task.out_arena); + arena_absorb(arena, tpi_leaf_task.out_arena); + arena_absorb(arena, ipi_hash_task.out_arena); + arena_absorb(arena, ipi_leaf_task.out_arena); } ////////////////////////////////////////////////////////////// @@ -1604,7 +1670,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) //- rjf: parse syms for each compilation unit // CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed*, comp_unit_count); - if(comp_units != 0) ProfScope("parse symbols") + if(comp_units != 0) ProfScope("parse syms for each compilation unit") { PDB_CompUnit **unit_ptr = comp_units->units; for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1) @@ -1632,15 +1698,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } } - ////////////////////////////////////////////////////////////// - //- rjf: hash exe - // - U64 exe_hash = 0; - if(in->input_exe_data.size > 0) ProfScope("hash exe") - { - exe_hash = rdi_hash(in->input_exe_data.str, in->input_exe_data.size); - } - ////////////////////////////////////////////////////////////// //- rjf: calculate EXE's max voff // @@ -3325,6 +3382,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { for(U64 idx = 0; idx < tasks_count; idx += 1) { + arena_absorb(arena, tasks[idx].out_arena); rdim_symbol_chunk_list_concat_in_place(&all_procedures, &tasks[idx].convert_out->procedures); rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &tasks[idx].convert_out->global_variables); rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &tasks[idx].convert_out->thread_variables); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 772b7436..76d4860a 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -53,6 +53,60 @@ struct P2R_ConvertOut RDIM_ScopeChunkList scopes; }; +//////////////////////////////// +//~ rjf: Initial PDB Information Extraction & Conversion Preparation Task Types + +//- rjf: tpi hash parsing + +typedef struct P2R_TPIHashParseIn P2R_TPIHashParseIn; +struct P2R_TPIHashParseIn +{ + PDB_Strtbl *strtbl; + PDB_TpiParsed *tpi; + String8 hash_data; + String8 aux_data; +}; + +typedef struct P2R_TPIHashParseTask P2R_TPIHashParseTask; +struct P2R_TPIHashParseTask +{ + P2R_TPIHashParseIn in; + Arena *out_arena; + PDB_TpiHashParsed *out; +}; + +//- rjf: tpi leaves parsing + +typedef struct P2R_TPILeafParseIn P2R_TPILeafParseIn; +struct P2R_TPILeafParseIn +{ + String8 leaf_data; + CV_TypeId itype_first; +}; + +typedef struct P2R_TPILeafParseTask P2R_TPILeafParseTask; +struct P2R_TPILeafParseTask +{ + P2R_TPILeafParseIn in; + Arena *out_arena; + CV_LeafParsed *out; +}; + +//- rjf: exe hashing + +typedef struct P2R_EXEHashIn P2R_EXEHashIn; +struct P2R_EXEHashIn +{ + String8 exe_data; +}; + +typedef struct P2R_EXEHashTask P2R_EXEHashTask; +struct P2R_EXEHashTask +{ + P2R_EXEHashIn in; + U64 out; +}; + //////////////////////////////// //~ rjf: Conversion Data Structure Types @@ -176,6 +230,13 @@ internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFramep internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); +//////////////////////////////// +//~ rjf: Initial Parsing & Preparation Pass Threads + +internal void p2r_tpi_hash_parse_thread__entry_point(void *p); +internal void p2r_tpi_leaf_parse_thread__entry_point(void *p); +internal void p2r_exe_hash_thread__entry_point(void *p); + //////////////////////////////// //~ rjf: Type Forward Resolution Map Build / Thread diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 9aca682a..fba7eefa 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -674,8 +674,6 @@ txt_u2p_dequeue_req(U128 *key_out, U128 *hash_out, TXT_LangKind *lang_out) internal void txt_parse_thread__entry_point(void *p) { - TCTX tctx_ = {0}; - tctx_init_and_equip(&tctx_); for(;;) { HS_Scope *scope = hs_scope_open(); diff --git a/src/texture_cache/texture_cache.c b/src/texture_cache/texture_cache.c index 18a606fa..e2897228 100644 --- a/src/texture_cache/texture_cache.c +++ b/src/texture_cache/texture_cache.c @@ -311,8 +311,6 @@ tex_u2x_dequeue_req(U128 *key_out, U128 *hash_out, TEX_Topology *top_out) internal void tex_xfer_thread__entry_point(void *p) { - TCTX tctx_ = {0}; - tctx_init_and_equip(&tctx_); for(;;) { HS_Scope *scope = hs_scope_open(); diff --git a/src/txti/txti.c b/src/txti/txti.c index c1abb060..52be44d3 100644 --- a/src/txti/txti.c +++ b/src/txti/txti.c @@ -940,9 +940,6 @@ txti_set_external_change_detection_enabled(B32 enabled) internal void txti_mut_thread_entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); - U64 mut_thread_idx = (U64)p; ProfThreadName("[txti] mut #%I64u", mut_thread_idx); TXTI_MutThread *mut_thread = &txti_state->mut_threads[mut_thread_idx]; @@ -1249,8 +1246,6 @@ txti_mut_thread_entry_point(void *p) internal void txti_detector_thread_entry_point(void *p) { - TCTX tctx_; - tctx_init_and_equip(&tctx_); ProfThreadName("[txti] detector"); for(;;) { From 10a042026492e0e13c254576d749ea4d7c1e2c0b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 19 Feb 2024 16:41:22 -0800 Subject: [PATCH 099/275] raddbgi_from_pdb: parameterize symbol stream conversion pass with sub-range of symbols; this cannot be applied to unit conversion, since they have cross-sym-record concepts, but it *can* be used for global symbol streams, which are also the most expensive to convert. this majorly speeds up global symbol stream conversion --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 58 +++++++++++++++---------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 34 ++++++++------- 2 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index dfd48c0a..73d77f26 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -710,10 +710,10 @@ p2r_itype_fwd_map_fill_task_thread__entry_point(void *p) } //////////////////////////////// -//~ rjf: Per-Unit Symbol Conversion Pass Thread Entry Point +//~ rjf: Symbol Stream Conversion Path & Thread -internal P2R_UnitSymbolConvertOut * -p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in) +internal P2R_SymbolStreamConvertOut * +p2r_symbol_stream_convert(Arena *arena, P2R_SymbolStreamConvertIn *in) { Temp scratch = scratch_begin(&arena, 1); #define p2r_type_ptr_from_itype(itype) (((itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) @@ -734,13 +734,13 @@ p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in) //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) // U64 procedure_frameprocs_count = 0; - U64 procedure_frameprocs_cap = in->sym->sym_ranges.count; + U64 procedure_frameprocs_cap = (in->sym_ranges_opl - in->sym_ranges_first); CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") { U64 procedure_num = 0; - CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first + in->sym->sym_ranges.count; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; + CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; for(CV_RecRange *rec_range = rec_ranges_first; rec_range < rec_ranges_opl; rec_range += 1) @@ -801,8 +801,8 @@ p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in) RDIM_LocationSet *defrange_target = 0; B32 defrange_target_is_param = 0; U64 procedure_num = 0; - CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first + in->sym->sym_ranges.count; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; + CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; typedef struct P2R_ScopeNode P2R_ScopeNode; struct P2R_ScopeNode { @@ -1407,7 +1407,7 @@ p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in) ////////////////////////// //- rjf: allocate & fill output // - P2R_UnitSymbolConvertOut *out = push_array(arena, P2R_UnitSymbolConvertOut, 1); + P2R_SymbolStreamConvertOut *out = push_array(arena, P2R_SymbolStreamConvertOut, 1); { out->procedures = sym_procedures; out->global_variables = sym_global_variables; @@ -1421,9 +1421,9 @@ p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in) } internal void -p2r_unit_symbol_convert_task_thread__entry_point(void *p) +p2r_symbol_stream_convert_task_thread__entry_point(void *p) { - P2R_UnitSymbolTaskBatch *batch = (P2R_UnitSymbolTaskBatch *)p; + P2R_SymbolStreamTaskBatch *batch = (P2R_SymbolStreamTaskBatch *)p; ThreadName("[p2r] unit symbol thread"); for(;;) { @@ -1432,10 +1432,10 @@ p2r_unit_symbol_convert_task_thread__entry_point(void *p) { break; } - P2R_UnitSymbolTask *task = &batch->tasks[next_task_num-1]; + P2R_SymbolStreamTask *task = &batch->tasks[next_task_num-1]; ProfScope("convert (task #%I64u)", next_task_num) { - task->convert_out = p2r_unit_symbol_convert(task->out_arena, &task->convert_in); + task->convert_out = p2r_symbol_stream_convert(task->out_arena, &task->convert_in); } } } @@ -3291,21 +3291,22 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } ////////////////////////////////////////////////////////////// - //- rjf: produce symbols from all sym streams + //- rjf: produce symbols from all streams // RDIM_SymbolChunkList all_procedures = {0}; RDIM_SymbolChunkList all_global_variables = {0}; RDIM_SymbolChunkList all_thread_variables = {0}; RDIM_ScopeChunkList all_scopes = {0}; - ProfScope("produce symbols from all sym streams") + ProfScope("produce symbols from all streams") { //////////////////////////// //- rjf: produce per-task info // - U64 tasks_count = 1+comp_unit_count; - P2R_UnitSymbolTask *tasks = push_array(scratch.arena, P2R_UnitSymbolTask, tasks_count); + U64 global_stream_subdivision_tasks_count = (sym->sym_ranges.count+65535)/65536; + U64 global_stream_syms_per_task = sym->sym_ranges.count/global_stream_subdivision_tasks_count; + U64 tasks_count = comp_unit_count + global_stream_subdivision_tasks_count; + P2R_SymbolStreamTask *tasks = push_array(scratch.arena, P2R_SymbolStreamTask, tasks_count); { - tasks[0].convert_in.sym = sym; for(U64 idx = 0; idx < tasks_count; idx += 1) { tasks[idx].convert_in.arch = arch; @@ -3316,9 +3317,18 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) tasks[idx].convert_in.itype_type_ptrs = itype_type_ptrs; tasks[idx].convert_in.link_name_map = &link_name_map; tasks[idx].out_arena = arena_alloc(); - if(idx > 0) + if(idx < global_stream_subdivision_tasks_count) { - tasks[idx].convert_in.sym = sym_for_unit[idx-1]; + tasks[idx].convert_in.sym = sym; + tasks[idx].convert_in.sym_ranges_first= idx*global_stream_syms_per_task; + tasks[idx].convert_in.sym_ranges_opl = tasks[idx].convert_in.sym_ranges_first + global_stream_syms_per_task; + tasks[idx].convert_in.sym_ranges_opl = ClampTop(tasks[idx].convert_in.sym_ranges_opl, sym->sym_ranges.count); + } + else + { + tasks[idx].convert_in.sym = sym_for_unit[idx-global_stream_subdivision_tasks_count]; + tasks[idx].convert_in.sym_ranges_first= 0; + tasks[idx].convert_in.sym_ranges_opl = sym_for_unit[idx-global_stream_subdivision_tasks_count]->sym_ranges.count; } } } @@ -3327,7 +3337,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) //- rjf: produce task batch info // U64 num_tasks_taken = 0; - P2R_UnitSymbolTaskBatch task_batch = {0}; + P2R_SymbolStreamTaskBatch task_batch = {0}; { task_batch.tasks = tasks; task_batch.tasks_count = tasks_count; @@ -3341,7 +3351,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) OS_Handle *task_threads = push_array(scratch.arena, OS_Handle, task_threads_count); for(U64 idx = 0; idx < task_threads_count; idx += 1) { - task_threads[idx] = os_launch_thread(p2r_unit_symbol_convert_task_thread__entry_point, &task_batch, 0); + task_threads[idx] = os_launch_thread(p2r_symbol_stream_convert_task_thread__entry_point, &task_batch, 0); } //////////////////////////// @@ -3356,10 +3366,10 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { break; } - P2R_UnitSymbolTask *task = &task_batch.tasks[next_task_num-1]; + P2R_SymbolStreamTask *task = &task_batch.tasks[next_task_num-1]; ProfScope("convert (task #%I64u)", next_task_num) { - task->convert_out = p2r_unit_symbol_convert(task->out_arena, &task->convert_in); + task->convert_out = p2r_symbol_stream_convert(task->out_arena, &task->convert_in); } } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 76d4860a..8749d49f 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -155,23 +155,25 @@ struct P2R_ITypeFwdMapFillTaskBatch U64 *num_tasks_taken_ptr; }; -//- rjf: per-unit symbol conversion +//- rjf: symbol stream conversion -typedef struct P2R_UnitSymbolConvertIn P2R_UnitSymbolConvertIn; -struct P2R_UnitSymbolConvertIn +typedef struct P2R_SymbolStreamConvertIn P2R_SymbolStreamConvertIn; +struct P2R_SymbolStreamConvertIn { RDI_Arch arch; PDB_CoffSectionArray *coff_sections; PDB_TpiHashParsed *tpi_hash; CV_LeafParsed *tpi_leaf; CV_SymParsed *sym; + U64 sym_ranges_first; + U64 sym_ranges_opl; CV_TypeId *itype_fwd_map; RDIM_Type **itype_type_ptrs; P2R_LinkNameMap *link_name_map; }; -typedef struct P2R_UnitSymbolConvertOut P2R_UnitSymbolConvertOut; -struct P2R_UnitSymbolConvertOut +typedef struct P2R_SymbolStreamConvertOut P2R_SymbolStreamConvertOut; +struct P2R_SymbolStreamConvertOut { RDIM_SymbolChunkList procedures; RDIM_SymbolChunkList global_variables; @@ -179,21 +181,21 @@ struct P2R_UnitSymbolConvertOut RDIM_ScopeChunkList scopes; }; -typedef struct P2R_UnitSymbolTask P2R_UnitSymbolTask; -struct P2R_UnitSymbolTask +typedef struct P2R_SymbolStreamTask P2R_SymbolStreamTask; +struct P2R_SymbolStreamTask { // rjf: inputs - P2R_UnitSymbolConvertIn convert_in; + P2R_SymbolStreamConvertIn convert_in; // rjf: outputs Arena *out_arena; - P2R_UnitSymbolConvertOut *convert_out; + P2R_SymbolStreamConvertOut *convert_out; }; -typedef struct P2R_UnitSymbolTaskBatch P2R_UnitSymbolTaskBatch; -struct P2R_UnitSymbolTaskBatch +typedef struct P2R_SymbolStreamTaskBatch P2R_SymbolStreamTaskBatch; +struct P2R_SymbolStreamTaskBatch { - P2R_UnitSymbolTask *tasks; + P2R_SymbolStreamTask *tasks; U64 tasks_count; U64 *num_tasks_taken_ptr; }; @@ -238,16 +240,16 @@ internal void p2r_tpi_leaf_parse_thread__entry_point(void *p); internal void p2r_exe_hash_thread__entry_point(void *p); //////////////////////////////// -//~ rjf: Type Forward Resolution Map Build / Thread +//~ rjf: Type Forward Resolution Map Build Path & Thread internal void p2r_itype_fwd_map_fill(P2R_ITypeFwdMapFillIn *in); internal void p2r_itype_fwd_map_fill_task_thread__entry_point(void *p); //////////////////////////////// -//~ rjf: Per-Unit Symbol Conversion / Thread +//~ rjf: Symbol Stream Conversion Paths & Thread -internal P2R_UnitSymbolConvertOut *p2r_unit_symbol_convert(Arena *arena, P2R_UnitSymbolConvertIn *in); -internal void p2r_unit_symbol_convert_task_thread__entry_point(void *p); +internal P2R_SymbolStreamConvertOut *p2r_symbol_stream_convert(Arena *arena, P2R_SymbolStreamConvertIn *in); +internal void p2r_symbol_stream_convert_task_thread__entry_point(void *p); //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point From 6b2e4abe81d3658d3c25379de8935f94b3dd6cf7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 11:16:54 -0800 Subject: [PATCH 100/275] unify async task kickoff/await mechanism in first pass of 'task system' layer; use in organizing various independent parsing passes of a pdb; also fix busted multithreaded fwd resolution pass --- src/raddbg/raddbg.c | 1 + src/raddbg/raddbg_main.cpp | 2 + src/raddbgi_from_pdb/raddbgi_from_pdb.c | 152 ++++++++--------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 31 +++- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 3 + src/task_system/task_system.c | 168 +++++++++++++++++++ src/task_system/task_system.h | 113 +++++++++++++ 7 files changed, 377 insertions(+), 93 deletions(-) create mode 100644 src/task_system/task_system.c create mode 100644 src/task_system/task_system.h diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index b23b5993..ac1017a7 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -347,6 +347,7 @@ entry_point(int argc, char **argv) //- rjf: initialize basic dependencies os_init(argc, argv); + ts_init(); //- rjf: parse command line arguments CmdLine cmdln = cmd_line_from_string_list(scratch.arena, os_get_command_line_arguments()); diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 6bb32ceb..b8db5c55 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -13,6 +13,7 @@ //- rjf: [h] #include "base/base_inc.h" #include "os/os_inc.h" +#include "task_system/task_system.h" #include "raddbgi_make_local/raddbgi_make_local.h" #include "mdesk/mdesk.h" #include "hash_store/hash_store.h" @@ -50,6 +51,7 @@ //- rjf: [c] #include "base/base_inc.c" #include "os/os_inc.c" +#include "task_system/task_system.c" #include "raddbgi_make_local/raddbgi_make_local.c" #include "mdesk/mdesk.c" #include "hash_store/hash_store.c" diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 73d77f26..29bd8833 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -540,30 +540,42 @@ p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDI } //////////////////////////////// -//~ rjf: Initial PDB Parsing Pass Threads +//~ rjf: Initial Parsing & Preparation Pass Tasks -internal void -p2r_tpi_hash_parse_thread__entry_point(void *p) +internal void * +p2r_exe_hash_task__entry_point(Arena *arena, void *p) { - ThreadName("[p2r] tpi hash parse thread"); - P2R_TPIHashParseTask *task = (P2R_TPIHashParseTask *)p; - task->out = pdb_tpi_hash_from_data(task->out_arena, task->in.strtbl, task->in.tpi, task->in.hash_data, task->in.aux_data); + P2R_EXEHashIn *in = (P2R_EXEHashIn *)p; + U64 *out = push_array(arena, U64, 1); + ProfScope("hash exe") *out = rdi_hash(in->exe_data.str, in->exe_data.size); + return out; } -internal void -p2r_tpi_leaf_parse_thread__entry_point(void *p) +internal void * +p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p) { - ThreadName("[p2r] tpi leaf parse thread"); - P2R_TPILeafParseTask *task = (P2R_TPILeafParseTask *)p; - task->out = cv_leaf_from_data(task->out_arena, task->in.leaf_data, task->in.itype_first); + P2R_TPIHashParseIn *in = (P2R_TPIHashParseIn *)p; + void *out = 0; + ProfScope("parse tpi hash") out = pdb_tpi_hash_from_data(arena, in->strtbl, in->tpi, in->hash_data, in->aux_data); + return out; } -internal void -p2r_exe_hash_thread__entry_point(void *p) +internal void * +p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p) { - ThreadName("[p2r] exe hash thread"); - P2R_EXEHashTask *task = (P2R_EXEHashTask *)p; - ProfScope("hash exe") task->out = rdi_hash(task->in.exe_data.str, task->in.exe_data.size); + P2R_TPILeafParseIn *in = (P2R_TPILeafParseIn *)p; + void *out = 0; + ProfScope("parse tpi leaf") out = cv_leaf_from_data(arena, in->leaf_data, in->itype_first); + return out; +} + +internal void * +p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p) +{ + P2R_SymbolStreamParseIn *in = (P2R_SymbolStreamParseIn *)p; + void *out = 0; + ProfScope("parse symbol stream") out = cv_sym_from_data(arena, in->data, 4); + return out; } //////////////////////////////// @@ -684,7 +696,7 @@ p2r_itype_fwd_map_fill(P2R_ITypeFwdMapFillIn *in) //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map if(itype_fwd != 0 && itype_fwd < in->tpi_leaf->itype_opl) { - in->itype_fwd_map[itype-in->itype_first] = itype_fwd; + in->itype_fwd_map[itype] = itype_fwd; } } } @@ -1557,79 +1569,46 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_LeafParsed *ipi_leaf = 0; ProfScope("do independent parsing & preparation passess") { - //- rjf: kick off exe hash - OS_Handle exe_hash_thread = {0}; - P2R_EXEHashTask exe_hash_task = {0}; + //- rjf: form task inputs + P2R_EXEHashIn exe_hash_in = {in->input_exe_data}; + P2R_TPIHashParseIn tpi_hash_in = {0}; { - exe_hash_task.in.exe_data = in->input_exe_data; - exe_hash_thread = os_launch_thread(p2r_exe_hash_thread__entry_point, &exe_hash_task, 0); + tpi_hash_in.strtbl = strtbl; + tpi_hash_in.tpi = tpi; + tpi_hash_in.hash_data = msf_data_from_stream(msf, tpi->hash_sn); + tpi_hash_in.aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); + } + P2R_TPILeafParseIn tpi_leaf_in = {0}; + { + tpi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(tpi); + tpi_leaf_in.itype_first = tpi->itype_first; + } + P2R_TPIHashParseIn ipi_hash_in = {0}; + { + ipi_hash_in.strtbl = strtbl; + ipi_hash_in.tpi = ipi; + ipi_hash_in.hash_data = msf_data_from_stream(msf, ipi->hash_sn); + ipi_hash_in.aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); + } + P2R_TPILeafParseIn ipi_leaf_in = {0}; + { + ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); + ipi_leaf_in.itype_first = ipi->itype_first; } - //- rjf: kick off tpi hash parse - OS_Handle tpi_hash_thread = {0}; - P2R_TPIHashParseTask tpi_hash_task = {0}; - if(tpi != 0) - { - tpi_hash_task.in.strtbl = strtbl; - tpi_hash_task.in.tpi = tpi; - tpi_hash_task.in.hash_data = msf_data_from_stream(msf, tpi->hash_sn); - tpi_hash_task.in.aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); - tpi_hash_task.out_arena = arena_alloc(); - tpi_hash_thread = os_launch_thread(p2r_tpi_hash_parse_thread__entry_point, &tpi_hash_task, 0); - } + //- rjf: kick off tasks + TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in); + TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in); + TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in); + TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in); + TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in); - //- rjf: kick off tpi leaf parse - OS_Handle tpi_leaf_thread = {0}; - P2R_TPILeafParseTask tpi_leaf_task = {0}; - if(tpi != 0) - { - tpi_leaf_task.in.leaf_data = pdb_leaf_data_from_tpi(tpi); - tpi_leaf_task.in.itype_first = tpi->itype_first; - tpi_leaf_task.out_arena = arena_alloc(); - tpi_leaf_thread = os_launch_thread(p2r_tpi_leaf_parse_thread__entry_point, &tpi_leaf_task, 0); - } - - //- rjf: kick off ipi hash parse - OS_Handle ipi_hash_thread = {0}; - P2R_TPIHashParseTask ipi_hash_task = {0}; - if(ipi != 0) - { - ipi_hash_task.in.strtbl = strtbl; - ipi_hash_task.in.tpi = ipi; - ipi_hash_task.in.hash_data = msf_data_from_stream(msf, ipi->hash_sn); - ipi_hash_task.in.aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); - ipi_hash_task.out_arena = arena_alloc(); - ipi_hash_thread = os_launch_thread(p2r_tpi_hash_parse_thread__entry_point, &ipi_hash_task, 0); - } - - //- rjf: kick off ipi leaf parse - OS_Handle ipi_leaf_thread = {0}; - P2R_TPILeafParseTask ipi_leaf_task = {0}; - if(ipi != 0) - { - ipi_leaf_task.in.leaf_data = pdb_leaf_data_from_tpi(ipi); - ipi_leaf_task.in.itype_first = ipi->itype_first; - ipi_leaf_task.out_arena = arena_alloc(); - ipi_leaf_thread = os_launch_thread(p2r_tpi_leaf_parse_thread__entry_point, &ipi_leaf_task, 0); - } - - //- rjf: join all independent task threads - os_thread_wait(exe_hash_thread, max_U64); - os_thread_wait(tpi_hash_thread, max_U64); - os_thread_wait(tpi_leaf_thread, max_U64); - os_thread_wait(ipi_hash_thread, max_U64); - os_thread_wait(ipi_leaf_thread, max_U64); - - //- rjf: fill/absorb exports from completed tasks - exe_hash = exe_hash_task.out; - tpi_hash = tpi_hash_task.out; - tpi_leaf = tpi_leaf_task.out; - ipi_hash = ipi_hash_task.out; - ipi_leaf = ipi_leaf_task.out; - arena_absorb(arena, tpi_hash_task.out_arena); - arena_absorb(arena, tpi_leaf_task.out_arena); - arena_absorb(arena, ipi_hash_task.out_arena); - arena_absorb(arena, ipi_leaf_task.out_arena); + //- rjf: join tasks + exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); + tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); + tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); + ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); + ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); } ////////////////////////////////////////////////////////////// @@ -1915,6 +1894,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) task->fill_in.tpi_leaf = tpi_leaf; task->fill_in.itype_first = task_idx*task_size_itypes; task->fill_in.itype_opl = task->fill_in.itype_first + task_size_itypes; + task->fill_in.itype_opl = ClampTop(task->fill_in.itype_opl, itype_opl); task->fill_in.itype_fwd_map = itype_fwd_map; } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 8749d49f..b3b88f00 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RDI_FROM_PDB_H -#define RDI_FROM_PDB_H +#ifndef RADDBGI_FROM_PDB_H +#define RADDBGI_FROM_PDB_H //////////////////////////////// //~ rjf: Conversion Inputs/Outputs @@ -107,6 +107,22 @@ struct P2R_EXEHashTask U64 out; }; +//- rjf: symbol stream parsing + +typedef struct P2R_SymbolStreamParseIn P2R_SymbolStreamParseIn; +struct P2R_SymbolStreamParseIn +{ + String8 data; +}; + +typedef struct P2R_SymbolStreamParseTask P2R_SymbolStreamParseTask; +struct P2R_SymbolStreamParseTask +{ + P2R_SymbolStreamParseIn in; + Arena *out_arena; + CV_SymParsed *sym; +}; + //////////////////////////////// //~ rjf: Conversion Data Structure Types @@ -233,11 +249,12 @@ internal RDI_RegisterCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, C internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); //////////////////////////////// -//~ rjf: Initial Parsing & Preparation Pass Threads +//~ rjf: Initial Parsing & Preparation Pass Tasks -internal void p2r_tpi_hash_parse_thread__entry_point(void *p); -internal void p2r_tpi_leaf_parse_thread__entry_point(void *p); -internal void p2r_exe_hash_thread__entry_point(void *p); +internal void *p2r_exe_hash_task__entry_point(Arena *arena, void *p); +internal void *p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p); +internal void *p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p); +internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p); //////////////////////////////// //~ rjf: Type Forward Resolution Map Build Path & Thread @@ -256,4 +273,4 @@ internal void p2r_symbol_stream_convert_task_thread__entry_point(void *p); internal P2R_ConvertOut *p2r_convert(Arena *arena, P2R_ConvertIn *in); -#endif // RDI_FROM_PDB_H +#endif // RADDBGI_FROM_PDB_H diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index a67f8920..9273294a 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -8,6 +8,7 @@ //- rjf: [h] #include "base/base_inc.h" #include "os/os_inc.h" +#include "task_system/task_system.h" #include "raddbgi_make_local/raddbgi_make_local.h" #include "coff/coff.h" #include "codeview/codeview.h" @@ -20,6 +21,7 @@ //- rjf: [c] #include "base/base_inc.c" #include "os/os_inc.c" +#include "task_system/task_system.c" #include "raddbgi_make_local/raddbgi_make_local.c" #include "coff/coff.c" #include "codeview/codeview.c" @@ -48,6 +50,7 @@ main(int argc, char **argv) //- rjf: initialize dependencies os_init(argc, argv); + ts_init(); //- rjf: initialize state, parse command line Arena *arena = arena_alloc(); diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c new file mode 100644 index 00000000..2281591e --- /dev/null +++ b/src/task_system/task_system.c @@ -0,0 +1,168 @@ +//////////////////////////////// +//~ rjf: Top-Level Layer Initialization + +internal void +ts_init(void) +{ + Arena *arena = arena_alloc(); + ts_shared = push_array(arena, TS_Shared, 1); + ts_shared->arena = arena; + ts_shared->artifact_slots_count = 1024; + ts_shared->artifact_stripes_count = 64; + ts_shared->artifact_slots = push_array(arena, TS_TaskArtifactSlot, ts_shared->artifact_slots_count); + ts_shared->artifact_stripes = push_array(arena, TS_TaskArtifactStripe, ts_shared->artifact_stripes_count); + for(U64 idx = 0; idx < ts_shared->artifact_stripes_count; idx += 1) + { + ts_shared->artifact_stripes[idx].arena = arena_alloc(); + ts_shared->artifact_stripes[idx].cv = os_condition_variable_alloc(); + ts_shared->artifact_stripes[idx].rw_mutex = os_rw_mutex_alloc(); + } + ts_shared->u2t_ring_size = KB(256); + ts_shared->u2t_ring_base = push_array_no_zero(arena, U8, ts_shared->u2t_ring_size); + ts_shared->u2t_ring_mutex = os_mutex_alloc(); + ts_shared->u2t_ring_cv = os_condition_variable_alloc(); + ts_shared->task_threads_count = os_logical_core_count()-1; + ts_shared->task_threads = push_array(arena, TS_TaskThread, ts_shared->task_threads_count); + for(U64 idx = 0; idx < ts_shared->task_threads_count; idx += 1) + { + ts_shared->task_threads[idx].arena = arena_alloc(); + ts_shared->task_threads[idx].thread = os_launch_thread(ts_task_thread__entry_point, (void *)idx, 0); + } +} + +//////////////////////////////// +//~ rjf: High-Level Task Kickoff / Joining + +internal TS_Ticket +ts_kickoff(TS_TaskFunctionType *entry_point, void *p) +{ + // rjf: obtain number & slot/stripefor next artifact + U64 artifact_num = ins_atomic_u64_inc_eval(&ts_shared->artifact_num_gen); + U64 slot_idx = artifact_num%ts_shared->artifact_slots_count; + U64 stripe_idx = slot_idx%ts_shared->artifact_stripes_count; + TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx]; + TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx]; + + // rjf: allocate artifact + TS_TaskArtifact *artifact = 0; + OS_MutexScopeW(stripe->rw_mutex) + { + artifact = stripe->free_artifact; + if(artifact != 0) + { + SLLStackPop(stripe->free_artifact); + } + else + { + artifact = push_array_no_zero(stripe->arena, TS_TaskArtifact, 1); + } + artifact->num = artifact_num; + artifact->task_is_done = 0; + artifact->result = 0; + } + + // rjf: form ticket out of artifact info + TS_Ticket ticket = {artifact_num, (U64)artifact}; + + // rjf: push task info to task ring buffer + OS_MutexScope(ts_shared->u2t_ring_mutex) for(;;) + { + U64 unconsumed_size = ts_shared->u2t_ring_write_pos - ts_shared->u2t_ring_read_pos; + U64 available_size = ts_shared->u2t_ring_size-unconsumed_size; + if(available_size >= sizeof(entry_point) + sizeof(p) + sizeof(ticket)) + { + ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &entry_point); + ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &p); + ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &ticket); + break; + } + os_condition_variable_wait(ts_shared->u2t_ring_cv, ts_shared->u2t_ring_mutex, max_U64); + } + os_condition_variable_broadcast(ts_shared->u2t_ring_cv); + + return ticket; +} + +internal void * +ts_join(TS_Ticket ticket, U64 endt_us) +{ + void *result = 0; + U64 artifact_num = ticket.u64[0]; + U64 slot_idx = artifact_num%ts_shared->artifact_slots_count; + U64 stripe_idx = slot_idx%ts_shared->artifact_stripes_count; + TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx]; + TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx]; + TS_TaskArtifact *artifact = (TS_TaskArtifact *)ticket.u64[1]; + OS_MutexScopeR(stripe->rw_mutex) for(;;) + { + B64 task_is_done = artifact->task_is_done; + if(task_is_done) + { + OS_MutexScopeRWPromote(stripe->rw_mutex) + { + result = artifact->result; + SLLStackPush(stripe->free_artifact, artifact); + } + break; + } + else + { + os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Task Threads + +internal void +ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, void **p_out, TS_Ticket *ticket_out) +{ + OS_MutexScope(ts_shared->u2t_ring_mutex) for(;;) + { + U64 unconsumed_size = ts_shared->u2t_ring_write_pos - ts_shared->u2t_ring_read_pos; + if(unconsumed_size >= sizeof(*entry_point_out) + sizeof(*p_out) + sizeof(*ticket_out)) + { + ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, entry_point_out); + ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, p_out); + ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, ticket_out); + break; + } + os_condition_variable_wait(ts_shared->u2t_ring_cv, ts_shared->u2t_ring_mutex, max_U64); + } + os_condition_variable_broadcast(ts_shared->u2t_ring_cv); +} + +internal void +ts_task_thread__entry_point(void *p) +{ + U64 thread_idx = (U64)p; + ThreadName("[ts] task thread #%I64u", thread_idx+1); + TS_TaskThread *thread = &ts_shared->task_threads[thread_idx]; + for(;;) + { + //- rjf: grab next task + TS_TaskFunctionType *task_function = 0; + void *task_params = 0; + TS_Ticket task_ticket = {0}; + ts_u2t_dequeue_task(&task_function, &task_params, &task_ticket); + + //- rjf: run task + void *task_result = task_function(thread->arena, task_params); + + //- rjf: store into artifact + U64 artifact_num = task_ticket.u64[0]; + U64 slot_idx = artifact_num%ts_shared->artifact_slots_count; + U64 stripe_idx = slot_idx%ts_shared->artifact_stripes_count; + TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx]; + TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx]; + TS_TaskArtifact *artifact = (TS_TaskArtifact *)task_ticket.u64[1]; + OS_MutexScopeW(stripe->rw_mutex) + { + artifact->task_is_done = 1; + artifact->result = task_result; + } + os_condition_variable_broadcast(stripe->cv); + } +} diff --git a/src/task_system/task_system.h b/src/task_system/task_system.h new file mode 100644 index 00000000..afa58758 --- /dev/null +++ b/src/task_system/task_system.h @@ -0,0 +1,113 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef TASK_SYSTEM_H +#define TASK_SYSTEM_H + +//////////////////////////////// +//~ rjf: Task "Ticket" Type +// +// "Tickets" are opaque handles, used to refer to submitted tasks. +// + +typedef struct TS_Ticket TS_Ticket; +struct TS_Ticket +{ + U64 u64[2]; +}; + +//////////////////////////////// +//~ rjf: Task Request Types + +typedef void *TS_TaskFunctionType(Arena *arena, void *user_data); + +//////////////////////////////// +//~ rjf: Task Artifact Cache Types + +typedef struct TS_TaskArtifact TS_TaskArtifact; +struct TS_TaskArtifact +{ + TS_TaskArtifact *next; + U64 num; + B64 task_is_done; + void *result; +}; + +typedef struct TS_TaskArtifactSlot TS_TaskArtifactSlot; +struct TS_TaskArtifactSlot +{ + TS_TaskArtifact *first; + TS_TaskArtifact *last; +}; + +typedef struct TS_TaskArtifactStripe TS_TaskArtifactStripe; +struct TS_TaskArtifactStripe +{ + Arena *arena; + OS_Handle cv; + OS_Handle rw_mutex; + TS_TaskArtifact *free_artifact; +}; + +//////////////////////////////// +//~ rjf: Per-Thread State + +typedef struct TS_TaskThread TS_TaskThread; +struct TS_TaskThread +{ + Arena *arena; + OS_Handle thread; +}; + +//////////////////////////////// +//~ rjf: Main Shared State + +typedef struct TS_Shared TS_Shared; +struct TS_Shared +{ + Arena *arena; + + // rjf: task artifact cache + U64 artifact_num_gen; + U64 artifact_slots_count; + U64 artifact_stripes_count; + TS_TaskArtifactSlot *artifact_slots; + TS_TaskArtifactStripe *artifact_stripes; + + // rjf: task ring buffer + U64 u2t_ring_size; + U8 *u2t_ring_base; + U64 u2t_ring_write_pos; + U64 u2t_ring_read_pos; + OS_Handle u2t_ring_mutex; + OS_Handle u2t_ring_cv; + + // rjf: task threads + TS_TaskThread *task_threads; + U64 task_threads_count; +}; + +//////////////////////////////// +//~ rjf: Globals + +global TS_Shared *ts_shared = 0; + +//////////////////////////////// +//~ rjf: Top-Level Layer Initialization + +internal void ts_init(void); + +//////////////////////////////// +//~ rjf: High-Level Task Kickoff / Joining + +internal TS_Ticket ts_kickoff(TS_TaskFunctionType *entry_point, void *p); +internal void *ts_join(TS_Ticket ticket, U64 endt_us); +#define ts_join_struct(ticket, endt_us, type) (type *)ts_join((ticket), (endt_us)) + +//////////////////////////////// +//~ rjf: Task Threads + +internal void ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, void **p_out, TS_Ticket *ticket_out); +internal void ts_task_thread__entry_point(void *p); + +#endif // TASK_SYSTEM_H From 66ef1b3eeb23d6c63108e7c51bae4687f073178d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 11:30:01 -0800 Subject: [PATCH 101/275] raddbgi_from_pdb: move top-level compilation unit parsing to asynchronous tasks --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 59 ++++++++++++------------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 34 +++----------- src/task_system/task_system.c | 35 ++++++++++----- src/task_system/task_system.h | 5 +++ 4 files changed, 63 insertions(+), 70 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 29bd8833..ff9aea22 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -578,6 +578,15 @@ p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p) return out; } +internal void * +p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p) +{ + P2R_CompUnitParseIn *in = (P2R_CompUnitParseIn *)p; + void *out = 0; + ProfScope("parse comp units") out = pdb_comp_unit_array_from_data(arena, in->data); + return out; +} + //////////////////////////////// //~ rjf: Type Forward Resolution Map Build / Thread @@ -1567,6 +1576,9 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_LeafParsed *tpi_leaf = 0; PDB_TpiHashParsed *ipi_hash = 0; CV_LeafParsed *ipi_leaf = 0; + CV_SymParsed *sym = 0; + PDB_CompUnitArray *comp_units = 0; + U64 comp_unit_count = 0; ProfScope("do independent parsing & preparation passess") { //- rjf: form task inputs @@ -1595,41 +1607,26 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); ipi_leaf_in.itype_first = ipi->itype_first; } + P2R_SymbolStreamParseIn sym_parse_in = {dbi ? msf_data_from_stream(msf, dbi->sym_sn) : str8_zero()}; + P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()}; //- rjf: kick off tasks - TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in); - TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in); - TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in); - TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in); - TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in); + TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in); + TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in); + TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in); + TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in); + TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in); + TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_parse_in); + TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, &comp_unit_parse_in); //- rjf: join tasks - exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); - tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); - tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); - ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); - ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse sym - // - CV_SymParsed *sym = 0; - if(dbi != 0) ProfScope("parse sym") - { - String8 sym_data = msf_data_from_stream(msf, dbi->sym_sn); - sym = cv_sym_from_data(arena, sym_data, 4); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse compilation units - // - PDB_CompUnitArray *comp_units = 0; - U64 comp_unit_count = 0; - if(dbi != 0) ProfScope("parse compilation units") - { - String8 mod_info_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); - comp_units = pdb_comp_unit_array_from_data(arena, mod_info_data); + exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); + tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); + tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); + ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); + ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); + sym = ts_join_struct(sym_parse_ticket, max_U64, CV_SymParsed); + comp_units = ts_join_struct(comp_unit_parse_ticket,max_U64, PDB_CompUnitArray); comp_unit_count = comp_units->count; } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index b3b88f00..14d72072 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -67,14 +67,6 @@ struct P2R_TPIHashParseIn String8 aux_data; }; -typedef struct P2R_TPIHashParseTask P2R_TPIHashParseTask; -struct P2R_TPIHashParseTask -{ - P2R_TPIHashParseIn in; - Arena *out_arena; - PDB_TpiHashParsed *out; -}; - //- rjf: tpi leaves parsing typedef struct P2R_TPILeafParseIn P2R_TPILeafParseIn; @@ -84,14 +76,6 @@ struct P2R_TPILeafParseIn CV_TypeId itype_first; }; -typedef struct P2R_TPILeafParseTask P2R_TPILeafParseTask; -struct P2R_TPILeafParseTask -{ - P2R_TPILeafParseIn in; - Arena *out_arena; - CV_LeafParsed *out; -}; - //- rjf: exe hashing typedef struct P2R_EXEHashIn P2R_EXEHashIn; @@ -100,13 +84,6 @@ struct P2R_EXEHashIn String8 exe_data; }; -typedef struct P2R_EXEHashTask P2R_EXEHashTask; -struct P2R_EXEHashTask -{ - P2R_EXEHashIn in; - U64 out; -}; - //- rjf: symbol stream parsing typedef struct P2R_SymbolStreamParseIn P2R_SymbolStreamParseIn; @@ -115,12 +92,12 @@ struct P2R_SymbolStreamParseIn String8 data; }; -typedef struct P2R_SymbolStreamParseTask P2R_SymbolStreamParseTask; -struct P2R_SymbolStreamParseTask +//- rjf: comp unit parsing + +typedef struct P2R_CompUnitParseIn P2R_CompUnitParseIn; +struct P2R_CompUnitParseIn { - P2R_SymbolStreamParseIn in; - Arena *out_arena; - CV_SymParsed *sym; + String8 data; }; //////////////////////////////// @@ -255,6 +232,7 @@ internal void *p2r_exe_hash_task__entry_point(Arena *arena, void *p); internal void *p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p); +internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); //////////////////////////////// //~ rjf: Type Forward Resolution Map Build Path & Thread diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index 2281591e..c4396ebe 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -1,3 +1,13 @@ +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal TS_Ticket +ts_ticket_zero(void) +{ + TS_Ticket ticket = {0}; + return ticket; +} + //////////////////////////////// //~ rjf: Top-Level Layer Initialization @@ -93,21 +103,24 @@ ts_join(TS_Ticket ticket, U64 endt_us) TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx]; TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx]; TS_TaskArtifact *artifact = (TS_TaskArtifact *)ticket.u64[1]; - OS_MutexScopeR(stripe->rw_mutex) for(;;) + if(artifact != 0) { - B64 task_is_done = artifact->task_is_done; - if(task_is_done) + OS_MutexScopeR(stripe->rw_mutex) for(;;) { - OS_MutexScopeRWPromote(stripe->rw_mutex) + B64 task_is_done = artifact->task_is_done; + if(task_is_done) { - result = artifact->result; - SLLStackPush(stripe->free_artifact, artifact); + OS_MutexScopeRWPromote(stripe->rw_mutex) + { + result = artifact->result; + SLLStackPush(stripe->free_artifact, artifact); + } + break; + } + else + { + os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); } - break; - } - else - { - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); } } return result; diff --git a/src/task_system/task_system.h b/src/task_system/task_system.h index afa58758..e6f6466d 100644 --- a/src/task_system/task_system.h +++ b/src/task_system/task_system.h @@ -92,6 +92,11 @@ struct TS_Shared global TS_Shared *ts_shared = 0; +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal TS_Ticket ts_ticket_zero(void); + //////////////////////////////// //~ rjf: Top-Level Layer Initialization From 7e36c25a31bb51c2bbf070a364d1d2d4f9cae782 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 12:04:57 -0800 Subject: [PATCH 102/275] fix more async fwd map building bugs; move symbol stream conversion to task system --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 924 ++++++++++++++++++++---- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 7 +- src/task_system/task_system.c | 5 +- 3 files changed, 769 insertions(+), 167 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index ff9aea22..53d67746 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -588,16 +588,23 @@ p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p) } //////////////////////////////// -//~ rjf: Type Forward Resolution Map Build / Thread +//~ rjf: Type Forward Resolution Map Filling Tasks -internal void -p2r_itype_fwd_map_fill(P2R_ITypeFwdMapFillIn *in) +internal void * +p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p) { - for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) + P2R_ITypeFwdMapFillIn *in = (P2R_ITypeFwdMapFillIn *)p; + ProfScope("fill itype fwd map") for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) { + //- rjf: skip if not in the actually stored itype range + if(itype < in->tpi_leaf->itype_first) + { + continue; + } + //- rjf: determine if this itype resolves to another CV_TypeId itype_fwd = 0; - CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[itype-in->itype_first]; + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[itype-in->tpi_leaf->itype_first]; CV_LeafKind kind = range->hdr.kind; U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); if(range->off+range->hdr.size <= in->tpi_leaf->data.size && @@ -708,31 +715,721 @@ p2r_itype_fwd_map_fill(P2R_ITypeFwdMapFillIn *in) in->itype_fwd_map[itype] = itype_fwd; } } -} - -internal void -p2r_itype_fwd_map_fill_task_thread__entry_point(void *p) -{ - P2R_ITypeFwdMapFillTaskBatch *batch = (P2R_ITypeFwdMapFillTaskBatch *)p; - ThreadName("[p2r] itype fwd map fill thread"); - for(;;) - { - U64 next_task_num = ins_atomic_u64_inc_eval(batch->num_tasks_taken_ptr); - if(next_task_num > batch->tasks_count || 1 > next_task_num) - { - break; - } - P2R_ITypeFwdMapFillTask *task = &batch->tasks[next_task_num-1]; - ProfScope("convert (task #%I64u)", next_task_num) - { - p2r_itype_fwd_map_fill(&task->fill_in); - } - } + return 0; } //////////////////////////////// //~ rjf: Symbol Stream Conversion Path & Thread +internal void * +p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) +{ + Temp scratch = scratch_begin(&arena, 1); + P2R_SymbolStreamConvertIn *in = (P2R_SymbolStreamConvertIn *)p; +#define p2r_type_ptr_from_itype(itype) (((itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) + + ////////////////////////// + //- rjf: set up outputs for this sym stream + // + U64 sym_procedures_chunk_cap = 1024; + U64 sym_global_variables_chunk_cap = 1024; + U64 sym_thread_variables_chunk_cap = 1024; + U64 sym_scopes_chunk_cap = 1024; + RDIM_SymbolChunkList sym_procedures = {0}; + RDIM_SymbolChunkList sym_global_variables = {0}; + RDIM_SymbolChunkList sym_thread_variables = {0}; + RDIM_ScopeChunkList sym_scopes = {0}; + + ////////////////////////// + //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) + // + U64 procedure_frameprocs_count = 0; + U64 procedure_frameprocs_cap = (in->sym_ranges_opl - in->sym_ranges_first); + CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); + ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") + { + U64 procedure_num = 0; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; + CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = in->sym->data.str + sym_off_first; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind + switch(kind) + { + default:{}break; + + //- rjf: FRAMEPROC + case CV_SymKind_FRAMEPROC: + { + if(procedure_num == 0) { break; } + if(procedure_num > procedure_frameprocs_cap) { break; } + CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; + procedure_frameprocs[procedure_num-1] = frameproc; + procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + procedure_num += 1; + }break; + } + } + U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); + arena_put_back(scratch.arena, scratch_overkill); + } + + ////////////////////////// + //- rjf: symbols pass 2: construct all symbols, given procedure frame info map + // + ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") + { + RDIM_LocationSet *defrange_target = 0; + B32 defrange_target_is_param = 0; + U64 procedure_num = 0; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; + CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; + typedef struct P2R_ScopeNode P2R_ScopeNode; + struct P2R_ScopeNode + { + P2R_ScopeNode *next; + RDIM_Scope *scope; + }; + P2R_ScopeNode *top_scope_node = 0; + P2R_ScopeNode *free_scope_node = 0; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = in->sym->data.str + sym_off_first; + void *sym_data_opl = in->sym->data.str + sym_off_opl; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind + switch(kind) + { + default:{}break; + + //- rjf: END + case CV_SymKind_END: + { + P2R_ScopeNode *n = top_scope_node; + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } + defrange_target = 0; + defrange_target_is_param = 0; + }break; + + //- rjf: BLOCK32 + case CV_SymKind_BLOCK32: + { + // rjf: unpack sym + CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base; + + // rjf: build scope, insert into current parent scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + { + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[block32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + block32->off; + U64 voff_last = voff_first + block32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); + } + } + + // rjf: push this scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + }break; + + //- rjf: LDATA32/GDATA32 + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + // rjf: unpack sym + CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(data32+1, sym_data_opl); + COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[data32->sec-1] : 0; + U64 voff = (section ? section->voff : 0) + data32->off; + + // rjf: determine if this is an exact duplicate global + // + // PDB likes to have duplicates of these spread across different + // symbol streams so we deduplicate across the entire translation + // context. + // + B32 is_duplicate = 0; + { + // TODO(rjf): @important global symbol dedup + } + + // rjf: is not duplicate -> push new global + if(!is_duplicate) + { + // rjf: unpack global variable's type + RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); + + // rjf: unpack global's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack global's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build symbol + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, &sym_global_variables, sym_global_variables_chunk_cap); + symbol->is_extern = (kind == CV_SymKind_GDATA32); + symbol->name = name; + symbol->type = type; + symbol->offset = voff; + symbol->container_symbol = container_symbol; + symbol->container_type = container_type; + } + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + // rjf: unpack sym + CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(proc32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); + + // rjf: unpack proc's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack proc's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build procedure's root scope + // + // NOTE: even if there could be a containing scope at this point (which should be + // illegal in C/C++ but not necessarily in another language) we would not use + // it here because these scopes refer to the ranges of code that make up a + // procedure *not* the namespaces, so a procedure's root scope always has + // no parent. + RDIM_Scope *procedure_root_scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + { + COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[proc32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + proc32->off; + U64 voff_last = voff_first + proc32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, &sym_scopes, procedure_root_scope, voff_range); + } + } + + // rjf: root scope voff minimum range -> link name + String8 link_name = {0}; + if(procedure_root_scope->voff_ranges.min != 0) + { + U64 voff = procedure_root_scope->voff_ranges.min; + U64 hash = p2r_hash_from_voff(voff); + U64 bucket_idx = hash%in->link_name_map->buckets_count; + P2R_LinkNameNode *node = 0; + for(P2R_LinkNameNode *n = in->link_name_map->buckets[bucket_idx]; n != 0; n = n->next) + { + if(n->voff == voff) + { + link_name = n->name; + break; + } + } + } + + // rjf: build procedure symbol + RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, &sym_procedures, sym_procedures_chunk_cap); + procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); + procedure_symbol->name = name; + procedure_symbol->link_name = link_name; + procedure_symbol->type = type; + procedure_symbol->container_symbol = container_symbol; + procedure_symbol->container_type = container_type; + procedure_symbol->root_scope = procedure_root_scope; + + // rjf: fill root scope's symbol + procedure_root_scope->symbol = procedure_symbol; + + // rjf: push scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = procedure_root_scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: increment procedure counter + procedure_num += 1; + }break; + + //- rjf: REGREL32 + case CV_SymKind_REGREL32: + { + // TODO(rjf): apparently some of the information here may end up being + // redundant with "better" information from CV_SymKind_LOCAL record. + // we don't currently handle this, but if those cases arise then it + // will obviously be better to prefer the better information from both + // records. + + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); + CV_Reg cv_reg = regrel32->reg; + U32 var_off = regrel32->reg_off; + + // rjf: determine if this is a parameter + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + { + B32 is_stack_reg = 0; + switch(in->arch) + { + default:{}break; + case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP);}break; + case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP);}break; + } + if(is_stack_reg) + { + U32 frame_size = 0xFFFFFFFF; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; + frame_size = frameproc->frame_size; + } + if(var_off > frame_size) + { + local_kind = RDI_LocalKind_Parameter; + } + } + } + + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); + local->kind = local_kind; + local->name = name; + local->type = type; + + // rjf: add location info to local + { + // rjf: determine if we need an extra indirection to the value + B32 extra_indirection_to_value = 0; + switch(in->arch) + { + case RDI_Arch_X86: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))); + }break; + case RDI_Arch_X64: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); + }break; + } + + // rjf: get raddbg register code + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + // TODO(rjf): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // rjf: set location case + RDIM_Location *loc = p2r_location_from_addr_reg_off(arena, in->arch, register_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_set_push_case(arena, &sym_scopes, &local->locset, voff_range, loc); + } + }break; + + //- rjf: LTHREAD32/GTHREAD32 + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + { + // rjf: unpack sym + CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(thread32+1, sym_data_opl); + U32 tls_off = thread32->tls_off; + RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); + + // rjf: unpack thread variable's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack thread variable's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build symbol + RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, &sym_thread_variables, sym_thread_variables_chunk_cap); + tvar->name = name; + tvar->type = type; + tvar->is_extern = (kind == CV_SymKind_GTHREAD32); + tvar->offset = tls_off; + tvar->container_type = container_type; + tvar->container_symbol = container_symbol; + }break; + + //- rjf: LOCAL + case CV_SymKind_LOCAL: + { + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base; + String8 name = str8_cstring_capped(slocal+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); + + // rjf: determine if this symbol encodes the beginning of a global modification + B32 is_global_modification = 0; + if((slocal->flags & CV_LocalFlag_Global) || + (slocal->flags & CV_LocalFlag_Static)) + { + is_global_modification = 1; + } + + // rjf: is global modification -> emit global modification symbol + if(is_global_modification) + { + // TODO(rjf): add global modification symbols + defrange_target = 0; + defrange_target_is_param = 0; + } + + // rjf: is not a global modification -> emit a local variable + if(!is_global_modification) + { + // rjf: determine local kind + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + if(slocal->flags & CV_LocalFlag_Param) + { + local_kind = RDI_LocalKind_Parameter; + } + + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); + local->kind = local_kind; + local->name = name; + local->type = type; + + // rjf: save defrange target, for subsequent defrange symbols + defrange_target = &local->locset; + defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); + } + }break; + + //- rjf: DEFRANGE_REGISTESR + case CV_SymKind_DEFRANGE_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; + CV_Reg cv_reg = defrange_register->reg; + CV_LvarAddrRange *range = &defrange_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + + // rjf: build location + RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; + CV_LvarAddrRange *range = &defrange_fprel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: select frame pointer register + CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); + RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel->off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_SUBFIELD_REGISTER + case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; + CV_Reg cv_reg = defrange_subfield_register->reg; + CV_LvarAddrRange *range = &defrange_subfield_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + + // rjf: skip "subfield" location info - currently not supported + if(defrange_subfield_register->field_offset != 0) + { + break; + } + + // rjf: build location + RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; + CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); + RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel_full_scope->off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit location over ranges + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_set_push_case(arena, &sym_scopes, defrange_target, voff_range, location); + }break; + + //- rjf: DEFRANGE_REGISTER_REL + case CV_SymKind_DEFRANGE_REGISTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; + CV_Reg cv_reg = defrange_register_rel->reg; + RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + CV_LvarAddrRange *range = &defrange_register_rel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: build location + // TODO(rjf): offset & size from cv_reg code + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + B32 extra_indirection_to_value = 0; + S64 var_off = defrange_register_rel->reg_off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, register_code, byte_size, byte_pos, var_off, extra_indirection_to_value); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: FILESTATIC + case CV_SymKind_FILESTATIC: + { + CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; + String8 name = str8_cstring_capped(file_static+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); + // TODO(rjf): emit a global modifier symbol + defrange_target = 0; + defrange_target_is_param = 0; + }break; + } + } + } + + ////////////////////////// + //- rjf: allocate & fill output + // + P2R_SymbolStreamConvertOut *out = push_array(arena, P2R_SymbolStreamConvertOut, 1); + { + out->procedures = sym_procedures; + out->global_variables = sym_global_variables; + out->thread_variables = sym_thread_variables; + out->scopes = sym_scopes; + } + +#undef p2r_type_ptr_from_itype + scratch_end(scratch); + return out; +} + internal P2R_SymbolStreamConvertOut * p2r_symbol_stream_convert(Arena *arena, P2R_SymbolStreamConvertIn *in) { @@ -1869,72 +2566,29 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_TypeId itype_opl = tpi_leaf->itype_opl; ProfScope("types pass 1: produce type forward resolution map") { - //////////////////////////// //- rjf: allocate forward resolution map - // itype_fwd_map = push_array(arena, CV_TypeId, (U64)itype_opl); - //////////////////////////// - //- rjf: produce task batch - // - U64 num_tasks_taken = 0; - P2R_ITypeFwdMapFillTaskBatch task_batch = {0}; + //- rjf: kick off tasks to fill forward resolution map + U64 task_size_itypes = 4096; + U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; + P2R_ITypeFwdMapFillIn *tasks_inputs = push_array(scratch.arena, P2R_ITypeFwdMapFillIn, tasks_count); + TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); + for(U64 idx = 0; idx < tasks_count; idx += 1) { - U64 task_size_itypes = 4096; - task_batch.tasks_count = (U64)itype_opl/task_size_itypes; - task_batch.tasks = push_array(scratch.arena, P2R_ITypeFwdMapFillTask, task_batch.tasks_count); - task_batch.num_tasks_taken_ptr = &num_tasks_taken; - for(U64 task_idx = 0; task_idx < task_batch.tasks_count; task_idx += 1) - { - P2R_ITypeFwdMapFillTask *task = &task_batch.tasks[task_idx]; - task->fill_in.tpi_hash = tpi_hash; - task->fill_in.tpi_leaf = tpi_leaf; - task->fill_in.itype_first = task_idx*task_size_itypes; - task->fill_in.itype_opl = task->fill_in.itype_first + task_size_itypes; - task->fill_in.itype_opl = ClampTop(task->fill_in.itype_opl, itype_opl); - task->fill_in.itype_fwd_map = itype_fwd_map; - } + tasks_inputs[idx].tpi_hash = tpi_hash; + tasks_inputs[idx].tpi_leaf = tpi_leaf; + tasks_inputs[idx].itype_first = idx*task_size_itypes; + tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; + tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); + tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + tasks_tickets[idx] = ts_kickoff(p2r_itype_fwd_map_fill_task__entry_point, &tasks_inputs[idx]); } - //////////////////////////// - //- rjf: launch task threads - // - U64 task_threads_count = os_logical_core_count()-1; - OS_Handle *task_threads = push_array(scratch.arena, OS_Handle, task_threads_count); - for(U64 idx = 0; idx < task_threads_count; idx += 1) + //- rjf: join all tasks + for(U64 idx = 0; idx < tasks_count; idx += 1) { - task_threads[idx] = os_launch_thread(p2r_itype_fwd_map_fill_task_thread__entry_point, &task_batch, 0); - } - - //////////////////////////// - //- rjf: perform tasks on the main thread - // - ProfScope("perform tasks on the main thread") - { - for(;;) - { - U64 next_task_num = ins_atomic_u64_inc_eval(task_batch.num_tasks_taken_ptr); - if(next_task_num > task_batch.tasks_count || 1 > next_task_num) - { - break; - } - P2R_ITypeFwdMapFillTask *task = &task_batch.tasks[next_task_num-1]; - ProfScope("convert (task #%I64u)", next_task_num) - { - p2r_itype_fwd_map_fill(&task->fill_in); - } - } - } - - //////////////////////////// - //- rjf: wait for task threads - // - ProfScope("wait for task threads") - { - for(U64 idx = 0; idx < task_threads_count; idx += 1) - { - os_thread_wait(task_threads[idx], max_U64); - } + ts_join(tasks_tickets[idx], max_U64); } } @@ -3277,103 +3931,53 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) ProfScope("produce symbols from all streams") { //////////////////////////// - //- rjf: produce per-task info + //- rjf: kick off all symbol conversion tasks // U64 global_stream_subdivision_tasks_count = (sym->sym_ranges.count+65535)/65536; U64 global_stream_syms_per_task = sym->sym_ranges.count/global_stream_subdivision_tasks_count; U64 tasks_count = comp_unit_count + global_stream_subdivision_tasks_count; - P2R_SymbolStreamTask *tasks = push_array(scratch.arena, P2R_SymbolStreamTask, tasks_count); + P2R_SymbolStreamConvertIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamConvertIn, tasks_count); + TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); + ProfScope("kick off all symbol conversion tasks") { for(U64 idx = 0; idx < tasks_count; idx += 1) { - tasks[idx].convert_in.arch = arch; - tasks[idx].convert_in.coff_sections = coff_sections; - tasks[idx].convert_in.tpi_hash = tpi_hash; - tasks[idx].convert_in.tpi_leaf = tpi_leaf; - tasks[idx].convert_in.itype_fwd_map = itype_fwd_map; - tasks[idx].convert_in.itype_type_ptrs = itype_type_ptrs; - tasks[idx].convert_in.link_name_map = &link_name_map; - tasks[idx].out_arena = arena_alloc(); + tasks_inputs[idx].arch = arch; + tasks_inputs[idx].coff_sections = coff_sections; + tasks_inputs[idx].tpi_hash = tpi_hash; + tasks_inputs[idx].tpi_leaf = tpi_leaf; + tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; + tasks_inputs[idx].link_name_map = &link_name_map; if(idx < global_stream_subdivision_tasks_count) { - tasks[idx].convert_in.sym = sym; - tasks[idx].convert_in.sym_ranges_first= idx*global_stream_syms_per_task; - tasks[idx].convert_in.sym_ranges_opl = tasks[idx].convert_in.sym_ranges_first + global_stream_syms_per_task; - tasks[idx].convert_in.sym_ranges_opl = ClampTop(tasks[idx].convert_in.sym_ranges_opl, sym->sym_ranges.count); + tasks_inputs[idx].sym = sym; + tasks_inputs[idx].sym_ranges_first= idx*global_stream_syms_per_task; + tasks_inputs[idx].sym_ranges_opl = tasks_inputs[idx].sym_ranges_first + global_stream_syms_per_task; + tasks_inputs[idx].sym_ranges_opl = ClampTop(tasks_inputs[idx].sym_ranges_opl, sym->sym_ranges.count); } else { - tasks[idx].convert_in.sym = sym_for_unit[idx-global_stream_subdivision_tasks_count]; - tasks[idx].convert_in.sym_ranges_first= 0; - tasks[idx].convert_in.sym_ranges_opl = sym_for_unit[idx-global_stream_subdivision_tasks_count]->sym_ranges.count; + tasks_inputs[idx].sym = sym_for_unit[idx-global_stream_subdivision_tasks_count]; + tasks_inputs[idx].sym_ranges_first= 0; + tasks_inputs[idx].sym_ranges_opl = sym_for_unit[idx-global_stream_subdivision_tasks_count]->sym_ranges.count; } + tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_convert_task__entry_point, &tasks_inputs[idx]); } } //////////////////////////// - //- rjf: produce task batch info + //- rjf: join tasks, merge with top-level collections // - U64 num_tasks_taken = 0; - P2R_SymbolStreamTaskBatch task_batch = {0}; - { - task_batch.tasks = tasks; - task_batch.tasks_count = tasks_count; - task_batch.num_tasks_taken_ptr = &num_tasks_taken; - } - - //////////////////////////// - //- rjf: launch task threads - // - U64 task_threads_count = os_logical_core_count()-1; - OS_Handle *task_threads = push_array(scratch.arena, OS_Handle, task_threads_count); - for(U64 idx = 0; idx < task_threads_count; idx += 1) - { - task_threads[idx] = os_launch_thread(p2r_symbol_stream_convert_task_thread__entry_point, &task_batch, 0); - } - - //////////////////////////// - //- rjf: perform tasks on the main thread - // - ProfScope("perform tasks on the main thread") - { - for(;;) - { - U64 next_task_num = ins_atomic_u64_inc_eval(task_batch.num_tasks_taken_ptr); - if(next_task_num > task_batch.tasks_count || 1 > next_task_num) - { - break; - } - P2R_SymbolStreamTask *task = &task_batch.tasks[next_task_num-1]; - ProfScope("convert (task #%I64u)", next_task_num) - { - task->convert_out = p2r_symbol_stream_convert(task->out_arena, &task->convert_in); - } - } - } - - //////////////////////////// - //- rjf: wait for task threads - // - ProfScope("wait for task threads") - { - for(U64 idx = 0; idx < task_threads_count; idx += 1) - { - os_thread_wait(task_threads[idx], max_U64); - } - } - - //////////////////////////// - //- rjf: merge artifacts from all tasks - // - ProfScope("merge artifacts from all tasks") + ProfScope("join tasks, merge with top-level collections") { for(U64 idx = 0; idx < tasks_count; idx += 1) { - arena_absorb(arena, tasks[idx].out_arena); - rdim_symbol_chunk_list_concat_in_place(&all_procedures, &tasks[idx].convert_out->procedures); - rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &tasks[idx].convert_out->global_variables); - rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &tasks[idx].convert_out->thread_variables); - rdim_scope_chunk_list_concat_in_place(&all_scopes, &tasks[idx].convert_out->scopes); + P2R_SymbolStreamConvertOut *out = ts_join_struct(tasks_tickets[idx], max_U64, P2R_SymbolStreamConvertOut); + rdim_symbol_chunk_list_concat_in_place(&all_procedures, &out->procedures); + rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &out->global_variables); + rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &out->thread_variables); + rdim_scope_chunk_list_concat_in_place(&all_scopes, &out->scopes); } } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 14d72072..c62bd0cd 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -235,14 +235,15 @@ internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); //////////////////////////////// -//~ rjf: Type Forward Resolution Map Build Path & Thread +//~ rjf: Type Forward Resolution Map Filling Tasks -internal void p2r_itype_fwd_map_fill(P2R_ITypeFwdMapFillIn *in); -internal void p2r_itype_fwd_map_fill_task_thread__entry_point(void *p); +internal void *p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p); //////////////////////////////// //~ rjf: Symbol Stream Conversion Paths & Thread +internal void *p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p); + internal P2R_SymbolStreamConvertOut *p2r_symbol_stream_convert(Arena *arena, P2R_SymbolStreamConvertIn *in); internal void p2r_symbol_stream_convert_task_thread__entry_point(void *p); diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index c4396ebe..e3a8747c 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -117,10 +117,7 @@ ts_join(TS_Ticket ticket, U64 endt_us) } break; } - else - { - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); - } + os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); } } return result; From 53bc258c4aa017efde184a54e564adb390ade180 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 12:58:04 -0800 Subject: [PATCH 103/275] raddbgi_from_pdb: move itype dependency chain building to task threads --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 1214 +++++------------------ src/raddbgi_from_pdb/raddbgi_from_pdb.h | 46 +- 2 files changed, 270 insertions(+), 990 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 53d67746..d2397f9d 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -588,7 +588,7 @@ p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p) } //////////////////////////////// -//~ rjf: Type Forward Resolution Map Filling Tasks +//~ rjf: Type Parsing/Conversion Tasks internal void * p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p) @@ -718,6 +718,239 @@ p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p) return 0; } +internal void * +p2r_itype_chain_build_task__entry_point(Arena *arena, void *p) +{ + Temp scratch = scratch_begin(&arena, 1); + P2R_ITypeChainBuildIn *in = (P2R_ITypeChainBuildIn *)p; + for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) + { + //- rjf: push initial itype - should be final-visited-itype for this itype + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = itype; + SLLStackPush(in->itype_chains[itype], c); + } + + //- rjf: skip basic types for dependency walk + if(itype < in->tpi_leaf->itype_first) + { + continue; + } + + //- rjf: walk dependent types, push to chain + P2R_TypeIdChain start_walk_task = {0, itype}; + P2R_TypeIdChain *first_walk_task = &start_walk_task; + P2R_TypeIdChain *last_walk_task = &start_walk_task; + for(P2R_TypeIdChain *walk_task = first_walk_task; + walk_task != 0; + walk_task = walk_task->next) + { + CV_TypeId walk_itype = in->itype_fwd_map[walk_task->itype] ? in->itype_fwd_map[walk_task->itype] : walk_task->itype; + if(walk_itype < in->tpi_leaf->itype_first) + { + continue; + } + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[walk_itype-in->tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= in->tpi_leaf->data.size && + range->off+2+header_struct_size <= in->tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: + { + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: POINTER + case CV_LeafKind_POINTER: + { + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: + { + CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: + { + CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: + { + CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: ARRAY + case CV_LeafKind_ARRAY: + { + CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + } + } + } + } + scratch_end(scratch); + return 0; +} + //////////////////////////////// //~ rjf: Symbol Stream Conversion Path & Thread @@ -1430,734 +1663,6 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) return out; } -internal P2R_SymbolStreamConvertOut * -p2r_symbol_stream_convert(Arena *arena, P2R_SymbolStreamConvertIn *in) -{ - Temp scratch = scratch_begin(&arena, 1); -#define p2r_type_ptr_from_itype(itype) (((itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) - - ////////////////////////// - //- rjf: set up outputs for this sym stream - // - U64 sym_procedures_chunk_cap = 1024; - U64 sym_global_variables_chunk_cap = 1024; - U64 sym_thread_variables_chunk_cap = 1024; - U64 sym_scopes_chunk_cap = 1024; - RDIM_SymbolChunkList sym_procedures = {0}; - RDIM_SymbolChunkList sym_global_variables = {0}; - RDIM_SymbolChunkList sym_thread_variables = {0}; - RDIM_ScopeChunkList sym_scopes = {0}; - - ////////////////////////// - //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) - // - U64 procedure_frameprocs_count = 0; - U64 procedure_frameprocs_cap = (in->sym_ranges_opl - in->sym_ranges_first); - CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); - ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") - { - U64 procedure_num = 0; - CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; - CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = in->sym->data.str + sym_off_first; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) - { - default:{}break; - - //- rjf: FRAMEPROC - case CV_SymKind_FRAMEPROC: - { - if(procedure_num == 0) { break; } - if(procedure_num > procedure_frameprocs_cap) { break; } - CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; - procedure_frameprocs[procedure_num-1] = frameproc; - procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - procedure_num += 1; - }break; - } - } - U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); - arena_put_back(scratch.arena, scratch_overkill); - } - - ////////////////////////// - //- rjf: symbols pass 2: construct all symbols, given procedure frame info map - // - ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") - { - RDIM_LocationSet *defrange_target = 0; - B32 defrange_target_is_param = 0; - U64 procedure_num = 0; - CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; - CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; - typedef struct P2R_ScopeNode P2R_ScopeNode; - struct P2R_ScopeNode - { - P2R_ScopeNode *next; - RDIM_Scope *scope; - }; - P2R_ScopeNode *top_scope_node = 0; - P2R_ScopeNode *free_scope_node = 0; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = in->sym->data.str + sym_off_first; - void *sym_data_opl = in->sym->data.str + sym_off_opl; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) - { - default:{}break; - - //- rjf: END - case CV_SymKind_END: - { - P2R_ScopeNode *n = top_scope_node; - if(n != 0) - { - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); - } - defrange_target = 0; - defrange_target_is_param = 0; - }break; - - //- rjf: BLOCK32 - case CV_SymKind_BLOCK32: - { - // rjf: unpack sym - CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base; - - // rjf: build scope, insert into current parent scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); - { - if(top_scope_node == 0) - { - // TODO(rjf): log - } - if(top_scope_node != 0) - { - RDIM_Scope *top_scope = top_scope_node->scope; - SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); - scope->parent_scope = top_scope; - scope->symbol = top_scope->symbol; - } - COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[block32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + block32->off; - U64 voff_last = voff_first + block32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); - } - } - - // rjf: push this scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = scope; - SLLStackPush(top_scope_node, node); - } - }break; - - //- rjf: LDATA32/GDATA32 - case CV_SymKind_LDATA32: - case CV_SymKind_GDATA32: - { - // rjf: unpack sym - CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(data32+1, sym_data_opl); - COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[data32->sec-1] : 0; - U64 voff = (section ? section->voff : 0) + data32->off; - - // rjf: determine if this is an exact duplicate global - // - // PDB likes to have duplicates of these spread across different - // symbol streams so we deduplicate across the entire translation - // context. - // - B32 is_duplicate = 0; - { - // TODO(rjf): @important global symbol dedup - } - - // rjf: is not duplicate -> push new global - if(!is_duplicate) - { - // rjf: unpack global variable's type - RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); - - // rjf: unpack global's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack global's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build symbol - RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, &sym_global_variables, sym_global_variables_chunk_cap); - symbol->is_extern = (kind == CV_SymKind_GDATA32); - symbol->name = name; - symbol->type = type; - symbol->offset = voff; - symbol->container_symbol = container_symbol; - symbol->container_type = container_type; - } - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - // rjf: unpack sym - CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(proc32+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); - - // rjf: unpack proc's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack proc's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build procedure's root scope - // - // NOTE: even if there could be a containing scope at this point (which should be - // illegal in C/C++ but not necessarily in another language) we would not use - // it here because these scopes refer to the ranges of code that make up a - // procedure *not* the namespaces, so a procedure's root scope always has - // no parent. - RDIM_Scope *procedure_root_scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); - { - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[proc32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + proc32->off; - U64 voff_last = voff_first + proc32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, &sym_scopes, procedure_root_scope, voff_range); - } - } - - // rjf: root scope voff minimum range -> link name - String8 link_name = {0}; - if(procedure_root_scope->voff_ranges.min != 0) - { - U64 voff = procedure_root_scope->voff_ranges.min; - U64 hash = p2r_hash_from_voff(voff); - U64 bucket_idx = hash%in->link_name_map->buckets_count; - P2R_LinkNameNode *node = 0; - for(P2R_LinkNameNode *n = in->link_name_map->buckets[bucket_idx]; n != 0; n = n->next) - { - if(n->voff == voff) - { - link_name = n->name; - break; - } - } - } - - // rjf: build procedure symbol - RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, &sym_procedures, sym_procedures_chunk_cap); - procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); - procedure_symbol->name = name; - procedure_symbol->link_name = link_name; - procedure_symbol->type = type; - procedure_symbol->container_symbol = container_symbol; - procedure_symbol->container_type = container_type; - procedure_symbol->root_scope = procedure_root_scope; - - // rjf: fill root scope's symbol - procedure_root_scope->symbol = procedure_symbol; - - // rjf: push scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = procedure_root_scope; - SLLStackPush(top_scope_node, node); - } - - // rjf: increment procedure counter - procedure_num += 1; - }break; - - //- rjf: REGREL32 - case CV_SymKind_REGREL32: - { - // TODO(rjf): apparently some of the information here may end up being - // redundant with "better" information from CV_SymKind_LOCAL record. - // we don't currently handle this, but if those cases arise then it - // will obviously be better to prefer the better information from both - // records. - - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); - CV_Reg cv_reg = regrel32->reg; - U32 var_off = regrel32->reg_off; - - // rjf: determine if this is a parameter - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - { - B32 is_stack_reg = 0; - switch(in->arch) - { - default:{}break; - case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP);}break; - case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP);}break; - } - if(is_stack_reg) - { - U32 frame_size = 0xFFFFFFFF; - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) - { - CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; - frame_size = frameproc->frame_size; - } - if(var_off > frame_size) - { - local_kind = RDI_LocalKind_Parameter; - } - } - } - - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; - - // rjf: add location info to local - { - // rjf: determine if we need an extra indirection to the value - B32 extra_indirection_to_value = 0; - switch(in->arch) - { - case RDI_Arch_X86: - { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))); - }break; - case RDI_Arch_X64: - { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); - }break; - } - - // rjf: get raddbg register code - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); - // TODO(rjf): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; - - // rjf: set location case - RDIM_Location *loc = p2r_location_from_addr_reg_off(arena, in->arch, register_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_set_push_case(arena, &sym_scopes, &local->locset, voff_range, loc); - } - }break; - - //- rjf: LTHREAD32/GTHREAD32 - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - { - // rjf: unpack sym - CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(thread32+1, sym_data_opl); - U32 tls_off = thread32->tls_off; - RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); - - // rjf: unpack thread variable's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack thread variable's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build symbol - RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, &sym_thread_variables, sym_thread_variables_chunk_cap); - tvar->name = name; - tvar->type = type; - tvar->is_extern = (kind == CV_SymKind_GTHREAD32); - tvar->offset = tls_off; - tvar->container_type = container_type; - tvar->container_symbol = container_symbol; - }break; - - //- rjf: LOCAL - case CV_SymKind_LOCAL: - { - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base; - String8 name = str8_cstring_capped(slocal+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); - - // rjf: determine if this symbol encodes the beginning of a global modification - B32 is_global_modification = 0; - if((slocal->flags & CV_LocalFlag_Global) || - (slocal->flags & CV_LocalFlag_Static)) - { - is_global_modification = 1; - } - - // rjf: is global modification -> emit global modification symbol - if(is_global_modification) - { - // TODO(rjf): add global modification symbols - defrange_target = 0; - defrange_target_is_param = 0; - } - - // rjf: is not a global modification -> emit a local variable - if(!is_global_modification) - { - // rjf: determine local kind - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - if(slocal->flags & CV_LocalFlag_Param) - { - local_kind = RDI_LocalKind_Parameter; - } - - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; - - // rjf: save defrange target, for subsequent defrange symbols - defrange_target = &local->locset; - defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); - } - }break; - - //- rjf: DEFRANGE_REGISTESR - case CV_SymKind_DEFRANGE_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; - CV_Reg cv_reg = defrange_register->reg; - CV_LvarAddrRange *range = &defrange_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); - - // rjf: build location - RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; - CV_LvarAddrRange *range = &defrange_fprel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); - RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = rdi_addr_size_from_arch(in->arch); - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel->off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_SUBFIELD_REGISTER - case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; - CV_Reg cv_reg = defrange_subfield_register->reg; - CV_LvarAddrRange *range = &defrange_subfield_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); - - // rjf: skip "subfield" location info - currently not supported - if(defrange_subfield_register->field_offset != 0) - { - break; - } - - // rjf: build location - RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; - CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); - RDI_RegisterCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = rdi_addr_size_from_arch(in->arch); - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel_full_scope->off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit location over ranges - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_set_push_case(arena, &sym_scopes, defrange_target, voff_range, location); - }break; - - //- rjf: DEFRANGE_REGISTER_REL - case CV_SymKind_DEFRANGE_REGISTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; - CV_Reg cv_reg = defrange_register_rel->reg; - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); - CV_LvarAddrRange *range = &defrange_register_rel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: build location - // TODO(rjf): offset & size from cv_reg code - U32 byte_size = rdi_addr_size_from_arch(in->arch); - U32 byte_pos = 0; - B32 extra_indirection_to_value = 0; - S64 var_off = defrange_register_rel->reg_off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, register_code, byte_size, byte_pos, var_off, extra_indirection_to_value); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: FILESTATIC - case CV_SymKind_FILESTATIC: - { - CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; - String8 name = str8_cstring_capped(file_static+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); - // TODO(rjf): emit a global modifier symbol - defrange_target = 0; - defrange_target_is_param = 0; - }break; - } - } - } - - ////////////////////////// - //- rjf: allocate & fill output - // - P2R_SymbolStreamConvertOut *out = push_array(arena, P2R_SymbolStreamConvertOut, 1); - { - out->procedures = sym_procedures; - out->global_variables = sym_global_variables; - out->thread_variables = sym_thread_variables; - out->scopes = sym_scopes; - } - -#undef p2r_type_ptr_from_itype - scratch_end(scratch); - return out; -} - -internal void -p2r_symbol_stream_convert_task_thread__entry_point(void *p) -{ - P2R_SymbolStreamTaskBatch *batch = (P2R_SymbolStreamTaskBatch *)p; - ThreadName("[p2r] unit symbol thread"); - for(;;) - { - U64 next_task_num = ins_atomic_u64_inc_eval(batch->num_tasks_taken_ptr); - if(next_task_num > batch->tasks_count || 1 > next_task_num) - { - break; - } - P2R_SymbolStreamTask *task = &batch->tasks[next_task_num-1]; - ProfScope("convert (task #%I64u)", next_task_num) - { - task->convert_out = p2r_symbol_stream_convert(task->out_arena, &task->convert_in); - } - } -} - //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point @@ -2602,242 +2107,33 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) // this chain is walked, so that deeper dependencies are built first, and // as such, always show up *earlier* in the actually built types. // - typedef struct P2R_TypeIdChain P2R_TypeIdChain; - struct P2R_TypeIdChain - { - P2R_TypeIdChain *next; - CV_TypeId itype; - }; P2R_TypeIdChain **itype_chains = 0; ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") { - Temp scratch = scratch_begin(&arena, 1); + //- rjf: allocate itype chain table itype_chains = push_array(arena, P2R_TypeIdChain *, (U64)itype_opl); - for(CV_TypeId itype = 0; itype < itype_opl; itype += 1) + + //- rjf: kick off tasks to fill itype chain table + U64 task_size_itypes = 4096; + U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; + P2R_ITypeChainBuildIn *tasks_inputs = push_array(scratch.arena, P2R_ITypeChainBuildIn, tasks_count); + TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); + for(U64 idx = 0; idx < tasks_count; idx += 1) { - //- rjf: push initial itype - should be final-visited-itype for this itype - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = itype; - SLLStackPush(itype_chains[itype], c); - } - - //- rjf: skip basic types for dependency walk - if(itype < itype_first) - { - continue; - } - - //- rjf: walk dependent types, push to chain - P2R_TypeIdChain start_walk_task = {0, itype}; - P2R_TypeIdChain *first_walk_task = &start_walk_task; - P2R_TypeIdChain *last_walk_task = &start_walk_task; - for(P2R_TypeIdChain *walk_task = first_walk_task; - walk_task != 0; - walk_task = walk_task->next) - { - CV_TypeId walk_itype = itype_fwd_map[walk_task->itype] ? itype_fwd_map[walk_task->itype] : walk_task->itype; - if(walk_itype < itype_first) - { - continue; - } - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[walk_itype-itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= tpi_leaf->data.size && - range->off+2+header_struct_size <= tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) - { - default:{}break; - - //- rjf: MODIFIER - case CV_LeafKind_MODIFIER: - { - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: POINTER - case CV_LeafKind_POINTER: - { - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: PROCEDURE - case CV_LeafKind_PROCEDURE: - { - CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLStackPush(itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: MFUNCTION - case CV_LeafKind_MFUNCTION: - { - CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLStackPush(itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLStackPush(itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->this_itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->this_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: BITFIELD - case CV_LeafKind_BITFIELD: - { - CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: ARRAY - case CV_LeafKind_ARRAY: - { - CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->entry_itype; - SLLStackPush(itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->index_itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->entry_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->index_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->base_itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->base_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - } - } - } + tasks_inputs[idx].tpi_leaf = tpi_leaf; + tasks_inputs[idx].itype_first = idx*task_size_itypes; + tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; + tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); + tasks_inputs[idx].itype_chains = itype_chains; + tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + tasks_tickets[idx] = ts_kickoff(p2r_itype_chain_build_task__entry_point, &tasks_inputs[idx]); + } + + //- rjf: join all tasks + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + ts_join(tasks_tickets[idx], max_U64); } - scratch_end(scratch); } ////////////////////////////////////////////////////////////// diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index c62bd0cd..90449894 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -134,18 +134,23 @@ struct P2R_ITypeFwdMapFillIn CV_TypeId *itype_fwd_map; }; -typedef struct P2R_ITypeFwdMapFillTask P2R_ITypeFwdMapFillTask; -struct P2R_ITypeFwdMapFillTask +//- rjf: itype chain build + +typedef struct P2R_TypeIdChain P2R_TypeIdChain; +struct P2R_TypeIdChain { - P2R_ITypeFwdMapFillIn fill_in; + P2R_TypeIdChain *next; + CV_TypeId itype; }; -typedef struct P2R_ITypeFwdMapFillTaskBatch P2R_ITypeFwdMapFillTaskBatch; -struct P2R_ITypeFwdMapFillTaskBatch +typedef struct P2R_ITypeChainBuildIn P2R_ITypeChainBuildIn; +struct P2R_ITypeChainBuildIn { - P2R_ITypeFwdMapFillTask *tasks; - U64 tasks_count; - U64 *num_tasks_taken_ptr; + CV_LeafParsed *tpi_leaf; + CV_TypeId itype_first; + CV_TypeId itype_opl; + CV_TypeId *itype_fwd_map; + P2R_TypeIdChain **itype_chains; }; //- rjf: symbol stream conversion @@ -174,25 +179,6 @@ struct P2R_SymbolStreamConvertOut RDIM_ScopeChunkList scopes; }; -typedef struct P2R_SymbolStreamTask P2R_SymbolStreamTask; -struct P2R_SymbolStreamTask -{ - // rjf: inputs - P2R_SymbolStreamConvertIn convert_in; - - // rjf: outputs - Arena *out_arena; - P2R_SymbolStreamConvertOut *convert_out; -}; - -typedef struct P2R_SymbolStreamTaskBatch P2R_SymbolStreamTaskBatch; -struct P2R_SymbolStreamTaskBatch -{ - P2R_SymbolStreamTask *tasks; - U64 tasks_count; - U64 *num_tasks_taken_ptr; -}; - //////////////////////////////// //~ rjf: Basic Helpers @@ -235,18 +221,16 @@ internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); //////////////////////////////// -//~ rjf: Type Forward Resolution Map Filling Tasks +//~ rjf: Type Parsing/Conversion Tasks internal void *p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p); +internal void *p2r_itype_chain_build_task__entry_point(Arena *arena, void *p); //////////////////////////////// //~ rjf: Symbol Stream Conversion Paths & Thread internal void *p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p); -internal P2R_SymbolStreamConvertOut *p2r_symbol_stream_convert(Arena *arena, P2R_SymbolStreamConvertIn *in); -internal void p2r_symbol_stream_convert_task_thread__entry_point(void *p); - //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point From e7ab92e07ccd1b84d67cb9bfa1ce186d5a2f964d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 13:09:23 -0800 Subject: [PATCH 104/275] raddbgi_from_pdb: move comp unit contributions parsing out to task threads; move per-comp-unit top-level symbol parsing to task threads --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 79 ++++++++++++++----------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 10 ++++ 2 files changed, 55 insertions(+), 34 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index d2397f9d..45e0c4a3 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -587,6 +587,15 @@ p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p) return out; } +internal void * +p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p) +{ + P2R_CompUnitContributionsParseIn *in = (P2R_CompUnitContributionsParseIn *)p; + void *out = 0; + ProfScope("parse comp unit contributions") out = pdb_comp_unit_contribution_array_from_data(arena, in->data, in->coff_sections); + return out; +} + //////////////////////////////// //~ rjf: Type Parsing/Conversion Tasks @@ -1771,7 +1780,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } ////////////////////////////////////////////////////////////// - //- rjf: do independent parsing & preparation passes + //- rjf: do initial independent parsing & preparation passes // U64 exe_hash = 0; PDB_TpiHashParsed *tpi_hash = 0; @@ -1781,7 +1790,9 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_SymParsed *sym = 0; PDB_CompUnitArray *comp_units = 0; U64 comp_unit_count = 0; - ProfScope("do independent parsing & preparation passess") + PDB_CompUnitContributionArray *comp_unit_contributions = 0; + U64 comp_unit_contribution_count = 0; + ProfScope("do initial independent parsing & preparation passess") { //- rjf: form task inputs P2R_EXEHashIn exe_hash_in = {in->input_exe_data}; @@ -1811,37 +1822,29 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } P2R_SymbolStreamParseIn sym_parse_in = {dbi ? msf_data_from_stream(msf, dbi->sym_sn) : str8_zero()}; P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()}; + P2R_CompUnitContributionsParseIn comp_unit_contributions_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon) : str8_zero(), coff_sections}; //- rjf: kick off tasks - TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in); - TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in); - TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in); - TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in); - TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in); - TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_parse_in); - TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, &comp_unit_parse_in); + TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in); + TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in); + TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in); + TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in); + TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in); + TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_parse_in); + TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, &comp_unit_parse_in); + TS_Ticket comp_unit_contributions_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_contributions_parse_task__entry_point, &comp_unit_contributions_parse_in); //- rjf: join tasks - exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); - tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); - tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); - ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); - ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); - sym = ts_join_struct(sym_parse_ticket, max_U64, CV_SymParsed); - comp_units = ts_join_struct(comp_unit_parse_ticket,max_U64, PDB_CompUnitArray); - comp_unit_count = comp_units->count; - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse dbi's section contributions - // - PDB_CompUnitContributionArray *comp_unit_contributions = 0; - U64 comp_unit_contribution_count = 0; - if(dbi != 0 && coff_sections != 0) ProfScope("parse dbi section contributions") - { - String8 section_contribution_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon); - comp_unit_contributions = pdb_comp_unit_contribution_array_from_data(arena, section_contribution_data, coff_sections); - comp_unit_contribution_count = comp_unit_contributions->count; + exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); + tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); + tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); + ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); + ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); + sym = ts_join_struct(sym_parse_ticket, max_U64, CV_SymParsed); + comp_units = ts_join_struct(comp_unit_parse_ticket, max_U64, PDB_CompUnitArray); + comp_unit_contributions = ts_join_struct(comp_unit_contributions_parse_ticket, max_U64, PDB_CompUnitContributionArray); + comp_unit_count = comp_units ? comp_units->count : 0; + comp_unit_contribution_count = comp_unit_contributions ? comp_unit_contributions->count : 0; } ////////////////////////////////////////////////////////////// @@ -1850,11 +1853,20 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed*, comp_unit_count); if(comp_units != 0) ProfScope("parse syms for each compilation unit") { - PDB_CompUnit **unit_ptr = comp_units->units; - for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1) + //- rjf: kick off parsing tasks + P2R_SymbolStreamParseIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamParseIn, comp_unit_count); + TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count); + for(U64 idx = 0; idx < comp_unit_count; idx += 1) { - String8 sym_data = pdb_data_from_unit_range(msf, *unit_ptr, PDB_DbiCompUnitRange_Symbols); - sym_for_unit[i] = cv_sym_from_data(arena, sym_data, 4); + PDB_CompUnit *unit = comp_units->units[idx]; + tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); + tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &tasks_inputs[idx]); + } + + //- rjf: join tasks + for(U64 idx = 0; idx < comp_unit_count; idx += 1) + { + sym_for_unit[idx] = ts_join_struct(tasks_tickets[idx], max_U64, CV_SymParsed); } } @@ -2149,7 +2161,6 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) P2R_TypeIdRevisitTask *next; RDIM_Type *base_type; CV_TypeId field_itype; - CV_TypeId this_itype; }; P2R_TypeIdRevisitTask *first_itype_revisit_task = 0; P2R_TypeIdRevisitTask *last_itype_revisit_task = 0; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 90449894..2a08d2c0 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -100,6 +100,15 @@ struct P2R_CompUnitParseIn String8 data; }; +//- rjf: comp unit contribution table parsing + +typedef struct P2R_CompUnitContributionsParseIn P2R_CompUnitContributionsParseIn; +struct P2R_CompUnitContributionsParseIn +{ + String8 data; + PDB_CoffSectionArray *coff_sections; +}; + //////////////////////////////// //~ rjf: Conversion Data Structure Types @@ -219,6 +228,7 @@ internal void *p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); +internal void *p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p); //////////////////////////////// //~ rjf: Type Parsing/Conversion Tasks From b8a4aeac3943c3f3d8db65f25811a9596f0c163e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 13:16:52 -0800 Subject: [PATCH 105/275] raddbgi_from_pdb: offload c13 line info parsing to task threads --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 53 ++++++++++++------------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 11 +++++ 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 45e0c4a3..af18e342 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -578,6 +578,15 @@ p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p) return out; } +internal void * +p2r_c13_stream_parse_task__entry_point(Arena *arena, void *p) +{ + P2R_C13StreamParseIn *in = (P2R_C13StreamParseIn *)p; + void *out = 0; + ProfScope("parse c13 stream") out = cv_c13_from_data(arena, in->data, in->strtbl, in->coff_sections); + return out; +} + internal void * p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p) { @@ -1848,43 +1857,33 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } ////////////////////////////////////////////////////////////// - //- rjf: parse syms for each compilation unit + //- rjf: parse syms & line info for each compilation unit // - CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed*, comp_unit_count); - if(comp_units != 0) ProfScope("parse syms for each compilation unit") + CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed *, comp_unit_count); + CV_C13Parsed **c13_for_unit = push_array(arena, CV_C13Parsed *, comp_unit_count); + if(comp_units != 0) ProfScope("parse syms & line info for each compilation unit") { - //- rjf: kick off parsing tasks - P2R_SymbolStreamParseIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamParseIn, comp_unit_count); - TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count); + //- rjf: kick off tasks + P2R_SymbolStreamParseIn *sym_tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamParseIn, comp_unit_count); + TS_Ticket *sym_tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count); + P2R_C13StreamParseIn *c13_tasks_inputs = push_array(scratch.arena, P2R_C13StreamParseIn, comp_unit_count); + TS_Ticket *c13_tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count); for(U64 idx = 0; idx < comp_unit_count; idx += 1) { PDB_CompUnit *unit = comp_units->units[idx]; - tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); - tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &tasks_inputs[idx]); + sym_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); + sym_tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_tasks_inputs[idx]); + c13_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13); + c13_tasks_inputs[idx].strtbl = strtbl; + c13_tasks_inputs[idx].coff_sections = coff_sections; + c13_tasks_tickets[idx] = ts_kickoff(p2r_c13_stream_parse_task__entry_point, &c13_tasks_inputs[idx]); } //- rjf: join tasks for(U64 idx = 0; idx < comp_unit_count; idx += 1) { - sym_for_unit[idx] = ts_join_struct(tasks_tickets[idx], max_U64, CV_SymParsed); - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse c13 for each compilation unit - // - CV_C13Parsed **c13_for_unit = push_array(arena, CV_C13Parsed*, comp_unit_count); - if(comp_units != 0) ProfScope("parse c13s") - { - PDB_CompUnit **unit_ptr = comp_units->units; - for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1) - { - CV_C13Parsed *unit_c13 = 0; - { - String8 c13_data = pdb_data_from_unit_range(msf, *unit_ptr, PDB_DbiCompUnitRange_C13); - unit_c13 = cv_c13_from_data(arena, c13_data, strtbl, coff_sections); - } - c13_for_unit[i] = unit_c13; + sym_for_unit[idx] = ts_join_struct(sym_tasks_tickets[idx], max_U64, CV_SymParsed); + c13_for_unit[idx] = ts_join_struct(c13_tasks_tickets[idx], max_U64, CV_C13Parsed); } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 2a08d2c0..6479f997 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -92,6 +92,16 @@ struct P2R_SymbolStreamParseIn String8 data; }; +//- rjf: c13 line info stream parsing + +typedef struct P2R_C13StreamParseIn P2R_C13StreamParseIn; +struct P2R_C13StreamParseIn +{ + String8 data; + PDB_Strtbl *strtbl; + PDB_CoffSectionArray *coff_sections; +}; + //- rjf: comp unit parsing typedef struct P2R_CompUnitParseIn P2R_CompUnitParseIn; @@ -227,6 +237,7 @@ internal void *p2r_exe_hash_task__entry_point(Arena *arena, void *p); internal void *p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p); +internal void *p2r_c13_stream_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p); From 923714c3c9253601e19b960abc18a8f0684b136a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 14:07:58 -0800 Subject: [PATCH 106/275] raddbgi_make: split final blob flattening & encoding from 'baking' phase --- src/lib_raddbgi_make/raddbgi_make.c | 31 +++++++++++--------- src/lib_raddbgi_make/raddbgi_make.h | 7 +++-- src/raddbg/raddbg.c | 3 +- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 3 +- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index fc7331a1..c2b1d974 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1368,12 +1368,10 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey //- rjf: main baking entry point -RDI_PROC RDIM_String8List -rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) +RDI_PROC RDIM_BakeSectionList +rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - RDIM_String8List blobs; - rdim_memzero_struct(&blobs); ////////////////////////////// //- NOTE(rjf): On the ordering of baking phases: @@ -2661,30 +2659,37 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) rdim_bake_section_list_push_new(arena, §ions, idx_data, sizeof(RDI_U32)*idx_runs.idx_count, RDI_DataSectionTag_IndexRuns); } - ////////////////////////////// - //- rjf: finalize: build blob strings for header & all sections - // - RDIM_ProfScope("finalize: build blob strings for header & all sections") + rdim_scratch_end(scratch); + return sections; +} + +//- rjf: sections -> flattened serialized blobs + +RDI_PROC RDIM_String8List +rdim_blobs_from_bake_sections(RDIM_Arena *arena, RDIM_BakeSectionList *sections) +{ + RDIM_String8List blobs; + rdim_memzero_struct(&blobs); { // rjf: push empty header & data section table RDI_Header *baked_rdi_header = rdim_push_array(arena, RDI_Header, 1); - RDI_DataSection *baked_rdi_sections = rdim_push_array(arena, RDI_DataSection, sections.count); + RDI_DataSection *baked_rdi_sections = rdim_push_array(arena, RDI_DataSection, sections->count); rdim_str8_list_push(arena, &blobs, rdim_str8_struct(baked_rdi_header)); rdim_str8_list_push_align(arena, &blobs, 8); U32 data_section_off = (U32)blobs.total_size; - rdim_str8_list_push(arena, &blobs, rdim_str8((RDI_U8 *)baked_rdi_sections, sizeof(RDI_DataSection)*sections.count)); + rdim_str8_list_push(arena, &blobs, rdim_str8((RDI_U8 *)baked_rdi_sections, sizeof(RDI_DataSection)*sections->count)); // rjf: fill baked header { baked_rdi_header->magic = RDI_MAGIC_CONSTANT; baked_rdi_header->encoding_version = RDI_ENCODING_VERSION; baked_rdi_header->data_section_off = data_section_off; - baked_rdi_header->data_section_count = sections.count; + baked_rdi_header->data_section_count = sections->count; } // rjf: fill baked data section table U64 dst_idx = 0; - for(RDIM_BakeSectionNode *src_n = sections.first; src_n != 0; src_n = src_n->next, dst_idx += 1) + for(RDIM_BakeSectionNode *src_n = sections->first; src_n != 0; src_n = src_n->next, dst_idx += 1) { RDIM_BakeSection *src = &src_n->v; RDI_DataSection *dst = baked_rdi_sections + dst_idx; @@ -2702,7 +2707,5 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params) dst->unpacked_size = src->size; } } - - rdim_scratch_end(scratch); return blobs; } diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index d55dfe3d..1e405bdf 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1083,6 +1083,9 @@ RDI_PROC void rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDI_PROC RDIM_VMap rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count); //- rjf: main baking entry point -RDI_PROC RDIM_String8List rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); -#endif // RDI_MAKE_H +//- rjf: sections -> flattened serialized blobs +RDI_PROC RDIM_String8List rdim_blobs_from_bake_sections(RDIM_Arena *arena, RDIM_BakeSectionList *sections); + +#endif // RADDBGI_MAKE_H diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index ac1017a7..218e828d 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -647,7 +647,8 @@ entry_point(int argc, char **argv) bake_params.procedures = convert_out->procedures; bake_params.scopes = convert_out->scopes; } - bake_strings = rdim_bake(scratch.arena, &bake_params); + RDIM_BakeSectionList sections = rdim_bake_sections_from_params(scratch.arena, &bake_params); + bake_strings = rdim_blobs_from_bake_sections(scratch.arena, §ions); } //- rjf: write diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 9273294a..2aa4eb29 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -97,7 +97,8 @@ main(int argc, char **argv) bake_params.procedures = convert_out->procedures; bake_params.scopes = convert_out->scopes; } - bake_strings = rdim_bake(arena, &bake_params); + RDIM_BakeSectionList sections = rdim_bake_sections_from_params(arena, &bake_params); + bake_strings = rdim_blobs_from_bake_sections(arena, §ions); } //- rjf: write From 7581a6866d457ea73912ff621d2229b65691d34c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 15:13:22 -0800 Subject: [PATCH 107/275] raddbgi_from_pdb: overlap link name map building with type info building, since they are independent streams of work --- src/lib_raddbgi_make/raddbgi_make.c | 24 ++- src/lib_raddbgi_make/raddbgi_make.h | 3 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 155 ++++++++++++------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 43 +++++ src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 27 ++-- 5 files changed, 184 insertions(+), 68 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index c2b1d974..d7461d08 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -945,7 +945,29 @@ rdim_bake_section_list_push_new(RDIM_Arena *arena, RDIM_BakeSectionList *list, v return section; } -//- rjf: interned string building +//- rjf: interned string map reading/writing + +RDI_PROC RDI_U32 +rdim_idx_from_baked_string(RDIM_BakeStringMap *map, RDIM_String8 string) +{ + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeStringNode *node = 0; + for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash && rdim_str8_match(n->string, string, 0)) + { + node = n; + break; + } + } + + // rjf: node -> index + RDI_U32 result = node ? node->idx : 0; + return result; +} RDI_PROC RDI_U32 rdim_bake_string(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string) diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 1e405bdf..a51d9d4f 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1063,7 +1063,8 @@ RDI_PROC void rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList 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); -//- rjf: interned string building +//- 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: interned index run building diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index af18e342..f1ba7813 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -605,6 +605,62 @@ p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p) return out; } +//////////////////////////////// +//~ rjf: Link Name Map Building Task + +internal void * +p2r_link_name_map_build_task__entry_point(Arena *arena, void *p) +{ + P2R_LinkNameMapBuildIn *in = (P2R_LinkNameMapBuildIn *)p; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + in->sym->sym_ranges.count; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: unpack symbol range info + CV_SymKind kind = rec_range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_sym_kind(kind); + U8 *sym_first = in->sym->data.str + rec_range->off + 2; + U8 *sym_opl = sym_first + rec_range->hdr.size; + + //- rjf: skip bad ranges + if(sym_opl > in->sym->data.str + in->sym->data.size || sym_first + header_struct_size > in->sym->data.str + in->sym->data.size) + { + continue; + } + + //- rjf: consume symbol + switch(kind) + { + default:{}break; + case CV_SymKind_PUB32: + { + // rjf: unpack sym + CV_SymPub32 *pub32 = (CV_SymPub32 *)sym_first; + String8 name = str8_cstring_capped(pub32+1, sym_opl); + COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[pub32->sec-1] : 0; + U64 voff = 0; + if(section != 0) + { + voff = section->voff + pub32->off; + } + + // rjf: commit to link name map + U64 hash = p2r_hash_from_voff(voff); + U64 bucket_idx = hash%in->link_name_map->buckets_count; + P2R_LinkNameNode *node = push_array(arena, P2R_LinkNameNode, 1); + SLLStackPush(in->link_name_map->buckets[bucket_idx], node); + node->voff = voff; + node->name = name; + in->link_name_map->link_name_count += 1; + in->link_name_map->bucket_collision_count += (node->next != 0); + }break; + } + } + return 0; +} + //////////////////////////////// //~ rjf: Type Parsing/Conversion Tasks @@ -2068,6 +2124,22 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } } + ////////////////////////////////////////////////////////////// + //- rjf: kick off link name map production + // + P2R_LinkNameMap link_name_map__in_progress = {0}; + P2R_LinkNameMapBuildIn link_name_map_build_in = {0}; + TS_Ticket link_name_map_ticket = {0}; + ProfScope("kick off link name map build task") + { + link_name_map__in_progress.buckets_count = symbol_count_prediction; + link_name_map__in_progress.buckets = push_array(arena, P2R_LinkNameNode *, link_name_map__in_progress.buckets_count); + link_name_map_build_in.sym = sym; + link_name_map_build_in.coff_sections = coff_sections; + link_name_map_build_in.link_name_map = &link_name_map__in_progress; + link_name_map_ticket = ts_kickoff(p2r_link_name_map_build_task__entry_point, &link_name_map_build_in); + } + ////////////////////////////////////////////////////////////// //- rjf: types pass 1: produce type forward resolution map // @@ -3172,59 +3244,13 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } ////////////////////////////////////////////////////////////// - //- rjf: produce link name map + //- rjf: join link name map building task // - P2R_LinkNameMap link_name_map = {0}; - ProfScope("produce link name map") + P2R_LinkNameMap *link_name_map = 0; + ProfScope("join link name map building task") { - link_name_map.buckets_count = symbol_count_prediction; - link_name_map.buckets = push_array(arena, P2R_LinkNameNode *, link_name_map.buckets_count); - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: unpack symbol range info - CV_SymKind kind = rec_range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_sym_kind(kind); - U8 *sym_first = sym->data.str + rec_range->off + 2; - U8 *sym_opl = sym_first + rec_range->hdr.size; - - //- rjf: skip bad ranges - if(sym_opl > sym->data.str + sym->data.size || sym_first + header_struct_size > sym->data.str + sym->data.size) - { - continue; - } - - //- rjf: consume symbol - switch(kind) - { - default:{}break; - case CV_SymKind_PUB32: - { - // rjf: unpack sym - CV_SymPub32 *pub32 = (CV_SymPub32 *)sym_first; - String8 name = str8_cstring_capped(pub32+1, sym_opl); - COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= coff_sections->count) ? &coff_sections->sections[pub32->sec-1] : 0; - U64 voff = 0; - if(section != 0) - { - voff = section->voff + pub32->off; - } - - // rjf: commit to link name map - U64 hash = p2r_hash_from_voff(voff); - U64 bucket_idx = hash%link_name_map.buckets_count; - P2R_LinkNameNode *node = push_array(arena, P2R_LinkNameNode, 1); - SLLStackPush(link_name_map.buckets[bucket_idx], node); - node->voff = voff; - node->name = name; - link_name_map.link_name_count += 1; - link_name_map.bucket_collision_count += (node->next != 0); - }break; - } - } + ts_join(link_name_map_ticket, max_U64); + link_name_map = &link_name_map__in_progress; } ////////////////////////////////////////////////////////////// @@ -3254,7 +3280,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) tasks_inputs[idx].tpi_leaf = tpi_leaf; tasks_inputs[idx].itype_fwd_map = itype_fwd_map; tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; - tasks_inputs[idx].link_name_map = &link_name_map; + tasks_inputs[idx].link_name_map = link_name_map; if(idx < global_stream_subdivision_tasks_count) { tasks_inputs[idx].sym = sym; @@ -3307,3 +3333,28 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) scratch_end(scratch); return out; } + +//////////////////////////////// +//~ rjf: Top-Level Baking Entry Point + +internal P2R_BakeOut * +p2r_bake(Arena *arena, P2R_BakeIn *in) +{ + RDIM_BakeParams bake_params = {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.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; + return out; +} diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 6479f997..bc88a4ff 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -53,6 +53,29 @@ struct P2R_ConvertOut RDIM_ScopeChunkList scopes; }; +//////////////////////////////// +//~ rjf: Baking Inputs/Outputs + +typedef struct P2R_BakeIn P2R_BakeIn; +struct P2R_BakeIn +{ + RDIM_TopLevelInfo top_level_info; + RDIM_BinarySectionList binary_sections; + RDIM_UnitChunkList units; + RDIM_TypeChunkList types; + RDIM_UDTChunkList udts; + 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; +}; + //////////////////////////////// //~ rjf: Initial PDB Information Extraction & Conversion Preparation Task Types @@ -141,6 +164,16 @@ struct P2R_LinkNameMap U64 link_name_count; }; +//- rjf: link name map building tasks + +typedef struct P2R_LinkNameMapBuildIn P2R_LinkNameMapBuildIn; +struct P2R_LinkNameMapBuildIn +{ + CV_SymParsed *sym; + PDB_CoffSectionArray *coff_sections; + P2R_LinkNameMap *link_name_map; +}; + //- rjf: type forward resolution map build typedef struct P2R_ITypeFwdMapFillIn P2R_ITypeFwdMapFillIn; @@ -241,6 +274,11 @@ internal void *p2r_c13_stream_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p); +//////////////////////////////// +//~ rjf: Link Name Map Building Task + +internal void *p2r_link_name_map_build_task__entry_point(Arena *arena, void *p); + //////////////////////////////// //~ rjf: Type Parsing/Conversion Tasks @@ -257,4 +295,9 @@ internal void *p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p internal P2R_ConvertOut *p2r_convert(Arena *arena, P2R_ConvertIn *in); +//////////////////////////////// +//~ rjf: Top-Level Baking Entry Point + +internal P2R_BakeOut *p2r_bake(Arena *arena, P2R_BakeIn *in); + #endif // RADDBGI_FROM_PDB_H diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 2aa4eb29..d500e8d6 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -82,23 +82,22 @@ main(int argc, char **argv) } //- rjf: bake - String8List bake_strings = {0}; + P2R_BakeOut *bake_out = 0; ProfScope("bake") { - RDIM_BakeParams bake_params = {0}; + P2R_BakeIn bake_in = {0}; { - bake_params.top_level_info = convert_out->top_level_info; - bake_params.binary_sections = convert_out->binary_sections; - bake_params.units = convert_out->units; - bake_params.types = convert_out->types; - bake_params.udts = convert_out->udts; - bake_params.global_variables = convert_out->global_variables; - bake_params.thread_variables = convert_out->thread_variables; - bake_params.procedures = convert_out->procedures; - bake_params.scopes = convert_out->scopes; + 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.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; } - RDIM_BakeSectionList sections = rdim_bake_sections_from_params(arena, &bake_params); - bake_strings = rdim_blobs_from_bake_sections(arena, §ions); + bake_out = p2r_bake(arena, &bake_in); } //- rjf: write @@ -106,7 +105,7 @@ main(int argc, char **argv) { OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, convert_in->output_name); U64 off = 0; - for(String8Node *n = bake_strings.first; n != 0; n = n->next) + for(String8Node *n = bake_out->blobs.first; n != 0; n = n->next) { os_file_write(output_file, r1u64(off, off+n->string.size), n->string.str); off += n->string.size; From 529262d471f8500b2718d9e0df3179243d66cb4e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 20 Feb 2024 16:32:09 -0800 Subject: [PATCH 108/275] begin untangling source file & path tree building in converter/maker/baker; this cannot happen as another implicitly-mutated-context thing that magically happens behing a top-level 'baking' function. instead, this needs to be constructed according to the rules of the user, and passed to baking stages as a batch --- src/lib_raddbgi_make/raddbgi_make.c | 424 ++++++++++--------- src/lib_raddbgi_make/raddbgi_make.h | 52 ++- src/raddbg/raddbg.c | 1 + src/raddbgi_from_pdb/raddbgi_from_pdb.c | 76 +++- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 26 +- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 1 + 6 files changed, 361 insertions(+), 219 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index d7461d08..ff2c6b44 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -451,6 +451,69 @@ rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list) return result; } +//////////////////////////////// +//~ rjf: Source File Info Building + +RDI_PROC RDIM_SrcFile * +rdim_src_file_chunk_list_push(RDIM_Arena *arena, RDIM_SrcFileChunkList *list, RDI_U64 cap) +{ + RDIM_SrcFileChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_SrcFileChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_SrcFile, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_SrcFile *src_file = &n->v[n->count]; + src_file->chunk = n; + n->count += 1; + list->total_count += 1; + return src_file; +} + +RDI_PROC RDI_U64 +rdim_idx_from_src_file(RDIM_SrcFile *src_file) +{ + RDI_U64 idx = 0; + if(src_file != 0 && src_file->chunk != 0) + { + idx = src_file->chunk->base_idx + (src_file - src_file->chunk->v); + } + return idx; +} + +RDI_PROC void +rdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *dst, RDIM_SrcFileChunkList *to_push) +{ + for(RDIM_SrcFileChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC void +rdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_files, RDIM_SrcFile *src_file, RDIM_LineSequence *seq) +{ + RDIM_SrcFileLineMapFragment *fragment = rdim_push_array(arena, RDIM_SrcFileLineMapFragment, 1); + fragment->seq = seq; + RDIM_SLLQueuePush(src_file->first_line_map_fragment, src_file->last_line_map_fragment, fragment); +} + //////////////////////////////// //~ rjf: Unit List Building @@ -1157,23 +1220,6 @@ rdim_bake_path_node_from_string(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM return node; } -RDI_PROC RDIM_BakeSrcNode * -rdim_bake_src_node_from_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_BakePathNode *path_node) -{ - RDIM_BakeSrcNode *src_node = path_node->src_file; - if(src_node == 0) - { - src_node = rdim_push_array(arena, RDIM_BakeSrcNode, 1); - path_node->src_file = src_node; - src_node->path_node = path_node; - src_node->normal_full_path = rdim_normal_string_from_bake_path_node(arena, path_node); - src_node->idx = tree->src_count; - tree->src_count += 1; - RDIM_SLLQueuePush(tree->src_first, tree->src_last, src_node); - } - return src_node; -} - RDI_PROC RDI_U32 rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) { @@ -1435,8 +1481,6 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) name_maps[k].slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, name_maps[k].slots_count); } RDIM_BakePathNode *nil_path = rdim_bake_path_node_from_string(arena, &path_tree, rdim_str8_lit("")); - RDIM_BakeSrcNode *nil_src = rdim_bake_src_node_from_path_node(arena, &path_tree, nil_path); - (void)nil_src; rdim_bake_string(arena, &strings, rdim_str8_lit("")); rdim_bake_idx_run(arena, &idx_runs, 0, 0); } @@ -1532,14 +1576,12 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) for(RDIM_LineSequenceNode *seq_n = src->line_sequences.first; seq_n != 0; seq_n = seq_n->next) { RDIM_LineSequence *seq = &seq_n->v; - RDIM_BakePathNode *src_path = rdim_bake_path_node_from_string(arena, &path_tree, seq->file_name); - RDIM_BakeSrcNode *src_file = rdim_bake_src_node_from_path_node(arena, &path_tree, src_path); for(RDI_U64 line_idx = 0; line_idx < seq->line_count; line_idx += 1) { key_ptr->key = seq->voffs[line_idx]; key_ptr->val = rec_ptr; key_ptr += 1; - rec_ptr->file_id = src_file->idx; + rec_ptr->file_id = (RDI_U32)rdim_idx_from_src_file(seq->src_file); // TODO(rjf): @u64_to_u32 rec_ptr->line_num = seq->line_nums[line_idx]; if(seq->col_nums != 0) { @@ -1551,10 +1593,6 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) key_ptr->key = seq->voffs[seq->line_count]; key_ptr->val = 0; key_ptr += 1; - - RDIM_BakeLineMapFragment *fragment = rdim_push_array(arena, RDIM_BakeLineMapFragment, 1); - RDIM_SLLQueuePush(src_file->first_fragment, src_file->last_fragment, fragment); - fragment->seq = seq; } } @@ -1635,162 +1673,185 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) } ////////////////////////////// - //- rjf: build section for per-source-file line info + //- rjf: build per-source-file info sections // - RDIM_ProfScope("build section for per-source-file line info") + RDIM_ProfScope("build per-source-file info sections") { - for(RDIM_BakeSrcNode *src_file_node = path_tree.src_first; - src_file_node != 0; - src_file_node = src_file_node->next) + //////////////////////////// + //- rjf: iterate all source files, fill serialized version, build sections for line info + // + RDI_U32 dst_files_count = params->src_files.total_count; + RDI_SourceFile *dst_files = rdim_push_array(arena, RDI_SourceFile, dst_files_count); + RDI_U32 dst_file_idx = 0; + for(RDIM_SrcFileChunkNode *chunk_n = params->src_files.first; + chunk_n != 0; + chunk_n = chunk_n->next) { - ////////////////////////// - //- rjf: produce combined source file line info - // - RDI_U32 *src_file_line_nums = 0; - RDI_U32 *src_file_line_ranges = 0; - RDI_U64 *src_file_voffs = 0; - RDI_U32 src_file_line_count = 0; - RDI_U32 src_file_voff_count = 0; + for(RDI_U64 idx = 0; idx < chunk_n->count; idx += 1, dst_file_idx += 1) { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + RDIM_SrcFile *src_file = &chunk_n->v[idx]; + RDI_SourceFile *dst_file = &dst_files[dst_file_idx]; - //- rjf: gather line number map - typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; - struct RDIM_SrcLineMapVoffBlock + //////////////////////// + //- rjf: fill basics + // + dst_file->file_path_node_idx = rdim_bake_path_node_from_string(arena, &path_tree, src_file->normal_full_path)->idx; + dst_file->normal_full_path_string_idx = rdim_bake_string(arena, &strings, src_file->normal_full_path); + + //////////////////////// + //- rjf: produce combined source file line info + // + RDI_U32 *src_file_line_nums = 0; + RDI_U32 *src_file_line_ranges = 0; + RDI_U64 *src_file_voffs = 0; + RDI_U32 src_file_line_count = 0; + RDI_U32 src_file_voff_count = 0; { - RDIM_SrcLineMapVoffBlock *next; - RDI_U64 voff; - }; - typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; - struct RDIM_SrcLineMapBucket - { - RDIM_SrcLineMapBucket *order_next; - RDIM_SrcLineMapBucket *hash_next; - RDI_U32 line_num; - RDIM_SrcLineMapVoffBlock *first_voff_block; - RDIM_SrcLineMapVoffBlock *last_voff_block; - RDI_U64 voff_count; - }; - RDIM_SrcLineMapBucket *first_bucket = 0; - RDIM_SrcLineMapBucket *last_bucket = 0; - RDI_U64 line_hash_slots_count = 2048; - RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); - RDI_U64 line_count = 0; - RDI_U64 voff_count = 0; - RDI_U64 max_line_num = 0; - { - for(RDIM_BakeLineMapFragment *map_fragment = src_file_node->first_fragment; - map_fragment != 0; - map_fragment = map_fragment->next) + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: gather line number map + typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; + struct RDIM_SrcLineMapVoffBlock { - RDIM_LineSequence *sequence = map_fragment->seq; - RDI_U64 *seq_voffs = sequence->voffs; - RDI_U32 *seq_line_nums = sequence->line_nums; - RDI_U64 seq_line_count = sequence->line_count; - for(RDI_U64 i = 0; i < seq_line_count; i += 1) + RDIM_SrcLineMapVoffBlock *next; + RDI_U64 voff; + }; + typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; + struct RDIM_SrcLineMapBucket + { + RDIM_SrcLineMapBucket *order_next; + RDIM_SrcLineMapBucket *hash_next; + RDI_U32 line_num; + RDIM_SrcLineMapVoffBlock *first_voff_block; + RDIM_SrcLineMapVoffBlock *last_voff_block; + RDI_U64 voff_count; + }; + RDIM_SrcLineMapBucket *first_bucket = 0; + RDIM_SrcLineMapBucket *last_bucket = 0; + RDI_U64 line_hash_slots_count = 2048; + RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); + RDI_U64 line_count = 0; + RDI_U64 voff_count = 0; + RDI_U64 max_line_num = 0; + { + for(RDIM_SrcFileLineMapFragment *map_fragment = src_file->first_line_map_fragment; + map_fragment != 0; + map_fragment = map_fragment->next) { - RDI_U32 line_num = seq_line_nums[i]; - RDI_U64 voff = seq_voffs[i]; - RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; - - // rjf: update unique voff counter & max line number - voff_count += 1; - max_line_num = Max(max_line_num, line_num); - - // rjf: find match - RDIM_SrcLineMapBucket *match = 0; + RDIM_LineSequence *sequence = map_fragment->seq; + RDI_U64 *seq_voffs = sequence->voffs; + RDI_U32 *seq_line_nums = sequence->line_nums; + RDI_U64 seq_line_count = sequence->line_count; + for(RDI_U64 i = 0; i < seq_line_count; i += 1) { - for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; - node != 0; - node = node->hash_next) + RDI_U32 line_num = seq_line_nums[i]; + RDI_U64 voff = seq_voffs[i]; + RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; + + // rjf: update unique voff counter & max line number + voff_count += 1; + max_line_num = Max(max_line_num, line_num); + + // rjf: find match + RDIM_SrcLineMapBucket *match = 0; { - if(node->line_num == line_num) + for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + node != 0; + node = node->hash_next) { - match = node; - break; + if(node->line_num == line_num) + { + match = node; + break; + } } } - } - - // rjf: introduce new map if no match - if(match == 0) - { - match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); - RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); - RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); - match->line_num = line_num; - line_count += 1; - } - - // rjf: insert new voff - { - RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); - RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); - match->voff_count += 1; - block->voff = voff; + + // rjf: introduce new map if no match + if(match == 0) + { + match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); + RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); + RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); + match->line_num = line_num; + line_count += 1; + } + + // rjf: insert new voff + { + RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); + RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); + match->voff_count += 1; + block->voff = voff; + } } } } - } - - //- rjf: bake sortable keys array - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); - { - RDIM_SortKey *key_ptr = keys; - for(RDIM_SrcLineMapBucket *node = first_bucket; - node != 0; - node = node->order_next, key_ptr += 1){ - key_ptr->key = node->line_num; - key_ptr->val = node; - } - } - - //- rjf: sort keys array - RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); - - //- rjf: bake result - RDI_U32 *line_nums = rdim_push_array_no_zero(arena, RDI_U32, line_count); - RDI_U32 *line_ranges = rdim_push_array_no_zero(arena, RDI_U32, line_count + 1); - RDI_U64 *voffs = rdim_push_array_no_zero(arena, RDI_U64, voff_count); - { - RDI_U64 *voff_ptr = voffs; - for(RDI_U32 i = 0; i < line_count; i += 1) + + //- rjf: bake sortable keys array + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); { - line_nums[i] = sorted_keys[i].key; - line_ranges[i] = (RDI_U32)(voff_ptr - voffs); // TODO(rjf): @u64_to_u32 - RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; - for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next) - { - *voff_ptr = node->voff; - voff_ptr += 1; + RDIM_SortKey *key_ptr = keys; + for(RDIM_SrcLineMapBucket *node = first_bucket; + node != 0; + node = node->order_next, key_ptr += 1){ + key_ptr->key = node->line_num; + key_ptr->val = node; } } - line_ranges[line_count] = voff_count; + + //- rjf: sort keys array + RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); + + //- rjf: bake result + RDI_U32 *line_nums = rdim_push_array_no_zero(arena, RDI_U32, line_count); + RDI_U32 *line_ranges = rdim_push_array_no_zero(arena, RDI_U32, line_count + 1); + RDI_U64 *voffs = rdim_push_array_no_zero(arena, RDI_U64, voff_count); + { + RDI_U64 *voff_ptr = voffs; + for(RDI_U32 i = 0; i < line_count; i += 1) + { + line_nums[i] = sorted_keys[i].key; + line_ranges[i] = (RDI_U32)(voff_ptr - voffs); // TODO(rjf): @u64_to_u32 + RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; + for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next) + { + *voff_ptr = node->voff; + voff_ptr += 1; + } + } + line_ranges[line_count] = voff_count; + } + + //- rjf: fill output + src_file_line_nums = line_nums; + src_file_line_ranges = line_ranges; + src_file_line_count = line_count; + src_file_voffs = voffs; + src_file_voff_count = voff_count; + rdim_scratch_end(scratch); } - //- rjf: fill output - src_file_line_nums = line_nums; - src_file_line_ranges = line_ranges; - src_file_line_count = line_count; - src_file_voffs = voffs; - src_file_voff_count = voff_count; - rdim_scratch_end(scratch); - } - - ////////////////////////// - //- rjf: produce data sections for this source file's line info tables - // - if(src_file_line_count != 0) - { - src_file_node->line_map_count = src_file_line_count; - src_file_node->line_map_nums_data_idx = (RDI_U32)sections.count; // TODO(rjf): @u64_to_u32 - src_file_node->line_map_range_data_idx = src_file_node->line_map_nums_data_idx+1; - src_file_node->line_map_voff_data_idx = src_file_node->line_map_nums_data_idx+2; - rdim_bake_section_list_push_new(arena, §ions, src_file_line_nums, sizeof(*src_file_line_nums)*src_file_line_count, RDI_DataSectionTag_LineMapNumbers); - rdim_bake_section_list_push_new(arena, §ions, src_file_line_ranges, sizeof(*src_file_line_ranges)*(src_file_line_count + 1), RDI_DataSectionTag_LineMapRanges); - rdim_bake_section_list_push_new(arena, §ions, src_file_voffs, sizeof(*src_file_voffs)*src_file_voff_count, RDI_DataSectionTag_LineMapVoffs); + ////////////////////////// + //- rjf: produce data sections for this source file's line info tables + // + if(src_file_line_count != 0) + { + dst_file->line_map_count = src_file_line_count; + dst_file->line_map_nums_data_idx = (RDI_U32)sections.count; // TODO(rjf): @u64_to_u32 + dst_file->line_map_range_data_idx = dst_file->line_map_nums_data_idx+1; + dst_file->line_map_voff_data_idx = dst_file->line_map_nums_data_idx+2; + rdim_bake_section_list_push_new(arena, §ions, src_file_line_nums, sizeof(*src_file_line_nums)*src_file_line_count, RDI_DataSectionTag_LineMapNumbers); + rdim_bake_section_list_push_new(arena, §ions, src_file_line_ranges, sizeof(*src_file_line_ranges)*(src_file_line_count + 1), RDI_DataSectionTag_LineMapRanges); + rdim_bake_section_list_push_new(arena, §ions, src_file_voffs, sizeof(*src_file_voffs)*src_file_voff_count, RDI_DataSectionTag_LineMapVoffs); + } } } + + //////////////////////////// + //- rjf: build section for all source files + // + rdim_bake_section_list_push_new(arena, §ions, dst_files, sizeof(RDI_SourceFile)*dst_files_count, RDI_DataSectionTag_SourceFiles); } ////////////////////////////// @@ -1798,11 +1859,16 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) // RDIM_ProfScope("build section for per-source-file line info") { - for(RDIM_BakeSrcNode *src_file_node = path_tree.src_first; - src_file_node != 0; - src_file_node = src_file_node->next) + for(RDIM_SrcFileChunkNode *chunk_n = params->src_files.first; + chunk_n != 0; + chunk_n = chunk_n->next) { - rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_NormalSourcePaths], src_file_node->normal_full_path, src_file_node->idx); + for(RDI_U64 idx = 0; idx < chunk_n->count; idx += 1) + { + RDIM_SrcFile *src_file = &chunk_n->v[idx]; + RDI_U32 src_file_idx = (RDI_U32)rdim_idx_from_src_file(src_file); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_NormalSourcePaths], src_file->normal_full_path, src_file_idx); + } } } @@ -1969,12 +2035,7 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: fill basics dst_udt->self_type_idx = (RDI_U32)rdim_idx_from_type(src_udt->self_type); // TODO(rjf): @u64_to_u32 - if(src_udt->source_path.size != 0) - { - RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(arena, &path_tree, src_udt->source_path); - RDIM_BakeSrcNode *src_node = rdim_bake_src_node_from_path_node(arena, &path_tree, path_node); - dst_udt->file_idx = src_node->idx; - } + dst_udt->file_idx = (RDI_U32)rdim_idx_from_src_file(src_udt->src_file); // TODO(rjf): @u64_to_u32 dst_udt->line = src_udt->line; dst_udt->col = src_udt->col; @@ -2601,31 +2662,6 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) rdim_bake_section_list_push_new(arena, §ions, dst_nodes, sizeof(RDI_FilePathNode)*dst_nodes_count, RDI_DataSectionTag_FilePathNodes); } - ////////////////////////////// - //- rjf: build sections for source files - // - RDIM_ProfScope("build sections for source files") - { - RDI_U32 dst_files_count = path_tree.src_count; - RDI_SourceFile *dst_files = rdim_push_array(arena, RDI_SourceFile, dst_files_count); - { - RDI_U64 dst_file_idx = 0; - for(RDIM_BakeSrcNode *src_node = path_tree.src_first; - src_node != 0; - src_node = src_node->next, dst_file_idx += 1) - { - RDI_SourceFile *dst_file = &dst_files[dst_file_idx]; - dst_file->file_path_node_idx = src_node->path_node->idx; - dst_file->normal_full_path_string_idx = rdim_bake_string(arena, &strings, src_node->normal_full_path); - dst_file->line_map_nums_data_idx = src_node->line_map_nums_data_idx; - dst_file->line_map_range_data_idx = src_node->line_map_range_data_idx; - dst_file->line_map_count = src_node->line_map_count; - dst_file->line_map_voff_data_idx = src_node->line_map_voff_data_idx; - } - } - rdim_bake_section_list_push_new(arena, §ions, dst_files, sizeof(RDI_SourceFile)*dst_files_count, RDI_DataSectionTag_SourceFiles); - } - ////////////////////////////// //- rjf: build sections for strings // diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index a51d9d4f..569964a2 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -448,13 +448,51 @@ struct RDIM_BinarySectionList RDI_U64 count; }; +//////////////////////////////// +//~ rjf: Source File Info Types + +typedef struct RDIM_SrcFileLineMapFragment RDIM_SrcFileLineMapFragment; +struct RDIM_SrcFileLineMapFragment +{ + RDIM_SrcFileLineMapFragment *next; + struct RDIM_LineSequence *seq; +}; + +typedef struct RDIM_SrcFile RDIM_SrcFile; +struct RDIM_SrcFile +{ + struct RDIM_SrcFileChunkNode *chunk; + RDIM_String8 normal_full_path; + RDIM_SrcFileLineMapFragment *first_line_map_fragment; + RDIM_SrcFileLineMapFragment *last_line_map_fragment; +}; + +typedef struct RDIM_SrcFileChunkNode RDIM_SrcFileChunkNode; +struct RDIM_SrcFileChunkNode +{ + RDIM_SrcFileChunkNode *next; + RDIM_SrcFile *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_SrcFileChunkList RDIM_SrcFileChunkList; +struct RDIM_SrcFileChunkList +{ + RDIM_SrcFileChunkNode *first; + RDIM_SrcFileChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + //////////////////////////////// //~ rjf: Per-Compilation-Unit Info Types typedef struct RDIM_LineSequence RDIM_LineSequence; struct RDIM_LineSequence { - RDIM_String8 file_name; + RDIM_SrcFile *src_file; RDI_U64 *voffs; // [line_count + 1] (sorted) RDI_U32 *line_nums; // [line_count] RDI_U16 *col_nums; // [2*line_count] @@ -586,7 +624,7 @@ struct RDIM_UDT RDIM_UDTEnumVal *last_enum_val; RDI_U32 member_count; RDI_U32 enum_val_count; - RDIM_String8 source_path; + RDIM_SrcFile *src_file; RDI_U32 line; RDI_U32 col; }; @@ -767,6 +805,7 @@ struct RDIM_BakeParams RDIM_UnitChunkList units; RDIM_TypeChunkList types; RDIM_UDTChunkList udts; + RDIM_SrcFileChunkList src_files; RDIM_SymbolChunkList global_variables; RDIM_SymbolChunkList thread_variables; RDIM_SymbolChunkList procedures; @@ -1003,6 +1042,14 @@ RDI_PROC void rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDI_PROC RDIM_BinarySection *rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list); +//////////////////////////////// +//~ rjf: 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); +RDI_PROC void rdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *dst, RDIM_SrcFileChunkList *to_push); +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 @@ -1074,7 +1121,6 @@ RDI_PROC RDI_U32 rdim_bake_idx_run(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, R //- 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 RDIM_BakeSrcNode *rdim_bake_src_node_from_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_BakePathNode *path_node); RDI_PROC RDI_U32 rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string); //- rjf: name maps diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 218e828d..4b4d1804 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -642,6 +642,7 @@ entry_point(int argc, char **argv) bake_params.units = convert_out->units; bake_params.types = convert_out->types; bake_params.udts = convert_out->udts; + bake_params.src_files = convert_out->src_files; bake_params.global_variables = convert_out->global_variables; bake_params.thread_variables = convert_out->thread_variables; bake_params.procedures = convert_out->procedures; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index f1ba7813..6f79c1bb 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -206,7 +206,7 @@ rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) //~ rjf: CodeView <-> RADDBGI Canonical Conversions internal RDI_Arch -rdi_arch_from_cv_arch(CV_Arch cv_arch) +p2r_rdi_arch_from_cv_arch(CV_Arch cv_arch) { RDI_Arch result = 0; switch(cv_arch) @@ -276,7 +276,7 @@ rdi_arch_from_cv_arch(CV_Arch cv_arch) } internal RDI_RegisterCode -rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) +p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) { RDI_RegisterCode result = 0; switch(arch) @@ -304,7 +304,7 @@ rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) } internal RDI_Language -rdi_language_from_cv_language(CV_Language cv_language) +p2r_rdi_language_from_cv_language(CV_Language cv_language) { RDI_Language result = 0; switch(cv_language) @@ -331,7 +331,7 @@ rdi_language_from_cv_language(CV_Language cv_language) } internal RDI_TypeKind -rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) +p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) { RDI_TypeKind result = RDI_TypeKind_NULL; switch(basic_type) @@ -1428,7 +1428,7 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) } // rjf: get raddbg register code - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + RDI_RegisterCode register_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); // TODO(rjf): real byte_size & byte_pos from cv_reg goes here U32 byte_size = 8; U32 byte_pos = 0; @@ -1548,7 +1548,7 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + RDI_RegisterCode register_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); // rjf: build location RDIM_Location *location = rdim_push_location_val_reg(arena, register_code); @@ -1620,7 +1620,7 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + RDI_RegisterCode register_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); // rjf: skip "subfield" location info - currently not supported if(defrange_subfield_register->field_offset != 0) @@ -1689,7 +1689,7 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) // rjf: unpack sym CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; CV_Reg cv_reg = defrange_register_rel->reg; - RDI_RegisterCode register_code = rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + RDI_RegisterCode register_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); CV_LvarAddrRange *range = &defrange_register_rel->range; COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); @@ -1979,7 +1979,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { if(sym_for_unit[comp_unit_idx] != 0) { - arch = rdi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); + arch = p2r_rdi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); if(arch != RDI_Arch_NULL) { break; @@ -2023,12 +2023,16 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } ////////////////////////////////////////////////////////////// - //- rjf: build units + //- rjf: build units, initial src file map, & collect unit source files // - RDIM_UnitChunkList units = {0}; - ProfScope("build unit array") + P2R_SrcFileMap src_file_map = {0}; + RDIM_UnitChunkList all_units = {0}; + RDIM_SrcFileChunkList all_src_files = {0}; + ProfScope("build units, initial src file map, & collect unit source files") { U64 units_chunk_cap = comp_unit_count; + src_file_map.slots_count = 65536; + src_file_map.slots = push_array(scratch.arena, P2R_SrcFileNode *, src_file_map.slots_count); //- rjf: pass 1: fill basic per-unit info & line info for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) @@ -2057,12 +2061,12 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) } //- rjf: build unit - RDIM_Unit *dst_unit = rdim_unit_chunk_list_push(arena, &units, units_chunk_cap); + RDIM_Unit *dst_unit = rdim_unit_chunk_list_push(arena, &all_units, units_chunk_cap); dst_unit->unit_name = unit_name; dst_unit->compiler_name = pdb_unit_sym->info.compiler_name; dst_unit->object_file = obj_name; dst_unit->archive_file = pdb_unit->group_name; - dst_unit->language = rdi_language_from_cv_language(sym->info.language); + dst_unit->language = p2r_rdi_language_from_cv_language(sym->info.language); //- rjf: fill unit line info for(CV_C13SubSectionNode *node = pdb_unit_c13->first_sub_section; @@ -2076,8 +2080,42 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) lines_n = lines_n->next) { CV_C13LinesParsed *lines = &lines_n->v; + + // rjf: file name -> normalized file path + String8 file_path = lines->file_name; + String8 file_path_normalized = lower_from_str8(scratch.arena, str8_skip_chop_whitespace(file_path)); + for(U64 idx = 0; idx < file_path_normalized.size; idx += 1) + { + if(file_path_normalized.str[idx] == '\\') + { + file_path_normalized.str[idx] = '/'; + } + } + + // rjf: normalized file path -> source file node + U64 file_path_normalized_hash = rdi_hash(file_path_normalized.str, file_path_normalized.size); + U64 src_file_slot = file_path_normalized_hash%src_file_map.slots_count; + P2R_SrcFileNode *src_file_node = 0; + for(P2R_SrcFileNode *n = src_file_map.slots[src_file_slot]; n != 0; n = n->next) + { + if(str8_match(n->src_file->normal_full_path, file_path_normalized, 0)) + { + src_file_node = n; + break; + } + } + if(src_file_node == 0) + { + src_file_node = push_array(scratch.arena, P2R_SrcFileNode, 1); + SLLStackPush(src_file_map.slots[src_file_slot], src_file_node); + src_file_node->src_file = rdim_src_file_chunk_list_push(arena, &all_src_files, 4096); + src_file_node->src_file->normal_full_path = push_str8_copy(arena, file_path_normalized); + } + + // rjf: build sequence RDIM_LineSequence *seq = rdim_line_sequence_list_push(arena, &dst_unit->line_sequences); - seq->file_name = lines->file_name; + rdim_src_file_push_line_sequence(arena, &all_src_files, src_file_node->src_file, seq); + seq->src_file = src_file_node->src_file; seq->voffs = lines->voffs; seq->line_nums = lines->line_nums; seq->col_nums = lines->col_nums; @@ -2094,7 +2132,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { if(contrib_ptr->mod < comp_unit_count) { - RDIM_Unit *unit = &units.first->v[contrib_ptr->mod]; + RDIM_Unit *unit = &all_units.first->v[contrib_ptr->mod]; RDIM_Rng1U64 range = {contrib_ptr->voff_first, contrib_ptr->voff_opl}; rdim_rng1u64_list_push(arena, &unit->voff_ranges, range); } @@ -2283,7 +2321,7 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) RDIM_Type *basic_type = itype_type_ptrs[cv_basic_type_code]; if(basic_type == 0) { - RDI_TypeKind type_kind = rdi_type_kind_from_cv_basic_type(cv_basic_type_code); + RDI_TypeKind type_kind = p2r_rdi_type_kind_from_cv_basic_type(cv_basic_type_code); U32 byte_size = rdi_size_from_basic_type_kind(type_kind); basic_type = dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); if(byte_size == 0xffffffff) @@ -3321,9 +3359,10 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in) { out->top_level_info = top_level_info; out->binary_sections = binary_sections; - out->units = units; + 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; @@ -3347,6 +3386,7 @@ p2r_bake(Arena *arena, P2R_BakeIn *in) 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; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index bc88a4ff..22d07f84 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -47,6 +47,7 @@ struct P2R_ConvertOut RDIM_UnitChunkList units; RDIM_TypeChunkList types; RDIM_UDTChunkList udts; + RDIM_SrcFileChunkList src_files; RDIM_SymbolChunkList global_variables; RDIM_SymbolChunkList thread_variables; RDIM_SymbolChunkList procedures; @@ -64,6 +65,7 @@ struct P2R_BakeIn RDIM_UnitChunkList units; RDIM_TypeChunkList types; RDIM_UDTChunkList udts; + RDIM_SrcFileChunkList src_files; RDIM_SymbolChunkList global_variables; RDIM_SymbolChunkList thread_variables; RDIM_SymbolChunkList procedures; @@ -164,6 +166,22 @@ struct P2R_LinkNameMap U64 link_name_count; }; +//- rjf: normalized file path -> source file map + +typedef struct P2R_SrcFileNode P2R_SrcFileNode; +struct P2R_SrcFileNode +{ + P2R_SrcFileNode *next; + RDIM_SrcFile *src_file; +}; + +typedef struct P2R_SrcFileMap P2R_SrcFileMap; +struct P2R_SrcFileMap +{ + P2R_SrcFileNode **slots; + U64 slots_count; +}; + //- rjf: link name map building tasks typedef struct P2R_LinkNameMapBuildIn P2R_LinkNameMapBuildIn; @@ -250,10 +268,10 @@ internal RDI_BinarySectionFlags rdi_binary_section_flags_from_coff_section_flags //////////////////////////////// //~ rjf: CodeView => RADDBGI Canonical Conversions -internal RDI_Arch rdi_arch_from_cv_arch(CV_Arch arch); -internal RDI_RegisterCode rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code); -internal RDI_Language rdi_language_from_cv_language(CV_Language language); -internal RDI_TypeKind rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); +internal RDI_Arch p2r_rdi_arch_from_cv_arch(CV_Arch arch); +internal RDI_RegisterCode p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code); +internal RDI_Language p2r_rdi_language_from_cv_language(CV_Language language); +internal RDI_TypeKind p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); //////////////////////////////// //~ rjf: Location Info Building Helpers diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index d500e8d6..006dd1b4 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -92,6 +92,7 @@ main(int argc, char **argv) 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; From 25ef98a98c43aeceb0412684d8c1c2535ec502d8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Feb 2024 10:36:22 -0800 Subject: [PATCH 109/275] raddbgi_make: eliminate old bake src files, switch over completely to user-specified src files; enforce nil entries in all tables for all cases --- src/lib_raddbgi_make/raddbgi_make.c | 113 ++++++++++++++-------------- src/lib_raddbgi_make/raddbgi_make.h | 28 +------ 2 files changed, 61 insertions(+), 80 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index ff2c6b44..7bf48769 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -480,7 +480,7 @@ rdim_idx_from_src_file(RDIM_SrcFile *src_file) RDI_U64 idx = 0; if(src_file != 0 && src_file->chunk != 0) { - idx = src_file->chunk->base_idx + (src_file - src_file->chunk->v); + idx = src_file->chunk->base_idx + (src_file - src_file->chunk->v) + 1; } return idx; } @@ -543,7 +543,7 @@ rdim_idx_from_unit(RDIM_Unit *unit) RDI_U64 idx = 0; if(unit != 0 && unit->chunk != 0) { - idx = unit->chunk->base_idx + (unit - unit->chunk->v); + idx = unit->chunk->base_idx + (unit - unit->chunk->v) + 1; } return idx; } @@ -607,7 +607,7 @@ rdim_idx_from_type(RDIM_Type *type) RDI_U64 idx = 0; if(type != 0 && type->chunk != 0) { - idx = type->chunk->base_idx + (type - type->chunk->v); + idx = type->chunk->base_idx + (type - type->chunk->v) + 1; } return idx; } @@ -659,7 +659,7 @@ rdim_idx_from_udt(RDIM_UDT *udt) RDI_U64 idx = 0; if(udt != 0 && udt->chunk != 0) { - idx = udt->chunk->base_idx + (udt - udt->chunk->v); + idx = udt->chunk->base_idx + (udt - udt->chunk->v) + 1; } return idx; } @@ -736,7 +736,7 @@ rdim_idx_from_symbol(RDIM_Symbol *symbol) RDI_U64 idx = 0; if(symbol != 0 && symbol->chunk != 0) { - idx = symbol->chunk->base_idx + (symbol - symbol->chunk->v); + idx = symbol->chunk->base_idx + (symbol - symbol->chunk->v) + 1; } return idx; } @@ -793,7 +793,7 @@ rdim_idx_from_scope(RDIM_Scope *scope) RDI_U64 idx = 0; if(scope != 0 && scope->chunk != 0) { - idx = scope->chunk->base_idx + (scope - scope->chunk->v); + idx = scope->chunk->base_idx + (scope - scope->chunk->v) + 1; } return idx; } @@ -1468,7 +1468,6 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) RDIM_BakePathTree path_tree = {0}; RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; { - rdim_bake_section_list_push_new(arena, §ions, 0, 0, RDI_DataSectionTag_NULL); strings.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count); idx_runs.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; @@ -1480,7 +1479,14 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) name_maps[k].slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; name_maps[k].slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, name_maps[k].slots_count); } - RDIM_BakePathNode *nil_path = rdim_bake_path_node_from_string(arena, &path_tree, rdim_str8_lit("")); + } + + ////////////////////////////// + //- rjf: bake nils + // + { + rdim_bake_section_list_push_new(arena, §ions, 0, 0, RDI_DataSectionTag_NULL); + rdim_bake_path_node_from_string(arena, &path_tree, rdim_str8_lit("")); rdim_bake_string(arena, &strings, rdim_str8_lit("")); rdim_bake_idx_run(arena, &idx_runs, 0, 0); } @@ -1505,8 +1511,8 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) RDIM_ProfScope("build section for binary sections") { RDIM_BinarySectionList *src_list = ¶ms->binary_sections; - RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src_list->count); - U64 dst_idx = 0; + RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src_list->count+1); + U64 dst_idx = 1; for(RDIM_BinarySectionNode *src_n = src_list->first; src_n != 0; src_n = src_n->next, dst_idx += 1) { RDIM_BinarySection *src = &src_n->v; @@ -1527,8 +1533,8 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) RDIM_ProfScope("build sections for units") { RDIM_UnitChunkList *src_list = ¶ms->units; - RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, src_list->total_count); - RDI_U64 dst_idx = 0; + RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, src_list->total_count+1); + RDI_U64 dst_idx = 1; for(RDIM_UnitChunkNode *src_n = src_list->first; src_n != 0; src_n = src_n->next) { for(RDI_U64 src_chunk_idx = 0; src_chunk_idx < src_n->count; src_chunk_idx += 1, dst_idx += 1) @@ -1680,9 +1686,9 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: iterate all source files, fill serialized version, build sections for line info // - RDI_U32 dst_files_count = params->src_files.total_count; + RDI_U32 dst_files_count = params->src_files.total_count + 1; RDI_SourceFile *dst_files = rdim_push_array(arena, RDI_SourceFile, dst_files_count); - RDI_U32 dst_file_idx = 0; + RDI_U32 dst_file_idx = 1; for(RDIM_SrcFileChunkNode *chunk_n = params->src_files.first; chunk_n != 0; chunk_n = chunk_n->next) @@ -1902,7 +1908,7 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { RDIM_SortKey *key_ptr = keys; RDIM_VMapMarker *marker_ptr = markers; - RDI_U32 unit_idx = 0; + RDI_U32 unit_idx = 1; for(RDIM_UnitChunkNode *unit_chunk_n = params->units.first; unit_chunk_n != 0; unit_chunk_n = unit_chunk_n->next) @@ -1953,10 +1959,10 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: build all type nodes // - RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count); + RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count+1); RDIM_ProfScope("push all type nodes") { - RDI_U32 dst_idx = 0; + RDI_U32 dst_idx = 1; for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) { for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) @@ -2018,14 +2024,14 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: build all udts & members // - RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count); - RDI_Member * members = push_array(arena, RDI_Member, params->udts.total_member_count); - RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, params->udts.total_enum_val_count); + RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count+1); + RDI_Member * members = push_array(arena, RDI_Member, params->udts.total_member_count+1); + RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, params->udts.total_enum_val_count+1); RDIM_ProfScope("build all udts & members") { - RDI_U32 dst_udt_idx = 0; - RDI_U32 dst_member_idx = 0; - RDI_U32 dst_enum_member_idx = 0; + RDI_U32 dst_udt_idx = 1; + RDI_U32 dst_member_idx = 1; + RDI_U32 dst_enum_member_idx = 1; for(RDIM_UDTChunkNode *n = params->udts.first; n != 0; n = n->next) { for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_udt_idx += 1) @@ -2080,10 +2086,10 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) // RDIM_ProfScope("push all type info sections") { - rdim_bake_section_list_push_new(arena, §ions, type_nodes, sizeof(RDI_TypeNode) * params->types.total_count, RDI_DataSectionTag_TypeNodes); - rdim_bake_section_list_push_new(arena, §ions, udts, sizeof(RDI_UDT) * params->udts.total_count, RDI_DataSectionTag_UDTs); - rdim_bake_section_list_push_new(arena, §ions, members , sizeof(RDI_Member) * params->udts.total_member_count, RDI_DataSectionTag_Members); - rdim_bake_section_list_push_new(arena, §ions, enum_members, sizeof(RDI_EnumMember) * params->udts.total_enum_val_count, RDI_DataSectionTag_EnumMembers); + rdim_bake_section_list_push_new(arena, §ions, type_nodes, sizeof(RDI_TypeNode) * (params->types.total_count+1), RDI_DataSectionTag_TypeNodes); + rdim_bake_section_list_push_new(arena, §ions, udts, sizeof(RDI_UDT) * (params->udts.total_count+1), RDI_DataSectionTag_UDTs); + rdim_bake_section_list_push_new(arena, §ions, members , sizeof(RDI_Member) * (params->udts.total_member_count+1), RDI_DataSectionTag_Members); + rdim_bake_section_list_push_new(arena, §ions, enum_members, sizeof(RDI_EnumMember) * (params->udts.total_enum_val_count+1), RDI_DataSectionTag_EnumMembers); } } @@ -2095,10 +2101,10 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: build all global variables // - RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count); + RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count+1); RDIM_ProfScope("build all global variables") { - RDI_U32 dst_idx = 0; + RDI_U32 dst_idx = 1; for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) { for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) @@ -2130,10 +2136,10 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: build all thread variables // - RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count); + RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count+1); RDIM_ProfScope("build all thread variables") { - RDI_U32 dst_idx = 0; + RDI_U32 dst_idx = 1; for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) { for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) @@ -2165,10 +2171,10 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: build all procedures // - RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count); + RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count+1); RDIM_ProfScope("build all procedures") { - RDI_U32 dst_idx = 0; + RDI_U32 dst_idx = 1; for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) { for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) @@ -2276,17 +2282,17 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //////////////////////////// //- rjf: build all scopes, scope voffs, locals, and location blocks // - RDI_Scope * scopes = rdim_push_array(arena, RDI_Scope, params->scopes.total_count); - RDI_U64 * scope_voffs = rdim_push_array(arena, RDI_U64, params->scopes.scope_voff_count); - RDI_Local * locals = rdim_push_array(arena, RDI_Local, params->scopes.local_count); - RDI_LocationBlock * location_blocks = rdim_push_array(arena, RDI_LocationBlock, params->scopes.location_count); + RDI_Scope * scopes = rdim_push_array(arena, RDI_Scope, params->scopes.total_count+1); + RDI_U64 * scope_voffs = rdim_push_array(arena, RDI_U64, params->scopes.scope_voff_count+1); + RDI_Local * locals = rdim_push_array(arena, RDI_Local, params->scopes.local_count+1); + RDI_LocationBlock * location_blocks = rdim_push_array(arena, RDI_LocationBlock, params->scopes.location_count+1); RDIM_String8List location_data_blobs = {0}; RDIM_ProfScope("build all scopes, scope voffs, locals, and location blocks") { - RDI_U64 dst_scope_idx = 0; - RDI_U64 dst_scope_voff_idx = 0; - RDI_U64 dst_local_idx = 0; - RDI_U64 dst_location_block_idx = 0; + RDI_U64 dst_scope_idx = 1; + RDI_U64 dst_scope_voff_idx = 1; + RDI_U64 dst_local_idx = 1; + RDI_U64 dst_location_block_idx = 1; for(RDIM_ScopeChunkNode *chunk_n = params->scopes.first; chunk_n != 0; chunk_n = chunk_n->next) { for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1, dst_scope_idx += 1) @@ -2476,16 +2482,16 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) // RDIM_ProfScope("push all symbol info sections") { - rdim_bake_section_list_push_new(arena, §ions, global_variables, sizeof(RDI_GlobalVariable) * params->global_variables.total_count, RDI_DataSectionTag_GlobalVariables); - rdim_bake_section_list_push_new(arena, §ions, global_vmap.vmap, sizeof(RDI_VMapEntry) * (global_vmap.count+1), RDI_DataSectionTag_GlobalVmap); - rdim_bake_section_list_push_new(arena, §ions, thread_variables, sizeof(RDI_ThreadVariable) * params->thread_variables.total_count, RDI_DataSectionTag_ThreadVariables); - rdim_bake_section_list_push_new(arena, §ions, procedures, sizeof(RDI_Procedure) * params->procedures.total_count, RDI_DataSectionTag_Procedures); - rdim_bake_section_list_push_new(arena, §ions, scopes, sizeof(RDI_Scope) * params->scopes.total_count, RDI_DataSectionTag_Scopes); - rdim_bake_section_list_push_new(arena, §ions, scope_voffs, sizeof(RDI_U64) * params->scopes.scope_voff_count, RDI_DataSectionTag_ScopeVoffData); - rdim_bake_section_list_push_new(arena, §ions, scope_vmap.vmap, sizeof(RDI_VMapEntry) * (scope_vmap.count+1), RDI_DataSectionTag_ScopeVmap); - rdim_bake_section_list_push_new(arena, §ions, locals, sizeof(RDI_Local) * params->scopes.local_count, RDI_DataSectionTag_Locals); - rdim_bake_section_list_push_new(arena, §ions, location_blocks, sizeof(RDI_LocationBlock) * params->scopes.location_count, RDI_DataSectionTag_LocationBlocks); - rdim_bake_section_list_push_new(arena, §ions, location_data_blob.str, location_data_blob.size, RDI_DataSectionTag_LocationData); + rdim_bake_section_list_push_new(arena, §ions, global_variables, sizeof(RDI_GlobalVariable) * (params->global_variables.total_count+1), RDI_DataSectionTag_GlobalVariables); + rdim_bake_section_list_push_new(arena, §ions, global_vmap.vmap, sizeof(RDI_VMapEntry) * (global_vmap.count+1), RDI_DataSectionTag_GlobalVmap); + rdim_bake_section_list_push_new(arena, §ions, thread_variables, sizeof(RDI_ThreadVariable) * (params->thread_variables.total_count+1), RDI_DataSectionTag_ThreadVariables); + rdim_bake_section_list_push_new(arena, §ions, procedures, sizeof(RDI_Procedure) * (params->procedures.total_count+1), RDI_DataSectionTag_Procedures); + rdim_bake_section_list_push_new(arena, §ions, scopes, sizeof(RDI_Scope) * (params->scopes.total_count+1), RDI_DataSectionTag_Scopes); + rdim_bake_section_list_push_new(arena, §ions, scope_voffs, sizeof(RDI_U64) * (params->scopes.scope_voff_count+1), RDI_DataSectionTag_ScopeVoffData); + rdim_bake_section_list_push_new(arena, §ions, scope_vmap.vmap, sizeof(RDI_VMapEntry) * (scope_vmap.count+1), RDI_DataSectionTag_ScopeVmap); + rdim_bake_section_list_push_new(arena, §ions, locals, sizeof(RDI_Local) * (params->scopes.local_count+1), RDI_DataSectionTag_Locals); + rdim_bake_section_list_push_new(arena, §ions, location_blocks, sizeof(RDI_LocationBlock) * (params->scopes.location_count+1), RDI_DataSectionTag_LocationBlocks); + rdim_bake_section_list_push_new(arena, §ions, location_data_blob.str, location_data_blob.size, RDI_DataSectionTag_LocationData); } } @@ -2641,6 +2647,7 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { RDI_FilePathNode *dst_node = &dst_nodes[dst_node_idx]; dst_node->name_string_idx = rdim_bake_string(arena, &strings, src_node->name); + dst_node->source_file_idx = rdim_idx_from_src_file(src_node->src_file); if(src_node->parent != 0) { dst_node->parent_path_node = src_node->parent->idx; @@ -2653,10 +2660,6 @@ rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { dst_node->next_sibling = src_node->next_sibling->idx; } - if(src_node->src_file != 0) - { - dst_node->source_file_idx = src_node->src_file->idx; - } } } rdim_bake_section_list_push_new(arena, §ions, dst_nodes, sizeof(RDI_FilePathNode)*dst_nodes_count, RDI_DataSectionTag_FilePathNodes); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 569964a2..0d8ea98b 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -477,7 +477,7 @@ struct RDIM_SrcFileChunkNode RDI_U64 base_idx; }; -typedef struct RDIM_SrcFileChunkList RDIM_SrcFileChunkList; +typedef struct RDIM_SrcFileChunkList RDIM_SrcFileChunkList; struct RDIM_SrcFileChunkList { RDIM_SrcFileChunkNode *first; @@ -896,7 +896,7 @@ struct RDIM_BakePathNode RDIM_BakePathNode *last_child; RDIM_BakePathNode *next_sibling; RDIM_String8 name; - struct RDIM_BakeSrcNode *src_file; + RDIM_SrcFile *src_file; RDI_U32 idx; }; @@ -907,35 +907,13 @@ struct RDIM_BakeLineMapFragment RDIM_LineSequence *seq; }; -typedef struct RDIM_BakeSrcNode RDIM_BakeSrcNode; -struct RDIM_BakeSrcNode -{ - RDIM_BakeSrcNode *next; - RDIM_BakePathNode *path_node; - RDI_U32 idx; - RDIM_String8 normal_full_path; - - // rjf: line info attached to this src file - RDIM_BakeLineMapFragment *first_fragment; - RDIM_BakeLineMapFragment *last_fragment; - - // rjf: final baked version of this file's line map - RDI_U32 line_map_nums_data_idx; - RDI_U32 line_map_range_data_idx; - RDI_U32 line_map_count; - RDI_U32 line_map_voff_data_idx; -}; - typedef struct RDIM_BakePathTree RDIM_BakePathTree; struct RDIM_BakePathTree { + RDIM_BakePathNode root; RDIM_BakePathNode *first; RDIM_BakePathNode *last; RDI_U32 count; - RDIM_BakePathNode root; - RDIM_BakeSrcNode *src_first; - RDIM_BakeSrcNode *src_last; - RDI_U32 src_count; }; //- rjf: name maps From f93b71d8c3d39c1fddeefd86c98064c9266cc8f3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Feb 2024 13:43:56 -0800 Subject: [PATCH 110/275] 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 --- src/lib_raddbgi_make/raddbgi_make.c | 3185 ++++++++++-------- src/lib_raddbgi_make/raddbgi_make.h | 191 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 62 +- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 54 +- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 34 +- 5 files changed, 1918 insertions(+), 1608 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 7bf48769..d0e6e424 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -439,7 +439,7 @@ rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r } //////////////////////////////// -//~ rjf: Binary Section List Building +//~ rjf: [Building] Binary Section List Building RDI_PROC RDIM_BinarySection * rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list) @@ -452,7 +452,7 @@ 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) @@ -515,7 +515,7 @@ rdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_f } //////////////////////////////// -//~ rjf: Unit List Building +//~ rjf: [Building] Unit List Building RDI_PROC RDIM_Unit * rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap) @@ -579,7 +579,7 @@ rdim_line_sequence_list_push(RDIM_Arena *arena, RDIM_LineSequenceList *list) } //////////////////////////////// -//~ rjf: Type Info Building +//~ rjf: [Building] Type Info Building RDI_PROC RDIM_Type * rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap) @@ -708,7 +708,7 @@ 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) @@ -763,7 +763,7 @@ rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChu } //////////////////////////////// -//~ rjf: Scope Info Building +//~ rjf: [Building] Scope Info Building //- rjf: scopes @@ -984,317 +984,92 @@ rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM } //////////////////////////////// -//~ rjf: Baking - -//- rjf: data section list building helpers - -RDI_PROC RDIM_BakeSection * -rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list) -{ - RDIM_BakeSectionNode *n = rdim_push_array(arena, RDIM_BakeSectionNode, 1); - RDIM_SLLQueuePush(list->first, list->last, n); - list->count += 1; - RDIM_BakeSection *result = &n->v; - return result; -} - -RDI_PROC RDIM_BakeSection * -rdim_bake_section_list_push_new(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_DataSectionTag tag) -{ - RDIM_BakeSection *section = rdim_bake_section_list_push(arena, list); - section->data = data; - section->size = size; - section->tag = tag; - return section; -} - -//- rjf: interned string map reading/writing - -RDI_PROC RDI_U32 -rdim_idx_from_baked_string(RDIM_BakeStringMap *map, RDIM_String8 string) -{ - RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeStringNode *node = 0; - for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->hash == hash && rdim_str8_match(n->string, string, 0)) - { - node = n; - break; - } - } - - // rjf: node -> index - RDI_U32 result = node ? node->idx : 0; - return result; -} - -RDI_PROC RDI_U32 -rdim_bake_string(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string) -{ - RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeStringNode *node = 0; - for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->hash == hash && rdim_str8_match(n->string, string, 0)) - { - node = n; - break; - } - } - - // rjf: no node -> make new node - if(node == 0) - { - node = rdim_push_array(arena, RDIM_BakeStringNode, 1); - node->string = rdim_str8_copy(arena, string); - node->hash = hash; - node->idx = map->count; - map->count += 1; - RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); - RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); - map->slot_collision_count += (node->hash_next != 0); - } - - // rjf: node -> index - RDI_U32 result = node->idx; - return result; -} - -//- rjf: interned index run building +//~ rjf: [Baking Helpers] Baked File Layout Calculations RDI_PROC RDI_U64 -rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count) +rdim_bake_section_count_from_params(RDIM_BakeParams *params) { - RDI_U64 hash = 5381; - RDI_U32 *ptr = idx_run; - RDI_U32 *opl = idx_run + count; - for(;ptr < opl; ptr += 1) + RDI_U64 section_count = 0; { - hash = ((hash << 5) + hash) + (*ptr); + section_count += RDI_DataSectionTag_PRIMARY_COUNT; + section_count += params->units.total_count; // PER-UNIT line info voffs + section_count += params->units.total_count; // PER-UNIT line info data + section_count += params->units.total_count; // PER-UNIT line info columns + section_count += params->src_files.total_count; // PER-SOURCE-FILE line map numbers + section_count += params->src_files.total_count; // PER-SOURCE-FILE line map ranges + section_count += params->src_files.total_count; // PER-SOURCE-FILE line map voffs + section_count += RDI_NameMapKind_COUNT; // PER-NAME-MAP buckets section + section_count += RDI_NameMapKind_COUNT; // PER-NAME-MAP nodes section } - return hash; + return section_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_U64 +rdim_bake_section_idx_from_params_tag_idx(RDIM_BakeParams *params, RDI_DataSectionTag tag, RDI_U64 idx) { - RDI_U64 hash = rdim_hash_from_idx_run(idx_run, count); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeIdxRunNode *node = 0; - for(RDIM_BakeIdxRunNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + RDI_U64 result = 0; + if(tag < RDI_DataSectionTag_PRIMARY_COUNT) { - if(n->hash == hash) - { - RDI_S32 is_match = 1; - RDI_U32 *n_idx = n->idx_run; - for(RDI_U32 i = 0; i < count; i += 1) - { - if(n_idx[i] != idx_run[i]) - { - is_match = 0; - break; - } - } - if(is_match) - { - node = n; - break; - } - } + result = (RDI_U64)tag; } - - // rjf: no node -> make new node - if(node == 0) + else switch(tag) { - node = rdim_push_array_no_zero(arena, RDIM_BakeIdxRunNode, 1); - RDI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RDI_U32, count); - for(RDI_U32 i = 0; i < count; i += 1) + default:{}break; + + //- rjf: per-unit sections + case RDI_DataSectionTag_LineInfoVoffs: + if(idx != 0) { - idx_run_copy[i] = idx_run[i]; - } - node->idx_run = idx_run_copy; - node->hash = hash; - node->count = count; - node->first_idx = map->idx_count; - map->count += 1; - map->idx_count += count; - RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); - RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); - map->slot_collision_count += (node->hash_next != 0); + result = RDI_DataSectionTag_PRIMARY_COUNT + 0*params->units.total_count + (idx-1)%params->units.total_count; + }break; + case RDI_DataSectionTag_LineInfoData: + if(idx != 0) + { + result = RDI_DataSectionTag_PRIMARY_COUNT + 1*params->units.total_count + (idx-1)%params->units.total_count; + }break; + case RDI_DataSectionTag_LineInfoColumns: + if(idx != 0) + { + result = RDI_DataSectionTag_PRIMARY_COUNT + 2*params->units.total_count + (idx-1)%params->units.total_count; + }break; + + //- rjf: per-source-file sections + case RDI_DataSectionTag_LineMapNumbers: + if(idx != 0) + { + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 0*params->src_files.total_count + (idx-1)%params->src_files.total_count; + }break; + case RDI_DataSectionTag_LineMapRanges: + if(idx != 0) + { + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 1*params->src_files.total_count + (idx-1)%params->src_files.total_count; + }break; + case RDI_DataSectionTag_LineMapVoffs: + if(idx != 0) + { + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 2*params->src_files.total_count + (idx-1)%params->src_files.total_count; + }break; + + //- rjf: per-name-map sections + case RDI_DataSectionTag_NameMapBuckets: + if(idx != 0) + { + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 0*RDI_NameMapKind_COUNT + (idx-1)%RDI_NameMapKind_COUNT; + }break; + case RDI_DataSectionTag_NameMapNodes: + if(idx != 0) + { + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 1*RDI_NameMapKind_COUNT + (idx-1)%RDI_NameMapKind_COUNT; + }break; } - - // rjf: node -> index - RDI_U32 result = node->first_idx; return result; } -//- rjf: interned path/file building +//////////////////////////////// +//~ rjf: [Baking Helpers] Baked VMap Building -RDI_PROC RDIM_String8 -rdim_normal_string_from_bake_path_node(RDIM_Arena *arena, RDIM_BakePathNode *node) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - RDIM_String8List list = {0}; - for(RDIM_BakePathNode *n = node; n != 0; n = n->parent) - { - if(n->name.size != 0) - { - rdim_str8_list_push_front(scratch.arena, &list, n->name); - } - } - RDIM_String8 result = rdim_str8_list_join(arena, &list, rdim_str8_lit("/")); - { - RDI_U8 *ptr = result.str; - RDI_U8 *opl = result.str + result.size; - for(;ptr < opl; ptr += 1) - { - RDI_U8 c = *ptr; - if('A' <= c && c <= 'Z') { c += 'a' - 'A'; } - *ptr = c; - } - } - scratch_end(scratch); - return result; -} - -RDI_PROC RDIM_BakePathNode * -rdim_bake_path_node_from_string(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) -{ - RDIM_BakePathNode *node = &tree->root; - RDI_U8 *ptr = string.str; - RDI_U8 *opl = string.str + string.size; - for(;ptr < opl;) - { - // rjf: skip past slashes - for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); - - // rjf: save beginning of non-slash range - RDI_U8 *range_first = ptr; - - // rjf: skip past non-slashes - for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); - - // rjf: empty range -> continue - if(range_first >= ptr) - { - continue; - } - - // rjf: range -> sub-directory string - RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); - - // rjf: sub-directory string -> find child of node - RDIM_BakePathNode *sub_dir_node = 0; - for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling) - { - if(rdim_str8_match(child->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) - { - sub_dir_node = child; - } - } - - // rjf: no child -> make one - if(sub_dir_node == 0) - { - sub_dir_node = rdim_push_array(arena, RDIM_BakePathNode, 1); - RDIM_SLLQueuePush_N(tree->first, tree->last, sub_dir_node, next_order); - sub_dir_node->parent = node; - RDIM_SLLQueuePush_N(node->first_child, node->last_child, sub_dir_node, next_sibling); - sub_dir_node->name = rdim_str8_copy(arena, sub_dir); - sub_dir_node->idx = tree->count; - tree->count += 1; - } - - // rjf: descend to child - node = sub_dir_node; - } - return node; -} - -RDI_PROC RDI_U32 -rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) -{ - RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(arena, tree, string); - return path_node->idx; -} - -//- rjf: name maps - -RDI_PROC void -rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx) -{ - // rjf: hash - RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeNameMapNode *node = 0; - for(RDIM_BakeNameMapNode *n = map->slots[slot_idx]; n != 0; n = n->slot_next) - { - if(rdim_str8_match(string, n->string, 0)) - { - node = n; - break; - } - } - - // rjf: make node if necessary - if(node == 0) - { - node = rdim_push_array(arena, RDIM_BakeNameMapNode, 1); - node->string = rdim_str8_copy(arena, string); - RDIM_SLLStackPush_N(map->slots[slot_idx], node, slot_next); - RDIM_SLLQueuePush_N(map->first, map->last, node, order_next); - map->name_count += 1; - map->slot_collision_count += (node->slot_next != 0); - } - - // rjf: find existing idx - RDI_S32 existing_idx = 0; - for(RDIM_BakeNameMapValNode *n = node->val_first; n != 0; n = n->next) - { - for(RDI_U32 i = 0; i < sizeof(n->val)/sizeof(n->val[0]); i += 1) - { - if(n->val[i] == 0) - { - break; - } - if(n->val[i] == idx) - { - existing_idx = 1; - break; - } - } - } - - // rjf: insert new idx if necessary - if(!existing_idx) - { - RDIM_BakeNameMapValNode *val_node = node->val_last; - RDI_U32 insert_i = node->val_count%(sizeof(val_node->val)/sizeof(val_node->val[0])); - if(insert_i == 0) - { - val_node = rdim_push_array(arena, RDIM_BakeNameMapValNode, 1); - SLLQueuePush(node->val_first, node->val_last, val_node); - } - val_node->val[insert_i] = idx; - node->val_count += 1; - } -} - -//- rjf: vmap baking - -RDI_PROC RDIM_VMap -rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count) +RDI_PROC RDIM_BakeVMap +rdim_bake_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -1427,1339 +1202,1783 @@ rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey } //- rjf: fill result - RDIM_VMap result = {0}; + RDIM_BakeVMap result = {0}; result.vmap = vmap; result.count = vmap_entry_count-1; rdim_scratch_end(scratch); return result; } -//- rjf: main baking entry point +//////////////////////////////// +//~ 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_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeStringNode *node = 0; + for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash && rdim_str8_match(n->string, string, 0)) + { + node = n; + break; + } + } + + // rjf: node -> index + RDI_U32 result = node ? node->idx : 0; + return result; +} + +RDI_PROC RDI_U32 +rdim_bake_string_map_insert(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string) +{ + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeStringNode *node = 0; + for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash && rdim_str8_match(n->string, string, 0)) + { + node = n; + break; + } + } + + // rjf: no node -> make new node + if(node == 0) + { + node = rdim_push_array(arena, RDIM_BakeStringNode, 1); + node->string = rdim_str8_copy(arena, string); + node->hash = hash; + node->idx = map->count; + map->count += 1; + RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); + RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); + map->slot_collision_count += (node->hash_next != 0); + } + + // rjf: node -> index + RDI_U32 result = node->idx; + return result; +} + +//- rjf: bake idx run map reading/writing + +RDI_PROC RDI_U64 +rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count) +{ + RDI_U64 hash = 5381; + RDI_U32 *ptr = idx_run; + RDI_U32 *opl = idx_run + count; + for(;ptr < opl; ptr += 1) + { + hash = ((hash << 5) + hash) + (*ptr); + } + return hash; +} + +RDI_PROC RDI_U32 +rdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count) +{ + RDI_U64 hash = rdim_hash_from_idx_run(idx_run, count); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeIdxRunNode *node = 0; + for(RDIM_BakeIdxRunNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash) + { + RDI_S32 is_match = 1; + RDI_U32 *n_idx = n->idx_run; + for(RDI_U32 i = 0; i < count; i += 1) + { + if(n_idx[i] != idx_run[i]) + { + is_match = 0; + break; + } + } + if(is_match) + { + node = n; + break; + } + } + } + + // rjf: node -> index + RDI_U32 result = node ? node->first_idx : 0; + return result; +} + +RDI_PROC RDI_U32 +rdim_bake_idx_run_map_insert(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count) +{ + RDI_U64 hash = rdim_hash_from_idx_run(idx_run, count); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeIdxRunNode *node = 0; + for(RDIM_BakeIdxRunNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash) + { + RDI_S32 is_match = 1; + RDI_U32 *n_idx = n->idx_run; + for(RDI_U32 i = 0; i < count; i += 1) + { + if(n_idx[i] != idx_run[i]) + { + is_match = 0; + break; + } + } + if(is_match) + { + node = n; + break; + } + } + } + + // rjf: no node -> make new node + if(node == 0) + { + node = rdim_push_array_no_zero(arena, RDIM_BakeIdxRunNode, 1); + RDI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RDI_U32, count); + for(RDI_U32 i = 0; i < count; i += 1) + { + idx_run_copy[i] = idx_run[i]; + } + node->idx_run = idx_run_copy; + node->hash = hash; + node->count = count; + node->first_idx = map->idx_count; + map->count += 1; + map->idx_count += count; + RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); + RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); + map->slot_collision_count += (node->hash_next != 0); + } + + // rjf: node -> index + RDI_U32 result = node->first_idx; + return result; +} + +//- rjf: bake path tree reading/writing + +RDI_PROC RDIM_BakePathNode * +rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string) +{ + RDIM_BakePathNode *node = &tree->root; + RDI_U8 *ptr = string.str; + RDI_U8 *opl = string.str + string.size; + for(;ptr < opl && node != 0;) + { + // rjf: skip past slashes + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: save beginning of non-slash range + RDI_U8 *range_first = ptr; + + // rjf: skip past non-slashes + for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: empty range -> continue + if(range_first >= ptr) + { + continue; + } + + // rjf: range -> sub-directory string + RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); + + // rjf: sub-directory string -> find child of node + RDIM_BakePathNode *sub_dir_node = 0; + for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling) + { + if(rdim_str8_match(child->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) + { + sub_dir_node = child; + } + } + + // rjf: descend to child + node = sub_dir_node; + } + return node; +} + +RDI_PROC RDI_U32 +rdim_bake_path_node_idx_from_string(RDIM_BakePathTree *tree, RDIM_String8 string) +{ + RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(tree, string); + return path_node ? path_node->idx : 0; +} + +RDI_PROC RDIM_BakePathNode * +rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) +{ + RDIM_BakePathNode *node = &tree->root; + RDI_U8 *ptr = string.str; + RDI_U8 *opl = string.str + string.size; + for(;ptr < opl;) + { + // rjf: skip past slashes + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: save beginning of non-slash range + RDI_U8 *range_first = ptr; + + // rjf: skip past non-slashes + for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: empty range -> continue + if(range_first >= ptr) + { + continue; + } + + // rjf: range -> sub-directory string + RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); + + // rjf: sub-directory string -> find child of node + RDIM_BakePathNode *sub_dir_node = 0; + for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling) + { + if(rdim_str8_match(child->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) + { + sub_dir_node = child; + } + } + + // rjf: no child -> make one + if(sub_dir_node == 0) + { + sub_dir_node = rdim_push_array(arena, RDIM_BakePathNode, 1); + RDIM_SLLQueuePush_N(tree->first, tree->last, sub_dir_node, next_order); + sub_dir_node->parent = node; + RDIM_SLLQueuePush_N(node->first_child, node->last_child, sub_dir_node, next_sibling); + sub_dir_node->name = rdim_str8_copy(arena, sub_dir); + sub_dir_node->idx = tree->count; + tree->count += 1; + } + + // rjf: descend to child + node = sub_dir_node; + } + return node; +} + +//- 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: hash + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeNameMapNode *node = 0; + for(RDIM_BakeNameMapNode *n = map->slots[slot_idx]; n != 0; n = n->slot_next) + { + if(rdim_str8_match(string, n->string, 0)) + { + node = n; + break; + } + } + + // rjf: make node if necessary + if(node == 0) + { + node = rdim_push_array(arena, RDIM_BakeNameMapNode, 1); + node->string = rdim_str8_copy(arena, string); + RDIM_SLLStackPush_N(map->slots[slot_idx], node, slot_next); + RDIM_SLLQueuePush_N(map->first, map->last, node, order_next); + map->name_count += 1; + map->slot_collision_count += (node->slot_next != 0); + } + + // rjf: find existing idx + RDI_S32 existing_idx = 0; + for(RDIM_BakeNameMapValNode *n = node->val_first; n != 0; n = n->next) + { + for(RDI_U32 i = 0; i < sizeof(n->val)/sizeof(n->val[0]); i += 1) + { + if(n->val[i] == 0) + { + break; + } + if(n->val[i] == idx) + { + existing_idx = 1; + break; + } + } + } + + // rjf: insert new idx if necessary + if(!existing_idx) + { + RDIM_BakeNameMapValNode *val_node = node->val_last; + RDI_U32 insert_i = node->val_count%(sizeof(val_node->val)/sizeof(val_node->val[0])); + if(insert_i == 0) + { + val_node = rdim_push_array(arena, RDIM_BakeNameMapValNode, 1); + SLLQueuePush(node->val_first, node->val_last, val_node); + } + val_node->val[insert_i] = idx; + node->val_count += 1; + } +} + +//////////////////////////////// +//~ rjf: [Baking Helpers] Data Section List Building Helpers + +RDI_PROC RDIM_BakeSection * +rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list) +{ + RDIM_BakeSectionNode *n = rdim_push_array(arena, RDIM_BakeSectionNode, 1); + RDIM_SLLQueuePush(list->first, list->last, n); + list->count += 1; + RDIM_BakeSection *result = &n->v; + return result; +} + +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) +{ + RDIM_BakeSection *section = rdim_bake_section_list_push(arena, list); + section->data = data; + section->size = size; + section->tag = tag; + section->tag_idx = tag_idx; + return section; +} + +RDI_PROC void +rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSectionList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->count += to_push->count; + } + else if(to_push->first != 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +//////////////////////////////// +//~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures + +//- rjf: bake string map from params + +RDI_PROC RDIM_BakeStringMap +rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +{ + RDIM_BakeStringMap strings = {0}; + strings.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; + strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count); + rdim_bake_string_map_insert(arena, &strings, rdim_str8_lit("")); + return strings; +} + +//- rjf: idx run map building + +RDI_PROC RDIM_BakeIdxRunMap +rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +{ + RDIM_BakeIdxRunMap idx_runs = {0}; + idx_runs.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; + idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count); + rdim_bake_idx_run_map_insert(arena, &idx_runs, 0, 0); + return idx_runs; +} + +//- rjf: bake path tree building + +RDI_PROC RDIM_BakePathTree +rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +{ + RDIM_BakePathTree tree = {0}; + rdim_bake_path_tree_insert(arena, &tree, rdim_str8_lit("")); + return tree; +} + +//- 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) +{ + RDIM_BakeNameMap map = {0}; + map.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + switch(kind) + { + default:{}break; + } + return map; +} + +//////////////////////////////// +//~ rjf: [Baking] Build Artifacts -> Data Section Lists + +//- rjf: top-level info RDI_PROC RDIM_BakeSectionList -rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - ////////////////////////////// - //- NOTE(rjf): On the ordering of baking phases: - // - // Baking is the process of taking all loose data structures passed in via - // `params`, or constructed on-the-fly (e.g. the `BakeStringMap`), and - // serializing them down into flat plain-old-data tables which can be - // written directly into a RADDBGI file. - // - // Perhaps unsurprisingly, after each loose data structure is baked, it can - // no longer be mutated and touched (otherwise you'd need to re-bake to - // preserve new information added to the loose data structure). - // - // The phases of baking in this baking algorithm are organized such that re- - // baking never occurs. This means that common baking data structures, like - // the string interning map (`BakeStringMap`), the index run interning map - // (`BakeIdxRunMap`), and so on, are serialized *last*, because they are - // used in previous stages of the bake. - - ////////////////////////////// - //- rjf: set up intermediate baking data structures - // RDIM_BakeSectionList sections = {0}; - RDIM_BakeStringMap strings = {0}; - RDIM_BakeIdxRunMap idx_runs = {0}; - RDIM_BakePathTree path_tree = {0}; - RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; + RDI_TopLevelInfo *dst_tli = rdim_push_array(arena, RDI_TopLevelInfo, 1); + RDIM_TopLevelInfo *src_tli = ¶ms->top_level_info; + dst_tli->architecture = src_tli->arch; + dst_tli->exe_name_string_idx = rdim_bake_idx_from_string(strings, src_tli->exe_name); + dst_tli->exe_hash = src_tli->exe_hash; + dst_tli->voff_max = src_tli->voff_max; + rdim_bake_section_list_push_new(arena, §ions, dst_tli, sizeof(*dst_tli), RDI_DataSectionTag_TopLevelInfo, 0); + return sections; +} + +//- rjf: binary sections + +RDI_PROC RDIM_BakeSectionList +rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) +{ + RDIM_BakeSectionList sections = {0}; + RDIM_BinarySectionList *src_list = ¶ms->binary_sections; + RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src_list->count+1); + U64 dst_idx = 1; + for(RDIM_BinarySectionNode *src_n = src_list->first; src_n != 0; src_n = src_n->next, dst_idx += 1) { - strings.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count); - idx_runs.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count); - for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); - k < RDI_NameMapKind_COUNT; - k = (RDI_NameMapKind)(k+1)) + RDIM_BinarySection *src = &src_n->v; + RDI_BinarySection *dst = &dst_base[dst_idx]; + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->flags = src->flags; + dst->voff_first = src->voff_first; + dst->voff_opl = src->voff_opl; + dst->foff_first = src->foff_first; + dst->foff_opl = src->foff_opl; + } + rdim_bake_section_list_push_new(arena, §ions, dst_base, sizeof(*dst_base)*dst_idx, RDI_DataSectionTag_BinarySections, 0); + return sections; +} + +//- 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) +{ + RDIM_BakeSectionList sections = {0}; + RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, params->units.total_count+1); + RDI_U64 dst_idx = 1; + for(RDIM_UnitChunkNode *src_n = params->units.first; src_n != 0; src_n = src_n->next) + { + for(RDI_U64 src_chunk_idx = 0; src_chunk_idx < src_n->count; src_chunk_idx += 1, dst_idx += 1) { - name_maps[k].slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - name_maps[k].slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, name_maps[k].slots_count); - } - } - - ////////////////////////////// - //- rjf: bake nils - // - { - rdim_bake_section_list_push_new(arena, §ions, 0, 0, RDI_DataSectionTag_NULL); - rdim_bake_path_node_from_string(arena, &path_tree, rdim_str8_lit("")); - rdim_bake_string(arena, &strings, rdim_str8_lit("")); - rdim_bake_idx_run(arena, &idx_runs, 0, 0); - } - - ////////////////////////////// - //- rjf: build section for top-level-info - // - RDIM_ProfScope("build section for top-level-info") - { - RDI_TopLevelInfo *dst_tli = rdim_push_array(arena, RDI_TopLevelInfo, 1); - RDIM_TopLevelInfo *src_tli = ¶ms->top_level_info; - dst_tli->architecture = src_tli->arch; - dst_tli->exe_name_string_idx = rdim_bake_string(arena, &strings, src_tli->exe_name); - dst_tli->exe_hash = src_tli->exe_hash; - dst_tli->voff_max = src_tli->voff_max; - rdim_bake_section_list_push_new(arena, §ions, dst_tli, sizeof(*dst_tli), RDI_DataSectionTag_TopLevelInfo); - } - - ////////////////////////////// - //- rjf: build section for binary sections - // - RDIM_ProfScope("build section for binary sections") - { - RDIM_BinarySectionList *src_list = ¶ms->binary_sections; - RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src_list->count+1); - U64 dst_idx = 1; - for(RDIM_BinarySectionNode *src_n = src_list->first; src_n != 0; src_n = src_n->next, dst_idx += 1) - { - RDIM_BinarySection *src = &src_n->v; - RDI_BinarySection *dst = &dst_base[dst_idx]; - dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); - dst->flags = src->flags; - dst->voff_first = src->voff_first; - dst->voff_opl = src->voff_opl; - dst->foff_first = src->foff_first; - dst->foff_opl = src->foff_opl; - } - rdim_bake_section_list_push_new(arena, §ions, dst_base, sizeof(*dst_base)*dst_idx, RDI_DataSectionTag_BinarySections); - } - - ////////////////////////////// - //- rjf: build sections for units - // - RDIM_ProfScope("build sections for units") - { - RDIM_UnitChunkList *src_list = ¶ms->units; - RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, src_list->total_count+1); - RDI_U64 dst_idx = 1; - for(RDIM_UnitChunkNode *src_n = src_list->first; src_n != 0; src_n = src_n->next) - { - for(RDI_U64 src_chunk_idx = 0; src_chunk_idx < src_n->count; src_chunk_idx += 1, dst_idx += 1) + RDIM_Unit *src = &src_n->v[src_chunk_idx]; + RDI_Unit *dst = &dst_base[dst_idx]; + + //////////////////////// + //- rjf: produce combined unit line info + // + RDI_U64 *unit_voffs = 0; + RDI_Line *unit_lines = 0; + RDI_U16 *unit_cols = 0; + RDI_U32 unit_line_count = 0; + RDIM_ProfScope("produce combined unit line info") { - RDIM_Unit *src = &src_n->v[src_chunk_idx]; - RDI_Unit *dst = &dst_base[dst_idx]; + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - //////////////////////// - //- rjf: produce combined unit line info + //- rjf: gather up all line info into two arrays: // - RDI_U64 *unit_voffs = 0; - RDI_Line *unit_lines = 0; - RDI_U16 *unit_cols = 0; - RDI_U32 unit_line_count = 0; - RDIM_ProfScope("produce combined unit line info") + // [1] keys: sortable array; pairs voffs with line info records; null records are sequence enders + // [2] recs: contains all the source coordinates for a range of voffs + // + typedef struct RDIM_LineRec RDIM_LineRec; + struct RDIM_LineRec { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - //- rjf: gather up all line info into two arrays: - // - // [1] keys: sortable array; pairs voffs with line info records; null records are sequence enders - // [2] recs: contains all the source coordinates for a range of voffs - // - typedef struct RDIM_LineRec RDIM_LineRec; - struct RDIM_LineRec - { - RDI_U32 file_id; - RDI_U32 line_num; - RDI_U16 col_first; - RDI_U16 col_opl; - }; - RDI_U64 line_count = 0; - RDI_U64 seq_count = 0; + RDI_U32 file_id; + RDI_U32 line_num; + RDI_U16 col_first; + RDI_U16 col_opl; + }; + RDI_U64 line_count = 0; + RDI_U64 seq_count = 0; + for(RDIM_LineSequenceNode *seq_n = src->line_sequences.first; seq_n != 0; seq_n = seq_n->next) + { + seq_count += 1; + line_count += seq_n->v.line_count; + } + RDI_U64 key_count = line_count + seq_count; + RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); + RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); + { + RDIM_SortKey *key_ptr = line_keys; + RDIM_LineRec *rec_ptr = line_recs; for(RDIM_LineSequenceNode *seq_n = src->line_sequences.first; seq_n != 0; seq_n = seq_n->next) { - seq_count += 1; - line_count += seq_n->v.line_count; - } - RDI_U64 key_count = line_count + seq_count; - RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); - RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); - { - RDIM_SortKey *key_ptr = line_keys; - RDIM_LineRec *rec_ptr = line_recs; - for(RDIM_LineSequenceNode *seq_n = src->line_sequences.first; seq_n != 0; seq_n = seq_n->next) + RDIM_LineSequence *seq = &seq_n->v; + for(RDI_U64 line_idx = 0; line_idx < seq->line_count; line_idx += 1) { - RDIM_LineSequence *seq = &seq_n->v; - for(RDI_U64 line_idx = 0; line_idx < seq->line_count; line_idx += 1) - { - key_ptr->key = seq->voffs[line_idx]; - key_ptr->val = rec_ptr; - key_ptr += 1; - rec_ptr->file_id = (RDI_U32)rdim_idx_from_src_file(seq->src_file); // TODO(rjf): @u64_to_u32 - rec_ptr->line_num = seq->line_nums[line_idx]; - if(seq->col_nums != 0) - { - rec_ptr->col_first = seq->col_nums[line_idx*2]; - rec_ptr->col_opl = seq->col_nums[line_idx*2 + 1]; - } - rec_ptr += 1; - } - key_ptr->key = seq->voffs[seq->line_count]; - key_ptr->val = 0; + key_ptr->key = seq->voffs[line_idx]; + key_ptr->val = rec_ptr; key_ptr += 1; - } - } - - //- rjf: sort - RDIM_SortKey *sorted_line_keys = 0; - RDIM_ProfScope("sort") - { - sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); - } - - // TODO(rjf): do a pass over sorted keys to make sure duplicate keys - // are sorted with null record first, and no more than one null - // record and one non-null record - - //- rjf: arrange output - RDI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RDI_U64, key_count + 1); - RDI_Line *arranged_lines = rdim_push_array_no_zero(arena, RDI_Line, key_count); - RDIM_ProfScope("arrange output") - { - for(RDI_U64 i = 0; i < key_count; i += 1) - { - arranged_voffs[i] = sorted_line_keys[i].key; - } - arranged_voffs[key_count] = ~0ull; - for(RDI_U64 i = 0; i < key_count; i += 1) - { - RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; - if(rec != 0) + rec_ptr->file_id = (RDI_U32)rdim_idx_from_src_file(seq->src_file); // TODO(rjf): @u64_to_u32 + rec_ptr->line_num = seq->line_nums[line_idx]; + if(seq->col_nums != 0) { - arranged_lines[i].file_idx = rec->file_id; - arranged_lines[i].line_num = rec->line_num; - } - else - { - arranged_lines[i].file_idx = 0; - arranged_lines[i].line_num = 0; + rec_ptr->col_first = seq->col_nums[line_idx*2]; + rec_ptr->col_opl = seq->col_nums[line_idx*2 + 1]; } + rec_ptr += 1; } + key_ptr->key = seq->voffs[seq->line_count]; + key_ptr->val = 0; + key_ptr += 1; } - - //- rjf: fill output - unit_voffs = arranged_voffs; - unit_lines = arranged_lines; - unit_cols = 0; - unit_line_count = key_count; - rdim_scratch_end(scratch); } - //////////////////////// - //- rjf: build line info sections - // - RDI_U32 line_info_voffs_data_idx = (RDI_U32)sections.count; // TODO(rjf): @u64_to_u32 - RDI_U32 line_info_data_idx = line_info_voffs_data_idx+1; - RDI_U32 line_info_col_data_idx = unit_cols ? line_info_voffs_data_idx+2 : 0; - rdim_bake_section_list_push_new(arena, §ions, unit_voffs, sizeof(RDI_U64)*(unit_line_count+1), RDI_DataSectionTag_LineInfoVoffs); - rdim_bake_section_list_push_new(arena, §ions, unit_lines, sizeof(RDI_Line)*unit_line_count, RDI_DataSectionTag_LineInfoData); - if(unit_cols != 0) + //- rjf: sort + RDIM_SortKey *sorted_line_keys = 0; + RDIM_ProfScope("sort") { - rdim_bake_section_list_push_new(arena, §ions, unit_cols, sizeof(RDI_Column)*unit_line_count, RDI_DataSectionTag_LineInfoColumns); + sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); + } + + // TODO(rjf): do a pass over sorted keys to make sure duplicate keys + // are sorted with null record first, and no more than one null + // record and one non-null record + + //- rjf: arrange output + RDI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RDI_U64, key_count + 1); + RDI_Line *arranged_lines = rdim_push_array_no_zero(arena, RDI_Line, key_count); + RDIM_ProfScope("arrange output") + { + for(RDI_U64 i = 0; i < key_count; i += 1) + { + arranged_voffs[i] = sorted_line_keys[i].key; + } + arranged_voffs[key_count] = ~0ull; + for(RDI_U64 i = 0; i < key_count; i += 1) + { + RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; + if(rec != 0) + { + arranged_lines[i].file_idx = rec->file_id; + arranged_lines[i].line_num = rec->line_num; + } + else + { + arranged_lines[i].file_idx = 0; + arranged_lines[i].line_num = 0; + } + } } - //////////////////////// //- rjf: fill output - // - dst->unit_name_string_idx = rdim_bake_string(arena, &strings, src->unit_name); - dst->compiler_name_string_idx = rdim_bake_string(arena, &strings, src->compiler_name); - dst->source_file_path_node = rdim_bake_path(arena, &path_tree, src->source_file); - dst->object_file_path_node = rdim_bake_path(arena, &path_tree, src->object_file); - dst->archive_file_path_node = rdim_bake_path(arena, &path_tree, src->archive_file); - dst->build_path_node = rdim_bake_path(arena, &path_tree, src->build_path); - dst->language = src->language; - dst->line_info_voffs_data_idx = line_info_voffs_data_idx; - dst->line_info_data_idx = line_info_data_idx; - dst->line_info_col_data_idx = line_info_col_data_idx; + unit_voffs = arranged_voffs; + unit_lines = arranged_lines; + unit_cols = 0; + unit_line_count = key_count; + rdim_scratch_end(scratch); + } + + //////////////////////// + //- rjf: build line info sections + // + rdim_bake_section_list_push_new(arena, §ions, unit_voffs, sizeof(RDI_U64)*(unit_line_count+1), RDI_DataSectionTag_LineInfoVoffs, dst_idx); + rdim_bake_section_list_push_new(arena, §ions, unit_lines, sizeof(RDI_Line)*unit_line_count, RDI_DataSectionTag_LineInfoData, dst_idx); + if(unit_cols != 0) + { + rdim_bake_section_list_push_new(arena, §ions, unit_cols, sizeof(RDI_Column)*unit_line_count, RDI_DataSectionTag_LineInfoColumns, dst_idx); + } + + //////////////////////// + //- rjf: fill output + // + dst->unit_name_string_idx = rdim_bake_idx_from_string(strings, src->unit_name); + dst->compiler_name_string_idx = rdim_bake_idx_from_string(strings, src->compiler_name); + dst->source_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->source_file); + dst->object_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->object_file); + dst->archive_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->archive_file); + dst->build_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->build_path); + dst->language = src->language; + dst->line_info_voffs_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_LineInfoVoffs, dst_idx); // TODO(rjf): @u64_to_u32 + dst->line_info_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_LineInfoData, dst_idx); // TODO(rjf): @u64_to_u32 + dst->line_info_col_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_LineInfoColumns, dst_idx); // TODO(rjf): @u64_to_u32 + } + } + rdim_bake_section_list_push_new(arena, §ions, dst_base, sizeof(*dst_base)*dst_idx, RDI_DataSectionTag_Units, 0); + return sections; +} + +//- rjf: unit vmap + +RDI_PROC RDIM_BakeSectionList +rdim_bake_unit_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +{ + //- rjf: build vmap from unit voff ranges + RDIM_BakeVMap unit_vmap = {0}; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: count voff ranges + RDI_U64 voff_range_count = 0; + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDIM_Unit *unit = &n->v[idx]; + voff_range_count += unit->voff_ranges.count; } } - rdim_bake_section_list_push_new(arena, §ions, dst_base, sizeof(*dst_base)*dst_idx, RDI_DataSectionTag_Units); + + // rjf: count necessary markers + RDI_U64 marker_count = voff_range_count*2; + + // rjf: build keys/markers arrays + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + RDI_U32 unit_idx = 1; + for(RDIM_UnitChunkNode *unit_chunk_n = params->units.first; + unit_chunk_n != 0; + unit_chunk_n = unit_chunk_n->next) + { + for(RDI_U64 idx = 0; idx < unit_chunk_n->count; idx += 1) + { + RDIM_Unit *unit = &unit_chunk_n->v[idx]; + for(RDIM_Rng1U64Node *n = unit->voff_ranges.first; n != 0; n = n->next) + { + RDIM_Rng1U64 range = n->v; + if(range.min < range.max) + { + key_ptr->key = range.min; + key_ptr->val = marker_ptr; + marker_ptr->idx = unit_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = range.max; + key_ptr->val = marker_ptr; + marker_ptr->idx = unit_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + unit_idx += 1; + } + } + } + + // rjf: keys/markers -> unit vmap + unit_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); + rdim_scratch_end(scratch); } - ////////////////////////////// - //- rjf: build per-source-file info sections + //- rjf: build section + RDIM_BakeSectionList sections = {0}; + RDI_U64 unit_vmap_size = sizeof(unit_vmap.vmap[0])*(unit_vmap.count+1); + rdim_bake_section_list_push_new(arena, §ions, unit_vmap.vmap, unit_vmap_size, RDI_DataSectionTag_UnitVmap, 0); + return sections; +} + +//- 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) +{ + RDIM_BakeSectionList sections = {0}; + + //////////////////////////// + //- rjf: iterate all source files, fill serialized version, build sections for line info // - RDIM_ProfScope("build per-source-file info sections") + RDI_U32 dst_files_count = params->src_files.total_count + 1; + RDI_SourceFile *dst_files = rdim_push_array(arena, RDI_SourceFile, dst_files_count); + RDI_U32 dst_file_idx = 1; + for(RDIM_SrcFileChunkNode *chunk_n = params->src_files.first; + chunk_n != 0; + chunk_n = chunk_n->next) { - //////////////////////////// - //- rjf: iterate all source files, fill serialized version, build sections for line info - // - RDI_U32 dst_files_count = params->src_files.total_count + 1; - RDI_SourceFile *dst_files = rdim_push_array(arena, RDI_SourceFile, dst_files_count); - RDI_U32 dst_file_idx = 1; - for(RDIM_SrcFileChunkNode *chunk_n = params->src_files.first; - chunk_n != 0; - chunk_n = chunk_n->next) + for(RDI_U64 idx = 0; idx < chunk_n->count; idx += 1, dst_file_idx += 1) { - for(RDI_U64 idx = 0; idx < chunk_n->count; idx += 1, dst_file_idx += 1) + RDIM_SrcFile *src_file = &chunk_n->v[idx]; + RDI_SourceFile *dst_file = &dst_files[dst_file_idx]; + + //////////////////////// + //- rjf: fill basics + // + dst_file->file_path_node_idx = rdim_bake_path_node_idx_from_string(path_tree, src_file->normal_full_path); + dst_file->normal_full_path_string_idx = rdim_bake_idx_from_string(strings, src_file->normal_full_path); + + //////////////////////// + //- rjf: produce combined source file line info + // + RDI_U32 *src_file_line_nums = 0; + RDI_U32 *src_file_line_ranges = 0; + RDI_U64 *src_file_voffs = 0; + RDI_U32 src_file_line_count = 0; + RDI_U32 src_file_voff_count = 0; { - RDIM_SrcFile *src_file = &chunk_n->v[idx]; - RDI_SourceFile *dst_file = &dst_files[dst_file_idx]; + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - //////////////////////// - //- rjf: fill basics - // - dst_file->file_path_node_idx = rdim_bake_path_node_from_string(arena, &path_tree, src_file->normal_full_path)->idx; - dst_file->normal_full_path_string_idx = rdim_bake_string(arena, &strings, src_file->normal_full_path); - - //////////////////////// - //- rjf: produce combined source file line info - // - RDI_U32 *src_file_line_nums = 0; - RDI_U32 *src_file_line_ranges = 0; - RDI_U64 *src_file_voffs = 0; - RDI_U32 src_file_line_count = 0; - RDI_U32 src_file_voff_count = 0; + //- rjf: gather line number map + typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; + struct RDIM_SrcLineMapVoffBlock { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - //- rjf: gather line number map - typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; - struct RDIM_SrcLineMapVoffBlock + RDIM_SrcLineMapVoffBlock *next; + RDI_U64 voff; + }; + typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; + struct RDIM_SrcLineMapBucket + { + RDIM_SrcLineMapBucket *order_next; + RDIM_SrcLineMapBucket *hash_next; + RDI_U32 line_num; + RDIM_SrcLineMapVoffBlock *first_voff_block; + RDIM_SrcLineMapVoffBlock *last_voff_block; + RDI_U64 voff_count; + }; + RDIM_SrcLineMapBucket *first_bucket = 0; + RDIM_SrcLineMapBucket *last_bucket = 0; + RDI_U64 line_hash_slots_count = 2048; + RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); + RDI_U64 line_count = 0; + RDI_U64 voff_count = 0; + RDI_U64 max_line_num = 0; + { + for(RDIM_SrcFileLineMapFragment *map_fragment = src_file->first_line_map_fragment; + map_fragment != 0; + map_fragment = map_fragment->next) { - RDIM_SrcLineMapVoffBlock *next; - RDI_U64 voff; - }; - typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; - struct RDIM_SrcLineMapBucket - { - RDIM_SrcLineMapBucket *order_next; - RDIM_SrcLineMapBucket *hash_next; - RDI_U32 line_num; - RDIM_SrcLineMapVoffBlock *first_voff_block; - RDIM_SrcLineMapVoffBlock *last_voff_block; - RDI_U64 voff_count; - }; - RDIM_SrcLineMapBucket *first_bucket = 0; - RDIM_SrcLineMapBucket *last_bucket = 0; - RDI_U64 line_hash_slots_count = 2048; - RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); - RDI_U64 line_count = 0; - RDI_U64 voff_count = 0; - RDI_U64 max_line_num = 0; - { - for(RDIM_SrcFileLineMapFragment *map_fragment = src_file->first_line_map_fragment; - map_fragment != 0; - map_fragment = map_fragment->next) + RDIM_LineSequence *sequence = map_fragment->seq; + RDI_U64 *seq_voffs = sequence->voffs; + RDI_U32 *seq_line_nums = sequence->line_nums; + RDI_U64 seq_line_count = sequence->line_count; + for(RDI_U64 i = 0; i < seq_line_count; i += 1) { - RDIM_LineSequence *sequence = map_fragment->seq; - RDI_U64 *seq_voffs = sequence->voffs; - RDI_U32 *seq_line_nums = sequence->line_nums; - RDI_U64 seq_line_count = sequence->line_count; - for(RDI_U64 i = 0; i < seq_line_count; i += 1) + RDI_U32 line_num = seq_line_nums[i]; + RDI_U64 voff = seq_voffs[i]; + RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; + + // rjf: update unique voff counter & max line number + voff_count += 1; + max_line_num = Max(max_line_num, line_num); + + // rjf: find match + RDIM_SrcLineMapBucket *match = 0; { - RDI_U32 line_num = seq_line_nums[i]; - RDI_U64 voff = seq_voffs[i]; - RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; - - // rjf: update unique voff counter & max line number - voff_count += 1; - max_line_num = Max(max_line_num, line_num); - - // rjf: find match - RDIM_SrcLineMapBucket *match = 0; + for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + node != 0; + node = node->hash_next) { - for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; - node != 0; - node = node->hash_next) + if(node->line_num == line_num) { - if(node->line_num == line_num) - { - match = node; - break; - } + match = node; + break; } } - - // rjf: introduce new map if no match - if(match == 0) - { - match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); - RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); - RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); - match->line_num = line_num; - line_count += 1; - } - - // rjf: insert new voff - { - RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); - RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); - match->voff_count += 1; - block->voff = voff; - } } - } - } - - //- rjf: bake sortable keys array - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); - { - RDIM_SortKey *key_ptr = keys; - for(RDIM_SrcLineMapBucket *node = first_bucket; - node != 0; - node = node->order_next, key_ptr += 1){ - key_ptr->key = node->line_num; - key_ptr->val = node; - } - } - - //- rjf: sort keys array - RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); - - //- rjf: bake result - RDI_U32 *line_nums = rdim_push_array_no_zero(arena, RDI_U32, line_count); - RDI_U32 *line_ranges = rdim_push_array_no_zero(arena, RDI_U32, line_count + 1); - RDI_U64 *voffs = rdim_push_array_no_zero(arena, RDI_U64, voff_count); - { - RDI_U64 *voff_ptr = voffs; - for(RDI_U32 i = 0; i < line_count; i += 1) - { - line_nums[i] = sorted_keys[i].key; - line_ranges[i] = (RDI_U32)(voff_ptr - voffs); // TODO(rjf): @u64_to_u32 - RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; - for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next) + + // rjf: introduce new map if no match + if(match == 0) { - *voff_ptr = node->voff; - voff_ptr += 1; + match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); + RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); + RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); + match->line_num = line_num; + line_count += 1; + } + + // rjf: insert new voff + { + RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); + RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); + match->voff_count += 1; + block->voff = voff; } } - line_ranges[line_count] = voff_count; } - - //- rjf: fill output - src_file_line_nums = line_nums; - src_file_line_ranges = line_ranges; - src_file_line_count = line_count; - src_file_voffs = voffs; - src_file_voff_count = voff_count; - rdim_scratch_end(scratch); } - ////////////////////////// - //- rjf: produce data sections for this source file's line info tables - // - if(src_file_line_count != 0) + //- rjf: bake sortable keys array + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); { - dst_file->line_map_count = src_file_line_count; - dst_file->line_map_nums_data_idx = (RDI_U32)sections.count; // TODO(rjf): @u64_to_u32 - dst_file->line_map_range_data_idx = dst_file->line_map_nums_data_idx+1; - dst_file->line_map_voff_data_idx = dst_file->line_map_nums_data_idx+2; - rdim_bake_section_list_push_new(arena, §ions, src_file_line_nums, sizeof(*src_file_line_nums)*src_file_line_count, RDI_DataSectionTag_LineMapNumbers); - rdim_bake_section_list_push_new(arena, §ions, src_file_line_ranges, sizeof(*src_file_line_ranges)*(src_file_line_count + 1), RDI_DataSectionTag_LineMapRanges); - rdim_bake_section_list_push_new(arena, §ions, src_file_voffs, sizeof(*src_file_voffs)*src_file_voff_count, RDI_DataSectionTag_LineMapVoffs); + RDIM_SortKey *key_ptr = keys; + for(RDIM_SrcLineMapBucket *node = first_bucket; + node != 0; + node = node->order_next, key_ptr += 1){ + key_ptr->key = node->line_num; + key_ptr->val = node; + } } + + //- rjf: sort keys array + RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); + + //- rjf: bake result + RDI_U32 *line_nums = rdim_push_array_no_zero(arena, RDI_U32, line_count); + RDI_U32 *line_ranges = rdim_push_array_no_zero(arena, RDI_U32, line_count + 1); + RDI_U64 *voffs = rdim_push_array_no_zero(arena, RDI_U64, voff_count); + { + RDI_U64 *voff_ptr = voffs; + for(RDI_U32 i = 0; i < line_count; i += 1) + { + line_nums[i] = sorted_keys[i].key; + line_ranges[i] = (RDI_U32)(voff_ptr - voffs); // TODO(rjf): @u64_to_u32 + RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; + for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next) + { + *voff_ptr = node->voff; + voff_ptr += 1; + } + } + line_ranges[line_count] = voff_count; + } + + //- rjf: fill output + src_file_line_nums = line_nums; + src_file_line_ranges = line_ranges; + src_file_line_count = line_count; + src_file_voffs = voffs; + src_file_voff_count = voff_count; + rdim_scratch_end(scratch); } - } - - //////////////////////////// - //- rjf: build section for all source files - // - rdim_bake_section_list_push_new(arena, §ions, dst_files, sizeof(RDI_SourceFile)*dst_files_count, RDI_DataSectionTag_SourceFiles); - } - - ////////////////////////////// - //- rjf: push each source file into source file name map - // - RDIM_ProfScope("build section for per-source-file line info") - { - for(RDIM_SrcFileChunkNode *chunk_n = params->src_files.first; - chunk_n != 0; - chunk_n = chunk_n->next) - { - for(RDI_U64 idx = 0; idx < chunk_n->count; idx += 1) + + ////////////////////////// + //- rjf: produce data sections for this source file's line info tables + // + if(src_file_line_count != 0) { - RDIM_SrcFile *src_file = &chunk_n->v[idx]; - RDI_U32 src_file_idx = (RDI_U32)rdim_idx_from_src_file(src_file); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_NormalSourcePaths], src_file->normal_full_path, src_file_idx); + dst_file->line_map_count = src_file_line_count; + dst_file->line_map_nums_data_idx = (RDI_U32)sections.count; // TODO(rjf): @u64_to_u32 + dst_file->line_map_range_data_idx = dst_file->line_map_nums_data_idx+1; + dst_file->line_map_voff_data_idx = dst_file->line_map_nums_data_idx+2; + rdim_bake_section_list_push_new(arena, §ions, src_file_line_nums, sizeof(*src_file_line_nums)*src_file_line_count, RDI_DataSectionTag_LineMapNumbers, dst_file_idx); + rdim_bake_section_list_push_new(arena, §ions, src_file_line_ranges, sizeof(*src_file_line_ranges)*(src_file_line_count + 1), RDI_DataSectionTag_LineMapRanges, dst_file_idx); + rdim_bake_section_list_push_new(arena, §ions, src_file_voffs, sizeof(*src_file_voffs)*src_file_voff_count, RDI_DataSectionTag_LineMapVoffs, dst_file_idx); } } } - ////////////////////////////// - //- rjf: build section for unit vmap + //////////////////////////// + //- rjf: build section for all source files // - RDIM_ProfScope("build section for unit vmap") - { - //- rjf: build vmap from unit voff ranges - RDIM_VMap unit_vmap = {0}; - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // rjf: count voff ranges - RDI_U64 voff_range_count = 0; - for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDIM_Unit *unit = &n->v[idx]; - voff_range_count += unit->voff_ranges.count; - } - } - - // rjf: count necessary markers - RDI_U64 marker_count = voff_range_count*2; - - // rjf: build keys/markers arrays - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - { - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - RDI_U32 unit_idx = 1; - for(RDIM_UnitChunkNode *unit_chunk_n = params->units.first; - unit_chunk_n != 0; - unit_chunk_n = unit_chunk_n->next) - { - for(RDI_U64 idx = 0; idx < unit_chunk_n->count; idx += 1) - { - RDIM_Unit *unit = &unit_chunk_n->v[idx]; - for(RDIM_Rng1U64Node *n = unit->voff_ranges.first; n != 0; n = n->next) - { - RDIM_Rng1U64 range = n->v; - if(range.min < range.max) - { - key_ptr->key = range.min; - key_ptr->val = marker_ptr; - marker_ptr->idx = unit_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = range.max; - key_ptr->val = marker_ptr; - marker_ptr->idx = unit_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - unit_idx += 1; - } - } - } - - // rjf: keys/markers -> unit vmap - unit_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); - rdim_scratch_end(scratch); - } - - //- rjf: build section - RDI_U64 unit_vmap_size = sizeof(unit_vmap.vmap[0])*(unit_vmap.count+1); - rdim_bake_section_list_push_new(arena, §ions, unit_vmap.vmap, unit_vmap_size, RDI_DataSectionTag_UnitVmap); - } + rdim_bake_section_list_push_new(arena, §ions, dst_files, sizeof(RDI_SourceFile)*dst_files_count, RDI_DataSectionTag_SourceFiles, 0); - ////////////////////////////// - //- rjf: build sections for type info - // - RDIM_ProfScope("build sections for type info") + return sections; +} + +//- 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: build all type nodes + RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count+1); + RDIM_ProfScope("push all type nodes") { - //////////////////////////// - //- rjf: build all type nodes - // - RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count+1); - RDIM_ProfScope("push all type nodes") + RDI_U32 dst_idx = 1; + for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) { - RDI_U32 dst_idx = 1; - for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + RDIM_Type *src = &n->v[chunk_idx]; + RDI_TypeNode *dst = &type_nodes[dst_idx]; + + //- rjf: fill shared type node info + dst->kind = src->kind; + dst->byte_size = src->byte_size; + + //- rjf: fill built-in-only type node info + if(RDI_TypeKind_FirstBuiltIn <= dst->kind && dst->kind <= RDI_TypeKind_LastBuiltIn) { - RDIM_Type *src = &n->v[chunk_idx]; - RDI_TypeNode *dst = &type_nodes[dst_idx]; - - //- rjf: fill shared type node info - dst->kind = src->kind; - dst->byte_size = src->byte_size; - - //- rjf: fill built-in-only type node info - if(RDI_TypeKind_FirstBuiltIn <= dst->kind && dst->kind <= RDI_TypeKind_LastBuiltIn) + dst->built_in.name_string_idx = rdim_bake_idx_from_string(strings, src->name); + } + + //- rjf: fill constructed type node info + else if(RDI_TypeKind_FirstConstructed <= dst->kind && dst->kind <= RDI_TypeKind_LastConstructed) + { + dst->constructed.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 + dst->constructed.count = src->count; + if(dst->kind == RDI_TypeKind_Function || dst->kind == RDI_TypeKind_Method) { - dst->built_in.name_string_idx = rdim_bake_string(arena, &strings, src->name); - rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Types], src->name, dst_idx); - } - - //- rjf: fill constructed type node info - else if(RDI_TypeKind_FirstConstructed <= dst->kind && dst->kind <= RDI_TypeKind_LastConstructed) - { - dst->constructed.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 - dst->constructed.count = src->count; - if(dst->kind == RDI_TypeKind_Function || dst->kind == RDI_TypeKind_Method) + RDI_U32 param_idx_run_count = src->count; + RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); + for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) { - RDI_U32 param_idx_run_count = src->count; - RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); - for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) - { - param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(src->param_types[idx]); // TODO(rjf): @u64_to_u32 - } - dst->constructed.param_idx_run_first = rdim_bake_idx_run(arena, &idx_runs, param_idx_run, param_idx_run_count); - } - else if(dst->kind == RDI_TypeKind_MemberPtr) - { - // TODO(rjf): member pointers not currently supported. + param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(src->param_types[idx]); // TODO(rjf): @u64_to_u32 } + dst->constructed.param_idx_run_first = rdim_bake_idx_from_idx_run(idx_runs, param_idx_run, param_idx_run_count); } - - //- rjf: fill user-defined-type info - else if(RDI_TypeKind_FirstUserDefined <= dst->kind && dst->kind <= RDI_TypeKind_LastUserDefined) + else if(dst->kind == RDI_TypeKind_MemberPtr) { - dst->user_defined.name_string_idx = rdim_bake_string(arena, &strings, src->name); - dst->user_defined.udt_idx = (RDI_U32)rdim_idx_from_udt(src->udt); // TODO(rjf): @u64_to_u32 - dst->user_defined.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Types], src->name, dst_idx); - } - - //- rjf: fill bitfield info - else if(dst->kind == RDI_TypeKind_Bitfield) - { - dst->bitfield.off = src->off; - dst->bitfield.size = src->count; + // TODO(rjf): member pointers not currently supported. } } - } - } - - //////////////////////////// - //- rjf: build all udts & members - // - RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count+1); - RDI_Member * members = push_array(arena, RDI_Member, params->udts.total_member_count+1); - RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, params->udts.total_enum_val_count+1); - RDIM_ProfScope("build all udts & members") - { - RDI_U32 dst_udt_idx = 1; - RDI_U32 dst_member_idx = 1; - RDI_U32 dst_enum_member_idx = 1; - for(RDIM_UDTChunkNode *n = params->udts.first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_udt_idx += 1) + + //- rjf: fill user-defined-type info + else if(RDI_TypeKind_FirstUserDefined <= dst->kind && dst->kind <= RDI_TypeKind_LastUserDefined) { - RDIM_UDT *src_udt = &n->v[chunk_idx]; - RDI_UDT *dst_udt = &udts[dst_udt_idx]; - - //- rjf: fill basics - dst_udt->self_type_idx = (RDI_U32)rdim_idx_from_type(src_udt->self_type); // TODO(rjf): @u64_to_u32 - dst_udt->file_idx = (RDI_U32)rdim_idx_from_src_file(src_udt->src_file); // TODO(rjf): @u64_to_u32 - dst_udt->line = src_udt->line; - dst_udt->col = src_udt->col; - - //- rjf: fill members - if(src_udt->member_count != 0) - { - dst_udt->member_first = dst_member_idx; - dst_udt->member_count = src_udt->member_count; - for(RDIM_UDTMember *src_member = src_udt->first_member; - src_member != 0; - src_member = src_member->next, dst_member_idx += 1) - { - RDI_Member *dst_member = &members[dst_member_idx]; - dst_member->kind = src_member->kind; - dst_member->name_string_idx = rdim_bake_string(arena, &strings, src_member->name); - dst_member->type_idx = (RDI_U32)rdim_idx_from_type(src_member->type); // TODO(rjf): @u64_to_u32 - dst_member->off = src_member->off; - } - } - - //- rjf: fill enum members - else if(src_udt->enum_val_count != 0) - { - dst_udt->flags |= RDI_UserDefinedTypeFlag_EnumMembers; - dst_udt->member_first = dst_enum_member_idx; - dst_udt->member_count = src_udt->enum_val_count; - for(RDIM_UDTEnumVal *src_member = src_udt->first_enum_val; - src_member != 0; - src_member = src_member->next, dst_enum_member_idx += 1) - { - RDI_EnumMember *dst_member = &enum_members[dst_enum_member_idx]; - dst_member->name_string_idx = rdim_bake_string(arena, &strings, src_member->name); - dst_member->val = src_member->val; - } - } + dst->user_defined.name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->user_defined.udt_idx = (RDI_U32)rdim_idx_from_udt(src->udt); // TODO(rjf): @u64_to_u32 + dst->user_defined.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 + } + + //- rjf: fill bitfield info + else if(dst->kind == RDI_TypeKind_Bitfield) + { + dst->bitfield.off = src->off; + dst->bitfield.size = src->count; } } } - - //////////////////////////// - //- rjf: push all type info sections - // - RDIM_ProfScope("push all type info sections") - { - rdim_bake_section_list_push_new(arena, §ions, type_nodes, sizeof(RDI_TypeNode) * (params->types.total_count+1), RDI_DataSectionTag_TypeNodes); - rdim_bake_section_list_push_new(arena, §ions, udts, sizeof(RDI_UDT) * (params->udts.total_count+1), RDI_DataSectionTag_UDTs); - rdim_bake_section_list_push_new(arena, §ions, members , sizeof(RDI_Member) * (params->udts.total_member_count+1), RDI_DataSectionTag_Members); - rdim_bake_section_list_push_new(arena, §ions, enum_members, sizeof(RDI_EnumMember) * (params->udts.total_enum_val_count+1), RDI_DataSectionTag_EnumMembers); - } } - ////////////////////////////// - //- rjf: build sections for symbol info - // - RDIM_ProfScope("build sections for symbol info") + + //- rjf: build sections + RDIM_BakeSectionList sections = {0}; + rdim_bake_section_list_push_new(arena, §ions, type_nodes, sizeof(RDI_TypeNode)*(params->types.total_count+1), RDI_DataSectionTag_TypeNodes, 0); + return sections; +} + +//- 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: build tables + RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count+1); + RDI_Member * members = push_array(arena, RDI_Member, params->udts.total_member_count+1); + RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, params->udts.total_enum_val_count+1); { - //////////////////////////// - //- rjf: build all global variables - // - RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count+1); - RDIM_ProfScope("build all global variables") + RDI_U32 dst_udt_idx = 1; + RDI_U32 dst_member_idx = 1; + RDI_U32 dst_enum_member_idx = 1; + for(RDIM_UDTChunkNode *n = params->udts.first; n != 0; n = n->next) { - RDI_U32 dst_idx = 1; + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_udt_idx += 1) + { + RDIM_UDT *src_udt = &n->v[chunk_idx]; + RDI_UDT *dst_udt = &udts[dst_udt_idx]; + + //- rjf: fill basics + dst_udt->self_type_idx = (RDI_U32)rdim_idx_from_type(src_udt->self_type); // TODO(rjf): @u64_to_u32 + dst_udt->file_idx = (RDI_U32)rdim_idx_from_src_file(src_udt->src_file); // TODO(rjf): @u64_to_u32 + dst_udt->line = src_udt->line; + dst_udt->col = src_udt->col; + + //- rjf: fill members + if(src_udt->member_count != 0) + { + dst_udt->member_first = dst_member_idx; + dst_udt->member_count = src_udt->member_count; + for(RDIM_UDTMember *src_member = src_udt->first_member; + src_member != 0; + src_member = src_member->next, dst_member_idx += 1) + { + RDI_Member *dst_member = &members[dst_member_idx]; + dst_member->kind = src_member->kind; + dst_member->name_string_idx = rdim_bake_idx_from_string(strings, src_member->name); + dst_member->type_idx = (RDI_U32)rdim_idx_from_type(src_member->type); // TODO(rjf): @u64_to_u32 + dst_member->off = src_member->off; + } + } + + //- rjf: fill enum members + else if(src_udt->enum_val_count != 0) + { + dst_udt->flags |= RDI_UserDefinedTypeFlag_EnumMembers; + dst_udt->member_first = dst_enum_member_idx; + dst_udt->member_count = src_udt->enum_val_count; + for(RDIM_UDTEnumVal *src_member = src_udt->first_enum_val; + src_member != 0; + src_member = src_member->next, dst_enum_member_idx += 1) + { + RDI_EnumMember *dst_member = &enum_members[dst_enum_member_idx]; + dst_member->name_string_idx = rdim_bake_idx_from_string(strings, src_member->name); + dst_member->val = src_member->val; + } + } + } + } + } + + //- rjf: build sections + RDIM_BakeSectionList sections = {0}; + rdim_bake_section_list_push_new(arena, §ions, udts, sizeof(RDI_UDT) * (params->udts.total_count+1), RDI_DataSectionTag_UDTs, 0); + rdim_bake_section_list_push_new(arena, §ions, members , sizeof(RDI_Member) * (params->udts.total_member_count+1), RDI_DataSectionTag_Members, 0); + rdim_bake_section_list_push_new(arena, §ions, enum_members, sizeof(RDI_EnumMember) * (params->udts.total_enum_val_count+1), RDI_DataSectionTag_EnumMembers, 0); + return sections; +} + +//- 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: build all global variables + RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count+1); + { + RDI_U32 dst_idx = 1; + for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_GlobalVariable *dst = &global_variables[dst_idx]; + dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->voff = src->offset; + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 + if(src->is_extern) + { + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + } + } + } + } + + //- rjf: build sections + RDIM_BakeSectionList sections = {0}; + rdim_bake_section_list_push_new(arena, §ions, global_variables, sizeof(RDI_GlobalVariable)*(params->global_variables.total_count+1), RDI_DataSectionTag_GlobalVariables, 0); + return sections; +} + +//- 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: build global vmap + RDIM_BakeVMap global_vmap = {0}; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: allocate keys/markers + RDI_U64 marker_count = params->global_variables.total_count*2; + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + //- rjf: fill + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + + // rjf: fill actual globals for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) { - RDIM_Symbol *src = &n->v[chunk_idx]; - RDI_GlobalVariable *dst = &global_variables[dst_idx]; - dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); - dst->voff = src->offset; - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_symbol != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 - } - rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_GlobalVariables], src->name, dst_idx); - } - } - } - - //////////////////////////// - //- rjf: build all thread variables - // - RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count+1); - RDIM_ProfScope("build all thread variables") - { - RDI_U32 dst_idx = 1; - for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) - { - RDIM_Symbol *src = &n->v[chunk_idx]; - RDI_ThreadVariable *dst = &thread_variables[dst_idx]; - dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); - dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_symbol != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 - } - rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_ThreadVariables], src->name, dst_idx); - } - } - } - - //////////////////////////// - //- rjf: build all procedures - // - RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count+1); - RDIM_ProfScope("build all procedures") - { - RDI_U32 dst_idx = 1; - for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) - { - RDIM_Symbol *src = &n->v[chunk_idx]; - RDI_Procedure *dst = &procedures[dst_idx]; - dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); - dst->link_name_string_idx = rdim_bake_string(arena, &strings, src->link_name); - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_symbol != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 - } - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Procedures], src->name, dst_idx); - if(src->link_name.size > 0) - { - rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_LinkNameProcedures], src->link_name, dst_idx); - } - } - } - } - - //////////////////////////// - //- rjf: build global vmap - // - RDIM_VMap global_vmap = {0}; - RDIM_ProfScope("build global vmap") - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - //- rjf: allocate keys/markers - RDI_U64 marker_count = params->global_variables.total_count*2; - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - - //- rjf: fill - { - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - - // rjf: fill actual globals - for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) - { - RDIM_Symbol *global_var = &n->v[chunk_idx]; - RDI_U32 global_var_idx = (RDI_U32)rdim_idx_from_symbol(global_var); // TODO(rjf): @u64_to_u32 - - RDI_U64 first = global_var->offset; - RDI_U64 opl = first + global_var->type->byte_size; - - key_ptr->key = first; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_var_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_var_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - - // rjf: fill nil global - { - RDI_U32 global_idx = 0; - RDI_U64 first = 0; - RDI_U64 opl = 0xffffffffffffffffull; + RDIM_Symbol *global_var = &n->v[chunk_idx]; + RDI_U32 global_var_idx = (RDI_U32)rdim_idx_from_symbol(global_var); // TODO(rjf): @u64_to_u32 + + RDI_U64 first = global_var->offset; + RDI_U64 opl = first + global_var->type->byte_size; + key_ptr->key = first; key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; + marker_ptr->idx = global_var_idx; marker_ptr->begin_range = 1; key_ptr += 1; marker_ptr += 1; + key_ptr->key = opl; key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; + marker_ptr->idx = global_var_idx; marker_ptr->begin_range = 0; key_ptr += 1; marker_ptr += 1; } } - // rjf: construct vmap - global_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); - - rdim_scratch_end(scratch); + // rjf: fill nil global + { + RDI_U32 global_idx = 0; + RDI_U64 first = 0; + RDI_U64 opl = 0xffffffffffffffffull; + key_ptr->key = first; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + key_ptr->key = opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } } - //////////////////////////// - //- rjf: build all scopes, scope voffs, locals, and location blocks - // - RDI_Scope * scopes = rdim_push_array(arena, RDI_Scope, params->scopes.total_count+1); - RDI_U64 * scope_voffs = rdim_push_array(arena, RDI_U64, params->scopes.scope_voff_count+1); - RDI_Local * locals = rdim_push_array(arena, RDI_Local, params->scopes.local_count+1); - RDI_LocationBlock * location_blocks = rdim_push_array(arena, RDI_LocationBlock, params->scopes.location_count+1); - RDIM_String8List location_data_blobs = {0}; - RDIM_ProfScope("build all scopes, scope voffs, locals, and location blocks") + // rjf: construct vmap + global_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); + + rdim_scratch_end(scratch); + } + + //- rjf: build sections + RDIM_BakeSectionList sections = {0}; + rdim_bake_section_list_push_new(arena, §ions, global_vmap.vmap, sizeof(RDI_VMapEntry)*(global_vmap.count+1), RDI_DataSectionTag_GlobalVmap, 0); + return sections; +} + +//- 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: build all thread variables + RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count+1); + { + RDI_U32 dst_idx = 1; + for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) { - RDI_U64 dst_scope_idx = 1; - RDI_U64 dst_scope_voff_idx = 1; - RDI_U64 dst_local_idx = 1; - RDI_U64 dst_location_block_idx = 1; - for(RDIM_ScopeChunkNode *chunk_n = params->scopes.first; chunk_n != 0; chunk_n = chunk_n->next) + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) { - for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1, dst_scope_idx += 1) + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_ThreadVariable *dst = &thread_variables[dst_idx]; + dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); + if(src->is_extern) { - RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; - RDI_Scope *dst_scope = &scopes[dst_scope_idx]; - - //- rjf: push scope's voffs - RDI_U64 voff_idx_first = dst_scope_voff_idx; + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + } + } + } + } + + //- rjf: build sections + RDIM_BakeSectionList sections = {0}; + rdim_bake_section_list_push_new(arena, §ions, thread_variables, sizeof(RDI_ThreadVariable)*(params->thread_variables.total_count+1), RDI_DataSectionTag_ThreadVariables, 0); + return sections; +} + +//- 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: build all procedures + RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count+1); + { + RDI_U32 dst_idx = 1; + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_Procedure *dst = &procedures[dst_idx]; + dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->link_name_string_idx = rdim_bake_string(arena, &strings, src->link_name); + if(src->is_extern) + { + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + } + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 + dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 + } + } + } + + //- rjf: build sections + RDIM_BakeSectionList sections = {0}; + rdim_bake_section_list_push_new(arena, §ions, procedures, sizeof(RDI_Procedure)*(params->procedures.total_count+1), RDI_DataSectionTag_Procedures, 0); + return sections; +} + +//- 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) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //////////////////////////// + //- rjf: build all scopes, scope voffs, locals, and location blocks + // + RDI_Scope * scopes = rdim_push_array(arena, RDI_Scope, params->scopes.total_count+1); + RDI_U64 * scope_voffs = rdim_push_array(arena, RDI_U64, params->scopes.scope_voff_count+1); + RDI_Local * locals = rdim_push_array(arena, RDI_Local, params->scopes.local_count+1); + RDI_LocationBlock * location_blocks = rdim_push_array(arena, RDI_LocationBlock, params->scopes.location_count+1); + RDIM_String8List location_data_blobs = {0}; + RDIM_ProfScope("build all scopes, scope voffs, locals, and location blocks") + { + RDI_U64 dst_scope_idx = 1; + RDI_U64 dst_scope_voff_idx = 1; + RDI_U64 dst_local_idx = 1; + RDI_U64 dst_location_block_idx = 1; + for(RDIM_ScopeChunkNode *chunk_n = params->scopes.first; chunk_n != 0; chunk_n = chunk_n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1, dst_scope_idx += 1) + { + RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; + RDI_Scope *dst_scope = &scopes[dst_scope_idx]; + + //- rjf: push scope's voffs + RDI_U64 voff_idx_first = dst_scope_voff_idx; + { + for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) { - for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) - { - scope_voffs[dst_scope_voff_idx] = n->v.min; - dst_scope_voff_idx += 1; - scope_voffs[dst_scope_voff_idx] = n->v.max; - dst_scope_voff_idx += 1; - } + scope_voffs[dst_scope_voff_idx] = n->v.min; + dst_scope_voff_idx += 1; + scope_voffs[dst_scope_voff_idx] = n->v.max; + dst_scope_voff_idx += 1; } - RDI_U64 voff_idx_opl = dst_scope_voff_idx; - - //- rjf: push locals - RDI_U64 local_idx_first = dst_local_idx; - for(RDIM_Local *src_local = src_scope->first_local; - src_local != 0; - src_local = src_local->next, dst_local_idx += 1) + } + RDI_U64 voff_idx_opl = dst_scope_voff_idx; + + //- rjf: push locals + RDI_U64 local_idx_first = dst_local_idx; + for(RDIM_Local *src_local = src_scope->first_local; + src_local != 0; + src_local = src_local->next, dst_local_idx += 1) + { + //- rjf: push local's locations + RDI_U64 location_block_idx_first = dst_location_block_idx; + for(RDIM_LocationCase *loccase = src_local->locset.first_location_case; + loccase != 0; + loccase = loccase->next, dst_location_block_idx += 1) { - //- rjf: push local's locations - RDI_U64 location_block_idx_first = dst_location_block_idx; - for(RDIM_LocationCase *loccase = src_local->locset.first_location_case; - loccase != 0; - loccase = loccase->next, dst_location_block_idx += 1) + // rjf: fill location block + RDI_LocationBlock *dst_locblock = &location_blocks[dst_location_block_idx]; + dst_locblock->scope_off_first = loccase->voff_range.min; + dst_locblock->scope_off_opl = loccase->voff_range.max; + dst_locblock->location_data_off = location_data_blobs.total_size; + + // rjf: serialize location into location data + RDIM_Location *src_location = loccase->location; { - // rjf: fill location block - RDI_LocationBlock *dst_locblock = &location_blocks[dst_location_block_idx]; - dst_locblock->scope_off_first = loccase->voff_range.min; - dst_locblock->scope_off_opl = loccase->voff_range.max; - dst_locblock->location_data_off = location_data_blobs.total_size; - - // rjf: serialize location into location data - RDIM_Location *src_location = loccase->location; + // rjf: nil location + if(src_location == 0) { - // rjf: nil location - if(src_location == 0) + rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); + } + + // rjf: valid location + else switch(src_location->kind) + { + // rjf: catchall unsupported case + default: { rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); - } + }break; - // rjf: valid location - else switch(src_location->kind) + // rjf: bytecode streams + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: { - // rjf: catchall unsupported case - default: + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&src_location->kind))); + for(RDIM_EvalBytecodeOp *op_node = src_location->bytecode.first_op; + op_node != 0; + op_node = op_node->next) { - rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); - }break; - - // rjf: bytecode streams - case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_ValBytecodeStream: - { - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&src_location->kind))); - for(RDIM_EvalBytecodeOp *op_node = src_location->bytecode.first_op; - op_node != 0; - op_node = op_node->next) - { - RDI_U8 op_data[9]; - op_data[0] = op_node->op; - rdim_memcpy(op_data + 1, &op_node->p, op_node->p_size); - RDIM_String8 op_data_str = rdim_str8(op_data, 1 + op_node->p_size); - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, op_data_str)); - } - { - RDI_U64 data = 0; - RDIM_String8 data_str = rdim_str8((RDI_U8 *)&data, 1); - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, data_str)); - } - }break; - - // rjf: simple addr+off cases - case RDI_LocationKind_AddrRegisterPlusU16: - case RDI_LocationKind_AddrAddrRegisterPlusU16: - { - RDI_LocationRegisterPlusU16 loc = {0}; - loc.kind = src_location->kind; - loc.register_code = src_location->register_code; - loc.offset = src_location->offset; - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); - }break; - - // rjf: register cases - case RDI_LocationKind_ValRegister: - { - RDI_LocationRegister loc = {0}; - loc.kind = src_location->kind; - loc.register_code = src_location->register_code; - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); - }break; - } - } - } - RDI_U64 location_block_idx_opl = dst_location_block_idx; - - //- rjf: fill local - RDI_Local *dst_local = &locals[dst_local_idx]; - dst_local->kind = src_local->kind; - dst_local->name_string_idx = rdim_bake_string(arena, &strings, src_local->name); - dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 - dst_local->location_first = (RDI_U32)location_block_idx_first; // TODO(rjf): @u64_to_u32 - dst_local->location_opl = (RDI_U32)location_block_idx_opl; // TODO(rjf): @u64_to_u32 - } - RDI_U64 local_idx_opl = dst_local_idx; - - //- rjf: fill scope - dst_scope->proc_idx = (RDI_U32)rdim_idx_from_symbol(src_scope->symbol); // TODO(rjf): @u64_to_u32 - dst_scope->parent_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->parent_scope); // TODO(rjf): @u64_to_u32 - dst_scope->first_child_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->first_child); // TODO(rjf): @u64_to_u32 - dst_scope->next_sibling_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->next_sibling); // TODO(rjf): @u64_to_u32 - dst_scope->voff_range_first = (RDI_U32)voff_idx_first; // TODO(rjf): @u64_to_u32 - dst_scope->voff_range_opl = (RDI_U32)voff_idx_opl; // TODO(rjf): @u64_to_u32 - dst_scope->local_first = (RDI_U32)local_idx_first; // TODO(rjf): @u64_to_u32 - dst_scope->local_count = (RDI_U32)(local_idx_opl - local_idx_first); // TODO(rjf): @u64_to_u32 - } - } - } - - //////////////////////////// - //- rjf: build flattened location data - // - RDIM_String8 location_data_blob = {0}; - RDIM_ProfScope("build flattened location data") - { - location_data_blob = rdim_str8_list_join(arena, &location_data_blobs, rdim_str8_lit("")); - } - - //////////////////////////// - //- rjf: build scope vmap - // - RDIM_VMap scope_vmap = {0}; - RDIM_ProfScope("build scope vmap") - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // rjf: allocate keys/markers - RDI_U64 marker_count = params->scopes.scope_voff_count; - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - - // rjf: fill - { - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - for(RDIM_ScopeChunkNode *chunk_n = params->scopes.first; chunk_n != 0; chunk_n = chunk_n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1) - { - RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; - RDI_U32 scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope); // TODO(rjf): @u64_to_u32 - for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) - { - key_ptr->key = n->v.min; - key_ptr->val = marker_ptr; - marker_ptr->idx = scope_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = n->v.max; - key_ptr->val = marker_ptr; - marker_ptr->idx = scope_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - } - } - - // rjf: produce vmap - scope_vmap = rdim_vmap_from_markers(arena, markers, keys, marker_count); - rdim_scratch_end(scratch); - } - - //////////////////////////// - //- rjf: push all symbol info sections - // - RDIM_ProfScope("push all symbol info sections") - { - rdim_bake_section_list_push_new(arena, §ions, global_variables, sizeof(RDI_GlobalVariable) * (params->global_variables.total_count+1), RDI_DataSectionTag_GlobalVariables); - rdim_bake_section_list_push_new(arena, §ions, global_vmap.vmap, sizeof(RDI_VMapEntry) * (global_vmap.count+1), RDI_DataSectionTag_GlobalVmap); - rdim_bake_section_list_push_new(arena, §ions, thread_variables, sizeof(RDI_ThreadVariable) * (params->thread_variables.total_count+1), RDI_DataSectionTag_ThreadVariables); - rdim_bake_section_list_push_new(arena, §ions, procedures, sizeof(RDI_Procedure) * (params->procedures.total_count+1), RDI_DataSectionTag_Procedures); - rdim_bake_section_list_push_new(arena, §ions, scopes, sizeof(RDI_Scope) * (params->scopes.total_count+1), RDI_DataSectionTag_Scopes); - rdim_bake_section_list_push_new(arena, §ions, scope_voffs, sizeof(RDI_U64) * (params->scopes.scope_voff_count+1), RDI_DataSectionTag_ScopeVoffData); - rdim_bake_section_list_push_new(arena, §ions, scope_vmap.vmap, sizeof(RDI_VMapEntry) * (scope_vmap.count+1), RDI_DataSectionTag_ScopeVmap); - rdim_bake_section_list_push_new(arena, §ions, locals, sizeof(RDI_Local) * (params->scopes.local_count+1), RDI_DataSectionTag_Locals); - rdim_bake_section_list_push_new(arena, §ions, location_blocks, sizeof(RDI_LocationBlock) * (params->scopes.location_count+1), RDI_DataSectionTag_LocationBlocks); - rdim_bake_section_list_push_new(arena, §ions, location_data_blob.str, location_data_blob.size, RDI_DataSectionTag_LocationData); - } - } - - ////////////////////////////// - //- rjf: build sections for name maps - // - RDIM_ProfScope("build sections for name maps") - { - //- rjf: count the # of name maps we have with any content - RDI_U32 name_map_count = 0; - for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); - k < RDI_NameMapKind_COUNT; - k = (RDI_NameMapKind)(k+1)) - { - if(name_maps[k].name_count != 0) - { - name_map_count += 1; - } - } - - //- rjf: allocate & fill baked name maps - RDI_NameMap *dst_maps = rdim_push_array(arena, RDI_NameMap, name_map_count); - { - RDI_U64 dst_map_idx = 0; - for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); - k < RDI_NameMapKind_COUNT; - k = (RDI_NameMapKind)(k+1)) - { - RDI_NameMap *dst_map = &dst_maps[dst_map_idx]; - RDIM_BakeNameMap *src_map = &name_maps[k]; - if(src_map->name_count == 0) { continue; } - - // rjf: bake name map - RDI_U32 baked_buckets_count = src_map->name_count; - RDI_U32 baked_nodes_count = src_map->name_count; - RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count); - RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count); - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // rjf: setup the final bucket layouts - typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; - struct RDIM_NameMapSemiNode - { - RDIM_NameMapSemiNode *next; - RDIM_BakeNameMapNode *node; - }; - typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; - struct RDIM_NameMapSemiBucket - { - RDIM_NameMapSemiNode *first; - RDIM_NameMapSemiNode *last; - RDI_U64 count; - }; - RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count); - for(RDIM_BakeNameMapNode *node = src_map->first; - node != 0; - node = node->order_next) - { - RDI_U64 hash = rdi_hash(node->string.str, node->string.size); - RDI_U64 bi = hash%baked_buckets_count; - RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); - SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); - snode->node = node; - sbuckets[bi].count += 1; - } - - // rjf: convert to serialized buckets & nodes - { - RDI_NameMapBucket *bucket_ptr = baked_buckets; - RDI_NameMapNode *node_ptr = baked_nodes; - for(RDI_U32 i = 0; i < baked_buckets_count; i += 1, bucket_ptr += 1) - { - bucket_ptr->first_node = (RDI_U32)(node_ptr - baked_nodes); - bucket_ptr->node_count = sbuckets[i].count; - for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; - snode != 0; - snode = snode->next) - { - RDIM_BakeNameMapNode *node = snode->node; - - // rjf: cons name and index(es) - RDI_U32 string_idx = rdim_bake_string(arena, &strings, node->string); - RDI_U32 match_count = node->val_count; - RDI_U32 idx = 0; - if(match_count == 1) - { - idx = node->val_first->val[0]; - } - else - { - RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); - RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); - RDI_U32 *idx_ptr = idx_run; - for(RDIM_BakeNameMapValNode *idxnode = node->val_first; - idxnode != 0; - idxnode = idxnode->next) - { - for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) - { - if(idxnode->val[i] == 0) - { - goto dblbreak; - } - *idx_ptr = idxnode->val[i]; - idx_ptr += 1; - } + RDI_U8 op_data[9]; + op_data[0] = op_node->op; + rdim_memcpy(op_data + 1, &op_node->p, op_node->p_size); + RDIM_String8 op_data_str = rdim_str8(op_data, 1 + op_node->p_size); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, op_data_str)); } - dblbreak:; - idx = rdim_bake_idx_run(arena, &idx_runs, idx_run, match_count); - rdim_arena_pop_to(scratch.arena, temp_pos); - } + { + RDI_U64 data = 0; + RDIM_String8 data_str = rdim_str8((RDI_U8 *)&data, 1); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, data_str)); + } + }break; - // rjf: write to node - node_ptr->string_idx = string_idx; - node_ptr->match_count = match_count; - node_ptr->match_idx_or_idx_run_first = idx; - node_ptr += 1; + // rjf: simple addr+off cases + case RDI_LocationKind_AddrRegisterPlusU16: + case RDI_LocationKind_AddrAddrRegisterPlusU16: + { + RDI_LocationRegisterPlusU16 loc = {0}; + loc.kind = src_location->kind; + loc.register_code = src_location->register_code; + loc.offset = src_location->offset; + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); + }break; + + // rjf: register cases + case RDI_LocationKind_ValRegister: + { + RDI_LocationRegister loc = {0}; + loc.kind = src_location->kind; + loc.register_code = src_location->register_code; + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); + }break; } } } - rdim_scratch_end(scratch); + RDI_U64 location_block_idx_opl = dst_location_block_idx; + + //- rjf: fill local + RDI_Local *dst_local = &locals[dst_local_idx]; + dst_local->kind = src_local->kind; + dst_local->name_string_idx = rdim_bake_string(arena, &strings, src_local->name); + dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 + dst_local->location_first = (RDI_U32)location_block_idx_first; // TODO(rjf): @u64_to_u32 + dst_local->location_opl = (RDI_U32)location_block_idx_opl; // TODO(rjf): @u64_to_u32 } + RDI_U64 local_idx_opl = dst_local_idx; - // rjf: fill output header, and push sections for buckets/nodes - dst_map->kind = k; - dst_map->bucket_data_idx = (RDI_U32)sections.count+0; // TODO(rjf): @u64_to_u32 - dst_map->node_data_idx = (RDI_U32)sections.count+1; // TODO(rjf): @u64_to_u32 - rdim_bake_section_list_push_new(arena, §ions, baked_buckets, sizeof(RDI_NameMapBucket)* baked_buckets_count, RDI_DataSectionTag_NameMapBuckets); - rdim_bake_section_list_push_new(arena, §ions, baked_nodes, sizeof(RDI_NameMapNode) * baked_nodes_count, RDI_DataSectionTag_NameMapNodes); - - // rjf: inc - dst_map_idx += 1; + //- rjf: fill scope + dst_scope->proc_idx = (RDI_U32)rdim_idx_from_symbol(src_scope->symbol); // TODO(rjf): @u64_to_u32 + dst_scope->parent_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->parent_scope); // TODO(rjf): @u64_to_u32 + dst_scope->first_child_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->first_child); // TODO(rjf): @u64_to_u32 + dst_scope->next_sibling_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->next_sibling); // TODO(rjf): @u64_to_u32 + dst_scope->voff_range_first = (RDI_U32)voff_idx_first; // TODO(rjf): @u64_to_u32 + dst_scope->voff_range_opl = (RDI_U32)voff_idx_opl; // TODO(rjf): @u64_to_u32 + dst_scope->local_first = (RDI_U32)local_idx_first; // TODO(rjf): @u64_to_u32 + dst_scope->local_count = (RDI_U32)(local_idx_opl - local_idx_first); // TODO(rjf): @u64_to_u32 } } - - // rjf: push section for all name maps - rdim_bake_section_list_push_new(arena, §ions, dst_maps, sizeof(RDI_NameMap)*name_map_count, RDI_DataSectionTag_NameMaps); } - ////////////////////////////// - //- rjf: build sections for file paths + //////////////////////////// + //- rjf: build flattened location data // - RDIM_ProfScope("build sections for file paths") + RDIM_String8 location_data_blob = {0}; + RDIM_ProfScope("build flattened location data") { - RDI_U32 dst_nodes_count = path_tree.count; - RDI_FilePathNode *dst_nodes = rdim_push_array(arena, RDI_FilePathNode, dst_nodes_count); - { - RDI_U32 dst_node_idx = 0; - for(RDIM_BakePathNode *src_node = path_tree.first; - src_node != 0; - src_node = src_node->next_order, dst_node_idx += 1) - { - RDI_FilePathNode *dst_node = &dst_nodes[dst_node_idx]; - dst_node->name_string_idx = rdim_bake_string(arena, &strings, src_node->name); - dst_node->source_file_idx = rdim_idx_from_src_file(src_node->src_file); - if(src_node->parent != 0) - { - dst_node->parent_path_node = src_node->parent->idx; - } - if(src_node->first_child != 0) - { - dst_node->first_child = src_node->first_child->idx; - } - if(src_node->next_sibling != 0) - { - dst_node->next_sibling = src_node->next_sibling->idx; - } - } - } - rdim_bake_section_list_push_new(arena, §ions, dst_nodes, sizeof(RDI_FilePathNode)*dst_nodes_count, RDI_DataSectionTag_FilePathNodes); + location_data_blob = rdim_str8_list_join(arena, &location_data_blobs, rdim_str8_lit("")); } - ////////////////////////////// - //- rjf: build sections for strings + //////////////////////////// + //- rjf: push all sections // - RDIM_ProfScope("build sections for strings") + RDIM_BakeSectionList sections = {0}; + RDIM_ProfScope("push all symbol info sections") { - RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, strings.count + 1); - RDI_U32 off_cursor = 0; - { - RDI_U32 *off_ptr = str_offs; - *off_ptr = 0; - off_ptr += 1; - for(RDIM_BakeStringNode *node = strings.order_first; - node != 0; - node = node->order_next) - { - off_cursor += node->string.size; - *off_ptr = off_cursor; - off_ptr += 1; - } - } - RDI_U8 *buf = rdim_push_array(arena, RDI_U8, off_cursor); - { - RDI_U8 *ptr = buf; - for(RDIM_BakeStringNode *node = strings.order_first; - node != 0; - node = node->order_next) - { - rdim_memcpy(ptr, node->string.str, node->string.size); - ptr += node->string.size; - } - } - rdim_bake_section_list_push_new(arena, §ions, str_offs, sizeof(RDI_U32)*(strings.count+1), RDI_DataSectionTag_StringTable); - rdim_bake_section_list_push_new(arena, §ions, buf, off_cursor, RDI_DataSectionTag_StringData); + rdim_bake_section_list_push_new(arena, §ions, scopes, sizeof(RDI_Scope) * (params->scopes.total_count+1), RDI_DataSectionTag_Scopes, 0); + rdim_bake_section_list_push_new(arena, §ions, scope_voffs, sizeof(RDI_U64) * (params->scopes.scope_voff_count+1), RDI_DataSectionTag_ScopeVoffData, 0); + rdim_bake_section_list_push_new(arena, §ions, locals, sizeof(RDI_Local) * (params->scopes.local_count+1), RDI_DataSectionTag_Locals, 0); + rdim_bake_section_list_push_new(arena, §ions, location_blocks, sizeof(RDI_LocationBlock) * (params->scopes.location_count+1), RDI_DataSectionTag_LocationBlocks, 0); + rdim_bake_section_list_push_new(arena, §ions, location_data_blob.str, location_data_blob.size, RDI_DataSectionTag_LocationData, 0); } - - ////////////////////////////// - //- rjf: build section for index runs - // - RDIM_ProfScope("build section for index runs") - { - RDI_U32 *idx_data = rdim_push_array_no_zero(arena, RDI_U32, idx_runs.idx_count); - { - RDI_U32 *out_ptr = idx_data; - RDI_U32 *opl = out_ptr + idx_runs.idx_count; - for(RDIM_BakeIdxRunNode *node = idx_runs.order_first; - node != 0 && out_ptr < opl; - node = node->order_next) - { - rdim_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); - out_ptr += node->count; - } - } - rdim_bake_section_list_push_new(arena, §ions, idx_data, sizeof(RDI_U32)*idx_runs.idx_count, RDI_DataSectionTag_IndexRuns); - } - rdim_scratch_end(scratch); return sections; } -//- rjf: sections -> flattened serialized blobs +//- rjf: scope vmap + +RDI_PROC RDIM_BakeSectionList +rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +{ + //- rjf: build scope vmap + RDIM_BakeVMap scope_vmap = {0}; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: allocate keys/markers + RDI_U64 marker_count = params->scopes.scope_voff_count; + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + // rjf: fill + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + for(RDIM_ScopeChunkNode *chunk_n = params->scopes.first; chunk_n != 0; chunk_n = chunk_n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1) + { + RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; + RDI_U32 scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope); // TODO(rjf): @u64_to_u32 + for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) + { + key_ptr->key = n->v.min; + key_ptr->val = marker_ptr; + marker_ptr->idx = scope_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = n->v.max; + key_ptr->val = marker_ptr; + marker_ptr->idx = scope_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + } + } + + // rjf: produce vmap + scope_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); + rdim_scratch_end(scratch); + } + + //- rjf: build sections + RDIM_BakeSectionList sections = {0}; + rdim_bake_section_list_push_new(arena, §ions, scope_vmap.vmap, sizeof(RDI_VMapEntry)*(scope_vmap.count+1), RDI_DataSectionTag_ScopeVmap, 0); + return sections; +} + +//- 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]) +{ + RDIM_BakeSectionList sections = {0}; + + //- rjf: count the # of name maps we have with any content + RDI_U32 name_map_count = 0; + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + if(name_maps[k].name_count != 0) + { + name_map_count += 1; + } + } + + //- rjf: allocate & fill baked name maps + RDI_NameMap *dst_maps = rdim_push_array(arena, RDI_NameMap, name_map_count); + { + RDI_U64 dst_map_idx = 0; + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + RDI_NameMap *dst_map = &dst_maps[dst_map_idx]; + RDIM_BakeNameMap *src_map = &name_maps[k]; + if(src_map->name_count == 0) { continue; } + + // rjf: bake name map + RDI_U32 baked_buckets_count = src_map->name_count; + RDI_U32 baked_nodes_count = src_map->name_count; + RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count); + RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count); + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: setup the final bucket layouts + typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; + struct RDIM_NameMapSemiNode + { + RDIM_NameMapSemiNode *next; + RDIM_BakeNameMapNode *node; + }; + typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; + struct RDIM_NameMapSemiBucket + { + RDIM_NameMapSemiNode *first; + RDIM_NameMapSemiNode *last; + RDI_U64 count; + }; + RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count); + for(RDIM_BakeNameMapNode *node = src_map->first; + node != 0; + node = node->order_next) + { + RDI_U64 hash = rdi_hash(node->string.str, node->string.size); + RDI_U64 bi = hash%baked_buckets_count; + RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); + SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); + snode->node = node; + sbuckets[bi].count += 1; + } + + // rjf: convert to serialized buckets & nodes + { + RDI_NameMapBucket *bucket_ptr = baked_buckets; + RDI_NameMapNode *node_ptr = baked_nodes; + for(RDI_U32 i = 0; i < baked_buckets_count; i += 1, bucket_ptr += 1) + { + bucket_ptr->first_node = (RDI_U32)(node_ptr - baked_nodes); + bucket_ptr->node_count = sbuckets[i].count; + for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; + snode != 0; + snode = snode->next) + { + RDIM_BakeNameMapNode *node = snode->node; + + // rjf: cons name and index(es) + RDI_U32 string_idx = rdim_bake_string(arena, &strings, node->string); + RDI_U32 match_count = node->val_count; + RDI_U32 idx = 0; + if(match_count == 1) + { + idx = node->val_first->val[0]; + } + else + { + RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); + RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); + RDI_U32 *idx_ptr = idx_run; + for(RDIM_BakeNameMapValNode *idxnode = node->val_first; + idxnode != 0; + idxnode = idxnode->next) + { + for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) + { + if(idxnode->val[i] == 0) + { + goto dblbreak; + } + *idx_ptr = idxnode->val[i]; + idx_ptr += 1; + } + } + dblbreak:; + idx = rdim_bake_idx_from_idx_run(idx_runs, idx_run, match_count); + rdim_arena_pop_to(scratch.arena, temp_pos); + } + + // rjf: write to node + node_ptr->string_idx = string_idx; + node_ptr->match_count = match_count; + node_ptr->match_idx_or_idx_run_first = idx; + node_ptr += 1; + } + } + } + rdim_scratch_end(scratch); + } + + // rjf: fill output header, and push sections for buckets/nodes + dst_map->kind = k; + dst_map->bucket_data_idx = (RDI_U32)sections.count+0; // TODO(rjf): @u64_to_u32 + dst_map->node_data_idx = (RDI_U32)sections.count+1; // TODO(rjf): @u64_to_u32 + rdim_bake_section_list_push_new(arena, §ions, baked_buckets, sizeof(RDI_NameMapBucket)* baked_buckets_count, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); + rdim_bake_section_list_push_new(arena, §ions, baked_nodes, sizeof(RDI_NameMapNode) * baked_nodes_count, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); + + // rjf: inc + dst_map_idx += 1; + } + } + + // rjf: push section for all name maps + rdim_bake_section_list_push_new(arena, §ions, dst_maps, sizeof(RDI_NameMap)*name_map_count, RDI_DataSectionTag_NameMaps, 0); + return sections; +} + +//- 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) +{ + RDI_U32 dst_nodes_count = path_tree->count; + RDI_FilePathNode *dst_nodes = rdim_push_array(arena, RDI_FilePathNode, dst_nodes_count); + { + RDI_U32 dst_node_idx = 0; + for(RDIM_BakePathNode *src_node = path_tree->first; + src_node != 0; + src_node = src_node->next_order, dst_node_idx += 1) + { + RDI_FilePathNode *dst_node = &dst_nodes[dst_node_idx]; + dst_node->name_string_idx = rdim_bake_string(arena, &strings, src_node->name); + dst_node->source_file_idx = rdim_idx_from_src_file(src_node->src_file); + if(src_node->parent != 0) + { + dst_node->parent_path_node = src_node->parent->idx; + } + if(src_node->first_child != 0) + { + dst_node->first_child = src_node->first_child->idx; + } + if(src_node->next_sibling != 0) + { + dst_node->next_sibling = src_node->next_sibling->idx; + } + } + } + RDIM_BakeSectionList sections = {0}; + rdim_bake_section_list_push_new(arena, §ions, dst_nodes, sizeof(RDI_FilePathNode)*dst_nodes_count, RDI_DataSectionTag_FilePathNodes, 0); + return sections; +} + +//- rjf: strings + +RDI_PROC RDIM_BakeSectionList +rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings) +{ + RDIM_BakeSectionList sections = {0}; + RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, strings->count + 1); + RDI_U32 off_cursor = 0; + { + RDI_U32 *off_ptr = str_offs; + *off_ptr = 0; + off_ptr += 1; + for(RDIM_BakeStringNode *node = strings->order_first; + node != 0; + node = node->order_next) + { + off_cursor += node->string.size; + *off_ptr = off_cursor; + off_ptr += 1; + } + } + RDI_U8 *buf = rdim_push_array(arena, RDI_U8, off_cursor); + { + RDI_U8 *ptr = buf; + for(RDIM_BakeStringNode *node = strings->order_first; + node != 0; + node = node->order_next) + { + rdim_memcpy(ptr, node->string.str, node->string.size); + ptr += node->string.size; + } + } + rdim_bake_section_list_push_new(arena, §ions, str_offs, sizeof(RDI_U32)*(strings->count+1), RDI_DataSectionTag_StringTable, 0); + rdim_bake_section_list_push_new(arena, §ions, buf, off_cursor, RDI_DataSectionTag_StringData, 0); + return sections; +} + +//- rjf: index runs + +RDI_PROC RDIM_BakeSectionList +rdim_bake_idx_run_section_list_from_idx_run_map(RDIM_Arena *arena, RDIM_BakeIdxRunMap *idx_runs) +{ + RDIM_BakeSectionList sections = {0}; + RDI_U32 *idx_data = rdim_push_array_no_zero(arena, RDI_U32, idx_runs->idx_count); + { + RDI_U32 *out_ptr = idx_data; + RDI_U32 *opl = out_ptr + idx_runs->idx_count; + for(RDIM_BakeIdxRunNode *node = idx_runs->order_first; + node != 0 && out_ptr < opl; + node = node->order_next) + { + rdim_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); + out_ptr += node->count; + } + } + rdim_bake_section_list_push_new(arena, §ions, idx_data, sizeof(RDI_U32)*idx_runs->idx_count, RDI_DataSectionTag_IndexRuns, 0); + return sections; +} + +//////////////////////////////// +//~ rjf: [Serializing] Baked Data Section List -> Serialized Binary Strings RDI_PROC RDIM_String8List -rdim_blobs_from_bake_sections(RDIM_Arena *arena, RDIM_BakeSectionList *sections) +rdim_serialized_strings_from_params_bake_section_list(RDIM_Arena *arena, RDIM_BakeParams *params, RDIM_BakeSectionList *sections) { - RDIM_String8List blobs; - rdim_memzero_struct(&blobs); + RDIM_String8List strings; + rdim_memzero_struct(&strings); { - // rjf: push empty header & data section table - RDI_Header *baked_rdi_header = rdim_push_array(arena, RDI_Header, 1); - RDI_DataSection *baked_rdi_sections = rdim_push_array(arena, RDI_DataSection, sections->count); - rdim_str8_list_push(arena, &blobs, rdim_str8_struct(baked_rdi_header)); - rdim_str8_list_push_align(arena, &blobs, 8); - U32 data_section_off = (U32)blobs.total_size; - rdim_str8_list_push(arena, &blobs, rdim_str8((RDI_U8 *)baked_rdi_sections, sizeof(RDI_DataSection)*sections->count)); + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: calculate total possible section count, given these params + RDI_U64 total_possible_section_count = rdim_bake_section_count_from_params(params); + + //- rjf: make sparse table for actually laid out sections + RDIM_BakeSection **sparse_bake_sections = rdim_push_array(scratch.arena, RDIM_BakeSection *, total_possible_section_count); + RDI_U64 actually_filled_section_count = 0; + for(RDIM_BakeSectionNode *n = sections->first; n != 0; n = n->next) + { + RDIM_BakeSection *bake_section = &n->v; + RDI_U64 idx = rdim_bake_section_idx_from_params_tag_idx(params, bake_section->tag, bake_section->tag_idx); + if(0 <= idx && idx < total_possible_section_count) + { + if(sparse_bake_sections[idx] != 0) + { + // TODO(rjf): error - malformed input! we have a duplicate section. + } + else + { + sparse_bake_sections[idx] = bake_section; + actually_filled_section_count += 1; + } + } + } + + //- rjf: make tightened bake section table, for each data section in sequential order + RDIM_BakeSection **tight_bake_sections = rdim_push_array(scratch.arena, RDIM_BakeSection *, actually_filled_section_count); + { + RDI_U64 tight_idx = 0; + for(RDI_U64 sparse_idx = 0; sparse_idx < total_possible_section_count; sparse_idx += 1) + { + if(sparse_bake_sections[sparse_idx] != 0) + { + tight_bake_sections[tight_idx] = sparse_bake_sections[sparse_idx]; + tight_idx += 1; + } + } + } + + //- rjf: push empty header & data section table + RDI_Header *rdi_header = rdim_push_array(arena, RDI_Header, 1); + RDI_DataSection *rdi_sections = rdim_push_array(arena, RDI_DataSection, actually_filled_section_count); + rdim_str8_list_push(arena, &strings, rdim_str8_struct(rdi_header)); + rdim_str8_list_push_align(arena, &strings, 8); + U32 data_section_off = (U32)strings.total_size; + rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)rdi_sections, sizeof(RDI_DataSection)*actually_filled_section_count)); // rjf: fill baked header { - baked_rdi_header->magic = RDI_MAGIC_CONSTANT; - baked_rdi_header->encoding_version = RDI_ENCODING_VERSION; - baked_rdi_header->data_section_off = data_section_off; - baked_rdi_header->data_section_count = sections->count; + rdi_header->magic = RDI_MAGIC_CONSTANT; + rdi_header->encoding_version = RDI_ENCODING_VERSION; + rdi_header->data_section_off = data_section_off; + rdi_header->data_section_count = actually_filled_section_count; } // rjf: fill baked data section table U64 dst_idx = 0; - for(RDIM_BakeSectionNode *src_n = sections->first; src_n != 0; src_n = src_n->next, dst_idx += 1) + for(RDI_U64 src_idx = 0; src_idx < actually_filled_section_count; src_idx += 1) { - RDIM_BakeSection *src = &src_n->v; - RDI_DataSection *dst = baked_rdi_sections + dst_idx; + RDIM_BakeSection *src = tight_bake_sections[src_idx]; + RDI_DataSection *dst = rdi_sections+dst_idx; U64 data_section_off = 0; if(src->size != 0) { - rdim_str8_list_push_align(arena, &blobs, 8); - data_section_off = blobs.total_size; - rdim_str8_list_push(arena, &blobs, rdim_str8((RDI_U8 *)src->data, src->size)); + rdim_str8_list_push_align(arena, &strings, 8); + data_section_off = strings.total_size; + rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)src->data, src->size)); } dst->tag = src->tag; dst->encoding = RDI_DataSectionEncoding_Unpacked; @@ -2767,6 +2986,8 @@ rdim_blobs_from_bake_sections(RDIM_Arena *arena, RDIM_BakeSectionList *sections) dst->encoded_size = src->size; dst->unpacked_size = src->size; } + + rdim_scratch_end(scratch); } - return blobs; + return strings; } diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 0d8ea98b..3cacd870 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -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 diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 6f79c1bb..6ddd5923 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -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; } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 22d07f84..9d4dbd2e 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -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 diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 006dd1b4..caa9c24c 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -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; From 41b1f1c7e34d52ca35017fa84af657a2e98f00df Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Feb 2024 14:36:15 -0800 Subject: [PATCH 111/275] raddbgi_from_pdb: organize new baking path, which does all independent section list builds separately; do first pass of baked string map building --- src/lib_raddbgi_make/raddbgi_make.c | 181 ++++++++++++++++++------ src/lib_raddbgi_make/raddbgi_make.h | 2 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 129 +++++++++++++++++ 3 files changed, 271 insertions(+), 41 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index d0e6e424..9d5c6723 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1593,10 +1593,126 @@ rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSecti RDI_PROC RDIM_BakeStringMap rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { + //- rjf: set up map RDIM_BakeStringMap strings = {0}; strings.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count); rdim_bake_string_map_insert(arena, &strings, rdim_str8_lit("")); + + //- rjf: bake exe name + rdim_bake_string_map_insert(arena, &strings, params->top_level_info.exe_name); + + //- rjf: bake binary section names + for(RDIM_BinarySectionNode *n = params->binary_sections.first; n != 0; n = n->next) + { + rdim_bake_string_map_insert(arena, &strings, n->v.name); + } + + //- rjf: bake source file normalized full paths + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + rdim_bake_string_map_insert(arena, &strings, n->v[idx].normal_full_path); + } + } + + //- rjf: bake unit strings + RDIM_ProfScope("bake unit strings") + { + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + rdim_bake_string_map_insert(arena, &strings, n->v[idx].unit_name); + rdim_bake_string_map_insert(arena, &strings, n->v[idx].compiler_name); + rdim_bake_string_map_insert(arena, &strings, n->v[idx].source_file); + rdim_bake_string_map_insert(arena, &strings, n->v[idx].object_file); + rdim_bake_string_map_insert(arena, &strings, n->v[idx].archive_file); + rdim_bake_string_map_insert(arena, &strings, n->v[idx].build_path); + } + } + } + + //- rjf: bake type strings + RDIM_ProfScope("bake type strings") + { + for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + rdim_bake_string_map_insert(arena, &strings, n->v[idx].name); + } + } + } + + //- rjf: bake udt member names + RDIM_ProfScope("bake udt member names") + { + for(RDIM_UDTChunkNode *n = params->udts.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + for(RDIM_UDTMember *mem = n->v[idx].first_member; mem != 0; mem = mem->next) + { + rdim_bake_string_map_insert(arena, &strings, mem->name); + } + for(RDIM_UDTEnumVal *mem = n->v[idx].first_enum_val; mem != 0; mem = mem->next) + { + rdim_bake_string_map_insert(arena, &strings, mem->name); + } + } + } + } + + //- rjf: bake src file names + RDIM_ProfScope("bake src file names") + { + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + rdim_bake_string_map_insert(arena, &strings, n->v[idx].normal_full_path); + } + } + } + + //- rjf: bake symbol names + RDIM_ProfScope("bake symbol names") + { + RDIM_SymbolChunkList *symbol_lists[] = + { + ¶ms->global_variables, + ¶ms->thread_variables, + ¶ms->procedures, + }; + for(RDI_U64 list_idx = 0; list_idx < sizeof(symbol_lists)/sizeof(symbol_lists[0]); list_idx += 1) + { + for(RDIM_SymbolChunkNode *n = symbol_lists[list_idx]->first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + rdim_bake_string_map_insert(arena, &strings, n->v[idx].name); + } + } + } + } + + //- rjf: bake scope names + RDIM_ProfScope("bake scope names") + { + for(RDIM_ScopeChunkNode *n = params->scopes.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + for(RDIM_Local *local = n->v[idx].first_local; local != 0; local = local->next) + { + rdim_bake_string_map_insert(arena, &strings, local->name); + } + } + } + } + return strings; } @@ -2072,9 +2188,9 @@ rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMa if(src_file_line_count != 0) { dst_file->line_map_count = src_file_line_count; - dst_file->line_map_nums_data_idx = (RDI_U32)sections.count; // TODO(rjf): @u64_to_u32 - dst_file->line_map_range_data_idx = dst_file->line_map_nums_data_idx+1; - dst_file->line_map_voff_data_idx = dst_file->line_map_nums_data_idx+2; + dst_file->line_map_nums_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_LineMapNumbers, dst_file_idx); // TODO(rjf): @u64_to_u32 + dst_file->line_map_range_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_LineMapRanges, dst_file_idx); // TODO(rjf): @u64_to_u32 + dst_file->line_map_voff_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_LineMapVoffs, dst_file_idx); // TODO(rjf): @u64_to_u32 rdim_bake_section_list_push_new(arena, §ions, src_file_line_nums, sizeof(*src_file_line_nums)*src_file_line_count, RDI_DataSectionTag_LineMapNumbers, dst_file_idx); rdim_bake_section_list_push_new(arena, §ions, src_file_line_ranges, sizeof(*src_file_line_ranges)*(src_file_line_count + 1), RDI_DataSectionTag_LineMapRanges, dst_file_idx); rdim_bake_section_list_push_new(arena, §ions, src_file_voffs, sizeof(*src_file_voffs)*src_file_voff_count, RDI_DataSectionTag_LineMapVoffs, dst_file_idx); @@ -2248,7 +2364,7 @@ rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeS { RDIM_Symbol *src = &n->v[chunk_idx]; RDI_GlobalVariable *dst = &global_variables[dst_idx]; - dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); dst->voff = src->offset; dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 if(src->is_extern) @@ -2369,7 +2485,7 @@ rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeS { RDIM_Symbol *src = &n->v[chunk_idx]; RDI_ThreadVariable *dst = &thread_variables[dst_idx]; - dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); if(src->is_extern) @@ -2411,8 +2527,8 @@ rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM { RDIM_Symbol *src = &n->v[chunk_idx]; RDI_Procedure *dst = &procedures[dst_idx]; - dst->name_string_idx = rdim_bake_string(arena, &strings, src->name); - dst->link_name_string_idx = rdim_bake_string(arena, &strings, src->link_name); + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->link_name_string_idx = rdim_bake_idx_from_string(strings, src->link_name); if(src->is_extern) { dst->link_flags |= RDI_LinkFlag_External; @@ -2567,7 +2683,7 @@ rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap * //- rjf: fill local RDI_Local *dst_local = &locals[dst_local_idx]; dst_local->kind = src_local->kind; - dst_local->name_string_idx = rdim_bake_string(arena, &strings, src_local->name); + dst_local->name_string_idx = rdim_bake_idx_from_string(strings, src_local->name); dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 dst_local->location_first = (RDI_U32)location_block_idx_first; // TODO(rjf): @u64_to_u32 dst_local->location_opl = (RDI_U32)location_block_idx_opl; // TODO(rjf): @u64_to_u32 @@ -2671,7 +2787,7 @@ rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams //- 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]) +rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT]) { RDIM_BakeSectionList sections = {0}; @@ -2749,7 +2865,7 @@ rdim_bake_name_map_section_list_from_maps(RDIM_Arena *arena, RDIM_BakeStringMap RDIM_BakeNameMapNode *node = snode->node; // rjf: cons name and index(es) - RDI_U32 string_idx = rdim_bake_string(arena, &strings, node->string); + RDI_U32 string_idx = rdim_bake_idx_from_string(strings, node->string); RDI_U32 match_count = node->val_count; RDI_U32 idx = 0; if(match_count == 1) @@ -2793,8 +2909,8 @@ rdim_bake_name_map_section_list_from_maps(RDIM_Arena *arena, RDIM_BakeStringMap // rjf: fill output header, and push sections for buckets/nodes dst_map->kind = k; - dst_map->bucket_data_idx = (RDI_U32)sections.count+0; // TODO(rjf): @u64_to_u32 - dst_map->node_data_idx = (RDI_U32)sections.count+1; // TODO(rjf): @u64_to_u32 + dst_map->bucket_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); // TODO(rjf): @u64_to_u32 + dst_map->node_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); // TODO(rjf): @u64_to_u32 rdim_bake_section_list_push_new(arena, §ions, baked_buckets, sizeof(RDI_NameMapBucket)* baked_buckets_count, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); rdim_bake_section_list_push_new(arena, §ions, baked_nodes, sizeof(RDI_NameMapNode) * baked_nodes_count, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); @@ -2822,7 +2938,7 @@ rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStri src_node = src_node->next_order, dst_node_idx += 1) { RDI_FilePathNode *dst_node = &dst_nodes[dst_node_idx]; - dst_node->name_string_idx = rdim_bake_string(arena, &strings, src_node->name); + dst_node->name_string_idx = rdim_bake_idx_from_string(strings, src_node->name); dst_node->source_file_idx = rdim_idx_from_src_file(src_node->src_file); if(src_node->parent != 0) { @@ -2914,64 +3030,49 @@ rdim_serialized_strings_from_params_bake_section_list(RDIM_Arena *arena, RDIM_Ba RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); //- rjf: calculate total possible section count, given these params - RDI_U64 total_possible_section_count = rdim_bake_section_count_from_params(params); + RDI_U64 section_count = rdim_bake_section_count_from_params(params); - //- rjf: make sparse table for actually laid out sections - RDIM_BakeSection **sparse_bake_sections = rdim_push_array(scratch.arena, RDIM_BakeSection *, total_possible_section_count); - RDI_U64 actually_filled_section_count = 0; + //- rjf: make table for actually laid out sections + RDIM_BakeSection **bake_sections = rdim_push_array(scratch.arena, RDIM_BakeSection *, section_count); for(RDIM_BakeSectionNode *n = sections->first; n != 0; n = n->next) { RDIM_BakeSection *bake_section = &n->v; RDI_U64 idx = rdim_bake_section_idx_from_params_tag_idx(params, bake_section->tag, bake_section->tag_idx); - if(0 <= idx && idx < total_possible_section_count) + if(0 <= idx && idx < section_count) { - if(sparse_bake_sections[idx] != 0) + if(bake_sections[idx] != 0) { // TODO(rjf): error - malformed input! we have a duplicate section. } else { - sparse_bake_sections[idx] = bake_section; - actually_filled_section_count += 1; - } - } - } - - //- rjf: make tightened bake section table, for each data section in sequential order - RDIM_BakeSection **tight_bake_sections = rdim_push_array(scratch.arena, RDIM_BakeSection *, actually_filled_section_count); - { - RDI_U64 tight_idx = 0; - for(RDI_U64 sparse_idx = 0; sparse_idx < total_possible_section_count; sparse_idx += 1) - { - if(sparse_bake_sections[sparse_idx] != 0) - { - tight_bake_sections[tight_idx] = sparse_bake_sections[sparse_idx]; - tight_idx += 1; + bake_sections[idx] = bake_section; } } } //- rjf: push empty header & data section table RDI_Header *rdi_header = rdim_push_array(arena, RDI_Header, 1); - RDI_DataSection *rdi_sections = rdim_push_array(arena, RDI_DataSection, actually_filled_section_count); + RDI_DataSection *rdi_sections = rdim_push_array(arena, RDI_DataSection, section_count); rdim_str8_list_push(arena, &strings, rdim_str8_struct(rdi_header)); rdim_str8_list_push_align(arena, &strings, 8); U32 data_section_off = (U32)strings.total_size; - rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)rdi_sections, sizeof(RDI_DataSection)*actually_filled_section_count)); + rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)rdi_sections, sizeof(RDI_DataSection)*section_count)); // rjf: fill baked header { rdi_header->magic = RDI_MAGIC_CONSTANT; rdi_header->encoding_version = RDI_ENCODING_VERSION; rdi_header->data_section_off = data_section_off; - rdi_header->data_section_count = actually_filled_section_count; + rdi_header->data_section_count = section_count; } // rjf: fill baked data section table U64 dst_idx = 0; - for(RDI_U64 src_idx = 0; src_idx < actually_filled_section_count; src_idx += 1) + for(RDI_U64 src_idx = 0; src_idx < section_count; src_idx += 1, dst_idx += 1) { - RDIM_BakeSection *src = tight_bake_sections[src_idx]; + RDIM_BakeSection *src = bake_sections[src_idx]; + if(src == 0) { continue; } RDI_DataSection *dst = rdi_sections+dst_idx; U64 data_section_off = 0; if(src->size != 0) diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 3cacd870..d32adc13 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1223,7 +1223,7 @@ RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Aren 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]); +RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, 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); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 6ddd5923..10fa339b 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3379,12 +3379,140 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) internal P2R_Bake2Serialize * p2r_bake(Arena *arena, P2R_Convert2Bake *in) { + RDIM_BakeParams *params = &in->bake_params; + + ////////////////////////////// + //- rjf: build interned string map + // + RDIM_BakeStringMap strings = rdim_bake_string_map_from_params(arena, params); + + ////////////////////////////// + //- rjf: build interned idx run map + // + RDIM_BakeIdxRunMap idx_runs = rdim_bake_idx_run_map_from_params(arena, params); + + ////////////////////////////// + //- rjf: build interned path tree + // + RDIM_BakePathTree path_tree = rdim_bake_path_tree_from_params(arena, params); + + ////////////////////////////// + //- rjf: build name maps + // + RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; + { + for(RDI_NameMapKind k = (RDI_NameMapKind)0; k < RDI_NameMapKind_COUNT; k = (RDI_NameMapKind)(k+1)) + { + name_maps[k] = rdim_bake_name_map_from_kind_params(arena, k, params); + } + } + ////////////////////////////// //- rjf: build all sections // RDIM_BakeSectionList sections = {0}; { + //- rjf: top-level info + { + RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, &strings, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + //- rjf: binary sections + { + RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, &strings, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: units + { + RDIM_BakeSectionList s = rdim_bake_unit_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: unit vmap + { + RDIM_BakeSectionList s = rdim_bake_unit_vmap_section_list_from_params(arena, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: source files + { + RDIM_BakeSectionList s = rdim_bake_src_file_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: type nodes + { + RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, &strings, &idx_runs, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: UDTs + { + RDIM_BakeSectionList s = rdim_bake_udt_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: global variables + { + RDIM_BakeSectionList s = rdim_bake_global_variable_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: global vmap + { + RDIM_BakeSectionList s = rdim_bake_global_vmap_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: thread variables + { + RDIM_BakeSectionList s = rdim_bake_thread_variable_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: procedures + { + RDIM_BakeSectionList s = rdim_bake_procedure_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: scopes + { + RDIM_BakeSectionList s = rdim_bake_scope_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: scope vmap + { + RDIM_BakeSectionList s = rdim_bake_scope_vmap_section_list_from_params(arena, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: name maps + { + RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, &strings, &idx_runs, params, name_maps); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: file paths + { + RDIM_BakeSectionList s = rdim_bake_file_path_section_list_from_path_tree(arena, &strings, &path_tree); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: strings + { + RDIM_BakeSectionList s = rdim_bake_string_section_list_from_string_map(arena, &strings); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: index runs + { + RDIM_BakeSectionList s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, &idx_runs); + rdim_bake_section_list_concat_in_place(§ions, &s); + } } ////////////////////////////// @@ -3394,3 +3522,4 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) out->sections = sections; return out; } + From f2cf51823186fa9c8c3dc6bf7a36e605d2f3aa39 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Feb 2024 14:55:50 -0800 Subject: [PATCH 112/275] raddbgi_from_pdb: name map baking, small fixes with new baking strategy --- src/lib_raddbgi_make/raddbgi_make.c | 120 ++++++++-- src/lib_raddbgi_make/raddbgi_make.h | 6 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 279 +++++++++++++----------- 3 files changed, 252 insertions(+), 153 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 9d5c6723..b8bcd0dc 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -998,8 +998,8 @@ rdim_bake_section_count_from_params(RDIM_BakeParams *params) section_count += params->src_files.total_count; // PER-SOURCE-FILE line map numbers section_count += params->src_files.total_count; // PER-SOURCE-FILE line map ranges section_count += params->src_files.total_count; // PER-SOURCE-FILE line map voffs - section_count += RDI_NameMapKind_COUNT; // PER-NAME-MAP buckets section - section_count += RDI_NameMapKind_COUNT; // PER-NAME-MAP nodes section + section_count += RDI_NameMapKind_COUNT-1; // PER-NAME-MAP buckets section + section_count += RDI_NameMapKind_COUNT-1; // PER-NAME-MAP nodes section } return section_count; } @@ -1054,12 +1054,12 @@ rdim_bake_section_idx_from_params_tag_idx(RDIM_BakeParams *params, RDI_DataSecti case RDI_DataSectionTag_NameMapBuckets: if(idx != 0) { - result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 0*RDI_NameMapKind_COUNT + (idx-1)%RDI_NameMapKind_COUNT; + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 0*(RDI_NameMapKind_COUNT-1) + (idx-1)%(RDI_NameMapKind_COUNT-1); }break; case RDI_DataSectionTag_NameMapNodes: if(idx != 0) { - result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 1*RDI_NameMapKind_COUNT + (idx-1)%RDI_NameMapKind_COUNT; + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 1*(RDI_NameMapKind_COUNT-1) + (idx-1)%(RDI_NameMapKind_COUNT-1); }break; } return result; @@ -1693,6 +1693,7 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) for(RDI_U64 idx = 0; idx < n->count; idx += 1) { rdim_bake_string_map_insert(arena, &strings, n->v[idx].name); + rdim_bake_string_map_insert(arena, &strings, n->v[idx].link_name); } } } @@ -1716,15 +1717,111 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) return strings; } +//- 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) +{ + RDIM_BakeNameMap map = {0}; + switch(kind) + { + default:{}break; + case RDI_NameMapKind_GlobalVariables: + { + map.slots_count = params->global_variables.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_ThreadVariables: + { + map.slots_count = params->thread_variables.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_Procedures: + { + map.slots_count = params->procedures.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_Types: + { + map.slots_count = params->types.total_count; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 type_idx = (RDI_U32)rdim_idx_from_type(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].name, type_idx); + } + } + }break; + case RDI_NameMapKind_LinkNameProcedures: + { + map.slots_count = params->procedures.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + if(n->v[idx].link_name.size == 0) {continue;} + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].link_name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_NormalSourcePaths: + { + map.slots_count = params->src_files.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 src_file_idx = (RDI_U32)rdim_idx_from_src_file(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].normal_full_path, src_file_idx); + } + } + }break; + } + return map; +} + //- rjf: idx run map building RDI_PROC RDIM_BakeIdxRunMap rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { + //- rjf: set up map RDIM_BakeIdxRunMap idx_runs = {0}; idx_runs.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count); rdim_bake_idx_run_map_insert(arena, &idx_runs, 0, 0); + + + return idx_runs; } @@ -1738,21 +1835,6 @@ rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) return tree; } -//- 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) -{ - RDIM_BakeNameMap map = {0}; - map.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); - switch(kind) - { - default:{}break; - } - return map; -} - //////////////////////////////// //~ rjf: [Baking] Build Artifacts -> Data Section Lists diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index d32adc13..ae92e591 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1171,15 +1171,15 @@ RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, //- rjf: bake string map building RDI_PROC RDIM_BakeStringMap rdim_bake_string_map_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: 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 diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 10fa339b..21a7bd36 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3380,144 +3380,161 @@ internal P2R_Bake2Serialize * p2r_bake(Arena *arena, P2R_Convert2Bake *in) { RDIM_BakeParams *params = &in->bake_params; - - ////////////////////////////// - //- rjf: build interned string map - // - RDIM_BakeStringMap strings = rdim_bake_string_map_from_params(arena, params); - - ////////////////////////////// - //- rjf: build interned idx run map - // - RDIM_BakeIdxRunMap idx_runs = rdim_bake_idx_run_map_from_params(arena, params); - - ////////////////////////////// - //- rjf: build interned path tree - // - RDIM_BakePathTree path_tree = rdim_bake_path_tree_from_params(arena, params); - - ////////////////////////////// - //- rjf: build name maps - // - RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; - { - for(RDI_NameMapKind k = (RDI_NameMapKind)0; k < RDI_NameMapKind_COUNT; k = (RDI_NameMapKind)(k+1)) - { - name_maps[k] = rdim_bake_name_map_from_kind_params(arena, k, params); - } - } - - ////////////////////////////// - //- rjf: build all sections - // RDIM_BakeSectionList sections = {0}; + + //- rjf: build interned string map + RDIM_BakeStringMap strings = {0}; + ProfScope("build interned string map") { - //- rjf: top-level info + strings = rdim_bake_string_map_from_params(arena, params); + } + + //- rjf: build name maps + RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; + ProfScope("build name maps") + { + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) { - RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, &strings, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: binary sections - { - RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, &strings, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: units - { - RDIM_BakeSectionList s = rdim_bake_unit_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: unit vmap - { - RDIM_BakeSectionList s = rdim_bake_unit_vmap_section_list_from_params(arena, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: source files - { - RDIM_BakeSectionList s = rdim_bake_src_file_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: type nodes - { - RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, &strings, &idx_runs, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: UDTs - { - RDIM_BakeSectionList s = rdim_bake_udt_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: global variables - { - RDIM_BakeSectionList s = rdim_bake_global_variable_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: global vmap - { - RDIM_BakeSectionList s = rdim_bake_global_vmap_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: thread variables - { - RDIM_BakeSectionList s = rdim_bake_thread_variable_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: procedures - { - RDIM_BakeSectionList s = rdim_bake_procedure_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: scopes - { - RDIM_BakeSectionList s = rdim_bake_scope_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: scope vmap - { - RDIM_BakeSectionList s = rdim_bake_scope_vmap_section_list_from_params(arena, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: name maps - { - RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, &strings, &idx_runs, params, name_maps); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: file paths - { - RDIM_BakeSectionList s = rdim_bake_file_path_section_list_from_path_tree(arena, &strings, &path_tree); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: strings - { - RDIM_BakeSectionList s = rdim_bake_string_section_list_from_string_map(arena, &strings); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: index runs - { - RDIM_BakeSectionList s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, &idx_runs); - rdim_bake_section_list_concat_in_place(§ions, &s); + ProfScope("build name map %i", k) name_maps[k] = rdim_bake_name_map_from_kind_params(arena, k, params); } } - ////////////////////////////// + //- rjf: top-level info + ProfScope("top level info") + { + RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, &strings, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: binary sections + ProfScope("binary sections") + { + RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, &strings, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: build interned path tree + RDIM_BakePathTree path_tree = {0}; + ProfScope("build interned path tree") + { + path_tree = rdim_bake_path_tree_from_params(arena, params); + } + + //- rjf: units + ProfScope("units") + { + RDIM_BakeSectionList s = rdim_bake_unit_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: unit vmap + ProfScope("unit vmap") + { + RDIM_BakeSectionList s = rdim_bake_unit_vmap_section_list_from_params(arena, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: source files + ProfScope("source files") + { + RDIM_BakeSectionList s = rdim_bake_src_file_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: build interned idx run map + RDIM_BakeIdxRunMap idx_runs = {0}; + ProfScope("build interned idx run map") + { + idx_runs = rdim_bake_idx_run_map_from_params(arena, params); + } + + //- rjf: type nodes + ProfScope("type nodes") + { + RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, &strings, &idx_runs, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: UDTs + ProfScope("UDTs") + { + RDIM_BakeSectionList s = rdim_bake_udt_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: global variables + ProfScope("global variables") + { + RDIM_BakeSectionList s = rdim_bake_global_variable_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: global vmap + ProfScope("global vmap") + { + RDIM_BakeSectionList s = rdim_bake_global_vmap_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: thread variables + ProfScope("thread variables") + { + RDIM_BakeSectionList s = rdim_bake_thread_variable_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: procedures + ProfScope("procedures") + { + RDIM_BakeSectionList s = rdim_bake_procedure_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: scopes + ProfScope("scopes") + { + RDIM_BakeSectionList s = rdim_bake_scope_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: scope vmap + ProfScope("scope vmap") + { + RDIM_BakeSectionList s = rdim_bake_scope_vmap_section_list_from_params(arena, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: name maps + ProfScope("name map") + { + RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, &strings, &idx_runs, params, name_maps); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: file paths + ProfScope("file paths") + { + RDIM_BakeSectionList s = rdim_bake_file_path_section_list_from_path_tree(arena, &strings, &path_tree); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: strings + ProfScope("strings") + { + RDIM_BakeSectionList s = rdim_bake_string_section_list_from_string_map(arena, &strings); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: index runs + ProfScope("idx runs") + { + RDIM_BakeSectionList s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, &idx_runs); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + //- rjf: fill & return - // P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1); out->sections = sections; return out; From 2dd4526dd9ed8a7450a997d07614b84397de9a0b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Feb 2024 15:12:08 -0800 Subject: [PATCH 113/275] raddbgi_from_pdb: path tree & string baking --- src/lib_raddbgi_make/raddbgi_make.c | 146 +++++++++++++++--------- src/lib_raddbgi_make/raddbgi_make.h | 10 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 52 ++++----- 3 files changed, 121 insertions(+), 87 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index b8bcd0dc..6af3cd08 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1590,22 +1590,22 @@ rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSecti //- rjf: bake string map from params -RDI_PROC RDIM_BakeStringMap -rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +RDI_PROC RDIM_BakeStringMap * +rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) { //- rjf: set up map - RDIM_BakeStringMap strings = {0}; - strings.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count); - rdim_bake_string_map_insert(arena, &strings, rdim_str8_lit("")); + RDIM_BakeStringMap *strings = rdim_push_array(arena, RDIM_BakeStringMap, 1); + strings->slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; + strings->slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings->slots_count); + rdim_bake_string_map_insert(arena, strings, rdim_str8_lit("")); //- rjf: bake exe name - rdim_bake_string_map_insert(arena, &strings, params->top_level_info.exe_name); + rdim_bake_string_map_insert(arena, strings, params->top_level_info.exe_name); //- rjf: bake binary section names for(RDIM_BinarySectionNode *n = params->binary_sections.first; n != 0; n = n->next) { - rdim_bake_string_map_insert(arena, &strings, n->v.name); + rdim_bake_string_map_insert(arena, strings, n->v.name); } //- rjf: bake source file normalized full paths @@ -1613,10 +1613,16 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - rdim_bake_string_map_insert(arena, &strings, n->v[idx].normal_full_path); + rdim_bake_string_map_insert(arena, strings, n->v[idx].normal_full_path); } } + //- rjf: bake file path parts + for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) + { + rdim_bake_string_map_insert(arena, strings, n->name); + } + //- rjf: bake unit strings RDIM_ProfScope("bake unit strings") { @@ -1624,12 +1630,12 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - rdim_bake_string_map_insert(arena, &strings, n->v[idx].unit_name); - rdim_bake_string_map_insert(arena, &strings, n->v[idx].compiler_name); - rdim_bake_string_map_insert(arena, &strings, n->v[idx].source_file); - rdim_bake_string_map_insert(arena, &strings, n->v[idx].object_file); - rdim_bake_string_map_insert(arena, &strings, n->v[idx].archive_file); - rdim_bake_string_map_insert(arena, &strings, n->v[idx].build_path); + rdim_bake_string_map_insert(arena, strings, n->v[idx].unit_name); + rdim_bake_string_map_insert(arena, strings, n->v[idx].compiler_name); + rdim_bake_string_map_insert(arena, strings, n->v[idx].source_file); + rdim_bake_string_map_insert(arena, strings, n->v[idx].object_file); + rdim_bake_string_map_insert(arena, strings, n->v[idx].archive_file); + rdim_bake_string_map_insert(arena, strings, n->v[idx].build_path); } } } @@ -1641,7 +1647,7 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - rdim_bake_string_map_insert(arena, &strings, n->v[idx].name); + rdim_bake_string_map_insert(arena, strings, n->v[idx].name); } } } @@ -1655,11 +1661,11 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { for(RDIM_UDTMember *mem = n->v[idx].first_member; mem != 0; mem = mem->next) { - rdim_bake_string_map_insert(arena, &strings, mem->name); + rdim_bake_string_map_insert(arena, strings, mem->name); } for(RDIM_UDTEnumVal *mem = n->v[idx].first_enum_val; mem != 0; mem = mem->next) { - rdim_bake_string_map_insert(arena, &strings, mem->name); + rdim_bake_string_map_insert(arena, strings, mem->name); } } } @@ -1672,7 +1678,7 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - rdim_bake_string_map_insert(arena, &strings, n->v[idx].normal_full_path); + rdim_bake_string_map_insert(arena, strings, n->v[idx].normal_full_path); } } } @@ -1692,8 +1698,8 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - rdim_bake_string_map_insert(arena, &strings, n->v[idx].name); - rdim_bake_string_map_insert(arena, &strings, n->v[idx].link_name); + rdim_bake_string_map_insert(arena, strings, n->v[idx].name); + rdim_bake_string_map_insert(arena, strings, n->v[idx].link_name); } } } @@ -1708,7 +1714,7 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { for(RDIM_Local *local = n->v[idx].first_local; local != 0; local = local->next) { - rdim_bake_string_map_insert(arena, &strings, local->name); + rdim_bake_string_map_insert(arena, strings, local->name); } } } @@ -1719,89 +1725,89 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: bake name map building -RDI_PROC RDIM_BakeNameMap +RDI_PROC RDIM_BakeNameMap * rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params) { - RDIM_BakeNameMap map = {0}; + RDIM_BakeNameMap *map = rdim_push_array(arena, RDIM_BakeNameMap, 1); switch(kind) { default:{}break; case RDI_NameMapKind_GlobalVariables: { - map.slots_count = params->global_variables.total_count*2; - map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + map->slots_count = params->global_variables.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); } } }break; case RDI_NameMapKind_ThreadVariables: { - map.slots_count = params->thread_variables.total_count*2; - map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + map->slots_count = params->thread_variables.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); } } }break; case RDI_NameMapKind_Procedures: { - map.slots_count = params->procedures.total_count*2; - map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + map->slots_count = params->procedures.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); } } }break; case RDI_NameMapKind_Types: { - map.slots_count = params->types.total_count; - map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + map->slots_count = params->types.total_count; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { RDI_U32 type_idx = (RDI_U32)rdim_idx_from_type(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &map, n->v[idx].name, type_idx); + rdim_bake_name_map_push(arena, map, n->v[idx].name, type_idx); } } }break; case RDI_NameMapKind_LinkNameProcedures: { - map.slots_count = params->procedures.total_count*2; - map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + map->slots_count = params->procedures.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { if(n->v[idx].link_name.size == 0) {continue;} RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &map, n->v[idx].link_name, symbol_idx); + rdim_bake_name_map_push(arena, map, n->v[idx].link_name, symbol_idx); } } }break; case RDI_NameMapKind_NormalSourcePaths: { - map.slots_count = params->src_files.total_count*2; - map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + map->slots_count = params->src_files.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { RDI_U32 src_file_idx = (RDI_U32)rdim_idx_from_src_file(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, &map, n->v[idx].normal_full_path, src_file_idx); + rdim_bake_name_map_push(arena, map, n->v[idx].normal_full_path, src_file_idx); } } }break; @@ -1811,27 +1817,55 @@ rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDI //- rjf: idx run map building -RDI_PROC RDIM_BakeIdxRunMap +RDI_PROC RDIM_BakeIdxRunMap * rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { //- rjf: set up map - RDIM_BakeIdxRunMap idx_runs = {0}; - idx_runs.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count); - rdim_bake_idx_run_map_insert(arena, &idx_runs, 0, 0); - - + RDIM_BakeIdxRunMap *idx_runs = rdim_push_array(arena, RDIM_BakeIdxRunMap, 1); + idx_runs->slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; + idx_runs->slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs->slots_count); + rdim_bake_idx_run_map_insert(arena, idx_runs, 0, 0); return idx_runs; } //- rjf: bake path tree building -RDI_PROC RDIM_BakePathTree +RDI_PROC RDIM_BakePathTree * rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { - RDIM_BakePathTree tree = {0}; - rdim_bake_path_tree_insert(arena, &tree, rdim_str8_lit("")); + //- rjf: set up tree + RDIM_BakePathTree *tree = rdim_push_array(arena, RDIM_BakePathTree, 1); + rdim_bake_path_tree_insert(arena, tree, rdim_str8_lit("")); + + //- rjf: bake unit file paths + RDIM_ProfScope("bake unit file paths") + { + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + rdim_bake_path_tree_insert(arena, tree, n->v[idx].source_file); + rdim_bake_path_tree_insert(arena, tree, n->v[idx].object_file); + rdim_bake_path_tree_insert(arena, tree, n->v[idx].archive_file); + rdim_bake_path_tree_insert(arena, tree, n->v[idx].build_path); + } + } + } + + //- rjf: bake source file paths + RDIM_ProfScope("bake source file paths") + { + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDIM_BakePathNode *node = rdim_bake_path_tree_insert(arena, tree, n->v[idx].normal_full_path); + node->src_file = &n->v[idx]; + } + } + } + return tree; } @@ -2869,7 +2903,7 @@ rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams //- rjf: name maps RDI_PROC RDIM_BakeSectionList -rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT]) +rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) { RDIM_BakeSectionList sections = {0}; @@ -2879,7 +2913,7 @@ rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStr k < RDI_NameMapKind_COUNT; k = (RDI_NameMapKind)(k+1)) { - if(name_maps[k].name_count != 0) + if(name_maps[k] != 0 && name_maps[k]->name_count != 0) { name_map_count += 1; } @@ -2894,8 +2928,8 @@ rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStr k = (RDI_NameMapKind)(k+1)) { RDI_NameMap *dst_map = &dst_maps[dst_map_idx]; - RDIM_BakeNameMap *src_map = &name_maps[k]; - if(src_map->name_count == 0) { continue; } + RDIM_BakeNameMap *src_map = name_maps[k]; + if(src_map == 0 || src_map->name_count == 0) { continue; } // rjf: bake name map RDI_U32 baked_buckets_count = src_map->name_count; diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index ae92e591..9aedaaf3 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1169,16 +1169,16 @@ RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, //~ 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); +RDI_PROC RDIM_BakeStringMap *rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakePathTree *path_tree, 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); +RDI_PROC RDIM_BakeNameMap *rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, 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); +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); +RDI_PROC RDIM_BakePathTree *rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); //////////////////////////////// //~ rjf: [Baking] Build Artifacts -> Data Section Lists @@ -1223,7 +1223,7 @@ RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Aren 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_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT]); +RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, 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); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 21a7bd36..0a892144 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3382,15 +3382,22 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) RDIM_BakeParams *params = &in->bake_params; RDIM_BakeSectionList sections = {0}; + //- rjf: build interned path tree + RDIM_BakePathTree *path_tree = 0; + ProfScope("build interned path tree") + { + path_tree = rdim_bake_path_tree_from_params(arena, params); + } + //- rjf: build interned string map - RDIM_BakeStringMap strings = {0}; + RDIM_BakeStringMap *strings = 0; ProfScope("build interned string map") { - strings = rdim_bake_string_map_from_params(arena, params); + strings = rdim_bake_string_map_from_params(arena, path_tree, params); } //- rjf: build name maps - RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; + RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT] = {0}; ProfScope("build name maps") { for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); @@ -3404,28 +3411,21 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: top-level info ProfScope("top level info") { - RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, &strings, params); + RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, strings, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: binary sections ProfScope("binary sections") { - RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, &strings, params); + RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, strings, params); rdim_bake_section_list_concat_in_place(§ions, &s); } - //- rjf: build interned path tree - RDIM_BakePathTree path_tree = {0}; - ProfScope("build interned path tree") - { - path_tree = rdim_bake_path_tree_from_params(arena, params); - } - //- rjf: units ProfScope("units") { - RDIM_BakeSectionList s = rdim_bake_unit_section_list_from_params(arena, &strings, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_unit_section_list_from_params(arena, strings, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } @@ -3439,12 +3439,12 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: source files ProfScope("source files") { - RDIM_BakeSectionList s = rdim_bake_src_file_section_list_from_params(arena, &strings, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_src_file_section_list_from_params(arena, strings, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: build interned idx run map - RDIM_BakeIdxRunMap idx_runs = {0}; + RDIM_BakeIdxRunMap *idx_runs = 0; ProfScope("build interned idx run map") { idx_runs = rdim_bake_idx_run_map_from_params(arena, params); @@ -3453,49 +3453,49 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: type nodes ProfScope("type nodes") { - RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, &strings, &idx_runs, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, strings, idx_runs, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: UDTs ProfScope("UDTs") { - RDIM_BakeSectionList s = rdim_bake_udt_section_list_from_params(arena, &strings, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_udt_section_list_from_params(arena, strings, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: global variables ProfScope("global variables") { - RDIM_BakeSectionList s = rdim_bake_global_variable_section_list_from_params(arena, &strings, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_global_variable_section_list_from_params(arena, strings, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: global vmap ProfScope("global vmap") { - RDIM_BakeSectionList s = rdim_bake_global_vmap_section_list_from_params(arena, &strings, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_global_vmap_section_list_from_params(arena, strings, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: thread variables ProfScope("thread variables") { - RDIM_BakeSectionList s = rdim_bake_thread_variable_section_list_from_params(arena, &strings, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_thread_variable_section_list_from_params(arena, strings, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: procedures ProfScope("procedures") { - RDIM_BakeSectionList s = rdim_bake_procedure_section_list_from_params(arena, &strings, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_procedure_section_list_from_params(arena, strings, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: scopes ProfScope("scopes") { - RDIM_BakeSectionList s = rdim_bake_scope_section_list_from_params(arena, &strings, &path_tree, params); + RDIM_BakeSectionList s = rdim_bake_scope_section_list_from_params(arena, strings, path_tree, params); rdim_bake_section_list_concat_in_place(§ions, &s); } @@ -3509,28 +3509,28 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: name maps ProfScope("name map") { - RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, &strings, &idx_runs, params, name_maps); + RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, strings, idx_runs, params, name_maps); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: file paths ProfScope("file paths") { - RDIM_BakeSectionList s = rdim_bake_file_path_section_list_from_path_tree(arena, &strings, &path_tree); + RDIM_BakeSectionList s = rdim_bake_file_path_section_list_from_path_tree(arena, strings, path_tree); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: strings ProfScope("strings") { - RDIM_BakeSectionList s = rdim_bake_string_section_list_from_string_map(arena, &strings); + RDIM_BakeSectionList s = rdim_bake_string_section_list_from_string_map(arena, strings); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: index runs ProfScope("idx runs") { - RDIM_BakeSectionList s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, &idx_runs); + RDIM_BakeSectionList s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, idx_runs); rdim_bake_section_list_concat_in_place(§ions, &s); } From 6a496729045bdd3a2c151a145fa908bda51cf0f5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Feb 2024 15:23:35 -0800 Subject: [PATCH 114/275] raddbgi_from_pdb: idx run baking; raddbg: catch up to new converter interface --- src/lib_raddbgi_make/raddbgi_make.c | 56 ++++++++++++++++++++++++- src/lib_raddbgi_make/raddbgi_make.h | 2 +- src/raddbg/raddbg.c | 33 +++++---------- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 42 +++++++++---------- 4 files changed, 88 insertions(+), 45 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 6af3cd08..41340796 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1818,7 +1818,7 @@ rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDI //- rjf: idx run map building RDI_PROC RDIM_BakeIdxRunMap * -rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT], RDIM_BakeParams *params) { //- rjf: set up map RDIM_BakeIdxRunMap *idx_runs = rdim_push_array(arena, RDIM_BakeIdxRunMap, 1); @@ -1826,6 +1826,60 @@ rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) idx_runs->slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs->slots_count); rdim_bake_idx_run_map_insert(arena, idx_runs, 0, 0); + //- rjf: bake runs of function-type parameter lists + for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + RDIM_Type *type = &n->v[chunk_idx]; + if(type->kind == RDI_TypeKind_Function || type->kind == RDI_TypeKind_Method) + { + RDI_U32 param_idx_run_count = type->count; + RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); + for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) + { + param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(type->param_types[idx]); // TODO(rjf): @u64_to_u32 + } + rdim_bake_idx_run_map_insert(arena, idx_runs, param_idx_run, param_idx_run_count); + } + } + } + + //- rjf: bake runs of name map match lists + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + RDIM_BakeNameMap *name_map = name_maps[k]; + if(name_map != 0 && name_map->name_count != 0) + { + for(RDIM_BakeNameMapNode *n = name_map->first; n != 0; n = n->order_next) + { + if(n->val_count > 1) + { + RDI_U32 *idx_run = rdim_push_array(arena, RDI_U32, n->val_count); + RDI_U64 val_idx = 0; + for(RDIM_BakeNameMapValNode *idxnode = n->val_first; + idxnode != 0; + idxnode = idxnode->next) + { + for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) + { + if(idxnode->val[i] == 0) + { + goto dblbreak; + } + idx_run[val_idx] = idxnode->val[i]; + val_idx += 1; + } + } + dblbreak:; + rdim_bake_idx_run_map_insert(arena, idx_runs, idx_run, (RDI_U32)n->val_count); // TODO(rjf): @u64_to_u32 + } + } + } + } + return idx_runs; } diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 9aedaaf3..a1b6d74c 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1175,7 +1175,7 @@ RDI_PROC RDIM_BakeStringMap *rdim_bake_string_map_from_params(RDIM_Arena *arena, RDI_PROC RDIM_BakeNameMap *rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, 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); +RDI_PROC RDIM_BakeIdxRunMap *rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT], RDIM_BakeParams *params); //- rjf: bake path tree building RDI_PROC RDIM_BakePathTree *rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 4b4d1804..532a3d83 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -617,46 +617,35 @@ entry_point(int argc, char **argv) Temp scratch = scratch_begin(0, 0); //- rjf: parse arguments - P2R_ConvertIn *convert_in = p2r_convert_in_from_cmd_line(scratch.arena, &cmdln); + P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(scratch.arena, &cmdln); //- rjf: open output file - String8 output_name = push_str8_copy(scratch.arena, convert_in->output_name); + String8 output_name = push_str8_copy(scratch.arena, user2convert->output_name); OS_Handle out_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, output_name); B32 out_file_is_good = !os_handle_match(out_file, os_handle_zero()); //- rjf: convert - P2R_ConvertOut *convert_out = 0; + P2R_Convert2Bake *convert2bake = 0; if(out_file_is_good) { - convert_out = p2r_convert(scratch.arena, convert_in); + convert2bake = p2r_convert(scratch.arena, user2convert); } //- rjf: bake - String8List bake_strings = {0}; - if(convert_out != 0 && convert_in->output_name.size > 0) + P2R_Bake2Serialize *bake2srlz = 0; + ProfScope("bake") { - RDIM_BakeParams bake_params = {0}; - { - bake_params.top_level_info = convert_out->top_level_info; - bake_params.binary_sections = convert_out->binary_sections; - bake_params.units = convert_out->units; - bake_params.types = convert_out->types; - bake_params.udts = convert_out->udts; - bake_params.src_files = convert_out->src_files; - bake_params.global_variables = convert_out->global_variables; - bake_params.thread_variables = convert_out->thread_variables; - bake_params.procedures = convert_out->procedures; - bake_params.scopes = convert_out->scopes; - } - RDIM_BakeSectionList sections = rdim_bake_sections_from_params(scratch.arena, &bake_params); - bake_strings = rdim_blobs_from_bake_sections(scratch.arena, §ions); + bake2srlz = p2r_bake(scratch.arena, convert2bake); } + //- rjf: serialize + String8List serialize_out = rdim_serialized_strings_from_params_bake_section_list(scratch.arena, &convert2bake->bake_params, &bake2srlz->sections); + //- rjf: write if(out_file_is_good) { U64 off = 0; - for(String8Node *n = bake_strings.first; n != 0; n = n->next) + for(String8Node *n = serialize_out.first; n != 0; n = n->next) { os_file_write(out_file, r1u64(off, off+n->string.size), n->string.str); off += n->string.size; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 0a892144..94dd15ca 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3443,20 +3443,6 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) rdim_bake_section_list_concat_in_place(§ions, &s); } - //- rjf: build interned idx run map - RDIM_BakeIdxRunMap *idx_runs = 0; - ProfScope("build interned idx run map") - { - idx_runs = rdim_bake_idx_run_map_from_params(arena, params); - } - - //- rjf: type nodes - ProfScope("type nodes") - { - RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, strings, idx_runs, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - //- rjf: UDTs ProfScope("UDTs") { @@ -3506,13 +3492,6 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) rdim_bake_section_list_concat_in_place(§ions, &s); } - //- rjf: name maps - ProfScope("name map") - { - RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, strings, idx_runs, params, name_maps); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - //- rjf: file paths ProfScope("file paths") { @@ -3527,6 +3506,27 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) rdim_bake_section_list_concat_in_place(§ions, &s); } + //- rjf: build interned idx run map + RDIM_BakeIdxRunMap *idx_runs = 0; + ProfScope("build interned idx run map") + { + idx_runs = rdim_bake_idx_run_map_from_params(arena, name_maps, params); + } + + //- rjf: type nodes + ProfScope("type nodes") + { + RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, strings, idx_runs, path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: name maps + ProfScope("name map") + { + RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, strings, idx_runs, params, name_maps); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + //- rjf: index runs ProfScope("idx runs") { From c7e80ee135fe1b341e359f962fec234cc30d52d0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Feb 2024 16:27:29 -0800 Subject: [PATCH 115/275] raddbgi_from_pdb: move all top-level baking phases to task system threads. still a lot of improvement to do, these are top-level tasks and there is a lot of work *within* these tasks that is happening serially unnecessarily, but this is a good first step to parallelizing the bake. --- src/lib_raddbgi_make/raddbgi_make.c | 16 +- src/lib_raddbgi_make/raddbgi_make.h | 14 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 417 ++++++++++++++++++------ src/raddbgi_from_pdb/raddbgi_from_pdb.h | 150 ++++++++- 4 files changed, 479 insertions(+), 118 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 41340796..96925962 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1486,6 +1486,8 @@ rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_Stri RDI_PROC void rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx) { + if(string.size == 0) {return;} + // rjf: hash RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); RDI_U64 slot_idx = hash%map->slots_count; @@ -2379,7 +2381,7 @@ rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMa //- 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) +rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params) { //- rjf: build all type nodes RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count+1); @@ -2452,7 +2454,7 @@ rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM //- 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) +rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) { //- rjf: build tables RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count+1); @@ -2522,7 +2524,7 @@ rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *st //- 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) +rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) { //- rjf: build all global variables RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count+1); @@ -2564,7 +2566,7 @@ rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeS //- 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) +rdim_bake_global_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { //- rjf: build global vmap RDIM_BakeVMap global_vmap = {0}; @@ -2643,7 +2645,7 @@ rdim_bake_global_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStrin //- 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) +rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) { //- rjf: build all thread variables RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count+1); @@ -2685,7 +2687,7 @@ rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeS //- 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) +rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) { //- rjf: build all procedures RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count+1); @@ -2728,7 +2730,7 @@ rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM //- 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) +rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index a1b6d74c..36a48954 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1199,25 +1199,25 @@ RDI_PROC RDIM_BakeSectionList rdim_bake_unit_vmap_section_list_from_params(RDIM_ 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_global_vmap_section_list_from_params(RDIM_Arena *arena, 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params); //- rjf: scope vmap RDI_PROC RDIM_BakeSectionList rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 94dd15ca..bc003d0f 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3373,6 +3373,168 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) return out; } +//////////////////////////////// +//~ rjf: Baking Stage Tasks + +//- rjf: pass 1: interner/deduper map builds + +internal void * +p2r_build_bake_string_map_task__entry_point(Arena *arena, void *p) +{ + P2R_BuildBakeStringMapIn *in = (P2R_BuildBakeStringMapIn *)p; + RDIM_BakeStringMap *strings = 0; + ProfScope("build interned string map") strings = rdim_bake_string_map_from_params(arena, in->path_tree, in->params); + return strings; +} + +internal void * +p2r_build_bake_name_map_task__entry_point(Arena *arena, void *p) +{ + P2R_BuildBakeNameMapIn *in = (P2R_BuildBakeNameMapIn *)p; + RDIM_BakeNameMap *name_map = 0; + ProfScope("build name map %i", in->k) name_map = rdim_bake_name_map_from_kind_params(arena, in->k, in->params); + return name_map; +} + +//- rjf: pass 2: string-map-dependent debug info stream builds + +internal void * +p2r_bake_units_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeUnitsIn *in = (P2R_BakeUnitsIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake units") *s = rdim_bake_unit_section_list_from_params(arena, in->strings, in->path_tree, in->params); + return s; +} + +internal void * +p2r_bake_unit_vmap_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeUnitVMapIn *in = (P2R_BakeUnitVMapIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake unit vmap") *s = rdim_bake_unit_vmap_section_list_from_params(arena, in->params); + return s; +} + +internal void * +p2r_bake_src_files_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeSrcFilesIn *in = (P2R_BakeSrcFilesIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake src files") *s = rdim_bake_src_file_section_list_from_params(arena, in->strings, in->path_tree, in->params); + return s; +} + +internal void * +p2r_bake_udts_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeUDTsIn *in = (P2R_BakeUDTsIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake udts") *s = rdim_bake_udt_section_list_from_params(arena, in->strings, in->params); + return s; +} + +internal void * +p2r_bake_global_variables_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeGlobalVariablesIn *in = (P2R_BakeGlobalVariablesIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake global variables") *s = rdim_bake_global_variable_section_list_from_params(arena, in->strings, in->params); + return s; +} + +internal void * +p2r_bake_global_vmap_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeGlobalVMapIn *in = (P2R_BakeGlobalVMapIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake global vmap") *s = rdim_bake_global_vmap_section_list_from_params(arena, in->params); + return s; +} + +internal void * +p2r_bake_thread_variables_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeThreadVariablesIn *in = (P2R_BakeThreadVariablesIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake thread variables") *s = rdim_bake_thread_variable_section_list_from_params(arena, in->strings, in->params); + return s; +} + +internal void * +p2r_bake_procedures_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeProceduresIn *in = (P2R_BakeProceduresIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake procedures") *s = rdim_bake_procedure_section_list_from_params(arena, in->strings, in->params); + return s; +} + +internal void * +p2r_bake_scopes_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeScopesIn *in = (P2R_BakeScopesIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake scopes") *s = rdim_bake_scope_section_list_from_params(arena, in->strings, in->params); + return s; +} + +internal void * +p2r_bake_scope_vmap_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeScopeVMapIn *in = (P2R_BakeScopeVMapIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake scope vmap") *s = rdim_bake_scope_vmap_section_list_from_params(arena, in->params); + return s; +} + +internal void * +p2r_bake_file_paths_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeFilePathsIn *in = (P2R_BakeFilePathsIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake file paths") *s = rdim_bake_file_path_section_list_from_path_tree(arena, in->strings, in->path_tree); + return s; +} + +internal void * +p2r_bake_strings_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeStringsIn *in = (P2R_BakeStringsIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake strings") *s = rdim_bake_string_section_list_from_string_map(arena, in->strings); + return s; +} + +//- rjf: pass 3: idx-run-map-dependent debug info stream builds + +internal void * +p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeTypeNodesIn *in = (P2R_BakeTypeNodesIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake type nodes") *s = rdim_bake_type_node_section_list_from_params(arena, in->strings, in->idx_runs, in->params); + return s; +} + +internal void * +p2r_bake_name_maps_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeNameMapsIn *in = (P2R_BakeNameMapsIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake name maps") *s = rdim_bake_name_map_section_list_from_params_maps(arena, in->strings, in->idx_runs, in->params, in->name_maps); + return s; +} + +internal void * +p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeIdxRunsIn *in = (P2R_BakeIdxRunsIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake idx runs") *s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, in->idx_runs); + return s; +} + //////////////////////////////// //~ rjf: Top-Level Baking Entry Point @@ -3389,25 +3551,53 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) path_tree = rdim_bake_path_tree_from_params(arena, params); } - //- rjf: build interned string map - RDIM_BakeStringMap *strings = 0; - ProfScope("build interned string map") + //- rjf: kick off pass 1 tasks + P2R_BuildBakeStringMapIn build_bake_string_map_in = {path_tree, params}; + TS_Ticket build_bake_string_map_ticket = ts_kickoff(p2r_build_bake_string_map_task__entry_point, &build_bake_string_map_in); + P2R_BuildBakeNameMapIn build_bake_name_map_in[RDI_NameMapKind_COUNT] = {0}; + TS_Ticket build_bake_name_map_ticket[RDI_NameMapKind_COUNT] = {0}; + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) { - strings = rdim_bake_string_map_from_params(arena, path_tree, params); + build_bake_name_map_in[k].k = k; + build_bake_name_map_in[k].params = params; + build_bake_name_map_ticket[k] = ts_kickoff(p2r_build_bake_name_map_task__entry_point, &build_bake_name_map_in[k]); } - //- rjf: build name maps - RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT] = {0}; - ProfScope("build name maps") + //- rjf: join string map build + RDIM_BakeStringMap *strings = 0; + ProfScope("join string map build") { - for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); - k < RDI_NameMapKind_COUNT; - k = (RDI_NameMapKind)(k+1)) - { - ProfScope("build name map %i", k) name_maps[k] = rdim_bake_name_map_from_kind_params(arena, k, params); - } + strings = ts_join_struct(build_bake_string_map_ticket, max_U64, RDIM_BakeStringMap); } + //- rjf: kick off pass 2 tasks + P2R_BakeUnitsIn bake_units_in = {strings, path_tree, params}; + TS_Ticket bake_units_ticket = ts_kickoff(p2r_bake_units_task__entry_point, &bake_units_in); + P2R_BakeUnitVMapIn bake_unit_vmap_in = {params}; + TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2r_bake_unit_vmap_task__entry_point, &bake_unit_vmap_in); + P2R_BakeSrcFilesIn bake_src_files_in = {strings, path_tree, params}; + TS_Ticket bake_src_files_ticket = ts_kickoff(p2r_bake_src_files_task__entry_point, &bake_src_files_in); + P2R_BakeUDTsIn bake_udts_in = {strings, params}; + TS_Ticket bake_udts_ticket = ts_kickoff(p2r_bake_udts_task__entry_point, &bake_udts_in); + P2R_BakeGlobalVariablesIn bake_global_variables_in = {strings, params}; + TS_Ticket bake_global_variables_ticket = ts_kickoff(p2r_bake_global_variables_task__entry_point, &bake_global_variables_in); + P2R_BakeGlobalVMapIn bake_global_vmap_in = {params}; + TS_Ticket bake_global_vmap_ticket = ts_kickoff(p2r_bake_global_vmap_task__entry_point, &bake_global_vmap_in); + P2R_BakeThreadVariablesIn bake_thread_variables_in = {strings, params}; + TS_Ticket bake_thread_variables_ticket = ts_kickoff(p2r_bake_thread_variables_task__entry_point, &bake_thread_variables_in); + P2R_BakeProceduresIn bake_procedures_in = {strings, params}; + TS_Ticket bake_procedures_ticket = ts_kickoff(p2r_bake_procedures_task__entry_point, &bake_procedures_in); + P2R_BakeScopesIn bake_scopes_in = {strings, params}; + TS_Ticket bake_scopes_ticket = ts_kickoff(p2r_bake_scopes_task__entry_point, &bake_scopes_in); + P2R_BakeScopeVMapIn bake_scope_vmap_in = {params}; + TS_Ticket bake_scope_vmap_ticket = ts_kickoff(p2r_bake_scope_vmap_task__entry_point, &bake_scope_vmap_in); + P2R_BakeFilePathsIn bake_file_paths_in = {strings, path_tree}; + TS_Ticket bake_file_paths_ticket = ts_kickoff(p2r_bake_file_paths_task__entry_point, &bake_file_paths_in); + P2R_BakeStringsIn bake_strings_in = {strings}; + TS_Ticket bake_strings_ticket = ts_kickoff(p2r_bake_strings_task__entry_point, &bake_strings_in); + //- rjf: top-level info ProfScope("top level info") { @@ -3422,88 +3612,16 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) rdim_bake_section_list_concat_in_place(§ions, &s); } - //- rjf: units - ProfScope("units") + //- rjf: join name map building tasks + RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT] = {0}; + ProfScope("join name map building tasks") { - RDIM_BakeSectionList s = rdim_bake_unit_section_list_from_params(arena, strings, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: unit vmap - ProfScope("unit vmap") - { - RDIM_BakeSectionList s = rdim_bake_unit_vmap_section_list_from_params(arena, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: source files - ProfScope("source files") - { - RDIM_BakeSectionList s = rdim_bake_src_file_section_list_from_params(arena, strings, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: UDTs - ProfScope("UDTs") - { - RDIM_BakeSectionList s = rdim_bake_udt_section_list_from_params(arena, strings, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: global variables - ProfScope("global variables") - { - RDIM_BakeSectionList s = rdim_bake_global_variable_section_list_from_params(arena, strings, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: global vmap - ProfScope("global vmap") - { - RDIM_BakeSectionList s = rdim_bake_global_vmap_section_list_from_params(arena, strings, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: thread variables - ProfScope("thread variables") - { - RDIM_BakeSectionList s = rdim_bake_thread_variable_section_list_from_params(arena, strings, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: procedures - ProfScope("procedures") - { - RDIM_BakeSectionList s = rdim_bake_procedure_section_list_from_params(arena, strings, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: scopes - ProfScope("scopes") - { - RDIM_BakeSectionList s = rdim_bake_scope_section_list_from_params(arena, strings, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: scope vmap - ProfScope("scope vmap") - { - RDIM_BakeSectionList s = rdim_bake_scope_vmap_section_list_from_params(arena, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: file paths - ProfScope("file paths") - { - RDIM_BakeSectionList s = rdim_bake_file_path_section_list_from_path_tree(arena, strings, path_tree); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: strings - ProfScope("strings") - { - RDIM_BakeSectionList s = rdim_bake_string_section_list_from_string_map(arena, strings); - rdim_bake_section_list_concat_in_place(§ions, &s); + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + name_maps[k] = ts_join_struct(build_bake_name_map_ticket[k], max_U64, RDIM_BakeNameMap); + } } //- rjf: build interned idx run map @@ -3513,25 +3631,118 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) idx_runs = rdim_bake_idx_run_map_from_params(arena, name_maps, params); } - //- rjf: type nodes + //- rjf: kick off pass 3 tasks + P2R_BakeTypeNodesIn bake_type_nodes_in = {strings, idx_runs, params}; + TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, &bake_type_nodes_in); + P2R_BakeNameMapsIn bake_name_maps_in = {strings, idx_runs, params}; + MemoryCopyArray(bake_name_maps_in.name_maps, name_maps); + TS_Ticket bake_name_maps_ticket = ts_kickoff(p2r_bake_name_maps_task__entry_point, &bake_name_maps_in); + P2R_BakeIdxRunsIn bake_idx_runs_in = {idx_runs}; + TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, &bake_idx_runs_in); + + //- rjf: join units + ProfScope("units") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_units_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join unit vmap + ProfScope("unit vmap") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_unit_vmap_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join source files + ProfScope("source files") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_src_files_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join UDTs + ProfScope("UDTs") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_udts_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join global variables + ProfScope("global variables") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_global_variables_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join global vmap + ProfScope("global vmap") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_global_vmap_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join thread variables + ProfScope("thread variables") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_thread_variables_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join procedures + ProfScope("procedures") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_procedures_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join scopes + ProfScope("scopes") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_scopes_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join scope vmap + ProfScope("scope vmap") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_scope_vmap_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join file paths + ProfScope("file paths") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_file_paths_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join strings + ProfScope("strings") + { + RDIM_BakeSectionList *s = ts_join_struct(bake_strings_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + + //- rjf: join type nodes ProfScope("type nodes") { - RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, strings, idx_runs, path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); + RDIM_BakeSectionList *s = ts_join_struct(bake_type_nodes_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); } - //- rjf: name maps + //- rjf: join name maps ProfScope("name map") { - RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, strings, idx_runs, params, name_maps); - rdim_bake_section_list_concat_in_place(§ions, &s); + RDIM_BakeSectionList *s = ts_join_struct(bake_name_maps_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); } - //- rjf: index runs + //- rjf: join index runs ProfScope("idx runs") { - RDIM_BakeSectionList s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, idx_runs); - rdim_bake_section_list_concat_in_place(§ions, &s); + RDIM_BakeSectionList *s = ts_join_struct(bake_idx_runs_ticket, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); } //- rjf: fill & return diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 9d4dbd2e..ce6bc4bf 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -219,6 +219,128 @@ struct P2R_SymbolStreamConvertOut RDIM_ScopeChunkList scopes; }; +//////////////////////////////// +//~ rjf: Baking Task Types + +typedef struct P2R_BuildBakeStringMapIn P2R_BuildBakeStringMapIn; +struct P2R_BuildBakeStringMapIn +{ + RDIM_BakePathTree *path_tree; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BuildBakeNameMapIn P2R_BuildBakeNameMapIn; +struct P2R_BuildBakeNameMapIn +{ + RDI_NameMapKind k; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeUnitsIn P2R_BakeUnitsIn; +struct P2R_BakeUnitsIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakePathTree *path_tree; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeUnitVMapIn P2R_BakeUnitVMapIn; +struct P2R_BakeUnitVMapIn +{ + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeSrcFilesIn P2R_BakeSrcFilesIn; +struct P2R_BakeSrcFilesIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakePathTree *path_tree; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeUDTsIn P2R_BakeUDTsIn; +struct P2R_BakeUDTsIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeGlobalVariablesIn P2R_BakeGlobalVariablesIn; +struct P2R_BakeGlobalVariablesIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeGlobalVMapIn P2R_BakeGlobalVMapIn; +struct P2R_BakeGlobalVMapIn +{ + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeThreadVariablesIn P2R_BakeThreadVariablesIn; +struct P2R_BakeThreadVariablesIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeProceduresIn P2R_BakeProceduresIn; +struct P2R_BakeProceduresIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeScopesIn P2R_BakeScopesIn; +struct P2R_BakeScopesIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeScopeVMapIn P2R_BakeScopeVMapIn; +struct P2R_BakeScopeVMapIn +{ + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeFilePathsIn P2R_BakeFilePathsIn; +struct P2R_BakeFilePathsIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakePathTree *path_tree; +}; + +typedef struct P2R_BakeStringsIn P2R_BakeStringsIn; +struct P2R_BakeStringsIn +{ + RDIM_BakeStringMap *strings; +}; + +typedef struct P2R_BakeTypeNodesIn P2R_BakeTypeNodesIn; +struct P2R_BakeTypeNodesIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakeIdxRunMap *idx_runs; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BakeNameMapsIn P2R_BakeNameMapsIn; +struct P2R_BakeNameMapsIn +{ + RDIM_BakeStringMap *strings; + RDIM_BakeIdxRunMap *idx_runs; + RDIM_BakeParams *params; + RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]; +}; + +typedef struct P2R_BakeIdxRunsIn P2R_BakeIdxRunsIn; +struct P2R_BakeIdxRunsIn +{ + RDIM_BakeIdxRunMap *idx_runs; +}; + //////////////////////////////// //~ rjf: Basic Helpers @@ -274,7 +396,7 @@ internal void *p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p); internal void *p2r_itype_chain_build_task__entry_point(Arena *arena, void *p); //////////////////////////////// -//~ rjf: Symbol Stream Conversion Paths & Thread +//~ rjf: Symbol Stream Conversion Tasks internal void *p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p); @@ -283,6 +405,32 @@ internal void *p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p internal P2R_Convert2Bake *p2r_convert(Arena *arena, P2R_User2Convert *in); +//////////////////////////////// +//~ rjf: Baking Stage Tasks + +//- rjf: pass 1: interner/deduper map builds +internal void *p2r_build_bake_string_map_task__entry_point(Arena *arena, void *p); +internal void *p2r_build_bake_name_map_task__entry_point(Arena *arena, void *p); + +//- rjf: pass 2: string-map-dependent debug info stream builds +internal void *p2r_bake_units_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_unit_vmap_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_src_files_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_udts_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_global_variables_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_global_vmap_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_thread_variables_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_procedures_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_scopes_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_scope_vmap_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_file_paths_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_strings_task__entry_point(Arena *arena, void *p); + +//- rjf: pass 3: idx-run-map-dependent debug info stream builds +internal void *p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_name_maps_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p); + //////////////////////////////// //~ rjf: Top-Level Baking Entry Point From a5493d5edb167fc50570026475bed01f0b27143e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Feb 2024 16:48:22 -0800 Subject: [PATCH 116/275] appease the clang gods --- src/lib_raddbgi_make/raddbgi_make.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 96925962..257fa4e6 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1017,46 +1017,46 @@ rdim_bake_section_idx_from_params_tag_idx(RDIM_BakeParams *params, RDI_DataSecti default:{}break; //- rjf: per-unit sections - case RDI_DataSectionTag_LineInfoVoffs: + case (RDI_U32)RDI_DataSectionTag_LineInfoVoffs: if(idx != 0) { result = RDI_DataSectionTag_PRIMARY_COUNT + 0*params->units.total_count + (idx-1)%params->units.total_count; }break; - case RDI_DataSectionTag_LineInfoData: + case (RDI_U32)RDI_DataSectionTag_LineInfoData: if(idx != 0) { result = RDI_DataSectionTag_PRIMARY_COUNT + 1*params->units.total_count + (idx-1)%params->units.total_count; }break; - case RDI_DataSectionTag_LineInfoColumns: + case (RDI_U32)RDI_DataSectionTag_LineInfoColumns: if(idx != 0) { result = RDI_DataSectionTag_PRIMARY_COUNT + 2*params->units.total_count + (idx-1)%params->units.total_count; }break; //- rjf: per-source-file sections - case RDI_DataSectionTag_LineMapNumbers: + case (RDI_U32)RDI_DataSectionTag_LineMapNumbers: if(idx != 0) { result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 0*params->src_files.total_count + (idx-1)%params->src_files.total_count; }break; - case RDI_DataSectionTag_LineMapRanges: + case (RDI_U32)RDI_DataSectionTag_LineMapRanges: if(idx != 0) { result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 1*params->src_files.total_count + (idx-1)%params->src_files.total_count; }break; - case RDI_DataSectionTag_LineMapVoffs: + case (RDI_U32)RDI_DataSectionTag_LineMapVoffs: if(idx != 0) { result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 2*params->src_files.total_count + (idx-1)%params->src_files.total_count; }break; //- rjf: per-name-map sections - case RDI_DataSectionTag_NameMapBuckets: + case (RDI_U32)RDI_DataSectionTag_NameMapBuckets: if(idx != 0) { result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 0*(RDI_NameMapKind_COUNT-1) + (idx-1)%(RDI_NameMapKind_COUNT-1); }break; - case RDI_DataSectionTag_NameMapNodes: + case (RDI_U32)RDI_DataSectionTag_NameMapNodes: if(idx != 0) { result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 1*(RDI_NameMapKind_COUNT-1) + (idx-1)%(RDI_NameMapKind_COUNT-1); From d2adf3e067de09df70e8de24097976448ae4db77 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 09:48:19 -0800 Subject: [PATCH 117/275] extend task system with ability to specify per-task arenas, if needed - not necessary in the converter, since it is fire-and-forget, but this will make it more useful for the debugger later --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 62 ++++++++++++------------- src/task_system/task_system.c | 26 +++++++++-- src/task_system/task_system.h | 4 +- 3 files changed, 55 insertions(+), 37 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index bc003d0f..bc80f0a0 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1890,14 +1890,14 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) P2R_CompUnitContributionsParseIn comp_unit_contributions_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon) : str8_zero(), coff_sections}; //- rjf: kick off tasks - TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in); - TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in); - TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in); - TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in); - TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in); - TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_parse_in); - TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, &comp_unit_parse_in); - TS_Ticket comp_unit_contributions_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_contributions_parse_task__entry_point, &comp_unit_contributions_parse_in); + TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, 0, &exe_hash_in); + TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &tpi_hash_in); + TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &tpi_leaf_in); + TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &ipi_hash_in); + TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &ipi_leaf_in); + TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, 0, &sym_parse_in); + TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, 0, &comp_unit_parse_in); + TS_Ticket comp_unit_contributions_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_contributions_parse_task__entry_point, 0, &comp_unit_contributions_parse_in); //- rjf: join tasks exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); @@ -1928,11 +1928,11 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) { PDB_CompUnit *unit = comp_units->units[idx]; sym_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); - sym_tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_tasks_inputs[idx]); + sym_tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, 0, &sym_tasks_inputs[idx]); c13_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13); c13_tasks_inputs[idx].strtbl = strtbl; c13_tasks_inputs[idx].coff_sections = coff_sections; - c13_tasks_tickets[idx] = ts_kickoff(p2r_c13_stream_parse_task__entry_point, &c13_tasks_inputs[idx]); + c13_tasks_tickets[idx] = ts_kickoff(p2r_c13_stream_parse_task__entry_point, 0, &c13_tasks_inputs[idx]); } //- rjf: join tasks @@ -2175,7 +2175,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) link_name_map_build_in.sym = sym; link_name_map_build_in.coff_sections = coff_sections; link_name_map_build_in.link_name_map = &link_name_map__in_progress; - link_name_map_ticket = ts_kickoff(p2r_link_name_map_build_task__entry_point, &link_name_map_build_in); + link_name_map_ticket = ts_kickoff(p2r_link_name_map_build_task__entry_point, 0, &link_name_map_build_in); } ////////////////////////////////////////////////////////////// @@ -2208,7 +2208,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_tickets[idx] = ts_kickoff(p2r_itype_fwd_map_fill_task__entry_point, &tasks_inputs[idx]); + tasks_tickets[idx] = ts_kickoff(p2r_itype_fwd_map_fill_task__entry_point, 0, &tasks_inputs[idx]); } //- rjf: join all tasks @@ -2247,7 +2247,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); tasks_inputs[idx].itype_chains = itype_chains; tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_tickets[idx] = ts_kickoff(p2r_itype_chain_build_task__entry_point, &tasks_inputs[idx]); + tasks_tickets[idx] = ts_kickoff(p2r_itype_chain_build_task__entry_point, 0, &tasks_inputs[idx]); } //- rjf: join all tasks @@ -3332,7 +3332,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) tasks_inputs[idx].sym_ranges_first= 0; tasks_inputs[idx].sym_ranges_opl = sym_for_unit[idx-global_stream_subdivision_tasks_count]->sym_ranges.count; } - tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_convert_task__entry_point, &tasks_inputs[idx]); + tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_convert_task__entry_point, 0, &tasks_inputs[idx]); } } @@ -3553,7 +3553,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off pass 1 tasks P2R_BuildBakeStringMapIn build_bake_string_map_in = {path_tree, params}; - TS_Ticket build_bake_string_map_ticket = ts_kickoff(p2r_build_bake_string_map_task__entry_point, &build_bake_string_map_in); + TS_Ticket build_bake_string_map_ticket = ts_kickoff(p2r_build_bake_string_map_task__entry_point, 0, &build_bake_string_map_in); P2R_BuildBakeNameMapIn build_bake_name_map_in[RDI_NameMapKind_COUNT] = {0}; TS_Ticket build_bake_name_map_ticket[RDI_NameMapKind_COUNT] = {0}; for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); @@ -3562,7 +3562,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { build_bake_name_map_in[k].k = k; build_bake_name_map_in[k].params = params; - build_bake_name_map_ticket[k] = ts_kickoff(p2r_build_bake_name_map_task__entry_point, &build_bake_name_map_in[k]); + build_bake_name_map_ticket[k] = ts_kickoff(p2r_build_bake_name_map_task__entry_point, 0, &build_bake_name_map_in[k]); } //- rjf: join string map build @@ -3574,29 +3574,29 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off pass 2 tasks P2R_BakeUnitsIn bake_units_in = {strings, path_tree, params}; - TS_Ticket bake_units_ticket = ts_kickoff(p2r_bake_units_task__entry_point, &bake_units_in); + TS_Ticket bake_units_ticket = ts_kickoff(p2r_bake_units_task__entry_point, 0, &bake_units_in); P2R_BakeUnitVMapIn bake_unit_vmap_in = {params}; - TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2r_bake_unit_vmap_task__entry_point, &bake_unit_vmap_in); + TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2r_bake_unit_vmap_task__entry_point, 0, &bake_unit_vmap_in); P2R_BakeSrcFilesIn bake_src_files_in = {strings, path_tree, params}; - TS_Ticket bake_src_files_ticket = ts_kickoff(p2r_bake_src_files_task__entry_point, &bake_src_files_in); + TS_Ticket bake_src_files_ticket = ts_kickoff(p2r_bake_src_files_task__entry_point, 0, &bake_src_files_in); P2R_BakeUDTsIn bake_udts_in = {strings, params}; - TS_Ticket bake_udts_ticket = ts_kickoff(p2r_bake_udts_task__entry_point, &bake_udts_in); + TS_Ticket bake_udts_ticket = ts_kickoff(p2r_bake_udts_task__entry_point, 0, &bake_udts_in); P2R_BakeGlobalVariablesIn bake_global_variables_in = {strings, params}; - TS_Ticket bake_global_variables_ticket = ts_kickoff(p2r_bake_global_variables_task__entry_point, &bake_global_variables_in); + TS_Ticket bake_global_variables_ticket = ts_kickoff(p2r_bake_global_variables_task__entry_point, 0, &bake_global_variables_in); P2R_BakeGlobalVMapIn bake_global_vmap_in = {params}; - TS_Ticket bake_global_vmap_ticket = ts_kickoff(p2r_bake_global_vmap_task__entry_point, &bake_global_vmap_in); + TS_Ticket bake_global_vmap_ticket = ts_kickoff(p2r_bake_global_vmap_task__entry_point, 0, &bake_global_vmap_in); P2R_BakeThreadVariablesIn bake_thread_variables_in = {strings, params}; - TS_Ticket bake_thread_variables_ticket = ts_kickoff(p2r_bake_thread_variables_task__entry_point, &bake_thread_variables_in); + TS_Ticket bake_thread_variables_ticket = ts_kickoff(p2r_bake_thread_variables_task__entry_point, 0, &bake_thread_variables_in); P2R_BakeProceduresIn bake_procedures_in = {strings, params}; - TS_Ticket bake_procedures_ticket = ts_kickoff(p2r_bake_procedures_task__entry_point, &bake_procedures_in); + TS_Ticket bake_procedures_ticket = ts_kickoff(p2r_bake_procedures_task__entry_point, 0, &bake_procedures_in); P2R_BakeScopesIn bake_scopes_in = {strings, params}; - TS_Ticket bake_scopes_ticket = ts_kickoff(p2r_bake_scopes_task__entry_point, &bake_scopes_in); + TS_Ticket bake_scopes_ticket = ts_kickoff(p2r_bake_scopes_task__entry_point, 0, &bake_scopes_in); P2R_BakeScopeVMapIn bake_scope_vmap_in = {params}; - TS_Ticket bake_scope_vmap_ticket = ts_kickoff(p2r_bake_scope_vmap_task__entry_point, &bake_scope_vmap_in); + TS_Ticket bake_scope_vmap_ticket = ts_kickoff(p2r_bake_scope_vmap_task__entry_point, 0, &bake_scope_vmap_in); P2R_BakeFilePathsIn bake_file_paths_in = {strings, path_tree}; - TS_Ticket bake_file_paths_ticket = ts_kickoff(p2r_bake_file_paths_task__entry_point, &bake_file_paths_in); + TS_Ticket bake_file_paths_ticket = ts_kickoff(p2r_bake_file_paths_task__entry_point, 0, &bake_file_paths_in); P2R_BakeStringsIn bake_strings_in = {strings}; - TS_Ticket bake_strings_ticket = ts_kickoff(p2r_bake_strings_task__entry_point, &bake_strings_in); + TS_Ticket bake_strings_ticket = ts_kickoff(p2r_bake_strings_task__entry_point, 0, &bake_strings_in); //- rjf: top-level info ProfScope("top level info") @@ -3633,12 +3633,12 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off pass 3 tasks P2R_BakeTypeNodesIn bake_type_nodes_in = {strings, idx_runs, params}; - TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, &bake_type_nodes_in); + TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, 0, &bake_type_nodes_in); P2R_BakeNameMapsIn bake_name_maps_in = {strings, idx_runs, params}; MemoryCopyArray(bake_name_maps_in.name_maps, name_maps); - TS_Ticket bake_name_maps_ticket = ts_kickoff(p2r_bake_name_maps_task__entry_point, &bake_name_maps_in); + TS_Ticket bake_name_maps_ticket = ts_kickoff(p2r_bake_name_maps_task__entry_point, 0, &bake_name_maps_in); P2R_BakeIdxRunsIn bake_idx_runs_in = {idx_runs}; - TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, &bake_idx_runs_in); + TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, 0, &bake_idx_runs_in); //- rjf: join units ProfScope("units") diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index e3a8747c..aa3902f4 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -44,7 +44,7 @@ ts_init(void) //~ rjf: High-Level Task Kickoff / Joining internal TS_Ticket -ts_kickoff(TS_TaskFunctionType *entry_point, void *p) +ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p) { // rjf: obtain number & slot/stripefor next artifact U64 artifact_num = ins_atomic_u64_inc_eval(&ts_shared->artifact_num_gen); @@ -81,9 +81,19 @@ ts_kickoff(TS_TaskFunctionType *entry_point, void *p) U64 available_size = ts_shared->u2t_ring_size-unconsumed_size; if(available_size >= sizeof(entry_point) + sizeof(p) + sizeof(ticket)) { + Arena *task_arena = 0; + if(optional_arena_ptr != 0) + { + task_arena = *optional_arena_ptr; + } ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &entry_point); + ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &task_arena); ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &p); ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &ticket); + if(optional_arena_ptr != 0) + { + *optional_arena_ptr = 0; + } break; } os_condition_variable_wait(ts_shared->u2t_ring_cv, ts_shared->u2t_ring_mutex, max_U64); @@ -127,7 +137,7 @@ ts_join(TS_Ticket ticket, U64 endt_us) //~ rjf: Task Threads internal void -ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, void **p_out, TS_Ticket *ticket_out) +ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, Arena **arena_out, void **p_out, TS_Ticket *ticket_out) { OS_MutexScope(ts_shared->u2t_ring_mutex) for(;;) { @@ -135,6 +145,7 @@ ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, void **p_out, TS_Tick if(unconsumed_size >= sizeof(*entry_point_out) + sizeof(*p_out) + sizeof(*ticket_out)) { ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, entry_point_out); + ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, arena_out); ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, p_out); ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, ticket_out); break; @@ -154,12 +165,19 @@ ts_task_thread__entry_point(void *p) { //- rjf: grab next task TS_TaskFunctionType *task_function = 0; + Arena *task_arena = 0; void *task_params = 0; TS_Ticket task_ticket = {0}; - ts_u2t_dequeue_task(&task_function, &task_params, &task_ticket); + ts_u2t_dequeue_task(&task_function, &task_arena, &task_params, &task_ticket); + + //- rjf: use task thread's arena if none specified + if(task_arena == 0) + { + task_arena = thread->arena; + } //- rjf: run task - void *task_result = task_function(thread->arena, task_params); + void *task_result = task_function(task_arena, task_params); //- rjf: store into artifact U64 artifact_num = task_ticket.u64[0]; diff --git a/src/task_system/task_system.h b/src/task_system/task_system.h index e6f6466d..690de476 100644 --- a/src/task_system/task_system.h +++ b/src/task_system/task_system.h @@ -105,14 +105,14 @@ internal void ts_init(void); //////////////////////////////// //~ rjf: High-Level Task Kickoff / Joining -internal TS_Ticket ts_kickoff(TS_TaskFunctionType *entry_point, void *p); +internal TS_Ticket ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p); internal void *ts_join(TS_Ticket ticket, U64 endt_us); #define ts_join_struct(ticket, endt_us, type) (type *)ts_join((ticket), (endt_us)) //////////////////////////////// //~ rjf: Task Threads -internal void ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, void **p_out, TS_Ticket *ticket_out); +internal void ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, Arena **arena_out, void **p_out, TS_Ticket *ticket_out); internal void ts_task_thread__entry_point(void *p); #endif // TASK_SYSTEM_H From b50848941618ae5a05f982fcf3e08fdaff9c6d8a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 10:03:26 -0800 Subject: [PATCH 118/275] clean up old transitionary code --- src/lib_raddbgi_make/raddbgi_make.h | 53 +++-------------------------- 1 file changed, 4 insertions(+), 49 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 36a48954..b6ca35ba 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -795,6 +795,8 @@ struct RDIM_ScopeChunkList //////////////////////////////// //~ rjf: Baking Types +//- rjf: baking parameters + typedef struct RDIM_BakeParams RDIM_BakeParams; struct RDIM_BakeParams { @@ -810,6 +812,8 @@ struct RDIM_BakeParams RDIM_ScopeChunkList scopes; }; +//- rjf: data sections + typedef struct RDIM_BakeSection RDIM_BakeSection; struct RDIM_BakeSection { @@ -834,55 +838,6 @@ struct RDIM_BakeSectionList 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 -{ - void *data; - RDI_U64 size; - RDI_DataSectionTag tag; -}; - -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; -}; -#endif - //- rjf: interned strings typedef struct RDIM_BakeStringNode RDIM_BakeStringNode; From 50f7d53db231849cd62fd238c2aca04f1a9b376e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 14:15:23 -0800 Subject: [PATCH 119/275] eliminate unnecessary copy in raddbgi string map interner --- src/lib_raddbgi_make/raddbgi_make.c | 2 +- src/lib_raddbgi_make/raddbgi_make.h | 7 ------- src/os/core/os_core.c | 18 ------------------ 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 257fa4e6..af479b17 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1257,7 +1257,7 @@ rdim_bake_string_map_insert(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_Str if(node == 0) { node = rdim_push_array(arena, RDIM_BakeStringNode, 1); - node->string = rdim_str8_copy(arena, string); + node->string = string; node->hash = hash; node->idx = map->count; map->count += 1; diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index b6ca35ba..474ed2bb 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1194,11 +1194,4 @@ RDI_PROC RDIM_BakeSectionList rdim_bake_idx_run_section_list_from_idx_run_map(RD 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 diff --git a/src/os/core/os_core.c b/src/os/core/os_core.c index e1429d1d..db67d314 100644 --- a/src/os/core/os_core.c +++ b/src/os/core/os_core.c @@ -163,67 +163,49 @@ os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) internal void os_mutex_take(OS_Handle mutex){ - ProfBeginLockWait((void *)(mutex.u64[0]), "take mutex"); os_mutex_take_(mutex); - ProfEndLockWait(); - ProfLockTake((void *)(mutex.u64[0]), "take mutex"); } internal void os_mutex_drop(OS_Handle mutex){ os_mutex_drop_(mutex); - ProfLockDrop((void *)(mutex.u64[0])); } internal void os_rw_mutex_take_r(OS_Handle rw_mutex){ - ProfBeginLockWait((void *)(rw_mutex.u64[0]), "rw mutex take r"); os_rw_mutex_take_r_(rw_mutex); - ProfEndLockWait(); - ProfLockTake((void *)(rw_mutex.u64[0]), "rw mutex take r"); } internal void os_rw_mutex_drop_r(OS_Handle rw_mutex){ os_rw_mutex_drop_r_(rw_mutex); - ProfLockDrop((void *)(rw_mutex.u64[0])); } internal void os_rw_mutex_take_w(OS_Handle rw_mutex){ - ProfBeginLockWait((void *)(rw_mutex.u64[0]), "rw mutex take rw"); os_rw_mutex_take_w_(rw_mutex); - ProfEndLockWait(); - ProfLockTake((void *)(rw_mutex.u64[0]), "rw mutex take rw"); } internal void os_rw_mutex_drop_w(OS_Handle rw_mutex){ os_rw_mutex_drop_w_(rw_mutex); - ProfLockDrop((void *)(rw_mutex.u64[0])); } internal B32 os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us){ - ProfLockDrop((void *)(mutex.u64[0])); B32 result = os_condition_variable_wait_(cv, mutex, endt_us); - ProfLockTake((void *)(mutex.u64[0]), "wait cv"); return(result); } internal B32 os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - ProfLockDrop((void *)(mutex_rw.u64[0])); B32 result = os_condition_variable_wait_rw_r_(cv, mutex_rw, endt_us); - ProfLockTake((void *)(mutex_rw.u64[0]), "wait cv rw r"); return(result); } internal B32 os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - ProfLockDrop((void *)(mutex_rw.u64[0])); B32 result = os_condition_variable_wait_rw_w_(cv, mutex_rw, endt_us); - ProfLockTake((void *)(mutex_rw.u64[0]), "wait cv rw w"); return(result); } From 0e352f92df21d47fb32271a7b9ae86e67612eb86 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 14:45:09 -0800 Subject: [PATCH 120/275] separate per-name-map baking stages from each other, and from top-level name map section build; do them all independently --- src/lib_raddbgi_make/raddbgi_make.c | 204 ++++++++++++------------ src/lib_raddbgi_make/raddbgi_make.h | 3 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 42 ++++- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 9 +- src/task_system/task_system.c | 9 ++ src/task_system/task_system.h | 16 ++ 6 files changed, 171 insertions(+), 112 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index af479b17..2b1b7914 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2959,7 +2959,7 @@ rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams //- rjf: name maps RDI_PROC RDIM_BakeSectionList -rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) +rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) { RDIM_BakeSectionList sections = {0}; @@ -2986,107 +2986,9 @@ rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStr RDI_NameMap *dst_map = &dst_maps[dst_map_idx]; RDIM_BakeNameMap *src_map = name_maps[k]; if(src_map == 0 || src_map->name_count == 0) { continue; } - - // rjf: bake name map - RDI_U32 baked_buckets_count = src_map->name_count; - RDI_U32 baked_nodes_count = src_map->name_count; - RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count); - RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count); - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // rjf: setup the final bucket layouts - typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; - struct RDIM_NameMapSemiNode - { - RDIM_NameMapSemiNode *next; - RDIM_BakeNameMapNode *node; - }; - typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; - struct RDIM_NameMapSemiBucket - { - RDIM_NameMapSemiNode *first; - RDIM_NameMapSemiNode *last; - RDI_U64 count; - }; - RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count); - for(RDIM_BakeNameMapNode *node = src_map->first; - node != 0; - node = node->order_next) - { - RDI_U64 hash = rdi_hash(node->string.str, node->string.size); - RDI_U64 bi = hash%baked_buckets_count; - RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); - SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); - snode->node = node; - sbuckets[bi].count += 1; - } - - // rjf: convert to serialized buckets & nodes - { - RDI_NameMapBucket *bucket_ptr = baked_buckets; - RDI_NameMapNode *node_ptr = baked_nodes; - for(RDI_U32 i = 0; i < baked_buckets_count; i += 1, bucket_ptr += 1) - { - bucket_ptr->first_node = (RDI_U32)(node_ptr - baked_nodes); - bucket_ptr->node_count = sbuckets[i].count; - for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; - snode != 0; - snode = snode->next) - { - RDIM_BakeNameMapNode *node = snode->node; - - // rjf: cons name and index(es) - RDI_U32 string_idx = rdim_bake_idx_from_string(strings, node->string); - RDI_U32 match_count = node->val_count; - RDI_U32 idx = 0; - if(match_count == 1) - { - idx = node->val_first->val[0]; - } - else - { - RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); - RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); - RDI_U32 *idx_ptr = idx_run; - for(RDIM_BakeNameMapValNode *idxnode = node->val_first; - idxnode != 0; - idxnode = idxnode->next) - { - for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) - { - if(idxnode->val[i] == 0) - { - goto dblbreak; - } - *idx_ptr = idxnode->val[i]; - idx_ptr += 1; - } - } - dblbreak:; - idx = rdim_bake_idx_from_idx_run(idx_runs, idx_run, match_count); - rdim_arena_pop_to(scratch.arena, temp_pos); - } - - // rjf: write to node - node_ptr->string_idx = string_idx; - node_ptr->match_count = match_count; - node_ptr->match_idx_or_idx_run_first = idx; - node_ptr += 1; - } - } - } - rdim_scratch_end(scratch); - } - - // rjf: fill output header, and push sections for buckets/nodes dst_map->kind = k; dst_map->bucket_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); // TODO(rjf): @u64_to_u32 dst_map->node_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); // TODO(rjf): @u64_to_u32 - rdim_bake_section_list_push_new(arena, §ions, baked_buckets, sizeof(RDI_NameMapBucket)* baked_buckets_count, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); - rdim_bake_section_list_push_new(arena, §ions, baked_nodes, sizeof(RDI_NameMapNode) * baked_nodes_count, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); - - // rjf: inc dst_map_idx += 1; } } @@ -3096,6 +2998,110 @@ rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStr return sections; } +RDI_PROC RDIM_BakeSectionList +rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map) +{ + RDIM_BakeSectionList sections = {0}; + if(map != 0 && map->name_count != 0) + { + RDI_U32 baked_buckets_count = map->name_count; + RDI_U32 baked_nodes_count = map->name_count; + RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count); + RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count); + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: setup the final bucket layouts + typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; + struct RDIM_NameMapSemiNode + { + RDIM_NameMapSemiNode *next; + RDIM_BakeNameMapNode *node; + }; + typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; + struct RDIM_NameMapSemiBucket + { + RDIM_NameMapSemiNode *first; + RDIM_NameMapSemiNode *last; + RDI_U64 count; + }; + RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count); + for(RDIM_BakeNameMapNode *node = map->first; + node != 0; + node = node->order_next) + { + RDI_U64 hash = rdi_hash(node->string.str, node->string.size); + RDI_U64 bi = hash%baked_buckets_count; + RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); + SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); + snode->node = node; + sbuckets[bi].count += 1; + } + + // rjf: convert to serialized buckets & nodes + { + RDI_NameMapBucket *bucket_ptr = baked_buckets; + RDI_NameMapNode *node_ptr = baked_nodes; + for(RDI_U32 i = 0; i < baked_buckets_count; i += 1, bucket_ptr += 1) + { + bucket_ptr->first_node = (RDI_U32)(node_ptr - baked_nodes); + bucket_ptr->node_count = sbuckets[i].count; + for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; + snode != 0; + snode = snode->next) + { + RDIM_BakeNameMapNode *node = snode->node; + + // rjf: cons name and index(es) + RDI_U32 string_idx = rdim_bake_idx_from_string(strings, node->string); + RDI_U32 match_count = node->val_count; + RDI_U32 idx = 0; + if(match_count == 1) + { + idx = node->val_first->val[0]; + } + else + { + RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); + RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); + RDI_U32 *idx_ptr = idx_run; + for(RDIM_BakeNameMapValNode *idxnode = node->val_first; + idxnode != 0; + idxnode = idxnode->next) + { + for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) + { + if(idxnode->val[i] == 0) + { + goto dblbreak; + } + *idx_ptr = idxnode->val[i]; + idx_ptr += 1; + } + } + dblbreak:; + idx = rdim_bake_idx_from_idx_run(idx_runs, idx_run, match_count); + rdim_arena_pop_to(scratch.arena, temp_pos); + } + + // rjf: write to node + node_ptr->string_idx = string_idx; + node_ptr->match_count = match_count; + node_ptr->match_idx_or_idx_run_first = idx; + node_ptr += 1; + } + } + } + rdim_scratch_end(scratch); + } + + // rjf: sections for buckets/nodes + rdim_bake_section_list_push_new(arena, §ions, baked_buckets, sizeof(RDI_NameMapBucket)* baked_buckets_count, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); + rdim_bake_section_list_push_new(arena, §ions, baked_nodes, sizeof(RDI_NameMapNode) * baked_nodes_count, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); + } + return sections; +} + //- rjf: file paths RDI_PROC RDIM_BakeSectionList diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 474ed2bb..f412e9f3 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1178,7 +1178,8 @@ RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Aren 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_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); +RDI_PROC RDIM_BakeSectionList rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); +RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map); //- 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); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index bc80f0a0..56e4a8c5 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3518,11 +3518,11 @@ p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p) } internal void * -p2r_bake_name_maps_task__entry_point(Arena *arena, void *p) +p2r_bake_name_map_task__entry_point(Arena *arena, void *p) { - P2R_BakeNameMapsIn *in = (P2R_BakeNameMapsIn *)p; + P2R_BakeNameMapIn *in = (P2R_BakeNameMapIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); - ProfScope("bake name maps") *s = rdim_bake_name_map_section_list_from_params_maps(arena, in->strings, in->idx_runs, in->params, in->name_maps); + ProfScope("bake name map %i", in->kind) *s = rdim_bake_name_map_section_list_from_params_kind_map(arena, in->strings, in->idx_runs, in->params, in->kind, in->map); return s; } @@ -3541,6 +3541,7 @@ p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p) internal P2R_Bake2Serialize * p2r_bake(Arena *arena, P2R_Convert2Bake *in) { + Temp scratch = scratch_begin(&arena, 1); RDIM_BakeParams *params = &in->bake_params; RDIM_BakeSectionList sections = {0}; @@ -3634,12 +3635,33 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off pass 3 tasks P2R_BakeTypeNodesIn bake_type_nodes_in = {strings, idx_runs, params}; TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, 0, &bake_type_nodes_in); - P2R_BakeNameMapsIn bake_name_maps_in = {strings, idx_runs, params}; - MemoryCopyArray(bake_name_maps_in.name_maps, name_maps); - TS_Ticket bake_name_maps_ticket = ts_kickoff(p2r_bake_name_maps_task__entry_point, 0, &bake_name_maps_in); + TS_TicketList bake_name_maps_tickets = {0}; + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + if(name_maps[k] == 0 || name_maps[k]->name_count == 0) + { + continue; + } + P2R_BakeNameMapIn *in = push_array(scratch.arena, P2R_BakeNameMapIn, 1); + in->strings = strings; + in->idx_runs = idx_runs; + in->params = params; + in->kind = k; + in->map = name_maps[k]; + ts_ticket_list_push(scratch.arena, &bake_name_maps_tickets, ts_kickoff(p2r_bake_name_map_task__entry_point, 0, in)); + } P2R_BakeIdxRunsIn bake_idx_runs_in = {idx_runs}; TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, 0, &bake_idx_runs_in); + //- rjf: bake top-level name maps section + ProfScope("top level name maps section") + { + RDIM_BakeSectionList s = rdim_bake_top_level_name_map_section_list_from_params_maps(arena, strings, idx_runs, params, name_maps); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + //- rjf: join units ProfScope("units") { @@ -3734,8 +3756,11 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: join name maps ProfScope("name map") { - RDIM_BakeSectionList *s = ts_join_struct(bake_name_maps_ticket, max_U64, RDIM_BakeSectionList); - rdim_bake_section_list_concat_in_place(§ions, s); + for(TS_TicketNode *n = bake_name_maps_tickets.first; n != 0; n = n->next) + { + RDIM_BakeSectionList *s = ts_join_struct(n->v, max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } } //- rjf: join index runs @@ -3748,6 +3773,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: fill & return P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1); out->sections = sections; + scratch_end(scratch); return out; } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index ce6bc4bf..9041f5ce 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -326,13 +326,14 @@ struct P2R_BakeTypeNodesIn RDIM_BakeParams *params; }; -typedef struct P2R_BakeNameMapsIn P2R_BakeNameMapsIn; -struct P2R_BakeNameMapsIn +typedef struct P2R_BakeNameMapIn P2R_BakeNameMapIn; +struct P2R_BakeNameMapIn { RDIM_BakeStringMap *strings; RDIM_BakeIdxRunMap *idx_runs; RDIM_BakeParams *params; - RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]; + RDI_NameMapKind kind; + RDIM_BakeNameMap *map; }; typedef struct P2R_BakeIdxRunsIn P2R_BakeIdxRunsIn; @@ -428,7 +429,7 @@ internal void *p2r_bake_strings_task__entry_point(Arena *arena, void *p); //- rjf: pass 3: idx-run-map-dependent debug info stream builds internal void *p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_name_maps_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_name_map_task__entry_point(Arena *arena, void *p); internal void *p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p); //////////////////////////////// diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index aa3902f4..fb79b9c0 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -8,6 +8,15 @@ ts_ticket_zero(void) return ticket; } +internal void +ts_ticket_list_push(Arena *arena, TS_TicketList *list, TS_Ticket ticket) +{ + TS_TicketNode *n = push_array(arena, TS_TicketNode, 1); + n->v = ticket; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + //////////////////////////////// //~ rjf: Top-Level Layer Initialization diff --git a/src/task_system/task_system.h b/src/task_system/task_system.h index 690de476..ccf06755 100644 --- a/src/task_system/task_system.h +++ b/src/task_system/task_system.h @@ -16,6 +16,21 @@ struct TS_Ticket U64 u64[2]; }; +typedef struct TS_TicketNode TS_TicketNode; +struct TS_TicketNode +{ + TS_TicketNode *next; + TS_Ticket v; +}; + +typedef struct TS_TicketList TS_TicketList; +struct TS_TicketList +{ + TS_TicketNode *first; + TS_TicketNode *last; + U64 count; +}; + //////////////////////////////// //~ rjf: Task Request Types @@ -96,6 +111,7 @@ global TS_Shared *ts_shared = 0; //~ rjf: Basic Type Functions internal TS_Ticket ts_ticket_zero(void); +internal void ts_ticket_list_push(Arena *arena, TS_TicketList *list, TS_Ticket ticket); //////////////////////////////// //~ rjf: Top-Level Layer Initialization From 34f500ce27ad5e36ddc939ffc9da07360f1a01a4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 15:11:13 -0800 Subject: [PATCH 121/275] push unit conversion & src file gathering to background task threads; dont preemptively join initial independent parses until they are necessary --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 441 ++++++++++++++---------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 25 +- 2 files changed, 287 insertions(+), 179 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 56e4a8c5..c95ff864 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -606,7 +606,131 @@ p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p) } //////////////////////////////// -//~ rjf: Link Name Map Building Task +//~ rjf: Unit Conversion Tasks + +internal void * +p2r_units_convert_task__entry_point(Arena *arena, void *p) +{ + Temp scratch = scratch_begin(&arena, 1); + P2R_UnitConvertIn *in = (P2R_UnitConvertIn *)p; + P2R_UnitConvertOut *out = push_array(arena, P2R_UnitConvertOut, 1); + ProfScope("build units, initial src file map, & collect unit source files") + { + U64 units_chunk_cap = in->comp_units->count; + P2R_SrcFileMap src_file_map = {0}; + src_file_map.slots_count = 65536; + src_file_map.slots = push_array(scratch.arena, P2R_SrcFileNode *, src_file_map.slots_count); + + //- rjf: pass 1: fill basic per-unit info & line info + for(U64 comp_unit_idx = 0; comp_unit_idx < in->comp_units->count; comp_unit_idx += 1) + { + PDB_CompUnit *pdb_unit = in->comp_units->units[comp_unit_idx]; + CV_SymParsed *pdb_unit_sym = in->comp_unit_syms[comp_unit_idx]; + CV_C13Parsed *pdb_unit_c13 = in->comp_unit_c13s[comp_unit_idx]; + + //- rjf: produce unit name + String8 unit_name = pdb_unit->obj_name; + if(unit_name.size != 0) + { + String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); + if(unit_name_past_last_slash.size != 0) + { + unit_name = unit_name_past_last_slash; + } + } + + //- rjf: produce obj name + String8 obj_name = pdb_unit->obj_name; + if(str8_match(obj_name, str8_lit("* Linker *"), 0) || + str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) + { + MemoryZeroStruct(&obj_name); + } + + //- rjf: build unit + RDIM_Unit *dst_unit = rdim_unit_chunk_list_push(arena, &out->units, units_chunk_cap); + dst_unit->unit_name = unit_name; + dst_unit->compiler_name = pdb_unit_sym->info.compiler_name; + dst_unit->object_file = obj_name; + dst_unit->archive_file = pdb_unit->group_name; + dst_unit->language = p2r_rdi_language_from_cv_language(pdb_unit_sym->info.language); + + //- rjf: fill unit line info + for(CV_C13SubSectionNode *node = pdb_unit_c13->first_sub_section; + node != 0; + node = node->next) + { + if(node->kind == CV_C13_SubSectionKind_Lines) + { + for(CV_C13LinesParsedNode *lines_n = node->lines_first; + lines_n != 0; + lines_n = lines_n->next) + { + CV_C13LinesParsed *lines = &lines_n->v; + + // rjf: file name -> normalized file path + String8 file_path = lines->file_name; + String8 file_path_normalized = lower_from_str8(scratch.arena, str8_skip_chop_whitespace(file_path)); + for(U64 idx = 0; idx < file_path_normalized.size; idx += 1) + { + if(file_path_normalized.str[idx] == '\\') + { + file_path_normalized.str[idx] = '/'; + } + } + + // rjf: normalized file path -> source file node + U64 file_path_normalized_hash = rdi_hash(file_path_normalized.str, file_path_normalized.size); + U64 src_file_slot = file_path_normalized_hash%src_file_map.slots_count; + P2R_SrcFileNode *src_file_node = 0; + for(P2R_SrcFileNode *n = src_file_map.slots[src_file_slot]; n != 0; n = n->next) + { + if(str8_match(n->src_file->normal_full_path, file_path_normalized, 0)) + { + src_file_node = n; + break; + } + } + if(src_file_node == 0) + { + src_file_node = push_array(scratch.arena, P2R_SrcFileNode, 1); + SLLStackPush(src_file_map.slots[src_file_slot], src_file_node); + src_file_node->src_file = rdim_src_file_chunk_list_push(arena, &out->src_files, 4096); + src_file_node->src_file->normal_full_path = push_str8_copy(arena, file_path_normalized); + } + + // rjf: build sequence + RDIM_LineSequence *seq = rdim_line_sequence_list_push(arena, &dst_unit->line_sequences); + rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); + seq->src_file = src_file_node->src_file; + seq->voffs = lines->voffs; + seq->line_nums = lines->line_nums; + seq->col_nums = lines->col_nums; + seq->line_count = lines->line_count; + } + } + } + } + + //- rjf: pass 2: build per-unit voff ranges from comp unit contributions table + PDB_CompUnitContribution *contrib_ptr = in->comp_unit_contributions->contributions; + PDB_CompUnitContribution *contrib_opl = contrib_ptr + in->comp_unit_contributions->count; + for(;contrib_ptr < contrib_opl; contrib_ptr += 1) + { + if(contrib_ptr->mod < in->comp_units->count) + { + RDIM_Unit *unit = &out->units.first->v[contrib_ptr->mod]; + RDIM_Rng1U64 range = {contrib_ptr->voff_first, contrib_ptr->voff_opl}; + rdim_rng1u64_list_push(arena, &unit->voff_ranges, range); + } + } + } + scratch_end(scratch); + return out; +} + +//////////////////////////////// +//~ rjf: Link Name Map Building Tasks internal void * p2r_link_name_map_build_task__entry_point(Arena *arena, void *p) @@ -883,27 +1007,53 @@ p2r_itype_chain_build_task__entry_point(Arena *arena, void *p) { CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; - // rjf: push dependent itypes to chain + // rjf: push return itypes to chain { P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); c->itype = lf->ret_itype; SLLStackPush(in->itype_chains[itype], c); } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLStackPush(in->itype_chains[itype], c); - } - // rjf: push task to walk dependency itypes + // rjf: push task to walk return itype { P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); c->itype = lf->ret_itype; SLLQueuePush(first_walk_task, last_walk_task, c); } + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: push arg types to chain + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk arg types + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) { P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; + c->itype = arglist_itypes_base[idx]; SLLQueuePush(first_walk_task, last_walk_task, c); } }break; @@ -1845,67 +1995,77 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) } ////////////////////////////////////////////////////////////// - //- rjf: do initial independent parsing & preparation passes + //- rjf: kickoff EXE hash + // + P2R_EXEHashIn exe_hash_in = {in->input_exe_data}; + TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, 0, &exe_hash_in); + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff TPI hash parse + // + P2R_TPIHashParseIn tpi_hash_in = {0}; + { + tpi_hash_in.strtbl = strtbl; + tpi_hash_in.tpi = tpi; + tpi_hash_in.hash_data = msf_data_from_stream(msf, tpi->hash_sn); + tpi_hash_in.aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); + } + TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &tpi_hash_in); + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff TPI leaf parse + // + P2R_TPILeafParseIn tpi_leaf_in = {0}; + { + tpi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(tpi); + tpi_leaf_in.itype_first = tpi->itype_first; + } + TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &tpi_leaf_in); + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff IPI hash parse + // + P2R_TPIHashParseIn ipi_hash_in = {0}; + { + ipi_hash_in.strtbl = strtbl; + ipi_hash_in.tpi = ipi; + ipi_hash_in.hash_data = msf_data_from_stream(msf, ipi->hash_sn); + ipi_hash_in.aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); + } + TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &ipi_hash_in); + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff IPI leaf parse + // + P2R_TPILeafParseIn ipi_leaf_in = {0}; + { + ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); + ipi_leaf_in.itype_first = ipi->itype_first; + } + TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &ipi_leaf_in); + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff top-level global symbol stream parse + // + P2R_SymbolStreamParseIn sym_parse_in = {dbi ? msf_data_from_stream(msf, dbi->sym_sn) : str8_zero()}; + TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, 0, &sym_parse_in); + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff compilation unit parses + // + P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()}; + P2R_CompUnitContributionsParseIn comp_unit_contributions_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon) : str8_zero(), coff_sections}; + TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, 0, &comp_unit_parse_in); + TS_Ticket comp_unit_contributions_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_contributions_parse_task__entry_point, 0, &comp_unit_contributions_parse_in); + + ////////////////////////////////////////////////////////////// + //- rjf: join compilation unit parses // - U64 exe_hash = 0; - PDB_TpiHashParsed *tpi_hash = 0; - CV_LeafParsed *tpi_leaf = 0; - PDB_TpiHashParsed *ipi_hash = 0; - CV_LeafParsed *ipi_leaf = 0; - CV_SymParsed *sym = 0; PDB_CompUnitArray *comp_units = 0; U64 comp_unit_count = 0; PDB_CompUnitContributionArray *comp_unit_contributions = 0; U64 comp_unit_contribution_count = 0; - ProfScope("do initial independent parsing & preparation passess") { - //- rjf: form task inputs - P2R_EXEHashIn exe_hash_in = {in->input_exe_data}; - P2R_TPIHashParseIn tpi_hash_in = {0}; - { - tpi_hash_in.strtbl = strtbl; - tpi_hash_in.tpi = tpi; - tpi_hash_in.hash_data = msf_data_from_stream(msf, tpi->hash_sn); - tpi_hash_in.aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); - } - P2R_TPILeafParseIn tpi_leaf_in = {0}; - { - tpi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(tpi); - tpi_leaf_in.itype_first = tpi->itype_first; - } - P2R_TPIHashParseIn ipi_hash_in = {0}; - { - ipi_hash_in.strtbl = strtbl; - ipi_hash_in.tpi = ipi; - ipi_hash_in.hash_data = msf_data_from_stream(msf, ipi->hash_sn); - ipi_hash_in.aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); - } - P2R_TPILeafParseIn ipi_leaf_in = {0}; - { - ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); - ipi_leaf_in.itype_first = ipi->itype_first; - } - P2R_SymbolStreamParseIn sym_parse_in = {dbi ? msf_data_from_stream(msf, dbi->sym_sn) : str8_zero()}; - P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()}; - P2R_CompUnitContributionsParseIn comp_unit_contributions_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon) : str8_zero(), coff_sections}; - - //- rjf: kick off tasks - TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, 0, &exe_hash_in); - TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &tpi_hash_in); - TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &tpi_leaf_in); - TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &ipi_hash_in); - TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &ipi_leaf_in); - TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, 0, &sym_parse_in); - TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, 0, &comp_unit_parse_in); - TS_Ticket comp_unit_contributions_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_contributions_parse_task__entry_point, 0, &comp_unit_contributions_parse_in); - - //- rjf: join tasks - exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); - tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); - tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); - ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); - ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); - sym = ts_join_struct(sym_parse_ticket, max_U64, CV_SymParsed); comp_units = ts_join_struct(comp_unit_parse_ticket, max_U64, PDB_CompUnitArray); comp_unit_contributions = ts_join_struct(comp_unit_contributions_parse_ticket, max_U64, PDB_CompUnitContributionArray); comp_unit_count = comp_units ? comp_units->count : 0; @@ -1989,6 +2149,11 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) arch_addr_size = rdi_addr_size_from_arch(arch); } + ////////////////////////////////////////////////////////////// + //- rjf: join EXE hash + // + U64 exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); + ////////////////////////////////////////////////////////////// //- rjf: produce top-level-info // @@ -2023,121 +2188,15 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) } ////////////////////////////////////////////////////////////// - //- rjf: build units, initial src file map, & collect unit source files + //- rjf: kick off unit conversion & source file collection // - P2R_SrcFileMap src_file_map = {0}; - RDIM_UnitChunkList all_units = {0}; - RDIM_SrcFileChunkList all_src_files = {0}; - ProfScope("build units, initial src file map, & collect unit source files") - { - U64 units_chunk_cap = comp_unit_count; - src_file_map.slots_count = 65536; - src_file_map.slots = push_array(scratch.arena, P2R_SrcFileNode *, src_file_map.slots_count); - - //- rjf: pass 1: fill basic per-unit info & line info - for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) - { - PDB_CompUnit *pdb_unit = comp_units->units[comp_unit_idx]; - CV_SymParsed *pdb_unit_sym = sym_for_unit[comp_unit_idx]; - CV_C13Parsed *pdb_unit_c13 = c13_for_unit[comp_unit_idx]; - - //- rjf: produce unit name - String8 unit_name = pdb_unit->obj_name; - if(unit_name.size != 0) - { - String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); - if(unit_name_past_last_slash.size != 0) - { - unit_name = unit_name_past_last_slash; - } - } - - //- rjf: produce obj name - String8 obj_name = pdb_unit->obj_name; - if(str8_match(obj_name, str8_lit("* Linker *"), 0) || - str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) - { - MemoryZeroStruct(&obj_name); - } - - //- rjf: build unit - RDIM_Unit *dst_unit = rdim_unit_chunk_list_push(arena, &all_units, units_chunk_cap); - dst_unit->unit_name = unit_name; - dst_unit->compiler_name = pdb_unit_sym->info.compiler_name; - dst_unit->object_file = obj_name; - dst_unit->archive_file = pdb_unit->group_name; - dst_unit->language = p2r_rdi_language_from_cv_language(sym->info.language); - - //- rjf: fill unit line info - for(CV_C13SubSectionNode *node = pdb_unit_c13->first_sub_section; - node != 0; - node = node->next) - { - if(node->kind == CV_C13_SubSectionKind_Lines) - { - for(CV_C13LinesParsedNode *lines_n = node->lines_first; - lines_n != 0; - lines_n = lines_n->next) - { - CV_C13LinesParsed *lines = &lines_n->v; - - // rjf: file name -> normalized file path - String8 file_path = lines->file_name; - String8 file_path_normalized = lower_from_str8(scratch.arena, str8_skip_chop_whitespace(file_path)); - for(U64 idx = 0; idx < file_path_normalized.size; idx += 1) - { - if(file_path_normalized.str[idx] == '\\') - { - file_path_normalized.str[idx] = '/'; - } - } - - // rjf: normalized file path -> source file node - U64 file_path_normalized_hash = rdi_hash(file_path_normalized.str, file_path_normalized.size); - U64 src_file_slot = file_path_normalized_hash%src_file_map.slots_count; - P2R_SrcFileNode *src_file_node = 0; - for(P2R_SrcFileNode *n = src_file_map.slots[src_file_slot]; n != 0; n = n->next) - { - if(str8_match(n->src_file->normal_full_path, file_path_normalized, 0)) - { - src_file_node = n; - break; - } - } - if(src_file_node == 0) - { - src_file_node = push_array(scratch.arena, P2R_SrcFileNode, 1); - SLLStackPush(src_file_map.slots[src_file_slot], src_file_node); - src_file_node->src_file = rdim_src_file_chunk_list_push(arena, &all_src_files, 4096); - src_file_node->src_file->normal_full_path = push_str8_copy(arena, file_path_normalized); - } - - // rjf: build sequence - RDIM_LineSequence *seq = rdim_line_sequence_list_push(arena, &dst_unit->line_sequences); - rdim_src_file_push_line_sequence(arena, &all_src_files, src_file_node->src_file, seq); - seq->src_file = src_file_node->src_file; - seq->voffs = lines->voffs; - seq->line_nums = lines->line_nums; - seq->col_nums = lines->col_nums; - seq->line_count = lines->line_count; - } - } - } - } - - //- rjf: pass 2: build per-unit voff ranges from comp unit contributions table - PDB_CompUnitContribution *contrib_ptr = comp_unit_contributions->contributions; - PDB_CompUnitContribution *contrib_opl = contrib_ptr + comp_unit_contribution_count; - for(;contrib_ptr < contrib_opl; contrib_ptr += 1) - { - if(contrib_ptr->mod < comp_unit_count) - { - RDIM_Unit *unit = &all_units.first->v[contrib_ptr->mod]; - RDIM_Rng1U64 range = {contrib_ptr->voff_first, contrib_ptr->voff_opl}; - rdim_rng1u64_list_push(arena, &unit->voff_ranges, range); - } - } - } + P2R_UnitConvertIn unit_convert_in = {comp_units, comp_unit_contributions, sym_for_unit, c13_for_unit}; + TS_Ticket unit_convert_ticket = ts_kickoff(p2r_units_convert_task__entry_point, 0, &unit_convert_in); + + ////////////////////////////////////////////////////////////// + //- rjf: join global sym stream parse + // + CV_SymParsed *sym = ts_join_struct(sym_parse_ticket, max_U64, CV_SymParsed); ////////////////////////////// //- rjf: predict symbol count @@ -2178,6 +2237,20 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) link_name_map_ticket = ts_kickoff(p2r_link_name_map_build_task__entry_point, 0, &link_name_map_build_in); } + ////////////////////////////////////////////////////////////// + //- rjf: join ipi/tpi hash/leaf parses + // + PDB_TpiHashParsed *tpi_hash = 0; + CV_LeafParsed *tpi_leaf = 0; + PDB_TpiHashParsed *ipi_hash = 0; + CV_LeafParsed *ipi_leaf = 0; + { + tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); + tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); + ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); + ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); + } + ////////////////////////////////////////////////////////////// //- rjf: types pass 1: produce type forward resolution map // @@ -3352,6 +3425,18 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) } } + ////////////////////////////////////////////////////////////// + //- rjf: join unit conversion & src file tasks + // + RDIM_UnitChunkList all_units = {0}; + RDIM_SrcFileChunkList all_src_files = {0}; + ProfScope("join unit conversion & src file tasks") + { + P2R_UnitConvertOut *out = ts_join_struct(unit_convert_ticket, max_U64, P2R_UnitConvertOut); + all_units = out->units; + all_src_files = out->src_files; + } + ////////////////////////////////////////////////////////////// //- rjf: fill output // diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 9041f5ce..064a3b89 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -152,6 +152,24 @@ struct P2R_SrcFileMap U64 slots_count; }; +//- rjf: unit conversion tasks + +typedef struct P2R_UnitConvertIn P2R_UnitConvertIn; +struct P2R_UnitConvertIn +{ + PDB_CompUnitArray *comp_units; + PDB_CompUnitContributionArray *comp_unit_contributions; + CV_SymParsed **comp_unit_syms; + CV_C13Parsed **comp_unit_c13s; +}; + +typedef struct P2R_UnitConvertOut P2R_UnitConvertOut; +struct P2R_UnitConvertOut +{ + RDIM_UnitChunkList units; + RDIM_SrcFileChunkList src_files; +}; + //- rjf: link name map building tasks typedef struct P2R_LinkNameMapBuildIn P2R_LinkNameMapBuildIn; @@ -386,7 +404,12 @@ internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); internal void *p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p); //////////////////////////////// -//~ rjf: Link Name Map Building Task +//~ rjf: Unit Conversion Tasks + +internal void *p2r_units_convert_task__entry_point(Arena *arena, void *p); + +//////////////////////////////// +//~ rjf: Link Name Map Building Tasks internal void *p2r_link_name_map_build_task__entry_point(Arena *arena, void *p); From bcbd01bf2c7e607ac745ff14d7f9e0d08f96aee8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 15:37:50 -0800 Subject: [PATCH 122/275] eliminate type revisiting task list, just iterate itypes again - in preparation for dividing up the itype stream and doing udt building in parallel --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 117 +++++++++++++----------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 5 + 2 files changed, 68 insertions(+), 54 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index c95ff864..ef8f25fe 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1175,6 +1175,15 @@ p2r_itype_chain_build_task__entry_point(Arena *arena, void *p) return 0; } +//////////////////////////////// +//~ rjf: UDT Conversion Tasks + +internal void * +p2r_udt_convert_task__entry_point(Arena *arena, void *p) +{ + +} + //////////////////////////////// //~ rjf: Symbol Stream Conversion Path & Thread @@ -2337,15 +2346,6 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // subsequent passes, to build RADDBGI "UDT" information, which is distinct // from regular type info. // - typedef struct P2R_TypeIdRevisitTask P2R_TypeIdRevisitTask; - struct P2R_TypeIdRevisitTask - { - P2R_TypeIdRevisitTask *next; - RDIM_Type *base_type; - CV_TypeId field_itype; - }; - P2R_TypeIdRevisitTask *first_itype_revisit_task = 0; - P2R_TypeIdRevisitTask *last_itype_revisit_task = 0; RDIM_Type **itype_type_ptrs = 0; RDIM_TypeChunkList all_types = {0}; #define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) @@ -2671,15 +2671,6 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) dst_type->byte_size = (U32)size_u64; dst_type->name = name; } - - // rjf: push revisit task for members - if(!(lf->props & CV_TypeProp_FwdRef)) - { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = lf->field_itype; - } }break; //- rjf: CLASS2/STRUCT2 @@ -2709,15 +2700,6 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) dst_type->byte_size = (U32)size_u64; dst_type->name = name; } - - // rjf: push revisit task for members - if(!(lf->props & CV_TypeProp_FwdRef)) - { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = lf->field_itype; - } }break; //- rjf: UNION @@ -2746,15 +2728,6 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) dst_type->byte_size = (U32)size_u64; dst_type->name = name; } - - // rjf: push revisit task for members - if(!(lf->props & CV_TypeProp_FwdRef)) - { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = lf->field_itype; - } }break; //- rjf: ENUM @@ -2782,15 +2755,6 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) dst_type->byte_size = direct_type ? direct_type->byte_size : 0; dst_type->name = name; } - - // rjf: push revisit task for enumerates - if(!(lf->props & CV_TypeProp_FwdRef)) - { - P2R_TypeIdRevisitTask *t = push_array(scratch.arena, P2R_TypeIdRevisitTask, 1); - SLLQueuePush(first_itype_revisit_task, last_itype_revisit_task, t); - t->base_type = dst_type; - t->field_itype = lf->field_itype; - } }break; } } @@ -2809,19 +2773,64 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) ProfScope("types pass 4: build UDTs") { RDI_U64 udts_chunk_cap = 1024; - for(P2R_TypeIdRevisitTask *task = first_itype_revisit_task; task != 0; task = task->next) + for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) { - RDIM_Type *dst_type = task->base_type; - switch(dst_type->kind) + //- rjf: grab type for this itype - skip if empty + RDIM_Type *dst_type = itype_type_ptrs[itype]; + if(dst_type == 0) { continue; } + + //- rjf: unpack itype leaf range - skip if out-of-range + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + if(range->off+range->hdr.size > tpi_leaf->data.size || + range->off+2+header_struct_size > tpi_leaf->data.size || + range->hdr.size < 2) + { + continue; + } + + //- rjf: build UDT + CV_TypeId field_itype = 0; + switch(kind) { default:{}break; //////////////////////// //- rjf: structs/unions/classes -> equip members // - case RDI_TypeKind_Struct: - case RDI_TypeKind_Union: - case RDI_TypeKind_Class: + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + case CV_LeafKind_UNION: + { + CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + equip_members: { //- rjf: grab UDT info RDIM_UDT *dst_udt = dst_type->udt; @@ -2838,7 +2847,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) FieldListTask *next; CV_TypeId itype; }; - FieldListTask start_fl_task = {0, task->field_itype}; + FieldListTask start_fl_task = {0, field_itype}; FieldListTask *fl_todo_stack = &start_fl_task; FieldListTask *fl_done_stack = 0; for(;fl_todo_stack != 0;) @@ -3219,7 +3228,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //////////////////////// //- rjf: enums -> equip enumerates // - case RDI_TypeKind_Enum: + case CV_LeafKind_ENUM: { //- rjf: grab UDT info RDIM_UDT *dst_udt = dst_type->udt; @@ -3236,7 +3245,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) FieldListTask *next; CV_TypeId itype; }; - FieldListTask start_fl_task = {0, task->field_itype}; + FieldListTask start_fl_task = {0, field_itype}; FieldListTask *fl_todo_stack = &start_fl_task; FieldListTask *fl_done_stack = 0; for(;fl_todo_stack != 0;) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 064a3b89..a79095f2 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -419,6 +419,11 @@ internal void *p2r_link_name_map_build_task__entry_point(Arena *arena, void *p); internal void *p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p); internal void *p2r_itype_chain_build_task__entry_point(Arena *arena, void *p); +//////////////////////////////// +//~ rjf: UDT Conversion Tasks + +internal void *p2r_udt_convert_task__entry_point(Arena *arena, void *p); + //////////////////////////////// //~ rjf: Symbol Stream Conversion Tasks From fe1e0cc2fdf62cd9e03d284f8f16f26f7347eda9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 15:49:46 -0800 Subject: [PATCH 123/275] move udt info conversion to task threads, divide up itype stream and do it wide --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 634 +++++++++++++++++++++++- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 12 + 2 files changed, 645 insertions(+), 1 deletion(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index ef8f25fe..c517571f 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1181,7 +1181,614 @@ p2r_itype_chain_build_task__entry_point(Arena *arena, void *p) internal void * p2r_udt_convert_task__entry_point(Arena *arena, void *p) { - + P2R_UDTConvertIn *in = (P2R_UDTConvertIn *)p; +#define p2r_type_ptr_from_itype(itype) (((itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) + RDIM_UDTChunkList *udts = push_array(arena, RDIM_UDTChunkList, 1); + RDI_U64 udts_chunk_cap = 1024; + ProfScope("convert UDT info") + { + for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) + { + //- rjf: skip basics + if(itype < in->tpi_leaf->itype_first) { continue; } + + //- rjf: grab type for this itype - skip if empty + RDIM_Type *dst_type = in->itype_type_ptrs[itype]; + if(dst_type == 0) { continue; } + + //- rjf: unpack itype leaf range - skip if out-of-range + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[itype-in->tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + if(range->off+range->hdr.size > in->tpi_leaf->data.size || + range->off+2+header_struct_size > in->tpi_leaf->data.size || + range->hdr.size < 2) + { + continue; + } + + //- rjf: build UDT + CV_TypeId field_itype = 0; + switch(kind) + { + default:{}break; + + //////////////////////// + //- rjf: structs/unions/classes -> equip members + // + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + case CV_LeafKind_UNION: + { + CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + equip_members: + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: grab UDT info + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); + dst_udt->self_type = dst_type; + } + + //- rjf: gather all fields + typedef struct FieldListTask FieldListTask; + struct FieldListTask + { + FieldListTask *next; + CV_TypeId itype; + }; + FieldListTask start_fl_task = {0, field_itype}; + FieldListTask *fl_todo_stack = &start_fl_task; + FieldListTask *fl_done_stack = 0; + for(;fl_todo_stack != 0;) + { + //- rjf: take & unpack task + FieldListTask *fl_task = fl_todo_stack; + SLLStackPop(fl_todo_stack); + SLLStackPush(fl_done_stack, fl_task); + CV_TypeId field_list_itype = fl_task->itype; + + //- rjf: skip bad itypes + if(field_list_itype < in->tpi_leaf->itype_first || in->tpi_leaf->itype_opl <= field_list_itype) + { + continue; + } + + //- rjf: field list itype -> range + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[field_list_itype-in->tpi_leaf->itype_first]; + + //- rjf: skip bad headers + if(range->off+range->hdr.size > in->tpi_leaf->data.size || + range->hdr.size < 2 || + range->hdr.kind != CV_LeafKind_FIELDLIST) + { + continue; + } + + //- rjf: loop over all fields + { + U8 *field_list_first = in->tpi_leaf->data.str+range->off+2; + U8 *field_list_opl = field_list_first+range->hdr.size-2; + for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; + read_ptr < field_list_opl; + read_ptr = next_read_ptr) + { + // rjf: unpack field + CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; + U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); + U8 *field_leaf_first = read_ptr+2; + U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; + next_read_ptr = field_leaf_opl; + + // rjf: skip out-of-bounds fields + if(field_leaf_first+field_leaf_header_size > field_list_opl) + { + continue; + } + + // rjf: process field + switch(field_kind) + { + //- rjf: unhandled/invalid cases + default: + { + // TODO(rjf): log + }break; + + //- rjf: INDEX + case CV_LeafKind_INDEX: + { + // rjf: unpack leaf + CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; + CV_TypeId new_itype = lf->itype; + + // rjf: determine if index itype is new + B32 is_new = 1; + for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) + { + if(t->itype == new_itype) + { + is_new = 0; + break; + } + } + + // rjf: if new -> push task to follow new itype + if(is_new) + { + FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); + SLLStackPush(fl_todo_stack, new_task); + new_task->itype = new_itype; + } + }break; + + //- rjf: MEMBER + case CV_LeafKind_MEMBER: + { + // TODO(rjf): log on bad offset + + // rjf: unpack leaf + CV_LeafMember *lf = (CV_LeafMember *)field_leaf_first; + U8 *offset_ptr = (U8 *)(lf+1); + CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); + U64 offset64 = cv_u64_from_numeric(&offset); + U8 *name_ptr = offset_ptr + offset.encoded_size; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_DataField; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + mem->off = (U32)offset64; + }break; + + //- rjf: STMEMBER + case CV_LeafKind_STMEMBER: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafStMember *lf = (CV_LeafStMember *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticData; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: METHOD + case CV_LeafKind_METHOD: + { + // rjf: unpack leaf + CV_LeafMethod *lf = (CV_LeafMethod *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + //- rjf: method list itype -> range + CV_RecRange *method_list_range = &in->tpi_leaf->leaf_ranges.ranges[lf->list_itype-in->tpi_leaf->itype_first]; + + //- rjf: skip bad method lists + if(method_list_range->off+method_list_range->hdr.size > in->tpi_leaf->data.size || + method_list_range->hdr.size < 2 || + method_list_range->hdr.kind != CV_LeafKind_METHODLIST) + { + break; + } + + //- rjf: loop through all methods & emit members + U8 *method_list_first = in->tpi_leaf->data.str + method_list_range->off + 2; + U8 *method_list_opl = method_list_first + method_list_range->hdr.size-2; + for(U8 *method_read_ptr = method_list_first, *next_method_read_ptr = method_list_opl; + method_read_ptr < method_list_opl; + method_read_ptr = next_method_read_ptr) + { + CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)method_read_ptr; + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); + RDIM_Type *method_type = p2r_type_ptr_from_itype(method->itype); + next_method_read_ptr = (U8 *)(method+1); + + // TODO(allen): PROBLEM + // We only get offsets for virtual functions (the "vbaseoff") from + // "Intro" and "PureIntro". In C++ inheritance, when we have a chain + // of inheritance (let's just talk single inheritance for now) the + // first class in the chain that introduces a new virtual function + // has this "Intro" method. If a later class in the chain redefines + // the virtual function it only has a "Virtual" method which does + // not update the offset. There is a "Virtual" and "PureVirtual" + // variant of "Virtual". The "Pure" in either case means there + // is no concrete procedure. When there is no "Pure" the method + // should have a corresponding procedure symbol id. + // + // The issue is we will want to mark all of our virtual methods as + // virtual and give them an offset, but that means we have to do + // some extra figuring to propogate offsets from "Intro" methods + // to "Virtual" methods in inheritance trees. That is - IF we want + // to start preserving the offsets of virtuals. There is room in + // the method struct to make this work, but for now I've just + // decided to drop this information. It is not urgently useful to + // us and greatly complicates matters. + + // rjf: read vbaseoff + U32 vbaseoff = 0; + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + if(next_method_read_ptr+4 <= method_list_opl) + { + vbaseoff = *(U32 *)next_method_read_ptr; + } + next_method_read_ptr += 4; + } + + // rjf: emit method + switch(prop) + { + default: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Method; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Static: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticMethod; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Virtual: + case CV_MethodProp_PureVirtual: + case CV_MethodProp_Intro: + case CV_MethodProp_PureIntro: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualMethod; + mem->name = name; + mem->type = method_type; + }break; + } + } + + }break; + + //- rjf: ONEMETHOD + case CV_LeafKind_ONEMETHOD: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafOneMethod *lf = (CV_LeafOneMethod *)field_leaf_first; + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(lf->attribs); + U8 *vbaseoff_ptr = (U8 *)(lf+1); + U8 *vbaseoff_opl_ptr = vbaseoff_ptr; + U32 vbaseoff = 0; + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + vbaseoff = *(U32 *)(vbaseoff_ptr); + vbaseoff_opl_ptr += sizeof(U32); + } + U8 *name_ptr = vbaseoff_opl_ptr; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + RDIM_Type *method_type = p2r_type_ptr_from_itype(lf->itype); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit method + switch(prop) + { + default: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Method; + mem->name = name; + mem->type = method_type; + }break; + + case CV_MethodProp_Static: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticMethod; + mem->name = name; + mem->type = method_type; + }break; + + case CV_MethodProp_Virtual: + case CV_MethodProp_PureVirtual: + case CV_MethodProp_Intro: + case CV_MethodProp_PureIntro: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualMethod; + mem->name = name; + mem->type = method_type; + }break; + } + }break; + + //- rjf: NESTTYPE + case CV_LeafKind_NESTTYPE: + { + // rjf: unpack leaf + CV_LeafNestType *lf = (CV_LeafNestType *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_NestedType; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: NESTTYPEEX + case CV_LeafKind_NESTTYPEEX: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafNestTypeEx *lf = (CV_LeafNestTypeEx *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_NestedType; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: BCLASS + case CV_LeafKind_BCLASS: + { + // TODO(rjf): log on bad offset + + // rjf: unpack leaf + CV_LeafBClass *lf = (CV_LeafBClass *)field_leaf_first; + U8 *offset_ptr = (U8 *)(lf+1); + CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); + U64 offset64 = cv_u64_from_numeric(&offset); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = offset_ptr+offset.encoded_size; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Base; + mem->type = p2r_type_ptr_from_itype(lf->itype); + mem->off = (U32)offset64; + }break; + + //- rjf: VBCLASS/IVBCLASS + case CV_LeafKind_VBCLASS: + case CV_LeafKind_IVBCLASS: + { + // TODO(rjf): log on bad offsets + // TODO(rjf): handle attribs + // TODO(rjf): offsets? + + // rjf: unpack leaf + CV_LeafVBClass *lf = (CV_LeafVBClass *)field_leaf_first; + U8 *num1_ptr = (U8 *)(lf+1); + CV_NumericParsed num1 = cv_numeric_from_data_range(num1_ptr, field_leaf_opl); + U8 *num2_ptr = num1_ptr + num1.encoded_size; + CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualBase; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: VFUNCTAB + case CV_LeafKind_VFUNCTAB: + { + CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first; + // NOTE(rjf): currently no-op this case + (void)lf; + }break; + } + + // rjf: align-up next field + next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); + } + } + } + + scratch_end(scratch); + }break; + + //////////////////////// + //- rjf: enums -> equip enumerates + // + case CV_LeafKind_ENUM: + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: grab UDT info + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); + dst_udt->self_type = dst_type; + } + + //- rjf: gather all fields + typedef struct FieldListTask FieldListTask; + struct FieldListTask + { + FieldListTask *next; + CV_TypeId itype; + }; + FieldListTask start_fl_task = {0, field_itype}; + FieldListTask *fl_todo_stack = &start_fl_task; + FieldListTask *fl_done_stack = 0; + for(;fl_todo_stack != 0;) + { + //- rjf: take & unpack task + FieldListTask *fl_task = fl_todo_stack; + SLLStackPop(fl_todo_stack); + SLLStackPush(fl_done_stack, fl_task); + CV_TypeId field_list_itype = fl_task->itype; + + //- rjf: skip bad itypes + if(field_list_itype < in->tpi_leaf->itype_first || in->tpi_leaf->itype_opl <= field_list_itype) + { + continue; + } + + //- rjf: field list itype -> range + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[field_list_itype-in->tpi_leaf->itype_first]; + + //- rjf: skip bad headers + if(range->off+range->hdr.size > in->tpi_leaf->data.size || + range->hdr.size < 2 || + range->hdr.kind != CV_LeafKind_FIELDLIST) + { + continue; + } + + //- rjf: loop over all fields + { + U8 *field_list_first = in->tpi_leaf->data.str+range->off+2; + U8 *field_list_opl = field_list_first+range->hdr.size-2; + for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; + read_ptr < field_list_opl; + read_ptr = next_read_ptr) + { + // rjf: unpack field + CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; + U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); + U8 *field_leaf_first = read_ptr+2; + U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; + next_read_ptr = field_leaf_opl; + + // rjf: skip out-of-bounds fields + if(field_leaf_first+field_leaf_header_size > field_list_opl) + { + continue; + } + + // rjf: process field + switch(field_kind) + { + //- rjf: unhandled/invalid cases + default: + { + // TODO(rjf): log + }break; + + //- rjf: INDEX + case CV_LeafKind_INDEX: + { + // rjf: unpack leaf + CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; + CV_TypeId new_itype = lf->itype; + + // rjf: determine if index itype is new + B32 is_new = 1; + for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) + { + if(t->itype == new_itype) + { + is_new = 0; + break; + } + } + + // rjf: if new -> push task to follow new itype + if(is_new) + { + FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); + SLLStackPush(fl_todo_stack, new_task); + new_task->itype = new_itype; + } + }break; + + //- rjf: ENUMERATE + case CV_LeafKind_ENUMERATE: + { + // TODO(rjf): attribs + + // rjf: unpack leaf + CV_LeafEnumerate *lf = (CV_LeafEnumerate *)field_leaf_first; + U8 *val_ptr = (U8 *)(lf+1); + CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, field_leaf_opl); + U64 val64 = cv_u64_from_numeric(&val); + U8 *name_ptr = val_ptr + val.encoded_size; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt); + enum_val->name = name; + enum_val->val = val64; + }break; + } + + // rjf: align-up next field + next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); + } + } + } + + scratch_end(scratch); + }break; + } + } + } +#undef p2r_type_ptr_from_itype + return udts; } //////////////////////////////// @@ -2772,6 +3379,30 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) RDIM_UDTChunkList all_udts = {0}; ProfScope("types pass 4: build UDTs") { + //- rjf: kick off tasks + U64 task_size_itypes = 4096; + U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; + P2R_UDTConvertIn *tasks_inputs = push_array(scratch.arena, P2R_UDTConvertIn, tasks_count); + TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + tasks_inputs[idx].tpi_leaf = tpi_leaf; + tasks_inputs[idx].itype_first = idx*task_size_itypes; + tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; + tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); + tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; + tasks_tickets[idx] = ts_kickoff(p2r_udt_convert_task__entry_point, 0, &tasks_inputs[idx]); + } + + //- rjf: join all tasks + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + RDIM_UDTChunkList *udts = ts_join_struct(tasks_tickets[idx], max_U64, RDIM_UDTChunkList); + rdim_udt_chunk_list_concat_in_place(&all_udts, udts); + } + +#if 0 RDI_U64 udts_chunk_cap = 1024; for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) { @@ -3361,6 +3992,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) }break; } } +#endif } ////////////////////////////////////////////////////////////// diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index a79095f2..86a9f9e2 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -211,6 +211,18 @@ struct P2R_ITypeChainBuildIn P2R_TypeIdChain **itype_chains; }; +//- rjf: udt conversion + +typedef struct P2R_UDTConvertIn P2R_UDTConvertIn; +struct P2R_UDTConvertIn +{ + CV_LeafParsed *tpi_leaf; + CV_TypeId itype_first; + CV_TypeId itype_opl; + CV_TypeId *itype_fwd_map; + RDIM_Type **itype_type_ptrs; +}; + //- rjf: symbol stream conversion typedef struct P2R_SymbolStreamConvertIn P2R_SymbolStreamConvertIn; From 7facfb7d087e3958bb128b4184b55a1bc20a1011 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 15:50:07 -0800 Subject: [PATCH 124/275] kill single threaded udt conversion code --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 592 ------------------------ 1 file changed, 592 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index c517571f..ebf0ce89 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3401,598 +3401,6 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) RDIM_UDTChunkList *udts = ts_join_struct(tasks_tickets[idx], max_U64, RDIM_UDTChunkList); rdim_udt_chunk_list_concat_in_place(&all_udts, udts); } - -#if 0 - RDI_U64 udts_chunk_cap = 1024; - for(CV_TypeId itype = itype_first; itype < itype_opl; itype += 1) - { - //- rjf: grab type for this itype - skip if empty - RDIM_Type *dst_type = itype_type_ptrs[itype]; - if(dst_type == 0) { continue; } - - //- rjf: unpack itype leaf range - skip if out-of-range - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - if(range->off+range->hdr.size > tpi_leaf->data.size || - range->off+2+header_struct_size > tpi_leaf->data.size || - range->hdr.size < 2) - { - continue; - } - - //- rjf: build UDT - CV_TypeId field_itype = 0; - switch(kind) - { - default:{}break; - - //////////////////////// - //- rjf: structs/unions/classes -> equip members - // - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - }goto equip_members; - case CV_LeafKind_UNION: - { - CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - }goto equip_members; - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - }goto equip_members; - equip_members: - { - //- rjf: grab UDT info - RDIM_UDT *dst_udt = dst_type->udt; - if(dst_udt == 0) - { - dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, &all_udts, udts_chunk_cap); - dst_udt->self_type = dst_type; - } - - //- rjf: gather all fields - typedef struct FieldListTask FieldListTask; - struct FieldListTask - { - FieldListTask *next; - CV_TypeId itype; - }; - FieldListTask start_fl_task = {0, field_itype}; - FieldListTask *fl_todo_stack = &start_fl_task; - FieldListTask *fl_done_stack = 0; - for(;fl_todo_stack != 0;) - { - //- rjf: take & unpack task - FieldListTask *fl_task = fl_todo_stack; - SLLStackPop(fl_todo_stack); - SLLStackPush(fl_done_stack, fl_task); - CV_TypeId field_list_itype = fl_task->itype; - - //- rjf: skip bad itypes - if(field_list_itype < itype_first || itype_opl <= field_list_itype) - { - continue; - } - - //- rjf: field list itype -> range - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-itype_first]; - - //- rjf: skip bad headers - if(range->off+range->hdr.size > tpi_leaf->data.size || - range->hdr.size < 2 || - range->hdr.kind != CV_LeafKind_FIELDLIST) - { - continue; - } - - //- rjf: loop over all fields - { - U8 *field_list_first = tpi_leaf->data.str+range->off+2; - U8 *field_list_opl = field_list_first+range->hdr.size-2; - for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; - read_ptr < field_list_opl; - read_ptr = next_read_ptr) - { - // rjf: unpack field - CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; - U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); - U8 *field_leaf_first = read_ptr+2; - U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; - next_read_ptr = field_leaf_opl; - - // rjf: skip out-of-bounds fields - if(field_leaf_first+field_leaf_header_size > field_list_opl) - { - continue; - } - - // rjf: process field - switch(field_kind) - { - //- rjf: unhandled/invalid cases - default: - { - // TODO(rjf): log - }break; - - //- rjf: INDEX - case CV_LeafKind_INDEX: - { - // rjf: unpack leaf - CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; - CV_TypeId new_itype = lf->itype; - - // rjf: determine if index itype is new - B32 is_new = 1; - for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) - { - if(t->itype == new_itype) - { - is_new = 0; - break; - } - } - - // rjf: if new -> push task to follow new itype - if(is_new) - { - FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); - SLLStackPush(fl_todo_stack, new_task); - new_task->itype = new_itype; - } - }break; - - //- rjf: MEMBER - case CV_LeafKind_MEMBER: - { - // TODO(rjf): log on bad offset - - // rjf: unpack leaf - CV_LeafMember *lf = (CV_LeafMember *)field_leaf_first; - U8 *offset_ptr = (U8 *)(lf+1); - CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); - U64 offset64 = cv_u64_from_numeric(&offset); - U8 *name_ptr = offset_ptr + offset.encoded_size; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_DataField; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - mem->off = (U32)offset64; - }break; - - //- rjf: STMEMBER - case CV_LeafKind_STMEMBER: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafStMember *lf = (CV_LeafStMember *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_StaticData; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: METHOD - case CV_LeafKind_METHOD: - { - // rjf: unpack leaf - CV_LeafMethod *lf = (CV_LeafMethod *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - //- rjf: method list itype -> range - CV_RecRange *method_list_range = &tpi_leaf->leaf_ranges.ranges[lf->list_itype-itype_first]; - - //- rjf: skip bad method lists - if(method_list_range->off+method_list_range->hdr.size > tpi_leaf->data.size || - method_list_range->hdr.size < 2 || - method_list_range->hdr.kind != CV_LeafKind_METHODLIST) - { - break; - } - - //- rjf: loop through all methods & emit members - U8 *method_list_first = tpi_leaf->data.str + method_list_range->off + 2; - U8 *method_list_opl = method_list_first + method_list_range->hdr.size-2; - for(U8 *method_read_ptr = method_list_first, *next_method_read_ptr = method_list_opl; - method_read_ptr < method_list_opl; - method_read_ptr = next_method_read_ptr) - { - CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)method_read_ptr; - CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); - RDIM_Type *method_type = p2r_type_ptr_from_itype(method->itype); - next_method_read_ptr = (U8 *)(method+1); - - // TODO(allen): PROBLEM - // We only get offsets for virtual functions (the "vbaseoff") from - // "Intro" and "PureIntro". In C++ inheritance, when we have a chain - // of inheritance (let's just talk single inheritance for now) the - // first class in the chain that introduces a new virtual function - // has this "Intro" method. If a later class in the chain redefines - // the virtual function it only has a "Virtual" method which does - // not update the offset. There is a "Virtual" and "PureVirtual" - // variant of "Virtual". The "Pure" in either case means there - // is no concrete procedure. When there is no "Pure" the method - // should have a corresponding procedure symbol id. - // - // The issue is we will want to mark all of our virtual methods as - // virtual and give them an offset, but that means we have to do - // some extra figuring to propogate offsets from "Intro" methods - // to "Virtual" methods in inheritance trees. That is - IF we want - // to start preserving the offsets of virtuals. There is room in - // the method struct to make this work, but for now I've just - // decided to drop this information. It is not urgently useful to - // us and greatly complicates matters. - - // rjf: read vbaseoff - U32 vbaseoff = 0; - if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) - { - if(next_method_read_ptr+4 <= method_list_opl) - { - vbaseoff = *(U32 *)next_method_read_ptr; - } - next_method_read_ptr += 4; - } - - // rjf: emit method - switch(prop) - { - default: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_Method; - mem->name = name; - mem->type = method_type; - }break; - case CV_MethodProp_Static: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_StaticMethod; - mem->name = name; - mem->type = method_type; - }break; - case CV_MethodProp_Virtual: - case CV_MethodProp_PureVirtual: - case CV_MethodProp_Intro: - case CV_MethodProp_PureIntro: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualMethod; - mem->name = name; - mem->type = method_type; - }break; - } - } - - }break; - - //- rjf: ONEMETHOD - case CV_LeafKind_ONEMETHOD: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafOneMethod *lf = (CV_LeafOneMethod *)field_leaf_first; - CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(lf->attribs); - U8 *vbaseoff_ptr = (U8 *)(lf+1); - U8 *vbaseoff_opl_ptr = vbaseoff_ptr; - U32 vbaseoff = 0; - if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) - { - vbaseoff = *(U32 *)(vbaseoff_ptr); - vbaseoff_opl_ptr += sizeof(U32); - } - U8 *name_ptr = vbaseoff_opl_ptr; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - RDIM_Type *method_type = p2r_type_ptr_from_itype(lf->itype); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit method - switch(prop) - { - default: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_Method; - mem->name = name; - mem->type = method_type; - }break; - - case CV_MethodProp_Static: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_StaticMethod; - mem->name = name; - mem->type = method_type; - }break; - - case CV_MethodProp_Virtual: - case CV_MethodProp_PureVirtual: - case CV_MethodProp_Intro: - case CV_MethodProp_PureIntro: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualMethod; - mem->name = name; - mem->type = method_type; - }break; - } - }break; - - //- rjf: NESTTYPE - case CV_LeafKind_NESTTYPE: - { - // rjf: unpack leaf - CV_LeafNestType *lf = (CV_LeafNestType *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_NestedType; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: NESTTYPEEX - case CV_LeafKind_NESTTYPEEX: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafNestTypeEx *lf = (CV_LeafNestTypeEx *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_NestedType; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: BCLASS - case CV_LeafKind_BCLASS: - { - // TODO(rjf): log on bad offset - - // rjf: unpack leaf - CV_LeafBClass *lf = (CV_LeafBClass *)field_leaf_first; - U8 *offset_ptr = (U8 *)(lf+1); - CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); - U64 offset64 = cv_u64_from_numeric(&offset); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = offset_ptr+offset.encoded_size; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_Base; - mem->type = p2r_type_ptr_from_itype(lf->itype); - mem->off = (U32)offset64; - }break; - - //- rjf: VBCLASS/IVBCLASS - case CV_LeafKind_VBCLASS: - case CV_LeafKind_IVBCLASS: - { - // TODO(rjf): log on bad offsets - // TODO(rjf): handle attribs - // TODO(rjf): offsets? - - // rjf: unpack leaf - CV_LeafVBClass *lf = (CV_LeafVBClass *)field_leaf_first; - U8 *num1_ptr = (U8 *)(lf+1); - CV_NumericParsed num1 = cv_numeric_from_data_range(num1_ptr, field_leaf_opl); - U8 *num2_ptr = num1_ptr + num1.encoded_size; - CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, &all_udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualBase; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: VFUNCTAB - case CV_LeafKind_VFUNCTAB: - { - CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first; - // NOTE(rjf): currently no-op this case - (void)lf; - }break; - } - - // rjf: align-up next field - next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); - } - } - } - }break; - - //////////////////////// - //- rjf: enums -> equip enumerates - // - case CV_LeafKind_ENUM: - { - //- rjf: grab UDT info - RDIM_UDT *dst_udt = dst_type->udt; - if(dst_udt == 0) - { - dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, &all_udts, udts_chunk_cap); - dst_udt->self_type = dst_type; - } - - //- rjf: gather all fields - typedef struct FieldListTask FieldListTask; - struct FieldListTask - { - FieldListTask *next; - CV_TypeId itype; - }; - FieldListTask start_fl_task = {0, field_itype}; - FieldListTask *fl_todo_stack = &start_fl_task; - FieldListTask *fl_done_stack = 0; - for(;fl_todo_stack != 0;) - { - //- rjf: take & unpack task - FieldListTask *fl_task = fl_todo_stack; - SLLStackPop(fl_todo_stack); - SLLStackPush(fl_done_stack, fl_task); - CV_TypeId field_list_itype = fl_task->itype; - - //- rjf: skip bad itypes - if(field_list_itype < itype_first || itype_opl <= field_list_itype) - { - continue; - } - - //- rjf: field list itype -> range - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-itype_first]; - - //- rjf: skip bad headers - if(range->off+range->hdr.size > tpi_leaf->data.size || - range->hdr.size < 2 || - range->hdr.kind != CV_LeafKind_FIELDLIST) - { - continue; - } - - //- rjf: loop over all fields - { - U8 *field_list_first = tpi_leaf->data.str+range->off+2; - U8 *field_list_opl = field_list_first+range->hdr.size-2; - for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; - read_ptr < field_list_opl; - read_ptr = next_read_ptr) - { - // rjf: unpack field - CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; - U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); - U8 *field_leaf_first = read_ptr+2; - U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; - next_read_ptr = field_leaf_opl; - - // rjf: skip out-of-bounds fields - if(field_leaf_first+field_leaf_header_size > field_list_opl) - { - continue; - } - - // rjf: process field - switch(field_kind) - { - //- rjf: unhandled/invalid cases - default: - { - // TODO(rjf): log - }break; - - //- rjf: INDEX - case CV_LeafKind_INDEX: - { - // rjf: unpack leaf - CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; - CV_TypeId new_itype = lf->itype; - - // rjf: determine if index itype is new - B32 is_new = 1; - for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) - { - if(t->itype == new_itype) - { - is_new = 0; - break; - } - } - - // rjf: if new -> push task to follow new itype - if(is_new) - { - FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); - SLLStackPush(fl_todo_stack, new_task); - new_task->itype = new_itype; - } - }break; - - //- rjf: ENUMERATE - case CV_LeafKind_ENUMERATE: - { - // TODO(rjf): attribs - - // rjf: unpack leaf - CV_LeafEnumerate *lf = (CV_LeafEnumerate *)field_leaf_first; - U8 *val_ptr = (U8 *)(lf+1); - CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, field_leaf_opl); - U64 val64 = cv_u64_from_numeric(&val); - U8 *name_ptr = val_ptr + val.encoded_size; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, &all_udts, dst_udt); - enum_val->name = name; - enum_val->val = val64; - }break; - } - - // rjf: align-up next field - next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); - } - } - } - }break; - } - } -#endif } ////////////////////////////////////////////////////////////// From 74d051f383d110154aee90d3ac050435abf296c8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 15:51:18 -0800 Subject: [PATCH 125/275] walk args as dependent types for member function types --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index ebf0ce89..35c82ba5 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1096,6 +1096,42 @@ p2r_itype_chain_build_task__entry_point(Arena *arena, void *p) c->itype = lf->this_itype; SLLQueuePush(first_walk_task, last_walk_task, c); } + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: push arg types to chain + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk arg types + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLQueuePush(first_walk_task, last_walk_task, c); + } }break; //- rjf: BITFIELD From 5813cb2af8d9404ab5301812c3767e524dd5fcb1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 16:20:27 -0800 Subject: [PATCH 126/275] proper thread names --- src/base/base_inc.c | 3 +- src/base/base_inc.h | 3 +- src/base/base_markup.c | 19 +++++ src/base/base_markup.h | 75 ++------------------ src/base/base_profile.c | 2 + src/base/base_profile.h | 74 +++++++++++++++++++ src/ctrl/ctrl_core.c | 2 +- src/file_stream/file_stream.c | 2 +- src/msf/msf.c | 39 +++++----- src/os/core/linux/os_core_linux.c | 2 +- src/os/core/os_core.h | 7 +- src/os/core/win32/os_core_win32.c | 48 +++++++++++++ src/raddbg/raddbg.c | 2 +- src/raddbgi_from_dwarf/raddbgi_from_dwarf.c | 2 +- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 2 +- src/task_system/task_system.c | 4 +- 16 files changed, 184 insertions(+), 102 deletions(-) create mode 100644 src/base/base_profile.c create mode 100644 src/base/base_profile.h diff --git a/src/base/base_inc.c b/src/base/base_inc.c index e9824297..7c3e7cca 100644 --- a/src/base/base_inc.c +++ b/src/base/base_inc.c @@ -8,7 +8,7 @@ #define RADDBG_LAYER_COLOR 0.20f, 0.60f, 0.80f #include "base_types.c" -#include "base_markup.c" +#include "base_profile.c" #include "base_arena.c" #include "base_math.c" #include "base_string.c" @@ -16,3 +16,4 @@ #include "base_command_line.c" #include "base_arena_dev.c" #include "base_bits.c" +#include "base_markup.c" diff --git a/src/base/base_inc.h b/src/base/base_inc.h index 2af02635..f5ed9a5e 100644 --- a/src/base/base_inc.h +++ b/src/base/base_inc.h @@ -9,7 +9,7 @@ #include "base_context_cracking.h" #include "base_types.h" -#include "base_markup.h" +#include "base_profile.h" #include "base_ins.h" #include "base_linked_lists.h" #include "base_arena.h" @@ -19,5 +19,6 @@ #include "base_command_line.h" #include "base_arena_dev.h" #include "base_bits.h" +#include "base_markup.h" #endif // BASE_INC_H diff --git a/src/base/base_markup.c b/src/base/base_markup.c index 7ea8904c..e0ba1b2b 100644 --- a/src/base/base_markup.c +++ b/src/base/base_markup.c @@ -1,2 +1,21 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +thread_name(String8 string) +{ + ProfThreadName("%.*s", str8_varg(string)); + os_set_thread_name(string); +} + +internal void +thread_namef(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + thread_name(string); + va_end(args); + scratch_end(scratch); +} diff --git a/src/base/base_markup.h b/src/base/base_markup.h index 03c1adab..7ca2ab36 100644 --- a/src/base/base_markup.h +++ b/src/base/base_markup.h @@ -4,76 +4,9 @@ #ifndef BASE_MARKUP_H #define BASE_MARKUP_H -//////////////////////////////// -//~ rjf: Zero Settings - -#if !defined(PROFILE_TELEMETRY) -# define PROFILE_TELEMETRY 0 -#endif - -#if !defined(MARKUP_LAYER_COLOR) -# define MARKUP_LAYER_COLOR 1.00f, 0.00f, 1.00f -#endif - -//////////////////////////////// -//~ rjf: Third Party Includes - -#if PROFILE_TELEMETRY -# include "rad_tm.h" -# if OS_WINDOWS -# pragma comment(lib, "rad_tm_win64.lib") -# endif -#endif - -//////////////////////////////// -//~ rjf: Telemetry Profile Defines - -#if PROFILE_TELEMETRY -# define ProfBegin(...) tmEnter(0, 0, __VA_ARGS__) -# define ProfBeginDynamic(...) (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) -# define ProfEnd(...) (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0) -# define ProfTick(...) tmTick(0) -# define ProfIsCapturing(...) tmRunning() -# define ProfBeginCapture(...) tmOpen(0, __VA_ARGS__, __DATE__, "localhost", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100) -# define ProfEndCapture(...) tmClose(0) -# define ProfThreadName(...) (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0) -# define ProfMsg(...) (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) -# define ProfBeginLockWait(...) tmStartWaitForLock(0, 0, __VA_ARGS__) -# define ProfEndLockWait(...) tmEndWaitForLock(0) -# define ProfLockTake(...) tmAcquiredLock(0, 0, __VA_ARGS__) -# define ProfLockDrop(...) tmReleasedLock(0, __VA_ARGS__) -# define ProfColor(color) tmZoneColorSticky(color) -#endif - -//////////////////////////////// -//~ rjf: Zeroify Undefined Defines - -#if !defined(ProfBegin) -# define ProfBegin(...) (0) -# define ProfBeginDynamic(...) (0) -# define ProfEnd(...) (0) -# define ProfTick(...) (0) -# define ProfIsCapturing(...) (0) -# define ProfBeginCapture(...) (0) -# define ProfEndCapture(...) (0) -# define ProfThreadName(...) (0) -# define ProfMsg(...) (0) -# define ProfBeginLockWait(...) (0) -# define ProfEndLockWait(...) (0) -# define ProfLockTake(...) (0) -# define ProfLockDrop(...) (0) -# define ProfColor(...) (0) -#endif - -//////////////////////////////// -//~ rjf: Helper Wrappers - -#define ProfBeginFunction(...) ProfBegin(this_function_name) -#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd()) - -//////////////////////////////// -//~ rjf: General Markup - -#define ThreadName(...) (ProfThreadName(__VA_ARGS__)) +internal void thread_namef(char *fmt, ...); +internal void thread_name(String8 string); +#define ThreadNameF(...) (ProfThreadName(__VA_ARGS__), thread_namef(__VA_ARGS__)) +#define ThreadName(str) (ProfThreadName("%s", str8_varg(str)), thread_name(str)) #endif // BASE_MARKUP_H diff --git a/src/base/base_profile.c b/src/base/base_profile.c new file mode 100644 index 00000000..7ea8904c --- /dev/null +++ b/src/base/base_profile.c @@ -0,0 +1,2 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/base/base_profile.h b/src/base/base_profile.h new file mode 100644 index 00000000..0809f207 --- /dev/null +++ b/src/base/base_profile.h @@ -0,0 +1,74 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_PROFILE_H +#define BASE_PROFILE_H + +//////////////////////////////// +//~ rjf: Zero Settings + +#if !defined(PROFILE_TELEMETRY) +# define PROFILE_TELEMETRY 0 +#endif + +#if !defined(MARKUP_LAYER_COLOR) +# define MARKUP_LAYER_COLOR 1.00f, 0.00f, 1.00f +#endif + +//////////////////////////////// +//~ rjf: Third Party Includes + +#if PROFILE_TELEMETRY +# include "rad_tm.h" +# if OS_WINDOWS +# pragma comment(lib, "rad_tm_win64.lib") +# endif +#endif + +//////////////////////////////// +//~ rjf: Telemetry Profile Defines + +#if PROFILE_TELEMETRY +# define ProfBegin(...) tmEnter(0, 0, __VA_ARGS__) +# define ProfBeginDynamic(...) (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) +# define ProfEnd(...) (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0) +# define ProfTick(...) tmTick(0) +# define ProfIsCapturing(...) tmRunning() +# define ProfBeginCapture(...) tmOpen(0, __VA_ARGS__, __DATE__, "localhost", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100) +# define ProfEndCapture(...) tmClose(0) +# define ProfThreadName(...) (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0) +# define ProfMsg(...) (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) +# define ProfBeginLockWait(...) tmStartWaitForLock(0, 0, __VA_ARGS__) +# define ProfEndLockWait(...) tmEndWaitForLock(0) +# define ProfLockTake(...) tmAcquiredLock(0, 0, __VA_ARGS__) +# define ProfLockDrop(...) tmReleasedLock(0, __VA_ARGS__) +# define ProfColor(color) tmZoneColorSticky(color) +#endif + +//////////////////////////////// +//~ rjf: Zeroify Undefined Defines + +#if !defined(ProfBegin) +# define ProfBegin(...) (0) +# define ProfBeginDynamic(...) (0) +# define ProfEnd(...) (0) +# define ProfTick(...) (0) +# define ProfIsCapturing(...) (0) +# define ProfBeginCapture(...) (0) +# define ProfEndCapture(...) (0) +# define ProfThreadName(...) (0) +# define ProfMsg(...) (0) +# define ProfBeginLockWait(...) (0) +# define ProfEndLockWait(...) (0) +# define ProfLockTake(...) (0) +# define ProfLockDrop(...) (0) +# define ProfColor(...) (0) +#endif + +//////////////////////////////// +//~ rjf: Helper Wrappers + +#define ProfBeginFunction(...) ProfBegin(this_function_name) +#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd()) + +#endif // BASE_PROFILE_H diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 081e1af3..d3da0004 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1518,7 +1518,7 @@ ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, CTRL_Handle *out_process, internal void ctrl_thread__entry_point(void *p) { - ThreadName("[ctrl] thread"); + ThreadNameF("[ctrl] thread"); ProfBeginFunction(); demon_primary_thread_begin(); Temp scratch = scratch_begin(0, 0); diff --git a/src/file_stream/file_stream.c b/src/file_stream/file_stream.c index 84e81c6d..ddfa92ed 100644 --- a/src/file_stream/file_stream.c +++ b/src/file_stream/file_stream.c @@ -140,7 +140,7 @@ fs_u2s_dequeue_path(Arena *arena) internal void fs_streamer_thread__entry_point(void *p) { - ThreadName("[fs] streamer #%I64u", (U64)p); + ThreadNameF("[fs] streamer #%I64u", (U64)p); for(;;) { Temp scratch = scratch_begin(0, 0); diff --git a/src/msf/msf.c b/src/msf/msf.c index f228998e..f93461dd 100644 --- a/src/msf/msf.c +++ b/src/msf/msf.c @@ -5,40 +5,41 @@ //~ MSF Parser Function internal MSF_Parsed* -msf_parsed_from_data(Arena *arena, String8 msf_data){ - ProfBegin("msf_parsed_from_data"); - +msf_parsed_from_data(Arena *arena, String8 msf_data) +{ Temp scratch = scratch_begin(&arena, 1); - MSF_Parsed *result = 0; //- determine msf type U32 index_size = 0; - if (msf_data.size >= MSF_MIN_SIZE){ - if (str8_match(msf_data, str8_lit(msf_msf20_magic), - StringMatchFlag_RightSideSloppy)){ + if(msf_data.size >= MSF_MIN_SIZE) + { + if(str8_match(msf_data, str8_lit(msf_msf20_magic), StringMatchFlag_RightSideSloppy)) + { index_size = 2; } - else if (str8_match(msf_data, str8_lit(msf_msf70_magic), - StringMatchFlag_RightSideSloppy)){ + else if(str8_match(msf_data, str8_lit(msf_msf70_magic), StringMatchFlag_RightSideSloppy)) + { index_size = 4; } } - if (index_size == 2 || index_size == 4){ - + if(index_size == 2 || index_size == 4) + { //- extract info from header U32 block_size_raw = 0; U32 whole_file_block_count_raw = 0; U32 directory_size_raw = 0; U32 directory_super_map_raw = 0; - if (index_size == 2){ + if(index_size == 2) + { MSF_Header20 *header = (MSF_Header20*)(msf_data.str + MSF_MSF20_MAGIC_SIZE); block_size_raw = header->block_size; whole_file_block_count_raw = header->block_count; directory_size_raw = header->directory_size; } - else if (index_size == 4){ + else if(index_size == 4) + { MSF_Header70 *header = (MSF_Header70*)(msf_data.str + MSF_MSF70_MAGIC_SIZE); block_size_raw = header->block_size; whole_file_block_count_raw = header->block_count; @@ -91,7 +92,6 @@ msf_parsed_from_data(Arena *arena, String8 msf_data){ //- parse stream directory U8 *directory_buf = push_array(scratch.arena, U8, directory_size); B32 got_directory = 1; - { U32 directory_super_map_dummy = 0; U32 *directory_super_map = 0; @@ -174,7 +174,8 @@ msf_parsed_from_data(Arena *arena, String8 msf_data){ B32 got_streams = 0; String8 *streams = 0; - if (got_directory){ + if(got_directory) + { got_streams = 1; // read stream count @@ -258,7 +259,8 @@ msf_parsed_from_data(Arena *arena, String8 msf_data){ parse_streams_done:; } - if (got_streams){ + if(got_streams) + { result = push_array(arena, MSF_Parsed, 1); result->streams = streams; result->stream_count = stream_count; @@ -268,10 +270,7 @@ msf_parsed_from_data(Arena *arena, String8 msf_data){ } scratch_end(scratch); - - ProfEnd(); - - return(result); + return result; } internal String8 diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index bb5e8ee1..b6730957 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -984,7 +984,7 @@ os_logical_core_count(void) } //////////////////////////////// -//~ rjf: @os_hooks Process Info (Implemented Per-OS) +//~ rjf: @os_hooks Process & Thread Info (Implemented Per-OS) internal String8List os_get_command_line_arguments(void) diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h index 1edd321a..a162576a 100644 --- a/src/os/core/os_core.h +++ b/src/os/core/os_core.h @@ -232,7 +232,7 @@ internal U64 os_allocation_granularity(void); internal U64 os_logical_core_count(void); //////////////////////////////// -//~ rjf: @os_hooks Process Info (Implemented Per-OS) +//~ rjf: @os_hooks Process & Thread Info (Implemented Per-OS) internal String8List os_get_command_line_arguments(void); internal S32 os_get_pid(void); @@ -240,6 +240,11 @@ internal S32 os_get_tid(void); internal String8List os_get_environment(void); internal U64 os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out); +//////////////////////////////// +//~ rjf: @os_hooks Thread Names + +internal void os_set_thread_name(String8 string); + //////////////////////////////// //~ rjf: @os_hooks Process Control (Implemented Per-OS) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index b86e27d9..49b5c444 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -595,6 +595,54 @@ os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *o return(result); } +//////////////////////////////// +//~ rjf: @os_hooks Thread Names + +internal void +os_set_thread_name(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + + // rjf: windows 10 style + { + String16 name16 = str16_from_8(scratch.arena, name); + HRESULT hr = SetThreadDescription(GetCurrentThread(), (WCHAR*)name16.str); + } + + // rjf: raise-exception style + { + String8 name_copy = push_str8_copy(scratch.arena, name); +#pragma pack(push,8) + typedef struct THREADNAME_INFO THREADNAME_INFO; + struct THREADNAME_INFO + { + U32 dwType; // Must be 0x1000. + char *szName; // Pointer to name (in user addr space). + U32 dwThreadID; // Thread ID (-1=caller thread). + U32 dwFlags; // Reserved for future use, must be zero. + }; +#pragma pack(pop) + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = (char *)name_copy.str; + info.dwThreadID = os_get_tid(); + info.dwFlags = 0; +#pragma warning(push) +#pragma warning(disable: 6320 6322) + __try + { + RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } +#pragma warning(pop) + } + + scratch_end(scratch); +} + + //////////////////////////////// //~ rjf: @os_hooks Process Control (Implemented Per-OS) diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 532a3d83..067e5dd7 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -343,7 +343,7 @@ entry_point(int argc, char **argv) tmSetMaxThreadCount(1024); tmInitialize(sizeof(tm_data), (char *)tm_data); #endif - ThreadName("[main]"); + ThreadNameF("[main]"); //- rjf: initialize basic dependencies os_init(argc, argv); diff --git a/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c b/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c index 17bc620c..dbb2b2f4 100644 --- a/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c +++ b/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c @@ -410,7 +410,7 @@ main(int argc, char **argv){ tmInitialize(tm_data_size, tm_data); #endif - ThreadName("[main]"); + ThreadNameF("[main]"); Arena *arena = arena_alloc(); String8List args = os_string_list_from_argcv(arena, argc, argv); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index caa9c24c..c3b53afd 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -46,7 +46,7 @@ main(int argc, char **argv) tmSetMaxThreadCount(1024); tmInitialize(tm_data_size, tm_data); #endif - ThreadName("[main]"); + ThreadNameF("[main]"); //- rjf: initialize dependencies os_init(argc, argv); diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index fb79b9c0..18dfb57c 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -36,7 +36,7 @@ ts_init(void) ts_shared->artifact_stripes[idx].cv = os_condition_variable_alloc(); ts_shared->artifact_stripes[idx].rw_mutex = os_rw_mutex_alloc(); } - ts_shared->u2t_ring_size = KB(256); + ts_shared->u2t_ring_size = KB(1024); ts_shared->u2t_ring_base = push_array_no_zero(arena, U8, ts_shared->u2t_ring_size); ts_shared->u2t_ring_mutex = os_mutex_alloc(); ts_shared->u2t_ring_cv = os_condition_variable_alloc(); @@ -168,7 +168,7 @@ internal void ts_task_thread__entry_point(void *p) { U64 thread_idx = (U64)p; - ThreadName("[ts] task thread #%I64u", thread_idx+1); + ThreadNameF("[ts] task thread #%I64u", thread_idx+1); TS_TaskThread *thread = &ts_shared->task_threads[thread_idx]; for(;;) { From 6beb9951e6d2ea7febb4d3ab54cdf06c34a346fb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 22 Feb 2024 16:54:39 -0800 Subject: [PATCH 127/275] adjust default task sizes in raddbgi_from_pdb --- src/msf/msf.c | 11 +++++++---- src/msf/msf.h | 25 +++++++++++++++---------- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 6 +++--- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/msf/msf.c b/src/msf/msf.c index f93461dd..70f7533f 100644 --- a/src/msf/msf.c +++ b/src/msf/msf.c @@ -2,7 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ MSF Parser Function +//~ rjf: MSF Parser Functions internal MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data) @@ -199,7 +199,8 @@ msf_parsed_from_data(Arena *arena, String8 msf_data) U32 entry_cursor = all_stream_entries_off; U32 index_cursor = all_indices_off; String8 *stream_ptr = streams; - for (U32 i = 0; i < stream_count; i += 1){ + for (U32 i = 0; i < stream_count; i += 1) + { // read stream size U32 stream_size_raw = *(U32*)(directory_buf + entry_cursor); if (stream_size_raw == 0xffffffff){ @@ -274,9 +275,11 @@ msf_parsed_from_data(Arena *arena, String8 msf_data) } 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}; - if (sn < msf->stream_count){ + if(sn < msf->stream_count) + { result = msf->streams[sn]; } return(result); diff --git a/src/msf/msf.h b/src/msf/msf.h index 7184e195..77f7eebf 100644 --- a/src/msf/msf.h +++ b/src/msf/msf.h @@ -5,7 +5,7 @@ #define MSF_H //////////////////////////////// -//~ MSF Format Types +//~ rjf: MSF Format Types #define MSF_INVALID_STREAM_NUMBER 0xFFFF typedef U16 MSF_StreamNumber; @@ -17,23 +17,27 @@ static char msf_msf70_magic[] = "Microsoft C/C++ MSF 7.00\r\n\032DS\0\0"; #define MSF_MSF70_MAGIC_SIZE 32 #define MSF_MAX_MAGIC_SIZE 44 -typedef struct MSF_Header20{ +typedef struct MSF_Header20 MSF_Header20; +struct MSF_Header20 +{ U32 block_size; U16 free_block_map_block; U16 block_count; U32 directory_size; U32 unknown; U16 directory_map; -} MSF_Header20; +}; -typedef struct MSF_Header70{ +typedef struct MSF_Header70 MSF_Header70; +struct MSF_Header70 +{ U32 block_size; U32 free_block_map_block; U32 block_count; U32 directory_size; U32 unknown; U32 directory_super_map; -} MSF_Header70; +}; // magic(20) + header(20) = 44 + 20 = 64 // magic(70) + header(70) = 32 + 24 = 56 @@ -41,18 +45,19 @@ typedef struct MSF_Header70{ #define MSF_MIN_SIZE 64 //////////////////////////////// -//~ MSF Parser Helper Types +//~ rjf: MSF Parser Helper Types -typedef struct MSF_Parsed{ +typedef struct MSF_Parsed MSF_Parsed; +struct MSF_Parsed +{ String8 *streams; U64 stream_count; - U64 block_size; U64 block_count; -} MSF_Parsed; +}; //////////////////////////////// -//~ MSF Parser Function +//~ rjf: MSF Parser Functions internal MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data); internal String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 35c82ba5..76101eb4 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -2921,7 +2921,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) itype_fwd_map = push_array(arena, CV_TypeId, (U64)itype_opl); //- rjf: kick off tasks to fill forward resolution map - U64 task_size_itypes = 4096; + U64 task_size_itypes = 1024; U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; P2R_ITypeFwdMapFillIn *tasks_inputs = push_array(scratch.arena, P2R_ITypeFwdMapFillIn, tasks_count); TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); @@ -2960,7 +2960,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) itype_chains = push_array(arena, P2R_TypeIdChain *, (U64)itype_opl); //- rjf: kick off tasks to fill itype chain table - U64 task_size_itypes = 4096; + U64 task_size_itypes = 1024; U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; P2R_ITypeChainBuildIn *tasks_inputs = push_array(scratch.arena, P2R_ITypeChainBuildIn, tasks_count); TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); @@ -3461,7 +3461,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //////////////////////////// //- rjf: kick off all symbol conversion tasks // - U64 global_stream_subdivision_tasks_count = (sym->sym_ranges.count+65535)/65536; + U64 global_stream_subdivision_tasks_count = (sym->sym_ranges.count+16383)/16384; U64 global_stream_syms_per_task = sym->sym_ranges.count/global_stream_subdivision_tasks_count; U64 tasks_count = comp_unit_count + global_stream_subdivision_tasks_count; P2R_SymbolStreamConvertIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamConvertIn, tasks_count); From ac8a7ba9888867925d6fa384f6f6664d15bde615 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 23 Feb 2024 11:07:09 -0800 Subject: [PATCH 128/275] fix enumerate gathering in new udt building pass --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 76101eb4..e4c45f32 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1686,6 +1686,15 @@ p2r_udt_convert_task__entry_point(Arena *arena, void *p) //- rjf: enums -> equip enumerates // case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_enum_vals; + equip_enum_vals:; { Temp scratch = scratch_begin(&arena, 1); From c1984edadf0c80c176c18ed99595b64591a1899a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 23 Feb 2024 11:13:12 -0800 Subject: [PATCH 129/275] dont over-eagerly join udt building tassk --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 47 +++++++++++++------------ 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index e4c45f32..8b25b47b 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3419,32 +3419,23 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) } ////////////////////////////////////////////////////////////// - //- rjf: types pass 4: build UDTs + //- rjf: types pass 4: kick off UDT build // - RDIM_UDTChunkList all_udts = {0}; - ProfScope("types pass 4: build UDTs") + U64 udt_task_size_itypes = 4096; + U64 udt_tasks_count = ((U64)itype_opl+(udt_task_size_itypes-1))/udt_task_size_itypes; + P2R_UDTConvertIn *udt_tasks_inputs = push_array(scratch.arena, P2R_UDTConvertIn, udt_tasks_count); + TS_Ticket *udt_tasks_tickets = push_array(scratch.arena, TS_Ticket, udt_tasks_count); + ProfScope("types pass 4: kick off UDT build") { - //- rjf: kick off tasks - U64 task_size_itypes = 4096; - U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; - P2R_UDTConvertIn *tasks_inputs = push_array(scratch.arena, P2R_UDTConvertIn, tasks_count); - TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); - for(U64 idx = 0; idx < tasks_count; idx += 1) + for(U64 idx = 0; idx < udt_tasks_count; idx += 1) { - tasks_inputs[idx].tpi_leaf = tpi_leaf; - tasks_inputs[idx].itype_first = idx*task_size_itypes; - tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; - tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); - tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; - tasks_tickets[idx] = ts_kickoff(p2r_udt_convert_task__entry_point, 0, &tasks_inputs[idx]); - } - - //- rjf: join all tasks - for(U64 idx = 0; idx < tasks_count; idx += 1) - { - RDIM_UDTChunkList *udts = ts_join_struct(tasks_tickets[idx], max_U64, RDIM_UDTChunkList); - rdim_udt_chunk_list_concat_in_place(&all_udts, udts); + udt_tasks_inputs[idx].tpi_leaf = tpi_leaf; + udt_tasks_inputs[idx].itype_first = idx*udt_task_size_itypes; + udt_tasks_inputs[idx].itype_opl = udt_tasks_inputs[idx].itype_first + udt_task_size_itypes; + udt_tasks_inputs[idx].itype_opl = ClampTop(udt_tasks_inputs[idx].itype_opl, itype_opl); + udt_tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + udt_tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; + udt_tasks_tickets[idx] = ts_kickoff(p2r_udt_convert_task__entry_point, 0, &udt_tasks_inputs[idx]); } } @@ -3531,6 +3522,16 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) all_src_files = out->src_files; } + ////////////////////////////////////////////////////////////// + //- rjf: types pass 5: join UDT build tasks + // + RDIM_UDTChunkList all_udts = {0}; + for(U64 idx = 0; idx < udt_tasks_count; idx += 1) + { + RDIM_UDTChunkList *udts = ts_join_struct(udt_tasks_tickets[idx], max_U64, RDIM_UDTChunkList); + rdim_udt_chunk_list_concat_in_place(&all_udts, udts); + } + ////////////////////////////////////////////////////////////// //- rjf: fill output // From dd0416f9f90ddab95dac037b1cf3dc46c36891bd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 23 Feb 2024 11:18:53 -0800 Subject: [PATCH 130/275] fix nil expressions mapping to valid expression kinds, thus implying children nodes --- src/eval/eval.mdesk | 2 ++ src/eval/generated/eval.meta.c | 9 ++++++--- src/eval/generated/eval.meta.h | 7 ++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 2c0daa5e..56c26b51 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -6,6 +6,8 @@ // op_string - string for quick display of the operator EVAL_ExprKindTable: { + { Nil 0 "" } + { ArrayIndex 2 "[]" } { MemberAccess 2 "." } { Deref 1 "*" } diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index e962686e..c6566590 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -4,8 +4,9 @@ //- GENERATED CODE C_LINKAGE_BEGIN -U8 eval_expr_kind_child_counts[39] = +U8 eval_expr_kind_child_counts[40] = { +0, 2, 2, 1, @@ -47,8 +48,9 @@ U8 eval_expr_kind_child_counts[39] = 0, }; -String8 eval_expr_kind_strings[39] = +String8 eval_expr_kind_strings[40] = { +str8_lit_comp("Nil"), str8_lit_comp("ArrayIndex"), str8_lit_comp("MemberAccess"), str8_lit_comp("Deref"), @@ -105,8 +107,9 @@ str8_lit_comp("Insufficient evaluation machine stack space."), str8_lit_comp("Malformed bytecode."), }; -String8 eval_expr_op_strings[39] = +String8 eval_expr_op_strings[40] = { +str8_lit_comp(""), str8_lit_comp("[]"), str8_lit_comp("."), str8_lit_comp("*"), diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 0527136d..4c90936c 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -9,6 +9,7 @@ typedef U32 EVAL_ExprKind; typedef enum EVAL_ExprKindEnum { +EVAL_ExprKind_Nil, EVAL_ExprKind_ArrayIndex, EVAL_ExprKind_MemberAccess, EVAL_ExprKind_Deref, @@ -68,10 +69,10 @@ EVAL_ResultCode_COUNT, } EVAL_ResultCode; C_LINKAGE_BEGIN -extern U8 eval_expr_kind_child_counts[39]; -extern String8 eval_expr_kind_strings[39]; +extern U8 eval_expr_kind_child_counts[40]; +extern String8 eval_expr_kind_strings[40]; extern String8 eval_result_code_display_strings[11]; -extern String8 eval_expr_op_strings[39]; +extern String8 eval_expr_op_strings[40]; C_LINKAGE_END #endif // EVAL_META_H From 4da33c0d2c151fbf6c502031d2e095f00d32689c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 23 Feb 2024 11:21:47 -0800 Subject: [PATCH 131/275] eliminate noop in ui layout pass --- src/ui/ui_core.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 4f4e7c51..863b92a2 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -1584,7 +1584,6 @@ ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis) F32 fixup_pct = (violation / total_weighted_size); fixup_pct = Clamp(0, fixup_pct, 1); child->fixed_size.v[axis] -= child_fixups[child_idx] * fixup_pct; - child->fixed_size.v[axis] = child->fixed_size.v[axis]; } } } From d9aa49e45cd117f285b8e17fa00a0f282769ac6c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 23 Feb 2024 12:17:57 -0800 Subject: [PATCH 132/275] respect wait timeouts in task system join --- src/task_system/task_system.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index 18dfb57c..31522953 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -136,6 +136,10 @@ ts_join(TS_Ticket ticket, U64 endt_us) } break; } + if(os_now_microseconds() >= endt_us) + { + break; + } os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); } } From 4c76eb73f1f69a189b220d687af572aeaa845617 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 24 Feb 2024 14:04:41 -0800 Subject: [PATCH 133/275] respect operating system file system case sensitivity rules in dbgi layer --- src/dbgi/dbgi.c | 16 ++++++++-------- src/dbgi/dbgi.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index f171abb0..7369c22b 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -85,12 +85,12 @@ dbgi_ensure_tctx_inited(void) //~ rjf: Helpers internal U64 -dbgi_hash_from_string(String8 string) +dbgi_hash_from_string(String8 string, StringMatchFlags match_flags) { U64 result = 5381; for(U64 i = 0; i < string.size; i += 1) { - result = ((result << 5) + result) + string.str[i]; + result = ((result << 5) + result) + ((match_flags & StringMatchFlag_CaseInsensitive) ? char_to_lower(string.str[i]) : string.str[i]); } return result; } @@ -157,7 +157,7 @@ dbgi_fuzzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, DBGI_FuzzySe internal void dbgi_force_exe_path_dbg_path(String8 exe_path, String8 dbg_path) { - U64 hash = dbgi_hash_from_string(exe_path); + U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); U64 slot_idx = hash%dbgi_shared->force_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->force_stripes_count; DBGI_ForceSlot *slot = &dbgi_shared->force_slots[slot_idx]; @@ -192,7 +192,7 @@ internal String8 dbgi_forced_dbg_path_from_exe_path(Arena *arena, String8 exe_path) { String8 result = {0}; - U64 hash = dbgi_hash_from_string(exe_path); + U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); U64 slot_idx = hash%dbgi_shared->force_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->force_stripes_count; DBGI_ForceSlot *slot = &dbgi_shared->force_slots[slot_idx]; @@ -297,7 +297,7 @@ dbgi_binary_open(String8 exe_path) { Temp scratch = scratch_begin(0, 0); exe_path = path_normalized_from_string(scratch.arena, exe_path); - U64 hash = dbgi_hash_from_string(exe_path); + U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); U64 slot_idx = hash%dbgi_shared->binary_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->binary_stripes_count; DBGI_BinarySlot *slot = &dbgi_shared->binary_slots[slot_idx]; @@ -336,7 +336,7 @@ dbgi_binary_close(String8 exe_path) { Temp scratch = scratch_begin(0, 0); exe_path = path_normalized_from_string(scratch.arena, exe_path); - U64 hash = dbgi_hash_from_string(exe_path); + U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); U64 slot_idx = hash%dbgi_shared->binary_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->binary_stripes_count; DBGI_BinarySlot *slot = &dbgi_shared->binary_slots[slot_idx]; @@ -393,7 +393,7 @@ dbgi_parse_from_exe_path(DBGI_Scope *scope, String8 exe_path, U64 endt_us) DBGI_Parse *parse = &dbgi_parse_nil; if(exe_path.size != 0) { - U64 hash = dbgi_hash_from_string(exe_path); + U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); U64 slot_idx = hash%dbgi_shared->binary_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->binary_stripes_count; DBGI_BinarySlot *slot = &dbgi_shared->binary_slots[slot_idx]; @@ -640,7 +640,7 @@ dbgi_parse_thread_entry_point(void *p) //- rjf: grab next path & unpack String8 exe_path = dbgi_u2p_dequeue_exe_path(scratch.arena); ProfBegin("begin task for \"%.*s\"", str8_varg(exe_path)); - U64 hash = dbgi_hash_from_string(exe_path); + U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); U64 slot_idx = hash%dbgi_shared->binary_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->binary_stripes_count; DBGI_BinarySlot *slot = &dbgi_shared->binary_slots[slot_idx]; diff --git a/src/dbgi/dbgi.h b/src/dbgi/dbgi.h index 80c01841..2ca9952e 100644 --- a/src/dbgi/dbgi.h +++ b/src/dbgi/dbgi.h @@ -377,7 +377,7 @@ internal void dbgi_ensure_tctx_inited(void); //////////////////////////////// //~ rjf: Helpers -internal U64 dbgi_hash_from_string(String8 string); +internal U64 dbgi_hash_from_string(String8 string, StringMatchFlags match_flags); internal U64 dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemArray *array, U64 element_idx); internal String8 dbgi_fuzzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, DBGI_FuzzySearchTarget target, U64 element_idx); From 10ab27eb437a816b74322baa8009cf03981c2345 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 24 Feb 2024 18:16:59 -0800 Subject: [PATCH 134/275] oops - actually respect operating system file system match flags in dbgi layer --- src/dbgi/dbgi.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index 7369c22b..7db04545 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -157,7 +157,8 @@ dbgi_fuzzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, DBGI_FuzzySe internal void dbgi_force_exe_path_dbg_path(String8 exe_path, String8 dbg_path) { - U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); + StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); + U64 hash = dbgi_hash_from_string(exe_path, match_flags); U64 slot_idx = hash%dbgi_shared->force_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->force_stripes_count; DBGI_ForceSlot *slot = &dbgi_shared->force_slots[slot_idx]; @@ -167,7 +168,7 @@ dbgi_force_exe_path_dbg_path(String8 exe_path, String8 dbg_path) DBGI_ForceNode *node = 0; for(DBGI_ForceNode *n = slot->first; n != 0; n = n->next) { - if(str8_match(n->exe_path, exe_path, 0)) + if(str8_match(n->exe_path, exe_path, match_flags)) { node = n; break; @@ -192,7 +193,8 @@ internal String8 dbgi_forced_dbg_path_from_exe_path(Arena *arena, String8 exe_path) { String8 result = {0}; - U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); + StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); + U64 hash = dbgi_hash_from_string(exe_path, match_flags); U64 slot_idx = hash%dbgi_shared->force_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->force_stripes_count; DBGI_ForceSlot *slot = &dbgi_shared->force_slots[slot_idx]; @@ -202,7 +204,7 @@ dbgi_forced_dbg_path_from_exe_path(Arena *arena, String8 exe_path) DBGI_ForceNode *node = 0; for(DBGI_ForceNode *n = slot->first; n != 0; n = n->next) { - if(str8_match(exe_path, n->exe_path, 0)) + if(str8_match(exe_path, n->exe_path, match_flags)) { node = n; break; @@ -297,7 +299,8 @@ dbgi_binary_open(String8 exe_path) { Temp scratch = scratch_begin(0, 0); exe_path = path_normalized_from_string(scratch.arena, exe_path); - U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); + StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); + U64 hash = dbgi_hash_from_string(exe_path, match_flags); U64 slot_idx = hash%dbgi_shared->binary_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->binary_stripes_count; DBGI_BinarySlot *slot = &dbgi_shared->binary_slots[slot_idx]; @@ -308,7 +311,7 @@ dbgi_binary_open(String8 exe_path) DBGI_Binary *binary = 0; for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) { - if(str8_match(bin->exe_path, exe_path, 0)) + if(str8_match(bin->exe_path, exe_path, match_flags)) { binary = bin; break; @@ -336,7 +339,8 @@ dbgi_binary_close(String8 exe_path) { Temp scratch = scratch_begin(0, 0); exe_path = path_normalized_from_string(scratch.arena, exe_path); - U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); + StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); + U64 hash = dbgi_hash_from_string(exe_path, match_flags); U64 slot_idx = hash%dbgi_shared->binary_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->binary_stripes_count; DBGI_BinarySlot *slot = &dbgi_shared->binary_slots[slot_idx]; @@ -346,7 +350,7 @@ dbgi_binary_close(String8 exe_path) DBGI_Binary *binary = 0; for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) { - if(str8_match(bin->exe_path, exe_path, 0)) + if(str8_match(bin->exe_path, exe_path, match_flags)) { binary = bin; break; @@ -393,7 +397,8 @@ dbgi_parse_from_exe_path(DBGI_Scope *scope, String8 exe_path, U64 endt_us) DBGI_Parse *parse = &dbgi_parse_nil; if(exe_path.size != 0) { - U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); + StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); + U64 hash = dbgi_hash_from_string(exe_path, match_flags); U64 slot_idx = hash%dbgi_shared->binary_slots_count; U64 stripe_idx = slot_idx%dbgi_shared->binary_stripes_count; DBGI_BinarySlot *slot = &dbgi_shared->binary_slots[slot_idx]; @@ -404,7 +409,7 @@ dbgi_parse_from_exe_path(DBGI_Scope *scope, String8 exe_path, U64 endt_us) DBGI_Binary *binary = 0; for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) { - if(str8_match(bin->exe_path, exe_path, 0)) + if(str8_match(bin->exe_path, exe_path, match_flags)) { binary = bin; break; @@ -446,6 +451,7 @@ dbgi_fuzzy_search_items_from_key_exe_query(DBGI_Scope *scope, U128 key, String8 Temp scratch = scratch_begin(0, 0); DBGI_FuzzySearchItemArray items = {0}; exe_path = path_normalized_from_string(scratch.arena, exe_path); + StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); { //- rjf: unpack key U64 slot_idx = key.u64[1]%dbgi_shared->fuzzy_search_slots_count; @@ -481,7 +487,7 @@ dbgi_fuzzy_search_items_from_key_exe_query(DBGI_Scope *scope, U128 key, String8 // rjf: try to grab last valid results for this key/query; determine if stale B32 stale = 1; - if(str8_match(exe_path, node->buckets[node->gen%ArrayCount(node->buckets)].exe_path, 0) && + if(str8_match(exe_path, node->buckets[node->gen%ArrayCount(node->buckets)].exe_path, match_flags) && target == node->buckets[node->gen%ArrayCount(node->buckets)].target && node->gen != 0) { @@ -639,6 +645,7 @@ dbgi_parse_thread_entry_point(void *p) //- rjf: grab next path & unpack String8 exe_path = dbgi_u2p_dequeue_exe_path(scratch.arena); + StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); ProfBegin("begin task for \"%.*s\"", str8_varg(exe_path)); U64 hash = dbgi_hash_from_string(exe_path, path_match_flags_from_os(operating_system_from_context())); U64 slot_idx = hash%dbgi_shared->binary_slots_count; @@ -654,7 +661,7 @@ dbgi_parse_thread_entry_point(void *p) DBGI_Binary *binary = 0; for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) { - if(str8_match(bin->exe_path, exe_path, 0)) + if(str8_match(bin->exe_path, exe_path, match_flags)) { binary = bin; break; @@ -942,7 +949,7 @@ dbgi_parse_thread_entry_point(void *p) { OS_MutexScopeR(stripe->rw_mutex) for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) { - if(str8_match(bin->exe_path, exe_path, 0) && + if(str8_match(bin->exe_path, exe_path, match_flags) && bin->scope_touch_count == 0) { done = 1; @@ -961,7 +968,7 @@ dbgi_parse_thread_entry_point(void *p) { OS_MutexScopeW(stripe->rw_mutex) for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) { - if(str8_match(bin->exe_path, exe_path, 0)) + if(str8_match(bin->exe_path, exe_path, match_flags)) { if(bin->refcount == 0) { @@ -1032,7 +1039,7 @@ dbgi_parse_thread_entry_point(void *p) { OS_MutexScopeW(stripe->rw_mutex) for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) { - if(str8_match(bin->exe_path, exe_path, 0)) + if(str8_match(bin->exe_path, exe_path, match_flags)) { String8 dbg_path = og_dbg_path; if(dbg_path.size == 0) @@ -1069,7 +1076,7 @@ dbgi_parse_thread_entry_point(void *p) { OS_MutexScopeW(stripe->rw_mutex) for(DBGI_Binary *bin = slot->first; bin != 0; bin = bin->next) { - if(str8_match(bin->exe_path, exe_path, 0)) + if(str8_match(bin->exe_path, exe_path, match_flags)) { bin->flags &= ~DBGI_BinaryFlag_ParseInFlight; break; From 93c0e657fd5cd6ec672c572e37b7bfa1cbf41a57 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 24 Feb 2024 20:08:44 -0800 Subject: [PATCH 135/275] eliminate old test files --- src/demon/test/demon_attach.cpp | 65 -- src/demon/test/demon_regs_test.cpp | 166 ---- src/demon/test/demon_scratch.cpp | 250 ------ src/demon/test/demon_win32_freeze_test.cpp | 935 --------------------- src/demon/test/demon_win32_thread_test.cpp | 874 ------------------- 5 files changed, 2290 deletions(-) delete mode 100644 src/demon/test/demon_attach.cpp delete mode 100644 src/demon/test/demon_regs_test.cpp delete mode 100644 src/demon/test/demon_scratch.cpp delete mode 100644 src/demon/test/demon_win32_freeze_test.cpp delete mode 100644 src/demon/test/demon_win32_thread_test.cpp diff --git a/src/demon/test/demon_attach.cpp b/src/demon/test/demon_attach.cpp deleted file mode 100644 index ca9fb1ea..00000000 --- a/src/demon/test/demon_attach.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -// exe // - -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "demon/demon_inc.h" -#include "syms_helpers/syms_internal_overrides.h" -#include "syms/syms_inc.h" -#include "syms_helpers/syms_helpers.h" - -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "demon/demon_inc.c" -#include "syms_helpers/syms_internal_overrides.c" -#include "syms/syms_inc.c" -#include "syms_helpers/syms_helpers.c" - -int -main(int argument_count, char **arguments) -{ - os_init(argument_count, arguments); - Arena *arena = arena_alloc(); - demon_init(); - - //- rjf: find PID of mule_loop.exe - String8 attach_process_name = str8_lit("mule_loop.exe"); - U32 pid = 0; - { - DEMON_ProcessIter it = {0}; - demon_proc_iter_begin(&it); - for(DEMON_ProcessInfo info = {0}; demon_proc_iter_next(arena, &it, &info);) - { - if(str8_match(info.name, attach_process_name, 0)) - { - pid = info.pid; - break; - } - } - demon_proc_iter_end(&it); - } - - //- rjf: attach - B32 attach_good = demon_attach_process(pid); - - //- rjf: get events - DEMON_RunCtrls ctrls = {0}; - DEMON_EventList events = demon_run(arena, ctrls); - for(DEMON_Event *event = events.first; event != 0; event = event->next) - { - int x = 0; - } - -#if 0 - //- rjf: try to break in the loop - DEMON_RunCtrls ctrls = {0}; - DEMON_Trap trap = {0}; - { - U64 loop_bp = 0x0000000140001074; - ctrls.trap_count = 1; - ctrls.traps = &trap; - } -#endif -} diff --git a/src/demon/test/demon_regs_test.cpp b/src/demon/test/demon_regs_test.cpp deleted file mode 100644 index c5ef06b5..00000000 --- a/src/demon/test/demon_regs_test.cpp +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "demon/demon_inc.h" -#include "syms_helpers/syms_internal_overrides.h" -#include "syms/syms_inc.h" -#include "syms_helpers/syms_helpers.h" - -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "demon/demon_inc.c" -#include "syms_helpers/syms_internal_overrides.c" -#include "syms/syms_inc.c" -#include "syms_helpers/syms_helpers.c" - -internal SYMS_String8 -file_load_func_for_syms(void *user, SYMS_Arena *arena, SYMS_String8 file_name){ - String8 data = os_read_file(arena, str8_from_syms(file_name)); - SYMS_String8 result = syms_from_str8(data); - return(result); -} - -int -main(int argument_count, char **arguments) -{ - os_init(argument_count, arguments); - Temp scratch = scratch_begin(0, 0); - - // setup - demon_init(); - - // parse arguments - String8 executable_file_name = {0}; - U64 bp_address = 0; - - { - String8List command_line_arguments = os_get_command_line_arguments(); - CmdLine cmd_line = cmd_line_from_string_list(scratch.arena, command_line_arguments); - if (cmd_line.inputs.first != 0){ - executable_file_name = cmd_line.inputs.first->string; - } - String8 bp_string = cmd_line_string(cmd_line, str8_lit("bp")); - try_u64_from_str8_c_rules(bp_string, &bp_address); - } - - // check parameters - if (bp_address == 0 || executable_file_name.size == 0){ - printf("bad parameters\n"); - exit(0); - } - - // demon launch - OS_LaunchOptions launch_opts = {0}; - str8_list_push(scratch.arena, &launch_opts.cmd_line, executable_file_name); - launch_opts.path = os_get_path(scratch.arena, OS_SystemPath_Current); - U32 process_id = demon_launch_process(&launch_opts); - if (process_id == 0){ - printf("could not launch: '%.*s'\n", str8_varg(executable_file_name)); - exit(0); - } - - // demon loop - { - DEMON_Handle process = 0; - DEMON_Handle thread = 0; - - B32 hit_bp = false; - U64 single_step_counter = 0; - - U64 counter = 0; - for (;;){ - Temp temp = temp_begin(scratch.arena); - - DEMON_RunCtrls run_controls = {0}; - DEMON_Trap traps[1]; - - if (!hit_bp){ - if (process != 0){ - run_controls.trap_count = 1; - run_controls.traps = traps; - run_controls.traps[0].process = process; - run_controls.traps[0].address = bp_address; - } - } - else{ - run_controls.single_step_thread = thread; - } - - DEMON_EventList events = demon_run(temp.arena, run_controls); - - for (DEMON_Event *event = events.first; - event != 0; - event = event->next, counter += 1){ - // update tracking state - switch (event->kind){ - case DEMON_EventKind_CreateProcess: - { - process = event->process; - }break; - - case DEMON_EventKind_ExitProcess: - { - if (event->process == process){ - process = 0; - } - }break; - - case DEMON_EventKind_CreateThread: - { - thread = event->thread; - }break; - - case DEMON_EventKind_Breakpoint: - { - hit_bp = true; - }break; - - case DEMON_EventKind_SingleStep: - { - single_step_counter += 1; - - SYMS_RegX64 regs1 = {0}; - demon_read_x64_regs(thread, ®s1); - demon_write_x64_regs(thread, ®s1); - SYMS_RegX64 regs2 = {0}; - demon_read_x64_regs(thread, ®s2); - if (!MemoryMatchStruct(®s1, ®s2)){ - printf("mismatch at single_step_counter=%llu\n", single_step_counter); - } - - if (single_step_counter == 1000){ - goto end_loop; - } - }break; - - case DEMON_EventKind_NotAttached: - { - fprintf(stderr, "not attached - exiting\n"); - goto end_loop; - }break; - - case DEMON_EventKind_NotInitialized: - case DEMON_EventKind_UnexpectedFailure: - { - fprintf(stderr, "unexpected error - exiting\n"); - goto end_loop; - }break; - } - } - - goto end_it; - end_loop: - temp_end(temp); - goto loop_exit; - end_it:; - } - - loop_exit:; - } - - printf("[done]\n"); - scratch_end(scratch); -} - diff --git a/src/demon/test/demon_scratch.cpp b/src/demon/test/demon_scratch.cpp deleted file mode 100644 index beb1cc40..00000000 --- a/src/demon/test/demon_scratch.cpp +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "demon/demon_inc.h" -#include "syms_helpers/syms_internal_overrides.h" -#include "syms/syms_inc.h" -#include "syms_helpers/syms_helpers.h" - -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "demon/demon_inc.c" -#include "syms_helpers/syms_internal_overrides.c" -#include "syms/syms_inc.c" -#include "syms_helpers/syms_helpers.c" - -internal SYMS_String8 -file_load_func_for_syms(void *user, SYMS_Arena *arena, SYMS_String8 file_name){ - String8 data = os_read_file(arena, str8_from_syms(file_name)); - SYMS_String8 result = syms_from_str8(data); - return(result); -} - -int -main(int argument_count, char **arguments) -{ - os_init(argument_count, arguments); - demon_init(); - - String8Node node[2]; - -#define TARGET_EXE "C:\\devel\\projects\\debugger\\build\\mule_unwind_20210511_clang11_lldlink.exe" - - OS_LaunchOptions options = {0}; -#if OS_WINDOWS - str8_list_push(&options.cmd_line, &node[0], str8_lit(TARGET_EXE)); - options.path = str8_lit("C:\\devel\\projects\\debugger\\build\\"); -#else - str8_list_push(&options.cmd_line, &node[0], str8_lit("/home/allenw/projects_copy/debugger/build/mule_main")); - options.path = str8_lit("/home/allenw/projects_copy/debugger/build/"); -#endif - U32 process_id = demon_launch_process(&options); - if (process_id == 0){ - printf("Could not launch process\n"); - exit(1); - } - -#if OS_WINDOWS - U64 bp_addr = 0x140001134; -#else - U64 bp_addr = 0x400918; -#endif - - DEMON_Handle process = 0; - DEMON_Handle thread = 0; - DEMON_Handle module = 0; - U64 module_base = 0; - SYMS_Group *group = 0; - - B32 hit_bp = false; - U64 counter = 0; - - for (;;){ - DEMON_RunCtrls run_controls = {0}; - DEMON_Trap trap_memory[2]; - - DEMON_Trap *trap_ptr = trap_memory; - if (process != 0 && !hit_bp){ - trap_ptr->process = process; - trap_ptr->address = bp_addr; - trap_ptr += 1; - } - run_controls.traps = trap_memory; - run_controls.trap_count = (U64)(trap_ptr - trap_memory); - - Temp scratch = scratch_begin(0, 0); - DEMON_EventList events = demon_run(scratch.arena, run_controls); - - for (DEMON_Event *event = events.first; - event != 0; - event = event->next){ - printf("STEP[%05llx] -- ", counter); - counter += 1; - - switch (event->kind){ - case DEMON_EventKind_NotInitialized: - { - printf("Not Initialized\n"); - exit(1); - }break; - - case DEMON_EventKind_NotAttached: - { - printf("Not Attached\n"); - exit(1); - }break; - - case DEMON_EventKind_UnexpectedFailure: - { - printf("Unexpected Failure\n"); - exit(1); - }break; - - case DEMON_EventKind_CreateProcess: - { - printf("Create Process\n"); - if (process == 0){ - process = event->process; - } - }break; - - case DEMON_EventKind_CreateThread: - { - printf("Create Thread\n"); - if (thread == 0){ - thread = event->thread; - } - }break; - - case DEMON_EventKind_LoadModule: - { - Temp temp = temp_begin(scratch.arena); - String8 file_name = demon_full_path_from_module(scratch.arena, event->module); - printf("Load Module: %.*s\n", str8_varg(file_name)); - if (module == 0 && str8_match(file_name, str8_lit(TARGET_EXE), 0)){ - module = event->module; - module_base = event->address; - - // setup syms group - group = syms_group_alloc(); - - SYMS_FileLoadCtx ctx = {0}; - ctx.file_load_func = file_load_func_for_syms; - - SYMS_String8List file_names = {0}; - syms_string_list_push(group->arena, &file_names, syms_from_str8(file_name)); - - SYMS_FileInfOptions opts = {0}; - - SYMS_FileInfResult inf_result = syms_file_inf_infer_from_file_list(group->arena, ctx, file_names, &opts); - syms_group_init(group, &inf_result.data_parsed); - } - temp_end(temp); - }break; - - case DEMON_EventKind_ExitProcess: - { - printf("Exit Process\n"); - exit(0); - }break; - - case DEMON_EventKind_ExitThread: - { - printf("Exit Thread\n"); - }break; - - case DEMON_EventKind_UnloadModule: - { - printf("Unload Module\n"); - }break; - - case DEMON_EventKind_Breakpoint: - { - Architecture arch = demon_arch_from_object(event->process); - U64 ip = event->instruction_pointer; - printf("Breakpoint: %llx\n", ip); - - hit_bp = true; - - //- unwind - - // setup bin - SYMS_String8 bin_data = group->bin_data; - SYMS_BinAccel *generic_bin = group->bin; - SYMS_PeBinAccel *pe_bin = 0; - if (generic_bin->format == SYMS_FileFormat_PE){ - pe_bin = (SYMS_PeBinAccel*)generic_bin; - } - - if (pe_bin != 0){ - // read regs - SYMS_RegX64 regs = {0}; - demon_read_x64_regs(event->thread, ®s); - - // read stack - SYMS_U64 sp = regs.rsp.u64; - SYMS_U64 sp_rounded_down = sp&~(KB(4) - 1); - - SYMS_String8 stack_memory = {0}; - stack_memory.size = KB(8); - stack_memory.str = push_array_no_zero(scratch.arena, U8, stack_memory.size); - - SYMS_U64 stack_memory_addr = sp_rounded_down; - stack_memory.size = demon_read_memory_amap(event->process, stack_memory.str, - stack_memory_addr, stack_memory.size); - - // unwind loop - U64 counter = 1; - for (;; counter += 1){ - printf("%02llu: ip=%llx; sp=%llx\n", counter, regs.rip.u64, regs.rsp.u64); - SYMS_MemoryView memview = syms_memory_view_make(stack_memory, stack_memory_addr); - SYMS_UnwindResult unwind_result = syms_unwind_pe_x64(bin_data, pe_bin, module_base, &memview, ®s); - if (unwind_result.dead){ - break; - } - } - } - }break; - - case DEMON_EventKind_Trap: - { - Architecture arch = demon_arch_from_object(event->process); - U64 ip = event->instruction_pointer; - printf("Trap: %llx\n", ip); - }break; - - case DEMON_EventKind_SingleStep: - { - printf("Single Step: %llx\n", event->instruction_pointer); - }break; - - case DEMON_EventKind_Exception: - { - printf("Exception: %llx\n", event->instruction_pointer); - }break; - - case DEMON_EventKind_Halt: - { - printf("Halt\n"); - }break; - - case DEMON_EventKind_Memory: - { - printf("Memory\n"); - }break; - - default: - { - printf("Unhandled Event\n"); - exit(1); - }break; - } - } - scratch_end(scratch); - } - - printf("Done\n"); -} - diff --git a/src/demon/test/demon_win32_freeze_test.cpp b/src/demon/test/demon_win32_freeze_test.cpp deleted file mode 100644 index 86b564ba..00000000 --- a/src/demon/test/demon_win32_freeze_test.cpp +++ /dev/null @@ -1,935 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -// NOTE(rjf): (18 October 2021) Notes on Win32 process halting via -// DebugBreakProcess: -// -// Calling DebugBreakProcess seems to cause a few events to come back: -// 1. Thread Creation Event -// 2. Breakpoint Event (with the thread matching that of #1) -// 3. Thread Exiting Event (matching #1) -// -// Having done this experiment on a single-threaded program (mule_loop.exe), -// I can only infer that what is happening here is that when DebugBreakProcess -// is called, it first injects a thread into the target process that runs -// code with an int3. This is very similar to the old approach that Demon -// took. -// -// It's going to be difficult to distinguish between these CreateThreads and -// ExitThreads from others (not caused by halting), even though we can match -// the hit breakpoint to the associated thread. -// -// What could be possible (in order to distinguish the hit breakpoint as a -// halt event, instead of an arbitrary breakpoint) is looking at the breakpoint -// address. This injected thread has a breakpoint that's different from the -// initial breakpoint that the kernel automatically hits when a process is -// first being debugged. -// -// With DebugBreakProcess: -// - first breakpoint that is hit: 0x7ff8ad9806b0 in kernel code -// - last breakpoint that is hit: 0x7ff8ad950860 in kernel code (halt) -// -// Without DebugBreakProcess: -// - first breakpoint that is hit: 0x7ff8ad9806b0 -// - -// NOTE(rjf): (18 October 2021) Notes on suspending processes via -// NtSuspendProcess: -// -// NtSuspendProcess is an undocumented API that is exported by ntdll. It is -// fairly simple but could be unstable. To call it, the main trick is that -// you need a handle with certain privileges (PROCESS_SUSPEND_RESUME), so -// you can't just take any handle and use it. -// -// To use it, we can manually load it from ntdll, grab an elevated handle -// for a given process HANDLE, and then call it. We can resume, then, with -// NtResumeProcess. -// -// Other than this, our options seem to more-or-less lie in individually -// suspending all of the threads in the process-to-be-halted. - -#include - -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "syms_helpers/syms_internal_overrides.h" -#include "syms/syms_inc.h" -#include "syms_helpers/syms_helpers.h" - -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "syms_helpers/syms_internal_overrides.c" -#include "syms/syms_inc.c" -#include "syms_helpers/syms_helpers.c" - -typedef LONG NtSuspendProcessFunction(HANDLE ProcessHandle); -global NtSuspendProcessFunction *NtSuspendProcess = 0; - -//////////////////////////////// -// NOTE(allen): Win32 Demon Exceptions - -#define DEMON_W32_EXCEPTION_BREAKPOINT 0x80000003u -#define DEMON_W32_EXCEPTION_SINGLE_STEP 0x80000004u -#define DEMON_W32_EXCEPTION_LONG_JUMP 0x80000026u -#define DEMON_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u -#define DEMON_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu -#define DEMON_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u -#define DEMON_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u -#define DEMON_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du -#define DEMON_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu -#define DEMON_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu -#define DEMON_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u -#define DEMON_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u -#define DEMON_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u -#define DEMON_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u -#define DEMON_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u -#define DEMON_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u -#define DEMON_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u -#define DEMON_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du -#define DEMON_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u -#define DEMON_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u -#define DEMON_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u -#define DEMON_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu -#define DEMON_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u -#define DEMON_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u -#define DEMON_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u -#define DEMON_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u -#define DEMON_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u -#define DEMON_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u -#define DEMON_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au -#define DEMON_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u -#define DEMON_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u -#define DEMON_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u -#define DEMON_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u -#define DEMON_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u -#define DEMON_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u -#define DEMON_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u -#define DEMON_W32_EXCEPTION_NO_MEMORY 0xC0000017u -#define DEMON_W32_EXCEPTION_THROW 0xE06D7363u - -//////////////////////////////// -// NOTE(allen): Win32 Demon Register API Codes - -#define DEMON_W32_CTX_X86 0x00010000 -#define DEMON_W32_CTX_X64 0x00100000 - -#define DEMON_W32_CTX_INTEL_CONTROL 0x0001 -#define DEMON_W32_CTX_INTEL_INTEGER 0x0002 -#define DEMON_W32_CTX_INTEL_SEGMENTS 0x0004 -#define DEMON_W32_CTX_INTEL_FLOATS 0x0008 -#define DEMON_W32_CTX_INTEL_DEBUG 0x0010 -#define DEMON_W32_CTX_INTEL_EXTENDED 0x0020 -#define DEMON_W32_CTX_INTEL_XSTATE 0x0040 - -#define DEMON_W32_CTX_X86_ALL (DEMON_W32_CTX_X86 | \ -DEMON_W32_CTX_INTEL_CONTROL | DEMON_W32_CTX_INTEL_INTEGER | \ -DEMON_W32_CTX_INTEL_SEGMENTS | DEMON_W32_CTX_INTEL_DEBUG | \ -DEMON_W32_CTX_INTEL_EXTENDED) -#define DEMON_W32_CTX_X64_ALL (DEMON_W32_CTX_X64 | \ -DEMON_W32_CTX_INTEL_CONTROL | DEMON_W32_CTX_INTEL_INTEGER | \ -DEMON_W32_CTX_INTEL_SEGMENTS | DEMON_W32_CTX_INTEL_FLOATS | \ -DEMON_W32_CTX_INTEL_DEBUG) - -struct TEST_DebugEvent -{ - String8 name; - U64 process_id; - U64 thread_id; - HANDLE process; - HANDLE thread; - U64 addr; - DEBUG_EVENT evt; -}; - -struct TEST_Trap -{ - HANDLE process; - U64 address; -}; - -internal U16 -test_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave) -{ - U16 result = 0; - U32 top = (fxsave->StatusWord >> 11) & 7; - for (U32 fpr = 0; fpr < 8; fpr += 1){ - U32 tag = 3; - if (fxsave->TagWord & (1 << fpr)){ - U32 st = (fpr - top)&7; - - SYMS_Reg80 *fp = (SYMS_Reg80*)&fxsave->FloatRegisters[st*16]; - U16 exponent = fp->sign1_exp15 & bitmask15; - U64 integer_part = fp->int1_frac63 >> 63; - U64 fraction_part = fp->int1_frac63 & bitmask63; - - // tag: 0 - normal; 1 - zero; 2 - special - tag = 2; - if (exponent == 0){ - if (integer_part == 0 && fraction_part == 0){ - tag = 1; - } - } - else if (exponent != bitmask15 && integer_part != 0){ - tag = 0; - } - } - result |= tag << (2 * fpr); - } - return(result); -} - -internal U16 -test_w32_xsave_tag_word_from_real_tag_word(U16 ftw) -{ - U16 compact = 0; - for (U32 fpr = 0; fpr < 8; fpr++){ - U32 tag = (ftw >> (fpr * 2)) & 3; - if (tag != 3){ - compact |= (1 << fpr); - } - } - return(compact); -} - -internal B32 -test_w32_read_x64_regs(HANDLE thread, SYMS_RegX64 *dst) -{ - Temp scratch = scratch_begin(0, 0); - - // NOTE(allen): Check available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); - - // NOTE(allen): Setup the context - CONTEXT *ctx = 0; - U32 ctx_flags = DEMON_W32_CTX_X64_ALL; - if (avx_enabled){ - ctx_flags |= DEMON_W32_CTX_INTEL_XSTATE; - } - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){ - void *ctx_memory = push_array(scratch.arena, U8, size); - if (!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)){ - ctx = 0; - } - } - - B32 avx_available = false; - - if (ctx != 0){ - // NOTE(allen): Finish Context Setup - if (avx_enabled){ - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); - } - - // NOTE(allen): Determine what features are available on this particular ctx - // TODO(allen): Experiment carefully with this nonsense. - // Does avx_enabled = avx_available in all circumstances or not? - DWORD64 xstate_flags = 0; - if (GetXStateFeaturesMask(ctx, &xstate_flags)){ - if (xstate_flags & XSTATE_MASK_AVX){ - avx_available = true; - } - } - } - - // get thread context - HANDLE thread_handle = thread; - if (!GetThreadContext(thread_handle, ctx)){ - ctx = 0; - } - - B32 result = false; - if (ctx != 0){ - result = true; - - // NOTE(allen): Convert CONTEXT -> SYMS_RegX64 - dst->rax.u64 = ctx->Rax; - dst->rcx.u64 = ctx->Rcx; - dst->rdx.u64 = ctx->Rdx; - dst->rbx.u64 = ctx->Rbx; - dst->rsp.u64 = ctx->Rsp; - dst->rbp.u64 = ctx->Rbp; - dst->rsi.u64 = ctx->Rsi; - dst->rdi.u64 = ctx->Rdi; - dst->r8.u64 = ctx->R8; - dst->r9.u64 = ctx->R9; - dst->r10.u64 = ctx->R10; - dst->r11.u64 = ctx->R11; - dst->r12.u64 = ctx->R12; - dst->r13.u64 = ctx->R13; - dst->r14.u64 = ctx->R14; - dst->r15.u64 = ctx->R15; - dst->rip.u64 = ctx->Rip; - dst->cs.u16 = ctx->SegCs; - dst->ds.u16 = ctx->SegDs; - dst->es.u16 = ctx->SegEs; - dst->fs.u16 = ctx->SegFs; - dst->gs.u16 = ctx->SegGs; - dst->ss.u16 = ctx->SegSs; - dst->dr0.u32 = ctx->Dr0; - dst->dr1.u32 = ctx->Dr1; - dst->dr2.u32 = ctx->Dr2; - dst->dr3.u32 = ctx->Dr3; - dst->dr6.u32 = ctx->Dr6; - dst->dr7.u32 = ctx->Dr7; - - // NOTE(allen): This bit is "supposed to always be 1" I guess. - // TODO(allen): Not sure what this is all about but I haven't investigated it yet. - // This might be totally not necessary or something. - dst->rflags.u64 = ctx->EFlags | 0x2; - - XSAVE_FORMAT *xsave = &ctx->FltSave; - dst->fcw.u16 = xsave->ControlWord; - dst->fsw.u16 = xsave->StatusWord; - dst->ftw.u16 = test_w32_real_tag_word_from_xsave(xsave); - dst->fop.u16 = xsave->ErrorOpcode; - dst->fcs.u16 = xsave->ErrorSelector; - dst->fds.u16 = xsave->DataSelector; - dst->fip.u32 = xsave->ErrorOffset; - dst->fdp.u32 = xsave->DataOffset; - dst->mxcsr.u32 = xsave->MxCsr; - dst->mxcsr_mask.u32 = xsave->MxCsr_Mask; - - M128A *float_s = xsave->FloatRegisters; - SYMS_Reg80 *float_d = &dst->fpr0; - for (U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1){ - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } - - if (!avx_available){ - M128A *xmm_s = xsave->XmmRegisters; - SYMS_Reg256 *xmm_d = &dst->ymm0; - for (U32 n = 0; n < 16; n += 1, xmm_s += 1, xmm_d += 1){ - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); - } - } - - if (avx_available){ - DWORD part0_length = 0; - M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); - DWORD part1_length = 0; - M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); - Assert(part0_length == part1_length); - - DWORD count = part0_length/sizeof(part0[0]); - count = ClampTop(count, 16); - SYMS_Reg256 *ymm_d = &dst->ymm0; - for (DWORD i = 0; - i < count; - i += 1, part0 += 1, part1 += 1, ymm_d += 1){ - // TODO(allen): Are we writing these out in the right order? Seems weird right? - ymm_d->u64[3] = part0->Low; - ymm_d->u64[2] = part0->High; - ymm_d->u64[1] = part1->Low; - ymm_d->u64[0] = part1->High; - } - } - - } - - scratch_end(scratch); - return(result); -} - -internal B32 -test_w32_write_x64_regs(HANDLE thread, SYMS_RegX64 *src) -{ - Temp scratch = scratch_begin(0, 0); - - // NOTE(allen): Check available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); - - // NOTE(allen): Setup the context - CONTEXT *ctx = 0; - U32 ctx_flags = DEMON_W32_CTX_X64_ALL; - if (avx_enabled){ - ctx_flags |= DEMON_W32_CTX_INTEL_XSTATE; - } - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){ - void *ctx_memory = push_array(scratch.arena, U8, size); - if (!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)){ - ctx = 0; - } - } - - B32 avx_available = false; - - if (ctx != 0){ - // NOTE(allen): Finish Context Setup - if (avx_enabled){ - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); - } - - // NOTE(allen): Determine what features are available on this particular ctx - // TODO(allen): Experiment carefully with this nonsense. - // Does avx_enabled = avx_available in all circumstances or not? - DWORD64 xstate_flags = 0; - if (GetXStateFeaturesMask(ctx, &xstate_flags)){ - if (xstate_flags & XSTATE_MASK_AVX){ - avx_available = true; - } - } - } - - B32 result = false; - if (ctx != 0){ - // NOTE(allen): Convert SYMS_RegX64 -> CONTEXT - ctx->ContextFlags = ctx_flags; - - ctx->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; - - ctx->Rax = src->rax.u64; - ctx->Rcx = src->rcx.u64; - ctx->Rdx = src->rdx.u64; - ctx->Rbx = src->rbx.u64; - ctx->Rsp = src->rsp.u64; - ctx->Rbp = src->rbp.u64; - ctx->Rsi = src->rsi.u64; - ctx->Rdi = src->rdi.u64; - ctx->R8 = src->r8.u64; - ctx->R9 = src->r9.u64; - ctx->R10 = src->r10.u64; - ctx->R11 = src->r11.u64; - ctx->R12 = src->r12.u64; - ctx->R13 = src->r13.u64; - ctx->R14 = src->r14.u64; - ctx->R15 = src->r15.u64; - ctx->Rip = src->rip.u64; - ctx->SegCs = src->cs.u16; - ctx->SegDs = src->ds.u16; - ctx->SegEs = src->es.u16; - ctx->SegFs = src->fs.u16; - ctx->SegGs = src->gs.u16; - ctx->SegSs = src->ss.u16; - ctx->Dr0 = src->dr0.u32; - ctx->Dr1 = src->dr1.u32; - ctx->Dr2 = src->dr2.u32; - ctx->Dr3 = src->dr3.u32; - ctx->Dr6 = src->dr6.u32; - ctx->Dr7 = src->dr7.u32; - - ctx->EFlags = src->rflags.u64; - - XSAVE_FORMAT *fxsave = &ctx->FltSave; - fxsave->ControlWord = src->fcw.u16; - fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = test_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); - fxsave->ErrorOpcode = src->fop.u16; - fxsave->ErrorSelector = src->fcs.u16; - fxsave->DataSelector = src->fds.u16; - fxsave->ErrorOffset = src->fip.u32; - fxsave->DataOffset = src->fdp.u32; - - M128A *float_d = fxsave->FloatRegisters; - SYMS_Reg80 *float_s = &src->fpr0; - for (U32 n = 0; - n < 8; - n += 1, float_s += 1, float_d += 1){ - MemoryCopy(float_d, float_s, 10); - } - - if (!avx_available){ - M128A *xmm_d = fxsave->XmmRegisters; - SYMS_Reg256 *xmm_s = &src->ymm0; - for (U32 n = 0; - n < 8; - n += 1, xmm_d += 1, xmm_s += 1){ - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); - } - } - - if (avx_available){ - DWORD part0_length = 0; - M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); - DWORD part1_length = 0; - M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); - Assert(part0_length == part1_length); - - DWORD count = part0_length/sizeof(part0[0]); - count = ClampTop(count, 16); - SYMS_Reg256 *ymm_d = &src->ymm0; - for (DWORD i = 0; - i < count; - i += 1, part0 += 1, part1 += 1, ymm_d += 1){ - // TODO(allen): Are we writing these out in the right order? Seems weird right? - part0->Low = ymm_d->u64[3]; - part0->High = ymm_d->u64[2]; - part1->Low = ymm_d->u64[1]; - part1->High = ymm_d->u64[0]; - } - } - - //- set thread context - HANDLE thread_handle = thread; - if (SetThreadContext(thread_handle, ctx)){ - result = true; - } - } - - scratch_end(scratch); - return(result); -} - -internal B32 -test_w32_read_memory(HANDLE process_handle, void *dst, U64 src_address, U64 size) -{ - B32 result = true; - U8 *ptr = (U8*)dst; - U8 *opl = ptr + size; - U64 cursor = src_address; - for (;ptr < opl;){ - SIZE_T to_read = (SIZE_T)(opl - ptr); - SIZE_T actual_read = 0; - if (!ReadProcessMemory(process_handle, (LPCVOID)cursor, ptr, to_read, &actual_read)){ - result = false; - break; - } - ptr += actual_read; - cursor += actual_read; - } - return(result); -} - -internal B32 -test_w32_write_memory(HANDLE process_handle, U64 dst_address, void *src, U64 size) -{ - B32 result = true; - U8 *ptr = (U8*)src; - U8 *opl = ptr + size; - U64 cursor = dst_address; - for (;ptr < opl;){ - SIZE_T to_write = (SIZE_T)(opl - ptr); - SIZE_T actual_write = 0; - if (!WriteProcessMemory(process_handle, (LPVOID)cursor, ptr, to_write, &actual_write)){ - result = false; - break; - } - ptr += actual_write; - cursor += actual_write; - } - return(result); -} - -internal B32 -test_launch_process(OS_LaunchOptions *options) -{ - B32 result = false; - Temp scratch = scratch_begin(0, 0); - - StringJoin join_params = {0}; - join_params.pre = str8_lit("\""); - join_params.sep = str8_lit("\" \""); - join_params.post = str8_lit("\""); - String8 cmd = str8_list_join(scratch.arena, &options->cmd_line, &join_params); - - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - String8 env = str8_list_join(scratch.arena, &options->env, &join_params2); - - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, options->path); - String16 env16 = str16_from_8(scratch.arena, env); - - DWORD access_flags = PROCESS_QUERY_INFORMATION | DEBUG_PROCESS | PROCESS_VM_READ | PROCESS_VM_WRITE; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - PROCESS_INFORMATION process_info = {0}; - if (CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 0, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, - &startup_info, &process_info)) - { - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); - result = true; - } - - scratch_end(scratch); - return(result); -} - -global HANDLE g_process_1 = 0; -global DWORD g_process_id_1 = 0; -global U64 g_process_injection_addr_1 = 0; -global HANDLE g_process_2 = 0; -global DWORD g_process_id_2 = 0; - -internal B32 -test_w32_inject_thread(HANDLE process, U64 start_address) -{ - B32 result = false; - LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address; - HANDLE thread = CreateRemoteThread(process, 0, 0, start, 0, 0, 0); - if(thread != 0) - { - CloseHandle(thread); - result = true; - } - return result; -} - -internal void -test_halt(void) -{ - test_w32_inject_thread(g_process_1, g_process_injection_addr_1); -} - -internal TEST_DebugEvent -test_run_process(HANDLE step_thread, HANDLE suspend_thread, U64 traps_count, TEST_Trap *traps) -{ - Temp scratch = scratch_begin(0, 0); - TEST_DebugEvent result = {0}; - - //- rjf: freeze thread - if(suspend_thread) - { - DWORD result = SuspendThread(suspend_thread); - DWORD error = GetLastError(); - int x = 0; - } - - //- rjf: write traps - U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, traps_count); - { - TEST_Trap *trap = traps; - for(U64 i = 0; i < traps_count; i += 1, trap += 1) - { - if(test_w32_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)) - { - U8 int3 = 0xCC; - test_w32_write_memory(trap->process, trap->address, &int3, 1); - } - else - { - trap_swap_bytes[i] = 0xCC; - } - } - } - - //- rjf: set single step bit - if(step_thread != 0) - { - SYMS_RegX64 regs = {0}; - test_w32_read_x64_regs(step_thread, ®s); - regs.rflags.u64 |= 0x100; - test_w32_write_x64_regs(step_thread, ®s); - } - - //- rjf: continue - local_persist B32 need_resume = 0; - local_persist DWORD resume_pid = 0; - local_persist DWORD resume_tid = 0; - - if(need_resume) - { - need_resume = 0; - ContinueDebugEvent(resume_pid, resume_tid, DBG_CONTINUE); - } - - //- rjf: get event - DEBUG_EVENT evt = {0}; - if(WaitForDebugEvent(&evt, INFINITE)) - { - need_resume = 1; - resume_pid = evt.dwProcessId; - resume_tid = evt.dwThreadId; - result.evt = evt; - - switch(evt.dwDebugEventCode) - { - default:break; - - case CREATE_PROCESS_DEBUG_EVENT: - { - result.name = str8_lit("create process"); - result.process_id = evt.dwProcessId; - result.process = evt.u.CreateProcessInfo.hProcess; - result.thread_id = evt.dwThreadId; - result.thread = evt.u.CreateProcessInfo.hThread; - if(g_process_1 == 0) - { - g_process_1 = result.process; - g_process_id_1 = result.process_id; - - // injection memory - { - U8 injection_code[64]; - injection_code[0] = 0xCC; - injection_code[1] = 0xC3; - for (U64 i = 2; i < 64; i += 1){ - injection_code[i] = 0xCC; - } - - U64 injection_size = 64; - U64 injection_address = (U64)VirtualAllocEx(g_process_1, 0, injection_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE); - test_w32_write_memory(g_process_1, injection_address, injection_code, sizeof(injection_code)); - g_process_injection_addr_1 = injection_address; - } - - - } - else - { - g_process_2 = result.process; - g_process_id_2 = result.process_id; - } - }break; - - case EXIT_PROCESS_DEBUG_EVENT: - { - result.name = str8_lit("exit process"); - result.process_id = evt.dwProcessId; - }break; - - case CREATE_THREAD_DEBUG_EVENT: - { - result.name = str8_lit("create thread"); - result.thread_id = evt.dwThreadId; - result.thread = evt.u.CreateThread.hThread; - }break; - - case EXIT_THREAD_DEBUG_EVENT: - { - result.name = str8_lit("exit thread"); - result.thread_id = evt.dwThreadId; - }break; - - case LOAD_DLL_DEBUG_EVENT: - { - result.name = str8_lit("load dll"); - }break; - - case UNLOAD_DLL_DEBUG_EVENT: - { - result.name = str8_lit("unload dll"); - }break; - - case EXCEPTION_DEBUG_EVENT: - { - result.name = str8_lit("exception"); - - EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; - EXCEPTION_RECORD *exception = &edi->ExceptionRecord; - - switch(exception->ExceptionCode) - { - case DEMON_W32_EXCEPTION_BREAKPOINT: - { - result.name = str8_lit("breakpoint"); - result.addr = (U64)exception->ExceptionAddress; - }break; - - case DEMON_W32_EXCEPTION_SINGLE_STEP: - { - result.name = str8_lit("single_step"); - }break; - - case DEMON_W32_EXCEPTION_THROW: - { - result.name = str8_lit("exception throw"); - }break; - - case DEMON_W32_EXCEPTION_ACCESS_VIOLATION: - case DEMON_W32_EXCEPTION_IN_PAGE_ERROR: - { - result.name = str8_lit("exception access violation"); - }break; - - default: - { - }break; - } - - }break; - - case OUTPUT_DEBUG_STRING_EVENT: - { - Temp scratch = scratch_begin(0, 0); - result.name = str8_lit("output debug string"); - - U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; - U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; - - // TODO(allen): is the string in UTF-8 or UTF-16? - - U8 *buffer = push_array_no_zero(scratch.arena, U8, string_size + 1); - test_w32_read_memory(g_process_id_1 == evt.dwProcessId ? g_process_1 : g_process_2, buffer, string_address, string_size); - buffer[string_size] = 0; - - printf("%s\n", buffer); - scratch_end(scratch); - }break; - - case RIP_EVENT: - { - result.name = str8_lit("rip event"); - }break; - - } - } - - //- rjf: set single step bit - if(step_thread != 0) - { - SYMS_RegX64 regs = {0}; - test_w32_read_x64_regs(step_thread, ®s); - regs.rflags.u64 &= ~0x100; - test_w32_write_x64_regs(step_thread, ®s); - } - - //- rjf: unset traps - { - TEST_Trap *trap = traps; - for(U64 i = 0; i < traps_count; i += 1, trap += 1) - { - U8 og_byte = trap_swap_bytes[i]; - if(og_byte != 0xCC) - { - test_w32_write_memory(trap->process, trap->address, &og_byte, 1); - } - } - } - - //- rjf: resume thread - if(suspend_thread) - { - ResumeThread(suspend_thread); - } - - scratch_end(scratch); - return result; -} - -internal DWORD -test_halter_thread(void *params) -{ - HANDLE original_process_handle = params; - Sleep(1500); - test_halt(); -#if 0 - DWORD process_id = GetProcessId(original_process_handle); - HANDLE elevated_process_handle = OpenProcess(PROCESS_SUSPEND_RESUME, 0, process_id); - LONG result = NtSuspendProcess(elevated_process_handle); - CloseHandle(elevated_process_handle); - DebugBreakProcess(process); -#endif - return 0; -} - -int -main(int argument_count, char **arguments) -{ - os_init(argument_count, arguments); - Arena *arena = arena_alloc(); - - NtSuspendProcess = (NtSuspendProcessFunction *)GetProcAddress(GetModuleHandle("ntdll"), "NtSuspendProcess"); - - // rjf: launch - { - OS_LaunchOptions opts = {0}; - opts.path = os_get_path(arena, OS_SystemPath_Current); - str8_list_push(arena, &opts.cmd_line, str8_lit("R:\\projects\\debugger\\build\\mule_loop.exe")); - B32 launch_good = test_launch_process(&opts); - int x = 0; - } - - // rjf: get process/thread handles - HANDLE process = 0; - HANDLE thread1 = 0; - U64 thread1_id = 0; - { - for(TEST_DebugEvent evt = {0};;) - { - evt = test_run_process(0, 0, 0, 0); - if(evt.process) - { - process = evt.process; - } - if(evt.thread) - { - thread1 = evt.thread; - thread1_id = evt.thread_id; - } - if(process != 0 && thread1 != 0) - { - break; - } - } - } - - // rjf: get first breakpoint - { - for(TEST_DebugEvent evt = {0};;) - { - evt = test_run_process(0, 0, 0, 0); - if(evt.evt.dwDebugEventCode == EXCEPTION_DEBUG_EVENT) - { - break; - } - } - } - - // rjf: launch halter thread - DWORD halter_id = 0; - { - CreateThread(0, 0, test_halter_thread, process, 0, &halter_id); - } - - // rjf: run + wait for event - for(;;) - { - TEST_DebugEvent evt = test_run_process(0, 0, 0, 0); - int x = 0; - } - -#if 0 - //- rjf: run until 2nd thread starts up - HANDLE thread2 = 0; - U64 thread2_id = 0; - { - for(TEST_DebugEvent evt = {0};;) - { - evt = test_run_process(0, 0, 0, 0/*ArrayCount(traps), traps*/); - if(evt.thread) - { - thread2 = evt.thread; - thread2_id = evt.thread_id; - break; - } - } - } - - //- rjf: wait for first output string - { - for(TEST_DebugEvent evt = {0};;) - { - evt = test_run_process(0, 0, 0, 0); - if(evt.evt.dwDebugEventCode == OUTPUT_DEBUG_STRING_EVENT) - { - break; - } - } - } - - //- rjf: wait for bps - { - // U64 thread1_stop_vaddr = 0x0000000140001119; - // U64 thread2_stop_vaddr = 0x00000001400010C8; - // TEST_Trap traps[] = - { - // {process, thread1_stop_vaddr}, - //{process, thread2_stop_vaddr}, - }; - TEST_DebugEvent evt = {0}; - //for(;;) - { - evt = test_run_process(0, thread2, 0, 0/*ArrayCount(traps), traps*/); - int x = 0; - } - for(;;) {} - } -#endif -} diff --git a/src/demon/test/demon_win32_thread_test.cpp b/src/demon/test/demon_win32_thread_test.cpp deleted file mode 100644 index 6ecd4780..00000000 --- a/src/demon/test/demon_win32_thread_test.cpp +++ /dev/null @@ -1,874 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include - -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "syms_helpers/syms_internal_overrides.h" -#include "syms/syms_inc.h" -#include "syms_helpers/syms_helpers.h" - -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "syms_helpers/syms_internal_overrides.c" -#include "syms/syms_inc.c" -#include "syms_helpers/syms_helpers.c" - -//////////////////////////////// -// NOTE(allen): Win32 Demon Exceptions - -#define DEMON_W32_EXCEPTION_BREAKPOINT 0x80000003u -#define DEMON_W32_EXCEPTION_SINGLE_STEP 0x80000004u -#define DEMON_W32_EXCEPTION_LONG_JUMP 0x80000026u -#define DEMON_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u -#define DEMON_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu -#define DEMON_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u -#define DEMON_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u -#define DEMON_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du -#define DEMON_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu -#define DEMON_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu -#define DEMON_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u -#define DEMON_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u -#define DEMON_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u -#define DEMON_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u -#define DEMON_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u -#define DEMON_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u -#define DEMON_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u -#define DEMON_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du -#define DEMON_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u -#define DEMON_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u -#define DEMON_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u -#define DEMON_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu -#define DEMON_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u -#define DEMON_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u -#define DEMON_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u -#define DEMON_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u -#define DEMON_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u -#define DEMON_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u -#define DEMON_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au -#define DEMON_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u -#define DEMON_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u -#define DEMON_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u -#define DEMON_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u -#define DEMON_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u -#define DEMON_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u -#define DEMON_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u -#define DEMON_W32_EXCEPTION_NO_MEMORY 0xC0000017u -#define DEMON_W32_EXCEPTION_THROW 0xE06D7363u - -//////////////////////////////// -// NOTE(allen): Win32 Demon Register API Codes - -#define DEMON_W32_CTX_X86 0x00010000 -#define DEMON_W32_CTX_X64 0x00100000 - -#define DEMON_W32_CTX_INTEL_CONTROL 0x0001 -#define DEMON_W32_CTX_INTEL_INTEGER 0x0002 -#define DEMON_W32_CTX_INTEL_SEGMENTS 0x0004 -#define DEMON_W32_CTX_INTEL_FLOATS 0x0008 -#define DEMON_W32_CTX_INTEL_DEBUG 0x0010 -#define DEMON_W32_CTX_INTEL_EXTENDED 0x0020 -#define DEMON_W32_CTX_INTEL_XSTATE 0x0040 - -#define DEMON_W32_CTX_X86_ALL (DEMON_W32_CTX_X86 | \ -DEMON_W32_CTX_INTEL_CONTROL | DEMON_W32_CTX_INTEL_INTEGER | \ -DEMON_W32_CTX_INTEL_SEGMENTS | DEMON_W32_CTX_INTEL_DEBUG | \ -DEMON_W32_CTX_INTEL_EXTENDED) -#define DEMON_W32_CTX_X64_ALL (DEMON_W32_CTX_X64 | \ -DEMON_W32_CTX_INTEL_CONTROL | DEMON_W32_CTX_INTEL_INTEGER | \ -DEMON_W32_CTX_INTEL_SEGMENTS | DEMON_W32_CTX_INTEL_FLOATS | \ -DEMON_W32_CTX_INTEL_DEBUG) - -struct TEST_DebugEvent -{ - String8 name; - U64 process_id; - U64 thread_id; - HANDLE process; - HANDLE thread; - U64 addr; - DEBUG_EVENT evt; -}; - -struct TEST_Trap -{ - HANDLE process; - U64 address; -}; - -internal U16 -test_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave) -{ - U16 result = 0; - U32 top = (fxsave->StatusWord >> 11) & 7; - for (U32 fpr = 0; fpr < 8; fpr += 1){ - U32 tag = 3; - if (fxsave->TagWord & (1 << fpr)){ - U32 st = (fpr - top)&7; - - SYMS_Reg80 *fp = (SYMS_Reg80*)&fxsave->FloatRegisters[st*16]; - U16 exponent = fp->sign1_exp15 & bitmask15; - U64 integer_part = fp->int1_frac63 >> 63; - U64 fraction_part = fp->int1_frac63 & bitmask63; - - // tag: 0 - normal; 1 - zero; 2 - special - tag = 2; - if (exponent == 0){ - if (integer_part == 0 && fraction_part == 0){ - tag = 1; - } - } - else if (exponent != bitmask15 && integer_part != 0){ - tag = 0; - } - } - result |= tag << (2 * fpr); - } - return(result); -} - -internal U16 -test_w32_xsave_tag_word_from_real_tag_word(U16 ftw) -{ - U16 compact = 0; - for (U32 fpr = 0; fpr < 8; fpr++){ - U32 tag = (ftw >> (fpr * 2)) & 3; - if (tag != 3){ - compact |= (1 << fpr); - } - } - return(compact); -} - -internal B32 -test_w32_read_x64_regs(HANDLE thread, SYMS_RegX64 *dst) -{ - Temp scratch = scratch_begin(0, 0); - - // NOTE(allen): Check available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); - - // NOTE(allen): Setup the context - CONTEXT *ctx = 0; - U32 ctx_flags = DEMON_W32_CTX_X64_ALL; - if (avx_enabled){ - ctx_flags |= DEMON_W32_CTX_INTEL_XSTATE; - } - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){ - void *ctx_memory = push_array(scratch.arena, U8, size); - if (!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)){ - ctx = 0; - } - } - - B32 avx_available = false; - - if (ctx != 0){ - // NOTE(allen): Finish Context Setup - if (avx_enabled){ - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); - } - - // NOTE(allen): Determine what features are available on this particular ctx - // TODO(allen): Experiment carefully with this nonsense. - // Does avx_enabled = avx_available in all circumstances or not? - DWORD64 xstate_flags = 0; - if (GetXStateFeaturesMask(ctx, &xstate_flags)){ - if (xstate_flags & XSTATE_MASK_AVX){ - avx_available = true; - } - } - } - - // get thread context - HANDLE thread_handle = thread; - if (!GetThreadContext(thread_handle, ctx)){ - ctx = 0; - } - - B32 result = false; - if (ctx != 0){ - result = true; - - // NOTE(allen): Convert CONTEXT -> SYMS_RegX64 - dst->rax.u64 = ctx->Rax; - dst->rcx.u64 = ctx->Rcx; - dst->rdx.u64 = ctx->Rdx; - dst->rbx.u64 = ctx->Rbx; - dst->rsp.u64 = ctx->Rsp; - dst->rbp.u64 = ctx->Rbp; - dst->rsi.u64 = ctx->Rsi; - dst->rdi.u64 = ctx->Rdi; - dst->r8.u64 = ctx->R8; - dst->r9.u64 = ctx->R9; - dst->r10.u64 = ctx->R10; - dst->r11.u64 = ctx->R11; - dst->r12.u64 = ctx->R12; - dst->r13.u64 = ctx->R13; - dst->r14.u64 = ctx->R14; - dst->r15.u64 = ctx->R15; - dst->rip.u64 = ctx->Rip; - dst->cs.u16 = ctx->SegCs; - dst->ds.u16 = ctx->SegDs; - dst->es.u16 = ctx->SegEs; - dst->fs.u16 = ctx->SegFs; - dst->gs.u16 = ctx->SegGs; - dst->ss.u16 = ctx->SegSs; - dst->dr0.u32 = ctx->Dr0; - dst->dr1.u32 = ctx->Dr1; - dst->dr2.u32 = ctx->Dr2; - dst->dr3.u32 = ctx->Dr3; - dst->dr6.u32 = ctx->Dr6; - dst->dr7.u32 = ctx->Dr7; - - // NOTE(allen): This bit is "supposed to always be 1" I guess. - // TODO(allen): Not sure what this is all about but I haven't investigated it yet. - // This might be totally not necessary or something. - dst->rflags.u64 = ctx->EFlags | 0x2; - - XSAVE_FORMAT *xsave = &ctx->FltSave; - dst->fcw.u16 = xsave->ControlWord; - dst->fsw.u16 = xsave->StatusWord; - dst->ftw.u16 = test_w32_real_tag_word_from_xsave(xsave); - dst->fop.u16 = xsave->ErrorOpcode; - dst->fcs.u16 = xsave->ErrorSelector; - dst->fds.u16 = xsave->DataSelector; - dst->fip.u32 = xsave->ErrorOffset; - dst->fdp.u32 = xsave->DataOffset; - dst->mxcsr.u32 = xsave->MxCsr; - dst->mxcsr_mask.u32 = xsave->MxCsr_Mask; - - M128A *float_s = xsave->FloatRegisters; - SYMS_Reg80 *float_d = &dst->fpr0; - for (U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1){ - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } - - if (!avx_available){ - M128A *xmm_s = xsave->XmmRegisters; - SYMS_Reg256 *xmm_d = &dst->ymm0; - for (U32 n = 0; n < 16; n += 1, xmm_s += 1, xmm_d += 1){ - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); - } - } - - if (avx_available){ - DWORD part0_length = 0; - M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); - DWORD part1_length = 0; - M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); - Assert(part0_length == part1_length); - - DWORD count = part0_length/sizeof(part0[0]); - count = ClampTop(count, 16); - SYMS_Reg256 *ymm_d = &dst->ymm0; - for (DWORD i = 0; - i < count; - i += 1, part0 += 1, part1 += 1, ymm_d += 1){ - // TODO(allen): Are we writing these out in the right order? Seems weird right? - ymm_d->u64[3] = part0->Low; - ymm_d->u64[2] = part0->High; - ymm_d->u64[1] = part1->Low; - ymm_d->u64[0] = part1->High; - } - } - - } - - scratch_end(scratch); - return(result); -} - -internal B32 -test_w32_write_x64_regs(HANDLE thread, SYMS_RegX64 *src) -{ - Temp scratch = scratch_begin(0, 0); - - // NOTE(allen): Check available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); - - // NOTE(allen): Setup the context - CONTEXT *ctx = 0; - U32 ctx_flags = DEMON_W32_CTX_X64_ALL; - if (avx_enabled){ - ctx_flags |= DEMON_W32_CTX_INTEL_XSTATE; - } - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){ - void *ctx_memory = push_array(scratch.arena, U8, size); - if (!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)){ - ctx = 0; - } - } - - B32 avx_available = false; - - if (ctx != 0){ - // NOTE(allen): Finish Context Setup - if (avx_enabled){ - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); - } - - // NOTE(allen): Determine what features are available on this particular ctx - // TODO(allen): Experiment carefully with this nonsense. - // Does avx_enabled = avx_available in all circumstances or not? - DWORD64 xstate_flags = 0; - if (GetXStateFeaturesMask(ctx, &xstate_flags)){ - if (xstate_flags & XSTATE_MASK_AVX){ - avx_available = true; - } - } - } - - B32 result = false; - if (ctx != 0){ - // NOTE(allen): Convert SYMS_RegX64 -> CONTEXT - ctx->ContextFlags = ctx_flags; - - ctx->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; - - ctx->Rax = src->rax.u64; - ctx->Rcx = src->rcx.u64; - ctx->Rdx = src->rdx.u64; - ctx->Rbx = src->rbx.u64; - ctx->Rsp = src->rsp.u64; - ctx->Rbp = src->rbp.u64; - ctx->Rsi = src->rsi.u64; - ctx->Rdi = src->rdi.u64; - ctx->R8 = src->r8.u64; - ctx->R9 = src->r9.u64; - ctx->R10 = src->r10.u64; - ctx->R11 = src->r11.u64; - ctx->R12 = src->r12.u64; - ctx->R13 = src->r13.u64; - ctx->R14 = src->r14.u64; - ctx->R15 = src->r15.u64; - ctx->Rip = src->rip.u64; - ctx->SegCs = src->cs.u16; - ctx->SegDs = src->ds.u16; - ctx->SegEs = src->es.u16; - ctx->SegFs = src->fs.u16; - ctx->SegGs = src->gs.u16; - ctx->SegSs = src->ss.u16; - ctx->Dr0 = src->dr0.u32; - ctx->Dr1 = src->dr1.u32; - ctx->Dr2 = src->dr2.u32; - ctx->Dr3 = src->dr3.u32; - ctx->Dr6 = src->dr6.u32; - ctx->Dr7 = src->dr7.u32; - - ctx->EFlags = src->rflags.u64; - - XSAVE_FORMAT *fxsave = &ctx->FltSave; - fxsave->ControlWord = src->fcw.u16; - fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = test_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); - fxsave->ErrorOpcode = src->fop.u16; - fxsave->ErrorSelector = src->fcs.u16; - fxsave->DataSelector = src->fds.u16; - fxsave->ErrorOffset = src->fip.u32; - fxsave->DataOffset = src->fdp.u32; - - M128A *float_d = fxsave->FloatRegisters; - SYMS_Reg80 *float_s = &src->fpr0; - for (U32 n = 0; - n < 8; - n += 1, float_s += 1, float_d += 1){ - MemoryCopy(float_d, float_s, 10); - } - - if (!avx_available){ - M128A *xmm_d = fxsave->XmmRegisters; - SYMS_Reg256 *xmm_s = &src->ymm0; - for (U32 n = 0; - n < 8; - n += 1, xmm_d += 1, xmm_s += 1){ - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); - } - } - - if (avx_available){ - DWORD part0_length = 0; - M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); - DWORD part1_length = 0; - M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); - Assert(part0_length == part1_length); - - DWORD count = part0_length/sizeof(part0[0]); - count = ClampTop(count, 16); - SYMS_Reg256 *ymm_d = &src->ymm0; - for (DWORD i = 0; - i < count; - i += 1, part0 += 1, part1 += 1, ymm_d += 1){ - // TODO(allen): Are we writing these out in the right order? Seems weird right? - part0->Low = ymm_d->u64[3]; - part0->High = ymm_d->u64[2]; - part1->Low = ymm_d->u64[1]; - part1->High = ymm_d->u64[0]; - } - } - - //- set thread context - HANDLE thread_handle = thread; - if (SetThreadContext(thread_handle, ctx)){ - result = true; - } - } - - scratch_end(scratch); - return(result); -} - -internal B32 -test_w32_read_memory(HANDLE process_handle, void *dst, U64 src_address, U64 size) -{ - B32 result = true; - U8 *ptr = (U8*)dst; - U8 *opl = ptr + size; - U64 cursor = src_address; - for (;ptr < opl;){ - SIZE_T to_read = (SIZE_T)(opl - ptr); - SIZE_T actual_read = 0; - if (!ReadProcessMemory(process_handle, (LPCVOID)cursor, ptr, to_read, &actual_read)){ - result = false; - break; - } - ptr += actual_read; - cursor += actual_read; - } - return(result); -} - -internal B32 -test_w32_write_memory(HANDLE process_handle, U64 dst_address, void *src, U64 size) -{ - B32 result = true; - U8 *ptr = (U8*)src; - U8 *opl = ptr + size; - U64 cursor = dst_address; - for (;ptr < opl;){ - SIZE_T to_write = (SIZE_T)(opl - ptr); - SIZE_T actual_write = 0; - if (!WriteProcessMemory(process_handle, (LPVOID)cursor, ptr, to_write, &actual_write)){ - result = false; - break; - } - ptr += actual_write; - cursor += actual_write; - } - return(result); -} - -internal B32 -test_launch_process(OS_LaunchOptions *options) -{ - B32 result = false; - Temp scratch = scratch_begin(0, 0); - - StringJoin join_params = {0}; - join_params.pre = str8_lit("\""); - join_params.sep = str8_lit("\" \""); - join_params.post = str8_lit("\""); - String8 cmd = str8_list_join(scratch.arena, &options->cmd_line, &join_params); - - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - String8 env = str8_list_join(scratch.arena, &options->env, &join_params2); - - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, options->path); - String16 env16 = str16_from_8(scratch.arena, env); - - DWORD access_flags = PROCESS_QUERY_INFORMATION | DEBUG_PROCESS | PROCESS_VM_READ | PROCESS_VM_WRITE; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - PROCESS_INFORMATION process_info = {0}; - if (CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 0, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, - &startup_info, &process_info)) - { - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); - result = true; - } - - scratch_end(scratch); - return(result); -} - -global HANDLE g_process = 0; -global DWORD g_process_id = 0; -global HANDLE g_thread1 = 0; -global DWORD g_thread1_id = 0; -global HANDLE g_thread2 = 0; -global DWORD g_thread2_id = 0; - -internal TEST_DebugEvent -test_run_process(HANDLE step_thread, HANDLE suspend_thread, U64 traps_count, TEST_Trap *traps) -{ - Temp scratch = scratch_begin(0, 0); - TEST_DebugEvent result = {0}; - - //- rjf: freeze thread - if(suspend_thread) - { - DWORD result = SuspendThread(suspend_thread); - DWORD error = GetLastError(); - int x = 0; - } - - //- rjf: write traps - U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, traps_count); - { - TEST_Trap *trap = traps; - for(U64 i = 0; i < traps_count; i += 1, trap += 1) - { - if(test_w32_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)) - { - U8 int3 = 0xCC; - test_w32_write_memory(trap->process, trap->address, &int3, 1); - } - else - { - trap_swap_bytes[i] = 0xCC; - } - } - } - - //- rjf: set single step bit - if(step_thread != 0) - { - SYMS_RegX64 regs = {0}; - test_w32_read_x64_regs(step_thread, ®s); - regs.rflags.u64 |= 0x100; - test_w32_write_x64_regs(step_thread, ®s); - } - - //- rjf: continue - local_persist B32 need_resume = 0; - local_persist DWORD resume_pid = 0; - local_persist DWORD resume_tid = 0; - - if(need_resume) - { - need_resume = 0; - ContinueDebugEvent(resume_pid, resume_tid, DBG_CONTINUE); - } - - //- rjf: get event - DEBUG_EVENT evt = {0}; - if(WaitForDebugEvent(&evt, INFINITE)) - { - need_resume = 1; - resume_pid = evt.dwProcessId; - resume_tid = evt.dwThreadId; - result.evt = evt; - - switch(evt.dwDebugEventCode) - { - default:break; - - case CREATE_PROCESS_DEBUG_EVENT: - { - result.name = str8_lit("create process"); - result.process_id = evt.dwProcessId; - result.process = evt.u.CreateProcessInfo.hProcess; - result.thread_id = evt.dwThreadId; - result.thread = evt.u.CreateProcessInfo.hThread; - if(g_process == 0) - { - g_process = result.process; - g_process_id = result.process_id; - } - if(g_thread1 == 0) - { - g_thread1 = result.thread; - g_thread1_id = result.thread_id; - } - }break; - - case EXIT_PROCESS_DEBUG_EVENT: - { - result.name = str8_lit("exit process"); - result.process_id = evt.dwProcessId; - }break; - - case CREATE_THREAD_DEBUG_EVENT: - { - result.name = str8_lit("create thread"); - result.thread_id = evt.dwThreadId; - result.thread = evt.u.CreateThread.hThread; - g_thread2 = result.thread; - g_thread2_id = result.thread_id; - }break; - - case EXIT_THREAD_DEBUG_EVENT: - { - result.name = str8_lit("exit thread"); - result.thread_id = evt.dwThreadId; - }break; - - case LOAD_DLL_DEBUG_EVENT: - { - result.name = str8_lit("load dll"); - }break; - - case UNLOAD_DLL_DEBUG_EVENT: - { - result.name = str8_lit("unload dll"); - }break; - - case EXCEPTION_DEBUG_EVENT: - { - result.name = str8_lit("exception"); - - EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; - EXCEPTION_RECORD *exception = &edi->ExceptionRecord; - - switch(exception->ExceptionCode) - { - case DEMON_W32_EXCEPTION_BREAKPOINT: - { - result.name = str8_lit("breakpoint"); - result.addr = (U64)exception->ExceptionAddress; - - local_persist B32 did_first_bp = 0; - if(did_first_bp != 0) - { - HANDLE thread = evt.dwThreadId == g_thread1_id ? g_thread1 : g_thread2; - SYMS_RegX64 regs = {0}; - test_w32_read_x64_regs(thread, ®s); - regs.rip.u64 = result.addr; - test_w32_write_x64_regs(thread, ®s); - } - did_first_bp = 1; - - }break; - - case DEMON_W32_EXCEPTION_SINGLE_STEP: - { - result.name = str8_lit("single_step"); - }break; - - case DEMON_W32_EXCEPTION_THROW: - { - result.name = str8_lit("exception throw"); - }break; - - case DEMON_W32_EXCEPTION_ACCESS_VIOLATION: - case DEMON_W32_EXCEPTION_IN_PAGE_ERROR: - { - result.name = str8_lit("exception access violation"); - }break; - - default: - { - }break; - } - - }break; - - case OUTPUT_DEBUG_STRING_EVENT: - { - Temp scratch = scratch_begin(0, 0); - result.name = str8_lit("output debug string"); - - U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; - U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; - - // TODO(allen): is the string in UTF-8 or UTF-16? - - U8 *buffer = push_array_no_zero(scratch.arena, U8, string_size + 1); - test_w32_read_memory(g_process, buffer, string_address, string_size); - buffer[string_size] = 0; - - printf("%s\n", buffer); - scratch_end(scratch); - }break; - - case RIP_EVENT: - { - result.name = str8_lit("rip event"); - }break; - - } - } - - //- rjf: set single step bit - if(step_thread != 0) - { - SYMS_RegX64 regs = {0}; - test_w32_read_x64_regs(step_thread, ®s); - regs.rflags.u64 &= ~0x100; - test_w32_write_x64_regs(step_thread, ®s); - } - - //- rjf: unset traps - { - TEST_Trap *trap = traps; - for(U64 i = 0; i < traps_count; i += 1, trap += 1) - { - U8 og_byte = trap_swap_bytes[i]; - if(og_byte != 0xCC) - { - test_w32_write_memory(trap->process, trap->address, &og_byte, 1); - } - } - } - - //- rjf: check for more events - for(int i = 0; i < 100; i += 1) - { - DEBUG_EVENT evt = {0}; - if(WaitForDebugEvent(&evt, 0)) - { - int x = 0; - } - } - - //- rjf: resume thread - if(suspend_thread) - { - ResumeThread(suspend_thread); - } - - scratch_end(scratch); - return result; -} - -int -main(int argument_count, char **arguments) -{ - os_init(argument_count, arguments); - Arena *arena = arena_alloc(); - - U64 before_loop_stop_vaddr = 0x0000000140001089; - U64 inner_loop_stop_vaddr = 0x0000000140001098; - - // rjf: launch - { - OS_LaunchOptions opts = {0}; - opts.path = os_get_path(arena, OS_SystemPath_Current); - str8_list_push(arena, &opts.cmd_line, str8_lit("R:\\projects\\debugger\\build\\mule_loop_threads_win32.exe")); - B32 launch_good = test_launch_process(&opts); - int x = 0; - } - - // rjf: get process/thread handles - HANDLE process = 0; - HANDLE thread1 = 0; - U64 thread1_id = 0; - { - for(TEST_DebugEvent evt = {0};;) - { - evt = test_run_process(0, 0, 0, 0); - if(evt.process) - { - process = evt.process; - } - if(evt.thread) - { - thread1 = evt.thread; - thread1_id = evt.thread_id; - } - if(process != 0 && thread1 != 0) - { - break; - } - } - } - - // rjf: get first breakpoint - { - for(TEST_DebugEvent evt = {0};;) - { - evt = test_run_process(0, 0, 0, 0); - if(evt.evt.dwDebugEventCode == EXCEPTION_DEBUG_EVENT) - { - break; - } - } - } - - //- rjf: run until 2nd thread starts up - HANDLE thread2 = 0; - U64 thread2_id = 0; - { - TEST_Trap traps[] = - { - {process, before_loop_stop_vaddr}, - }; - int trap_count = 0; //ArrayCount(traps); - for(TEST_DebugEvent evt = {0};;) - { - evt = test_run_process(0, 0, trap_count, traps); - if(str8_match(evt.name, str8_lit("breakpoint"), 0)) - { - trap_count = 0; - } - if(evt.thread) - { - thread2 = evt.thread; - thread2_id = evt.thread_id; - break; - } - } - } - - //- rjf: wait for bps - { - Temp scratch = scratch_begin(0, 0); - TEST_Trap traps[] = - { - {process, 0x0000000140001098}, - {process, 0x00000001400010fb}, - {process, 0x00000001400010bc}, - {process, 0x00000001400010d7}, - }; - - for(int i = 0;; i += 1) - { - TEST_DebugEvent evt = test_run_process(0, 0, 1, &traps[i % ArrayCount(traps)]); - - // rjf: check regs - { - U64 rip = 0; - SYMS_RegX64 *regs = push_array(scratch.arena, SYMS_RegX64, 1); - if(evt.evt.dwThreadId == g_thread1_id && test_w32_read_x64_regs(thread1, regs)) - { - rip = regs->rip.u64; - } - if(evt.evt.dwThreadId == g_thread2_id && test_w32_read_x64_regs(thread2, regs)) - { - rip = regs->rip.u64; - } - - for(int i = 0; i < ArrayCount(traps); i += 1) - { - if(traps[i].address == rip) - { - printf("WRONG BP! 0x%I64x\n", rip); - break; - } - } - } - - if(str8_match(evt.name, str8_lit("breakpoint"), 0)) - { - HANDLE step = 0; - HANDLE suspend = 0; - step = evt.evt.dwThreadId == thread2_id ? thread2 : thread1; - suspend = step == thread2 ? thread1 : thread2; - evt = test_run_process(step, suspend, 0, 0); - } - } - scratch_end(scratch); - } - - return 0; -} From 7c9f127425de9f640f8fb59643894ef326a5a0d8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 24 Feb 2024 22:03:08 -0800 Subject: [PATCH 136/275] cleanup/naming pass over raddbgi_dump, do not require specific named params --- build.bat | 2 +- src/lib_raddbgi_format/raddbgi_format_parse.c | 47 +- src/lib_raddbgi_format/raddbgi_format_parse.h | 1 + src/raddbgi_dump/raddbgi_dump.c | 1116 +++++++++++------ src/raddbgi_dump/raddbgi_dump.h | 100 +- src/raddbgi_dump/raddbgi_dump_main.c | 413 ++++++ src/raddbgi_dump/raddbgi_stringize.c | 776 ------------ src/raddbgi_dump/raddbgi_stringize.h | 114 -- 8 files changed, 1234 insertions(+), 1335 deletions(-) create mode 100644 src/raddbgi_dump/raddbgi_dump_main.c delete mode 100644 src/raddbgi_dump/raddbgi_stringize.c delete mode 100644 src/raddbgi_dump/raddbgi_stringize.h diff --git a/build.bat b/build.bat index 4db67b11..56121a31 100644 --- a/build.bat +++ b/build.bat @@ -101,7 +101,7 @@ pushd build if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg_main.cpp %compile_link% %out%raddbg.exe || exit /b 1 if "%raddbgi_from_pdb%"=="1" %compile% ..\src\raddbgi_from_pdb\raddbgi_from_pdb_main.c %compile_link% %out%raddbgi_from_pdb.exe || exit /b 1 if "%raddbgi_from_dwarf%"=="1" %compile% ..\src\raddbgi_from_dwarf\raddbgi_from_dwarf.c %compile_link% %out%raddbgi_from_dwarf.exe || exit /b 1 -if "%raddbgi_dump%"=="1" %compile% ..\src\raddbgi_dump\raddbgi_dump.c %compile_link% %out%raddbgi_dump.exe || exit /b 1 +if "%raddbgi_dump%"=="1" %compile% ..\src\raddbgi_dump\raddbgi_dump_main.c %compile_link% %out%raddbgi_dump.exe || exit /b 1 if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe || exit /b 1 if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe || exit /b 1 diff --git a/src/lib_raddbgi_format/raddbgi_format_parse.c b/src/lib_raddbgi_format/raddbgi_format_parse.c index cbd6a880..4f6e0b4e 100644 --- a/src/lib_raddbgi_format/raddbgi_format_parse.c +++ b/src/lib_raddbgi_format/raddbgi_format_parse.c @@ -5,7 +5,8 @@ //~ RADDBG Parse API RDI_PROC RDI_ParseStatus -rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out){ +rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out) +{ RDI_ParseStatus result = RDI_ParseStatus_Good; // out header @@ -193,30 +194,30 @@ rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out){ } } } - -#if !defined(RDI_DISABLE_NILS) - if(out->binary_sections == 0) { out->binary_sections = &rdi_binary_section_nil; out->binary_sections_count = 1; } - if(out->file_paths == 0) { out->file_paths = &rdi_file_path_node_nil; out->file_paths_count = 1; } - if(out->source_files == 0) { out->source_files = &rdi_source_file_nil; out->source_files_count = 1; } - if(out->units == 0) { out->units = &rdi_unit_nil; out->units_count = 1; } - if(out->unit_vmap == 0) { out->unit_vmap = &rdi_vmap_entry_nil; out->unit_vmap_count = 1; } - if(out->type_nodes == 0) { out->type_nodes = &rdi_type_node_nil; out->type_nodes_count = 1; } - if(out->udts == 0) { out->udts = &rdi_udt_nil; out->udts_count = 1; } - if(out->members == 0) { out->members = &rdi_member_nil; out->members_count = 1; } - if(out->enum_members == 0) { out->enum_members = &rdi_enum_member_nil; out->enum_members_count = 1; } - if(out->global_variables == 0) { out->global_variables = &rdi_global_variable_nil; out->global_variables_count = 1; } - if(out->global_vmap == 0) { out->global_vmap = &rdi_vmap_entry_nil; out->global_vmap_count = 1; } - if(out->thread_variables == 0) { out->thread_variables = &rdi_thread_variable_nil; out->thread_variables_count = 1; } - if(out->procedures == 0) { out->procedures = &rdi_procedure_nil; out->procedures_count = 1; } - if(out->scopes == 0) { out->scopes = &rdi_scope_nil; out->scopes_count = 1; } - if(out->scope_voffs == 0) { out->scope_voffs = &rdi_voff_nil; out->scope_voffs_count = 1; } - if(out->scope_vmap == 0) { out->scope_vmap = &rdi_vmap_entry_nil; out->scope_vmap_count = 1; } - if(out->locals == 0) { out->locals = &rdi_local_nil; out->locals_count = 1; } - if(out->location_blocks == 0) { out->location_blocks = &rdi_location_block_nil; out->location_blocks_count = 1; } -#endif - } +#if !defined(RDI_DISABLE_NILS) + if(out->top_level_info == 0) { out->top_level_info = &rdi_top_level_info_nil; } + if(out->binary_sections == 0) { out->binary_sections = &rdi_binary_section_nil; out->binary_sections_count = 1; } + if(out->file_paths == 0) { out->file_paths = &rdi_file_path_node_nil; out->file_paths_count = 1; } + if(out->source_files == 0) { out->source_files = &rdi_source_file_nil; out->source_files_count = 1; } + if(out->units == 0) { out->units = &rdi_unit_nil; out->units_count = 1; } + if(out->unit_vmap == 0) { out->unit_vmap = &rdi_vmap_entry_nil; out->unit_vmap_count = 1; } + if(out->type_nodes == 0) { out->type_nodes = &rdi_type_node_nil; out->type_nodes_count = 1; } + if(out->udts == 0) { out->udts = &rdi_udt_nil; out->udts_count = 1; } + if(out->members == 0) { out->members = &rdi_member_nil; out->members_count = 1; } + if(out->enum_members == 0) { out->enum_members = &rdi_enum_member_nil; out->enum_members_count = 1; } + if(out->global_variables == 0) { out->global_variables = &rdi_global_variable_nil; out->global_variables_count = 1; } + if(out->global_vmap == 0) { out->global_vmap = &rdi_vmap_entry_nil; out->global_vmap_count = 1; } + if(out->thread_variables == 0) { out->thread_variables = &rdi_thread_variable_nil; out->thread_variables_count = 1; } + if(out->procedures == 0) { out->procedures = &rdi_procedure_nil; out->procedures_count = 1; } + if(out->scopes == 0) { out->scopes = &rdi_scope_nil; out->scopes_count = 1; } + if(out->scope_voffs == 0) { out->scope_voffs = &rdi_voff_nil; out->scope_voffs_count = 1; } + if(out->scope_vmap == 0) { out->scope_vmap = &rdi_vmap_entry_nil; out->scope_vmap_count = 1; } + if(out->locals == 0) { out->locals = &rdi_local_nil; out->locals_count = 1; } + if(out->location_blocks == 0) { out->location_blocks = &rdi_location_block_nil; out->location_blocks_count = 1; } +#endif + return(result); } diff --git a/src/lib_raddbgi_format/raddbgi_format_parse.h b/src/lib_raddbgi_format/raddbgi_format_parse.h index 97377f93..9e97bcb3 100644 --- a/src/lib_raddbgi_format/raddbgi_format_parse.h +++ b/src/lib_raddbgi_format/raddbgi_format_parse.h @@ -128,6 +128,7 @@ typedef struct RDI_ParsedNameMap{ //~ Global Nils #if !defined(RDI_DISABLE_NILS) +static RDI_TopLevelInfo rdi_top_level_info_nil = {0}; static RDI_BinarySection rdi_binary_section_nil = {0}; static RDI_FilePathNode rdi_file_path_node_nil = {0}; static RDI_SourceFile rdi_source_file_nil = {0}; diff --git a/src/raddbgi_dump/raddbgi_dump.c b/src/raddbgi_dump/raddbgi_dump.c index fbc18af4..019be63b 100644 --- a/src/raddbgi_dump/raddbgi_dump.c +++ b/src/raddbgi_dump/raddbgi_dump.c @@ -1,430 +1,774 @@ // Copyright (c) 2024 Epic Games Tools // 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 "os/os_inc.h" - -#include "raddbgi_stringize.h" -#include "raddbgi_dump.h" - -#include "base/base_inc.c" -#include "os/os_inc.c" - -#include "raddbgi_stringize.c" - //////////////////////////////// -//~ Program Parameters Parser +//~ rjf: RADDBGI Enum -> String Functions -static RADDBGIDUMP_Params* -raddbgidump_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ - RADDBGIDUMP_Params *result = push_array(arena, RADDBGIDUMP_Params, 1); - - // get input raddbg - { - String8 input_name = cmd_line_string(cmdline, str8_lit("raddbg")); - if (input_name.size == 0){ - str8_list_push(arena, &result->errors, - str8_lit("missing required parameter '--raddbg:'")); - } - - if (input_name.size > 0){ - String8 input_data = os_data_from_file_path(arena, input_name); - - if (input_data.size == 0){ - str8_list_pushf(arena, &result->errors, - "could not load input file '%.*s'", str8_varg(input_name)); - } - - if (input_data.size != 0){ - result->input_name = input_name; - result->input_data = input_data; - } - } +internal String8 +rdi_string_from_data_section_tag(RDI_DataSectionTag tag){ + String8 result = {0}; + switch (tag){ +#define X(N,C) case C: result = str8_lit(#N); break; +#define Y(N) + RDI_DataSectionTagXList(X,Y) +#undef X +#undef Y } - - // error options - if (cmd_line_has_flag(cmdline, str8_lit("hide_errors"))){ - String8List vals = cmd_line_strings(cmdline, str8_lit("hide_errors")); - - // if no values - set all to hidden - if (vals.node_count == 0){ - B8 *ptr = (B8*)&result->hide_errors; - B8 *opl = ptr + sizeof(result->hide_errors); - for (;ptr < opl; ptr += 1){ - *ptr = 1; - } - } - - // for each explicit value set the corresponding flag to hidden - for (String8Node *node = vals.first; - node != 0; - node = node->next){ - if (str8_match(node->string, str8_lit("input"), 0)){ - result->hide_errors.input = 1; - } - } + return(result); +} + +internal String8 +rdi_string_from_arch(RDI_Arch arch){ + String8 result = {0}; + switch (arch){ + default: result = str8_lit(""); break; + case RDI_Arch_X86: result = str8_lit("x86"); break; + case RDI_Arch_X64: result = str8_lit("x64"); break; } - - // dump options - { - String8List vals = cmd_line_strings(cmdline, str8_lit("dump")); - if (vals.first == 0){ - B8 *ptr = &result->dump__first; - for (; ptr < &result->dump__last; ptr += 1){ - *ptr = 1; - } - } - else{ - for (String8Node *node = vals.first; - node != 0; - node = node->next){ - if (str8_match(node->string, str8_lit("data_sections"), 0)){ - result->dump_data_sections = 1; - } - else if (str8_match(node->string, str8_lit("top_level_info"), 0)){ - result->dump_top_level_info = 1; - } - else if (str8_match(node->string, str8_lit("binary_sections"), 0)){ - result->dump_binary_sections = 1; - } - else if (str8_match(node->string, str8_lit("file_paths"), 0)){ - result->dump_file_paths = 1; - } - else if (str8_match(node->string, str8_lit("source_files"), 0)){ - result->dump_source_files = 1; - } - else if (str8_match(node->string, str8_lit("units"), 0)){ - result->dump_units = 1; - } - else if (str8_match(node->string, str8_lit("unit_vmap"), 0)){ - result->dump_unit_vmap = 1; - } - else if (str8_match(node->string, str8_lit("type_nodes"), 0)){ - result->dump_type_nodes = 1; - } - else if (str8_match(node->string, str8_lit("udt_data"), 0)){ - result->dump_udt_data = 1; - } - else if (str8_match(node->string, str8_lit("global_variables"), 0)){ - result->dump_global_variables = 1; - } - else if (str8_match(node->string, str8_lit("global_vmap"), 0)){ - result->dump_global_vmap = 1; - } - else if (str8_match(node->string, str8_lit("thread_variables"), 0)){ - result->dump_thread_variables = 1; - } - else if (str8_match(node->string, str8_lit("procedures"), 0)){ - result->dump_procedures = 1; - } - else if (str8_match(node->string, str8_lit("scopes"), 0)){ - result->dump_scopes = 1; - } - else if (str8_match(node->string, str8_lit("scope_vmap"), 0)){ - result->dump_scope_vmap = 1; - } - } - } + return(result); +} + +internal String8 +rdi_string_from_language(RDI_Language language){ + String8 result = {0}; + switch (language){ +#define X(name,code) case code: result = str8_lit(#name); break; + RDI_LanguageXList(X) +#undef X + } + return(result); +} + +internal String8 +rdi_string_from_type_kind(RDI_TypeKind type_kind){ + String8 result = {0}; + switch (type_kind){ + default: result = str8_lit(""); break; +#define X(name,code) case code: result = str8_lit(#name); break; +#define XZ(name,code,size) X(name,code) +#define Y(a,n) + RDI_TypeKindXList(X,XZ,Y) +#undef X +#undef XZ +#undef Y + } + return(result); +} + +internal String8 +rdi_string_from_member_kind(RDI_MemberKind member_kind){ + String8 result = {0}; + switch (member_kind){ + default: result = str8_lit(""); break; +#define X(N,C) case C: result = str8_lit(#N); break; + RDI_MemberKindXList(X) +#undef X + } + return(result); +} + +internal String8 +rdi_string_from_local_kind(RDI_LocalKind local_kind){ + String8 result = {0}; + switch (local_kind){ + default: result = str8_lit(""); break; + case RDI_LocalKind_Parameter: result = str8_lit("Parameter"); break; + case RDI_LocalKind_Variable: result = str8_lit("Variable"); break; } - return(result); } //////////////////////////////// -//~ Entry Point +//~ rjf: RADDBGI Flags -> String Functions -int -main(int argc, char **argv){ - local_persist TCTX main_thread_tctx = {0}; - tctx_init_and_equip(&main_thread_tctx); - Arena *arena = arena_alloc(); - String8List args = os_string_list_from_argcv(arena, argc, argv); - CmdLine cmdline = cmd_line_from_string_list(arena, args); +internal void +rdi_stringize_binary_section_flags(Arena *arena, String8List *out, + RDI_BinarySectionFlags flags){ + if (flags == 0){ + str8_list_push(arena, out, str8_lit("0")); + } + if (flags & RDI_BinarySectionFlag_Read){ + str8_list_push(arena, out, str8_lit("Read ")); + } + if (flags & RDI_BinarySectionFlag_Write){ + str8_list_push(arena, out, str8_lit("Write ")); + } + if (flags & RDI_BinarySectionFlag_Execute){ + str8_list_push(arena, out, str8_lit("Execute ")); + } +} + +internal void +rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, + RDI_TypeModifierFlags flags){ + if (flags == 0){ + str8_list_push(arena, out, str8_lit("0")); + } + if (flags & RDI_TypeModifierFlag_Const){ + str8_list_push(arena, out, str8_lit("Const ")); + } + if (flags & RDI_TypeModifierFlag_Volatile){ + str8_list_push(arena, out, str8_lit("Volatile ")); + } +} + +internal void +rdi_stringize_user_defined_type_flags(Arena *arena, String8List *out, + RDI_UserDefinedTypeFlags flags){ + if (flags == 0){ + str8_list_push(arena, out, str8_lit("0")); + } + if (flags & RDI_UserDefinedTypeFlag_EnumMembers){ + str8_list_push(arena, out, str8_lit("EnumMembers ")); + } +} + +internal void +rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags){ + if (flags == 0){ + str8_list_push(arena, out, str8_lit("0")); + } + if (flags & RDI_LinkFlag_External){ + str8_list_push(arena, out, str8_lit("External ")); + } + if (flags & RDI_LinkFlag_TypeScoped){ + str8_list_push(arena, out, str8_lit("TypeScoped ")); + } + if (flags & RDI_LinkFlag_ProcScoped){ + str8_list_push(arena, out, str8_lit("ProcScoped ")); + } +} + +//////////////////////////////// +//~ rjf: RADDBG Compound Stringize Functions + +global char rdi_stringize_spaces[] = " "; + +internal void +rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *parsed, + U32 indent_level){ + U64 data_section_count = parsed->dsec_count; + RDI_DataSection *ptr = parsed->dsecs; + for (U64 i = 0; i < data_section_count; i += 1, ptr += 1){ + String8 tag_str = rdi_string_from_data_section_tag(ptr->tag); + str8_list_pushf(arena, out, "%.*sdata_section[%5u] = {0x%08llx, %7u, %7u} %.*s\n", + indent_level, rdi_stringize_spaces, + i, ptr->off, ptr->encoded_size, ptr->unpacked_size, str8_varg(tag_str)); + } +} + +internal void +rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_TopLevelInfo *tli, U32 indent_level){ + String8 arch_str = rdi_string_from_arch(tli->architecture); + String8 exe_name = {0}; + exe_name.str = rdi_string_from_idx(parsed, tli->exe_name_string_idx, &exe_name.size); - RADDBGIDUMP_Params *params = raddbgidump_params_from_cmd_line(arena, &cmdline); + str8_list_pushf(arena, out, "%.*sarchitecture=%.*s\n", + indent_level, rdi_stringize_spaces, str8_varg(arch_str)); + str8_list_pushf(arena, out, "%.*sexe_name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(exe_name)); + str8_list_pushf(arena, out, "%.*svoff_max=0x%08llx\n", + indent_level, rdi_stringize_spaces, tli->voff_max); +} + +internal void +rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_BinarySection *bin_section, U32 indent_level){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, bin_section->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); - // show input errors - if (params->errors.node_count > 0 && - !params->hide_errors.input){ - for (String8Node *node = params->errors.first; - node != 0; - node = node->next){ - fprintf(stderr, "error(input): %.*s\n", str8_varg(node->string)); + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_binary_section_flags(arena, out, bin_section->flags); + str8_list_pushf(arena, out, "\n"); + + str8_list_pushf(arena, out, "%.*svoff_first=0x%08x\n", + indent_level, rdi_stringize_spaces, bin_section->voff_first); + str8_list_pushf(arena, out, "%.*svoff_opl =0x%08x\n", + indent_level, rdi_stringize_spaces, bin_section->voff_opl); + str8_list_pushf(arena, out, "%.*sfoff_first=0x%08x\n", + indent_level, rdi_stringize_spaces, bin_section->foff_first); + str8_list_pushf(arena, out, "%.*sfoff_opl =0x%08x\n", + indent_level, rdi_stringize_spaces, bin_section->foff_opl); +} + +internal void +rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, + U32 indent_level){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, file_path->name_string_idx, &name.size); + + U32 this_idx = (U32)(file_path - bundle->file_paths); + + if (file_path->source_file_idx == 0){ + str8_list_pushf(arena, out, "%.*s[%u] '%.*s'\n", + indent_level, rdi_stringize_spaces, + this_idx, str8_varg(name)); + } + else{ + str8_list_pushf(arena, out, "%.*s[%u] '%.*s'; source_file=%u\n", + indent_level, rdi_stringize_spaces, + this_idx, str8_varg(name), file_path->source_file_idx); + } + + for (U32 child = file_path->first_child; + child != 0;){ + // get node for child + RDI_FilePathNode *child_node = 0; + if (child < bundle->file_path_count){ + child_node = bundle->file_paths + child; + } + if (child_node == 0){ + break; + } + + // stringize child + rdi_stringize_file_path(arena, out, parsed, bundle, child_node, indent_level + 1); + + // increment iterator + child = child_node->next_sibling; + } +} + +internal void +rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_SourceFile *source_file, U32 indent_level){ + // extract line map data + RDI_ParsedLineMap line_map = {0}; + rdi_line_map_from_source_file(parsed, source_file, &line_map); + + // stringize line map data + str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); + + for (U32 i = 0; i < line_map.count; i += 1){ + U32 line_num = line_map.nums[i]; + + U32 digit_count = 1; + if (line_num > 0){ + U32 x = line_num; + for (;;){ + x /= 10; + if (x == 0){ + break; + } + digit_count += 1; + } + } + + str8_list_pushf(arena, out, "%.*s %u: ", + indent_level, rdi_stringize_spaces, line_num); + + U32 first = line_map.ranges[i]; + U32 opl_raw = line_map.ranges[i + 1]; + U32 opl = ClampTop(opl_raw, line_map.voff_count); + for (U32 j = first; j < opl; j += 1){ + if (j == first){ + str8_list_pushf(arena, out, "0x%08x\n", line_map.voffs[j]); + } + else{ + str8_list_pushf(arena, out, "%.*s0x%08x\n", + indent_level + digit_count + 3, rdi_stringize_spaces, + line_map.voffs[j]); + } + } + } +} + +internal void +rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_Unit *unit, U32 indent_level){ + String8 unit_name = {0}; + unit_name.str = rdi_string_from_idx(parsed, unit->unit_name_string_idx, &unit_name.size); + String8 compiler_name = {0}; + compiler_name.str = rdi_string_from_idx(parsed, unit->compiler_name_string_idx, + &compiler_name.size); + + str8_list_pushf(arena, out, "%.*sunit_name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(unit_name)); + str8_list_pushf(arena, out, "%.*scompiler_name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(compiler_name)); + + str8_list_pushf(arena, out, "%.*ssource_file_path=%u\n", + indent_level, rdi_stringize_spaces, unit->source_file_path_node); + str8_list_pushf(arena, out, "%.*sobject_file_path=%u\n", + indent_level, rdi_stringize_spaces, unit->object_file_path_node); + str8_list_pushf(arena, out, "%.*sarchive_file_path=%u\n", + indent_level, rdi_stringize_spaces, unit->archive_file_path_node); + str8_list_pushf(arena, out, "%.*sbuild_path=%u\n", + indent_level, rdi_stringize_spaces, unit->build_path_node); + + String8 language_str = rdi_string_from_language(unit->language); + str8_list_pushf(arena, out, "%.*slanguage=%.*s\n", + indent_level, rdi_stringize_spaces, str8_varg(language_str)); + + // extract line info data + RDI_ParsedLineInfo line_info = {0}; + rdi_line_info_from_unit(parsed, unit, &line_info); + + + // stringize line info + str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); + + for (U32 i = 0; i < line_info.count; i += 1){ + U64 first = line_info.voffs[i]; + U64 opl = line_info.voffs[i + 1]; + RDI_Line *line = line_info.lines + i; + RDI_Column *col = 0; + if (i < line_info.col_count){ + col = line_info.cols + i; + } + + if (col == 0){ + str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u\n", + indent_level, rdi_stringize_spaces, + first, opl, line->file_idx, line->line_num); + } + else{ + str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u; columns=[%u,%u)\n", + indent_level, rdi_stringize_spaces, + first, opl, line->file_idx, line->line_num, + col->col_first, col->col_opl); + } + } +} + +internal void +rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_TypeNode *type, U32 indent_level){ + RDI_TypeKind kind = type->kind; + String8 type_kind_str = rdi_string_from_type_kind(kind); + + str8_list_pushf(arena, out, "%.*skind=%.*s\n", + indent_level, rdi_stringize_spaces, str8_varg(type_kind_str)); + + switch (type->kind){ + case RDI_TypeKind_Modifier: + { + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_type_modifier_flags(arena, out, type->flags); + str8_list_push(arena, out, str8_lit("\n")); + }break; + + default: + { + if (type->flags != 0){ + str8_list_pushf(arena, out, "%.*sflags=%x (missing stringizer path)", + indent_level, rdi_stringize_spaces, type->flags); + } + }break; + } + + str8_list_pushf(arena, out, "%.*sbyte_size=%u\n", + indent_level, rdi_stringize_spaces, type->byte_size); + + if (RDI_TypeKind_FirstBuiltIn <= kind && + kind <= RDI_TypeKind_LastBuiltIn){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, type->built_in.name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sbuilt_in.name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + } + + else if (RDI_TypeKind_FirstConstructed <= kind && + kind <= RDI_TypeKind_LastConstructed){ + str8_list_pushf(arena, out, "%.*sconstructed.direct_type=%u\n", + indent_level, rdi_stringize_spaces, type->constructed.direct_type_idx); + + if (type->kind == RDI_TypeKind_Array){ + str8_list_pushf(arena, out, "%.*sconstructed.array_count=%u\n", + indent_level, rdi_stringize_spaces, type->constructed.count); + } + + if (type->kind == RDI_TypeKind_Function || + type->kind == RDI_TypeKind_Method){ + U32 run_first = type->constructed.param_idx_run_first; + U32 run_count_raw = type->constructed.count; + + U32 run_count = 0; + U32 *run = rdi_idx_run_from_first_count(parsed, run_first, run_count_raw, &run_count); + + U32 this_type_idx = 0; + if (run_count > 0 && type->kind == RDI_TypeKind_Method){ + this_type_idx = run[0]; + run += 1; + run_count -= 1; + } + + if (this_type_idx != 0){ + str8_list_pushf(arena, out, "%.*sconstructed.this_type=%u\n", + indent_level, rdi_stringize_spaces, this_type_idx); + } + + str8_list_pushf(arena, out, "%.*sconstructed.params={", + indent_level, rdi_stringize_spaces); + + if (run_count > 0){ + U32 last = run_count - 1; + for (U32 j = 0; j < last; j += 1){ + str8_list_pushf(arena, out, " %u,", run[j]); + } + str8_list_pushf(arena, out, " %u ", run[last]); + } + + str8_list_push(arena, out, str8_lit("}\n")); } } - // will we try to parse an input file - B32 try_parse_input = (params->errors.node_count == 0); + else if (RDI_TypeKind_FirstUserDefined <= kind && + kind <= RDI_TypeKind_LastUserDefined){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, type->user_defined.name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*suser_defined.name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + str8_list_pushf(arena, out, "%.*suser_defined.direct_type=%u\n", + indent_level, rdi_stringize_spaces, + type->user_defined.direct_type_idx); + str8_list_pushf(arena, out, "%.*suser_defined.udt=%u\n", + indent_level, rdi_stringize_spaces, + type->user_defined.udt_idx); + } - RDI_ParseStatus parse_status = RDI_ParseStatus_Good; - RDI_Parsed raddbg__ = {0}; - RDI_Parsed *raddbg = 0; - if (try_parse_input){ - parse_status = rdi_parse(params->input_data.str, params->input_data.size, &raddbg__); - if (parse_status == RDI_ParseStatus_Good){ - raddbg = &raddbg__; + else if (kind == RDI_TypeKind_Bitfield){ + str8_list_pushf(arena, out, "%.*sbitfield.off=%u\n", + indent_level, rdi_stringize_spaces, type->bitfield.off); + str8_list_pushf(arena, out, "%.*sbitfield.size=%u\n", + indent_level, rdi_stringize_spaces, type->bitfield.size); + } +} + +internal void +rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_UDTMemberBundle *member_bundle, RDI_UDT *udt, + U32 indent_level){ + str8_list_pushf(arena, out, "%.*sself_type=%u\n", + indent_level, rdi_stringize_spaces, udt->self_type_idx); + + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_user_defined_type_flags(arena, out, udt->flags); + str8_list_push(arena, out, str8_lit("\n")); + + if (udt->file_idx != 0){ + str8_list_pushf(arena, out, "%.*sloc={file=%u; line=%u; col=%u}\n", + indent_level, rdi_stringize_spaces, + udt->file_idx, udt->line, udt->col); + } + + // enum members + if (udt->flags & RDI_UserDefinedTypeFlag_EnumMembers){ + U32 first_raw = udt->member_first; + U32 opl_raw = first_raw + udt->member_count; + U32 opl = ClampTop(opl_raw, member_bundle->enum_member_count); + U32 first = ClampTop(first_raw, opl); + + if (first < opl){ + str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); + RDI_EnumMember *enum_member = member_bundle->enum_members + first; + for (U32 i = first; i < opl; i += 1, enum_member += 1){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, enum_member->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*s '%.*s' %llu\n", + indent_level, rdi_stringize_spaces, + str8_varg(name), enum_member->val); + } + str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); } } - if (raddbg == 0){ - // TODO(allen): improve this by looking at parse status. - fprintf(stderr, "error(parsing): error trying to parse the input file\n"); + // field members + else{ + U32 first_raw = udt->member_first; + U32 opl_raw = first_raw + udt->member_count; + U32 opl = ClampTop(opl_raw, member_bundle->member_count); + U32 first = ClampTop(first_raw, opl); + + if (first < opl){ + str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); + RDI_Member *member = member_bundle->members + first; + for (U32 i = first; i < opl; i += 1, member += 1){ + str8_list_pushf(arena, out, "%.*s {\n", indent_level, rdi_stringize_spaces); + + String8 kind_str = rdi_string_from_member_kind(member->kind); + str8_list_pushf(arena, out, "%.*s kind=%.*s\n", + indent_level, rdi_stringize_spaces, str8_varg(kind_str)); + + if (member->name_string_idx != 0){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, member->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*s name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + } + + str8_list_pushf(arena, out, "%.*s type=%u\n", + indent_level, rdi_stringize_spaces, member->type_idx); + str8_list_pushf(arena, out, "%.*s off=%u\n", + indent_level, rdi_stringize_spaces, member->off); + + str8_list_pushf(arena, out, "%.*s }\n", indent_level, rdi_stringize_spaces); + } + str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); + } } +} + +internal void +rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_GlobalVariable *global_variable, U32 indent_level){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, global_variable->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); - // dump + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, global_variable->link_flags); + str8_list_push(arena, out, str8_lit("\n")); + + str8_list_pushf(arena, out, "%.*svoff=0x%08llx\n", + indent_level, rdi_stringize_spaces, global_variable->voff); + + str8_list_pushf(arena, out, "%.*stype_idx=%u\n", + indent_level, rdi_stringize_spaces, global_variable->type_idx); + + str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", + indent_level, rdi_stringize_spaces, global_variable->container_idx); +} + +internal void +rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_ThreadVariable *thread_var, + U32 indent_level){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, thread_var->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, thread_var->link_flags); + str8_list_push(arena, out, str8_lit("\n")); + + str8_list_pushf(arena, out, "%.*stls_off=0x%08x\n", + indent_level, rdi_stringize_spaces, thread_var->tls_off); + + str8_list_pushf(arena, out, "%.*stype_idx=%u\n", + indent_level, rdi_stringize_spaces, thread_var->type_idx); + + str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", + indent_level, rdi_stringize_spaces, thread_var->container_idx); +} + +internal void +rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_Procedure *proc, U32 indent_level){ + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, proc->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + + String8 link_name = {0}; + link_name.str = rdi_string_from_idx(parsed, proc->link_name_string_idx, &link_name.size); + str8_list_pushf(arena, out, "%.*slink_name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(link_name)); + + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, proc->link_flags); + str8_list_push(arena, out, str8_lit("\n")); + + str8_list_pushf(arena, out, "%.*stype_idx=%u\n", + indent_level, rdi_stringize_spaces, proc->type_idx); + + str8_list_pushf(arena, out, "%.*sroot_scope_idx=%u\n", + indent_level, rdi_stringize_spaces, proc->root_scope_idx); + + str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", + indent_level, rdi_stringize_spaces, proc->container_idx); +} + +internal void +rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *parsed, + RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level){ + + U32 this_idx = (U32)(scope - bundle->scopes); + + str8_list_pushf(arena, out, "%.*s[%u]\n", + indent_level, rdi_stringize_spaces, this_idx); + + str8_list_pushf(arena, out, "%.*s proc_idx=%u\n", + indent_level, rdi_stringize_spaces, scope->proc_idx); + + // voff ranges { - String8List dump = {0}; - - // DATA SECTIONS - if (raddbg->dsecs != 0 && params->dump_data_sections){ - str8_list_pushf(arena, &dump, "# DATA SECTIONS:\n"); - rdi_stringize_data_sections(arena, &dump, raddbg, 1); - str8_list_push(arena, &dump, str8_lit("\n")); + U32 voff_range_first_raw = scope->voff_range_first; + U32 voff_range_opl_raw = scope->voff_range_opl; + U32 voff_range_opl_clamped = ClampTop(voff_range_opl_raw, bundle->scope_voff_count); + U32 voff_range_first = ClampTop(voff_range_first_raw, voff_range_opl_clamped); + U32 voff_range_opl = voff_range_opl_clamped; + if ((voff_range_opl - voff_range_first) % 2 == 1){ + voff_range_opl -= 1; } - // TOP LEVEL INFO - if (raddbg->top_level_info != 0 && params->dump_top_level_info){ - str8_list_pushf(arena, &dump, "# TOP LEVEL INFO:\n"); - rdi_stringize_top_level_info(arena, &dump, raddbg, raddbg->top_level_info, 1); - str8_list_push(arena, &dump, str8_lit("\n")); - } + U64 *voff_ptr = bundle->scope_voffs + voff_range_first; - // BINARY SECTIONS - if (raddbg->binary_sections != 0 && params->dump_binary_sections){ - str8_list_pushf(arena, &dump, "# BINARY SECTIONS:\n"); - RDI_BinarySection *ptr = raddbg->binary_sections; - for (U32 i = 0; i < raddbg->binary_sections_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " section[%u]:\n", i); - rdi_stringize_binary_section(arena, &dump, raddbg, ptr, 2); - str8_list_push(arena, &dump, str8_lit("\n")); + if (voff_range_opl - voff_range_first > 2){ + str8_list_pushf(arena, out, "%.*s voff_ranges={\n", + indent_level, rdi_stringize_spaces); + for (U32 i = voff_range_first; i < voff_range_opl; i += 2, voff_ptr += 2){ + str8_list_pushf(arena, out, "%.*s [0x%08llx, 0x%08llx)\n", + indent_level, rdi_stringize_spaces, + voff_ptr[0], voff_ptr[1]); } - str8_list_push(arena, &dump, str8_lit("\n")); + str8_list_pushf(arena, out, "%.*s }\n", + indent_level, rdi_stringize_spaces); } - - // FILE PATHS - if (raddbg->file_paths != 0 && params->dump_file_paths){ - RDI_FilePathBundle file_path_bundle = {0}; - { - file_path_bundle.file_paths = raddbg->file_paths; - file_path_bundle.file_path_count = raddbg->file_paths_count; - } - - str8_list_pushf(arena, &dump, "# FILE PATHS\n"); - RDI_FilePathNode *ptr = raddbg->file_paths; - for (U32 i = 0; i < raddbg->file_paths_count; i += 1, ptr += 1){ - if (ptr->parent_path_node == 0){ - rdi_stringize_file_path(arena, &dump, raddbg, &file_path_bundle, ptr, 1); - } - } - str8_list_push(arena, &dump, str8_lit("\n")); + else if (voff_range_opl - voff_range_first == 2){ + str8_list_pushf(arena, out, "%.*s voff_range=[0x%08llx, 0x%08llx)\n", + indent_level, rdi_stringize_spaces, + voff_ptr[0], voff_ptr[1]); } + } + + // locals + { + U32 local_first = scope->local_first; + U32 local_opl_raw = local_first + scope->local_count; + U32 local_opl = ClampTop(local_opl_raw, bundle->local_count); - // SOURCE FILES - if (raddbg->source_files != 0 && params->dump_source_files){ - str8_list_pushf(arena, &dump, "# SOURCE FILES\n"); - RDI_SourceFile *ptr = raddbg->source_files; - for (U32 i = 0; i < raddbg->source_files_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " source_file[%u]:\n", i); - rdi_stringize_source_file(arena, &dump, raddbg, ptr, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // UNITS - if (raddbg->units != 0 && params->dump_units){ - str8_list_pushf(arena, &dump, "# UNITS\n"); - RDI_Unit *ptr = raddbg->units; - for (U32 i = 0; i < raddbg->units_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - rdi_stringize_unit(arena, &dump, raddbg, ptr, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // UNIT VMAP - if (raddbg->unit_vmap != 0 && params->dump_unit_vmap){ - str8_list_pushf(arena, &dump, "# UNIT VMAP\n"); - RDI_VMapEntry *ptr = raddbg->unit_vmap; - for (U32 i = 0; i < raddbg->unit_vmap_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // TYPE NODES - if (raddbg->type_nodes != 0 && params->dump_type_nodes){ - str8_list_pushf(arena, &dump, "# TYPE NODES:\n"); - RDI_TypeNode *ptr = raddbg->type_nodes; - for (U32 i = 0; i < raddbg->type_nodes_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " type[%u]:\n", i); - rdi_stringize_type_node(arena, &dump, raddbg, ptr, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // UDT DATA - if (raddbg->udts != 0 && params->dump_udt_data){ - RDI_UDTMemberBundle member_bundle = {0}; - { - member_bundle.members = raddbg->members; - member_bundle.enum_members = raddbg->enum_members; - member_bundle.member_count = raddbg->members_count; - member_bundle.enum_member_count = raddbg->enum_members_count; - } - - str8_list_pushf(arena, &dump, "# UDTS:\n"); - RDI_UDT *ptr = raddbg->udts; - for (U32 i = 0; i < raddbg->udts_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " udt[%u]:\n", i); - rdi_stringize_udt(arena, &dump, raddbg, &member_bundle, ptr, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // GLOBAL VARIABLES - if (raddbg->global_variables != 0 && params->dump_global_variables){ - str8_list_pushf(arena, &dump, "# GLOBAL VARIABLES:\n"); - RDI_GlobalVariable *ptr = raddbg->global_variables; - for (U32 i = 0; i < raddbg->global_variables_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " global_variable[%u]:\n", i); - rdi_stringize_global_variable(arena, &dump, raddbg, ptr, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // GLOBAL VMAP - if (raddbg->global_vmap != 0 && params->dump_global_vmap){ - str8_list_pushf(arena, &dump, "# GLOBAL VMAP:\n"); - RDI_VMapEntry *ptr = raddbg->global_vmap; - for (U32 i = 0; i < raddbg->global_vmap_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // THREAD LOCAL VARIABLES - if (raddbg->thread_variables != 0 && params->dump_thread_variables){ - str8_list_pushf(arena, &dump, "# THREAD VARIABLES:\n"); - RDI_ThreadVariable *ptr = raddbg->thread_variables; - for (U32 i = 0; i < raddbg->thread_variables_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " thread_variable[%u]:\n", i); - rdi_stringize_thread_variable(arena, &dump, raddbg, ptr, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // PROCEDURES - if (raddbg->procedures != 0 && params->dump_procedures){ - str8_list_pushf(arena, &dump, "# PROCEDURES:\n"); - RDI_Procedure *ptr = raddbg->procedures; - for (U32 i = 0; i < raddbg->procedures_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " procedure[%u]:\n", i); - rdi_stringize_procedure(arena, &dump, raddbg, ptr, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // SCOPES - if (raddbg->scopes != 0 && params->dump_scopes){ - RDI_ScopeBundle scope_bundle = {0}; - { - scope_bundle.scopes = raddbg->scopes; - scope_bundle.scope_count = raddbg->scopes_count; - scope_bundle.scope_voffs = raddbg->scope_voffs; - scope_bundle.scope_voff_count = raddbg->scope_voffs_count; - scope_bundle.locals = raddbg->locals; - scope_bundle.local_count = raddbg->locals_count; - scope_bundle.location_blocks = raddbg->location_blocks; - scope_bundle.location_block_count = raddbg->location_blocks_count; - scope_bundle.location_data = raddbg->location_data; - scope_bundle.location_data_size = raddbg->location_data_size; - } - - str8_list_pushf(arena, &dump, "# SCOPES:\n"); - RDI_Scope *ptr = raddbg->scopes; - for (U32 i = 0; i < raddbg->scopes_count; i += 1, ptr += 1){ - if (ptr->parent_scope_idx == 0){ - rdi_stringize_scope(arena, &dump, raddbg, &scope_bundle, ptr, 1); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // SCOPE VMAP - if (raddbg->scope_vmap != 0 && params->dump_scope_vmap){ - str8_list_pushf(arena, &dump, "# SCOPE VMAP:\n"); - RDI_VMapEntry *ptr = raddbg->scope_vmap; - for (U32 i = 0; i < raddbg->scope_vmap_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // NAME MAPS - if (raddbg->name_maps != 0 && params->dump_name_map){ - str8_list_pushf(arena, &dump, "# NAME MAP:\n"); - RDI_NameMap *ptr = raddbg->name_maps; - for (U32 i = 0; i < raddbg->name_maps_count; i += 1, ptr += 1){ - str8_list_pushf(arena, &dump, " name_map[%u]:\n", i); + if (local_first < local_opl){ + RDI_Local *local_ptr = bundle->locals + local_first; + for (U32 i = local_first; i < local_opl; i += 1, local_ptr += 1){ + str8_list_pushf(arena, out, "%.*s local[%u]\n", + indent_level, rdi_stringize_spaces, i); - RDI_ParsedNameMap name_map = {0}; - rdi_name_map_parse(raddbg, ptr, &name_map); + String8 local_kind_str = rdi_string_from_local_kind(local_ptr->kind); + str8_list_pushf(arena, out, "%.*s kind=%.*s\n", + indent_level, rdi_stringize_spaces, str8_varg(local_kind_str)); - RDI_NameMapBucket *bucket = name_map.buckets; - for (U32 j = 0; j < name_map.bucket_count; j += 1, bucket += 1){ - if (bucket->node_count > 0){ - str8_list_pushf(arena, &dump, " bucket[%u]:\n", j); - RDI_NameMapNode *node = name_map.nodes + bucket->first_node; - RDI_NameMapNode *node_opl = node + bucket->node_count; - for (; node < node_opl; node += 1){ - String8 string = {0}; - string.str = rdi_string_from_idx(raddbg, node->string_idx, &string.size); - str8_list_pushf(arena, &dump, " match \"%.*s\": ", str8_varg(string)); - if (node->match_count == 1){ - str8_list_pushf(arena, &dump, "%u", node->match_idx_or_idx_run_first); - } - else{ - RDI_U32 idx_count = 0; - RDI_U32 *idx_run = - rdi_idx_run_from_first_count(raddbg, node->match_idx_or_idx_run_first, - node->match_count, &idx_count); - if (idx_count > 0){ - RDI_U32 last = idx_count - 1; - for (U32 k = 0; k < last; k += 1){ - str8_list_pushf(arena, &dump, "%u, ", idx_run[k]); + String8 name = {0}; + name.str = rdi_string_from_idx(parsed, local_ptr->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*s name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + + str8_list_pushf(arena, out, "%.*s type_idx=%u\n", + indent_level, rdi_stringize_spaces, local_ptr->type_idx); + + U32 location_first = local_ptr->location_first; + U32 location_opl_raw = local_ptr->location_opl; + U32 location_opl = ClampTop(location_opl_raw, bundle->location_block_count); + + if (location_first < location_opl){ + str8_list_pushf(arena, out, "%.*s locations:\n", indent_level, rdi_stringize_spaces); + RDI_LocationBlock *block_ptr = bundle->location_blocks + location_first; + for (U32 j = location_first; j < location_opl; j += 1, block_ptr += 1){ + if (block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32){ + str8_list_pushf(arena, out, "%.*s case *always*:\n", indent_level, rdi_stringize_spaces); + } + else{ + str8_list_pushf(arena, out, "%.*s case [0x%08x, 0x%08x):\n", + indent_level, rdi_stringize_spaces, + block_ptr->scope_off_first, block_ptr->scope_off_opl); + } + + if (block_ptr->location_data_off >= bundle->location_data_size){ + str8_list_pushf(arena, out, "%.*s \n", + indent_level, rdi_stringize_spaces); + } + else{ + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); + + U8 *loc_data_opl = bundle->location_data + bundle->location_data_size; + U8 *loc_base_ptr = bundle->location_data + block_ptr->location_data_off; + RDI_LocationKind kind = (RDI_LocationKind)*loc_base_ptr; + switch (kind){ + default: + { + str8_list_pushf(arena, out, "\n"); + }break; + + case RDI_LocationKind_AddrBytecodeStream: + { + str8_list_pushf(arena, out, "AddrBytecodeStream\n"); + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); + U8 *bytecode_ptr = loc_base_ptr + 1; + for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ + str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); } - str8_list_pushf(arena, &dump, "%u", idx_run[last]); - } + str8_list_pushf(arena, out, "\n"); + }break; + + case RDI_LocationKind_ValBytecodeStream: + { + str8_list_pushf(arena, out, "ValBytecodeStream\n"); + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); + U8 *bytecode_ptr = loc_base_ptr + 1; + for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ + str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); + } + str8_list_pushf(arena, out, "\n"); + }break; + + case RDI_LocationKind_AddrRegisterPlusU16: + { + if (loc_base_ptr + sizeof(RDI_LocationRegisterPlusU16) > loc_data_opl){ + str8_list_pushf(arena, out, "AddrRegisterPlusU16( )\n"); + } + else{ + RDI_LocationRegisterPlusU16 *loc = (RDI_LocationRegisterPlusU16*)loc_base_ptr; + str8_list_pushf(arena, out, "AddrRegisterPlusU16(reg: %u, off: %u)\n", + loc->register_code, loc->offset); + } + }break; + + case RDI_LocationKind_AddrAddrRegisterPlusU16: + { + if (loc_base_ptr + sizeof(RDI_LocationRegisterPlusU16) > loc_data_opl){ + str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16( )\n"); + } + else{ + RDI_LocationRegisterPlusU16 *loc = (RDI_LocationRegisterPlusU16*)loc_base_ptr; + str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16(reg: %u, off: %u)\n", + loc->register_code, loc->offset); + } + }break; + + case RDI_LocationKind_ValRegister: + { + if (loc_base_ptr + sizeof(RDI_LocationRegister) > loc_data_opl){ + str8_list_pushf(arena, out, "ValRegister( )\n"); + } + else{ + RDI_LocationRegister *loc = (RDI_LocationRegister*)loc_base_ptr; + str8_list_pushf(arena, out, "ValRegister(reg: %u)\n", loc->register_code); + } + }break; } - str8_list_pushf(arena, &dump, "\n"); } } } - - str8_list_push(arena, &dump, str8_lit("\n")); } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // print dump - for(String8Node *node = dump.first; node != 0; node = node->next) - { - fwrite(node->string.str, 1, node->string.size, stdout); } } - return(0); + // TODO(allen): static locals + + for (U32 child = scope->first_child_scope_idx; + child != 0;){ + // get scope for child + RDI_Scope *child_scope = 0; + if (child < bundle->scope_count){ + child_scope = bundle->scopes + child; + } + if (child_scope == 0){ + break; + } + + // stringize child + rdi_stringize_scope(arena, out, parsed, bundle, child_scope, indent_level + 1); + + // increment iterator + child = child_scope->next_sibling_scope_idx; + } + + str8_list_pushf(arena, out, "%.*s[/%u]\n", + indent_level, rdi_stringize_spaces, this_idx); } diff --git a/src/raddbgi_dump/raddbgi_dump.h b/src/raddbgi_dump/raddbgi_dump.h index c7b43265..add5f987 100644 --- a/src/raddbgi_dump/raddbgi_dump.h +++ b/src/raddbgi_dump/raddbgi_dump.h @@ -1,45 +1,75 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RDI_DUMP_H -#define RDI_DUMP_H +#ifndef RADDBGI_DUMP_H +#define RADDBGI_DUMP_H //////////////////////////////// -//~ Program Parameters Type +//~ rjf: RADDBG Stringize Helper Types -typedef struct RADDBGIDUMP_Params{ - String8 input_name; - String8 input_data; - - struct{ - B8 input; - } hide_errors; - - B8 dump__first; - B8 dump_data_sections; - B8 dump_top_level_info; - B8 dump_binary_sections; - B8 dump_file_paths; - B8 dump_source_files; - B8 dump_units; - B8 dump_unit_vmap; - B8 dump_type_nodes; - B8 dump_udt_data; - B8 dump_global_variables; - B8 dump_global_vmap; - B8 dump_thread_variables; - B8 dump_procedures; - B8 dump_scopes; - B8 dump_scope_vmap; - B8 dump_name_map; - B8 dump__last; - - String8List errors; -} RADDBGIDUMP_Params; +typedef struct RDI_FilePathBundle RDI_FilePathBundle; +struct RDI_FilePathBundle +{ + RDI_FilePathNode *file_paths; + U32 file_path_count; +}; + +typedef struct RDI_UDTMemberBundle RDI_UDTMemberBundle; +struct RDI_UDTMemberBundle +{ + RDI_Member *members; + RDI_EnumMember *enum_members; + U32 member_count; + U32 enum_member_count; +}; + +typedef struct RDI_ScopeBundle RDI_ScopeBundle; +struct RDI_ScopeBundle +{ + RDI_Scope *scopes; + U64 *scope_voffs; + RDI_Local *locals; + RDI_LocationBlock *location_blocks; + U8 *location_data; + U32 scope_count; + U32 scope_voff_count; + U32 local_count; + U32 location_block_count; + U32 location_data_size; +}; //////////////////////////////// -//~ Program Parameters Parser +//~ rjf: RADDBGI Enum -> String Functions -static RADDBGIDUMP_Params *raddbgidump_params_from_cmd_line(Arena *arena, CmdLine *cmdline); +internal String8 rdi_string_from_data_section_tag(RDI_DataSectionTag tag); +internal String8 rdi_string_from_arch(RDI_Arch arch); +internal String8 rdi_string_from_language(RDI_Language language); +internal String8 rdi_string_from_type_kind(RDI_TypeKind type_kind); +internal String8 rdi_string_from_member_kind(RDI_MemberKind member_kind); +internal String8 rdi_string_from_local_kind(RDI_LocalKind local_kind); -#endif //RDI_DUMP_H +//////////////////////////////// +//~ rjf: RADDBGI Flags -> String Functions + +internal void rdi_stringize_binary_section_flags(Arena *arena, String8List *out, RDI_BinarySectionFlags flags); +internal void rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, RDI_TypeModifierFlags flags); +internal void rdi_stringize_user_defined_type_flags(Arena *arena, String8List *out, RDI_UserDefinedTypeFlags flags); +internal void rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags); + +//////////////////////////////// +//~ rjf: RADDBG Compound Stringize Functions + +internal void rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *parsed, U32 indent_level); +internal void rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_TopLevelInfo *tli, U32 indent_level); +internal void rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_BinarySection *bin_section, U32 indent_level); +internal void rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, U32 indent_level); +internal void rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_SourceFile *source_file, U32 indent_level); +internal void rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_Unit *unit, U32 indent_level); +internal void rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_TypeNode *type, U32 indent_level); +internal void rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_UDTMemberBundle *bundle, RDI_UDT *udt, U32 indent_level); +internal void rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_GlobalVariable *global_variable, U32 indent_level); +internal void rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_ThreadVariable *thread_var, U32 indent_level); +internal void rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_Procedure *proc, U32 indent_level); +internal void rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *parsed, RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level); + +#endif // RADDBGI_DUMP_H diff --git a/src/raddbgi_dump/raddbgi_dump_main.c b/src/raddbgi_dump/raddbgi_dump_main.c new file mode 100644 index 00000000..ed355078 --- /dev/null +++ b/src/raddbgi_dump/raddbgi_dump_main.c @@ -0,0 +1,413 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [lib] +#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" + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "raddbgi_dump.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "raddbgi_dump.c" + +//////////////////////////////// +//~ rjf: Entry Point + +int +main(int argc, char **argv) +{ + ////////////////////////////// + //- rjf: set up + // + local_persist TCTX main_thread_tctx = {0}; + tctx_init_and_equip(&main_thread_tctx); + Arena *arena = arena_alloc(); + String8List args = os_string_list_from_argcv(arena, argc, argv); + CmdLine cmdline = cmd_line_from_string_list(arena, args); + String8List errors = {0}; + + ////////////////////////////// + //- rjf: extract command line parameters + // + typedef U32 DumpFlags; + enum + { + DumpFlag_DataSections = (1<<0), + DumpFlag_TopLevelInfo = (1<<1), + DumpFlag_BinarySections = (1<<2), + DumpFlag_FilePaths = (1<<3), + DumpFlag_SourceFiles = (1<<4), + DumpFlag_Units = (1<<5), + DumpFlag_UnitVMap = (1<<6), + DumpFlag_TypeNodes = (1<<7), + DumpFlag_UDTs = (1<<8), + DumpFlag_GlobalVariables = (1<<9), + DumpFlag_GlobalVMap = (1<<10), + DumpFlag_ThreadVariables = (1<<11), + DumpFlag_Procedures = (1<<12), + DumpFlag_Scopes = (1<<13), + DumpFlag_ScopeVMap = (1<<14), + DumpFlag_NameMaps = (1<<15), + }; + String8 input_name = {0}; + String8 input_data = {0}; + DumpFlags dump_flags = (U32)0xffffffff; + { + // rjf: extract input file path & load data + input_name = str8_list_first(&cmdline.inputs); + if(input_name.size > 0) { input_data = os_data_from_file_path(arena, input_name); } + else {str8_list_pushf(arena, &errors, "error (input): No input RADDBGI file specified.");} + if(input_name.size != 0 && input_data.size == 0) { str8_list_pushf(arena, &errors, "error (input): No input RADDBGI file successfully loaded; either the path or file contents are invalid."); } + + // rjf: extract dump options + { + String8List dump_options = cmd_line_strings(&cmdline, str8_lit("dump")); + if(dump_options.first != 0) + { + dump_flags = 0; + for(String8Node *n = dump_options.first; n != 0; n = n->next) + { + if(0){} + else if(str8_match(n->string, str8_lit("data_sections"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_DataSections; } + else if(str8_match(n->string, str8_lit("top_level_info"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_TopLevelInfo; } + else if(str8_match(n->string, str8_lit("binary_sections"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_BinarySections; } + else if(str8_match(n->string, str8_lit("file_paths"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_FilePaths; } + else if(str8_match(n->string, str8_lit("source_files"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_SourceFiles; } + else if(str8_match(n->string, str8_lit("units"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Units; } + else if(str8_match(n->string, str8_lit("unit_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_UnitVMap; } + else if(str8_match(n->string, str8_lit("type_nodes"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_TypeNodes; } + else if(str8_match(n->string, str8_lit("udt_data"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_UDTs; } + else if(str8_match(n->string, str8_lit("global_variables"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_GlobalVariables; } + else if(str8_match(n->string, str8_lit("global_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_GlobalVMap; } + else if(str8_match(n->string, str8_lit("thread_variables"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_ThreadVariables; } + else if(str8_match(n->string, str8_lit("procedures"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Procedures; } + else if(str8_match(n->string, str8_lit("scopes"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Scopes; } + else if(str8_match(n->string, str8_lit("scope_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_ScopeVMap; } + else if(str8_match(n->string, str8_lit("name_maps"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_NameMaps; } + } + } + } + } + + ////////////////////////////// + //- rjf: parse raddbg from input data + // + RDI_ParseStatus parse_status = RDI_ParseStatus_Good; + RDI_Parsed raddbg_ = {0}; + RDI_Parsed *raddbg = &raddbg_; + { + parse_status = rdi_parse(input_data.str, input_data.size, &raddbg_); + if(parse_status == RDI_ParseStatus_Good) + { + str8_list_pushf(arena, &errors, "error (parse): RADDBGI file wasn't parsed successfully. (0x%x)", parse_status); + } + } + + ////////////////////////////// + //- rjf: output error strings to stderr + // + for(String8Node *n = errors.first; n != 0; n = n->next) + { + fwrite(n->string.str, 1, n->string.size, stderr); + fprintf(stderr, "\n"); + } + + ////////////////////////////// + //- rjf: build dump strings + // + String8List dump = {0}; + if(parse_status == RDI_ParseStatus_Good) + { + //- rjf: DATA SECTIONS + if(dump_flags & DumpFlag_DataSections) + { + str8_list_pushf(arena, &dump, "# DATA SECTIONS:\n"); + rdi_stringize_data_sections(arena, &dump, raddbg, 1); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: TOP LEVEL INFO + if(dump_flags & DumpFlag_TopLevelInfo) + { + str8_list_pushf(arena, &dump, "# TOP LEVEL INFO:\n"); + rdi_stringize_top_level_info(arena, &dump, raddbg, raddbg->top_level_info, 1); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: BINARY SECTIONS + if(dump_flags & DumpFlag_BinarySections) + { + str8_list_pushf(arena, &dump, "# BINARY SECTIONS:\n"); + RDI_BinarySection *ptr = raddbg->binary_sections; + for(U32 i = 0; i < raddbg->binary_sections_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " section[%u]:\n", i); + rdi_stringize_binary_section(arena, &dump, raddbg, ptr, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: FILE PATHS + if(dump_flags & DumpFlag_FilePaths) + { + RDI_FilePathBundle file_path_bundle = {0}; + { + file_path_bundle.file_paths = raddbg->file_paths; + file_path_bundle.file_path_count = raddbg->file_paths_count; + } + str8_list_pushf(arena, &dump, "# FILE PATHS\n"); + RDI_FilePathNode *ptr = raddbg->file_paths; + for(U32 i = 0; i < raddbg->file_paths_count; i += 1, ptr += 1) + { + if(ptr->parent_path_node == 0) + { + rdi_stringize_file_path(arena, &dump, raddbg, &file_path_bundle, ptr, 1); + } + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: SOURCE FILES + if(dump_flags & DumpFlag_SourceFiles) + { + str8_list_pushf(arena, &dump, "# SOURCE FILES\n"); + RDI_SourceFile *ptr = raddbg->source_files; + for(U32 i = 0; i < raddbg->source_files_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " source_file[%u]:\n", i); + rdi_stringize_source_file(arena, &dump, raddbg, ptr, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: UNITS + if(dump_flags & DumpFlag_Units) + { + str8_list_pushf(arena, &dump, "# UNITS\n"); + RDI_Unit *ptr = raddbg->units; + for (U32 i = 0; i < raddbg->units_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " unit[%u]:\n", i); + rdi_stringize_unit(arena, &dump, raddbg, ptr, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: UNIT VMAP + if(dump_flags & DumpFlag_UnitVMap) + { + str8_list_pushf(arena, &dump, "# UNIT VMAP\n"); + RDI_VMapEntry *ptr = raddbg->unit_vmap; + for(U32 i = 0; i < raddbg->unit_vmap_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: TYPE NODES + if(dump_flags & DumpFlag_TypeNodes) + { + str8_list_pushf(arena, &dump, "# TYPE NODES:\n"); + RDI_TypeNode *ptr = raddbg->type_nodes; + for(U32 i = 0; i < raddbg->type_nodes_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " type[%u]:\n", i); + rdi_stringize_type_node(arena, &dump, raddbg, ptr, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: UDT DATA + if(dump_flags & DumpFlag_UDTs) + { + RDI_UDTMemberBundle member_bundle = {0}; + { + member_bundle.members = raddbg->members; + member_bundle.enum_members = raddbg->enum_members; + member_bundle.member_count = raddbg->members_count; + member_bundle.enum_member_count = raddbg->enum_members_count; + } + str8_list_pushf(arena, &dump, "# UDTS:\n"); + RDI_UDT *ptr = raddbg->udts; + for(U32 i = 0; i < raddbg->udts_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " udt[%u]:\n", i); + rdi_stringize_udt(arena, &dump, raddbg, &member_bundle, ptr, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: GLOBAL VARIABLES + if(dump_flags & DumpFlag_GlobalVariables) + { + str8_list_pushf(arena, &dump, "# GLOBAL VARIABLES:\n"); + RDI_GlobalVariable *ptr = raddbg->global_variables; + for(U32 i = 0; i < raddbg->global_variables_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " global_variable[%u]:\n", i); + rdi_stringize_global_variable(arena, &dump, raddbg, ptr, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: GLOBAL VMAP + if(dump_flags & DumpFlag_GlobalVMap) + { + str8_list_pushf(arena, &dump, "# GLOBAL VMAP:\n"); + RDI_VMapEntry *ptr = raddbg->global_vmap; + for(U32 i = 0; i < raddbg->global_vmap_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: THREAD LOCAL VARIABLES + if(dump_flags & DumpFlag_ThreadVariables) + { + str8_list_pushf(arena, &dump, "# THREAD VARIABLES:\n"); + RDI_ThreadVariable *ptr = raddbg->thread_variables; + for(U32 i = 0; i < raddbg->thread_variables_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " thread_variable[%u]:\n", i); + rdi_stringize_thread_variable(arena, &dump, raddbg, ptr, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: PROCEDURES + if(dump_flags & DumpFlag_Procedures) + { + str8_list_pushf(arena, &dump, "# PROCEDURES:\n"); + RDI_Procedure *ptr = raddbg->procedures; + for(U32 i = 0; i < raddbg->procedures_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " procedure[%u]:\n", i); + rdi_stringize_procedure(arena, &dump, raddbg, ptr, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: SCOPES + if(dump_flags & DumpFlag_Scopes) + { + RDI_ScopeBundle scope_bundle = {0}; + { + scope_bundle.scopes = raddbg->scopes; + scope_bundle.scope_count = raddbg->scopes_count; + scope_bundle.scope_voffs = raddbg->scope_voffs; + scope_bundle.scope_voff_count = raddbg->scope_voffs_count; + scope_bundle.locals = raddbg->locals; + scope_bundle.local_count = raddbg->locals_count; + scope_bundle.location_blocks = raddbg->location_blocks; + scope_bundle.location_block_count = raddbg->location_blocks_count; + scope_bundle.location_data = raddbg->location_data; + scope_bundle.location_data_size = raddbg->location_data_size; + } + str8_list_pushf(arena, &dump, "# SCOPES:\n"); + RDI_Scope *ptr = raddbg->scopes; + for(U32 i = 0; i < raddbg->scopes_count; i += 1, ptr += 1) + { + if(ptr->parent_scope_idx == 0) + { + rdi_stringize_scope(arena, &dump, raddbg, &scope_bundle, ptr, 1); + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: SCOPE VMAP + if(dump_flags & DumpFlag_ScopeVMap) + { + str8_list_pushf(arena, &dump, "# SCOPE VMAP:\n"); + RDI_VMapEntry *ptr = raddbg->scope_vmap; + for(U32 i = 0; i < raddbg->scope_vmap_count; i += 1, ptr += 1) + { + str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", ptr->voff, ptr->idx); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: NAME MAPS + if(dump_flags & DumpFlag_NameMaps) + { + str8_list_pushf(arena, &dump, "# NAME MAP:\n"); + RDI_NameMap *ptr = raddbg->name_maps; + for(U32 i = 0; i < raddbg->name_maps_count; i += 1, ptr += 1) + { + RDI_ParsedNameMap name_map = {0}; + rdi_name_map_parse(raddbg, ptr, &name_map); + str8_list_pushf(arena, &dump, " name_map[%u]:\n", i); + RDI_NameMapBucket *bucket = name_map.buckets; + for(U32 j = 0; j < name_map.bucket_count; j += 1, bucket += 1) + { + if(bucket->node_count > 0) + { + str8_list_pushf(arena, &dump, " bucket[%u]:\n", j); + RDI_NameMapNode *node = name_map.nodes + bucket->first_node; + RDI_NameMapNode *node_opl = node + bucket->node_count; + for(;node < node_opl; node += 1) + { + String8 string = {0}; + string.str = rdi_string_from_idx(raddbg, node->string_idx, &string.size); + str8_list_pushf(arena, &dump, " match \"%.*s\": ", str8_varg(string)); + if(node->match_count == 1) + { + str8_list_pushf(arena, &dump, "%u", node->match_idx_or_idx_run_first); + } + else + { + RDI_U32 idx_count = 0; + RDI_U32 *idx_run = + rdi_idx_run_from_first_count(raddbg, node->match_idx_or_idx_run_first, + node->match_count, &idx_count); + if(idx_count > 0) + { + RDI_U32 last = idx_count - 1; + for(U32 k = 0; k < last; k += 1) + { + str8_list_pushf(arena, &dump, "%u, ", idx_run[k]); + } + str8_list_pushf(arena, &dump, "%u", idx_run[last]); + } + } + str8_list_pushf(arena, &dump, "\n"); + } + } + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + ////////////////////////////// + //- rjf: write dump to stdout + // + for(String8Node *n = dump.first; n != 0; n = n->next) + { + fwrite(n->string.str, 1, n->string.size, stdout); + } + + return 0; +} diff --git a/src/raddbgi_dump/raddbgi_stringize.c b/src/raddbgi_dump/raddbgi_stringize.c deleted file mode 100644 index b87898fa..00000000 --- a/src/raddbgi_dump/raddbgi_stringize.c +++ /dev/null @@ -1,776 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ RADDBG Common Stringize Functions - -static String8 -rdi_string_from_data_section_tag(RDI_DataSectionTag tag){ - String8 result = {0}; - switch (tag){ -#define X(N,C) case C: result = str8_lit(#N); break; -#define Y(N) - RDI_DataSectionTagXList(X,Y) -#undef X -#undef Y - } - return(result); -} - -static String8 -rdi_string_from_arch(RDI_Arch arch){ - String8 result = {0}; - switch (arch){ - default: result = str8_lit(""); break; - case RDI_Arch_X86: result = str8_lit("x86"); break; - case RDI_Arch_X64: result = str8_lit("x64"); break; - } - return(result); -} - -static String8 -rdi_string_from_language(RDI_Language language){ - String8 result = {0}; - switch (language){ -#define X(name,code) case code: result = str8_lit(#name); break; - RDI_LanguageXList(X) -#undef X - } - return(result); -} - -static String8 -rdi_string_from_type_kind(RDI_TypeKind type_kind){ - String8 result = {0}; - switch (type_kind){ - default: result = str8_lit(""); break; -#define X(name,code) case code: result = str8_lit(#name); break; -#define XZ(name,code,size) X(name,code) -#define Y(a,n) - RDI_TypeKindXList(X,XZ,Y) -#undef X -#undef XZ -#undef Y - } - return(result); -} - -static String8 -rdi_string_from_member_kind(RDI_MemberKind member_kind){ - String8 result = {0}; - switch (member_kind){ - default: result = str8_lit(""); break; -#define X(N,C) case C: result = str8_lit(#N); break; - RDI_MemberKindXList(X) -#undef X - } - return(result); -} - -static String8 -rdi_string_from_local_kind(RDI_LocalKind local_kind){ - String8 result = {0}; - switch (local_kind){ - default: result = str8_lit(""); break; - case RDI_LocalKind_Parameter: result = str8_lit("Parameter"); break; - case RDI_LocalKind_Variable: result = str8_lit("Variable"); break; - } - return(result); -} - - -//////////////////////////////// -//~ RADDBG Flags Stringize Functions - -static void -rdi_stringize_binary_section_flags(Arena *arena, String8List *out, - RDI_BinarySectionFlags flags){ - if (flags == 0){ - str8_list_push(arena, out, str8_lit("0")); - } - if (flags & RDI_BinarySectionFlag_Read){ - str8_list_push(arena, out, str8_lit("Read ")); - } - if (flags & RDI_BinarySectionFlag_Write){ - str8_list_push(arena, out, str8_lit("Write ")); - } - if (flags & RDI_BinarySectionFlag_Execute){ - str8_list_push(arena, out, str8_lit("Execute ")); - } -} - -static void -rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, - RDI_TypeModifierFlags flags){ - if (flags == 0){ - str8_list_push(arena, out, str8_lit("0")); - } - if (flags & RDI_TypeModifierFlag_Const){ - str8_list_push(arena, out, str8_lit("Const ")); - } - if (flags & RDI_TypeModifierFlag_Volatile){ - str8_list_push(arena, out, str8_lit("Volatile ")); - } -} - -static void -rdi_stringize_user_defined_type_flags(Arena *arena, String8List *out, - RDI_UserDefinedTypeFlags flags){ - if (flags == 0){ - str8_list_push(arena, out, str8_lit("0")); - } - if (flags & RDI_UserDefinedTypeFlag_EnumMembers){ - str8_list_push(arena, out, str8_lit("EnumMembers ")); - } -} - -static void -rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags){ - if (flags == 0){ - str8_list_push(arena, out, str8_lit("0")); - } - if (flags & RDI_LinkFlag_External){ - str8_list_push(arena, out, str8_lit("External ")); - } - if (flags & RDI_LinkFlag_TypeScoped){ - str8_list_push(arena, out, str8_lit("TypeScoped ")); - } - if (flags & RDI_LinkFlag_ProcScoped){ - str8_list_push(arena, out, str8_lit("ProcScoped ")); - } -} - - -//////////////////////////////// -//~ RADDBG Compound Stringize Functions - -static char rdi_stringize_spaces[] = " "; - -static void -rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *parsed, - U32 indent_level){ - U64 data_section_count = parsed->dsec_count; - RDI_DataSection *ptr = parsed->dsecs; - for (U64 i = 0; i < data_section_count; i += 1, ptr += 1){ - String8 tag_str = rdi_string_from_data_section_tag(ptr->tag); - str8_list_pushf(arena, out, "%.*sdata_section[%5u] = {0x%08llx, %7u, %7u} %.*s\n", - indent_level, rdi_stringize_spaces, - i, ptr->off, ptr->encoded_size, ptr->unpacked_size, str8_varg(tag_str)); - } -} - -static void -rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_TopLevelInfo *tli, U32 indent_level){ - String8 arch_str = rdi_string_from_arch(tli->architecture); - String8 exe_name = {0}; - exe_name.str = rdi_string_from_idx(parsed, tli->exe_name_string_idx, &exe_name.size); - - str8_list_pushf(arena, out, "%.*sarchitecture=%.*s\n", - indent_level, rdi_stringize_spaces, str8_varg(arch_str)); - str8_list_pushf(arena, out, "%.*sexe_name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(exe_name)); - str8_list_pushf(arena, out, "%.*svoff_max=0x%08llx\n", - indent_level, rdi_stringize_spaces, tli->voff_max); -} - -static void -rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_BinarySection *bin_section, U32 indent_level){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, bin_section->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); - rdi_stringize_binary_section_flags(arena, out, bin_section->flags); - str8_list_pushf(arena, out, "\n"); - - str8_list_pushf(arena, out, "%.*svoff_first=0x%08x\n", - indent_level, rdi_stringize_spaces, bin_section->voff_first); - str8_list_pushf(arena, out, "%.*svoff_opl =0x%08x\n", - indent_level, rdi_stringize_spaces, bin_section->voff_opl); - str8_list_pushf(arena, out, "%.*sfoff_first=0x%08x\n", - indent_level, rdi_stringize_spaces, bin_section->foff_first); - str8_list_pushf(arena, out, "%.*sfoff_opl =0x%08x\n", - indent_level, rdi_stringize_spaces, bin_section->foff_opl); -} - -static void -rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, - U32 indent_level){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, file_path->name_string_idx, &name.size); - - U32 this_idx = (U32)(file_path - bundle->file_paths); - - if (file_path->source_file_idx == 0){ - str8_list_pushf(arena, out, "%.*s[%u] '%.*s'\n", - indent_level, rdi_stringize_spaces, - this_idx, str8_varg(name)); - } - else{ - str8_list_pushf(arena, out, "%.*s[%u] '%.*s'; source_file=%u\n", - indent_level, rdi_stringize_spaces, - this_idx, str8_varg(name), file_path->source_file_idx); - } - - for (U32 child = file_path->first_child; - child != 0;){ - // get node for child - RDI_FilePathNode *child_node = 0; - if (child < bundle->file_path_count){ - child_node = bundle->file_paths + child; - } - if (child_node == 0){ - break; - } - - // stringize child - rdi_stringize_file_path(arena, out, parsed, bundle, child_node, indent_level + 1); - - // increment iterator - child = child_node->next_sibling; - } -} - -static void -rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_SourceFile *source_file, U32 indent_level){ - // extract line map data - RDI_ParsedLineMap line_map = {0}; - rdi_line_map_from_source_file(parsed, source_file, &line_map); - - // stringize line map data - str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); - - for (U32 i = 0; i < line_map.count; i += 1){ - U32 line_num = line_map.nums[i]; - - U32 digit_count = 1; - if (line_num > 0){ - U32 x = line_num; - for (;;){ - x /= 10; - if (x == 0){ - break; - } - digit_count += 1; - } - } - - str8_list_pushf(arena, out, "%.*s %u: ", - indent_level, rdi_stringize_spaces, line_num); - - U32 first = line_map.ranges[i]; - U32 opl_raw = line_map.ranges[i + 1]; - U32 opl = ClampTop(opl_raw, line_map.voff_count); - for (U32 j = first; j < opl; j += 1){ - if (j == first){ - str8_list_pushf(arena, out, "0x%08x\n", line_map.voffs[j]); - } - else{ - str8_list_pushf(arena, out, "%.*s0x%08x\n", - indent_level + digit_count + 3, rdi_stringize_spaces, - line_map.voffs[j]); - } - } - } -} - -static void -rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_Unit *unit, U32 indent_level){ - String8 unit_name = {0}; - unit_name.str = rdi_string_from_idx(parsed, unit->unit_name_string_idx, &unit_name.size); - String8 compiler_name = {0}; - compiler_name.str = rdi_string_from_idx(parsed, unit->compiler_name_string_idx, - &compiler_name.size); - - str8_list_pushf(arena, out, "%.*sunit_name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(unit_name)); - str8_list_pushf(arena, out, "%.*scompiler_name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(compiler_name)); - - str8_list_pushf(arena, out, "%.*ssource_file_path=%u\n", - indent_level, rdi_stringize_spaces, unit->source_file_path_node); - str8_list_pushf(arena, out, "%.*sobject_file_path=%u\n", - indent_level, rdi_stringize_spaces, unit->object_file_path_node); - str8_list_pushf(arena, out, "%.*sarchive_file_path=%u\n", - indent_level, rdi_stringize_spaces, unit->archive_file_path_node); - str8_list_pushf(arena, out, "%.*sbuild_path=%u\n", - indent_level, rdi_stringize_spaces, unit->build_path_node); - - String8 language_str = rdi_string_from_language(unit->language); - str8_list_pushf(arena, out, "%.*slanguage=%.*s\n", - indent_level, rdi_stringize_spaces, str8_varg(language_str)); - - // extract line info data - RDI_ParsedLineInfo line_info = {0}; - rdi_line_info_from_unit(parsed, unit, &line_info); - - - // stringize line info - str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); - - for (U32 i = 0; i < line_info.count; i += 1){ - U64 first = line_info.voffs[i]; - U64 opl = line_info.voffs[i + 1]; - RDI_Line *line = line_info.lines + i; - RDI_Column *col = 0; - if (i < line_info.col_count){ - col = line_info.cols + i; - } - - if (col == 0){ - str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u\n", - indent_level, rdi_stringize_spaces, - first, opl, line->file_idx, line->line_num); - } - else{ - str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u; columns=[%u,%u)\n", - indent_level, rdi_stringize_spaces, - first, opl, line->file_idx, line->line_num, - col->col_first, col->col_opl); - } - } -} - -static void -rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_TypeNode *type, U32 indent_level){ - RDI_TypeKind kind = type->kind; - String8 type_kind_str = rdi_string_from_type_kind(kind); - - str8_list_pushf(arena, out, "%.*skind=%.*s\n", - indent_level, rdi_stringize_spaces, str8_varg(type_kind_str)); - - switch (type->kind){ - case RDI_TypeKind_Modifier: - { - str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); - rdi_stringize_type_modifier_flags(arena, out, type->flags); - str8_list_push(arena, out, str8_lit("\n")); - }break; - - default: - { - if (type->flags != 0){ - str8_list_pushf(arena, out, "%.*sflags=%x (missing stringizer path)", - indent_level, rdi_stringize_spaces, type->flags); - } - }break; - } - - str8_list_pushf(arena, out, "%.*sbyte_size=%u\n", - indent_level, rdi_stringize_spaces, type->byte_size); - - if (RDI_TypeKind_FirstBuiltIn <= kind && - kind <= RDI_TypeKind_LastBuiltIn){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, type->built_in.name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sbuilt_in.name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - } - - else if (RDI_TypeKind_FirstConstructed <= kind && - kind <= RDI_TypeKind_LastConstructed){ - str8_list_pushf(arena, out, "%.*sconstructed.direct_type=%u\n", - indent_level, rdi_stringize_spaces, type->constructed.direct_type_idx); - - if (type->kind == RDI_TypeKind_Array){ - str8_list_pushf(arena, out, "%.*sconstructed.array_count=%u\n", - indent_level, rdi_stringize_spaces, type->constructed.count); - } - - if (type->kind == RDI_TypeKind_Function || - type->kind == RDI_TypeKind_Method){ - U32 run_first = type->constructed.param_idx_run_first; - U32 run_count_raw = type->constructed.count; - - U32 run_count = 0; - U32 *run = rdi_idx_run_from_first_count(parsed, run_first, run_count_raw, &run_count); - - U32 this_type_idx = 0; - if (run_count > 0 && type->kind == RDI_TypeKind_Method){ - this_type_idx = run[0]; - run += 1; - run_count -= 1; - } - - if (this_type_idx != 0){ - str8_list_pushf(arena, out, "%.*sconstructed.this_type=%u\n", - indent_level, rdi_stringize_spaces, this_type_idx); - } - - str8_list_pushf(arena, out, "%.*sconstructed.params={", - indent_level, rdi_stringize_spaces); - - if (run_count > 0){ - U32 last = run_count - 1; - for (U32 j = 0; j < last; j += 1){ - str8_list_pushf(arena, out, " %u,", run[j]); - } - str8_list_pushf(arena, out, " %u ", run[last]); - } - - str8_list_push(arena, out, str8_lit("}\n")); - } - } - - else if (RDI_TypeKind_FirstUserDefined <= kind && - kind <= RDI_TypeKind_LastUserDefined){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, type->user_defined.name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*suser_defined.name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - str8_list_pushf(arena, out, "%.*suser_defined.direct_type=%u\n", - indent_level, rdi_stringize_spaces, - type->user_defined.direct_type_idx); - str8_list_pushf(arena, out, "%.*suser_defined.udt=%u\n", - indent_level, rdi_stringize_spaces, - type->user_defined.udt_idx); - } - - else if (kind == RDI_TypeKind_Bitfield){ - str8_list_pushf(arena, out, "%.*sbitfield.off=%u\n", - indent_level, rdi_stringize_spaces, type->bitfield.off); - str8_list_pushf(arena, out, "%.*sbitfield.size=%u\n", - indent_level, rdi_stringize_spaces, type->bitfield.size); - } -} - -static void -rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_UDTMemberBundle *member_bundle, RDI_UDT *udt, - U32 indent_level){ - str8_list_pushf(arena, out, "%.*sself_type=%u\n", - indent_level, rdi_stringize_spaces, udt->self_type_idx); - - str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); - rdi_stringize_user_defined_type_flags(arena, out, udt->flags); - str8_list_push(arena, out, str8_lit("\n")); - - if (udt->file_idx != 0){ - str8_list_pushf(arena, out, "%.*sloc={file=%u; line=%u; col=%u}\n", - indent_level, rdi_stringize_spaces, - udt->file_idx, udt->line, udt->col); - } - - // enum members - if (udt->flags & RDI_UserDefinedTypeFlag_EnumMembers){ - U32 first_raw = udt->member_first; - U32 opl_raw = first_raw + udt->member_count; - U32 opl = ClampTop(opl_raw, member_bundle->enum_member_count); - U32 first = ClampTop(first_raw, opl); - - if (first < opl){ - str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); - RDI_EnumMember *enum_member = member_bundle->enum_members + first; - for (U32 i = first; i < opl; i += 1, enum_member += 1){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, enum_member->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*s '%.*s' %llu\n", - indent_level, rdi_stringize_spaces, - str8_varg(name), enum_member->val); - } - str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); - } - } - - // field members - else{ - U32 first_raw = udt->member_first; - U32 opl_raw = first_raw + udt->member_count; - U32 opl = ClampTop(opl_raw, member_bundle->member_count); - U32 first = ClampTop(first_raw, opl); - - if (first < opl){ - str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); - RDI_Member *member = member_bundle->members + first; - for (U32 i = first; i < opl; i += 1, member += 1){ - str8_list_pushf(arena, out, "%.*s {\n", indent_level, rdi_stringize_spaces); - - String8 kind_str = rdi_string_from_member_kind(member->kind); - str8_list_pushf(arena, out, "%.*s kind=%.*s\n", - indent_level, rdi_stringize_spaces, str8_varg(kind_str)); - - if (member->name_string_idx != 0){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, member->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*s name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - } - - str8_list_pushf(arena, out, "%.*s type=%u\n", - indent_level, rdi_stringize_spaces, member->type_idx); - str8_list_pushf(arena, out, "%.*s off=%u\n", - indent_level, rdi_stringize_spaces, member->off); - - str8_list_pushf(arena, out, "%.*s }\n", indent_level, rdi_stringize_spaces); - } - str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); - } - } -} - -static void -rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_GlobalVariable *global_variable, U32 indent_level){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, global_variable->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); - rdi_stringize_link_flags(arena, out, global_variable->link_flags); - str8_list_push(arena, out, str8_lit("\n")); - - str8_list_pushf(arena, out, "%.*svoff=0x%08llx\n", - indent_level, rdi_stringize_spaces, global_variable->voff); - - str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, rdi_stringize_spaces, global_variable->type_idx); - - str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, rdi_stringize_spaces, global_variable->container_idx); -} - -static void -rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_ThreadVariable *thread_var, - U32 indent_level){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, thread_var->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); - rdi_stringize_link_flags(arena, out, thread_var->link_flags); - str8_list_push(arena, out, str8_lit("\n")); - - str8_list_pushf(arena, out, "%.*stls_off=0x%08x\n", - indent_level, rdi_stringize_spaces, thread_var->tls_off); - - str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, rdi_stringize_spaces, thread_var->type_idx); - - str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, rdi_stringize_spaces, thread_var->container_idx); -} - -static void -rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_Procedure *proc, U32 indent_level){ - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, proc->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - String8 link_name = {0}; - link_name.str = rdi_string_from_idx(parsed, proc->link_name_string_idx, &link_name.size); - str8_list_pushf(arena, out, "%.*slink_name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(link_name)); - - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); - rdi_stringize_link_flags(arena, out, proc->link_flags); - str8_list_push(arena, out, str8_lit("\n")); - - str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, rdi_stringize_spaces, proc->type_idx); - - str8_list_pushf(arena, out, "%.*sroot_scope_idx=%u\n", - indent_level, rdi_stringize_spaces, proc->root_scope_idx); - - str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, rdi_stringize_spaces, proc->container_idx); -} - -static void -rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level){ - - U32 this_idx = (U32)(scope - bundle->scopes); - - str8_list_pushf(arena, out, "%.*s[%u]\n", - indent_level, rdi_stringize_spaces, this_idx); - - str8_list_pushf(arena, out, "%.*s proc_idx=%u\n", - indent_level, rdi_stringize_spaces, scope->proc_idx); - - // voff ranges - { - U32 voff_range_first_raw = scope->voff_range_first; - U32 voff_range_opl_raw = scope->voff_range_opl; - U32 voff_range_opl_clamped = ClampTop(voff_range_opl_raw, bundle->scope_voff_count); - U32 voff_range_first = ClampTop(voff_range_first_raw, voff_range_opl_clamped); - U32 voff_range_opl = voff_range_opl_clamped; - if ((voff_range_opl - voff_range_first) % 2 == 1){ - voff_range_opl -= 1; - } - - U64 *voff_ptr = bundle->scope_voffs + voff_range_first; - - if (voff_range_opl - voff_range_first > 2){ - str8_list_pushf(arena, out, "%.*s voff_ranges={\n", - indent_level, rdi_stringize_spaces); - for (U32 i = voff_range_first; i < voff_range_opl; i += 2, voff_ptr += 2){ - str8_list_pushf(arena, out, "%.*s [0x%08llx, 0x%08llx)\n", - indent_level, rdi_stringize_spaces, - voff_ptr[0], voff_ptr[1]); - } - str8_list_pushf(arena, out, "%.*s }\n", - indent_level, rdi_stringize_spaces); - } - else if (voff_range_opl - voff_range_first == 2){ - str8_list_pushf(arena, out, "%.*s voff_range=[0x%08llx, 0x%08llx)\n", - indent_level, rdi_stringize_spaces, - voff_ptr[0], voff_ptr[1]); - } - } - - // locals - { - U32 local_first = scope->local_first; - U32 local_opl_raw = local_first + scope->local_count; - U32 local_opl = ClampTop(local_opl_raw, bundle->local_count); - - if (local_first < local_opl){ - RDI_Local *local_ptr = bundle->locals + local_first; - for (U32 i = local_first; i < local_opl; i += 1, local_ptr += 1){ - str8_list_pushf(arena, out, "%.*s local[%u]\n", - indent_level, rdi_stringize_spaces, i); - - String8 local_kind_str = rdi_string_from_local_kind(local_ptr->kind); - str8_list_pushf(arena, out, "%.*s kind=%.*s\n", - indent_level, rdi_stringize_spaces, str8_varg(local_kind_str)); - - String8 name = {0}; - name.str = rdi_string_from_idx(parsed, local_ptr->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*s name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - str8_list_pushf(arena, out, "%.*s type_idx=%u\n", - indent_level, rdi_stringize_spaces, local_ptr->type_idx); - - U32 location_first = local_ptr->location_first; - U32 location_opl_raw = local_ptr->location_opl; - U32 location_opl = ClampTop(location_opl_raw, bundle->location_block_count); - - if (location_first < location_opl){ - str8_list_pushf(arena, out, "%.*s locations:\n", indent_level, rdi_stringize_spaces); - RDI_LocationBlock *block_ptr = bundle->location_blocks + location_first; - for (U32 j = location_first; j < location_opl; j += 1, block_ptr += 1){ - if (block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32){ - str8_list_pushf(arena, out, "%.*s case *always*:\n", indent_level, rdi_stringize_spaces); - } - else{ - str8_list_pushf(arena, out, "%.*s case [0x%08x, 0x%08x):\n", - indent_level, rdi_stringize_spaces, - block_ptr->scope_off_first, block_ptr->scope_off_opl); - } - - if (block_ptr->location_data_off >= bundle->location_data_size){ - str8_list_pushf(arena, out, "%.*s \n", - indent_level, rdi_stringize_spaces); - } - else{ - str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); - - U8 *loc_data_opl = bundle->location_data + bundle->location_data_size; - U8 *loc_base_ptr = bundle->location_data + block_ptr->location_data_off; - RDI_LocationKind kind = (RDI_LocationKind)*loc_base_ptr; - switch (kind){ - default: - { - str8_list_pushf(arena, out, "\n"); - }break; - - case RDI_LocationKind_AddrBytecodeStream: - { - str8_list_pushf(arena, out, "AddrBytecodeStream\n"); - str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); - U8 *bytecode_ptr = loc_base_ptr + 1; - for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ - str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); - } - str8_list_pushf(arena, out, "\n"); - }break; - - case RDI_LocationKind_ValBytecodeStream: - { - str8_list_pushf(arena, out, "ValBytecodeStream\n"); - str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); - U8 *bytecode_ptr = loc_base_ptr + 1; - for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ - str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); - } - str8_list_pushf(arena, out, "\n"); - }break; - - case RDI_LocationKind_AddrRegisterPlusU16: - { - if (loc_base_ptr + sizeof(RDI_LocationRegisterPlusU16) > loc_data_opl){ - str8_list_pushf(arena, out, "AddrRegisterPlusU16( )\n"); - } - else{ - RDI_LocationRegisterPlusU16 *loc = (RDI_LocationRegisterPlusU16*)loc_base_ptr; - str8_list_pushf(arena, out, "AddrRegisterPlusU16(reg: %u, off: %u)\n", - loc->register_code, loc->offset); - } - }break; - - case RDI_LocationKind_AddrAddrRegisterPlusU16: - { - if (loc_base_ptr + sizeof(RDI_LocationRegisterPlusU16) > loc_data_opl){ - str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16( )\n"); - } - else{ - RDI_LocationRegisterPlusU16 *loc = (RDI_LocationRegisterPlusU16*)loc_base_ptr; - str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16(reg: %u, off: %u)\n", - loc->register_code, loc->offset); - } - }break; - - case RDI_LocationKind_ValRegister: - { - if (loc_base_ptr + sizeof(RDI_LocationRegister) > loc_data_opl){ - str8_list_pushf(arena, out, "ValRegister( )\n"); - } - else{ - RDI_LocationRegister *loc = (RDI_LocationRegister*)loc_base_ptr; - str8_list_pushf(arena, out, "ValRegister(reg: %u)\n", loc->register_code); - } - }break; - } - } - } - } - } - } - } - - // TODO(allen): static locals - - for (U32 child = scope->first_child_scope_idx; - child != 0;){ - // get scope for child - RDI_Scope *child_scope = 0; - if (child < bundle->scope_count){ - child_scope = bundle->scopes + child; - } - if (child_scope == 0){ - break; - } - - // stringize child - rdi_stringize_scope(arena, out, parsed, bundle, child_scope, indent_level + 1); - - // increment iterator - child = child_scope->next_sibling_scope_idx; - } - - str8_list_pushf(arena, out, "%.*s[/%u]\n", - indent_level, rdi_stringize_spaces, this_idx); -} diff --git a/src/raddbgi_dump/raddbgi_stringize.h b/src/raddbgi_dump/raddbgi_stringize.h deleted file mode 100644 index 51534416..00000000 --- a/src/raddbgi_dump/raddbgi_stringize.h +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RADDBGI_STRINGIZE_H -#define RADDBGI_STRINGIZE_H - -//////////////////////////////// -//~ RADDBG Stringize Helper Types - -typedef struct RDI_FilePathBundle{ - RDI_FilePathNode *file_paths; - U32 file_path_count; -} RDI_FilePathBundle; - -typedef struct RDI_UDTMemberBundle{ - RDI_Member *members; - RDI_EnumMember *enum_members; - U32 member_count; - U32 enum_member_count; -} RDI_UDTMemberBundle; - -typedef struct RDI_ScopeBundle{ - RDI_Scope *scopes; - U64 *scope_voffs; - RDI_Local *locals; - RDI_LocationBlock *location_blocks; - U8 *location_data; - U32 scope_count; - U32 scope_voff_count; - U32 local_count; - U32 location_block_count; - U32 location_data_size; -} RDI_ScopeBundle; - -//////////////////////////////// -//~ RADDBG Common Stringize Functions - -static String8 rdi_string_from_data_section_tag(RDI_DataSectionTag tag); -static String8 rdi_string_from_arch(RDI_Arch arch); -static String8 rdi_string_from_language(RDI_Language language); -static String8 rdi_string_from_type_kind(RDI_TypeKind type_kind); -static String8 rdi_string_from_member_kind(RDI_MemberKind member_kind); -static String8 rdi_string_from_local_kind(RDI_LocalKind local_kind); - -//////////////////////////////// -//~ RADDBG Flags Stringize Functions - -static void rdi_stringize_binary_section_flags(Arena *arena, String8List *out, - RDI_BinarySectionFlags flags); - -static void rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, - RDI_TypeModifierFlags flags); - -static void rdi_stringize_user_defined_type_flags(Arena *arena, String8List *out, - RDI_UserDefinedTypeFlags flags); - -static void rdi_stringize_link_flags(Arena *arena, String8List *out, - RDI_LinkFlags flags); - -//////////////////////////////// -//~ RADDBG Compound Stringize Functions - -static void -rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *parsed, - U32 indent_level); - -static void -rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_TopLevelInfo *tli, U32 indent_level); - -static void -rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_BinarySection *bin_section, U32 indent_level); - -static void -rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, - U32 indent_level); - -static void -rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_SourceFile *source_file, U32 indent_level); - -static void -rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_Unit *unit, U32 indent_level); - -static void -rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_TypeNode *type, U32 indent_level); - -static void -rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_UDTMemberBundle *bundle, RDI_UDT *udt, - U32 indent_level); - -static void -rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_GlobalVariable *global_variable, U32 indent_level); - -static void -rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_ThreadVariable *thread_var, - U32 indent_level); - -static void -rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_Procedure *proc, U32 indent_level); - -static void -rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *parsed, - RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level); - -#endif // RADDBGI_STRINGIZE_H From 642acdf4745e796c191cf0e0c1babaa7fb6baa17 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 25 Feb 2024 09:57:51 -0800 Subject: [PATCH 137/275] switch voff -> symbol name path to graceful failure RDI lookups --- src/df/core/df_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 664516fd..fb30d332 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3200,7 +3200,7 @@ df_symbol_name_from_binary_voff(Arena *arena, DF_Entity *binary, U64 voff) if(result.size == 0 && rdi->scope_vmap != 0) { U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff); - RDI_Scope *scope = &rdi->scopes[scope_idx]; + RDI_Scope *scope = rdi_element_from_idx(rdi, scopes, scope_idx); U64 proc_idx = scope->proc_idx; RDI_Procedure *procedure = &rdi->procedures[proc_idx]; U64 name_size = 0; @@ -3210,7 +3210,7 @@ df_symbol_name_from_binary_voff(Arena *arena, DF_Entity *binary, U64 voff) if(result.size == 0 && rdi->global_vmap != 0) { U64 global_idx = rdi_vmap_idx_from_voff(rdi->global_vmap, rdi->global_vmap_count, voff); - RDI_GlobalVariable *global_var = &rdi->global_variables[global_idx]; + RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, global_idx); U64 name_size = 0; U8 *name_ptr = rdi_string_from_idx(rdi, global_var->name_string_idx, &name_size); result = push_str8_copy(arena, str8(name_ptr, name_size)); From c4b8916bcfe072328a6fb710b2daaefbdf53c391 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 25 Feb 2024 09:59:56 -0800 Subject: [PATCH 138/275] raddbgi dump - fix bad condition --- src/raddbgi_dump/raddbgi_dump_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raddbgi_dump/raddbgi_dump_main.c b/src/raddbgi_dump/raddbgi_dump_main.c index ed355078..75177ba6 100644 --- a/src/raddbgi_dump/raddbgi_dump_main.c +++ b/src/raddbgi_dump/raddbgi_dump_main.c @@ -107,7 +107,7 @@ main(int argc, char **argv) RDI_Parsed *raddbg = &raddbg_; { parse_status = rdi_parse(input_data.str, input_data.size, &raddbg_); - if(parse_status == RDI_ParseStatus_Good) + if(parse_status != RDI_ParseStatus_Good) { str8_list_pushf(arena, &errors, "error (parse): RADDBGI file wasn't parsed successfully. (0x%x)", parse_status); } From d8cf83b4d7c37184daace63a578add1019e8949f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 25 Feb 2024 13:30:15 -0800 Subject: [PATCH 139/275] pull out & organize build configuration options, including entry point style, to context cracker --- build.bat | 10 ++-- src/base/base_context_cracking.h | 59 ++++++++++++++----- src/base/base_string.c | 2 +- src/base/base_thread_context.c | 2 +- src/base/base_types.h | 13 +--- src/df/gfx/df_gfx.c | 4 +- .../dwrite/font_provider_dwrite_main.cpp | 2 +- src/metagen/metagen_main.c | 5 ++ src/raddbg/raddbg.h | 6 +- src/raddbg/raddbg_main.cpp | 5 ++ src/raddbgi_dump/raddbgi_dump_main.c | 5 ++ src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 13 +++- src/render/d3d11/render_d3d11.cpp | 4 +- src/render/d3d11/render_d3d11_main.cpp | 2 +- 14 files changed, 87 insertions(+), 45 deletions(-) diff --git a/build.bat b/build.bat index 56121a31..e925bcad 100644 --- a/build.bat +++ b/build.bat @@ -43,18 +43,16 @@ if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=add :: --- Compile/Link Line Definitions ------------------------------------------ set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 set clang_common= -I..\src\ -I..\local\ -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -set cl_debug= call cl /Od %cl_common% %auto_compile_flags% -set cl_release= call cl /O2 /DNDEBUG %cl_common% %auto_compile_flags% -set clang_debug= call clang -g -O0 %clang_common% %auto_compile_flags% -set clang_release= call clang -g -O2 -DNDEBUG %clang_common% %auto_compile_flags% +set cl_debug= call cl /Od /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% +set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% +set clang_debug= call clang -g -O0 /DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% +set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /natvis:"%~dp0\src\natvis\base.natvis" logo.res set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /natvis:"%~dp0\src\natvis\base.natvis" logo.res set cl_out= /out: set clang_out= -o :: --- Per-Build Settings ----------------------------------------------------- -set gfx=-DOS_FEATURE_GRAPHICAL=1 -set net=-DOS_FEATURE_SOCKET=1 set link_dll=-DLL if "%msvc%"=="1" set only_compile=/c if "%clang%"=="1" set only_compile=-c diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index b918cfdf..e9b2b8cc 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -4,6 +4,9 @@ #ifndef BASE_CONTEXT_CRACKING_H #define BASE_CONTEXT_CRACKING_H +//////////////////////////////// +//~ rjf: Clang OS/Arch Cracking + #if defined(__clang__) # define COMPILER_CLANG 1 @@ -15,7 +18,7 @@ # elif defined(__APPLE__) && defined(__MACH__) # define OS_MAC 1 # else -# error This compiler/platform combo is not supported yet +# error This compiler/OS combo is not supported. # endif # if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) @@ -27,9 +30,12 @@ # elif defined(__arm__) # define ARCH_ARM32 1 # else -# error architecture not supported yet +# error Architecture not supported. # endif +//////////////////////////////// +//~ rjf: MSVC OS/Arch Cracking + #elif defined(_MSC_VER) # define COMPILER_MSVC 1 @@ -57,7 +63,7 @@ # if defined(_WIN32) # define OS_WINDOWS 1 # else -# error This compiler/platform combo is not supported yet +# error This compiler/OS combo is not supported. # endif # if defined(_M_AMD64) @@ -69,9 +75,12 @@ # elif defined(_M_ARM) # define ARCH_ARM32 1 # else -# error architecture not supported yet +# error Architecture not supported. # endif +//////////////////////////////// +//~ rjf: GCC OS/Arch Cracking + #elif defined(__GNUC__) || defined(__GNUG__) # define COMPILER_GCC 1 @@ -79,7 +88,7 @@ # if defined(__gnu_linux__) || defined(__linux__) # define OS_LINUX 1 # else -# error This compiler/platform combo is not supported yet +# error This compiler/OS combo is not supported. # endif # if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) @@ -91,26 +100,54 @@ # elif defined(__arm__) # define ARCH_ARM32 1 # else -# error architecture not supported yet +# error Architecture not supported. # endif #else -# error This compiler is not supported yet +# error Compiler not supported. #endif +//////////////////////////////// +//~ rjf: Arch Cracking + #if defined(ARCH_X64) # define ARCH_64BIT 1 #elif defined(ARCH_X86) # define ARCH_32BIT 1 #endif +#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86 +# define ARCH_LITTLE_ENDIAN 1 +#else +# error Endianness of this architecture not understood by context cracker. +#endif + +//////////////////////////////// +//~ rjf: Language Cracking + #if defined(__cplusplus) # define LANG_CPP 1 #else # define LANG_C 1 #endif -// zeroify +//////////////////////////////// +//~ rjf: Build Option Cracking + +#if !defined(BUILD_DEBUG) +# define BUILD_DEBUG 1 +#endif + +#if !defined(BUILD_SUPPLEMENTARY_UNIT) +# define BUILD_SUPPLEMENTARY_UNIT 0 +#endif + +#if !defined(BUILD_CONSOLE_INTERFACE) +# define BUILD_CONSOLE_INTERFACE 0 +#endif + +//////////////////////////////// +//~ rjf: Zero All Undefined Options #if !defined(ARCH_32BIT) # define ARCH_32BIT 0 @@ -155,10 +192,4 @@ # define LANG_C 0 #endif -#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86 -# define ARCH_LITTLE_ENDIAN 1 -#else -# error Endianness of this architecture not understood by context cracker -#endif - #endif // BASE_CONTEXT_CRACKING_H diff --git a/src/base/base_string.c b/src/base/base_string.c index 4959dbb7..f213187b 100644 --- a/src/base/base_string.c +++ b/src/base/base_string.c @@ -4,7 +4,7 @@ //////////////////////////////// //~ rjf: Third Party Includes -#if !SUPPLEMENT_UNIT +#if !BUILD_SUPPLEMENTARY_UNIT # define STB_SPRINTF_IMPLEMENTATION # define STB_SPRINTF_STATIC # include "third_party/stb/stb_sprintf.h" diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index 33ae9e50..45ab7afe 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -5,7 +5,7 @@ // NOTE(allen): Thread Context Functions C_LINKAGE thread_static TCTX* tctx_thread_local; -#if !SUPPLEMENT_UNIT +#if !BUILD_SUPPLEMENTARY_UNIT C_LINKAGE thread_static TCTX* tctx_thread_local = 0; #endif diff --git a/src/base/base_types.h b/src/base/base_types.h index d91358c6..3eb1f78f 100644 --- a/src/base/base_types.h +++ b/src/base/base_types.h @@ -13,17 +13,6 @@ #include #include -//////////////////////////////// -//~ rjf: Build Configuration - -#if !defined(ENABLE_DEV) -# define ENABLE_DEV 0 -#endif - -#if !defined(SUPPLEMENT_UNIT) -# define SUPPLEMENT_UNIT 0 -#endif - //////////////////////////////// //~ rjf: Codebase Keywords @@ -93,7 +82,7 @@ #endif #define AssertAlways(x) do{if(!(x)) {Trap();}}while(0) -#if !defined(NDEBUG) +#if BUILD_DEBUG # define Assert(x) AssertAlways(x) #else # define Assert(x) (void)(x) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 938269ff..a7a8e9ad 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -1012,7 +1012,7 @@ df_window_from_os_handle(OS_Handle os) return result; } -#if defined(_MSC_VER) && !defined(__clang__) && defined(NDEBUG) +#if COMPILER_MSVC && !BUILD_DEBUG #pragma optimize("", off) #endif @@ -6807,7 +6807,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D ProfEnd(); } -#if defined(_MSC_VER) && !defined(__clang__) && defined(NDEBUG) +#if COMPILER_MSVC && !BUILD_DEBUG #pragma optimize("", on) #endif diff --git a/src/font_provider/dwrite/font_provider_dwrite_main.cpp b/src/font_provider/dwrite/font_provider_dwrite_main.cpp index e145de25..4ebbb9b2 100644 --- a/src/font_provider/dwrite/font_provider_dwrite_main.cpp +++ b/src/font_provider/dwrite/font_provider_dwrite_main.cpp @@ -1,4 +1,4 @@ -#define SUPPLEMENT_UNIT 1 +#define BUILD_SUPPLEMENTARY_UNIT 1 #include "base/base_inc.h" #include "os/os_inc.h" diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 1ab89502..7ad38268 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_CONSOLE_INTERFACE 1 + //////////////////////////////// //~ rjf: Includes diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 777c2b15..0f72cb57 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -407,10 +407,10 @@ #define RADDBG_VERSION_MINOR 9 #define RADDBG_VERSION_PATCH 8 #define RADDBG_VERSION_STRING_LITERAL Stringify(RADDBG_VERSION_MAJOR) "." Stringify(RADDBG_VERSION_MINOR) "." Stringify(RADDBG_VERSION_PATCH) -#if defined(NDEBUG) -# define RADDBG_BUILD_STR "" -#else +#if BUILD_DEBUG # define RADDBG_BUILD_STR " [Debug]" +#else +# define RADDBG_BUILD_STR "" #endif #if defined(RADDBG_GIT) # define RADDBG_GIT_STR " [" RADDBG_GIT "]" diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index b8db5c55..fef04980 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Build Settings + +#define OS_FEATURE_GRAPHICAL 1 + //////////////////////////////// //~ rjf: Includes diff --git a/src/raddbgi_dump/raddbgi_dump_main.c b/src/raddbgi_dump/raddbgi_dump_main.c index 75177ba6..3b154a09 100644 --- a/src/raddbgi_dump/raddbgi_dump_main.c +++ b/src/raddbgi_dump/raddbgi_dump_main.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_CONSOLE_INTERFACE 1 + //////////////////////////////// //~ rjf: Includes diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index c3b53afd..dcb6e420 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -1,6 +1,14 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_CONSOLE_INTERFACE 1 + +//////////////////////////////// +//~ rjf: Includes + //- rjf: [lib] #include "lib_raddbgi_format/raddbgi_format.h" #include "lib_raddbgi_format/raddbgi_format.c" @@ -31,7 +39,8 @@ #include "pdb/pdb_stringize.c" #include "raddbgi_from_pdb.c" -//- rjf: entry point +//////////////////////////////// +//~ rjf: Entry Point int main(int argc, char **argv) @@ -110,5 +119,5 @@ main(int argc, char **argv) ProfEndCapture(); } - return(0); + return 0; } diff --git a/src/render/d3d11/render_d3d11.cpp b/src/render/d3d11/render_d3d11.cpp index c03573e5..4599433c 100644 --- a/src/render/d3d11/render_d3d11.cpp +++ b/src/render/d3d11/render_d3d11.cpp @@ -142,7 +142,7 @@ r_init(CmdLine *cmdln) //- rjf: create base device UINT creation_flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; -#if !defined(NDEBUG) +#if BUILD_DEBUG if(cmd_line_has_flag(cmdln, str8_lit("d3d11_debug"))) { creation_flags |= D3D11_CREATE_DEVICE_DEBUG; @@ -182,7 +182,7 @@ r_init(CmdLine *cmdln) } //- rjf: enable break-on-error -#if !defined(NDEBUG) +#if BUILD_DEBUG if(cmd_line_has_flag(cmdln, str8_lit("d3d11_debug"))) { ID3D11InfoQueue *info = 0; diff --git a/src/render/d3d11/render_d3d11_main.cpp b/src/render/d3d11/render_d3d11_main.cpp index 94367153..1a9e6b0d 100644 --- a/src/render/d3d11/render_d3d11_main.cpp +++ b/src/render/d3d11/render_d3d11_main.cpp @@ -1,7 +1,7 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#define SUPPLEMENT_UNIT 1 +#define BUILD_SUPPLEMENTARY_UNIT 1 #define OS_FEATURE_GRAPHICAL 1 #include "base/base_inc.h" From 3ec1edaff18d6f5a545ff92f496d0b4072914d6e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 25 Feb 2024 13:33:27 -0800 Subject: [PATCH 140/275] oops, fix clang --- build.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.bat b/build.bat index e925bcad..ca9a98ac 100644 --- a/build.bat +++ b/build.bat @@ -45,7 +45,7 @@ set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 set clang_common= -I..\src\ -I..\local\ -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf set cl_debug= call cl /Od /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% -set clang_debug= call clang -g -O0 /DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% +set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /natvis:"%~dp0\src\natvis\base.natvis" logo.res set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /natvis:"%~dp0\src\natvis\base.natvis" logo.res From 93ab48ecdf7278c882f39e373df4d1280817457e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 25 Feb 2024 14:00:35 -0800 Subject: [PATCH 141/275] organization/naming/dead-code-elimination pass over base --- src/base/base_arena.c | 13 - src/base/base_arena.h | 9 +- src/base/base_arena_dev.c | 197 ------------ src/base/base_arena_dev.h | 47 --- src/base/base_bits.c | 103 ------- src/base/base_bits.h | 18 -- src/base/{base_types.c => base_core.c} | 102 ++++++- src/base/{base_types.h => base_core.h} | 337 +++++++++++++-------- src/base/base_inc.c | 6 +- src/base/base_inc.h | 9 +- src/base/base_ins.h | 52 ---- src/base/base_linked_lists.h | 73 ----- src/base/{base_string.c => base_strings.c} | 0 src/base/{base_string.h => base_strings.h} | 6 +- src/raddbgi_from_dwarf/raddbgi_dwarf.c | 6 +- src/scratch/ryan_scratch.c | 4 +- 16 files changed, 330 insertions(+), 652 deletions(-) delete mode 100644 src/base/base_arena_dev.c delete mode 100644 src/base/base_arena_dev.h delete mode 100644 src/base/base_bits.c delete mode 100644 src/base/base_bits.h rename src/base/{base_types.c => base_core.c} (87%) rename src/base/{base_types.h => base_core.h} (75%) delete mode 100644 src/base/base_ins.h delete mode 100644 src/base/base_linked_lists.h rename src/base/{base_string.c => base_strings.c} (100%) rename src/base/{base_string.h => base_strings.h} (99%) diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 06f38de4..f75dd30f 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -55,9 +55,6 @@ arena_alloc__sized(U64 init_res, U64 init_cmt) arena->cmt = cmt; arena->res = res; arena->align = 8; -#if ENABLE_DEV - arena->dev = 0; -#endif arena->grow = 1; arena->large_pages = large_pages; } @@ -209,10 +206,6 @@ arena_pop_to(Arena *arena, U64 big_pos_unclamped) internal void arena_absorb(Arena *arena, Arena *sub) { -#if ENABLE_DEV - arena_annotate_absorb__dev(arena, sub); -#endif - // base adjustment Arena *current = arena->current; U64 base_adjust = current->base_pos + current->res; @@ -233,9 +226,6 @@ internal void * arena_push(Arena *arena, U64 size) { void *memory = arena_push__impl(arena, size); -#if ENABLE_DEV - arena_annotate_push__dev(arena, size, memory); -#endif return memory; } @@ -246,9 +236,6 @@ arena_push_contiguous(Arena *arena, U64 size) arena->grow = 0; void *memory = arena_push(arena, size); arena->grow = restore; -#if ENABLE_DEV - arena_annotate_push__dev(arena, size, memory); -#endif return memory; } diff --git a/src/base/base_arena.h b/src/base/base_arena.h index 0a9ca92f..dd8249ce 100644 --- a/src/base/base_arena.h +++ b/src/base/base_arena.h @@ -36,7 +36,6 @@ struct Arena U64 cmt; U64 res; U64 align; - struct ArenaDev *dev; B8 grow; B8 large_pages; }; @@ -82,13 +81,7 @@ internal B32 ensure_commit(void **cmt, void *pos, U64 cmt_block_size); //////////////////////////////// //~ NOTE(allen): Main API Macros -#if !ENABLE_DEV -# define push_array_no_zero(a,T,c) (T*)arena_push((a), sizeof(T)*(c)) -#else -# define push_array_no_zero(a,T,c) (tctx_write_this_srcloc(), (T*)arena_push((a), sizeof(T)*(c))) -#endif -#define push_array_no_zero__no_annotation(a,T,c) (T*)arena_push__impl((a), sizeof(T)*(c)) - +#define push_array_no_zero(a,T,c) (T*)arena_push((a), sizeof(T)*(c)) #define push_array(a,T,c) (T*)MemoryZero(push_array_no_zero(a,T,c), sizeof(T)*(c)) #endif // BASE_ARENA_H diff --git a/src/base/base_arena_dev.c b/src/base/base_arena_dev.c deleted file mode 100644 index 94c334bd..00000000 --- a/src/base/base_arena_dev.c +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Dev Arena - -#if ENABLE_DEV - -internal void -arena_annotate_push__dev(Arena *arena, U64 size, void *ptr){ - ArenaDev *dev = arena->dev; - if (dev != 0 && ptr != 0){ - //- read location - char *file_name = 0; - U64 line_number = 0; - tctx_read_srcloc(&file_name, &line_number); - tctx_write_srcloc(0, 0); - - //- profile - ArenaProf *prof = dev->prof; - if (prof != 0){ - // c string -> string - String8 file_name_str = str8_lit("(null)"); - if (file_name != 0){ - file_name_str = str8_cstring(file_name); - } - // record - arena_prof_inc_counters__dev(dev->arena, prof, file_name_str, line_number, size, 1); - } - } -} - -internal void -arena_annotate_absorb__dev(Arena *arena, Arena *sub){ - ArenaDev *dev = arena->dev; - ArenaDev *sub_dev = sub->dev; - if (dev != 0 && sub_dev != 0){ - //- merge profiles - ArenaProf *prof = dev->prof; - ArenaProf *sub_prof = sub_dev->prof; - if (prof != 0 && sub_prof != 0){ - for (ArenaProfNode *sub_node = sub_prof->first; - sub_node != 0; - sub_node = sub_node->next){ - arena_prof_inc_counters__dev(dev->arena, prof, sub_node->file_name, sub_node->line, - sub_node->size, sub_node->count); - } - } - } - //- release the sub dev memory - if (sub_dev != 0){ - arena_release(sub_dev->arena); - } -} - -internal ArenaDev* -arena_equip__dev(Arena *arena){ - ArenaDev *result = arena->dev; - if (result == 0){ - Arena *dev_arena = arena_alloc(); - ArenaDev *dev = (ArenaDev*)arena_push__impl(dev_arena, sizeof(ArenaDev)); - MemoryZeroStruct(dev); - dev->arena = dev_arena; - arena->dev = dev; - result = dev; - } - return(result); -} - -internal void -arena_equip_profile__dev(Arena *arena){ - ArenaDev *dev = arena_equip__dev(arena); - if (dev->prof == 0){ - dev->prof = (ArenaProf*)arena_push__impl(dev->arena, sizeof(ArenaProf)); - MemoryZeroStruct(dev->prof); - } -} - -internal void -arena_print_profile__dev(Arena *arena, Arena *out_arena, String8List *out){ - Assert(arena != out_arena); - - //- get dev & disable - ArenaDev *dev = arena->dev; - arena->dev = 0; - - //- get prof - ArenaProf *prof = (dev != 0)?dev->prof:0; - - //- not equipped with prof - if (prof == 0){ - str8_list_push(out_arena, out, str8_lit("not equipped with a memory profile\n")); - } - - //- print prof - if (prof != 0){ - Temp scratch = temp_begin(dev->arena); - - //- make flat array - U64 note_count = prof->count; - ArenaProfNode **notes = push_array_no_zero__no_annotation(scratch.arena, ArenaProfNode*, note_count); - { - ArenaProfNode **note_ptr = notes; - for (ArenaProfNode *node = prof->first; - node != 0; - node = node->next, note_ptr += 1){ - *note_ptr = node; - } - } - - //- file name size - U64 max_file_name_size = 0; - { - ArenaProfNode **note_ptr = notes; - for (U64 i = 0; i < note_count; i += 1, note_ptr += 1){ - max_file_name_size = Max(max_file_name_size, (**note_ptr).file_name.size); - } - } - - //- sort (> size, < [address]) - for (U64 i = 0; i < note_count; i += 1){ - ArenaProfNode **i_note = notes + i; - ArenaProfNode **min_note = i_note; - for (U64 j = i + 1; j < note_count; j += 1){ - ArenaProfNode **j_note = notes + j; - if ((**j_note).size > (**min_note).size || - ((**j_note).size == (**min_note).size && *j_note < *min_note)){ - min_note = j_note; - } - } - if (min_note != i_note){ - ArenaProfNode *t = *i_note; - *i_note = *min_note; - *min_note = t; - } - } - - //- total size - U64 total_size = 0; - { - ArenaProfNode **note_ptr = notes; - for (U64 i = 0; i < note_count; i += 1, note_ptr += 1){ - ArenaProfNode *note = *note_ptr; - total_size += note->size; - } - } - - //- print - { - str8_list_pushf(out_arena, out, "memory total: %llu\n", total_size); - - ArenaProfNode **note_ptr = notes; - for (U64 i = 0; i < note_count; i += 1, note_ptr += 1){ - ArenaProfNode *note = *note_ptr; - String8 location = push_str8f(scratch.arena, "%S:%5llu:", - note->file_name, note->line); - F32 percent = 100.f*((F32)note->size)/total_size; - str8_list_pushf(out_arena, out, "%*.*s %12llu %5.2f%% [%5llu]\n", - max_file_name_size + 7, str8_varg(location), - note->size, percent, note->count); - } - } - - temp_end(scratch); - } - - //- restore dev - arena->dev = dev; -} - -internal void -arena_prof_inc_counters__dev(Arena *dev_arena, ArenaProf *prof, String8 file_name, U64 line, - U64 size, U64 count){ - // find existing profile node - ArenaProfNode *prof_node = 0; - for (ArenaProfNode *node = prof->first; - node != 0; - node = node->next){ - if (node->line == line && str8_match(file_name, node->file_name, 0)){ - prof_node = node; - break; - } - } - // make new histogram node if necessary - if (prof_node == 0){ - prof_node = (ArenaProfNode*)arena_push(dev_arena, sizeof(*prof_node)); - SLLQueuePush(prof->first, prof->last, prof_node); - prof->count += 1; - prof_node->file_name = file_name; - prof_node->line = line; - } - // record this allocation - prof_node->size += size; - prof_node->count += count; -} - -#endif diff --git a/src/base/base_arena_dev.h b/src/base/base_arena_dev.h deleted file mode 100644 index 14d16b1d..00000000 --- a/src/base/base_arena_dev.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_ARENA_DEV_H -#define BASE_ARENA_DEV_H - -//////////////////////////////// -//~ NOTE(allen): Dev Arena Types - -typedef struct ArenaDev ArenaDev; -struct ArenaDev -{ - Arena *arena; - struct ArenaProf *prof; -}; - -typedef struct ArenaProf ArenaProf; -struct ArenaProf -{ - struct ArenaProfNode *first; - struct ArenaProfNode *last; - U64 count; -}; - -typedef struct ArenaProfNode ArenaProfNode; -struct ArenaProfNode -{ - ArenaProfNode *next; - String8 file_name; - U64 line; - U64 size; - U64 count; -}; - -//////////////////////////////// -//~ NOTE(allen): Dev Arena Functions - -#if ENABLE_DEV -internal void arena_annotate_push__dev(Arena *arena, U64 size, void *ptr); -internal void arena_annotate_absorb__dev(Arena *arena, Arena *sub); -internal ArenaDev* arena_equip__dev(Arena *arena); -internal void arena_equip_profile__dev(Arena *arena); -internal void arena_print_profile__dev(Arena *arena, Arena *out_arena, String8List *out); -internal void arena_prof_inc_counters__dev(Arena *dev_arena, ArenaProf *prof, String8 file_name, U64 line, U64 size, U64 count); -#endif - -#endif // BASE_ARENA_DEV_H diff --git a/src/base/base_bits.c b/src/base/base_bits.c deleted file mode 100644 index 1cb13455..00000000 --- a/src/base/base_bits.c +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) - -internal U64 -count_bits_set16(U16 val) -{ - return __popcnt16(val); -} - -internal U64 -count_bits_set32(U32 val) -{ - return __popcnt(val); -} - -internal U64 -count_bits_set64(U64 val) -{ - return __popcnt64(val); -} - -internal U64 -ctz32(U32 mask) -{ - unsigned long idx; - _BitScanForward(&idx, mask); - return idx; -} - -internal U64 -ctz64(U64 mask) -{ - unsigned long idx; - _BitScanForward64(&idx, mask); - return idx; -} - -internal U64 -clz32(U32 mask) -{ - unsigned long idx; - _BitScanReverse(&idx, mask); - return 31 - idx; -} - -internal U64 -clz64(U64 mask) -{ - unsigned long idx; - _BitScanReverse64(&idx, mask); - return 63 - idx; -} - -#elif COMPILER_CLANG || COMPILER_GCC - -internal U64 -count_bits_set16(U16 val) -{ - NotImplemented; - return 0; -} - -internal U64 -count_bits_set32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -count_bits_set64(U64 val) -{ - NotImplemented; - return 0; -} - -internal U64 -ctz32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -clz32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -clz64(U64 val) -{ - NotImplemented; - return 0; -} - -#else -# error "bits not defined for this target" -#endif - diff --git a/src/base/base_bits.h b/src/base/base_bits.h deleted file mode 100644 index ab9482d3..00000000 --- a/src/base/base_bits.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_BITS_H -#define BASE_BITS_H - -#define ExtractBit(word, idx) (((word) >> (idx)) & 1) - -internal U64 count_bits_set16(U16 val); -internal U64 count_bits_set32(U32 val); -internal U64 count_bits_set64(U64 val); - -internal U64 ctz32(U32 val); -internal U64 ctz64(U64 val); -internal U64 clz32(U32 val); -internal U64 clz64(U64 val); - -#endif // BASE_BITS_H diff --git a/src/base/base_types.c b/src/base/base_core.c similarity index 87% rename from src/base/base_types.c rename to src/base/base_core.c index f79bade6..24a6aaaa 100644 --- a/src/base/base_types.c +++ b/src/base/base_core.c @@ -2,7 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ Safe Casts +//~ rjf: Safe Casts internal U16 safe_cast_u16(U32 x) @@ -141,6 +141,106 @@ bswap_u64(U64 x) return result; } +#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) + +internal U64 +count_bits_set16(U16 val) +{ + return __popcnt16(val); +} + +internal U64 +count_bits_set32(U32 val) +{ + return __popcnt(val); +} + +internal U64 +count_bits_set64(U64 val) +{ + return __popcnt64(val); +} + +internal U64 +ctz32(U32 mask) +{ + unsigned long idx; + _BitScanForward(&idx, mask); + return idx; +} + +internal U64 +ctz64(U64 mask) +{ + unsigned long idx; + _BitScanForward64(&idx, mask); + return idx; +} + +internal U64 +clz32(U32 mask) +{ + unsigned long idx; + _BitScanReverse(&idx, mask); + return 31 - idx; +} + +internal U64 +clz64(U64 mask) +{ + unsigned long idx; + _BitScanReverse64(&idx, mask); + return 63 - idx; +} + +#elif COMPILER_CLANG || COMPILER_GCC + +internal U64 +count_bits_set16(U16 val) +{ + NotImplemented; + return 0; +} + +internal U64 +count_bits_set32(U32 val) +{ + NotImplemented; + return 0; +} + +internal U64 +count_bits_set64(U64 val) +{ + NotImplemented; + return 0; +} + +internal U64 +ctz32(U32 val) +{ + NotImplemented; + return 0; +} + +internal U64 +clz32(U32 val) +{ + NotImplemented; + return 0; +} + +internal U64 +clz64(U64 val) +{ + NotImplemented; + return 0; +} + +#else +# error "Bit intrinsic functions not defined for this compiler." +#endif + //////////////////////////////// //~ rjf: Enum -> Sign diff --git a/src/base/base_types.h b/src/base/base_core.h similarity index 75% rename from src/base/base_types.h rename to src/base/base_core.h index 3eb1f78f..f0fddea2 100644 --- a/src/base/base_types.h +++ b/src/base/base_core.h @@ -34,6 +34,80 @@ # define read_only #endif +#if COMPILER_MSVC +# define thread_static __declspec(thread) +#elif COMPILER_CLANG || COMPILER_GCC +# define thread_static __thread +#endif + +//////////////////////////////// +//~ rjf: Linkage Keyword Macros + +#if OS_WINDOWS +# define shared_function C_LINKAGE __declspec(dllexport) +#else +# define shared_function C_LINKAGE +#endif + +#if LANG_CPP +# define C_LINKAGE_BEGIN extern "C"{ +# define C_LINKAGE_END } +# define C_LINKAGE extern "C" +#else +# define C_LINKAGE_BEGIN +# define C_LINKAGE_END +# define C_LINKAGE +#endif + +//////////////////////////////// +//~ rjf: Units + +#define KB(n) (((U64)(n)) << 10) +#define MB(n) (((U64)(n)) << 20) +#define GB(n) (((U64)(n)) << 30) +#define TB(n) (((U64)(n)) << 40) +#define Thousand(n) ((n)*1000) +#define Million(n) ((n)*1000000) +#define Billion(n) ((n)*1000000000) + +//////////////////////////////// +//~ rjf: Branch Predictor Hints + +#if defined(__clang__) +# define Expect(expr, val) __builtin_expect((expr), (val)) +#else +# define Expect(expr, val) (expr) +#endif + +#define Likely(expr) Expect(expr,1) +#define Unlikely(expr) Expect(expr,0) + +//////////////////////////////// +//~ rjf: Clamps, Mins, Maxes + +#define Min(A,B) (((A)<(B))?(A):(B)) +#define Max(A,B) (((A)>(B))?(A):(B)) +#define ClampTop(A,X) Min(A,X) +#define ClampBot(X,B) Max(X,B) +#define Clamp(A,X,B) (((X)<(A))?(A):((X)>(B))?(B):(X)) + +//////////////////////////////// +//~ rjf: Member Offsets + +#define Member(T,m) (((T*)0)->m) +#define OffsetOf(T,m) IntFromPtr(&Member(T,m)) +#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off))) +#define CastFromMember(T,m,ptr) (T*)(((U8*)ptr) - OffsetOf(T,m)) + +//////////////////////////////// +//~ rjf: For-Loop Construct Macros + +#define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end)) +#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end)) + +#define EachEnumVal(type, it) type it = (type)0; it < type##_COUNT; it = (type)(it+1) +#define EachNonZeroEnumVal(type, it) type it = (type)1; it < type##_COUNT; it = (type)(it+1) + //////////////////////////////// //~ rjf: Memory Operation Macros @@ -56,19 +130,7 @@ #define MemoryMatchArray(a,b) MemoryMatch((a),(b),sizeof(a)) #define MemoryRead(T,p,e) ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) ) -#define MemoryConsume(T,p,e) \ -( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) ) - -//////////////////////////////// -//~ rjf: Units - -#define KB(n) (((U64)(n)) << 10) -#define MB(n) (((U64)(n)) << 20) -#define GB(n) (((U64)(n)) << 30) -#define TB(n) (((U64)(n)) << 40) -#define Thousand(n) ((n)*1000) -#define Million(n) ((n)*1000000) -#define Billion(n) ((n)*1000000000) +#define MemoryConsume(T,p,e) ( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) ) //////////////////////////////// //~ rjf: Asserts @@ -77,8 +139,8 @@ # define Trap() __debugbreak() #elif COMPILER_CLANG || COMPILER_GCC # define Trap() __builtin_trap() -# else -# error "undefined trap" +#else +# error Unknown trap intrinsic for this compiler. #endif #define AssertAlways(x) do{if(!(x)) {Trap();}}while(0) @@ -87,69 +149,158 @@ #else # define Assert(x) (void)(x) #endif -#define AssertImplies(a,b) Assert(!(a) || b) -#define AssertIff(a,b) Assert(!!(a) == !!(b)) #define InvalidPath Assert(!"Invalid Path!") #define NotImplemented Assert(!"Not Implemented!") #define NoOp ((void)0) - -#define StaticAssert(C,ID) global U8 Glue(ID,__LINE__)[(C)?1:-1] +#define StaticAssert(C, ID) global U8 Glue(ID, __LINE__)[(C)?1:-1] //////////////////////////////// -//~ rjf: Branch Predictor Hints +//~ rjf: Atomic Operations -#if defined(__clang__) -# define Expect(expr, val) __builtin_expect((expr), (val)) +#if OS_WINDOWS +# include +# include +# include +# include +# if ARCH_X64 +# define ins_atomic_u64_eval(x) InterlockedAdd64((volatile __int64 *)(x), 0) +# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) +# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) +# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) +# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((volatile __int64 *)(x), c) +# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) +# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) +# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile __int64 *)(x), (__int64)(c)) +# else +# error Atomic intrinsics not defined for this operating system / architecture combination. +# endif +#elif OS_LINUX +# if ARCH_X64 +# define ins_atomic_u64_inc_eval(x) __sync_fetch_and_add((volatile U64 *)(x), 1) +# else +# error Atomic intrinsics not defined for this operating system / architecture combination. +# endif #else -# define Expect(expr, val) (expr) +# error Atomic intrinsics not defined for this operating system. #endif -#define Likely(expr) Expect(expr,1) -#define Unlikely(expr) Expect(expr,0) +//////////////////////////////// +//~ rjf: Linked List Building Macros + +//- rjf: linked list macro helpers +#define CheckNil(nil,p) ((p) == 0 || (p) == nil) +#define SetNil(nil,p) ((p) = nil) + +//- rjf: doubly-linked-lists +#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \ +((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\ +CheckNil(nil,p) ? \ +((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\ +((p)==(l)) ? \ +((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\ +(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) +#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev) +#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next) +#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ +((n) == (l) ? (l) = (l)->prev : (0)),\ +(CheckNil(nil,(n)->prev) ? (0) :\ +((n)->prev->next = (n)->next)),\ +(CheckNil(nil,(n)->next) ? (0) :\ +((n)->next->prev = (n)->prev))) + +//- rjf: singly-linked, doubly-headed lists (queues) +#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ +((f)=(l)=(n),SetNil(nil,(n)->next)):\ +((l)->next=(n),(l)=(n),SetNil(nil,(n)->next))) +#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ +((f)=(l)=(n),SetNil(nil,(n)->next)):\ +((n)->next=(f),(f)=(n))) +#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ +(SetNil(nil,f),SetNil(nil,l)):\ +((f)=(f)->next)) + +//- rjf: singly-linked, singly-headed lists (stacks) +#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) +#define SLLStackPop_N(f,next) ((f)=(f)->next) + +//- rjf: doubly-linked-list helpers +#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev) +#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev) +#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev) +#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev) +#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev) +#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev) + +//- rjf: singly-linked, doubly-headed list helpers +#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next) +#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next) +#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next) +#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next) +#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next) +#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next) + +//- rjf: singly-linked, singly-headed list helpers +#define SLLStackPush(f,n) SLLStackPush_N(f,n,next) +#define SLLStackPop(f) SLLStackPop_N(f,next) + +//////////////////////////////// +//~ rjf: Address Sanitizer Markup + +#if COMPILER_MSVC +# if defined(__SANITIZE_ADDRESS__) +# define ASAN_ENABLED 1 +# define NO_ASAN __declspec(no_sanitize_address) +# else +# define NO_ASAN +# endif +#elif COMPILER_CLANG +# if defined(__has_feature) +# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) +# define ASAN_ENABLED 1 +# endif +# endif +# define NO_ASAN __attribute__((no_sanitize("address"))) +#else +# error "NO_ASAN is not defined for this compiler." +#endif + +#if ASAN_ENABLED +#pragma comment(lib, "clang_rt.asan-x86_64.lib") +C_LINKAGE void __asan_poison_memory_region(void const volatile *addr, size_t size); +C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t size); +# define AsanPoisonMemoryRegion(addr, size) __asan_poison_memory_region((addr), (size)) +# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size)) +#else +# define AsanPoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) +# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) +#endif //////////////////////////////// //~ rjf: Misc. Helper Macros -#define ArrayCount(a) (sizeof(a) / sizeof((a)[0])) - -#define Stmnt(S) do{ S }while(0) - #define Stringify_(S) #S #define Stringify(S) Stringify_(S) #define Glue_(A,B) A##B #define Glue(A,B) Glue_(A,B) -#define Min(A,B) ( ((A)<(B))?(A):(B) ) -#define Max(A,B) ( ((A)>(B))?(A):(B) ) - -#define ClampTop(A,X) Min(A,X) -#define ClampBot(X,B) Max(X,B) -#define Clamp(A,X,B) ( ((X)<(A))?(A):((X)>(B))?(B):(X) ) - -#define PtrClampTop(A,X) ClampTop(A,X) -#define PtrClampBot(X,B) ClampBot(X,B) -#define PtrClamp(A,X,B) Clamp(A,X,B) +#define ArrayCount(a) (sizeof(a) / sizeof((a)[0])) #define CeilIntegerDiv(a,b) (((a) + (b) - 1)/(b)) -#define Swap(T,a,b) Stmnt( T t__ = a; a = b; b = t__; ) +#define Swap(T,a,b) do{T t__ = a; a = b; b = t__;}while(0) #if ARCH_64BIT # define IntFromPtr(ptr) ((U64)(ptr)) #elif ARCH_32BIT # define IntFromPtr(ptr) ((U32)(ptr)) #else -# error missing ptr cast for this architecture +# error Missing pointer-to-integer cast for this architecture. #endif - #define PtrFromInt(i) (void*)((U8*)0 + (i)) -#define Member(T,m) (((T*)0)->m) -#define OffsetOf(T,m) IntFromPtr(&Member(T,m)) -#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off))) -#define CastFromMember(T,m,ptr) (T*)(((U8*)ptr) - OffsetOf(T,m)) - #define Compose64Bit(a,b) ((((U64)a) << 32) | ((U64)b)); #define AlignPow2(x,b) (((x) + (b) - 1)&(~((b) - 1))) #define AlignDownPow2(x,b) ((x)&(~((b) - 1))) @@ -157,11 +308,7 @@ #define IsPow2(x) ((x)!=0 && ((x)&((x)-1))==0) #define IsPow2OrZero(x) ((((x) - 1)&(x)) == 0) -#define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end)) -#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end)) - -#define EachEnumVal(type, it) type it = (type)0; it < type##_COUNT; it = (type)(it+1) -#define EachNonZeroEnumVal(type, it) type it = (type)1; it < type##_COUNT; it = (type)(it+1) +#define ExtractBit(word, idx) (((word) >> (idx)) & 1) #if LANG_CPP # define zero_struct {} @@ -175,66 +322,6 @@ # define this_function_name __func__ #endif -#if LANG_CPP -# define C_LINKAGE_BEGIN extern "C"{ -# define C_LINKAGE_END } -# define C_LINKAGE extern "C" -#else -# define C_LINKAGE_BEGIN -# define C_LINKAGE_END -# define C_LINKAGE -#endif - -#if COMPILER_MSVC -# define thread_static __declspec(thread) -#elif COMPILER_CLANG || COMPILER_GCC -# define thread_static __thread -#endif - -#if OS_WINDOWS -# define shared_function C_LINKAGE __declspec(dllexport) -#else -# define shared_function C_LINKAGE -#endif - -//////////////////////////////// -//~ ASAN - -#if COMPILER_MSVC -# if defined(__SANITIZE_ADDRESS__) -# define ASAN_ENABLED 1 -# define NO_ASAN __declspec(no_sanitize_address) -# else -# define NO_ASAN -# endif -#elif COMPILER_CLANG -# if defined(__has_feature) -# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) -# define ASAN_ENABLED 1 -# endif -# endif -# define NO_ASAN __attribute__((no_sanitize("address"))) -#else -# error "NO_ASAN is not defined" -#endif - -#if ASAN_ENABLED - -#pragma comment(lib, "clang_rt.asan-x86_64.lib") - -C_LINKAGE_BEGIN -void __asan_poison_memory_region(void const volatile *addr, size_t size); -void __asan_unpoison_memory_region(void const volatile *addr, size_t size); -C_LINKAGE_END - -# define AsanPoisonMemoryRegion(addr, size) __asan_poison_memory_region((addr), (size)) -# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size)) -#else -# define AsanPoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) -# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) - -#endif - //////////////////////////////// //~ rjf: Base Types @@ -252,10 +339,7 @@ typedef S32 B32; typedef S64 B64; typedef float F32; typedef double F64; - -//////////////////////////////// -//~ rjf: Large Base Types - +typedef void VoidProc(void); typedef struct U128 U128; struct U128 { @@ -265,8 +349,6 @@ struct U128 //////////////////////////////// //~ rjf: Basic Types & Spaces -typedef void VoidProc(void); - typedef enum Dimension { Dimension_X, @@ -562,11 +644,13 @@ struct DateTime U16 min; // [0,59] U16 hour; // [0,24] U16 day; // [0,30] - union{ + union + { WeekDay week_day; U32 wday; }; - union{ + union + { Month month; U32 mon; }; @@ -594,7 +678,7 @@ struct FileProperties }; //////////////////////////////// -//~ Safe Casts +//~ rjf: Safe Casts internal U16 safe_cast_u16(U32 x); internal U32 safe_cast_u32(U64 x); @@ -622,6 +706,15 @@ internal U16 bswap_u16(U16 x); internal U32 bswap_u32(U32 x); internal U64 bswap_u64(U64 x); +internal U64 count_bits_set16(U16 val); +internal U64 count_bits_set32(U32 val); +internal U64 count_bits_set64(U64 val); + +internal U64 ctz32(U32 val); +internal U64 ctz64(U64 val); +internal U64 clz32(U32 val); +internal U64 clz64(U64 val); + //////////////////////////////// //~ rjf: Enum -> Sign @@ -670,4 +763,4 @@ internal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_dat #define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) #define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) -#endif // BASE_TYPES_H +#endif // BASE_CORE_H diff --git a/src/base/base_inc.c b/src/base/base_inc.c index 7c3e7cca..9e26e544 100644 --- a/src/base/base_inc.c +++ b/src/base/base_inc.c @@ -7,13 +7,11 @@ #undef RADDBG_LAYER_COLOR #define RADDBG_LAYER_COLOR 0.20f, 0.60f, 0.80f -#include "base_types.c" +#include "base_core.c" #include "base_profile.c" #include "base_arena.c" #include "base_math.c" -#include "base_string.c" +#include "base_strings.c" #include "base_thread_context.c" #include "base_command_line.c" -#include "base_arena_dev.c" -#include "base_bits.c" #include "base_markup.c" diff --git a/src/base/base_inc.h b/src/base/base_inc.h index f5ed9a5e..6ecfea56 100644 --- a/src/base/base_inc.h +++ b/src/base/base_inc.h @@ -8,17 +8,14 @@ //~ rjf: Base Includes #include "base_context_cracking.h" -#include "base_types.h" + +#include "base_core.h" #include "base_profile.h" -#include "base_ins.h" -#include "base_linked_lists.h" #include "base_arena.h" #include "base_math.h" -#include "base_string.h" +#include "base_strings.h" #include "base_thread_context.h" #include "base_command_line.h" -#include "base_arena_dev.h" -#include "base_bits.h" #include "base_markup.h" #endif // BASE_INC_H diff --git a/src/base/base_ins.h b/src/base/base_ins.h deleted file mode 100644 index 6908e7cd..00000000 --- a/src/base/base_ins.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_INS_H -#define BASE_INS_H - -//////////////////////////////// -// NOTE(allen): Implementations of Intrinsics - -#if OS_WINDOWS - -# include -# include -# include -# include - -# if ARCH_X64 -# define ins_atomic_u64_eval(x) InterlockedAdd64((volatile __int64 *)(x), 0) -# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) -# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) -# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) -# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((volatile __int64 *)(x), c) -# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) -# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) -# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile __int64 *)(x), (__int64)(c)) -# endif - -#elif OS_LINUX - -# if ARCH_X64 -# define ins_atomic_u64_inc_eval(x) __sync_fetch_and_add((volatile U64 *)(x), 1) -# endif - -#else -// TODO(allen): -#endif - -//////////////////////////////// -// NOTE(allen): Intrinsic Checks - -#if ARCH_X64 - -# if !defined(ins_atomic_u64_inc_eval) -# error missing: ins_atomic_u64_inc_eval -# endif - -#else -# error the intrinsic set for this arch is not developed -#endif - - -#endif //BASE_INS_H diff --git a/src/base/base_linked_lists.h b/src/base/base_linked_lists.h deleted file mode 100644 index 436cedc5..00000000 --- a/src/base/base_linked_lists.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_LINKED_LIST_H -#define BASE_LINKED_LIST_H - -//////////////////////////////// -//~ rjf: Helpers - -#define CheckNil(nil,p) ((p) == 0 || (p) == nil) -#define SetNil(nil,p) ((p) = nil) - -//////////////////////////////// -//~ rjf: Base Macros - -//- rjf: Base Doubly-Linked-List Macros -#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \ -((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\ -CheckNil(nil,p) ? \ -((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\ -((p)==(l)) ? \ -((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\ -(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) -#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev) -#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next) -#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ -((n) == (l) ? (l) = (l)->prev : (0)),\ -(CheckNil(nil,(n)->prev) ? (0) :\ -((n)->prev->next = (n)->next)),\ -(CheckNil(nil,(n)->next) ? (0) :\ -((n)->next->prev = (n)->prev))) - -//- rjf: Base Singly-Linked-List Queue Macros -#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ -((f)=(l)=(n),SetNil(nil,(n)->next)):\ -((l)->next=(n),(l)=(n),SetNil(nil,(n)->next))) -#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ -((f)=(l)=(n),SetNil(nil,(n)->next)):\ -((n)->next=(f),(f)=(n))) -#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ -(SetNil(nil,f),SetNil(nil,l)):\ -((f)=(f)->next)) - -//- rjf: Base Singly-Linked-List Stack Macros -#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) -#define SLLStackPop_N(f,next) ((f)=(f)->next) - -//////////////////////////////// -//~ rjf: Convenience Wrappers - -//- rjf: Doubly-Linked-List Wrappers -#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev) -#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev) -#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev) -#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev) -#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev) -#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev) - -//- rjf: Singly-Linked-List Queue Wrappers -#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next) -#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next) -#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next) -#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next) -#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next) -#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next) - -//- rjf: Singly-Linked-List Stack Wrappers -#define SLLStackPush(f,n) SLLStackPush_N(f,n,next) -#define SLLStackPop(f) SLLStackPop_N(f,next) - -#endif //BASE_LINKED_LIST_H diff --git a/src/base/base_string.c b/src/base/base_strings.c similarity index 100% rename from src/base/base_string.c rename to src/base/base_strings.c diff --git a/src/base/base_string.h b/src/base/base_strings.h similarity index 99% rename from src/base/base_string.h rename to src/base/base_strings.h index 5090f1bb..cfce641e 100644 --- a/src/base/base_string.h +++ b/src/base/base_strings.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef BASE_STRING_H -#define BASE_STRING_H +#ifndef BASE_STRINGS_H +#define BASE_STRINGS_H //////////////////////////////// //~ rjf: Third Party Includes @@ -368,4 +368,4 @@ internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, Stri #define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) #define str8_deserial_read_struct(string, off, ptr) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr)), sizeof(*(ptr))) -#endif // BASE_STRING_H +#endif // BASE_STRINGS_H diff --git a/src/raddbgi_from_dwarf/raddbgi_dwarf.c b/src/raddbgi_from_dwarf/raddbgi_dwarf.c index 06abc03c..a9f43b52 100644 --- a/src/raddbgi_from_dwarf/raddbgi_dwarf.c +++ b/src/raddbgi_from_dwarf/raddbgi_dwarf.c @@ -374,7 +374,7 @@ dwarf_names_from_data(Arena *arena, String8 data){ U8 *augmentation_string = ptr; { U8 *ptr_raw = ptr + augmentation_string_size; - ptr = PtrClampTop(ptr_raw, unit_opl); + ptr = ClampTop(ptr_raw, unit_opl); } // offset size @@ -555,7 +555,7 @@ dwarf_line_from_data(Arena *arena, String8 data){ // header opl U8 *header_opl_raw = ptr + header_length; - U8 *header_opl = PtrClampTop(header_opl_raw, unit_opl); + U8 *header_opl = ClampTop(header_opl_raw, unit_opl); // minimum_instruction_length minimum_instruction_length = MemoryConsume(U8, ptr, header_opl); @@ -662,7 +662,7 @@ dwarf_line_from_data(Arena *arena, String8 data){ // header opl U8 *header_opl_raw = ptr + header_length; - U8 *header_opl = PtrClampTop(header_opl_raw, unit_opl); + U8 *header_opl = ClampTop(header_opl_raw, unit_opl); // minimum_instruction_length minimum_instruction_length = MemoryConsume(U8, ptr, header_opl); diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 7a1d7af8..46717f0a 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -5,8 +5,8 @@ #include "lib_raddbgi_format/raddbgi_format.c" #include "lib_raddbgi_format/raddbgi_format_parse.h" #include "lib_raddbgi_format/raddbgi_format_parse.c" -#include "lib_raddbgi_cons/raddbgi_cons.h" -#include "lib_raddbgi_cons/raddbgi_cons.c" +#include "lib_raddbgi_make/raddbgi_make.h" +#include "lib_raddbgi_make/raddbgi_make.c" int main(int argument_count, char **arguments) { From dd05eaa21e2327f05d15a3b6f79491fbde9e7687 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 25 Feb 2024 14:13:27 -0800 Subject: [PATCH 142/275] sketch out some codebase-wide standard thread entry point boilerplate --- src/base/base_entry_point.c | 37 +++++++++++++++++++++++++++++++++++++ src/base/base_entry_point.h | 10 ++++++++++ src/base/base_inc.c | 1 + src/base/base_inc.h | 1 + 4 files changed, 49 insertions(+) create mode 100644 src/base/base_entry_point.c create mode 100644 src/base/base_entry_point.h diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c new file mode 100644 index 00000000..e94561a8 --- /dev/null +++ b/src/base/base_entry_point.c @@ -0,0 +1,37 @@ +internal void +main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **arguments, U64 arguments_count) +{ +#if PROFILE_TELEMETRY + local_persist U8 tm_data[MB(64)]; + tmLoadLibrary(TM_RELEASE); + tmSetMaxThreadCount(256); + tmInitialize(sizeof(tm_data), (char *)tm_data); +#endif + TCTX tctx; + tctx_init_and_equip(&tctx); + ThreadNameF("[main thread]"); + Temp scratch = scratch_begin(0, 0); + String8List command_line_argument_strings = os_string_list_from_argcv(scratch.arena, (int)arguments_count, arguments); + CmdLine cmdline = cmd_line_from_string_list(scratch.arena, command_line_argument_strings); + B32 capture = cmd_line_has_flag(&cmdline, str8_lit("capture")); + if(capture) + { + ProfBeginCapture(arguments[0]); + } + entry_point(&cmdline); + if(capture) + { + ProfEndCapture(); + } + scratch_end(scratch); + tctx_release(); +} + +internal void +supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params) +{ + TCTX tctx; + tctx_init_and_equip(&tctx); + entry_point(params); + tctx_release(); +} diff --git a/src/base/base_entry_point.h b/src/base/base_entry_point.h new file mode 100644 index 00000000..fd6c0d92 --- /dev/null +++ b/src/base/base_entry_point.h @@ -0,0 +1,10 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_ENTRY_POINT_H +#define BASE_ENTRY_POINT_H + +internal void main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **arguments, U64 arguments_count); +internal void supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params); + +#endif // BASE_ENTRY_POINT_H diff --git a/src/base/base_inc.c b/src/base/base_inc.c index 9e26e544..684cb1f6 100644 --- a/src/base/base_inc.c +++ b/src/base/base_inc.c @@ -15,3 +15,4 @@ #include "base_thread_context.c" #include "base_command_line.c" #include "base_markup.c" +#include "base_entry_point.c" diff --git a/src/base/base_inc.h b/src/base/base_inc.h index 6ecfea56..5757b895 100644 --- a/src/base/base_inc.h +++ b/src/base/base_inc.h @@ -17,5 +17,6 @@ #include "base_thread_context.h" #include "base_command_line.h" #include "base_markup.h" +#include "base_entry_point.h" #endif // BASE_INC_H From 8eb0f90f3ef5de00e9f393ccf856722801404733 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 25 Feb 2024 15:02:05 -0800 Subject: [PATCH 143/275] move to codebase-defined entry point style, with basic command line argument parsing, capture, thread-ctx, and other boilerplate deduplicated in the base layer's entry point definition --- build.bat | 2 +- src/base/base_command_line.c | 1 + src/base/base_command_line.h | 1 + src/base/base_context_cracking.h | 42 ++ src/df/core/df_core.c | 2 +- src/df/gfx/df_gfx.c | 4 +- src/os/core/linux/os_core_linux.c | 2 +- src/os/core/os_core.c | 13 - src/os/core/os_core.h | 19 +- src/os/core/win32/os_core_win32.c | 256 ++++++++- src/raddbg/raddbg.c | 347 ----------- src/raddbg/raddbg.h | 20 - src/raddbg/raddbg_main.cpp | 574 +++++++++++-------- src/raddbgi_dump/raddbgi_dump_main.c | 17 +- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 44 +- 15 files changed, 661 insertions(+), 683 deletions(-) diff --git a/build.bat b/build.bat index ca9a98ac..6579a826 100644 --- a/build.bat +++ b/build.bat @@ -83,7 +83,7 @@ pushd build popd :: --- Get Current Git Commit Id ---------------------------------------------- -for /f %%i in ('call git describe --always --dirty') do set compile=%compile% -DRADDBG_GIT=\"%%i\" +for /f %%i in ('call git describe --always --dirty') do set compile=%compile% -DBUILD_GIT_HASH=\"%%i\" :: --- Build & Run Metaprogram ------------------------------------------------ if "%no_meta%"=="1" echo [skipping metagen] diff --git a/src/base/base_command_line.c b/src/base/base_command_line.c index 2a40b5c8..1bf3312d 100644 --- a/src/base/base_command_line.c +++ b/src/base/base_command_line.c @@ -82,6 +82,7 @@ internal CmdLine cmd_line_from_string_list(Arena *arena, String8List command_line) { CmdLine parsed = {0}; + parsed.exe_name = command_line.first->string; // NOTE(rjf): Set up config option table. { diff --git a/src/base/base_command_line.h b/src/base/base_command_line.h index bfbc35ef..b18fc874 100644 --- a/src/base/base_command_line.h +++ b/src/base/base_command_line.h @@ -29,6 +29,7 @@ struct CmdLineOptList typedef struct CmdLine CmdLine; struct CmdLine { + String8 exe_name; CmdLineOptList options; String8List inputs; U64 option_table_size; diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index e9b2b8cc..f9f1a782 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -142,10 +142,52 @@ # define BUILD_SUPPLEMENTARY_UNIT 0 #endif +#if !defined(BUILD_ENTRY_DEFINING_UNIT) +# define BUILD_ENTRY_DEFINING_UNIT 1 +#endif + #if !defined(BUILD_CONSOLE_INTERFACE) # define BUILD_CONSOLE_INTERFACE 0 #endif +#if !defined(BUILD_VERSION_MAJOR) +# define BUILD_VERSION_MAJOR 0 +#endif + +#if !defined(BUILD_VERSION_MINOR) +# define BUILD_VERSION_MINOR 0 +#endif + +#if !defined(BUILD_VERSION_PATCH) +# define BUILD_VERSION_PATCH 0 +#endif + +#define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) +#if BUILD_DEBUG +# define BUILD_MODE_STRING_LITERAL_APPEND " [Debug]" +#else +# define BUILD_MODE_STRING_LITERAL_APPEND "" +#endif +#if defined(BUILD_GIT_HASH) +# define BUILD_GIT_HASH_STRING_LITERAL_APPEND " [" BUILD_GIT_HASH "]" +#else +# define BUILD_GIT_HASH_STRING_LITERAL_APPEND "" +#endif + +#if !defined(BUILD_TITLE) +# define BUILD_TITLE "Untitled" +#endif + +#if !defined(BUILD_RELEASE_PHASE_STRING_LITERAL) +# define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" +#endif + +#if !defined(BUILD_ISSUES_LINK_STRING_LITERAL) +# define BUILD_ISSUES_LINK_STRING_LITERAL "https://github.com/EpicGames/raddebugger/issues" +#endif + +#define BUILD_TITLE_STRING_LITERAL BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ") - " __DATE__ "" BUILD_GIT_HASH_STRING_LITERAL_APPEND BUILD_MODE_STRING_LITERAL_APPEND + //////////////////////////////// //~ rjf: Zero All Undefined Options diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index fb30d332..f19a43d4 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -8496,7 +8496,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) case DF_CoreCmdKind_RegisterAsJITDebugger: { #if OS_WINDOWS - String8 path_to_debugger_binary = os_get_command_line_arguments().first->string; + String8 path_to_debugger_binary = os_string_from_system_path(scratch.arena, OS_SystemPath_Binary); String8 name8 = str8_lit("Debugger"); String8 data8 = push_str8f(scratch.arena, "%S --jit_pid:%%ld --jit_code:%%ld --jit_addr:0x%%p", path_to_debugger_binary); String16 name16 = str16_from_8(scratch.arena, name8); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index a7a8e9ad..3bd9d716 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -945,7 +945,7 @@ df_window_open(Vec2F32 size, OS_Handle preferred_monitor, DF_CfgSrc cfg_src) window->cfg_src = cfg_src; window->arena = arena_alloc(); { - String8 title = str8_lit_comp(RADDBG_TITLE_STRING_LITERAL); + String8 title = str8_lit_comp(BUILD_TITLE_STRING_LITERAL); window->os = os_window_open(size, title); } window->r = r_window_equip(window->os); @@ -4267,7 +4267,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D UI_CtxMenu(help_menu_key) UI_PrefWidth(ui_em(40.f, 1.f)) { UI_Row UI_TextAlignment(UI_TextAlign_Center) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) - ui_label(str8_lit(RADDBG_TITLE_STRING_LITERAL)); + ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL)); ui_spacer(ui_em(0.25f, 1.f)); UI_Row UI_PrefWidth(ui_text_dim(10, 1)) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index b6730957..f8b07e81 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -813,7 +813,7 @@ lnx_safe_call_sig_handler(int){ //~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) internal void -os_init(int argc, char **argv) +os_init(void) { // NOTE(allen): Initialize linux layer mutex { diff --git a/src/os/core/os_core.c b/src/os/core/os_core.c index db67d314..b3cad911 100644 --- a/src/os/core/os_core.c +++ b/src/os/core/os_core.c @@ -67,19 +67,6 @@ os_string_list_from_argcv(Arena *arena, int argc, char **argv) return result; } -//////////////////////////////// -//~ rjf: Process Helpers (Helper, Implemented Once) - -internal void -os_relaunch_self(void){ - Temp scratch = scratch_begin(0, 0); - OS_LaunchOptions opts = {0}; - opts.cmd_line = os_get_command_line_arguments(); - opts.path = os_string_from_system_path(scratch.arena, OS_SystemPath_Initial); - os_launch_process(&opts, 0); - scratch_end(scratch); -} - //////////////////////////////// //~ rjf: Filesystem Helpers (Helpers, Implemented Once) diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h index a162576a..ea82c9d2 100644 --- a/src/os/core/os_core.h +++ b/src/os/core/os_core.h @@ -165,11 +165,6 @@ internal String8 os_string_from_system_path(Arena *arena, OS_SystemPath path); internal String8List os_string_list_from_argcv(Arena *arena, int argc, char **argv); -//////////////////////////////// -//~ rjf: Process Helpers (Helper, Implemented Once) - -internal void os_relaunch_self(void); - //////////////////////////////// //~ rjf: Filesystem Helpers (Helpers, Implemented Once) @@ -204,7 +199,7 @@ internal void os_condition_variable_broadcast(OS_Handle cv); //////////////////////////////// //~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) -internal void os_init(int argc, char **argv); +internal void os_init(void); //////////////////////////////// //~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) @@ -234,7 +229,6 @@ internal U64 os_logical_core_count(void); //////////////////////////////// //~ rjf: @os_hooks Process & Thread Info (Implemented Per-OS) -internal String8List os_get_command_line_arguments(void); internal S32 os_get_pid(void); internal S32 os_get_tid(void); internal String8List os_get_environment(void); @@ -370,4 +364,15 @@ internal void os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *f internal OS_Guid os_make_guid(void); internal String8 os_string_from_guid(Arena *arena, OS_Guid guid); +//////////////////////////////// +//~ rjf: @os_hooks Entry Points (Implemented Per-OS) + +// NOTE(rjf): The implementation of `os_core` will define low-level entry +// points if BUILD_ENTRY_DEFINING_UNIT is defined to 1. These will call +// into the standard codebase program entry points, named "entry_point". + +#if BUILD_ENTRY_DEFINING_UNIT +internal void entry_point(CmdLine *cmdline); +#endif + #endif // OS_CORE_H diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 49b5c444..8ad5b58f 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -185,7 +185,8 @@ w32_thread_base(void *ptr){ //~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) internal void -os_init(int argc, char **argv){ +os_init(void) +{ // Load Fancy Memory Functions { HMODULE module = LoadLibraryA("kernel32.dll"); @@ -214,9 +215,6 @@ os_init(int argc, char **argv){ // Setup initial path w32_initial_path = os_string_from_system_path(w32_perm_arena, OS_SystemPath_Current); - // Setup command line arguments - w32_cmd_line_args = os_string_list_from_argcv(w32_perm_arena, argc, argv); - // rjf: setup environment variables { CHAR *this_proc_env = GetEnvironmentStrings(); @@ -470,12 +468,6 @@ os_logical_core_count(void) //////////////////////////////// //~ rjf: @os_hooks Process Info (Implemented Per-OS) -internal String8List -os_get_command_line_arguments(void) -{ - return w32_cmd_line_args; -} - internal S32 os_get_pid(void){ DWORD id = GetCurrentProcessId(); @@ -1555,7 +1547,8 @@ os_make_guid(void) OS_Guid result; MemoryZeroStruct(&result); UUID uuid; RPC_STATUS rpc_status = UuidCreate(&uuid); - if (rpc_status == RPC_S_OK) { + if(rpc_status == RPC_S_OK) + { result.data1 = uuid.Data1; result.data2 = uuid.Data2; result.data3 = uuid.Data3; @@ -1564,3 +1557,244 @@ os_make_guid(void) return result; } +//////////////////////////////// +//~ rjf: @os_hooks Entry Points (Implemented Per-OS) + +#include +#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside +#include + +internal B32 win32_g_is_quiet = 0; + +internal HRESULT WINAPI +win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data) +{ + if(msg == TDN_HYPERLINK_CLICKED) + { + ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL); + } + return S_OK; +} + +internal LONG WINAPI +win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) +{ + if(win32_g_is_quiet) + { + ExitProcess(1); + } + + static volatile LONG first = 0; + if(InterlockedCompareExchange(&first, 1, 0) != 0) + { + // prevent failures in other threads to popup same message box + // this handler just shows first thread that crashes + // we are terminating afterwards anyway + for (;;) Sleep(1000); + } + + WCHAR buffer[4096] = {0}; + int buflen = 0; + + DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode; + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code); + + // load dbghelp dynamically just in case if it is missing + HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); + if(dbghelp) + { + DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions); + BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess); + BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, + LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); + PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase); + DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr); + BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol); + BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line); + BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo); + + *(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions"); + *(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW"); + *(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64"); + *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64"); + *(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64"); + *(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW"); + *(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64"); + *(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64"); + + if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64) + { + HANDLE process = GetCurrentProcess(); + HANDLE thread = GetCurrentThread(); + CONTEXT* context = exception_ptrs->ContextRecord; + + dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); + if(dbg_SymInitializeW(process, L"", TRUE)) + { + // check that raddbg.pdb file is good + B32 raddbg_pdb_valid = 0; + { + IMAGEHLP_MODULEW64 module = {0}; + module.SizeOfStruct = sizeof(module); + if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module)) + { + raddbg_pdb_valid = (module.SymType == SymPdb); + } + } + + if(!raddbg_pdb_valid) + { + buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, + L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get call stack.\n"); + } + else + { + STACKFRAME64 frame = {0}; + DWORD image_type; +#if defined(_M_AMD64) + image_type = IMAGE_FILE_MACHINE_AMD64; + frame.AddrPC.Offset = context->Rip; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context->Rbp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context->Rsp; + frame.AddrStack.Mode = AddrModeFlat; +#elif defined(_M_ARM64) + image_type = IMAGE_FILE_MACHINE_ARM64; + frame.AddrPC.Offset = context->Pc; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context->Fp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context->Sp; + frame.AddrStack.Mode = AddrModeFlat; +#else +# error Architecture not supported! +#endif + + for(U32 idx=0; ;idx++) + { + const U32 max_frames = 32; + if(idx == max_frames) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"..."); + break; + } + + if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) + { + break; + } + + U64 address = frame.AddrPC.Offset; + if(address == 0) + { + break; + } + + if(idx==0) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, + L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue in\n" + L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", idx + 1, address); + + struct { + SYMBOL_INFOW info; + WCHAR name[MAX_SYM_NAME]; + } symbol = {0}; + + symbol.info.SizeOfStruct = sizeof(symbol.info); + symbol.info.MaxNameLen = MAX_SYM_NAME; + + DWORD64 displacement = 0; + if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement); + + IMAGEHLP_LINEW64 line = {0}; + line.SizeOfStruct = sizeof(line); + + DWORD line_displacement = 0; + if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber); + } + } + else + { + IMAGEHLP_MODULEW64 module = {0}; + module.SizeOfStruct = sizeof(module); + if(dbg_SymGetModuleInfoW64(process, address, &module)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s", module.ModuleName); + } + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\n"); + } + } + } + } + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); + + TASKDIALOGCONFIG dialog = {0}; + dialog.cbSize = sizeof(dialog); + dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; + dialog.pszMainIcon = TD_ERROR_ICON; + dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON; + dialog.pszWindowTitle = L"Fatal Exception"; + dialog.pszContent = buffer; + dialog.pfCallback = &win32_dialog_callback; + TaskDialogIndirect(&dialog, 0, 0, 0); + + ExitProcess(1); +} + +#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside +#define OS_WINDOWS 1 + +#if BUILD_CONSOLE_INTERFACE +int main(int argc, char **argv) +{ + SetUnhandledExceptionFilter(&win32_exception_filter); + for(int i = 0; i < argc; i += 1) + { + String8 arg8 = str8_cstring(argv[i]); + if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive)) + { + win32_g_is_quiet = 1; + } + } + main_thread_base_entry_point(entry_point, argv, (U64)argc); + return 0; +} +#else +int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) +{ + SetUnhandledExceptionFilter(&win32_exception_filter); + Arena *args_arena = arena_alloc__sized(KB(64), KB(64)); + WCHAR *command_line = GetCommandLineW(); + int argc = 0; + WCHAR **argv_16 = CommandLineToArgvW(command_line, &argc); + char **argv = push_array(args_arena, char *, argc); + for(int i = 0; i < argc; i += 1) + { + String16 arg16 = str16_cstring((U16 *)argv_16[i]); + String8 arg8 = str8_from_16(args_arena, arg16); + if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive)) + { + win32_g_is_quiet = 1; + } + argv[i] = (char *)arg8.str; + } + main_thread_base_entry_point(entry_point, argv, (U64)argc); + return 0; +} +#endif diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 067e5dd7..87425b6b 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -332,350 +332,3 @@ internal CTRL_WAKEUP_FUNCTION_DEF(wakeup_hook) { os_send_wakeup_event(); } - -internal void -entry_point(int argc, char **argv) -{ - Temp scratch = scratch_begin(0, 0); -#if PROFILE_TELEMETRY - local_persist U8 tm_data[MB(64)]; - tmLoadLibrary(TM_RELEASE); - tmSetMaxThreadCount(1024); - tmInitialize(sizeof(tm_data), (char *)tm_data); -#endif - ThreadNameF("[main]"); - - //- rjf: initialize basic dependencies - os_init(argc, argv); - ts_init(); - - //- rjf: parse command line arguments - CmdLine cmdln = cmd_line_from_string_list(scratch.arena, os_get_command_line_arguments()); - ExecMode exec_mode = ExecMode_Normal; - String8 user_cfg_path = str8_lit(""); - String8 profile_cfg_path = str8_lit(""); - B32 capture = 0; - B32 auto_run = 0; - B32 auto_step = 0; - B32 jit_attach = 0; - U64 jit_pid = 0; - U64 jit_code = 0; - U64 jit_addr = 0; - { - if(cmd_line_has_flag(&cmdln, str8_lit("ipc"))) - { - exec_mode = ExecMode_IPCSender; - } - else if(cmd_line_has_flag(&cmdln, str8_lit("convert"))) - { - exec_mode = ExecMode_Converter; - } - else if(cmd_line_has_flag(&cmdln, str8_lit("?")) || - cmd_line_has_flag(&cmdln, str8_lit("help"))) - { - exec_mode = ExecMode_Help; - } - user_cfg_path = cmd_line_string(&cmdln, str8_lit("user")); - profile_cfg_path = cmd_line_string(&cmdln, str8_lit("profile")); - capture = cmd_line_has_flag(&cmdln, str8_lit("capture")); - auto_run = cmd_line_has_flag(&cmdln, str8_lit("auto_run")); - auto_step = cmd_line_has_flag(&cmdln, str8_lit("auto_step")); - String8 jit_pid_string = {0}; - String8 jit_code_string = {0}; - String8 jit_addr_string = {0}; - jit_pid_string = cmd_line_string(&cmdln, str8_lit("jit_pid")); - jit_code_string = cmd_line_string(&cmdln, str8_lit("jit_code")); - jit_addr_string = cmd_line_string(&cmdln, str8_lit("jit_addr")); - try_u64_from_str8_c_rules(jit_pid_string, &jit_pid); - try_u64_from_str8_c_rules(jit_code_string, &jit_code); - try_u64_from_str8_c_rules(jit_addr_string, &jit_addr); - jit_attach = (jit_addr != 0); - } - - //- rjf: auto-start capture - if(capture) - { - ProfBeginCapture("raddbg"); - } - - //- rjf: set default user/profile paths - { - String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); - String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); - os_make_directory(user_data_folder); - if(user_cfg_path.size == 0) - { - user_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); - } - if(profile_cfg_path.size == 0) - { - profile_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_profile", user_data_folder); - } - } - - //- rjf: dispatch to top-level codepath based on execution mode - switch(exec_mode) - { - //- rjf: normal execution - default: - case ExecMode_Normal: - { - //- rjf: set up shared memory for ipc - OS_Handle ipc_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_shared_memory_name); - void *ipc_shared_memory_base = os_shared_memory_view_open(ipc_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); - OS_Handle ipc_semaphore = os_semaphore_alloc(1, 1, ipc_semaphore_name); - IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; - ipc_info->msg_size = 0; - - //- rjf: initialize stuff we depend on - { - hs_init(); - fs_init(); - txt_init(); - dbgi_init(); - txti_init(); - demon_init(); - ctrl_init(wakeup_hook); - dasm_init(); - os_graphical_init(); - fp_init(); - r_init(&cmdln); - tex_init(); - geo_init(); - f_init(); - DF_StateDeltaHistory *hist = df_state_delta_history_alloc(); - df_core_init(user_cfg_path, profile_cfg_path, hist); - df_gfx_init(update_and_render, hist); - os_set_cursor(OS_Cursor_Pointer); - } - - //- rjf: setup initial target from command line args - { - String8List args = cmdln.inputs; - if(args.node_count > 0 && args.first->string.size != 0) - { - Temp scratch = scratch_begin(0, 0); - DF_Entity *target = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Target); - df_entity_equip_b32(target, 1); - df_entity_equip_cfg_src(target, DF_CfgSrc_CommandLine); - String8List passthrough_args_list = {0}; - for(String8Node *n = args.first->next; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &passthrough_args_list, n->string); - } - - // rjf: equip exe - if(args.first->string.size != 0) - { - DF_Entity *exe = df_entity_alloc(0, target, DF_EntityKind_Executable); - df_entity_equip_name(0, exe, args.first->string); - } - - // rjf: equip path - String8 path_part_of_arg = str8_chop_last_slash(args.first->string); - if(path_part_of_arg.size != 0) - { - String8 path = push_str8f(scratch.arena, "%S/", path_part_of_arg); - DF_Entity *execution_path = df_entity_alloc(0, target, DF_EntityKind_ExecutionPath); - df_entity_equip_name(0, execution_path, path); - } - - // rjf: equip args - StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; - String8 args_str = str8_list_join(scratch.arena, &passthrough_args_list, &join); - if(args_str.size != 0) - { - DF_Entity *args_entity = df_entity_alloc(0, target, DF_EntityKind_Arguments); - df_entity_equip_name(0, args_entity, args_str); - } - scratch_end(scratch); - } - } - - //- rjf: main application loop - { - for(;;) - { - //- rjf: get IPC messages & dispatch ui commands from them - { - if(os_semaphore_take(ipc_semaphore, max_U64)) - { - if(ipc_info->msg_size != 0) - { - U8 *buffer = (U8 *)(ipc_info+1); - U64 msg_size = ipc_info->msg_size; - String8 cmd_string = str8(buffer, msg_size); - ipc_info->msg_size = 0; - DF_Window *dst_window = df_gfx_state->first_window; - for(DF_Window *window = dst_window; window != 0; window = window->next) - { - if(os_window_is_focused(window->os)) - { - dst_window = window; - break; - } - } - if(dst_window != 0) - { - Temp scratch = scratch_begin(0, 0); - String8 cmd_spec_string = df_cmd_name_part_from_string(cmd_string); - DF_CmdSpec *cmd_spec = df_cmd_spec_from_string(cmd_spec_string); - if(!df_cmd_spec_is_nil(cmd_spec)) - { - DF_CmdParams params = df_cmd_params_from_gfx(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(dst_window); - String8 error = df_cmd_params_apply_spec_query(scratch.arena, &ctrl_ctx, ¶ms, cmd_spec, df_cmd_arg_part_from_string(cmd_string)); - if(error.size == 0) - { - df_push_cmd__root(¶ms, cmd_spec); - } - else - { - DF_CmdParams params = df_cmd_params_from_window(dst_window); - params.string = error; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - } - scratch_end(scratch); - } - } - os_semaphore_drop(ipc_semaphore); - } - } - - //- rjf: update & render frame - OS_Handle repaint_window = {0}; - update_and_render(repaint_window, 0); - - //- rjf: auto run - if(auto_run) - { - auto_run = 0; - DF_CmdParams params = df_cmd_params_from_gfx(); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); - } - - //- rjf: auto step - if(auto_step) - { - auto_step = 0; - DF_CmdParams params = df_cmd_params_from_gfx(); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_StepInto)); - } - - //- rjf: jit attach - if(jit_attach) - { - jit_attach = 0; - DF_CmdParams params = df_cmd_params_from_gfx(); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_ID); - params.id = jit_pid; - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Attach)); - } - - //- rjf: quit if no windows are left - if(df_gfx_state->first_window == 0) - { - break; - } - } - } - - }break; - - //- rjf: inter-process communication message sender - case ExecMode_IPCSender: - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: grab ipc shared memory - OS_Handle ipc_shared_memory = os_shared_memory_open(ipc_shared_memory_name); - void *ipc_shared_memory_base = os_shared_memory_view_open(ipc_shared_memory, r1u64(0, MB(16))); - if(ipc_shared_memory_base != 0) - { - OS_Handle ipc_semaphore = os_semaphore_open(ipc_semaphore_name); - IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; - if(os_semaphore_take(ipc_semaphore, os_now_microseconds() + Million(6))) - { - U8 *buffer = (U8 *)(ipc_info+1); - U64 buffer_max = IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo); - StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; - String8 msg = str8_list_join(scratch.arena, &cmdln.inputs, &join); - ipc_info->msg_size = Min(buffer_max, msg.size); - MemoryCopy(buffer, msg.str, ipc_info->msg_size); - os_semaphore_drop(ipc_semaphore); - } - } - - scratch_end(scratch); - }break; - - //- rjf: built-in pdb/dwarf -> raddbg converter mode - case ExecMode_Converter: - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: parse arguments - P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(scratch.arena, &cmdln); - - //- rjf: open output file - String8 output_name = push_str8_copy(scratch.arena, user2convert->output_name); - OS_Handle out_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, output_name); - B32 out_file_is_good = !os_handle_match(out_file, os_handle_zero()); - - //- rjf: convert - P2R_Convert2Bake *convert2bake = 0; - if(out_file_is_good) - { - convert2bake = p2r_convert(scratch.arena, user2convert); - } - - //- rjf: bake - P2R_Bake2Serialize *bake2srlz = 0; - ProfScope("bake") - { - bake2srlz = p2r_bake(scratch.arena, convert2bake); - } - - //- rjf: serialize - String8List serialize_out = rdim_serialized_strings_from_params_bake_section_list(scratch.arena, &convert2bake->bake_params, &bake2srlz->sections); - - //- rjf: write - if(out_file_is_good) - { - U64 off = 0; - for(String8Node *n = serialize_out.first; n != 0; n = n->next) - { - os_file_write(out_file, r1u64(off, off+n->string.size), n->string.str); - off += n->string.size; - } - } - - //- rjf: close output file - os_file_close(out_file); - - scratch_end(scratch); - }break; - - //- rjf: help message box - case ExecMode_Help: - { - os_graphical_message(0, - str8_lit("The RAD Debugger - Help"), - str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n" - "--user:\n" - "Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n" - "--profile:\n" - "Use to specify the location of a profile file which should be used. Profile files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as profile-related changes are made.\n\n" - "--auto_step\n" - "This will step into all targets after the debugger initially starts.\n\n" - "--auto_run\n" - "This will run all targets after the debugger initially starts.\n\n" - "--ipc \n" - "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n")); - }break; - } - - scratch_end(scratch); -} diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 0f72cb57..19377d0b 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -400,26 +400,6 @@ #ifndef RADDBG_H #define RADDBG_H -//////////////////////////////// -//~ rjf: Build Settings - -#define RADDBG_VERSION_MAJOR 0 -#define RADDBG_VERSION_MINOR 9 -#define RADDBG_VERSION_PATCH 8 -#define RADDBG_VERSION_STRING_LITERAL Stringify(RADDBG_VERSION_MAJOR) "." Stringify(RADDBG_VERSION_MINOR) "." Stringify(RADDBG_VERSION_PATCH) -#if BUILD_DEBUG -# define RADDBG_BUILD_STR " [Debug]" -#else -# define RADDBG_BUILD_STR "" -#endif -#if defined(RADDBG_GIT) -# define RADDBG_GIT_STR " [" RADDBG_GIT "]" -#else -# define RADDBG_GIT_STR "" -#endif -#define RADDBG_TITLE_STRING_LITERAL "The RAD Debugger (" RADDBG_VERSION_STRING_LITERAL " ALPHA) - " __DATE__ "" RADDBG_GIT_STR RADDBG_BUILD_STR -#define RADDBG_GITHUB_ISSUES "https://github.com/EpicGames/raddebugger/issues" - //////////////////////////////// //~ rjf: Top-Level Execution Types diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index fef04980..07f049da 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -2,8 +2,13 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: Build Settings +//~ rjf: Build Options +#define BUILD_VERSION_MAJOR 0 +#define BUILD_VERSION_MINOR 9 +#define BUILD_VERSION_PATCH 8 +#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" +#define BUILD_TITLE "The RAD Debugger" #define OS_FEATURE_GRAPHICAL 1 //////////////////////////////// @@ -92,213 +97,15 @@ #include "raddbg.c" //////////////////////////////// -//~ rjf: Low-Level Entry Points +//~ rjf: Entry Point -//- rjf: windows +internal void +entry_point(CmdLine *cmd_line) +{ + Temp scratch = scratch_begin(0, 0); + + //- rjf: windows -> turn off output handles, as we need to control those for target processes #if OS_WINDOWS - -#include - -#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside -#include - -internal B32 g_is_quiet = 0; - -internal HRESULT WINAPI -win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data) -{ - if(msg == TDN_HYPERLINK_CLICKED) - { - ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL); - } - return S_OK; -} - -internal LONG WINAPI -win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) -{ - if(g_is_quiet) - { - ExitProcess(1); - } - - static volatile LONG first = 0; - if(InterlockedCompareExchange(&first, 1, 0) != 0) - { - // prevent failures in other threads to popup same message box - // this handler just shows first thread that crashes - // we are terminating afterwards anyway - for (;;) Sleep(1000); - } - - WCHAR buffer[4096] = {0}; - int buflen = 0; - - DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode; - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code); - - // load dbghelp dynamically just in case if it is missing - HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); - if(dbghelp) - { - DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions); - BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess); - BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, - LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, - PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, - PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); - PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase); - DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr); - BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol); - BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line); - BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo); - - *(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions"); - *(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW"); - *(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64"); - *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64"); - *(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64"); - *(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW"); - *(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64"); - *(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64"); - - if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64) - { - HANDLE process = GetCurrentProcess(); - HANDLE thread = GetCurrentThread(); - CONTEXT* context = exception_ptrs->ContextRecord; - - dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); - if(dbg_SymInitializeW(process, L"", TRUE)) - { - // check that raddbg.pdb file is good - B32 raddbg_pdb_valid = 0; - { - IMAGEHLP_MODULEW64 module = {0}; - module.SizeOfStruct = sizeof(module); - if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module)) - { - raddbg_pdb_valid = (module.SymType == SymPdb); - } - } - - if(!raddbg_pdb_valid) - { - buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, - L"\nraddbg.pdb debug file is not valid or not found. Please rebuild binary to get call stack.\n"); - } - else - { - STACKFRAME64 frame = {0}; - DWORD image_type; -#if defined(_M_AMD64) - image_type = IMAGE_FILE_MACHINE_AMD64; - frame.AddrPC.Offset = context->Rip; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Rbp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Rsp; - frame.AddrStack.Mode = AddrModeFlat; -#elif defined(_M_ARM64) - image_type = IMAGE_FILE_MACHINE_ARM64; - frame.AddrPC.Offset = context->Pc; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Fp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Sp; - frame.AddrStack.Mode = AddrModeFlat; -#else -# error Architecture not supported! -#endif - - for(U32 idx=0; ;idx++) - { - const U32 max_frames = 32; - if(idx == max_frames) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"..."); - break; - } - - if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) - { - break; - } - - U64 address = frame.AddrPC.Offset; - if(address == 0) - { - break; - } - - if(idx==0) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, - L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue in\n" - L"%S\n\n", RADDBG_GITHUB_ISSUES, RADDBG_GITHUB_ISSUES); - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", idx + 1, address); - - struct { - SYMBOL_INFOW info; - WCHAR name[MAX_SYM_NAME]; - } symbol = {0}; - - symbol.info.SizeOfStruct = sizeof(symbol.info); - symbol.info.MaxNameLen = MAX_SYM_NAME; - - DWORD64 displacement = 0; - if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement); - - IMAGEHLP_LINEW64 line = {0}; - line.SizeOfStruct = sizeof(line); - - DWORD line_displacement = 0; - if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber); - } - } - else - { - IMAGEHLP_MODULEW64 module = {0}; - module.SizeOfStruct = sizeof(module); - if(dbg_SymGetModuleInfoW64(process, address, &module)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s", module.ModuleName); - } - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\n"); - } - } - } - } - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", RADDBG_VERSION_STRING_LITERAL, RADDBG_GIT_STR); - - TASKDIALOGCONFIG dialog = {0}; - dialog.cbSize = sizeof(dialog); - dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; - dialog.pszMainIcon = TD_ERROR_ICON; - dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON; - dialog.pszWindowTitle = L"Fatal Exception"; - dialog.pszContent = buffer; - dialog.pfCallback = &win32_dialog_callback; - TaskDialogIndirect(&dialog, 0, 0, 0); - - ExitProcess(1); -} - -int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) -{ - SetUnhandledExceptionFilter(&win32_exception_filter); - HANDLE output_handles[3] = { GetStdHandle(STD_INPUT_HANDLE), @@ -331,36 +138,327 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n SetStdHandle(STD_INPUT_HANDLE, 0); SetStdHandle(STD_OUTPUT_HANDLE, 0); SetStdHandle(STD_ERROR_HANDLE, 0); - static TCTX main_thread_tctx = {0}; - tctx_init_and_equip(&main_thread_tctx); - Arena *perm_arena = arena_alloc(); - WCHAR *command_line = GetCommandLineW(); - int argc; - WCHAR **argv_16 = CommandLineToArgvW(command_line, &argc); - char **argv = push_array(perm_arena, char *, argc); - for(int i = 0; i < argc; i += 1) - { - String16 arg16 = str16_cstring((U16 *)argv_16[i]); - String8 arg8 = str8_from_16(perm_arena, arg16); - if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive)) - { - g_is_quiet = 1; - } - argv[i] = (char *)arg8.str; - } - entry_point(argc, argv); - return 0; -} - -//- rjf: linux -#elif OS_LINUX - -int main(int argument_count, char **arguments) -{ - static TCTX main_thread_tctx = {0}; - tctx_init_and_equip(&main_thread_tctx); - entry_point(argument_count, arguments); - return 0; -} - #endif + + //- rjf: initialize basic dependencies + os_init(); + ts_init(); + + //- rjf: unpack command line arguments + ExecMode exec_mode = ExecMode_Normal; + String8 user_cfg_path = str8_lit(""); + String8 profile_cfg_path = str8_lit(""); + B32 auto_run = 0; + B32 auto_step = 0; + B32 jit_attach = 0; + U64 jit_pid = 0; + U64 jit_code = 0; + U64 jit_addr = 0; + { + if(cmd_line_has_flag(cmd_line, str8_lit("ipc"))) + { + exec_mode = ExecMode_IPCSender; + } + else if(cmd_line_has_flag(cmd_line, str8_lit("convert"))) + { + exec_mode = ExecMode_Converter; + } + else if(cmd_line_has_flag(cmd_line, str8_lit("?")) || + cmd_line_has_flag(cmd_line, str8_lit("help"))) + { + exec_mode = ExecMode_Help; + } + user_cfg_path = cmd_line_string(cmd_line, str8_lit("user")); + profile_cfg_path = cmd_line_string(cmd_line, str8_lit("profile")); + auto_run = cmd_line_has_flag(cmd_line, str8_lit("auto_run")); + auto_step = cmd_line_has_flag(cmd_line, str8_lit("auto_step")); + String8 jit_pid_string = cmd_line_string(cmd_line, str8_lit("jit_pid")); + String8 jit_code_string = cmd_line_string(cmd_line, str8_lit("jit_code")); + String8 jit_addr_string = cmd_line_string(cmd_line, str8_lit("jit_addr")); + try_u64_from_str8_c_rules(jit_pid_string, &jit_pid); + try_u64_from_str8_c_rules(jit_code_string, &jit_code); + try_u64_from_str8_c_rules(jit_addr_string, &jit_addr); + jit_attach = (jit_addr != 0); + } + + //- rjf: set default user/profile paths + { + String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); + String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); + os_make_directory(user_data_folder); + if(user_cfg_path.size == 0) + { + user_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); + } + if(profile_cfg_path.size == 0) + { + profile_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_profile", user_data_folder); + } + } + + //- rjf: dispatch to top-level codepath based on execution mode + switch(exec_mode) + { + //- rjf: normal execution + default: + case ExecMode_Normal: + { + //- rjf: set up shared memory for ipc + OS_Handle ipc_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_shared_memory_name); + void *ipc_shared_memory_base = os_shared_memory_view_open(ipc_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); + OS_Handle ipc_semaphore = os_semaphore_alloc(1, 1, ipc_semaphore_name); + IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; + ipc_info->msg_size = 0; + + //- rjf: initialize stuff we depend on + { + hs_init(); + fs_init(); + txt_init(); + dbgi_init(); + txti_init(); + demon_init(); + ctrl_init(wakeup_hook); + dasm_init(); + os_graphical_init(); + fp_init(); + r_init(cmd_line); + tex_init(); + geo_init(); + f_init(); + DF_StateDeltaHistory *hist = df_state_delta_history_alloc(); + df_core_init(user_cfg_path, profile_cfg_path, hist); + df_gfx_init(update_and_render, hist); + os_set_cursor(OS_Cursor_Pointer); + } + + //- rjf: setup initial target from command line args + { + String8List args = cmd_line->inputs; + if(args.node_count > 0 && args.first->string.size != 0) + { + Temp scratch = scratch_begin(0, 0); + DF_Entity *target = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Target); + df_entity_equip_b32(target, 1); + df_entity_equip_cfg_src(target, DF_CfgSrc_CommandLine); + String8List passthrough_args_list = {0}; + for(String8Node *n = args.first->next; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &passthrough_args_list, n->string); + } + + // rjf: equip exe + if(args.first->string.size != 0) + { + DF_Entity *exe = df_entity_alloc(0, target, DF_EntityKind_Executable); + df_entity_equip_name(0, exe, args.first->string); + } + + // rjf: equip path + String8 path_part_of_arg = str8_chop_last_slash(args.first->string); + if(path_part_of_arg.size != 0) + { + String8 path = push_str8f(scratch.arena, "%S/", path_part_of_arg); + DF_Entity *execution_path = df_entity_alloc(0, target, DF_EntityKind_ExecutionPath); + df_entity_equip_name(0, execution_path, path); + } + + // rjf: equip args + StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; + String8 args_str = str8_list_join(scratch.arena, &passthrough_args_list, &join); + if(args_str.size != 0) + { + DF_Entity *args_entity = df_entity_alloc(0, target, DF_EntityKind_Arguments); + df_entity_equip_name(0, args_entity, args_str); + } + scratch_end(scratch); + } + } + + //- rjf: main application loop + { + for(;;) + { + //- rjf: get IPC messages & dispatch ui commands from them + { + if(os_semaphore_take(ipc_semaphore, max_U64)) + { + if(ipc_info->msg_size != 0) + { + U8 *buffer = (U8 *)(ipc_info+1); + U64 msg_size = ipc_info->msg_size; + String8 cmd_string = str8(buffer, msg_size); + ipc_info->msg_size = 0; + DF_Window *dst_window = df_gfx_state->first_window; + for(DF_Window *window = dst_window; window != 0; window = window->next) + { + if(os_window_is_focused(window->os)) + { + dst_window = window; + break; + } + } + if(dst_window != 0) + { + Temp scratch = scratch_begin(0, 0); + String8 cmd_spec_string = df_cmd_name_part_from_string(cmd_string); + DF_CmdSpec *cmd_spec = df_cmd_spec_from_string(cmd_spec_string); + if(!df_cmd_spec_is_nil(cmd_spec)) + { + DF_CmdParams params = df_cmd_params_from_gfx(); + DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(dst_window); + String8 error = df_cmd_params_apply_spec_query(scratch.arena, &ctrl_ctx, ¶ms, cmd_spec, df_cmd_arg_part_from_string(cmd_string)); + if(error.size == 0) + { + df_push_cmd__root(¶ms, cmd_spec); + } + else + { + DF_CmdParams params = df_cmd_params_from_window(dst_window); + params.string = error; + df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); + } + } + scratch_end(scratch); + } + } + os_semaphore_drop(ipc_semaphore); + } + } + + //- rjf: update & render frame + OS_Handle repaint_window = {0}; + update_and_render(repaint_window, 0); + + //- rjf: auto run + if(auto_run) + { + auto_run = 0; + DF_CmdParams params = df_cmd_params_from_gfx(); + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); + } + + //- rjf: auto step + if(auto_step) + { + auto_step = 0; + DF_CmdParams params = df_cmd_params_from_gfx(); + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_StepInto)); + } + + //- rjf: jit attach + if(jit_attach) + { + jit_attach = 0; + DF_CmdParams params = df_cmd_params_from_gfx(); + df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_ID); + params.id = jit_pid; + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Attach)); + } + + //- rjf: quit if no windows are left + if(df_gfx_state->first_window == 0) + { + break; + } + } + } + + }break; + + //- rjf: inter-process communication message sender + case ExecMode_IPCSender: + { + Temp scratch = scratch_begin(0, 0); + + //- rjf: grab ipc shared memory + OS_Handle ipc_shared_memory = os_shared_memory_open(ipc_shared_memory_name); + void *ipc_shared_memory_base = os_shared_memory_view_open(ipc_shared_memory, r1u64(0, MB(16))); + if(ipc_shared_memory_base != 0) + { + OS_Handle ipc_semaphore = os_semaphore_open(ipc_semaphore_name); + IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; + if(os_semaphore_take(ipc_semaphore, os_now_microseconds() + Million(6))) + { + U8 *buffer = (U8 *)(ipc_info+1); + U64 buffer_max = IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo); + StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; + String8 msg = str8_list_join(scratch.arena, &cmd_line->inputs, &join); + ipc_info->msg_size = Min(buffer_max, msg.size); + MemoryCopy(buffer, msg.str, ipc_info->msg_size); + os_semaphore_drop(ipc_semaphore); + } + } + + scratch_end(scratch); + }break; + + //- rjf: built-in pdb/dwarf -> raddbg converter mode + case ExecMode_Converter: + { + Temp scratch = scratch_begin(0, 0); + + //- rjf: parse arguments + P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(scratch.arena, cmd_line); + + //- rjf: open output file + String8 output_name = push_str8_copy(scratch.arena, user2convert->output_name); + OS_Handle out_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, output_name); + B32 out_file_is_good = !os_handle_match(out_file, os_handle_zero()); + + //- rjf: convert + P2R_Convert2Bake *convert2bake = 0; + if(out_file_is_good) + { + convert2bake = p2r_convert(scratch.arena, user2convert); + } + + //- rjf: bake + P2R_Bake2Serialize *bake2srlz = 0; + ProfScope("bake") + { + bake2srlz = p2r_bake(scratch.arena, convert2bake); + } + + //- rjf: serialize + String8List serialize_out = rdim_serialized_strings_from_params_bake_section_list(scratch.arena, &convert2bake->bake_params, &bake2srlz->sections); + + //- rjf: write + if(out_file_is_good) + { + U64 off = 0; + for(String8Node *n = serialize_out.first; n != 0; n = n->next) + { + os_file_write(out_file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; + } + } + + //- rjf: close output file + os_file_close(out_file); + + scratch_end(scratch); + }break; + + //- rjf: help message box + case ExecMode_Help: + { + os_graphical_message(0, + str8_lit("The RAD Debugger - Help"), + str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n" + "--user:\n" + "Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n" + "--profile:\n" + "Use to specify the location of a profile file which should be used. Profile files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as profile-related changes are made.\n\n" + "--auto_step\n" + "This will step into all targets after the debugger initially starts.\n\n" + "--auto_run\n" + "This will run all targets after the debugger initially starts.\n\n" + "--ipc \n" + "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n")); + }break; + } + + scratch_end(scratch); +} diff --git a/src/raddbgi_dump/raddbgi_dump_main.c b/src/raddbgi_dump/raddbgi_dump_main.c index 3b154a09..b47f5789 100644 --- a/src/raddbgi_dump/raddbgi_dump_main.c +++ b/src/raddbgi_dump/raddbgi_dump_main.c @@ -4,6 +4,11 @@ //////////////////////////////// //~ rjf: Build Options +#define BUILD_VERSION_MAJOR 0 +#define BUILD_VERSION_MINOR 9 +#define BUILD_VERSION_PATCH 8 +#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" +#define BUILD_TITLE "raddbgi_dump" #define BUILD_CONSOLE_INTERFACE 1 //////////////////////////////// @@ -28,8 +33,8 @@ //////////////////////////////// //~ rjf: Entry Point -int -main(int argc, char **argv) +internal void +entry_point(CmdLine *cmd_line) { ////////////////////////////// //- rjf: set up @@ -37,8 +42,6 @@ main(int argc, char **argv) local_persist TCTX main_thread_tctx = {0}; tctx_init_and_equip(&main_thread_tctx); Arena *arena = arena_alloc(); - String8List args = os_string_list_from_argcv(arena, argc, argv); - CmdLine cmdline = cmd_line_from_string_list(arena, args); String8List errors = {0}; ////////////////////////////// @@ -69,14 +72,14 @@ main(int argc, char **argv) DumpFlags dump_flags = (U32)0xffffffff; { // rjf: extract input file path & load data - input_name = str8_list_first(&cmdline.inputs); + input_name = str8_list_first(&cmd_line->inputs); if(input_name.size > 0) { input_data = os_data_from_file_path(arena, input_name); } else {str8_list_pushf(arena, &errors, "error (input): No input RADDBGI file specified.");} if(input_name.size != 0 && input_data.size == 0) { str8_list_pushf(arena, &errors, "error (input): No input RADDBGI file successfully loaded; either the path or file contents are invalid."); } // rjf: extract dump options { - String8List dump_options = cmd_line_strings(&cmdline, str8_lit("dump")); + String8List dump_options = cmd_line_strings(cmd_line, str8_lit("dump")); if(dump_options.first != 0) { dump_flags = 0; @@ -413,6 +416,4 @@ main(int argc, char **argv) { fwrite(n->string.str, 1, n->string.size, stdout); } - - return 0; } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index dcb6e420..df0454c2 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -4,6 +4,11 @@ //////////////////////////////// //~ rjf: Build Options +#define BUILD_VERSION_MAJOR 0 +#define BUILD_VERSION_MINOR 9 +#define BUILD_VERSION_PATCH 8 +#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" +#define BUILD_TITLE "raddbgi_from_pdb" #define BUILD_CONSOLE_INTERFACE 1 //////////////////////////////// @@ -42,37 +47,16 @@ //////////////////////////////// //~ rjf: Entry Point -int -main(int argc, char **argv) +internal void +entry_point(CmdLine *cmdline) { - local_persist TCTX main_thread_tctx = {0}; - tctx_init_and_equip(&main_thread_tctx); -#if PROFILE_TELEMETRY - U64 tm_data_size = MB(512); - U8 *tm_data = os_reserve(tm_data_size); - os_commit(tm_data, tm_data_size); - tmLoadLibrary(TM_RELEASE); - tmSetMaxThreadCount(1024); - tmInitialize(tm_data_size, tm_data); -#endif - ThreadNameF("[main]"); - //- rjf: initialize dependencies - os_init(argc, argv); + os_init(); ts_init(); - //- rjf: initialize state, parse command line + //- rjf: initialize state, unpack command line Arena *arena = arena_alloc(); - 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_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, &cmdline); - - //- rjf: begin capture - if(should_capture) - { - ProfBeginCapture(argv[0]); - } + P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); //- rjf: display errors with input if(user2convert->errors.node_count > 0 && !user2convert->hide_errors.input) @@ -112,12 +96,4 @@ main(int argc, char **argv) } os_file_close(output_file); } - - //- rjf: end capture - if(should_capture) - { - ProfEndCapture(); - } - - return 0; } From 443c3fb74bb9ec61e5e64aa06d18b69ead9dfb67 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 25 Feb 2024 15:03:27 -0800 Subject: [PATCH 144/275] get dwarf -> raddbgi converter on new entry point style --- src/raddbgi_from_dwarf/raddbgi_from_dwarf.c | 28 +++------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c b/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c index dbb2b2f4..e8607272 100644 --- a/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c +++ b/src/raddbgi_from_dwarf/raddbgi_from_dwarf.c @@ -396,30 +396,13 @@ dump_entry_tree(Arena *arena, String8List *out, } #endif -int -main(int argc, char **argv){ - local_persist TCTX main_thread_tctx = {0}; - tctx_init_and_equip(&main_thread_tctx); - -#if PROFILE_TELEMETRY - U64 tm_data_size = GB(1); - U8 *tm_data = os_reserve(tm_data_size); - os_commit(tm_data, tm_data_size); - tmLoadLibrary(TM_RELEASE); - tmSetMaxThreadCount(1024); - tmInitialize(tm_data_size, tm_data); -#endif - - ThreadNameF("[main]"); - +internal void +entry_point(CmdLine *cmd_line) +{ Arena *arena = arena_alloc(); - String8List args = os_string_list_from_argcv(arena, argc, argv); - CmdLine cmdline = cmd_line_from_string_list(arena, args); - - ProfBeginCapture("raddbgi_from_dwarf"); // parse arguments - DWARFCONV_Params *params = dwarf_convert_params_from_cmd_line(arena, &cmdline); + DWARFCONV_Params *params = dwarf_convert_params_from_cmd_line(arena, cmd_line); // show input errors if (params->errors.node_count > 0 && @@ -898,7 +881,4 @@ fprintf(stdout, "error(parsing): " fmt "\n", __VA_ARGS__); \ fwrite(node->string.str, 1, node->string.size, stdout); } } - - ProfEndCapture(); - return(0); } From 874f40244c78cf42af25c0ac0ba9d34e7d2f370f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Feb 2024 10:45:00 -0800 Subject: [PATCH 145/275] eliminate per-executable initialization, just pull that down into the base layer entry point --- src/base/base_entry_point.c | 55 ++++++++++++++++++++ src/ctrl/ctrl_core.c | 12 ++++- src/ctrl/ctrl_core.h | 7 ++- src/df/core/df_core.c | 21 +++++++- src/df/core/df_core.h | 2 +- src/os/core/win32/os_core_win32.c | 11 ++-- src/raddbg/raddbg_main.cpp | 46 +--------------- src/raddbgi_dump/raddbgi_dump_main.c | 2 - src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 4 -- src/scratch/ryan_scratch.c | 1 - 10 files changed, 96 insertions(+), 65 deletions(-) diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index e94561a8..83aba9ef 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -18,6 +18,61 @@ main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **argum { ProfBeginCapture(arguments[0]); } +#if defined(OS_CORE_H) + os_init(); +#endif +#if defined(TASK_SYSTEM_H) + ts_init(); +#endif +#if defined(HASH_STORE_H) + hs_init(); +#endif +#if defined(FILE_STREAM_H) + fs_init(); +#endif +#if defined(TEXT_CACHE_H) + txt_init(); +#endif +#if defined(DBGI_H) + dbgi_init(); +#endif +#if defined(TXTI_H) + txti_init(); +#endif +#if defined(DEMON_CORE_H) + demon_init(); +#endif +#if defined(CTRL_CORE_H) + ctrl_init(); +#endif +#if defined(DASM_H) + dasm_init(); +#endif +#if defined(OS_GRAPHICAL_H) + os_graphical_init(); +#endif +#if defined(FONT_PROVIDER_H) + fp_init(); +#endif +#if defined(RENDER_CORE_H) + r_init(&cmdline); +#endif +#if defined(TEXTURE_CACHE_H) + tex_init(); +#endif +#if defined(GEO_CACHE_H) + geo_init(); +#endif +#if defined(FONT_CACHE_H) + f_init(); +#endif +#if defined(DF_CORE_H) + DF_StateDeltaHistory *hist = df_state_delta_history_alloc(); + df_core_init(&cmdline, hist); +#endif +#if defined(DF_GFX_H) + df_gfx_init(update_and_render, df_state_delta_history()); +#endif entry_point(&cmdline); if(capture) { diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index d3da0004..c7d7041f 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -10,12 +10,11 @@ //~ rjf: Main Layer Initialization internal void -ctrl_init(CTRL_WakeupFunctionType *wakeup_hook) +ctrl_init(void) { Arena *arena = arena_alloc(); ctrl_state = push_array(arena, CTRL_State, 1); ctrl_state->arena = arena; - ctrl_state->wakeup_hook = wakeup_hook; for(Architecture arch = (Architecture)0; arch < Architecture_COUNT; arch = (Architecture)(arch+1)) { String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); @@ -72,6 +71,15 @@ ctrl_init(CTRL_WakeupFunctionType *wakeup_hook) } } +//////////////////////////////// +//~ rjf: Wakeup Callback Registration + +internal void +ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) +{ + ctrl_state->wakeup_hook = wakeup_hook; +} + //////////////////////////////// //~ rjf: Basic Type Functions diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index bda8ec5a..f507548d 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -447,7 +447,12 @@ global CTRL_State *ctrl_state = 0; //////////////////////////////// //~ rjf: Main Layer Initialization -internal void ctrl_init(CTRL_WakeupFunctionType *wakeup_hook); +internal void ctrl_init(void); + +//////////////////////////////// +//~ rjf: Wakeup Callback Registration + +internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); //////////////////////////////// //~ rjf: Basic Type Functions diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index f19a43d4..7f48339e 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6385,7 +6385,7 @@ df_push_cmd__root(DF_CmdParams *params, DF_CmdSpec *spec) //~ rjf: Main Layer Top-Level Calls internal void -df_core_init(String8 user_path, String8 profile_path, DF_StateDeltaHistory *hist) +df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) { Arena *arena = arena_alloc(); df_state = push_array(arena, DF_State, 1); @@ -6450,8 +6450,25 @@ df_core_init(String8 user_path, String8 profile_path, DF_StateDeltaHistory *hist { Temp scratch = scratch_begin(0, 0); + // rjf: unpack command line arguments + String8 user_cfg_path = cmd_line_string(cmdln, str8_lit("user")); + String8 profile_cfg_path = cmd_line_string(cmdln, str8_lit("profile")); + { + String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); + String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); + os_make_directory(user_data_folder); + if(user_cfg_path.size == 0) + { + user_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); + } + if(profile_cfg_path.size == 0) + { + profile_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_profile", user_data_folder); + } + } + // rjf: set up config path state - String8 cfg_src_paths[DF_CfgSrc_COUNT] = {user_path, profile_path}; + String8 cfg_src_paths[DF_CfgSrc_COUNT] = {user_cfg_path, profile_cfg_path}; for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) { df_state->cfg_path_arenas[src] = arena_alloc(); diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 3c39e548..df3e866d 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1690,7 +1690,7 @@ internal void df_push_cmd__root(DF_CmdParams *params, DF_CmdSpec *spec); //////////////////////////////// //~ rjf: Main Layer Top-Level Calls -internal void df_core_init(String8 user_path, String8 profile_path, DF_StateDeltaHistory *hist); +internal void df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist); internal DF_CmdList df_core_gather_root_cmds(Arena *arena); internal void df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt); internal void df_core_end_frame(void); diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 8ad5b58f..32e6b094 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1779,20 +1779,15 @@ int main(int argc, char **argv) int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { SetUnhandledExceptionFilter(&win32_exception_filter); - Arena *args_arena = arena_alloc__sized(KB(64), KB(64)); - WCHAR *command_line = GetCommandLineW(); - int argc = 0; - WCHAR **argv_16 = CommandLineToArgvW(command_line, &argc); - char **argv = push_array(args_arena, char *, argc); + char **argv = __argv; + int argc = __argc; for(int i = 0; i < argc; i += 1) { - String16 arg16 = str16_cstring((U16 *)argv_16[i]); - String8 arg8 = str8_from_16(args_arena, arg16); + String8 arg8 = str8_cstring(argv[i]); if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive)) { win32_g_is_quiet = 1; } - argv[i] = (char *)arg8.str; } main_thread_base_entry_point(entry_point, argv, (U64)argc); return 0; diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 07f049da..24565311 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -140,14 +140,8 @@ entry_point(CmdLine *cmd_line) SetStdHandle(STD_ERROR_HANDLE, 0); #endif - //- rjf: initialize basic dependencies - os_init(); - ts_init(); - //- rjf: unpack command line arguments ExecMode exec_mode = ExecMode_Normal; - String8 user_cfg_path = str8_lit(""); - String8 profile_cfg_path = str8_lit(""); B32 auto_run = 0; B32 auto_step = 0; B32 jit_attach = 0; @@ -168,8 +162,6 @@ entry_point(CmdLine *cmd_line) { exec_mode = ExecMode_Help; } - user_cfg_path = cmd_line_string(cmd_line, str8_lit("user")); - profile_cfg_path = cmd_line_string(cmd_line, str8_lit("profile")); auto_run = cmd_line_has_flag(cmd_line, str8_lit("auto_run")); auto_step = cmd_line_has_flag(cmd_line, str8_lit("auto_step")); String8 jit_pid_string = cmd_line_string(cmd_line, str8_lit("jit_pid")); @@ -181,20 +173,8 @@ entry_point(CmdLine *cmd_line) jit_attach = (jit_addr != 0); } - //- rjf: set default user/profile paths - { - String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); - String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); - os_make_directory(user_data_folder); - if(user_cfg_path.size == 0) - { - user_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); - } - if(profile_cfg_path.size == 0) - { - profile_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_profile", user_data_folder); - } - } + //- rjf: set up layers + ctrl_set_wakeup_hook(wakeup_hook); //- rjf: dispatch to top-level codepath based on execution mode switch(exec_mode) @@ -210,28 +190,6 @@ entry_point(CmdLine *cmd_line) IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; ipc_info->msg_size = 0; - //- rjf: initialize stuff we depend on - { - hs_init(); - fs_init(); - txt_init(); - dbgi_init(); - txti_init(); - demon_init(); - ctrl_init(wakeup_hook); - dasm_init(); - os_graphical_init(); - fp_init(); - r_init(cmd_line); - tex_init(); - geo_init(); - f_init(); - DF_StateDeltaHistory *hist = df_state_delta_history_alloc(); - df_core_init(user_cfg_path, profile_cfg_path, hist); - df_gfx_init(update_and_render, hist); - os_set_cursor(OS_Cursor_Pointer); - } - //- rjf: setup initial target from command line args { String8List args = cmd_line->inputs; diff --git a/src/raddbgi_dump/raddbgi_dump_main.c b/src/raddbgi_dump/raddbgi_dump_main.c index b47f5789..5346b2f4 100644 --- a/src/raddbgi_dump/raddbgi_dump_main.c +++ b/src/raddbgi_dump/raddbgi_dump_main.c @@ -39,8 +39,6 @@ entry_point(CmdLine *cmd_line) ////////////////////////////// //- rjf: set up // - local_persist TCTX main_thread_tctx = {0}; - tctx_init_and_equip(&main_thread_tctx); Arena *arena = arena_alloc(); String8List errors = {0}; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index df0454c2..42ed46b5 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -50,10 +50,6 @@ internal void entry_point(CmdLine *cmdline) { - //- rjf: initialize dependencies - os_init(); - ts_init(); - //- rjf: initialize state, unpack command line Arena *arena = arena_alloc(); P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 46717f0a..11fa3a04 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -10,6 +10,5 @@ int main(int argument_count, char **arguments) { - return 0; } From d9897161c20413ba9e82fea4e85d787bf362d7c0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Feb 2024 11:49:19 -0800 Subject: [PATCH 146/275] first half of first pass at breakpad textual symbol info format exporter --- build.bat | 1 + .../breakpad_from_pdb_main.c | 118 ++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 src/breakpad_from_pdb/breakpad_from_pdb_main.c diff --git a/build.bat b/build.bat index 6579a826..06c265b2 100644 --- a/build.bat +++ b/build.bat @@ -100,6 +100,7 @@ if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg_main.c if "%raddbgi_from_pdb%"=="1" %compile% ..\src\raddbgi_from_pdb\raddbgi_from_pdb_main.c %compile_link% %out%raddbgi_from_pdb.exe || exit /b 1 if "%raddbgi_from_dwarf%"=="1" %compile% ..\src\raddbgi_from_dwarf\raddbgi_from_dwarf.c %compile_link% %out%raddbgi_from_dwarf.exe || exit /b 1 if "%raddbgi_dump%"=="1" %compile% ..\src\raddbgi_dump\raddbgi_dump_main.c %compile_link% %out%raddbgi_dump.exe || exit /b 1 +if "%breakpad_from_pdb%"=="1" %compile% ..\src\breakpad_from_pdb\breakpad_from_pdb_main.c %compile_link% %out%breakpad_from_pdb.exe || exit /b 1 if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe || exit /b 1 if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe || exit /b 1 diff --git a/src/breakpad_from_pdb/breakpad_from_pdb_main.c b/src/breakpad_from_pdb/breakpad_from_pdb_main.c new file mode 100644 index 00000000..0526197f --- /dev/null +++ b/src/breakpad_from_pdb/breakpad_from_pdb_main.c @@ -0,0 +1,118 @@ +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_VERSION_MAJOR 0 +#define BUILD_VERSION_MINOR 9 +#define BUILD_VERSION_PATCH 8 +#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" +#define BUILD_TITLE "breakpad_from_pdb" +#define BUILD_CONSOLE_INTERFACE 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [lib] +#include "lib_raddbgi_format/raddbgi_format.h" +#include "lib_raddbgi_format/raddbgi_format.c" + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "task_system/task_system.h" +#include "raddbgi_make_local/raddbgi_make_local.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_from_pdb/raddbgi_from_pdb.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "task_system/task_system.c" +#include "raddbgi_make_local/raddbgi_make_local.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_from_pdb/raddbgi_from_pdb.c" + +//////////////////////////////// +//~ rjf: Entry Point + +internal void +entry_point(CmdLine *cmdline) +{ + //- rjf: initialize state, unpack command line + Arena *arena = arena_alloc(); + P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); + + //- rjf: display errors with input + if(user2convert->errors.node_count > 0 && !user2convert->hide_errors.input) + { + for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) + { + fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); + } + } + + //- rjf: convert + P2R_Convert2Bake *convert2bake = 0; + ProfScope("convert") + { + convert2bake = p2r_convert(arena, user2convert); + } + + //- rjf: dump breakpad text + String8List dump = {0}; + ProfScope("dump breakpad text") + { + RDIM_BakeParams *params = &convert2bake->bake_params; + + //- rjf: dump MODULE record + str8_list_pushf(arena, &dump, "MODULE windows x86_64 %I64x %S\n", params->top_level_info.exe_hash, params->top_level_info.exe_name); + + //- rjf: dump FILE records + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + U64 file_idx = rdim_idx_from_src_file(&n->v[idx]); + String8 src_path = n->v[idx].normal_full_path; + str8_list_pushf(arena, &dump, "FILE %I64u %S\n", file_idx, src_path); + } + } + + //- rjf: dump FUNC records + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + RDIM_Symbol *proc = &n->v[idx]; + RDIM_Scope *root_scope = proc->root_scope; + if(root_scope != 0 && root_scope->voff_ranges.first != 0) + { + RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v; + str8_list_pushf(arena, &dump, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name); + } + } + } + } + + //- rjf: write + ProfScope("write") + { + OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, user2convert->output_name); + U64 off = 0; + for(String8Node *n = dump.first; n != 0; n = n->next) + { + os_file_write(output_file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; + } + os_file_close(output_file); + } +} From 03763e3444e10ec94428d36d2cfbfdcab602d5f2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Feb 2024 12:15:18 -0800 Subject: [PATCH 147/275] raddbgi_from_pdb/raddbgi_make: split top-level units baking from per-unit baking; do per-unit baking wide --- src/lib_raddbgi_make/raddbgi_make.c | 126 +++++++++++++++++++++++- src/lib_raddbgi_make/raddbgi_make.h | 3 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 45 +++++++-- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 13 ++- 4 files changed, 174 insertions(+), 13 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 2b1b7914..7ac16ff6 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1971,7 +1971,131 @@ rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeSt //- 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) +rdim_bake_section_list_from_unit(RDIM_Arena *arena, RDIM_Unit *unit) +{ + RDIM_BakeSectionList sections = {0}; + + //////////////////////// + //- rjf: produce combined unit line info + // + RDI_U64 *unit_voffs = 0; + RDI_Line *unit_lines = 0; + RDI_U16 *unit_cols = 0; + RDI_U32 unit_line_count = 0; + RDIM_ProfScope("produce combined unit line info") + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: gather up all line info into two arrays: + // + // [1] keys: sortable array; pairs voffs with line info records; null records are sequence enders + // [2] recs: contains all the source coordinates for a range of voffs + // + typedef struct RDIM_LineRec RDIM_LineRec; + struct RDIM_LineRec + { + RDI_U32 file_id; + RDI_U32 line_num; + RDI_U16 col_first; + RDI_U16 col_opl; + }; + RDI_U64 line_count = 0; + RDI_U64 seq_count = 0; + for(RDIM_LineSequenceNode *seq_n = unit->line_sequences.first; seq_n != 0; seq_n = seq_n->next) + { + seq_count += 1; + line_count += seq_n->v.line_count; + } + RDI_U64 key_count = line_count + seq_count; + RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); + RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); + { + RDIM_SortKey *key_ptr = line_keys; + RDIM_LineRec *rec_ptr = line_recs; + for(RDIM_LineSequenceNode *seq_n = unit->line_sequences.first; seq_n != 0; seq_n = seq_n->next) + { + RDIM_LineSequence *seq = &seq_n->v; + for(RDI_U64 line_idx = 0; line_idx < seq->line_count; line_idx += 1) + { + key_ptr->key = seq->voffs[line_idx]; + key_ptr->val = rec_ptr; + key_ptr += 1; + rec_ptr->file_id = (RDI_U32)rdim_idx_from_src_file(seq->src_file); // TODO(rjf): @u64_to_u32 + rec_ptr->line_num = seq->line_nums[line_idx]; + if(seq->col_nums != 0) + { + rec_ptr->col_first = seq->col_nums[line_idx*2]; + rec_ptr->col_opl = seq->col_nums[line_idx*2 + 1]; + } + rec_ptr += 1; + } + key_ptr->key = seq->voffs[seq->line_count]; + key_ptr->val = 0; + key_ptr += 1; + } + } + + //- rjf: sort + RDIM_SortKey *sorted_line_keys = 0; + RDIM_ProfScope("sort") + { + sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); + } + + // TODO(rjf): do a pass over sorted keys to make sure duplicate keys + // are sorted with null record first, and no more than one null + // record and one non-null record + + //- rjf: arrange output + RDI_U64 *arranged_voffs = rdim_push_array_no_zero(arena, RDI_U64, key_count + 1); + RDI_Line *arranged_lines = rdim_push_array_no_zero(arena, RDI_Line, key_count); + RDIM_ProfScope("arrange output") + { + for(RDI_U64 i = 0; i < key_count; i += 1) + { + arranged_voffs[i] = sorted_line_keys[i].key; + } + arranged_voffs[key_count] = ~0ull; + for(RDI_U64 i = 0; i < key_count; i += 1) + { + RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; + if(rec != 0) + { + arranged_lines[i].file_idx = rec->file_id; + arranged_lines[i].line_num = rec->line_num; + } + else + { + arranged_lines[i].file_idx = 0; + arranged_lines[i].line_num = 0; + } + } + } + + //- rjf: fill output + unit_voffs = arranged_voffs; + unit_lines = arranged_lines; + unit_cols = 0; + unit_line_count = key_count; + rdim_scratch_end(scratch); + } + + //////////////////////// + //- rjf: build line info sections + // + U64 unit_idx = rdim_idx_from_unit(unit); + rdim_bake_section_list_push_new(arena, §ions, unit_voffs, sizeof(RDI_U64)*(unit_line_count+1), RDI_DataSectionTag_LineInfoVoffs, unit_idx); + rdim_bake_section_list_push_new(arena, §ions, unit_lines, sizeof(RDI_Line)*unit_line_count, RDI_DataSectionTag_LineInfoData, unit_idx); + if(unit_cols != 0) + { + rdim_bake_section_list_push_new(arena, §ions, unit_cols, sizeof(RDI_Column)*unit_line_count, RDI_DataSectionTag_LineInfoColumns, unit_idx); + } + + return sections; +} + +RDI_PROC RDIM_BakeSectionList +rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, params->units.total_count+1); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index f412e9f3..eac2487a 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1145,7 +1145,8 @@ RDI_PROC RDIM_BakeSectionList rdim_bake_top_level_info_section_list_from_params( 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_section_list_from_unit(RDIM_Arena *arena, RDIM_Unit *unit); +RDI_PROC RDIM_BakeSectionList rdim_bake_unit_top_level_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); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 8b25b47b..1a662e0b 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3579,11 +3579,20 @@ p2r_build_bake_name_map_task__entry_point(Arena *arena, void *p) //- rjf: pass 2: string-map-dependent debug info stream builds internal void * -p2r_bake_units_task__entry_point(Arena *arena, void *p) +p2r_bake_units_top_level_task__entry_point(Arena *arena, void *p) { - P2R_BakeUnitsIn *in = (P2R_BakeUnitsIn *)p; + P2R_BakeUnitsTopLevelIn *in = (P2R_BakeUnitsTopLevelIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); - ProfScope("bake units") *s = rdim_bake_unit_section_list_from_params(arena, in->strings, in->path_tree, in->params); + ProfScope("bake units") *s = rdim_bake_unit_top_level_section_list_from_params(arena, in->strings, in->path_tree, in->params); + return s; +} + +internal void * +p2r_bake_unit_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeUnitIn *in = (P2R_BakeUnitIn *)p; + RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); + ProfScope("bake unit") *s = rdim_bake_section_list_from_unit(arena, in->unit); return s; } @@ -3733,6 +3742,16 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } //- rjf: kick off pass 1 tasks + P2R_BakeUnitIn *bake_units_in = push_array(scratch.arena, P2R_BakeUnitIn, params->units.total_count); + TS_Ticket *bake_units_tickets = push_array(scratch.arena, TS_Ticket, params->units.total_count); + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + bake_units_in[idx].unit = &n->v[idx]; + bake_units_tickets[idx] = ts_kickoff(p2r_bake_unit_task__entry_point, 0, &bake_units_in[idx]); + } + } P2R_BuildBakeStringMapIn build_bake_string_map_in = {path_tree, params}; TS_Ticket build_bake_string_map_ticket = ts_kickoff(p2r_build_bake_string_map_task__entry_point, 0, &build_bake_string_map_in); P2R_BuildBakeNameMapIn build_bake_name_map_in[RDI_NameMapKind_COUNT] = {0}; @@ -3754,8 +3773,8 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } //- rjf: kick off pass 2 tasks - P2R_BakeUnitsIn bake_units_in = {strings, path_tree, params}; - TS_Ticket bake_units_ticket = ts_kickoff(p2r_bake_units_task__entry_point, 0, &bake_units_in); + P2R_BakeUnitsTopLevelIn bake_units_top_level_in = {strings, path_tree, params}; + TS_Ticket bake_units_top_level_ticket = ts_kickoff(p2r_bake_units_top_level_task__entry_point, 0, &bake_units_top_level_in); P2R_BakeUnitVMapIn bake_unit_vmap_in = {params}; TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2r_bake_unit_vmap_task__entry_point, 0, &bake_unit_vmap_in); P2R_BakeSrcFilesIn bake_src_files_in = {strings, path_tree, params}; @@ -3842,10 +3861,10 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) rdim_bake_section_list_concat_in_place(§ions, &s); } - //- rjf: join units - ProfScope("units") + //- rjf: join top-level units info + ProfScope("top-level units info") { - RDIM_BakeSectionList *s = ts_join_struct(bake_units_ticket, max_U64, RDIM_BakeSectionList); + RDIM_BakeSectionList *s = ts_join_struct(bake_units_top_level_ticket, max_U64, RDIM_BakeSectionList); rdim_bake_section_list_concat_in_place(§ions, s); } @@ -3950,6 +3969,16 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) rdim_bake_section_list_concat_in_place(§ions, s); } + //- rjf: join per-unit bakes + ProfScope("units") + { + for(U64 idx = 0; idx < params->units.total_count; idx += 1) + { + RDIM_BakeSectionList *s = ts_join_struct(bake_units_tickets[idx], max_U64, RDIM_BakeSectionList); + rdim_bake_section_list_concat_in_place(§ions, s); + } + } + //- rjf: fill & return P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1); out->sections = sections; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 86a9f9e2..9384bcb1 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -266,14 +266,20 @@ struct P2R_BuildBakeNameMapIn RDIM_BakeParams *params; }; -typedef struct P2R_BakeUnitsIn P2R_BakeUnitsIn; -struct P2R_BakeUnitsIn +typedef struct P2R_BakeUnitsTopLevelIn P2R_BakeUnitsTopLevelIn; +struct P2R_BakeUnitsTopLevelIn { RDIM_BakeStringMap *strings; RDIM_BakePathTree *path_tree; RDIM_BakeParams *params; }; +typedef struct P2R_BakeUnitIn P2R_BakeUnitIn; +struct P2R_BakeUnitIn +{ + RDIM_Unit *unit; +}; + typedef struct P2R_BakeUnitVMapIn P2R_BakeUnitVMapIn; struct P2R_BakeUnitVMapIn { @@ -454,7 +460,8 @@ internal void *p2r_build_bake_string_map_task__entry_point(Arena *arena, void *p internal void *p2r_build_bake_name_map_task__entry_point(Arena *arena, void *p); //- rjf: pass 2: string-map-dependent debug info stream builds -internal void *p2r_bake_units_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_units_top_level_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_unit_task__entry_point(Arena *arena, void *p); internal void *p2r_bake_unit_vmap_task__entry_point(Arena *arena, void *p); internal void *p2r_bake_src_files_task__entry_point(Arena *arena, void *p); internal void *p2r_bake_udts_task__entry_point(Arena *arena, void *p); From 1c2c82cc583f79720adc44cb47c1ff57093edc17 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Feb 2024 13:34:33 -0800 Subject: [PATCH 148/275] breakpad_from_pdb per-function line info writing --- project.4coder | 2 +- .../breakpad_from_pdb_main.c | 205 ++++++++++++++++-- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 11 +- 3 files changed, 189 insertions(+), 29 deletions(-) diff --git a/project.4coder b/project.4coder index afc8e60c..6083d5e2 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build raddbgi_from_pdb telemetry", + .win = "build breakpad_from_pdb telemetry release", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/breakpad_from_pdb/breakpad_from_pdb_main.c b/src/breakpad_from_pdb/breakpad_from_pdb_main.c index 0526197f..4c0c35b2 100644 --- a/src/breakpad_from_pdb/breakpad_from_pdb_main.c +++ b/src/breakpad_from_pdb/breakpad_from_pdb_main.c @@ -13,7 +13,9 @@ //- rjf: [lib] #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" //- rjf: [h] #include "base/base_inc.h" @@ -41,6 +43,89 @@ #include "pdb/pdb_stringize.c" #include "raddbgi_from_pdb/raddbgi_from_pdb.c" +//////////////////////////////// +//~ rjf: Baking Tasks + +//- rjf: unit vmap baking + +typedef struct P2B_BakeUnitVMapIn P2B_BakeUnitVMapIn; +struct P2B_BakeUnitVMapIn +{ + RDIM_BakeParams *params; +}; + +typedef struct P2B_BakeUnitVMapOut P2B_BakeUnitVMapOut; +struct P2B_BakeUnitVMapOut +{ + RDI_VMapEntry *vmap_entries; + RDI_U64 vmap_entries_count; +}; + +internal void * +p2b_bake_unit_vmap_task__entry_point(Arena *arena, void *p) +{ + P2B_BakeUnitVMapIn *in = (P2B_BakeUnitVMapIn *)p; + P2B_BakeUnitVMapOut *out = push_array(arena, P2B_BakeUnitVMapOut, 1); + RDIM_BakeSectionList sections = rdim_bake_unit_vmap_section_list_from_params(arena, in->params); + RDIM_BakeSection *vmap_section = 0; + for(RDIM_BakeSectionNode *n = sections.first; n != 0 && vmap_section == 0; n = n->next) + { + switch(n->v.tag) + { + default:{}break; + case RDI_DataSectionTag_UnitVmap:{vmap_section = &n->v;}break; + } + } + if(vmap_section != 0) + { + out->vmap_entries = (RDI_VMapEntry *)vmap_section->data; + out->vmap_entries_count = vmap_section->size/sizeof(RDI_VMapEntry); + } + return out; +} + +//- rjf: per-unit baking + +typedef struct P2B_BakeUnitIn P2B_BakeUnitIn; +struct P2B_BakeUnitIn +{ + RDIM_Unit *unit; +}; + +typedef struct P2B_BakeUnitOut P2B_BakeUnitOut; +struct P2B_BakeUnitOut +{ + U64 unit_line_count; + U64 *unit_line_voffs; + RDI_Line *unit_lines; +}; + +internal void * +p2b_bake_unit_task__entry_point(Arena *arena, void *p) +{ + P2B_BakeUnitIn *in = (P2B_BakeUnitIn *)p; + P2B_BakeUnitOut *out = push_array(arena, P2B_BakeUnitOut, 1); + RDIM_BakeSectionList sections = rdim_bake_section_list_from_unit(arena, in->unit); + RDIM_BakeSection *voffs_section = 0; + RDIM_BakeSection *lines_section = 0; + for(RDIM_BakeSectionNode *n = sections.first; n != 0; n = n->next) + { + switch(n->v.tag) + { + default:{}break; + case RDI_DataSectionTag_LineInfoVoffs:{voffs_section = &n->v;}break; + case RDI_DataSectionTag_LineInfoData: {lines_section = &n->v;}break; + } + } + if(voffs_section != 0 && lines_section != 0) + { + out->unit_line_count = lines_section->size/sizeof(RDI_Line); + out->unit_line_voffs = (U64 *)voffs_section->data; + out->unit_lines = (RDI_Line *)lines_section->data; + } + return out; +} + //////////////////////////////// //~ rjf: Entry Point @@ -73,46 +158,118 @@ entry_point(CmdLine *cmdline) { RDIM_BakeParams *params = &convert2bake->bake_params; + //- rjf: kick off unit vmap baking + P2B_BakeUnitVMapIn bake_unit_vmap_in = {params}; + TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2b_bake_unit_vmap_task__entry_point, 0, &bake_unit_vmap_in); + + //- rjf: kick off per-unit baking + P2B_BakeUnitIn *bake_units_in = push_array(arena, P2B_BakeUnitIn, params->units.total_count+1); + TS_Ticket *bake_units_tickets = push_array(arena, TS_Ticket, params->units.total_count+1); + { + U64 idx = 1; + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) + { + for(U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, idx += 1) + { + bake_units_in[chunk_idx].unit = &n->v[chunk_idx]; + bake_units_tickets[idx] = ts_kickoff(p2b_bake_unit_task__entry_point, 0, &bake_units_in[chunk_idx]); + } + } + } + //- rjf: dump MODULE record str8_list_pushf(arena, &dump, "MODULE windows x86_64 %I64x %S\n", params->top_level_info.exe_hash, params->top_level_info.exe_name); //- rjf: dump FILE records - for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + ProfScope("dump FILE records") { - for(U64 idx = 0; idx < n->count; idx += 1) + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) { - U64 file_idx = rdim_idx_from_src_file(&n->v[idx]); - String8 src_path = n->v[idx].normal_full_path; - str8_list_pushf(arena, &dump, "FILE %I64u %S\n", file_idx, src_path); - } - } - - //- rjf: dump FUNC records - for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - RDIM_Symbol *proc = &n->v[idx]; - RDIM_Scope *root_scope = proc->root_scope; - if(root_scope != 0 && root_scope->voff_ranges.first != 0) + for(U64 idx = 0; idx < n->count; idx += 1) { - RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v; - str8_list_pushf(arena, &dump, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name); + U64 file_idx = rdim_idx_from_src_file(&n->v[idx]); + String8 src_path = n->v[idx].normal_full_path; + str8_list_pushf(arena, &dump, "FILE %I64u %S\n", file_idx, src_path); } } } + + //- rjf: join unit vmap + P2B_BakeUnitVMapOut *bake_unit_vmap_out = ts_join_struct(bake_unit_vmap_ticket, max_U64, P2B_BakeUnitVMapOut); + RDI_VMapEntry *unit_vmap = bake_unit_vmap_out->vmap_entries; + U32 unit_vmap_count = (U32)(bake_unit_vmap_out->vmap_entries_count); + + //- rjf: join units + P2B_BakeUnitOut **bake_units_out = push_array(arena, P2B_BakeUnitOut*, params->units.total_count+1); + for(U64 idx = 1; idx < params->units.total_count+1; idx += 1) + { + bake_units_out[idx] = ts_join_struct(bake_units_tickets[idx], max_U64, P2B_BakeUnitOut); + } + + //- rjf: dump FUNC & line records + ProfScope("dump FUNC & line records") + { + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + // NOTE(rjf): breakpad does not support multiple voff ranges per procedure. + RDIM_Symbol *proc = &n->v[idx]; + RDIM_Scope *root_scope = proc->root_scope; + if(root_scope != 0 && root_scope->voff_ranges.first != 0) + { + // rjf: dump function record + RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v; + str8_list_pushf(arena, &dump, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name); + + // rjf: dump function lines + U64 unit_idx = rdi_vmap_idx_from_voff(unit_vmap, unit_vmap_count, voff_range.min); + if(0 < unit_idx && unit_idx <= params->units.total_count) + { + // rjf: unpack unit line info + P2B_BakeUnitOut *bake_unit_out = bake_units_out[unit_idx]; + RDI_ParsedLineInfo line_info = {bake_unit_out->unit_line_voffs, bake_unit_out->unit_lines, 0, bake_unit_out->unit_line_count, 0}; + for(U64 voff = voff_range.min, last_voff = 0; + voff < voff_range.max && voff > last_voff;) + { + RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&line_info, voff); + if(line_info_idx < line_info.count) + { + RDI_Line *line = &line_info.lines[line_info_idx]; + U64 line_voff_min = line_info.voffs[line_info_idx]; + U64 line_voff_opl = line_info.voffs[line_info_idx+1]; + str8_list_pushf(arena, &dump, "%I64x %I64x %I64u %I64u\n", + line_voff_min, + line_voff_opl-line_voff_min, + (U64)line->line_num, + (U64)line->file_idx); + last_voff = voff; + voff = line_voff_opl; + } + else + { + break; + } + } + } + } + } + } + } + } + + //- rjf: bake + String8 baked = {0}; + ProfScope("bake") + { + baked = str8_list_join(arena, &dump, 0); } //- rjf: write ProfScope("write") { OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, user2convert->output_name); - U64 off = 0; - for(String8Node *n = dump.first; n != 0; n = n->next) - { - os_file_write(output_file, r1u64(off, off+n->string.size), n->string.str); - off += n->string.size; - } + os_file_write(output_file, r1u64(0, baked.size), baked.str); os_file_close(output_file); } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 1a662e0b..b68fc952 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3744,12 +3744,15 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off pass 1 tasks P2R_BakeUnitIn *bake_units_in = push_array(scratch.arena, P2R_BakeUnitIn, params->units.total_count); TS_Ticket *bake_units_tickets = push_array(scratch.arena, TS_Ticket, params->units.total_count); - for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) { - for(U64 idx = 0; idx < n->count; idx += 1) + U64 idx = 0; + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) { - bake_units_in[idx].unit = &n->v[idx]; - bake_units_tickets[idx] = ts_kickoff(p2r_bake_unit_task__entry_point, 0, &bake_units_in[idx]); + for(U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, idx += 1) + { + bake_units_in[idx].unit = &n->v[chunk_idx]; + bake_units_tickets[idx] = ts_kickoff(p2r_bake_unit_task__entry_point, 0, &bake_units_in[idx]); + } } } P2R_BuildBakeStringMapIn build_bake_string_map_in = {path_tree, params}; From 3b7a4f33318d4e3943c5d529c56682b6d53c539f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Feb 2024 14:11:26 -0800 Subject: [PATCH 149/275] clean up pdb -> raddbgi converter parameters; extend conversion parameterization with optional type/udt disabling; use in breakpad converter --- .../breakpad_from_pdb_main.c | 143 ++++++++++++------ src/raddbgi_from_pdb/raddbgi_from_pdb.c | 127 ++++------------ src/raddbgi_from_pdb/raddbgi_from_pdb.h | 29 ++-- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 2 +- 4 files changed, 131 insertions(+), 170 deletions(-) diff --git a/src/breakpad_from_pdb/breakpad_from_pdb_main.c b/src/breakpad_from_pdb/breakpad_from_pdb_main.c index 4c0c35b2..64df40c2 100644 --- a/src/breakpad_from_pdb/breakpad_from_pdb_main.c +++ b/src/breakpad_from_pdb/breakpad_from_pdb_main.c @@ -126,6 +126,69 @@ p2b_bake_unit_task__entry_point(Arena *arena, void *p) return out; } +//- rjf: per-procedure chunk dumping + +typedef struct P2B_DumpProcChunkIn P2B_DumpProcChunkIn; +struct P2B_DumpProcChunkIn +{ + RDI_VMapEntry *unit_vmap; + U32 unit_vmap_count; + P2B_BakeUnitOut **bake_units_out; + U64 bake_units_out_count; + RDIM_SymbolChunkNode *chunk; +}; + +internal void * +p2b_dump_proc_chunk_task__entry_point(Arena *arena, void *p) +{ + P2B_DumpProcChunkIn *in = (P2B_DumpProcChunkIn *)p; + String8List *out = push_array(arena, String8List, 1); + for(U64 idx = 0; idx < in->chunk->count; idx += 1) + { + // NOTE(rjf): breakpad does not support multiple voff ranges per procedure. + RDIM_Symbol *proc = &in->chunk->v[idx]; + RDIM_Scope *root_scope = proc->root_scope; + if(root_scope != 0 && root_scope->voff_ranges.first != 0) + { + // rjf: dump function record + RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v; + str8_list_pushf(arena, out, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name); + + // rjf: dump function lines + U64 unit_idx = rdi_vmap_idx_from_voff(in->unit_vmap, in->unit_vmap_count, voff_range.min); + if(0 < unit_idx && unit_idx <= in->bake_units_out_count) + { + // rjf: unpack unit line info + P2B_BakeUnitOut *bake_unit_out = in->bake_units_out[unit_idx]; + RDI_ParsedLineInfo line_info = {bake_unit_out->unit_line_voffs, bake_unit_out->unit_lines, 0, bake_unit_out->unit_line_count, 0}; + for(U64 voff = voff_range.min, last_voff = 0; + voff < voff_range.max && voff > last_voff;) + { + RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&line_info, voff); + if(line_info_idx < line_info.count) + { + RDI_Line *line = &line_info.lines[line_info_idx]; + U64 line_voff_min = line_info.voffs[line_info_idx]; + U64 line_voff_opl = line_info.voffs[line_info_idx+1]; + str8_list_pushf(arena, out, "%I64x %I64x %I64u %I64u\n", + line_voff_min, + line_voff_opl-line_voff_min, + (U64)line->line_num, + (U64)line->file_idx); + last_voff = voff; + voff = line_voff_opl; + } + else + { + break; + } + } + } + } + } + return out; +} + //////////////////////////////// //~ rjf: Entry Point @@ -135,9 +198,10 @@ entry_point(CmdLine *cmdline) //- rjf: initialize state, unpack command line Arena *arena = arena_alloc(); P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); + user2convert->flags &= ~(P2R_ConvertFlag_Types|P2R_ConvertFlag_UDTs); //- rjf: display errors with input - if(user2convert->errors.node_count > 0 && !user2convert->hide_errors.input) + if(user2convert->errors.node_count > 0) { for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) { @@ -195,65 +259,46 @@ entry_point(CmdLine *cmdline) } //- rjf: join unit vmap + ProfBegin("join unit vmap"); P2B_BakeUnitVMapOut *bake_unit_vmap_out = ts_join_struct(bake_unit_vmap_ticket, max_U64, P2B_BakeUnitVMapOut); RDI_VMapEntry *unit_vmap = bake_unit_vmap_out->vmap_entries; U32 unit_vmap_count = (U32)(bake_unit_vmap_out->vmap_entries_count); + ProfEnd(); //- rjf: join units P2B_BakeUnitOut **bake_units_out = push_array(arena, P2B_BakeUnitOut*, params->units.total_count+1); - for(U64 idx = 1; idx < params->units.total_count+1; idx += 1) + ProfScope("join units") { - bake_units_out[idx] = ts_join_struct(bake_units_tickets[idx], max_U64, P2B_BakeUnitOut); + for(U64 idx = 1; idx < params->units.total_count+1; idx += 1) + { + bake_units_out[idx] = ts_join_struct(bake_units_tickets[idx], max_U64, P2B_BakeUnitOut); + } } - //- rjf: dump FUNC & line records - ProfScope("dump FUNC & line records") + //- rjf: kick off FUNC & line record dump tasks + P2B_DumpProcChunkIn *dump_proc_chunk_in = push_array(arena, P2B_DumpProcChunkIn, params->procedures.chunk_count); + TS_Ticket *dump_proc_chunk_tickets = push_array(arena, TS_Ticket, params->procedures.chunk_count); + ProfScope("kick off FUNC & line record dump tasks") { - for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + U64 task_idx = 0; + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next, task_idx += 1) { - for(U64 idx = 0; idx < n->count; idx += 1) - { - // NOTE(rjf): breakpad does not support multiple voff ranges per procedure. - RDIM_Symbol *proc = &n->v[idx]; - RDIM_Scope *root_scope = proc->root_scope; - if(root_scope != 0 && root_scope->voff_ranges.first != 0) - { - // rjf: dump function record - RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v; - str8_list_pushf(arena, &dump, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name); - - // rjf: dump function lines - U64 unit_idx = rdi_vmap_idx_from_voff(unit_vmap, unit_vmap_count, voff_range.min); - if(0 < unit_idx && unit_idx <= params->units.total_count) - { - // rjf: unpack unit line info - P2B_BakeUnitOut *bake_unit_out = bake_units_out[unit_idx]; - RDI_ParsedLineInfo line_info = {bake_unit_out->unit_line_voffs, bake_unit_out->unit_lines, 0, bake_unit_out->unit_line_count, 0}; - for(U64 voff = voff_range.min, last_voff = 0; - voff < voff_range.max && voff > last_voff;) - { - RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&line_info, voff); - if(line_info_idx < line_info.count) - { - RDI_Line *line = &line_info.lines[line_info_idx]; - U64 line_voff_min = line_info.voffs[line_info_idx]; - U64 line_voff_opl = line_info.voffs[line_info_idx+1]; - str8_list_pushf(arena, &dump, "%I64x %I64x %I64u %I64u\n", - line_voff_min, - line_voff_opl-line_voff_min, - (U64)line->line_num, - (U64)line->file_idx); - last_voff = voff; - voff = line_voff_opl; - } - else - { - break; - } - } - } - } - } + dump_proc_chunk_in[task_idx].unit_vmap = unit_vmap; + dump_proc_chunk_in[task_idx].unit_vmap_count = unit_vmap_count; + dump_proc_chunk_in[task_idx].bake_units_out = bake_units_out; + dump_proc_chunk_in[task_idx].bake_units_out_count = params->units.total_count+1; + dump_proc_chunk_in[task_idx].chunk = n; + dump_proc_chunk_tickets[task_idx] = ts_kickoff(p2b_dump_proc_chunk_task__entry_point, 0, &dump_proc_chunk_in[task_idx]); + } + } + + //- rjf: join FUNC & line record dump tasks + ProfScope("join FUNC & line record dump tasks") + { + for(U64 idx = 0; idx < params->procedures.chunk_count; idx += 1) + { + String8List *out = ts_join_struct(dump_proc_chunk_tickets[idx], max_U64, String8List); + str8_list_concat_in_place(&dump, out); } } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index b68fc952..b9951804 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -84,97 +84,15 @@ p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline) //- rjf: get output name { result->output_name = cmd_line_string(cmdline, str8_lit("out")); - } - - //- rjf: error options - if(cmd_line_has_flag(cmdline, str8_lit("hide_errors"))) - { - String8List vals = cmd_line_strings(cmdline, str8_lit("hide_errors")); - - // if no values - set all to hidden - if(vals.node_count == 0) + if(result->output_name.size == 0) { - B8 *ptr = (B8*)&result->hide_errors; - B8 *opl = ptr + sizeof(result->hide_errors); - for(;ptr < opl; ptr += 1) - { - *ptr = 1; - } - } - - // for each explicit value set the corresponding flag to hidden - for(String8Node *node = vals.first; node != 0; node = node->next) - { - if(str8_match(node->string, str8_lit("input"), 0)) - { - result->hide_errors.input = 1; - } - else if(str8_match(node->string, str8_lit("output"), 0)) - { - result->hide_errors.output = 1; - } - else if(str8_match(node->string, str8_lit("parsing"), 0)) - { - result->hide_errors.parsing = 1; - } - else if(str8_match(node->string, str8_lit("converting"), 0)) - { - result->hide_errors.converting = 1; - } + str8_list_pushf(arena, &result->errors, "Missing required parameter: '--out:'"); } } - //- rjf: dump options - if(cmd_line_has_flag(cmdline, str8_lit("dump"))) + //- rjf: get flags { - result->dump = 1; - String8List vals = cmd_line_strings(cmdline, str8_lit("dump")); - if(vals.first == 0) - { - B8 *ptr = &result->dump__first; - for(;ptr < &result->dump__last; ptr += 1) - { - *ptr = 1; - } - } - else - { - for(String8Node *node = vals.first; node != 0; node = node->next) - { - if(str8_match(node->string, str8_lit("coff_sections"), 0)) - { - result->dump_coff_sections = 1; - } - else if(str8_match(node->string, str8_lit("msf"), 0)) - { - result->dump_msf = 1; - } - else if(str8_match(node->string, str8_lit("sym"), 0)) - { - result->dump_sym = 1; - } - else if(str8_match(node->string, str8_lit("tpi_hash"), 0)) - { - result->dump_tpi_hash = 1; - } - else if(str8_match(node->string, str8_lit("leaf"), 0)) - { - result->dump_leaf = 1; - } - else if(str8_match(node->string, str8_lit("c13"), 0)) - { - result->dump_c13 = 1; - } - else if(str8_match(node->string, str8_lit("contributions"), 0)) - { - result->dump_contributions = 1; - } - else if(str8_match(node->string, str8_lit("table_diagnostics"), 0)) - { - result->dump_table_diagnostics = 1; - } - } - } + result->flags = P2R_ConvertFlag_All; } return result; @@ -184,7 +102,7 @@ p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline) //~ rjf: COFF <-> RADDBGI Canonical Conversions internal RDI_BinarySectionFlags -rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) +p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) { RDI_BinarySectionFlags result = 0; if(flags & COFF_SectionFlag_MEM_READ) @@ -1218,7 +1136,7 @@ internal void * p2r_udt_convert_task__entry_point(Arena *arena, void *p) { P2R_UDTConvertIn *in = (P2R_UDTConvertIn *)p; -#define p2r_type_ptr_from_itype(itype) (((itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) +#define p2r_type_ptr_from_itype(itype) ((in->itype_type_ptrs && (itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) RDIM_UDTChunkList *udts = push_array(arena, RDIM_UDTChunkList, 1); RDI_U64 udts_chunk_cap = 1024; ProfScope("convert UDT info") @@ -1844,7 +1762,7 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) { Temp scratch = scratch_begin(&arena, 1); P2R_SymbolStreamConvertIn *in = (P2R_SymbolStreamConvertIn *)p; -#define p2r_type_ptr_from_itype(itype) (((itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) +#define p2r_type_ptr_from_itype(itype) ((in->itype_type_ptrs && (itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) ////////////////////////// //- rjf: set up outputs for this sym stream @@ -2223,6 +2141,7 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) local->type = type; // rjf: add location info to local + if(type != 0) { // rjf: determine if we need an extra indirection to the value B32 extra_indirection_to_value = 0; @@ -2665,45 +2584,49 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: kickoff TPI hash parse // P2R_TPIHashParseIn tpi_hash_in = {0}; + TS_Ticket tpi_hash_ticket = {0}; { tpi_hash_in.strtbl = strtbl; tpi_hash_in.tpi = tpi; tpi_hash_in.hash_data = msf_data_from_stream(msf, tpi->hash_sn); tpi_hash_in.aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); + tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &tpi_hash_in); } - TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &tpi_hash_in); ////////////////////////////////////////////////////////////// //- rjf: kickoff TPI leaf parse // P2R_TPILeafParseIn tpi_leaf_in = {0}; + TS_Ticket tpi_leaf_ticket = {0}; { tpi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(tpi); tpi_leaf_in.itype_first = tpi->itype_first; + tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &tpi_leaf_in); } - TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &tpi_leaf_in); ////////////////////////////////////////////////////////////// //- rjf: kickoff IPI hash parse // P2R_TPIHashParseIn ipi_hash_in = {0}; + TS_Ticket ipi_hash_ticket = {0}; { ipi_hash_in.strtbl = strtbl; ipi_hash_in.tpi = ipi; ipi_hash_in.hash_data = msf_data_from_stream(msf, ipi->hash_sn); ipi_hash_in.aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); + ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &ipi_hash_in); } - TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &ipi_hash_in); ////////////////////////////////////////////////////////////// //- rjf: kickoff IPI leaf parse // P2R_TPILeafParseIn ipi_leaf_in = {0}; + TS_Ticket ipi_leaf_ticket = {0}; { ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); ipi_leaf_in.itype_first = ipi->itype_first; + ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &ipi_leaf_in); } - TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &ipi_leaf_in); ////////////////////////////////////////////////////////////// //- rjf: kickoff top-level global symbol stream parse @@ -2840,7 +2763,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) char *name_opl = name_first + sizeof(coff_ptr->name); RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections); sec->name = str8_cstring_capped(name_first, name_opl); - sec->flags = rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); + sec->flags = p2r_rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); sec->voff_first = coff_ptr->voff; sec->voff_opl = coff_ptr->voff+coff_ptr->vsize; sec->foff_first = coff_ptr->foff; @@ -2922,11 +2845,13 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // possible, and so this map can be used to do that in subsequent stages. // CV_TypeId *itype_fwd_map = 0; - CV_TypeId itype_first = tpi_leaf->itype_first; - CV_TypeId itype_opl = tpi_leaf->itype_opl; - ProfScope("types pass 1: produce type forward resolution map") + CV_TypeId itype_first = 0; + CV_TypeId itype_opl = 0; + if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 1: produce type forward resolution map") { //- rjf: allocate forward resolution map + itype_first = tpi_leaf->itype_first; + itype_opl = tpi_leaf->itype_opl; itype_fwd_map = push_array(arena, CV_TypeId, (U64)itype_opl); //- rjf: kick off tasks to fill forward resolution map @@ -2963,7 +2888,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // as such, always show up *earlier* in the actually built types. // P2R_TypeIdChain **itype_chains = 0; - ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") + if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") { //- rjf: allocate itype chain table itype_chains = push_array(arena, P2R_TypeIdChain *, (U64)itype_opl); @@ -3000,8 +2925,8 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // RDIM_Type **itype_type_ptrs = 0; RDIM_TypeChunkList all_types = {0}; -#define p2r_type_ptr_from_itype(itype) (((itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) - ProfScope("types pass 3: construct all root/stub types from TPI") +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 3: construct all root/stub types from TPI") { itype_type_ptrs = push_array(arena, RDIM_Type *, (U64)(itype_opl)); for(CV_TypeId root_itype = 0; root_itype < itype_opl; root_itype += 1) @@ -3425,7 +3350,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) U64 udt_tasks_count = ((U64)itype_opl+(udt_task_size_itypes-1))/udt_task_size_itypes; P2R_UDTConvertIn *udt_tasks_inputs = push_array(scratch.arena, P2R_UDTConvertIn, udt_tasks_count); TS_Ticket *udt_tasks_tickets = push_array(scratch.arena, TS_Ticket, udt_tasks_count); - ProfScope("types pass 4: kick off UDT build") + if(in->flags & P2R_ConvertFlag_UDTs) ProfScope("types pass 4: kick off UDT build") { for(U64 idx = 0; idx < udt_tasks_count; idx += 1) { diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 9384bcb1..ff385d2d 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -7,6 +7,14 @@ //////////////////////////////// //~ rjf: Conversion Stage Inputs/Outputs +typedef U32 P2R_ConvertFlags; +enum +{ + P2R_ConvertFlag_Types = (1<<0), + P2R_ConvertFlag_UDTs = (1<<1), + P2R_ConvertFlag_All = 0xffffffff, +}; + typedef struct P2R_User2Convert P2R_User2Convert; struct P2R_User2Convert { @@ -15,24 +23,7 @@ struct P2R_User2Convert String8 input_exe_name; String8 input_exe_data; String8 output_name; - struct - { - B8 input; - B8 output; - B8 parsing; - B8 converting; - } hide_errors; - B8 dump; - B8 dump__first; - B8 dump_coff_sections; - B8 dump_msf; - B8 dump_sym; - B8 dump_tpi_hash; - B8 dump_leaf; - B8 dump_c13; - B8 dump_contributions; - B8 dump_table_diagnostics; - B8 dump__last; + P2R_ConvertFlags flags; String8List errors; }; @@ -392,7 +383,7 @@ internal P2R_User2Convert *p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cm //////////////////////////////// //~ rjf: COFF => RADDBGI Canonical Conversions -internal RDI_BinarySectionFlags rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); +internal RDI_BinarySectionFlags p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); //////////////////////////////// //~ rjf: CodeView => RADDBGI Canonical Conversions diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index 42ed46b5..b44b8657 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -55,7 +55,7 @@ entry_point(CmdLine *cmdline) P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); //- rjf: display errors with input - if(user2convert->errors.node_count > 0 && !user2convert->hide_errors.input) + if(user2convert->errors.node_count > 0) { for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) { From 70d004e5d3204e35dbaf90882f6078c8fcf58dfe Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Feb 2024 16:49:57 -0800 Subject: [PATCH 150/275] clean up command line arguments & help in converters --- src/base/base_strings.c | 58 +++++++++++++++++++ src/base/base_strings.h | 5 ++ .../breakpad_from_pdb_main.c | 28 +++++++-- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 27 +++++++-- 4 files changed, 110 insertions(+), 8 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index f213187b..dffc8da4 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1565,6 +1565,64 @@ string_from_elapsed_time(Arena *arena, DateTime dt){ return(result); } +//////////////////////////////// +//~ rjf: Textual String Wrapping + +internal String8List +wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent) +{ + String8List list = {0}; + Rng1U64 line_range = r1u64(0, 0); + U64 wrapped_indent_level = 0; + static char *spaces = " "; + for (U64 idx = 0; idx <= string.size; idx += 1){ + U8 chr = idx < string.size ? string.str[idx] : 0; + if (chr == '\n'){ + Rng1U64 candidate_line_range = line_range; + candidate_line_range.max = idx; + // NOTE(nick): when wrapping is interrupted with \n we emit a string without including \n + // because later tool_fprint_list inserts separator after each node + // except for last node, so don't strip last \n. + if (idx + 1 == string.size){ + candidate_line_range.max += 1; + } + String8 substr = str8_substr(string, candidate_line_range); + str8_list_push(arena, &list, substr); + line_range = r1u64(idx+1,idx+1); + } + else + if (char_is_space(chr) || chr == 0){ + Rng1U64 candidate_line_range = line_range; + candidate_line_range.max = idx; + String8 substr = str8_substr(string, candidate_line_range); + U64 width_this_line = max_width-wrapped_indent_level; + if (list.node_count == 0){ + width_this_line = first_line_max_width; + } + if (substr.size > width_this_line){ + String8 line = str8_substr(string, line_range); + if (wrapped_indent_level > 0){ + line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); + } + str8_list_push(arena, &list, line); + line_range = r1u64(line_range.max+1, candidate_line_range.max); + wrapped_indent_level = ClampTop(64, wrap_indent); + } + else{ + line_range = candidate_line_range; + } + } + } + if (line_range.min < string.size && line_range.max > line_range.min){ + String8 line = str8_substr(string, line_range); + if (wrapped_indent_level > 0){ + line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); + } + str8_list_push(arena, &list, line); + } + return list; +} + //////////////////////////////// //~ rjf: String <-> Color diff --git a/src/base/base_strings.h b/src/base/base_strings.h index cfce641e..e4261089 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -326,6 +326,11 @@ internal String8 push_date_time_string(Arena *arena, DateTime *date_time); internal String8 push_file_name_date_time_string(Arena *arena, DateTime *date_time); internal String8 string_from_elapsed_time(Arena *arena, DateTime dt); +//////////////////////////////// +//~ rjf: Textual String Wrapping + +internal String8List wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent); + //////////////////////////////// //~ rjf: String <-> Color diff --git a/src/breakpad_from_pdb/breakpad_from_pdb_main.c b/src/breakpad_from_pdb/breakpad_from_pdb_main.c index 64df40c2..09adf58c 100644 --- a/src/breakpad_from_pdb/breakpad_from_pdb_main.c +++ b/src/breakpad_from_pdb/breakpad_from_pdb_main.c @@ -197,16 +197,36 @@ entry_point(CmdLine *cmdline) { //- rjf: initialize state, unpack command line Arena *arena = arena_alloc(); + B32 do_help = (cmd_line_has_flag(cmdline, str8_lit("help")) || + cmd_line_has_flag(cmdline, str8_lit("h")) || + cmd_line_has_flag(cmdline, str8_lit("?"))); P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); user2convert->flags &= ~(P2R_ConvertFlag_Types|P2R_ConvertFlag_UDTs); - //- rjf: display errors with input - if(user2convert->errors.node_count > 0) + //- rjf: display help + if(do_help || user2convert->errors.node_count != 0) { - for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) + fprintf(stderr, "--- breakpad_from_pdb ---------------------------------------------------------\n\n"); + + fprintf(stderr, "This utility converts debug information from PDBs into the textual Breakpad\n"); + fprintf(stderr, "symbol information format, used for various external utilities. The following\n"); + fprintf(stderr, "arguments are accepted:\n\n"); + + fprintf(stderr, "--exe: [optional] Specifies the path of the executable file for which the\n"); + fprintf(stderr, " debug info was generated.\n"); + fprintf(stderr, "--pdb: Specifies the path of the PDB debug info file to\n"); + fprintf(stderr, " convert.\n"); + fprintf(stderr, "--out: Specifies the path at which the output Breakpad debug\n"); + fprintf(stderr, " info will be written.\n\n"); + + if(!do_help) { - fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); + for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) + { + fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); + } } + os_exit_process(0); } //- rjf: convert diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index b44b8657..f553a268 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -52,15 +52,34 @@ entry_point(CmdLine *cmdline) { //- rjf: initialize state, unpack command line Arena *arena = arena_alloc(); + B32 do_help = (cmd_line_has_flag(cmdline, str8_lit("help")) || + cmd_line_has_flag(cmdline, str8_lit("h")) || + cmd_line_has_flag(cmdline, str8_lit("?"))); P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); - //- rjf: display errors with input - if(user2convert->errors.node_count > 0) + //- rjf: display help + if(do_help || user2convert->errors.node_count != 0) { - for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) + fprintf(stderr, "--- raddbgi_from_pdb ----------------------------------------------------------\n\n"); + + fprintf(stderr, "This utility converts debug information from PDBs into the RAD Debug Info.\n"); + fprintf(stderr, "format. The following arguments are accepted:\n\n"); + + fprintf(stderr, "--exe: [optional] Specifies the path of the executable file for which the\n"); + fprintf(stderr, " debug info was generated.\n"); + fprintf(stderr, "--pdb: Specifies the path of the PDB debug info file to\n"); + fprintf(stderr, " convert.\n"); + fprintf(stderr, "--out: Specifies the path at which the output Breakpad debug\n"); + fprintf(stderr, " info will be written.\n\n"); + + if(!do_help) { - fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); + for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) + { + fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); + } } + os_exit_process(0); } //- rjf: convert From bb0ebb5df259016292ac66743bc1abe944ac35b3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Feb 2024 17:01:52 -0800 Subject: [PATCH 151/275] raddbgi prefix on breakpad converter --- build.bat | 22 +++++++++---------- project.4coder | 2 +- .../raddbgi_breakpad_from_pdb_main.c} | 8 +++---- 3 files changed, 16 insertions(+), 16 deletions(-) rename src/{breakpad_from_pdb/breakpad_from_pdb_main.c => raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c} (97%) diff --git a/build.bat b/build.bat index 06c265b2..348d870e 100644 --- a/build.bat +++ b/build.bat @@ -96,17 +96,17 @@ if not "%no_meta%"=="1" ( :: --- Build Everything (@build_targets) -------------------------------------- pushd build -if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg_main.cpp %compile_link% %out%raddbg.exe || exit /b 1 -if "%raddbgi_from_pdb%"=="1" %compile% ..\src\raddbgi_from_pdb\raddbgi_from_pdb_main.c %compile_link% %out%raddbgi_from_pdb.exe || exit /b 1 -if "%raddbgi_from_dwarf%"=="1" %compile% ..\src\raddbgi_from_dwarf\raddbgi_from_dwarf.c %compile_link% %out%raddbgi_from_dwarf.exe || exit /b 1 -if "%raddbgi_dump%"=="1" %compile% ..\src\raddbgi_dump\raddbgi_dump_main.c %compile_link% %out%raddbgi_dump.exe || exit /b 1 -if "%breakpad_from_pdb%"=="1" %compile% ..\src\breakpad_from_pdb\breakpad_from_pdb_main.c %compile_link% %out%breakpad_from_pdb.exe || exit /b 1 -if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 -if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe || exit /b 1 -if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe || exit /b 1 -if "%mule_main%"=="1" del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %out%mule_main.exe || exit /b 1 -if "%mule_module%"=="1" %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1 -if "%mule_hotload%"=="1" %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 +if "%raddbg%"=="1" %compile% %gfx% ..\src\raddbg\raddbg_main.cpp %compile_link% %out%raddbg.exe || exit /b 1 +if "%raddbgi_from_pdb%"=="1" %compile% ..\src\raddbgi_from_pdb\raddbgi_from_pdb_main.c %compile_link% %out%raddbgi_from_pdb.exe || exit /b 1 +if "%raddbgi_from_dwarf%"=="1" %compile% ..\src\raddbgi_from_dwarf\raddbgi_from_dwarf.c %compile_link% %out%raddbgi_from_dwarf.exe || exit /b 1 +if "%raddbgi_dump%"=="1" %compile% ..\src\raddbgi_dump\raddbgi_dump_main.c %compile_link% %out%raddbgi_dump.exe || exit /b 1 +if "%raddbgi_breakpad_from_pdb%"=="1" %compile% ..\src\raddbgi_breakpad_from_pdb\raddbgi_breakpad_from_pdb_main.c %compile_link% %out%raddbgi_breakpad_from_pdb.exe || exit /b 1 +if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 +if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe || exit /b 1 +if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe || exit /b 1 +if "%mule_main%"=="1" del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %out%mule_main.exe || exit /b 1 +if "%mule_module%"=="1" %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1 +if "%mule_hotload%"=="1" %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 popd :: --- Unset ------------------------------------------------------------------ diff --git a/project.4coder b/project.4coder index 6083d5e2..e60b2c2a 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build breakpad_from_pdb telemetry release", + .win = "build raddbgi_breakpad_from_pdb telemetry release", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/breakpad_from_pdb/breakpad_from_pdb_main.c b/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c similarity index 97% rename from src/breakpad_from_pdb/breakpad_from_pdb_main.c rename to src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c index 09adf58c..35312932 100644 --- a/src/breakpad_from_pdb/breakpad_from_pdb_main.c +++ b/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c @@ -5,7 +5,7 @@ #define BUILD_VERSION_MINOR 9 #define BUILD_VERSION_PATCH 8 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" -#define BUILD_TITLE "breakpad_from_pdb" +#define BUILD_TITLE "raddbgi_breakpad_from_pdb" #define BUILD_CONSOLE_INTERFACE 1 //////////////////////////////// @@ -206,11 +206,11 @@ entry_point(CmdLine *cmdline) //- rjf: display help if(do_help || user2convert->errors.node_count != 0) { - fprintf(stderr, "--- breakpad_from_pdb ---------------------------------------------------------\n\n"); + fprintf(stderr, "--- raddbgi_breakpad_from_pdb -------------------------------------------------\n\n"); fprintf(stderr, "This utility converts debug information from PDBs into the textual Breakpad\n"); - fprintf(stderr, "symbol information format, used for various external utilities. The following\n"); - fprintf(stderr, "arguments are accepted:\n\n"); + fprintf(stderr, "symbol information format, used for various external utilities, using the RAD\n"); + fprintf(stderr, "Debug Info conversion systems. The following arguments are accepted:\n\n"); fprintf(stderr, "--exe: [optional] Specifies the path of the executable file for which the\n"); fprintf(stderr, " debug info was generated.\n"); From 56690a703f8efc439464653319bbb823540742ab Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 27 Feb 2024 06:35:11 -0800 Subject: [PATCH 152/275] fix padding insertion pass over members gathering --- src/type_graph/type_graph.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c index da172b03..30661277 100644 --- a/src/type_graph/type_graph.c +++ b/src/type_graph/type_graph.c @@ -1091,11 +1091,11 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd { if(members.count+padding_idx > n->prev_member_idx+1) { - MemoryCopy(new_members.v + n->prev_member_idx + 2, - new_members.v + n->prev_member_idx + 1, - sizeof(TG_Member) * (members.count + padding_idx - (n->prev_member_idx+1))); + MemoryCopy(new_members.v + n->prev_member_idx + padding_idx + 2, + new_members.v + n->prev_member_idx + padding_idx + 1, + sizeof(TG_Member) * (members.count + padding_idx - (n->prev_member_idx + padding_idx + 1))); } - TG_Member *padding_member = &new_members.v[n->prev_member_idx+1]; + TG_Member *padding_member = &new_members.v[n->prev_member_idx+padding_idx+1]; MemoryZeroStruct(padding_member); padding_member->kind = TG_MemberKind_Padding; padding_member->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_U8), n->size); From 0916c2a3c8cf0a86dce41c7e4f53082c7da036e7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 28 Feb 2024 13:27:48 -0800 Subject: [PATCH 153/275] first pass at bake string chunk list, bake string chunk list map, and bake string chunk list sorting paths/datastructures - basic machinery for going wide on the string/name map builds --- project.4coder | 2 +- src/lib_raddbgi_make/raddbgi_make.c | 178 ++++++++++++++++++++++++++-- src/lib_raddbgi_make/raddbgi_make.h | 50 +++++++- 3 files changed, 217 insertions(+), 13 deletions(-) diff --git a/project.4coder b/project.4coder index e60b2c2a..cf8cfd08 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build raddbgi_breakpad_from_pdb telemetry release", + .win = "build raddbgi_from_pdb telemetry debug", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 7ac16ff6..d231020a 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1212,6 +1212,167 @@ rdim_bake_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_So //////////////////////////////// //~ rjf: [Baking Helpers] Interned / Deduplicated Blob Data Structure Helpers +//- rjf: bake string chunk lists + +RDI_PROC RDIM_BakeString * +rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *list, RDI_U64 cap) +{ + RDIM_BakeStringChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_BakeStringChunkNode, 1); + n->cap = cap; + n->v = rdim_push_array(arena, RDIM_BakeString, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_BakeString *s = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return s; +} + +RDI_PROC void +rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC RDIM_BakeStringChunkList +rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src) +{ + //- rjf: produce unsorted destination list with single chunk node + RDIM_BakeStringChunkList dst = {0}; + for(RDIM_BakeStringChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDIM_BakeString *src_str = &n->v[idx]; + RDIM_BakeString *dst_str = rdim_bake_string_chunk_list_push(arena, &dst, src->total_count); + rdim_memcpy_struct(dst_str, src_str); + } + } + + //- rjf: sort chunk node + if(dst.first != 0) + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + typedef struct SortTask SortTask; + struct SortTask + { + SortTask *next; + RDI_U64 string_off; + RDIM_BakeString *v; + RDI_U64 count; + }; + SortTask start_task = {0, 0, dst.first->v, dst.first->count}; + SortTask *first_task = &start_task; + SortTask *last_task = &start_task; + + //- rjf: for each sort task range: + for(SortTask *t = first_task; t != 0; t = t->next) + { + //- rjf: loop through range, drop each element into bucket according to byte in string at task offset + RDIM_BakeStringChunkList *buckets = rdim_push_array(scratch.arena, RDIM_BakeStringChunkList, 256); + for(RDI_U64 idx = 0; idx < t->count; idx += 1) + { + U8 byte = t->string_off < t->v[idx].string.size ? t->v[idx].string.str[t->string_off] : 0; + RDIM_BakeStringChunkList *bucket = &buckets[byte]; + RDIM_BakeString *bstr = rdim_bake_string_chunk_list_push(scratch.arena, bucket, 8); + rdim_memcpy_struct(bstr, &t->v[idx]); + } + + //- rjf: in-place mutate the original source array to reflect the order per the buckets. + // build new sort tasks for buckets with many elements + { + RDI_U64 write_idx = 0; + for(U64 bucket_idx = 0; bucket_idx < 256; bucket_idx += 1) + { + // rjf: write each chunk node's array into original array, detect if there is size left to sort + RDI_U64 bucket_base_idx = write_idx; + RDI_U64 max_size_left_to_sort = 0; + for(RDIM_BakeStringChunkNode *n = buckets[bucket_idx].first; n != 0; n = n->next) + { + rdim_memcpy(t->v+write_idx, n->v, sizeof(n->v[0])*n->count); + write_idx += n->count; + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + if(n->v[idx].string.size > t->string_off+1) + { + max_size_left_to_sort = Max(max_size_left_to_sort, (n->v[idx].string.size - t->string_off+1)); + } + } + } + + // rjf: if any bucket has >1 element & has some amount of size left to sort, push new task for this + // bucket's region in the array, and for remainder of keys + if(buckets[bucket_idx].total_count > 1 && max_size_left_to_sort > 0) + { + SortTask *new_task = rdim_push_array(scratch.arena, SortTask, 1); + RDIM_SLLQueuePush(first_task, last_task, new_task); + new_task->string_off = t->string_off+1; + new_task->v = t->v + bucket_base_idx; + new_task->count = write_idx-bucket_base_idx; + } + } + } + } + scratch_end(scratch); + } + + return dst; +} + +//- rjf: bake string chunk list maps + +RDI_PROC void +rdim_bake_string_chunk_list_map_insert(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map, RDI_U64 chunk_cap, RDIM_String8 string) +{ + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map_topology->slots_count; + RDIM_BakeStringChunkList *slot = &map->slots[slot_idx]; + RDI_S32 is_duplicate = 0; + for(RDIM_BakeStringChunkNode *n = slot->first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + if(rdim_str8_match(n->v[idx].string, string, 0)) + { + is_duplicate = 1; + goto break_all; + } + } + } + break_all:; + if(!is_duplicate) + { + RDIM_BakeString *bstr = rdim_bake_string_chunk_list_push(arena, slot, chunk_cap); + bstr->string = string; + bstr->hash = hash; + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_join_in_place(RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *dst, RDIM_BakeStringChunkListMap *src) +{ + for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) + { + rdim_bake_string_chunk_list_concat_in_place(&dst->slots[idx], &src->slots[idx]); + } + rdim_memzero_struct(src); +} + //- rjf: bake string map reading/writing RDI_PROC RDI_U32 @@ -1224,7 +1385,7 @@ rdim_bake_idx_from_string(RDIM_BakeStringMap *map, RDIM_String8 string) RDIM_BakeStringNode *node = 0; for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) { - if(n->hash == hash && rdim_str8_match(n->string, string, 0)) + if(n->v.hash == hash && rdim_str8_match(n->v.string, string, 0)) { node = n; break; @@ -1246,7 +1407,7 @@ rdim_bake_string_map_insert(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_Str RDIM_BakeStringNode *node = 0; for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) { - if(n->hash == hash && rdim_str8_match(n->string, string, 0)) + if(n->v.hash == hash && rdim_str8_match(n->v.string, string, 0)) { node = n; break; @@ -1257,13 +1418,12 @@ rdim_bake_string_map_insert(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_Str if(node == 0) { node = rdim_push_array(arena, RDIM_BakeStringNode, 1); - node->string = string; - node->hash = hash; - node->idx = map->count; + node->v.string = string; + node->v.hash = hash; + node->idx = map->count; map->count += 1; RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); - map->slot_collision_count += (node->hash_next != 0); } // rjf: node -> index @@ -3277,7 +3437,7 @@ rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeString node != 0; node = node->order_next) { - off_cursor += node->string.size; + off_cursor += node->v.string.size; *off_ptr = off_cursor; off_ptr += 1; } @@ -3289,8 +3449,8 @@ rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeString node != 0; node = node->order_next) { - rdim_memcpy(ptr, node->string.str, node->string.size); - ptr += node->string.size; + rdim_memcpy(ptr, node->v.string.str, node->v.string.size); + ptr += node->v.string.size; } } rdim_bake_section_list_push_new(arena, §ions, str_offs, sizeof(RDI_U32)*(strings->count+1), RDI_DataSectionTag_StringTable, 0); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index eac2487a..5eda2326 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -840,13 +840,49 @@ struct RDIM_BakeSectionList //- rjf: interned strings +typedef struct RDIM_BakeString RDIM_BakeString; +struct RDIM_BakeString +{ + RDIM_String8 string; + RDI_U64 hash; +}; + +typedef struct RDIM_BakeStringChunkNode RDIM_BakeStringChunkNode; +struct RDIM_BakeStringChunkNode +{ + RDIM_BakeStringChunkNode *next; + RDIM_BakeString *v; + RDI_U64 count; + RDI_U64 cap; +}; + +typedef struct RDIM_BakeStringChunkList RDIM_BakeStringChunkList; +struct RDIM_BakeStringChunkList +{ + RDIM_BakeStringChunkNode *first; + RDIM_BakeStringChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +typedef struct RDIM_BakeStringChunkListMapTopology RDIM_BakeStringChunkListMapTopology; +struct RDIM_BakeStringChunkListMapTopology +{ + RDI_U64 slots_count; +}; + +typedef struct RDIM_BakeStringChunkListMap RDIM_BakeStringChunkListMap; +struct RDIM_BakeStringChunkListMap +{ + RDIM_BakeStringChunkList *slots; +}; + typedef struct RDIM_BakeStringNode RDIM_BakeStringNode; struct RDIM_BakeStringNode { RDIM_BakeStringNode *hash_next; RDIM_BakeStringNode *order_next; - RDIM_String8 string; - RDI_U64 hash; + RDIM_BakeString v; RDI_U32 idx; }; @@ -857,7 +893,6 @@ struct RDIM_BakeStringMap RDIM_BakeStringNode *order_last; RDIM_BakeStringNode **slots; RDI_U64 slots_count; - RDI_U64 slot_collision_count; RDI_U32 count; }; @@ -1096,6 +1131,15 @@ RDI_PROC RDIM_BakeVMap rdim_bake_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapM //////////////////////////////// //~ rjf: [Baking Helpers] Interned / Deduplicated Blob Data Structure Helpers +//- rjf: bake string chunk lists +RDI_PROC RDIM_BakeString *rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *list, RDI_U64 cap); +RDI_PROC void rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push); +RDI_PROC RDIM_BakeStringChunkList rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src); + +//- rjf: bake string chunk list maps +RDI_PROC void rdim_bake_string_chunk_list_map_insert(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map, RDI_U64 chunk_cap, RDIM_String8 string); +RDI_PROC void rdim_bake_string_chunk_list_map_join_in_place(RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *dst, RDIM_BakeStringChunkListMap *src); + //- 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); From e94b5307587949636121fbcc8802b3b1b1e5d1eb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 28 Feb 2024 15:51:17 -0800 Subject: [PATCH 154/275] new bake string map gathering/merging passes & async usage in converter --- src/lib_raddbgi_make/raddbgi_make.c | 306 +++++++++++++++++++++--- src/lib_raddbgi_make/raddbgi_make.h | 78 ++++-- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 213 +++++++++++++++-- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 92 ++++++- src/task_system/task_system.c | 2 +- 5 files changed, 610 insertions(+), 81 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index d231020a..0bb8b253 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1227,6 +1227,7 @@ rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *li list->chunk_count += 1; } RDIM_BakeString *s = &n->v[n->count]; + s->chunk = n; n->count += 1; list->total_count += 1; return s; @@ -1235,6 +1236,10 @@ rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *li RDI_PROC void rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push) { + for(RDIM_BakeStringChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } if(dst->last != 0 && to_push->first != 0) { dst->last->next = to_push->first; @@ -1336,12 +1341,24 @@ rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStr //- rjf: bake string chunk list maps +RDI_PROC RDIM_BakeStringChunkListMap * +rdim_bake_string_chunk_list_map_make(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top) +{ + RDIM_BakeStringChunkListMap *map = rdim_push_array(arena, RDIM_BakeStringChunkListMap, 1); + map->slots = rdim_push_array(arena, RDIM_BakeStringChunkList *, top->slots_count); + return map; +} + RDI_PROC void rdim_bake_string_chunk_list_map_insert(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map, RDI_U64 chunk_cap, RDIM_String8 string) { RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); RDI_U64 slot_idx = hash%map_topology->slots_count; - RDIM_BakeStringChunkList *slot = &map->slots[slot_idx]; + RDIM_BakeStringChunkList *slot = map->slots[slot_idx]; + if(slot == 0) + { + slot = map->slots[slot_idx] = rdim_push_array(arena, RDIM_BakeStringChunkList, 1); + } RDI_S32 is_duplicate = 0; for(RDIM_BakeStringChunkNode *n = slot->first; n != 0; n = n->next) { @@ -1368,15 +1385,80 @@ rdim_bake_string_chunk_list_map_join_in_place(RDIM_BakeStringChunkListMapTopolog { for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) { - rdim_bake_string_chunk_list_concat_in_place(&dst->slots[idx], &src->slots[idx]); + if(dst->slots[idx] == 0) + { + dst->slots[idx] = src->slots[idx]; + } + else if(src->slots[idx] != 0) + { + rdim_bake_string_chunk_list_concat_in_place(dst->slots[idx], src->slots[idx]); + } } rdim_memzero_struct(src); } +RDI_PROC RDIM_BakeStringChunkListMapBaseIndices +rdim_bake_string_chunk_list_base_indices_from_map(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map) +{ + RDIM_BakeStringChunkListMapBaseIndices indices = {0}; + indices.slots_base_idxs = rdim_push_array(arena, RDI_U64, map_topology->slots_count+1); + RDI_U64 total_count = 0; + for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) + { + indices.slots_base_idxs[idx] += total_count; + if(map->slots[idx] != 0) + { + total_count += map->slots[idx]->total_count; + } + } + indices.slots_base_idxs[map_topology->slots_count] = total_count; + return indices; +} + +//- rjf: finalized bake string map + +RDI_PROC RDIM_BakeStringMapFinal +rdim_bake_string_map_final_from_chunk_list_map(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMapBaseIndices *map_base_indices, RDIM_BakeStringChunkListMap *map) +{ + RDIM_BakeStringMapFinal m = {0}; + m.slots_count = map_topology->slots_count; + m.slots = rdim_push_array(arena, RDIM_BakeStringChunkList, m.slots_count); + m.slots_base_idxs = map_base_indices->slots_base_idxs; + for(RDI_U64 idx = 0; idx < m.slots_count; idx += 1) + { + if(map->slots[idx] != 0) + { + rdim_memcpy_struct(&m.slots[idx], map->slots[idx]); + } + } + m.total_count = m.slots_base_idxs[m.slots_count]; + return m; +} + +RDI_PROC RDI_U64 +rdim_bake_idx_from_string(RDIM_BakeStringMapFinal *map, RDIM_String8 string) +{ + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + RDI_U64 idx = 0; + for(RDIM_BakeStringChunkNode *n = map->slots[slot_idx].first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + if(n->v[chunk_idx].hash == hash && rdim_str8_match(n->v[chunk_idx].string, string, 0)) + { + idx = map->slots_base_idxs[slot_idx] + n->base_idx + chunk_idx; + break; + } + } + } + return idx; +} + //- rjf: bake string map reading/writing RDI_PROC RDI_U32 -rdim_bake_idx_from_string(RDIM_BakeStringMap *map, RDIM_String8 string) +rdim_bake_idx_from_string_OLD(RDIM_BakeStringMap *map, RDIM_String8 string) { RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); RDI_U64 slot_idx = hash%map->slots_count; @@ -1750,6 +1832,160 @@ rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSecti //////////////////////////////// //~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures +//- rjf: basic bake string gathering passes + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TopLevelInfo *tli) +{ + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, tli->exe_name); +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BinarySectionList *secs) +{ + for(RDIM_BinarySectionNode *n = secs->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, n->v.name); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BakePathTree *path_tree) +{ + for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, n->name); + } +} + +//- rjf: chunk-granularity bake string gathering passes + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_src_file_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkNode *chunk) +{ + for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, chunk->v[idx].normal_full_path); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_unit_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UnitChunkNode *chunk) +{ + for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].unit_name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].compiler_name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].source_file); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].object_file); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].archive_file); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].build_path); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_type_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TypeChunkNode *chunk) +{ + for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, chunk->v[idx].name); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_udt_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDTChunkNode *chunk) +{ + for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + { + for(RDIM_UDTMember *mem = chunk->v[idx].first_member; mem != 0; mem = mem->next) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, mem->name); + } + for(RDIM_UDTEnumVal *mem = chunk->v[idx].first_enum_val; mem != 0; mem = mem->next) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, mem->name); + } + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_symbol_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SymbolChunkNode *chunk) +{ + for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, chunk->v[idx].name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, chunk->v[idx].link_name); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_scope_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_ScopeChunkNode *chunk) +{ + for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + { + for(RDIM_Local *local = chunk->v[idx].first_local; local != 0; local = local->next) + { + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, local->name); + } + } +} + +//- rjf: list-granularity bake string gathering passes + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_src_files(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkList *list) +{ + for(RDIM_SrcFileChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_src_file_chunk(arena, top, map, n); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_units(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UnitChunkList *list) +{ + for(RDIM_UnitChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_unit_chunk(arena, top, map, n); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_types(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TypeChunkList *list) +{ + for(RDIM_TypeChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_type_chunk(arena, top, map, n); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_udts(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDTChunkList *list) +{ + for(RDIM_UDTChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_udt_chunk(arena, top, map, n); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_symbols(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SymbolChunkList *list) +{ + for(RDIM_SymbolChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_symbol_chunk(arena, top, map, n); + } +} + +RDI_PROC void +rdim_bake_string_chunk_list_map_push_scopes(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_ScopeChunkList *list) +{ + for(RDIM_ScopeChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_scope_chunk(arena, top, map, n); + } +} + //- rjf: bake string map from params RDI_PROC RDIM_BakeStringMap * @@ -2091,7 +2327,7 @@ rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //- 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) +rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; RDI_TopLevelInfo *dst_tli = rdim_push_array(arena, RDI_TopLevelInfo, 1); @@ -2107,7 +2343,7 @@ rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeSt //- rjf: binary sections RDI_PROC RDIM_BakeSectionList -rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) +rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; RDIM_BinarySectionList *src_list = ¶ms->binary_sections; @@ -2255,7 +2491,7 @@ rdim_bake_section_list_from_unit(RDIM_Arena *arena, RDIM_Unit *unit) } RDI_PROC RDIM_BakeSectionList -rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) +rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, params->units.total_count+1); @@ -2479,7 +2715,7 @@ rdim_bake_unit_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams //- 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) +rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; @@ -2665,7 +2901,7 @@ rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMa //- 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_BakeParams *params) +rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params) { //- rjf: build all type nodes RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count+1); @@ -2738,7 +2974,7 @@ rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM //- rjf: UDTs RDI_PROC RDIM_BakeSectionList -rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) +rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) { //- rjf: build tables RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count+1); @@ -2808,7 +3044,7 @@ rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *st //- rjf: global variables RDI_PROC RDIM_BakeSectionList -rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) +rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) { //- rjf: build all global variables RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count+1); @@ -2929,7 +3165,7 @@ rdim_bake_global_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParam //- rjf: thread variables RDI_PROC RDIM_BakeSectionList -rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) +rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) { //- rjf: build all thread variables RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count+1); @@ -2971,7 +3207,7 @@ rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeS //- rjf: procedures RDI_PROC RDIM_BakeSectionList -rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) +rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) { //- rjf: build all procedures RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count+1); @@ -3014,7 +3250,7 @@ rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM //- rjf: scopes RDI_PROC RDIM_BakeSectionList -rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params) +rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -3243,7 +3479,7 @@ rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams //- rjf: name maps RDI_PROC RDIM_BakeSectionList -rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) +rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) { RDIM_BakeSectionList sections = {0}; @@ -3283,7 +3519,7 @@ rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RD } RDI_PROC RDIM_BakeSectionList -rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map) +rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map) { RDIM_BakeSectionList sections = {0}; if(map != 0 && map->name_count != 0) @@ -3389,7 +3625,7 @@ rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_Bak //- 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) +rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree) { RDI_U32 dst_nodes_count = path_tree->count; RDI_FilePathNode *dst_nodes = rdim_push_array(arena, RDI_FilePathNode, dst_nodes_count); @@ -3424,36 +3660,46 @@ rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStri //- rjf: strings RDI_PROC RDIM_BakeSectionList -rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings) +rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings) { RDIM_BakeSectionList sections = {0}; - RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, strings->count + 1); + RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, strings->total_count + 1); RDI_U32 off_cursor = 0; { RDI_U32 *off_ptr = str_offs; *off_ptr = 0; off_ptr += 1; - for(RDIM_BakeStringNode *node = strings->order_first; - node != 0; - node = node->order_next) + for(RDI_U64 slot_idx = 0; slot_idx < strings->slots_count; slot_idx += 1) { - off_cursor += node->v.string.size; - *off_ptr = off_cursor; - off_ptr += 1; + for(RDIM_BakeStringChunkNode *n = strings->slots[slot_idx].first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + RDIM_BakeString *bake_string = &n->v[chunk_idx]; + off_cursor += bake_string->string.size; + *off_ptr = off_cursor; + off_ptr += 1; + } + } } } RDI_U8 *buf = rdim_push_array(arena, RDI_U8, off_cursor); { RDI_U8 *ptr = buf; - for(RDIM_BakeStringNode *node = strings->order_first; - node != 0; - node = node->order_next) + for(RDI_U64 slot_idx = 0; slot_idx < strings->slots_count; slot_idx += 1) { - rdim_memcpy(ptr, node->v.string.str, node->v.string.size); - ptr += node->v.string.size; + for(RDIM_BakeStringChunkNode *n = strings->slots[slot_idx].first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + RDIM_BakeString *bake_string = &n->v[chunk_idx]; + rdim_memcpy(ptr, bake_string->string.str, bake_string->string.size); + ptr += bake_string->string.size; + } + } } } - rdim_bake_section_list_push_new(arena, §ions, str_offs, sizeof(RDI_U32)*(strings->count+1), RDI_DataSectionTag_StringTable, 0); + rdim_bake_section_list_push_new(arena, §ions, str_offs, sizeof(RDI_U32)*(strings->total_count+1), RDI_DataSectionTag_StringTable, 0); rdim_bake_section_list_push_new(arena, §ions, buf, off_cursor, RDI_DataSectionTag_StringData, 0); return sections; } diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 5eda2326..d978c388 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -838,13 +838,14 @@ struct RDIM_BakeSectionList RDI_U64 count; }; -//- rjf: interned strings +//- rjf: interned string type typedef struct RDIM_BakeString RDIM_BakeString; struct RDIM_BakeString { - RDIM_String8 string; + struct RDIM_BakeStringChunkNode *chunk; RDI_U64 hash; + RDIM_String8 string; }; typedef struct RDIM_BakeStringChunkNode RDIM_BakeStringChunkNode; @@ -854,6 +855,7 @@ struct RDIM_BakeStringChunkNode RDIM_BakeString *v; RDI_U64 count; RDI_U64 cap; + RDI_U64 base_idx; }; typedef struct RDIM_BakeStringChunkList RDIM_BakeStringChunkList; @@ -871,10 +873,25 @@ struct RDIM_BakeStringChunkListMapTopology RDI_U64 slots_count; }; +typedef struct RDIM_BakeStringChunkListMapBaseIndices RDIM_BakeStringChunkListMapBaseIndices; +struct RDIM_BakeStringChunkListMapBaseIndices +{ + RDI_U64 *slots_base_idxs; +}; + typedef struct RDIM_BakeStringChunkListMap RDIM_BakeStringChunkListMap; struct RDIM_BakeStringChunkListMap +{ + RDIM_BakeStringChunkList **slots; +}; + +typedef struct RDIM_BakeStringMapFinal RDIM_BakeStringMapFinal; +struct RDIM_BakeStringMapFinal { RDIM_BakeStringChunkList *slots; + RDI_U64 *slots_base_idxs; + RDI_U64 slots_count; + RDI_U64 total_count; }; typedef struct RDIM_BakeStringNode RDIM_BakeStringNode; @@ -1137,11 +1154,17 @@ RDI_PROC void rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkLi RDI_PROC RDIM_BakeStringChunkList rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src); //- rjf: bake string chunk list maps +RDI_PROC RDIM_BakeStringChunkListMap *rdim_bake_string_chunk_list_map_make(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top); RDI_PROC void rdim_bake_string_chunk_list_map_insert(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map, RDI_U64 chunk_cap, RDIM_String8 string); RDI_PROC void rdim_bake_string_chunk_list_map_join_in_place(RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *dst, RDIM_BakeStringChunkListMap *src); +RDI_PROC RDIM_BakeStringChunkListMapBaseIndices rdim_bake_string_chunk_list_base_indices_from_map(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map); + +//- rjf: finalized bake string map +RDI_PROC RDIM_BakeStringMapFinal rdim_bake_string_map_final_from_chunk_list_map(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMapBaseIndices *map_base_indices, RDIM_BakeStringChunkListMap *map); +RDI_PROC RDI_U64 rdim_bake_idx_from_string(RDIM_BakeStringMapFinal *map, RDIM_String8 string); //- 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_idx_from_string_OLD(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 @@ -1167,6 +1190,27 @@ RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, //////////////////////////////// //~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures +//- rjf: basic bake string gathering passes +RDI_PROC void rdim_bake_string_chunk_list_map_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TopLevelInfo *tli); +RDI_PROC void rdim_bake_string_chunk_list_map_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BinarySectionList *secs); +RDI_PROC void rdim_bake_string_chunk_list_map_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BakePathTree *path_tree); + +//- rjf: chunk-granularity bake string gathering passes +RDI_PROC void rdim_bake_string_chunk_list_map_push_src_file_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkNode *chunk); +RDI_PROC void rdim_bake_string_chunk_list_map_push_unit_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UnitChunkNode *chunk); +RDI_PROC void rdim_bake_string_chunk_list_map_push_type_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TypeChunkNode *chunk); +RDI_PROC void rdim_bake_string_chunk_list_map_push_udt_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDTChunkNode *chunk); +RDI_PROC void rdim_bake_string_chunk_list_map_push_symbol_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SymbolChunkNode *chunk); +RDI_PROC void rdim_bake_string_chunk_list_map_push_scope_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_ScopeChunkNode *chunk); + +//- rjf: list-granularity bake string gathering passes +RDI_PROC void rdim_bake_string_chunk_list_map_push_src_files(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkList *list); +RDI_PROC void rdim_bake_string_chunk_list_map_push_units(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UnitChunkList *list); +RDI_PROC void rdim_bake_string_chunk_list_map_push_types(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TypeChunkList *list); +RDI_PROC void rdim_bake_string_chunk_list_map_push_udts(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDTChunkList *list); +RDI_PROC void rdim_bake_string_chunk_list_map_push_symbols(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SymbolChunkList *list); +RDI_PROC void rdim_bake_string_chunk_list_map_push_scopes(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_ScopeChunkList *list); + //- rjf: bake string map building RDI_PROC RDIM_BakeStringMap *rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params); @@ -1183,54 +1227,54 @@ RDI_PROC RDIM_BakePathTree *rdim_bake_path_tree_from_params(RDIM_Arena *arena, R //~ 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *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); +RDI_PROC RDIM_BakeSectionList rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); //- rjf: units RDI_PROC RDIM_BakeSectionList rdim_bake_section_list_from_unit(RDIM_Arena *arena, RDIM_Unit *unit); -RDI_PROC RDIM_BakeSectionList rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *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); +RDI_PROC RDIM_BakeSectionList rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *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_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params); //- rjf: UDTs -RDI_PROC RDIM_BakeSectionList rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, 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_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); //- rjf: global vmap RDI_PROC RDIM_BakeSectionList rdim_bake_global_vmap_section_list_from_params(RDIM_Arena *arena, 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_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); //- rjf: procedures -RDI_PROC RDIM_BakeSectionList rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); //- rjf: scopes -RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, 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_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); -RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map); +RDI_PROC RDIM_BakeSectionList rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); +RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map); //- 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); +RDI_PROC RDIM_BakeSectionList rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapFinal *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); +RDI_PROC RDIM_BakeSectionList rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMapFinal *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); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index b9951804..c88437e9 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3481,6 +3481,90 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //////////////////////////////// //~ rjf: Baking Stage Tasks +//- rjf: bake string map building + +internal void * +p2r_bake_src_files_strings_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)p; + RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); + ProfScope("bake src file strings") rdim_bake_string_chunk_list_map_push_src_files(arena, in->top, map, in->list); + return map; +} + +internal void * +p2r_bake_units_strings_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)p; + RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); + ProfScope("bake unit strings") rdim_bake_string_chunk_list_map_push_units(arena, in->top, map, in->list); + return map; +} + +internal void * +p2r_bake_types_strings_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)p; + RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); + ProfScope("bake type strings") rdim_bake_string_chunk_list_map_push_types(arena, in->top, map, in->list); + return map; +} + +internal void * +p2r_bake_udts_strings_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeUDTsStringsIn *in = (P2R_BakeUDTsStringsIn *)p; + RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); + ProfScope("bake udt strings") rdim_bake_string_chunk_list_map_push_udts(arena, in->top, map, in->list); + return map; +} + +internal void * +p2r_bake_symbols_strings_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)p; + RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); + ProfScope("bake symbol strings") rdim_bake_string_chunk_list_map_push_symbols(arena, in->top, map, in->list); + return map; +} + +internal void * +p2r_bake_scopes_strings_task__entry_point(Arena *arena, void *p) +{ + P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)p; + RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); + ProfScope("bake scope strings") rdim_bake_string_chunk_list_map_push_scopes(arena, in->top, map, in->list); + return map; +} + +//- rjf: bake string map sorting + +internal void * +p2r_bake_string_map_sort_task__entry_point(Arena *arena, void *p) +{ + P2R_SortBakeStringMapIn *in = (P2R_SortBakeStringMapIn *)p; + RDIM_BakeStringChunkListMap *dst = rdim_bake_string_chunk_list_map_make(arena, in->top); + ProfScope("sort bake string chunk list map") + { + for(U64 slot_idx = 0; slot_idx < in->top->slots_count; slot_idx += 1) + { + if(in->map->slots[slot_idx] != 0) + { + if(in->map->slots[slot_idx]->total_count > 1) + { + dst->slots[slot_idx] = push_array(arena, RDIM_BakeStringChunkList, 1); + *dst->slots[slot_idx] = rdim_bake_string_chunk_list_sorted_from_unsorted(arena, in->map->slots[slot_idx]); + } + else + { + dst->slots[slot_idx] = in->map->slots[slot_idx];; + } + } + } + } + return dst; +} + //- rjf: pass 1: interner/deduper map builds internal void * @@ -3666,7 +3750,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) path_tree = rdim_bake_path_tree_from_params(arena, params); } - //- rjf: kick off pass 1 tasks + //- rjf: kick off per-unit baking tasks P2R_BakeUnitIn *bake_units_in = push_array(scratch.arena, P2R_BakeUnitIn, params->units.total_count); TS_Ticket *bake_units_tickets = push_array(scratch.arena, TS_Ticket, params->units.total_count); { @@ -3680,8 +3764,80 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } } } - P2R_BuildBakeStringMapIn build_bake_string_map_in = {path_tree, params}; - TS_Ticket build_bake_string_map_ticket = ts_kickoff(p2r_build_bake_string_map_task__entry_point, 0, &build_bake_string_map_in); + + //- rjf: kick off string map building tasks + RDIM_BakeStringChunkListMapTopology bake_string_chunk_list_map_topology = {(params->procedures.total_count*2 + + params->global_variables.total_count*2 + + params->thread_variables.total_count*2 + + params->types.total_count*2)}; + TS_TicketList bake_string_map_build_tickets = {0}; + { + // rjf: src files + { + P2R_BakeSrcFilesStringsIn *in = push_array(scratch.arena, P2R_BakeSrcFilesStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->list = ¶ms->src_files; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_src_files_strings_task__entry_point, 0, in)); + } + + // rjf: units + { + P2R_BakeUnitsStringsIn *in = push_array(scratch.arena, P2R_BakeUnitsStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->list = ¶ms->units; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_units_strings_task__entry_point, 0, in)); + } + + // rjf: types + { + P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->list = ¶ms->types; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_types_strings_task__entry_point, 0, in)); + } + + // rjf: UDTs + { + P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->list = ¶ms->udts; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in)); + } + + // rjf: global variables + { + P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->list = ¶ms->global_variables; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); + } + + // rjf: thread variables + { + P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->list = ¶ms->thread_variables; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); + } + + // rjf: procedures + { + P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->list = ¶ms->procedures; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); + } + + // rjf: scope chunks + { + P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->list = ¶ms->scopes; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_scopes_strings_task__entry_point, 0, in)); + } + } + + //- rjf: kick off pass 1 tasks P2R_BuildBakeNameMapIn build_bake_name_map_in[RDI_NameMapKind_COUNT] = {0}; TS_Ticket build_bake_name_map_ticket[RDI_NameMapKind_COUNT] = {0}; for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); @@ -3693,50 +3849,65 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) build_bake_name_map_ticket[k] = ts_kickoff(p2r_build_bake_name_map_task__entry_point, 0, &build_bake_name_map_in[k]); } - //- rjf: join string map build - RDIM_BakeStringMap *strings = 0; - ProfScope("join string map build") + //- rjf: join string map building tasks + RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); + ProfScope("join string map building tasks") { - strings = ts_join_struct(build_bake_string_map_ticket, max_U64, RDIM_BakeStringMap); + for(TS_TicketNode *n = bake_string_map_build_tickets.first; n != 0; n = n->next) + { + RDIM_BakeStringChunkListMap *map = ts_join_struct(n->v, max_U64, RDIM_BakeStringChunkListMap); + rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, map); + } } + //- rjf: kick off string map sorting task + P2R_SortBakeStringMapIn sort_bake_string_map_in = {&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map}; + TS_Ticket sort_bake_string_map_ticket = ts_kickoff(p2r_bake_string_map_sort_task__entry_point, 0, &sort_bake_string_map_in); + + //- rjf: join string map sorting task + RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map = ts_join_struct(sort_bake_string_map_ticket, max_U64, RDIM_BakeStringChunkListMap); + + //- rjf: build finalized string map + RDIM_BakeStringChunkListMapBaseIndices bake_string_chunk_list_map_base_idxes = rdim_bake_string_chunk_list_base_indices_from_map(arena, &bake_string_chunk_list_map_topology, sorted_bake_string_chunk_list_map); + RDIM_BakeStringMapFinal bake_strings = rdim_bake_string_map_final_from_chunk_list_map(arena, &bake_string_chunk_list_map_topology, &bake_string_chunk_list_map_base_idxes, sorted_bake_string_chunk_list_map); + //- rjf: kick off pass 2 tasks - P2R_BakeUnitsTopLevelIn bake_units_top_level_in = {strings, path_tree, params}; + P2R_BakeUnitsTopLevelIn bake_units_top_level_in = {&bake_strings, path_tree, params}; TS_Ticket bake_units_top_level_ticket = ts_kickoff(p2r_bake_units_top_level_task__entry_point, 0, &bake_units_top_level_in); P2R_BakeUnitVMapIn bake_unit_vmap_in = {params}; TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2r_bake_unit_vmap_task__entry_point, 0, &bake_unit_vmap_in); - P2R_BakeSrcFilesIn bake_src_files_in = {strings, path_tree, params}; + P2R_BakeSrcFilesIn bake_src_files_in = {&bake_strings, path_tree, params}; TS_Ticket bake_src_files_ticket = ts_kickoff(p2r_bake_src_files_task__entry_point, 0, &bake_src_files_in); - P2R_BakeUDTsIn bake_udts_in = {strings, params}; + P2R_BakeUDTsIn bake_udts_in = {&bake_strings, params}; TS_Ticket bake_udts_ticket = ts_kickoff(p2r_bake_udts_task__entry_point, 0, &bake_udts_in); - P2R_BakeGlobalVariablesIn bake_global_variables_in = {strings, params}; + P2R_BakeGlobalVariablesIn bake_global_variables_in = {&bake_strings, params}; TS_Ticket bake_global_variables_ticket = ts_kickoff(p2r_bake_global_variables_task__entry_point, 0, &bake_global_variables_in); P2R_BakeGlobalVMapIn bake_global_vmap_in = {params}; TS_Ticket bake_global_vmap_ticket = ts_kickoff(p2r_bake_global_vmap_task__entry_point, 0, &bake_global_vmap_in); - P2R_BakeThreadVariablesIn bake_thread_variables_in = {strings, params}; + P2R_BakeThreadVariablesIn bake_thread_variables_in = {&bake_strings, params}; TS_Ticket bake_thread_variables_ticket = ts_kickoff(p2r_bake_thread_variables_task__entry_point, 0, &bake_thread_variables_in); - P2R_BakeProceduresIn bake_procedures_in = {strings, params}; + P2R_BakeProceduresIn bake_procedures_in = {&bake_strings, params}; TS_Ticket bake_procedures_ticket = ts_kickoff(p2r_bake_procedures_task__entry_point, 0, &bake_procedures_in); - P2R_BakeScopesIn bake_scopes_in = {strings, params}; + P2R_BakeScopesIn bake_scopes_in = {&bake_strings, params}; TS_Ticket bake_scopes_ticket = ts_kickoff(p2r_bake_scopes_task__entry_point, 0, &bake_scopes_in); P2R_BakeScopeVMapIn bake_scope_vmap_in = {params}; TS_Ticket bake_scope_vmap_ticket = ts_kickoff(p2r_bake_scope_vmap_task__entry_point, 0, &bake_scope_vmap_in); - P2R_BakeFilePathsIn bake_file_paths_in = {strings, path_tree}; + P2R_BakeFilePathsIn bake_file_paths_in = {&bake_strings, path_tree}; TS_Ticket bake_file_paths_ticket = ts_kickoff(p2r_bake_file_paths_task__entry_point, 0, &bake_file_paths_in); - P2R_BakeStringsIn bake_strings_in = {strings}; + P2R_BakeStringsIn bake_strings_in = {&bake_strings}; TS_Ticket bake_strings_ticket = ts_kickoff(p2r_bake_strings_task__entry_point, 0, &bake_strings_in); //- rjf: top-level info ProfScope("top level info") { - RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, strings, params); + RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, &bake_strings, params); rdim_bake_section_list_concat_in_place(§ions, &s); } //- rjf: binary sections ProfScope("binary sections") { - RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, strings, params); + RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, &bake_strings, params); rdim_bake_section_list_concat_in_place(§ions, &s); } @@ -3760,7 +3931,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } //- rjf: kick off pass 3 tasks - P2R_BakeTypeNodesIn bake_type_nodes_in = {strings, idx_runs, params}; + P2R_BakeTypeNodesIn bake_type_nodes_in = {&bake_strings, idx_runs, params}; TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, 0, &bake_type_nodes_in); TS_TicketList bake_name_maps_tickets = {0}; for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); @@ -3772,7 +3943,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) continue; } P2R_BakeNameMapIn *in = push_array(scratch.arena, P2R_BakeNameMapIn, 1); - in->strings = strings; + in->strings = &bake_strings; in->idx_runs = idx_runs; in->params = params; in->kind = k; @@ -3785,7 +3956,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: bake top-level name maps section ProfScope("top level name maps section") { - RDIM_BakeSectionList s = rdim_bake_top_level_name_map_section_list_from_params_maps(arena, strings, idx_runs, params, name_maps); + RDIM_BakeSectionList s = rdim_bake_top_level_name_map_section_list_from_params_maps(arena, &bake_strings, idx_runs, params, name_maps); rdim_bake_section_list_concat_in_place(§ions, &s); } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index ff385d2d..4acdc013 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -106,7 +106,7 @@ struct P2R_CompUnitContributionsParseIn }; //////////////////////////////// -//~ rjf: Conversion Data Structure Types +//~ rjf: Conversion Data Structure & Task Types //- rjf: link name map (voff -> string) @@ -243,6 +243,61 @@ struct P2R_SymbolStreamConvertOut //////////////////////////////// //~ rjf: Baking Task Types +//- rjf: string map baking task types + +typedef struct P2R_BakeSrcFilesStringsIn P2R_BakeSrcFilesStringsIn; +struct P2R_BakeSrcFilesStringsIn +{ + RDIM_BakeStringChunkListMapTopology *top; + RDIM_SrcFileChunkList *list; +}; + +typedef struct P2R_BakeUnitsStringsIn P2R_BakeUnitsStringsIn; +struct P2R_BakeUnitsStringsIn +{ + RDIM_BakeStringChunkListMapTopology *top; + RDIM_UnitChunkList *list; +}; + +typedef struct P2R_BakeTypesStringsIn P2R_BakeTypesStringsIn; +struct P2R_BakeTypesStringsIn +{ + RDIM_BakeStringChunkListMapTopology *top; + RDIM_TypeChunkList *list; +}; + +typedef struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsIn; +struct P2R_BakeUDTsStringsIn +{ + RDIM_BakeStringChunkListMapTopology *top; + RDIM_UDTChunkList *list; +}; + +typedef struct P2R_BakeSymbolsStringsIn P2R_BakeSymbolsStringsIn; +struct P2R_BakeSymbolsStringsIn +{ + RDIM_BakeStringChunkListMapTopology *top; + RDIM_SymbolChunkList *list; +}; + +typedef struct P2R_BakeScopesStringsIn P2R_BakeScopesStringsIn; +struct P2R_BakeScopesStringsIn +{ + RDIM_BakeStringChunkListMapTopology *top; + RDIM_ScopeChunkList *list; +}; + +//- rjf: string map sorting task types + +typedef struct P2R_SortBakeStringMapIn P2R_SortBakeStringMapIn; +struct P2R_SortBakeStringMapIn +{ + RDIM_BakeStringChunkListMapTopology *top; + RDIM_BakeStringChunkListMap *map; +}; + +//- rjf: OLD string map baking types + typedef struct P2R_BuildBakeStringMapIn P2R_BuildBakeStringMapIn; struct P2R_BuildBakeStringMapIn { @@ -257,10 +312,12 @@ struct P2R_BuildBakeNameMapIn RDIM_BakeParams *params; }; +//- rjf: debug info baking task types + typedef struct P2R_BakeUnitsTopLevelIn P2R_BakeUnitsTopLevelIn; struct P2R_BakeUnitsTopLevelIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakePathTree *path_tree; RDIM_BakeParams *params; }; @@ -280,7 +337,7 @@ struct P2R_BakeUnitVMapIn typedef struct P2R_BakeSrcFilesIn P2R_BakeSrcFilesIn; struct P2R_BakeSrcFilesIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakePathTree *path_tree; RDIM_BakeParams *params; }; @@ -288,14 +345,14 @@ struct P2R_BakeSrcFilesIn typedef struct P2R_BakeUDTsIn P2R_BakeUDTsIn; struct P2R_BakeUDTsIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakeParams *params; }; typedef struct P2R_BakeGlobalVariablesIn P2R_BakeGlobalVariablesIn; struct P2R_BakeGlobalVariablesIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakeParams *params; }; @@ -308,21 +365,21 @@ struct P2R_BakeGlobalVMapIn typedef struct P2R_BakeThreadVariablesIn P2R_BakeThreadVariablesIn; struct P2R_BakeThreadVariablesIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakeParams *params; }; typedef struct P2R_BakeProceduresIn P2R_BakeProceduresIn; struct P2R_BakeProceduresIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakeParams *params; }; typedef struct P2R_BakeScopesIn P2R_BakeScopesIn; struct P2R_BakeScopesIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakeParams *params; }; @@ -335,20 +392,20 @@ struct P2R_BakeScopeVMapIn typedef struct P2R_BakeFilePathsIn P2R_BakeFilePathsIn; struct P2R_BakeFilePathsIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakePathTree *path_tree; }; typedef struct P2R_BakeStringsIn P2R_BakeStringsIn; struct P2R_BakeStringsIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; }; typedef struct P2R_BakeTypeNodesIn P2R_BakeTypeNodesIn; struct P2R_BakeTypeNodesIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakeIdxRunMap *idx_runs; RDIM_BakeParams *params; }; @@ -356,7 +413,7 @@ struct P2R_BakeTypeNodesIn typedef struct P2R_BakeNameMapIn P2R_BakeNameMapIn; struct P2R_BakeNameMapIn { - RDIM_BakeStringMap *strings; + RDIM_BakeStringMapFinal *strings; RDIM_BakeIdxRunMap *idx_runs; RDIM_BakeParams *params; RDI_NameMapKind kind; @@ -446,6 +503,17 @@ internal P2R_Convert2Bake *p2r_convert(Arena *arena, P2R_User2Convert *in); //////////////////////////////// //~ rjf: Baking Stage Tasks +//- rjf: unsorted bake string map building +internal void *p2r_bake_src_files_strings_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_units_strings_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_types_strings_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_udts_strings_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_symbols_strings_task__entry_point(Arena *arena, void *p); +internal void *p2r_bake_scopes_strings_task__entry_point(Arena *arena, void *p); + +//- rjf: bake string map sorting +internal void *p2r_bake_string_map_sort_task__entry_point(Arena *arena, void *p); + //- rjf: pass 1: interner/deduper map builds internal void *p2r_build_bake_string_map_task__entry_point(Arena *arena, void *p); internal void *p2r_build_bake_name_map_task__entry_point(Arena *arena, void *p); diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index 31522953..3a328233 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -36,7 +36,7 @@ ts_init(void) ts_shared->artifact_stripes[idx].cv = os_condition_variable_alloc(); ts_shared->artifact_stripes[idx].rw_mutex = os_rw_mutex_alloc(); } - ts_shared->u2t_ring_size = KB(1024); + ts_shared->u2t_ring_size = MB(1); ts_shared->u2t_ring_base = push_array_no_zero(arena, U8, ts_shared->u2t_ring_size); ts_shared->u2t_ring_mutex = os_mutex_alloc(); ts_shared->u2t_ring_cv = os_condition_variable_alloc(); From a38742d80b27eacb7eb7db834d36eddbfaa04352 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 28 Feb 2024 16:18:11 -0800 Subject: [PATCH 155/275] adjust string map sorting tasks to be wide, but less granular than per-slot; divide up table into chunks --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 55 ++++++++++++++++++------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 9 ++-- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index c88437e9..8a31377c 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3542,27 +3542,28 @@ p2r_bake_scopes_strings_task__entry_point(Arena *arena, void *p) internal void * p2r_bake_string_map_sort_task__entry_point(Arena *arena, void *p) { - P2R_SortBakeStringMapIn *in = (P2R_SortBakeStringMapIn *)p; - RDIM_BakeStringChunkListMap *dst = rdim_bake_string_chunk_list_map_make(arena, in->top); - ProfScope("sort bake string chunk list map") + P2R_SortBakeStringMapSlotsIn *in = (P2R_SortBakeStringMapSlotsIn *)p; + ProfScope("sort bake string chunk list map range") { - for(U64 slot_idx = 0; slot_idx < in->top->slots_count; slot_idx += 1) + for(U64 slot_idx = in->slot_idx; + slot_idx < in->slot_idx+in->slot_count; + slot_idx += 1) { - if(in->map->slots[slot_idx] != 0) + if(in->src_map->slots[slot_idx] != 0) { - if(in->map->slots[slot_idx]->total_count > 1) + if(in->src_map->slots[slot_idx]->total_count > 1) { - dst->slots[slot_idx] = push_array(arena, RDIM_BakeStringChunkList, 1); - *dst->slots[slot_idx] = rdim_bake_string_chunk_list_sorted_from_unsorted(arena, in->map->slots[slot_idx]); + in->dst_map->slots[slot_idx] = push_array(arena, RDIM_BakeStringChunkList, 1); + *in->dst_map->slots[slot_idx] = rdim_bake_string_chunk_list_sorted_from_unsorted(arena, in->src_map->slots[slot_idx]); } else { - dst->slots[slot_idx] = in->map->slots[slot_idx];; + in->dst_map->slots[slot_idx] = in->src_map->slots[slot_idx]; } } } } - return dst; + return 0; } //- rjf: pass 1: interner/deduper map builds @@ -3860,12 +3861,36 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } } - //- rjf: kick off string map sorting task - P2R_SortBakeStringMapIn sort_bake_string_map_in = {&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map}; - TS_Ticket sort_bake_string_map_ticket = ts_kickoff(p2r_bake_string_map_sort_task__entry_point, 0, &sort_bake_string_map_in); + //- rjf: kick off string map sorting tasks + TS_TicketList sort_bake_string_map_task_tickets = {0}; + RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map__in_progress = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); + { + U64 slots_per_task = 65536; + U64 num_tasks = (bake_string_chunk_list_map_topology.slots_count+slots_per_task-1)/slots_per_task; + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + P2R_SortBakeStringMapSlotsIn *in = push_array(scratch.arena, P2R_SortBakeStringMapSlotsIn, 1); + { + in->top = &bake_string_chunk_list_map_topology; + in->src_map = unsorted_bake_string_chunk_list_map; + in->dst_map = sorted_bake_string_chunk_list_map__in_progress; + in->slot_idx = task_idx*slots_per_task; + in->slot_count = slots_per_task; + if(in->slot_idx+in->slot_count > bake_string_chunk_list_map_topology.slots_count) + { + in->slot_count = bake_string_chunk_list_map_topology.slots_count - in->slot_idx; + } + } + ts_ticket_list_push(scratch.arena, &sort_bake_string_map_task_tickets, ts_kickoff(p2r_bake_string_map_sort_task__entry_point, 0, in)); + } + } - //- rjf: join string map sorting task - RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map = ts_join_struct(sort_bake_string_map_ticket, max_U64, RDIM_BakeStringChunkListMap); + //- rjf: join string map sorting tasks + for(TS_TicketNode *n = sort_bake_string_map_task_tickets.first; n != 0; n = n->next) + { + ts_join(n->v, max_U64); + } + RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map = sorted_bake_string_chunk_list_map__in_progress; //- rjf: build finalized string map RDIM_BakeStringChunkListMapBaseIndices bake_string_chunk_list_map_base_idxes = rdim_bake_string_chunk_list_base_indices_from_map(arena, &bake_string_chunk_list_map_topology, sorted_bake_string_chunk_list_map); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 4acdc013..1d2ce1b4 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -289,11 +289,14 @@ struct P2R_BakeScopesStringsIn //- rjf: string map sorting task types -typedef struct P2R_SortBakeStringMapIn P2R_SortBakeStringMapIn; -struct P2R_SortBakeStringMapIn +typedef struct P2R_SortBakeStringMapSlotsIn P2R_SortBakeStringMapSlotsIn; +struct P2R_SortBakeStringMapSlotsIn { RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap *map; + RDIM_BakeStringChunkListMap *src_map; + RDIM_BakeStringChunkListMap *dst_map; + U64 slot_idx; + U64 slot_count; }; //- rjf: OLD string map baking types From 1ea3a14a501197d3642be505e24d855efad9b921 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 28 Feb 2024 16:48:25 -0800 Subject: [PATCH 156/275] shift to slice-granularity of string map gathering, rather than chunk-granularity - gives a bit more flexibility. set up pdb converter type name gathering tasks for slice subdivision. before going forward with this plan it's imperative that we start sparsely allocating these name maps... --- project.4coder | 2 +- src/lib_raddbgi_make/raddbgi_make.c | 62 +-- src/lib_raddbgi_make/raddbgi_make.h | 21 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 560 +++++++++++++----------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 11 +- 5 files changed, 343 insertions(+), 313 deletions(-) diff --git a/project.4coder b/project.4coder index cf8cfd08..295c50ae 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build raddbgi_from_pdb telemetry debug", + .win = "build raddbgi_from_pdb telemetry release", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 0bb8b253..83bd8791 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1861,47 +1861,47 @@ rdim_bake_string_chunk_list_map_push_path_tree(RDIM_Arena *arena, RDIM_BakeStrin //- rjf: chunk-granularity bake string gathering passes RDI_PROC void -rdim_bake_string_chunk_list_map_push_src_file_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkNode *chunk) +rdim_bake_string_chunk_list_map_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFile *v, RDI_U64 count) { - for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, chunk->v[idx].normal_full_path); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, v[idx].normal_full_path); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_unit_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UnitChunkNode *chunk) +rdim_bake_string_chunk_list_map_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Unit *v, RDI_U64 count) { - for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].unit_name); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].compiler_name); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].source_file); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].object_file); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].archive_file); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, chunk->v[idx].build_path); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].unit_name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].compiler_name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].source_file); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].object_file); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].archive_file); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].build_path); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_type_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TypeChunkNode *chunk) +rdim_bake_string_chunk_list_map_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Type *v, RDI_U64 count) { - for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, chunk->v[idx].name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, v[idx].name); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_udt_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDTChunkNode *chunk) +rdim_bake_string_chunk_list_map_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDT *v, RDI_U64 count) { - for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + for(RDI_U64 idx = 0; idx < count; idx += 1) { - for(RDIM_UDTMember *mem = chunk->v[idx].first_member; mem != 0; mem = mem->next) + for(RDIM_UDTMember *mem = v[idx].first_member; mem != 0; mem = mem->next) { rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, mem->name); } - for(RDIM_UDTEnumVal *mem = chunk->v[idx].first_enum_val; mem != 0; mem = mem->next) + for(RDIM_UDTEnumVal *mem = v[idx].first_enum_val; mem != 0; mem = mem->next) { rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, mem->name); } @@ -1909,21 +1909,21 @@ rdim_bake_string_chunk_list_map_push_udt_chunk(RDIM_Arena *arena, RDIM_BakeStrin } RDI_PROC void -rdim_bake_string_chunk_list_map_push_symbol_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SymbolChunkNode *chunk) +rdim_bake_string_chunk_list_map_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Symbol *v, RDI_U64 count) { - for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, chunk->v[idx].name); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, chunk->v[idx].link_name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, v[idx].name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, v[idx].link_name); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_scope_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_ScopeChunkNode *chunk) +rdim_bake_string_chunk_list_map_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Scope *v, RDI_U64 count) { - for(RDI_U64 idx = 0; idx < chunk->count; idx += 1) + for(RDI_U64 idx = 0; idx < count; idx += 1) { - for(RDIM_Local *local = chunk->v[idx].first_local; local != 0; local = local->next) + for(RDIM_Local *local = v[idx].first_local; local != 0; local = local->next) { rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, local->name); } @@ -1937,7 +1937,7 @@ rdim_bake_string_chunk_list_map_push_src_files(RDIM_Arena *arena, RDIM_BakeStrin { for(RDIM_SrcFileChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_src_file_chunk(arena, top, map, n); + rdim_bake_string_chunk_list_map_push_src_file_slice(arena, top, map, n->v, n->count); } } @@ -1946,7 +1946,7 @@ rdim_bake_string_chunk_list_map_push_units(RDIM_Arena *arena, RDIM_BakeStringChu { for(RDIM_UnitChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_unit_chunk(arena, top, map, n); + rdim_bake_string_chunk_list_map_push_unit_slice(arena, top, map, n->v, n->count); } } @@ -1955,7 +1955,7 @@ rdim_bake_string_chunk_list_map_push_types(RDIM_Arena *arena, RDIM_BakeStringChu { for(RDIM_TypeChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_type_chunk(arena, top, map, n); + rdim_bake_string_chunk_list_map_push_type_slice(arena, top, map, n->v, n->count); } } @@ -1964,7 +1964,7 @@ rdim_bake_string_chunk_list_map_push_udts(RDIM_Arena *arena, RDIM_BakeStringChun { for(RDIM_UDTChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_udt_chunk(arena, top, map, n); + rdim_bake_string_chunk_list_map_push_udt_slice(arena, top, map, n->v, n->count); } } @@ -1973,7 +1973,7 @@ rdim_bake_string_chunk_list_map_push_symbols(RDIM_Arena *arena, RDIM_BakeStringC { for(RDIM_SymbolChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_symbol_chunk(arena, top, map, n); + rdim_bake_string_chunk_list_map_push_symbol_slice(arena, top, map, n->v, n->count); } } @@ -1982,7 +1982,7 @@ rdim_bake_string_chunk_list_map_push_scopes(RDIM_Arena *arena, RDIM_BakeStringCh { for(RDIM_ScopeChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_scope_chunk(arena, top, map, n); + rdim_bake_string_chunk_list_map_push_scope_slice(arena, top, map, n->v, n->count); } } diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index d978c388..d28f7e55 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -585,13 +585,6 @@ struct RDIM_TypeChunkList RDI_U64 total_count; }; -typedef struct RDIM_TypeArray RDIM_TypeArray; -struct RDIM_TypeArray -{ - RDIM_Type *v; - RDI_U64 count; -}; - //////////////////////////////// //~ rjf: User-Defined-Type Info Types @@ -1195,13 +1188,13 @@ RDI_PROC void rdim_bake_string_chunk_list_map_push_top_level_info(RDIM_Arena *ar RDI_PROC void rdim_bake_string_chunk_list_map_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BinarySectionList *secs); RDI_PROC void rdim_bake_string_chunk_list_map_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BakePathTree *path_tree); -//- rjf: chunk-granularity bake string gathering passes -RDI_PROC void rdim_bake_string_chunk_list_map_push_src_file_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkNode *chunk); -RDI_PROC void rdim_bake_string_chunk_list_map_push_unit_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UnitChunkNode *chunk); -RDI_PROC void rdim_bake_string_chunk_list_map_push_type_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TypeChunkNode *chunk); -RDI_PROC void rdim_bake_string_chunk_list_map_push_udt_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDTChunkNode *chunk); -RDI_PROC void rdim_bake_string_chunk_list_map_push_symbol_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SymbolChunkNode *chunk); -RDI_PROC void rdim_bake_string_chunk_list_map_push_scope_chunk(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_ScopeChunkNode *chunk); +//- rjf: slice-granularity bake string gathering passes +RDI_PROC void rdim_bake_string_chunk_list_map_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFile *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_chunk_list_map_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Unit *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_chunk_list_map_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Type *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_chunk_list_map_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDT *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_chunk_list_map_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Symbol *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_chunk_list_map_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Scope *v, RDI_U64 count); //- rjf: list-granularity bake string gathering passes RDI_PROC void rdim_bake_string_chunk_list_map_push_src_files(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkList *list); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 8a31377c..86e5bdaa 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -839,288 +839,291 @@ p2r_itype_chain_build_task__entry_point(Arena *arena, void *p) { Temp scratch = scratch_begin(&arena, 1); P2R_ITypeChainBuildIn *in = (P2R_ITypeChainBuildIn *)p; - for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) + ProfScope("dependency itype chain build") { - //- rjf: push initial itype - should be final-visited-itype for this itype + for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = itype; - SLLStackPush(in->itype_chains[itype], c); - } - - //- rjf: skip basic types for dependency walk - if(itype < in->tpi_leaf->itype_first) - { - continue; - } - - //- rjf: walk dependent types, push to chain - P2R_TypeIdChain start_walk_task = {0, itype}; - P2R_TypeIdChain *first_walk_task = &start_walk_task; - P2R_TypeIdChain *last_walk_task = &start_walk_task; - for(P2R_TypeIdChain *walk_task = first_walk_task; - walk_task != 0; - walk_task = walk_task->next) - { - CV_TypeId walk_itype = in->itype_fwd_map[walk_task->itype] ? in->itype_fwd_map[walk_task->itype] : walk_task->itype; - if(walk_itype < in->tpi_leaf->itype_first) + //- rjf: push initial itype - should be final-visited-itype for this itype + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = itype; + SLLStackPush(in->itype_chains[itype], c); + } + + //- rjf: skip basic types for dependency walk + if(itype < in->tpi_leaf->itype_first) { continue; } - CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[walk_itype-in->tpi_leaf->itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= in->tpi_leaf->data.size && - range->off+2+header_struct_size <= in->tpi_leaf->data.size && - range->hdr.size >= 2) + + //- rjf: walk dependent types, push to chain + P2R_TypeIdChain start_walk_task = {0, itype}; + P2R_TypeIdChain *first_walk_task = &start_walk_task; + P2R_TypeIdChain *last_walk_task = &start_walk_task; + for(P2R_TypeIdChain *walk_task = first_walk_task; + walk_task != 0; + walk_task = walk_task->next) { - U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) + CV_TypeId walk_itype = in->itype_fwd_map[walk_task->itype] ? in->itype_fwd_map[walk_task->itype] : walk_task->itype; + if(walk_itype < in->tpi_leaf->itype_first) { - default:{}break; - - //- rjf: MODIFIER - case CV_LeafKind_MODIFIER: + continue; + } + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[walk_itype-in->tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= in->tpi_leaf->data.size && + range->off+2+header_struct_size <= in->tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) { - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + default:{}break; - // rjf: push dependent itype to chain + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(in->itype_chains[itype], c); - } + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; - // rjf: push task to walk dependency itype + //- rjf: POINTER + case CV_LeafKind_POINTER: { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: POINTER - case CV_LeafKind_POINTER: - { - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; - // rjf: push dependent itype to chain + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(in->itype_chains[itype], c); - } + CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + + // rjf: push return itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk return itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: push arg types to chain + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk arg types + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; - // rjf: push task to walk dependency itype + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: PROCEDURE - case CV_LeafKind_PROCEDURE: - { - CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: push arg types to chain + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk arg types + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; - // rjf: push return itypes to chain + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLStackPush(in->itype_chains[itype], c); - } + CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; - // rjf: push task to walk return itype + //- rjf: ARRAY + case CV_LeafKind_ARRAY: { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } + CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; - // rjf: unpack arglist range - CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) + //- rjf: ENUM + case CV_LeafKind_ENUM: { - break; - } - U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: push arg types to chain - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk arg types - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: MFUNCTION - case CV_LeafKind_MFUNCTION: - { - CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLStackPush(in->itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLStackPush(in->itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->this_itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->this_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: push arg types to chain - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk arg types - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: BITFIELD - case CV_LeafKind_BITFIELD: - { - CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: ARRAY - case CV_LeafKind_ARRAY: - { - CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->entry_itype; - SLLStackPush(in->itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->index_itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->entry_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->index_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->base_itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->base_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + } } } } @@ -3506,7 +3509,13 @@ p2r_bake_types_strings_task__entry_point(Arena *arena, void *p) { P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)p; RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); - ProfScope("bake type strings") rdim_bake_string_chunk_list_map_push_types(arena, in->top, map, in->list); + ProfScope("bake type strings") + { + for(P2R_BakeTypesStringsInNode *n = in->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_type_slice(arena, in->top, map, n->v, n->count); + } + } return map; } @@ -3791,10 +3800,21 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) // rjf: types { - P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->list = ¶ms->types; - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_types_strings_task__entry_point, 0, in)); + for(RDIM_TypeChunkNode *chunk = params->types.first; chunk != 0; chunk = chunk->next) + { + U64 types_per_task = chunk->count; + U64 tasks_per_this_chunk = (chunk->count+types_per_task-1)/types_per_task; + for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) + { + P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + P2R_BakeTypesStringsInNode *n = push_array(scratch.arena, P2R_BakeTypesStringsInNode, 1); + SLLQueuePush(in->first, in->last, n); + n->v = chunk->v + task_idx*types_per_task; + n->count = types_per_task; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_types_strings_task__entry_point, 0, in)); + } + } } // rjf: UDTs @@ -3838,7 +3858,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } } - //- rjf: kick off pass 1 tasks + //- rjf: kick off name map building tasks P2R_BuildBakeNameMapIn build_bake_name_map_in[RDI_NameMapKind_COUNT] = {0}; TS_Ticket build_bake_name_map_ticket[RDI_NameMapKind_COUNT] = {0}; for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); @@ -3856,8 +3876,12 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { for(TS_TicketNode *n = bake_string_map_build_tickets.first; n != 0; n = n->next) { + ProfBegin("waiting..."); RDIM_BakeStringChunkListMap *map = ts_join_struct(n->v, max_U64, RDIM_BakeStringChunkListMap); + ProfEnd(); + ProfBegin("joining map..."); rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, map); + ProfEnd(); } } @@ -3893,8 +3917,12 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map = sorted_bake_string_chunk_list_map__in_progress; //- rjf: build finalized string map + ProfBegin("build finalized string map base indices"); RDIM_BakeStringChunkListMapBaseIndices bake_string_chunk_list_map_base_idxes = rdim_bake_string_chunk_list_base_indices_from_map(arena, &bake_string_chunk_list_map_topology, sorted_bake_string_chunk_list_map); + ProfEnd(); + ProfBegin("build finalized string map"); RDIM_BakeStringMapFinal bake_strings = rdim_bake_string_map_final_from_chunk_list_map(arena, &bake_string_chunk_list_map_topology, &bake_string_chunk_list_map_base_idxes, sorted_bake_string_chunk_list_map); + ProfEnd(); //- rjf: kick off pass 2 tasks P2R_BakeUnitsTopLevelIn bake_units_top_level_in = {&bake_strings, path_tree, params}; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 1d2ce1b4..e529ee3e 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -259,11 +259,20 @@ struct P2R_BakeUnitsStringsIn RDIM_UnitChunkList *list; }; +typedef struct P2R_BakeTypesStringsInNode P2R_BakeTypesStringsInNode; +struct P2R_BakeTypesStringsInNode +{ + P2R_BakeTypesStringsInNode *next; + RDIM_Type *v; + RDI_U64 count; +}; + typedef struct P2R_BakeTypesStringsIn P2R_BakeTypesStringsIn; struct P2R_BakeTypesStringsIn { RDIM_BakeStringChunkListMapTopology *top; - RDIM_TypeChunkList *list; + P2R_BakeTypesStringsInNode *first; + P2R_BakeTypesStringsInNode *last; }; typedef struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsIn; From 7eca2a35cde0683671ab420dc27ae0f8b3e052f9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 29 Feb 2024 11:04:53 -0800 Subject: [PATCH 157/275] raddbgi_dump: dump string table --- src/raddbgi_dump/raddbgi_dump_main.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/raddbgi_dump/raddbgi_dump_main.c b/src/raddbgi_dump/raddbgi_dump_main.c index 5346b2f4..9374c49f 100644 --- a/src/raddbgi_dump/raddbgi_dump_main.c +++ b/src/raddbgi_dump/raddbgi_dump_main.c @@ -64,6 +64,7 @@ entry_point(CmdLine *cmd_line) DumpFlag_Scopes = (1<<13), DumpFlag_ScopeVMap = (1<<14), DumpFlag_NameMaps = (1<<15), + DumpFlag_Strings = (1<<16), }; String8 input_name = {0}; String8 input_data = {0}; @@ -405,6 +406,19 @@ entry_point(CmdLine *cmd_line) } str8_list_push(arena, &dump, str8_lit("\n")); } + + //- rjf: STRINGS + if(dump_flags & DumpFlag_Strings) + { + str8_list_pushf(arena, &dump, "# STRINGS:\n"); + for(U64 string_idx = 0; string_idx < raddbg->string_count; string_idx += 1) + { + String8 string = {0}; + string.str = rdi_string_from_idx(raddbg, string_idx, &string.size); + str8_list_pushf(arena, &dump, " string[%I64u]: \"%S\"\n", string_idx, string); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } } ////////////////////////////// From 2fc0b4eac28dca112837e01cb3117e70cc72ba47 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 1 Mar 2024 11:08:00 -0800 Subject: [PATCH 158/275] extend task system with thread count, so usage code can easily create per-thread state; pass thread idx into task entry points --- project.4coder | 2 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 114 ++++++++---------------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 76 ++++++++-------- src/task_system/task_system.c | 11 ++- src/task_system/task_system.h | 8 +- 5 files changed, 94 insertions(+), 117 deletions(-) diff --git a/project.4coder b/project.4coder index 295c50ae..9cb52771 100644 --- a/project.4coder +++ b/project.4coder @@ -74,7 +74,7 @@ commands = }, .rjf_f4 = { - .win = "build raddbgi_from_pdb && pushd build && raddbgi_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbg --dump:table_diagnostics && popd", + .win = "build raddbgi_from_pdb release telemetry && pushd build && raddbgi_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbgi --capture && popd", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 86e5bdaa..58cd4620 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -460,8 +460,7 @@ p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDI //////////////////////////////// //~ rjf: Initial Parsing & Preparation Pass Tasks -internal void * -p2r_exe_hash_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_exe_hash_task__entry_point) { P2R_EXEHashIn *in = (P2R_EXEHashIn *)p; U64 *out = push_array(arena, U64, 1); @@ -469,8 +468,7 @@ p2r_exe_hash_task__entry_point(Arena *arena, void *p) return out; } -internal void * -p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_tpi_hash_parse_task__entry_point) { P2R_TPIHashParseIn *in = (P2R_TPIHashParseIn *)p; void *out = 0; @@ -478,8 +476,7 @@ p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p) return out; } -internal void * -p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_tpi_leaf_parse_task__entry_point) { P2R_TPILeafParseIn *in = (P2R_TPILeafParseIn *)p; void *out = 0; @@ -487,8 +484,7 @@ p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p) return out; } -internal void * -p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_parse_task__entry_point) { P2R_SymbolStreamParseIn *in = (P2R_SymbolStreamParseIn *)p; void *out = 0; @@ -496,8 +492,7 @@ p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p) return out; } -internal void * -p2r_c13_stream_parse_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_c13_stream_parse_task__entry_point) { P2R_C13StreamParseIn *in = (P2R_C13StreamParseIn *)p; void *out = 0; @@ -505,8 +500,7 @@ p2r_c13_stream_parse_task__entry_point(Arena *arena, void *p) return out; } -internal void * -p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_comp_unit_parse_task__entry_point) { P2R_CompUnitParseIn *in = (P2R_CompUnitParseIn *)p; void *out = 0; @@ -514,8 +508,7 @@ p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p) return out; } -internal void * -p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_comp_unit_contributions_parse_task__entry_point) { P2R_CompUnitContributionsParseIn *in = (P2R_CompUnitContributionsParseIn *)p; void *out = 0; @@ -526,8 +519,7 @@ p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p) //////////////////////////////// //~ rjf: Unit Conversion Tasks -internal void * -p2r_units_convert_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) { Temp scratch = scratch_begin(&arena, 1); P2R_UnitConvertIn *in = (P2R_UnitConvertIn *)p; @@ -650,8 +642,7 @@ p2r_units_convert_task__entry_point(Arena *arena, void *p) //////////////////////////////// //~ rjf: Link Name Map Building Tasks -internal void * -p2r_link_name_map_build_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_link_name_map_build_task__entry_point) { P2R_LinkNameMapBuildIn *in = (P2R_LinkNameMapBuildIn *)p; CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges; @@ -706,8 +697,7 @@ p2r_link_name_map_build_task__entry_point(Arena *arena, void *p) //////////////////////////////// //~ rjf: Type Parsing/Conversion Tasks -internal void * -p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_itype_fwd_map_fill_task__entry_point) { P2R_ITypeFwdMapFillIn *in = (P2R_ITypeFwdMapFillIn *)p; ProfScope("fill itype fwd map") for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) @@ -834,8 +824,7 @@ p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p) return 0; } -internal void * -p2r_itype_chain_build_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_itype_chain_build_task__entry_point) { Temp scratch = scratch_begin(&arena, 1); P2R_ITypeChainBuildIn *in = (P2R_ITypeChainBuildIn *)p; @@ -1135,8 +1124,7 @@ p2r_itype_chain_build_task__entry_point(Arena *arena, void *p) //////////////////////////////// //~ rjf: UDT Conversion Tasks -internal void * -p2r_udt_convert_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_udt_convert_task__entry_point) { P2R_UDTConvertIn *in = (P2R_UDTConvertIn *)p; #define p2r_type_ptr_from_itype(itype) ((in->itype_type_ptrs && (itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) @@ -1760,8 +1748,7 @@ p2r_udt_convert_task__entry_point(Arena *arena, void *p) //////////////////////////////// //~ rjf: Symbol Stream Conversion Path & Thread -internal void * -p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) { Temp scratch = scratch_begin(&arena, 1); P2R_SymbolStreamConvertIn *in = (P2R_SymbolStreamConvertIn *)p; @@ -3486,8 +3473,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: bake string map building -internal void * -p2r_bake_src_files_strings_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point) { P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)p; RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); @@ -3495,8 +3481,7 @@ p2r_bake_src_files_strings_task__entry_point(Arena *arena, void *p) return map; } -internal void * -p2r_bake_units_strings_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point) { P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)p; RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); @@ -3504,8 +3489,7 @@ p2r_bake_units_strings_task__entry_point(Arena *arena, void *p) return map; } -internal void * -p2r_bake_types_strings_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point) { P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)p; RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); @@ -3519,8 +3503,7 @@ p2r_bake_types_strings_task__entry_point(Arena *arena, void *p) return map; } -internal void * -p2r_bake_udts_strings_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point) { P2R_BakeUDTsStringsIn *in = (P2R_BakeUDTsStringsIn *)p; RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); @@ -3528,8 +3511,7 @@ p2r_bake_udts_strings_task__entry_point(Arena *arena, void *p) return map; } -internal void * -p2r_bake_symbols_strings_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point) { P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)p; RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); @@ -3537,8 +3519,7 @@ p2r_bake_symbols_strings_task__entry_point(Arena *arena, void *p) return map; } -internal void * -p2r_bake_scopes_strings_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point) { P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)p; RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); @@ -3548,8 +3529,7 @@ p2r_bake_scopes_strings_task__entry_point(Arena *arena, void *p) //- rjf: bake string map sorting -internal void * -p2r_bake_string_map_sort_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_sort_task__entry_point) { P2R_SortBakeStringMapSlotsIn *in = (P2R_SortBakeStringMapSlotsIn *)p; ProfScope("sort bake string chunk list map range") @@ -3577,8 +3557,7 @@ p2r_bake_string_map_sort_task__entry_point(Arena *arena, void *p) //- rjf: pass 1: interner/deduper map builds -internal void * -p2r_build_bake_string_map_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_build_bake_string_map_task__entry_point) { P2R_BuildBakeStringMapIn *in = (P2R_BuildBakeStringMapIn *)p; RDIM_BakeStringMap *strings = 0; @@ -3586,8 +3565,7 @@ p2r_build_bake_string_map_task__entry_point(Arena *arena, void *p) return strings; } -internal void * -p2r_build_bake_name_map_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_build_bake_name_map_task__entry_point) { P2R_BuildBakeNameMapIn *in = (P2R_BuildBakeNameMapIn *)p; RDIM_BakeNameMap *name_map = 0; @@ -3597,8 +3575,7 @@ p2r_build_bake_name_map_task__entry_point(Arena *arena, void *p) //- rjf: pass 2: string-map-dependent debug info stream builds -internal void * -p2r_bake_units_top_level_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_units_top_level_task__entry_point) { P2R_BakeUnitsTopLevelIn *in = (P2R_BakeUnitsTopLevelIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3606,8 +3583,7 @@ p2r_bake_units_top_level_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_unit_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_unit_task__entry_point) { P2R_BakeUnitIn *in = (P2R_BakeUnitIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3615,8 +3591,7 @@ p2r_bake_unit_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_unit_vmap_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_unit_vmap_task__entry_point) { P2R_BakeUnitVMapIn *in = (P2R_BakeUnitVMapIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3624,8 +3599,7 @@ p2r_bake_unit_vmap_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_src_files_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_task__entry_point) { P2R_BakeSrcFilesIn *in = (P2R_BakeSrcFilesIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3633,8 +3607,7 @@ p2r_bake_src_files_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_udts_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_task__entry_point) { P2R_BakeUDTsIn *in = (P2R_BakeUDTsIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3642,8 +3615,7 @@ p2r_bake_udts_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_global_variables_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_global_variables_task__entry_point) { P2R_BakeGlobalVariablesIn *in = (P2R_BakeGlobalVariablesIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3651,8 +3623,7 @@ p2r_bake_global_variables_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_global_vmap_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_global_vmap_task__entry_point) { P2R_BakeGlobalVMapIn *in = (P2R_BakeGlobalVMapIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3660,8 +3631,7 @@ p2r_bake_global_vmap_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_thread_variables_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_thread_variables_task__entry_point) { P2R_BakeThreadVariablesIn *in = (P2R_BakeThreadVariablesIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3669,8 +3639,7 @@ p2r_bake_thread_variables_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_procedures_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_procedures_task__entry_point) { P2R_BakeProceduresIn *in = (P2R_BakeProceduresIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3678,8 +3647,7 @@ p2r_bake_procedures_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_scopes_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_task__entry_point) { P2R_BakeScopesIn *in = (P2R_BakeScopesIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3687,8 +3655,7 @@ p2r_bake_scopes_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_scope_vmap_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_scope_vmap_task__entry_point) { P2R_BakeScopeVMapIn *in = (P2R_BakeScopeVMapIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3696,8 +3663,7 @@ p2r_bake_scope_vmap_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_file_paths_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_file_paths_task__entry_point) { P2R_BakeFilePathsIn *in = (P2R_BakeFilePathsIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3705,8 +3671,7 @@ p2r_bake_file_paths_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_strings_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_strings_task__entry_point) { P2R_BakeStringsIn *in = (P2R_BakeStringsIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3716,8 +3681,7 @@ p2r_bake_strings_task__entry_point(Arena *arena, void *p) //- rjf: pass 3: idx-run-map-dependent debug info stream builds -internal void * -p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_type_nodes_task__entry_point) { P2R_BakeTypeNodesIn *in = (P2R_BakeTypeNodesIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3725,8 +3689,7 @@ p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_name_map_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_name_map_task__entry_point) { P2R_BakeNameMapIn *in = (P2R_BakeNameMapIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); @@ -3734,8 +3697,7 @@ p2r_bake_name_map_task__entry_point(Arena *arena, void *p) return s; } -internal void * -p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2r_bake_idx_runs_task__entry_point) { P2R_BakeIdxRunsIn *in = (P2R_BakeIdxRunsIn *)p; RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index e529ee3e..c7512acb 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -473,39 +473,39 @@ internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkLis //////////////////////////////// //~ rjf: Initial Parsing & Preparation Pass Tasks -internal void *p2r_exe_hash_task__entry_point(Arena *arena, void *p); -internal void *p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p); -internal void *p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p); -internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p); -internal void *p2r_c13_stream_parse_task__entry_point(Arena *arena, void *p); -internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p); -internal void *p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_exe_hash_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_tpi_hash_parse_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_tpi_leaf_parse_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_parse_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_c13_stream_parse_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_comp_unit_parse_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_comp_unit_contributions_parse_task__entry_point); //////////////////////////////// //~ rjf: Unit Conversion Tasks -internal void *p2r_units_convert_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point); //////////////////////////////// //~ rjf: Link Name Map Building Tasks -internal void *p2r_link_name_map_build_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_link_name_map_build_task__entry_point); //////////////////////////////// //~ rjf: Type Parsing/Conversion Tasks -internal void *p2r_itype_fwd_map_fill_task__entry_point(Arena *arena, void *p); -internal void *p2r_itype_chain_build_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_itype_fwd_map_fill_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_itype_chain_build_task__entry_point); //////////////////////////////// //~ rjf: UDT Conversion Tasks -internal void *p2r_udt_convert_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_udt_convert_task__entry_point); //////////////////////////////// //~ rjf: Symbol Stream Conversion Tasks -internal void *p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point); //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point @@ -516,39 +516,39 @@ internal P2R_Convert2Bake *p2r_convert(Arena *arena, P2R_User2Convert *in); //~ rjf: Baking Stage Tasks //- rjf: unsorted bake string map building -internal void *p2r_bake_src_files_strings_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_units_strings_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_types_strings_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_udts_strings_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_symbols_strings_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_scopes_strings_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point); //- rjf: bake string map sorting -internal void *p2r_bake_string_map_sort_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_sort_task__entry_point); //- rjf: pass 1: interner/deduper map builds -internal void *p2r_build_bake_string_map_task__entry_point(Arena *arena, void *p); -internal void *p2r_build_bake_name_map_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_build_bake_string_map_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_build_bake_name_map_task__entry_point); //- rjf: pass 2: string-map-dependent debug info stream builds -internal void *p2r_bake_units_top_level_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_unit_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_unit_vmap_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_src_files_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_udts_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_global_variables_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_global_vmap_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_thread_variables_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_procedures_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_scopes_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_scope_vmap_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_file_paths_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_strings_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_bake_units_top_level_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_unit_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_unit_vmap_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_global_variables_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_global_vmap_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_thread_variables_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_procedures_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_scope_vmap_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_file_paths_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_strings_task__entry_point); //- rjf: pass 3: idx-run-map-dependent debug info stream builds -internal void *p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_name_map_task__entry_point(Arena *arena, void *p); -internal void *p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p); +internal TS_TASK_FUNCTION_DEF(p2r_bake_type_nodes_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_name_map_task__entry_point); +internal TS_TASK_FUNCTION_DEF(p2r_bake_idx_runs_task__entry_point); //////////////////////////////// //~ rjf: Top-Level Baking Entry Point diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index 3a328233..07a14139 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -49,6 +49,15 @@ ts_init(void) } } +//////////////////////////////// +//~ rjf: Top-Level Accessors + +internal U64 +ts_thread_count(void) +{ + return ts_shared->task_threads_count; +} + //////////////////////////////// //~ rjf: High-Level Task Kickoff / Joining @@ -190,7 +199,7 @@ ts_task_thread__entry_point(void *p) } //- rjf: run task - void *task_result = task_function(task_arena, task_params); + void *task_result = task_function(task_arena, thread_idx, task_params); //- rjf: store into artifact U64 artifact_num = task_ticket.u64[0]; diff --git a/src/task_system/task_system.h b/src/task_system/task_system.h index ccf06755..d8a705eb 100644 --- a/src/task_system/task_system.h +++ b/src/task_system/task_system.h @@ -34,7 +34,8 @@ struct TS_TicketList //////////////////////////////// //~ rjf: Task Request Types -typedef void *TS_TaskFunctionType(Arena *arena, void *user_data); +#define TS_TASK_FUNCTION_DEF(name) void *name(Arena *arena, U64 thread_idx, void *p) +typedef TS_TASK_FUNCTION_DEF(TS_TaskFunctionType); //////////////////////////////// //~ rjf: Task Artifact Cache Types @@ -118,6 +119,11 @@ internal void ts_ticket_list_push(Arena *arena, TS_TicketList *list, TS_Ticket t internal void ts_init(void); +//////////////////////////////// +//~ rjf: Top-Level Accessors + +internal U64 ts_thread_count(void); + //////////////////////////////// //~ rjf: High-Level Task Kickoff / Joining From ac22e24841a88ab2b17591d63c3bd6b01b26615b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 1 Mar 2024 11:21:30 -0800 Subject: [PATCH 159/275] raddbgi_from_pdb: switch string baking to using fixed per-thread maps, rather than per-task maps --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 91 ++++++++++++++++++------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 17 ++++- 2 files changed, 81 insertions(+), 27 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 58cd4620..084b8f43 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3476,55 +3476,55 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point) { P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)p; - RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); - ProfScope("bake src file strings") rdim_bake_string_chunk_list_map_push_src_files(arena, in->top, map, in->list); - return map; + ProfScope("bake src file strings") rdim_bake_string_chunk_list_map_push_src_files(arena, in->top, in->maps[thread_idx], in->list); + return 0; } internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point) { P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)p; - RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); - ProfScope("bake unit strings") rdim_bake_string_chunk_list_map_push_units(arena, in->top, map, in->list); - return map; + ProfScope("bake unit strings") rdim_bake_string_chunk_list_map_push_units(arena, in->top, in->maps[thread_idx], in->list); + return 0; } internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point) { P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)p; - RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); ProfScope("bake type strings") { for(P2R_BakeTypesStringsInNode *n = in->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_type_slice(arena, in->top, map, n->v, n->count); + rdim_bake_string_chunk_list_map_push_type_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); } } - return map; + return 0; } internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point) { P2R_BakeUDTsStringsIn *in = (P2R_BakeUDTsStringsIn *)p; - RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); - ProfScope("bake udt strings") rdim_bake_string_chunk_list_map_push_udts(arena, in->top, map, in->list); - return map; + ProfScope("bake udt strings") + { + for(P2R_BakeUDTsStringsInNode *n = in->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_udt_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + } + } + return 0; } internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point) { P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)p; - RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); - ProfScope("bake symbol strings") rdim_bake_string_chunk_list_map_push_symbols(arena, in->top, map, in->list); - return map; + ProfScope("bake symbol strings") rdim_bake_string_chunk_list_map_push_symbols(arena, in->top, in->maps[thread_idx], in->list); + return 0; } internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point) { P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)p; - RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top); - ProfScope("bake scope strings") rdim_bake_string_chunk_list_map_push_scopes(arena, in->top, map, in->list); - return map; + ProfScope("bake scope strings") rdim_bake_string_chunk_list_map_push_scopes(arena, in->top, in->maps[thread_idx], in->list); + return 0; } //- rjf: bake string map sorting @@ -3742,12 +3742,18 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2)}; + RDIM_BakeStringChunkListMap **bake_string_chunk_list_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringChunkListMap *, ts_thread_count()); + for(U64 idx = 0; idx < ts_thread_count(); idx += 1) + { + bake_string_chunk_list_maps__in_progress[idx] = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); + } TS_TicketList bake_string_map_build_tickets = {0}; { // rjf: src files { P2R_BakeSrcFilesStringsIn *in = push_array(scratch.arena, P2R_BakeSrcFilesStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; in->list = ¶ms->src_files; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_src_files_strings_task__entry_point, 0, in)); } @@ -3756,6 +3762,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { P2R_BakeUnitsStringsIn *in = push_array(scratch.arena, P2R_BakeUnitsStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; in->list = ¶ms->units; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_units_strings_task__entry_point, 0, in)); } @@ -3764,12 +3771,13 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { for(RDIM_TypeChunkNode *chunk = params->types.first; chunk != 0; chunk = chunk->next) { - U64 types_per_task = chunk->count; + U64 types_per_task = Min(4096, chunk->count); U64 tasks_per_this_chunk = (chunk->count+types_per_task-1)/types_per_task; for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) { P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; P2R_BakeTypesStringsInNode *n = push_array(scratch.arena, P2R_BakeTypesStringsInNode, 1); SLLQueuePush(in->first, in->last, n); n->v = chunk->v + task_idx*types_per_task; @@ -3779,18 +3787,42 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } } + // rjf: UDTs + { + for(RDIM_UDTChunkNode *chunk = params->udts.first; chunk != 0; chunk = chunk->next) + { + U64 udts_per_task = Min(4096, chunk->count); + U64 tasks_per_this_chunk = (chunk->count+udts_per_task-1)/udts_per_task; + for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) + { + P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; + P2R_BakeUDTsStringsInNode *n = push_array(scratch.arena, P2R_BakeUDTsStringsInNode, 1); + SLLQueuePush(in->first, in->last, n); + n->v = chunk->v + task_idx*udts_per_task; + n->count = udts_per_task; + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in)); + } + } + } + +#if 0 // rjf: UDTs { P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; in->list = ¶ms->udts; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in)); } +#endif // rjf: global variables { P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; in->list = ¶ms->global_variables; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); } @@ -3799,6 +3831,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; in->list = ¶ms->thread_variables; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); } @@ -3807,6 +3840,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; in->list = ¶ms->procedures; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); } @@ -3815,6 +3849,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; in->list = ¶ms->scopes; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_scopes_strings_task__entry_point, 0, in)); } @@ -3833,17 +3868,21 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } //- rjf: join string map building tasks - RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); ProfScope("join string map building tasks") { for(TS_TicketNode *n = bake_string_map_build_tickets.first; n != 0; n = n->next) { - ProfBegin("waiting..."); - RDIM_BakeStringChunkListMap *map = ts_join_struct(n->v, max_U64, RDIM_BakeStringChunkListMap); - ProfEnd(); - ProfBegin("joining map..."); - rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, map); - ProfEnd(); + ts_join(n->v, max_U64); + } + } + + //- rjf: produce joined string map + RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); + ProfScope("produce joined string map") + { + for(U64 idx = 0; idx < ts_thread_count(); idx += 1) + { + rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, bake_string_chunk_list_maps__in_progress[idx]); } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index c7512acb..38848e71 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -249,6 +249,7 @@ typedef struct P2R_BakeSrcFilesStringsIn P2R_BakeSrcFilesStringsIn; struct P2R_BakeSrcFilesStringsIn { RDIM_BakeStringChunkListMapTopology *top; + RDIM_BakeStringChunkListMap **maps; RDIM_SrcFileChunkList *list; }; @@ -256,6 +257,7 @@ typedef struct P2R_BakeUnitsStringsIn P2R_BakeUnitsStringsIn; struct P2R_BakeUnitsStringsIn { RDIM_BakeStringChunkListMapTopology *top; + RDIM_BakeStringChunkListMap **maps; RDIM_UnitChunkList *list; }; @@ -271,21 +273,33 @@ typedef struct P2R_BakeTypesStringsIn P2R_BakeTypesStringsIn; struct P2R_BakeTypesStringsIn { RDIM_BakeStringChunkListMapTopology *top; + RDIM_BakeStringChunkListMap **maps; P2R_BakeTypesStringsInNode *first; P2R_BakeTypesStringsInNode *last; }; +typedef struct P2R_BakeUDTsStringsInNode P2R_BakeUDTsStringsInNode; +struct P2R_BakeUDTsStringsInNode +{ + P2R_BakeUDTsStringsInNode *next; + RDIM_UDT *v; + RDI_U64 count; +}; + typedef struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsIn; struct P2R_BakeUDTsStringsIn { RDIM_BakeStringChunkListMapTopology *top; - RDIM_UDTChunkList *list; + RDIM_BakeStringChunkListMap **maps; + P2R_BakeUDTsStringsInNode *first; + P2R_BakeUDTsStringsInNode *last; }; typedef struct P2R_BakeSymbolsStringsIn P2R_BakeSymbolsStringsIn; struct P2R_BakeSymbolsStringsIn { RDIM_BakeStringChunkListMapTopology *top; + RDIM_BakeStringChunkListMap **maps; RDIM_SymbolChunkList *list; }; @@ -293,6 +307,7 @@ typedef struct P2R_BakeScopesStringsIn P2R_BakeScopesStringsIn; struct P2R_BakeScopesStringsIn { RDIM_BakeStringChunkListMapTopology *top; + RDIM_BakeStringChunkListMap **maps; RDIM_ScopeChunkList *list; }; From 0ad795ba4c6058ac7d200371a351493eef17745d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 1 Mar 2024 11:36:03 -0800 Subject: [PATCH 160/275] eliminate old udt string baking kickoff code --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 084b8f43..c116154f 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3807,17 +3807,6 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } } -#if 0 - // rjf: UDTs - { - P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; - in->list = ¶ms->udts; - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in)); - } -#endif - // rjf: global variables { P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); @@ -3890,7 +3879,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) TS_TicketList sort_bake_string_map_task_tickets = {0}; RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map__in_progress = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); { - U64 slots_per_task = 65536; + U64 slots_per_task = 4096; U64 num_tasks = (bake_string_chunk_list_map_topology.slots_count+slots_per_task-1)/slots_per_task; for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) { @@ -3911,9 +3900,12 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } //- rjf: join string map sorting tasks - for(TS_TicketNode *n = sort_bake_string_map_task_tickets.first; n != 0; n = n->next) + ProfScope("join string map sorting tasks") { - ts_join(n->v, max_U64); + for(TS_TicketNode *n = sort_bake_string_map_task_tickets.first; n != 0; n = n->next) + { + ts_join(n->v, max_U64); + } } RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map = sorted_bake_string_chunk_list_map__in_progress; @@ -4138,4 +4130,3 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) scratch_end(scratch); return out; } - From 778f4eb08d3cbdff08163a789df941fbcfcdf514 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 4 Mar 2024 11:02:48 -0800 Subject: [PATCH 161/275] raddbgi_from_pdb: complete initial parallelization pass over string map building, joining, & sorting --- project.4coder | 4 +- src/lib_raddbgi_make/raddbgi_make.c | 12 +- src/raddbg/raddbg.h | 8 +- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 164 +++++++++++++++++------- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 37 +++++- 5 files changed, 169 insertions(+), 56 deletions(-) diff --git a/project.4coder b/project.4coder index 9cb52771..4dfe8d84 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build raddbgi_from_pdb telemetry release", + .win = "build raddbgi_from_pdb telemetry debug", .linux = "", .out = "*compilation*", .footer_panel = true, @@ -74,7 +74,7 @@ commands = }, .rjf_f4 = { - .win = "build raddbgi_from_pdb release telemetry && pushd build && raddbgi_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.raddbgi --capture && popd", + .win = "build raddbgi_from_pdb release telemetry && pushd build && raddbgi_from_pdb.exe --exe:UnrealEditorFortnite.exe --pdb:UnrealEditorFortnite.pdb --out:UnrealEditorFortnite.raddbgi --capture && popd", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 83bd8791..12adc08e 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1888,7 +1888,7 @@ rdim_bake_string_chunk_list_map_push_type_slice(RDIM_Arena *arena, RDIM_BakeStri { for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, v[idx].name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].name); } } @@ -1899,11 +1899,11 @@ rdim_bake_string_chunk_list_map_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStrin { for(RDIM_UDTMember *mem = v[idx].first_member; mem != 0; mem = mem->next) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, mem->name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, mem->name); } for(RDIM_UDTEnumVal *mem = v[idx].first_enum_val; mem != 0; mem = mem->next) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 64, mem->name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, mem->name); } } } @@ -1913,8 +1913,8 @@ rdim_bake_string_chunk_list_map_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeSt { for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, v[idx].name); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, v[idx].link_name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].link_name); } } @@ -1925,7 +1925,7 @@ rdim_bake_string_chunk_list_map_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStr { for(RDIM_Local *local = v[idx].first_local; local != 0; local = local->next) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, local->name); + rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, local->name); } } } diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 19377d0b..36d1909e 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -49,7 +49,11 @@ //////////////////////////////// //~ rjf: Hot, High Priority Tasks (Complete Unusability, Crashes, Fire-Worthy) // -// [ ] DBGI layer is case-sensitive even on case-insensitive systems +// [ ] raddbg jai.exe my_file.jai -- foobar -> raddbg consumes `--` incorrectly +// [ ] PDB files distributed with the build are not found by DbgHelp!!! +// [ ] Jai compiler debugging crash +// [ ] raddbgi file regeneration too strict +// // [ ] Jump table thunks, on code w/o /INCREMENTAL:NO // // [ ] ** Thread/process control bullet-proofing, including solo-step mode @@ -73,6 +77,8 @@ // [ ] disasm animation & go-to-address // // [ ] visualize remapped files (via path map) +// +// [x] DBGI layer is case-sensitive even on case-insensitive systems //////////////////////////////// //~ rjf: Hot, Medium Priority Tasks (Low-Hanging-Fruit Features, UI Jank, Cleanup) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index c116154f..747ced64 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3516,14 +3516,51 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point) internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point) { P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)p; - ProfScope("bake symbol strings") rdim_bake_string_chunk_list_map_push_symbols(arena, in->top, in->maps[thread_idx], in->list); + ProfScope("bake symbol strings") + { + for(P2R_BakeSymbolsStringsInNode *n = in->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_symbol_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + } + } return 0; } internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point) { P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)p; - ProfScope("bake scope strings") rdim_bake_string_chunk_list_map_push_scopes(arena, in->top, in->maps[thread_idx], in->list); + ProfScope("bake scope strings") + { + for(P2R_BakeScopesStringsInNode *n = in->first; n != 0; n = n->next) + { + rdim_bake_string_chunk_list_map_push_scope_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + } + } + return 0; +} + +//- rjf: bake string map joining + +internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_join_task__entry_point) +{ + P2R_JoinBakeStringMapSlotsIn *in = (P2R_JoinBakeStringMapSlotsIn *)p; + ProfScope("join bake string maps") + { + for(U64 src_map_idx = 0; src_map_idx < in->src_maps_count; src_map_idx += 1) + { + for(U64 slot_idx = in->slot_idx_range.min; slot_idx < in->slot_idx_range.max; slot_idx += 1) + { + if(in->dst_map->slots[slot_idx] == 0) + { + in->dst_map->slots[slot_idx] = in->src_maps[src_map_idx]->slots[slot_idx]; + } + else if(in->src_maps[src_map_idx]->slots[slot_idx] != 0) + { + rdim_bake_string_chunk_list_concat_in_place(in->dst_map->slots[slot_idx], in->src_maps[src_map_idx]->slots[slot_idx]); + } + } + } + } return 0; } @@ -3738,10 +3775,10 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } //- rjf: kick off string map building tasks - RDIM_BakeStringChunkListMapTopology bake_string_chunk_list_map_topology = {(params->procedures.total_count*2 + - params->global_variables.total_count*2 + - params->thread_variables.total_count*2 + - params->types.total_count*2)}; + RDIM_BakeStringChunkListMapTopology bake_string_chunk_list_map_topology = {(params->procedures.total_count*1 + + params->global_variables.total_count*1 + + params->thread_variables.total_count*1 + + params->types.total_count/2)}; RDIM_BakeStringChunkListMap **bake_string_chunk_list_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringChunkListMap *, ts_thread_count()); for(U64 idx = 0; idx < ts_thread_count(); idx += 1) { @@ -3750,6 +3787,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) TS_TicketList bake_string_map_build_tickets = {0}; { // rjf: src files + ProfScope("kick off src files string map build task") { P2R_BakeSrcFilesStringsIn *in = push_array(scratch.arena, P2R_BakeSrcFilesStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; @@ -3759,6 +3797,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } // rjf: units + ProfScope("kick off units string map build task") { P2R_BakeUnitsStringsIn *in = push_array(scratch.arena, P2R_BakeUnitsStringsIn, 1); in->top = &bake_string_chunk_list_map_topology; @@ -3768,11 +3807,12 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } // rjf: types + ProfScope("kick off types string map build tasks") { for(RDIM_TypeChunkNode *chunk = params->types.first; chunk != 0; chunk = chunk->next) { - U64 types_per_task = Min(4096, chunk->count); - U64 tasks_per_this_chunk = (chunk->count+types_per_task-1)/types_per_task; + U64 items_per_task = Min(4096, chunk->count); + U64 tasks_per_this_chunk = (chunk->count+items_per_task-1)/items_per_task; for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) { P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1); @@ -3780,19 +3820,20 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) in->maps = bake_string_chunk_list_maps__in_progress; P2R_BakeTypesStringsInNode *n = push_array(scratch.arena, P2R_BakeTypesStringsInNode, 1); SLLQueuePush(in->first, in->last, n); - n->v = chunk->v + task_idx*types_per_task; - n->count = types_per_task; + n->v = chunk->v + task_idx*items_per_task; + n->count = Min(items_per_task, chunk->count - task_idx*items_per_task); ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_types_strings_task__entry_point, 0, in)); } } } // rjf: UDTs + ProfScope("kick off udts string map build tasks") { for(RDIM_UDTChunkNode *chunk = params->udts.first; chunk != 0; chunk = chunk->next) { - U64 udts_per_task = Min(4096, chunk->count); - U64 tasks_per_this_chunk = (chunk->count+udts_per_task-1)/udts_per_task; + U64 items_per_task = Min(4096, chunk->count); + U64 tasks_per_this_chunk = (chunk->count+items_per_task-1)/items_per_task; for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) { P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1); @@ -3800,47 +3841,62 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) in->maps = bake_string_chunk_list_maps__in_progress; P2R_BakeUDTsStringsInNode *n = push_array(scratch.arena, P2R_BakeUDTsStringsInNode, 1); SLLQueuePush(in->first, in->last, n); - n->v = chunk->v + task_idx*udts_per_task; - n->count = udts_per_task; + n->v = chunk->v + task_idx*items_per_task; + n->count = Min(items_per_task, chunk->count - task_idx*items_per_task); ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in)); } } } - // rjf: global variables + // rjf: symbols + ProfScope("kick off symbols string map build tasks") { - P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; - in->list = ¶ms->global_variables; - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); - } - - // rjf: thread variables - { - P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; - in->list = ¶ms->thread_variables; - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); - } - - // rjf: procedures - { - P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; - in->list = ¶ms->procedures; - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); + RDIM_SymbolChunkList *symbol_lists[] = + { + ¶ms->global_variables, + ¶ms->thread_variables, + ¶ms->procedures, + }; + for(U64 list_idx = 0; list_idx < ArrayCount(symbol_lists); list_idx += 1) + { + for(RDIM_SymbolChunkNode *chunk = symbol_lists[list_idx]->first; chunk != 0; chunk = chunk->next) + { + U64 items_per_task = Min(4096, chunk->count); + U64 tasks_per_this_chunk = (chunk->count+items_per_task-1)/items_per_task; + for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) + { + P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; + P2R_BakeSymbolsStringsInNode *n = push_array(scratch.arena, P2R_BakeSymbolsStringsInNode, 1); + SLLQueuePush(in->first, in->last, n); + n->v = chunk->v + task_idx*items_per_task; + n->count = Min(items_per_task, chunk->count - task_idx*items_per_task); + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); + } + } + } } // rjf: scope chunks + ProfScope("kick off scope chunks string map build tasks") { - P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; - in->list = ¶ms->scopes; - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_scopes_strings_task__entry_point, 0, in)); + for(RDIM_ScopeChunkNode *chunk = params->scopes.first; chunk != 0; chunk = chunk->next) + { + U64 items_per_task = Min(4096, chunk->count); + U64 tasks_per_this_chunk = (chunk->count+items_per_task-1)/items_per_task; + for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) + { + P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->maps = bake_string_chunk_list_maps__in_progress; + P2R_BakeScopesStringsInNode *n = push_array(scratch.arena, P2R_BakeScopesStringsInNode, 1); + SLLQueuePush(in->first, in->last, n); + n->v = chunk->v + task_idx*items_per_task; + n->count = Min(items_per_task, chunk->count - task_idx*items_per_task); + ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_scopes_strings_task__entry_point, 0, in)); + } + } } } @@ -3869,9 +3925,27 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); ProfScope("produce joined string map") { - for(U64 idx = 0; idx < ts_thread_count(); idx += 1) + U64 slots_per_task = 16384; + U64 num_tasks = (bake_string_chunk_list_map_topology.slots_count+slots_per_task-1)/slots_per_task; + TS_Ticket *task_tickets = push_array(scratch.arena, TS_Ticket, num_tasks); + + // rjf: kickoff tasks + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) { - rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, bake_string_chunk_list_maps__in_progress[idx]); + P2R_JoinBakeStringMapSlotsIn *in = push_array(scratch.arena, P2R_JoinBakeStringMapSlotsIn, 1); + in->top = &bake_string_chunk_list_map_topology; + in->src_maps = bake_string_chunk_list_maps__in_progress; + in->src_maps_count = ts_thread_count(); + in->dst_map = unsorted_bake_string_chunk_list_map; + in->slot_idx_range = r1u64(task_idx*slots_per_task, task_idx*slots_per_task + slots_per_task); + in->slot_idx_range.max = Min(in->slot_idx_range.max, in->top->slots_count); + task_tickets[task_idx] = ts_kickoff(p2r_bake_string_map_join_task__entry_point, 0, in); + } + + // rjf: join tasks + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + ts_join(task_tickets[task_idx], max_U64); } } diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 38848e71..860dde62 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -295,12 +295,29 @@ struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsInNode *last; }; +typedef struct P2R_BakeSymbolsStringsInNode P2R_BakeSymbolsStringsInNode; +struct P2R_BakeSymbolsStringsInNode +{ + P2R_BakeSymbolsStringsInNode *next; + RDIM_Symbol *v; + RDI_U64 count; +}; + typedef struct P2R_BakeSymbolsStringsIn P2R_BakeSymbolsStringsIn; struct P2R_BakeSymbolsStringsIn { RDIM_BakeStringChunkListMapTopology *top; RDIM_BakeStringChunkListMap **maps; - RDIM_SymbolChunkList *list; + P2R_BakeSymbolsStringsInNode *first; + P2R_BakeSymbolsStringsInNode *last; +}; + +typedef struct P2R_BakeScopesStringsInNode P2R_BakeScopesStringsInNode; +struct P2R_BakeScopesStringsInNode +{ + P2R_BakeScopesStringsInNode *next; + RDIM_Scope *v; + RDI_U64 count; }; typedef struct P2R_BakeScopesStringsIn P2R_BakeScopesStringsIn; @@ -308,7 +325,20 @@ struct P2R_BakeScopesStringsIn { RDIM_BakeStringChunkListMapTopology *top; RDIM_BakeStringChunkListMap **maps; - RDIM_ScopeChunkList *list; + P2R_BakeScopesStringsInNode *first; + P2R_BakeScopesStringsInNode *last; +}; + +//- rjf: string map joining task types + +typedef struct P2R_JoinBakeStringMapSlotsIn P2R_JoinBakeStringMapSlotsIn; +struct P2R_JoinBakeStringMapSlotsIn +{ + RDIM_BakeStringChunkListMapTopology *top; + RDIM_BakeStringChunkListMap **src_maps; + U64 src_maps_count; + RDIM_BakeStringChunkListMap *dst_map; + Rng1U64 slot_idx_range; }; //- rjf: string map sorting task types @@ -538,6 +568,9 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point); internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point); internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point); +//- rjf: bake string map joining +internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_join_task__entry_point); + //- rjf: bake string map sorting internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_sort_task__entry_point); From 4d6860b3a189b9f42b8f9be887a68f0d36c4484f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 4 Mar 2024 11:14:54 -0800 Subject: [PATCH 162/275] raddbgi_from_pdb/raddbgi_make: kill old synchronous string map code; naming pass --- src/lib_raddbgi_make/raddbgi_make.c | 319 +++++------------------- src/lib_raddbgi_make/raddbgi_make.h | 112 ++++----- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 91 ++++--- src/raddbgi_from_pdb/raddbgi_from_pdb.h | 59 +++-- 4 files changed, 179 insertions(+), 402 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 12adc08e..4c10a067 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1341,16 +1341,16 @@ rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStr //- rjf: bake string chunk list maps -RDI_PROC RDIM_BakeStringChunkListMap * -rdim_bake_string_chunk_list_map_make(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top) +RDI_PROC RDIM_BakeStringMapLoose * +rdim_bake_string_map_loose_make(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top) { - RDIM_BakeStringChunkListMap *map = rdim_push_array(arena, RDIM_BakeStringChunkListMap, 1); + RDIM_BakeStringMapLoose *map = rdim_push_array(arena, RDIM_BakeStringMapLoose, 1); map->slots = rdim_push_array(arena, RDIM_BakeStringChunkList *, top->slots_count); return map; } RDI_PROC void -rdim_bake_string_chunk_list_map_insert(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map, RDI_U64 chunk_cap, RDIM_String8 string) +rdim_bake_string_map_loose_insert(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map, RDI_U64 chunk_cap, RDIM_String8 string) { RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); RDI_U64 slot_idx = hash%map_topology->slots_count; @@ -1381,7 +1381,7 @@ rdim_bake_string_chunk_list_map_insert(RDIM_Arena *arena, RDIM_BakeStringChunkLi } RDI_PROC void -rdim_bake_string_chunk_list_map_join_in_place(RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *dst, RDIM_BakeStringChunkListMap *src) +rdim_bake_string_map_loose_join_in_place(RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *dst, RDIM_BakeStringMapLoose *src) { for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) { @@ -1397,10 +1397,10 @@ rdim_bake_string_chunk_list_map_join_in_place(RDIM_BakeStringChunkListMapTopolog rdim_memzero_struct(src); } -RDI_PROC RDIM_BakeStringChunkListMapBaseIndices -rdim_bake_string_chunk_list_base_indices_from_map(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map) +RDI_PROC RDIM_BakeStringMapBaseIndices +rdim_bake_string_map_base_indices_from_map_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map) { - RDIM_BakeStringChunkListMapBaseIndices indices = {0}; + RDIM_BakeStringMapBaseIndices indices = {0}; indices.slots_base_idxs = rdim_push_array(arena, RDI_U64, map_topology->slots_count+1); RDI_U64 total_count = 0; for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) @@ -1417,10 +1417,10 @@ rdim_bake_string_chunk_list_base_indices_from_map(RDIM_Arena *arena, RDIM_BakeSt //- rjf: finalized bake string map -RDI_PROC RDIM_BakeStringMapFinal -rdim_bake_string_map_final_from_chunk_list_map(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMapBaseIndices *map_base_indices, RDIM_BakeStringChunkListMap *map) +RDI_PROC RDIM_BakeStringMapTight +rdim_bake_string_map_tight_from_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapBaseIndices *map_base_indices, RDIM_BakeStringMapLoose *map) { - RDIM_BakeStringMapFinal m = {0}; + RDIM_BakeStringMapTight m = {0}; m.slots_count = map_topology->slots_count; m.slots = rdim_push_array(arena, RDIM_BakeStringChunkList, m.slots_count); m.slots_base_idxs = map_base_indices->slots_base_idxs; @@ -1436,7 +1436,7 @@ rdim_bake_string_map_final_from_chunk_list_map(RDIM_Arena *arena, RDIM_BakeStrin } RDI_PROC RDI_U64 -rdim_bake_idx_from_string(RDIM_BakeStringMapFinal *map, RDIM_String8 string) +rdim_bake_idx_from_string(RDIM_BakeStringMapTight *map, RDIM_String8 string) { RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); RDI_U64 slot_idx = hash%map->slots_count; @@ -1455,64 +1455,6 @@ rdim_bake_idx_from_string(RDIM_BakeStringMapFinal *map, RDIM_String8 string) return idx; } -//- rjf: bake string map reading/writing - -RDI_PROC RDI_U32 -rdim_bake_idx_from_string_OLD(RDIM_BakeStringMap *map, RDIM_String8 string) -{ - RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeStringNode *node = 0; - for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->v.hash == hash && rdim_str8_match(n->v.string, string, 0)) - { - node = n; - break; - } - } - - // rjf: node -> index - RDI_U32 result = node ? node->idx : 0; - return result; -} - -RDI_PROC RDI_U32 -rdim_bake_string_map_insert(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string) -{ - RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeStringNode *node = 0; - for(RDIM_BakeStringNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->v.hash == hash && rdim_str8_match(n->v.string, string, 0)) - { - node = n; - break; - } - } - - // rjf: no node -> make new node - if(node == 0) - { - node = rdim_push_array(arena, RDIM_BakeStringNode, 1); - node->v.string = string; - node->v.hash = hash; - node->idx = map->count; - map->count += 1; - RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); - RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); - } - - // rjf: node -> index - RDI_U32 result = node->idx; - return result; -} - //- rjf: bake idx run map reading/writing RDI_PROC RDI_U64 @@ -1835,97 +1777,97 @@ rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSecti //- rjf: basic bake string gathering passes RDI_PROC void -rdim_bake_string_chunk_list_map_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TopLevelInfo *tli) +rdim_bake_string_map_loose_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TopLevelInfo *tli) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, tli->exe_name); + rdim_bake_string_map_loose_insert(arena, top, map, 1, tli->exe_name); } RDI_PROC void -rdim_bake_string_chunk_list_map_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BinarySectionList *secs) +rdim_bake_string_map_loose_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BinarySectionList *secs) { for(RDIM_BinarySectionNode *n = secs->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, n->v.name); + rdim_bake_string_map_loose_insert(arena, top, map, 1, n->v.name); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BakePathTree *path_tree) +rdim_bake_string_map_loose_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BakePathTree *path_tree) { for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, n->name); + rdim_bake_string_map_loose_insert(arena, top, map, 1, n->name); } } //- rjf: chunk-granularity bake string gathering passes RDI_PROC void -rdim_bake_string_chunk_list_map_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFile *v, RDI_U64 count) +rdim_bake_string_map_loose_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFile *v, RDI_U64 count) { for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 1, v[idx].normal_full_path); + rdim_bake_string_map_loose_insert(arena, top, map, 1, v[idx].normal_full_path); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Unit *v, RDI_U64 count) +rdim_bake_string_map_loose_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Unit *v, RDI_U64 count) { for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].unit_name); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].compiler_name); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].source_file); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].object_file); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].archive_file); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].build_path); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].unit_name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].compiler_name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].source_file); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].object_file); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].archive_file); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].build_path); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Type *v, RDI_U64 count) +rdim_bake_string_map_loose_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Type *v, RDI_U64 count) { for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].name); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDT *v, RDI_U64 count) +rdim_bake_string_map_loose_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDT *v, RDI_U64 count) { for(RDI_U64 idx = 0; idx < count; idx += 1) { for(RDIM_UDTMember *mem = v[idx].first_member; mem != 0; mem = mem->next) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, mem->name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, mem->name); } for(RDIM_UDTEnumVal *mem = v[idx].first_enum_val; mem != 0; mem = mem->next) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, mem->name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, mem->name); } } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Symbol *v, RDI_U64 count) +rdim_bake_string_map_loose_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Symbol *v, RDI_U64 count) { for(RDI_U64 idx = 0; idx < count; idx += 1) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].name); - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, v[idx].link_name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].link_name); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Scope *v, RDI_U64 count) +rdim_bake_string_map_loose_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Scope *v, RDI_U64 count) { for(RDI_U64 idx = 0; idx < count; idx += 1) { for(RDIM_Local *local = v[idx].first_local; local != 0; local = local->next) { - rdim_bake_string_chunk_list_map_insert(arena, top, map, 4, local->name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, local->name); } } } @@ -1933,194 +1875,59 @@ rdim_bake_string_chunk_list_map_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStr //- rjf: list-granularity bake string gathering passes RDI_PROC void -rdim_bake_string_chunk_list_map_push_src_files(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkList *list) +rdim_bake_string_map_loose_push_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFileChunkList *list) { for(RDIM_SrcFileChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_src_file_slice(arena, top, map, n->v, n->count); + rdim_bake_string_map_loose_push_src_file_slice(arena, top, map, n->v, n->count); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_units(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UnitChunkList *list) +rdim_bake_string_map_loose_push_units(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UnitChunkList *list) { for(RDIM_UnitChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_unit_slice(arena, top, map, n->v, n->count); + rdim_bake_string_map_loose_push_unit_slice(arena, top, map, n->v, n->count); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_types(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TypeChunkList *list) +rdim_bake_string_map_loose_push_types(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TypeChunkList *list) { for(RDIM_TypeChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_type_slice(arena, top, map, n->v, n->count); + rdim_bake_string_map_loose_push_type_slice(arena, top, map, n->v, n->count); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_udts(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDTChunkList *list) +rdim_bake_string_map_loose_push_udts(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDTChunkList *list) { for(RDIM_UDTChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_udt_slice(arena, top, map, n->v, n->count); + rdim_bake_string_map_loose_push_udt_slice(arena, top, map, n->v, n->count); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_symbols(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SymbolChunkList *list) +rdim_bake_string_map_loose_push_symbols(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SymbolChunkList *list) { for(RDIM_SymbolChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_symbol_slice(arena, top, map, n->v, n->count); + rdim_bake_string_map_loose_push_symbol_slice(arena, top, map, n->v, n->count); } } RDI_PROC void -rdim_bake_string_chunk_list_map_push_scopes(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_ScopeChunkList *list) +rdim_bake_string_map_loose_push_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_ScopeChunkList *list) { for(RDIM_ScopeChunkNode *n = list->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_scope_slice(arena, top, map, n->v, n->count); + rdim_bake_string_map_loose_push_scope_slice(arena, top, map, n->v, n->count); } } -//- rjf: bake string map from params - -RDI_PROC RDIM_BakeStringMap * -rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) -{ - //- rjf: set up map - RDIM_BakeStringMap *strings = rdim_push_array(arena, RDIM_BakeStringMap, 1); - strings->slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - strings->slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings->slots_count); - rdim_bake_string_map_insert(arena, strings, rdim_str8_lit("")); - - //- rjf: bake exe name - rdim_bake_string_map_insert(arena, strings, params->top_level_info.exe_name); - - //- rjf: bake binary section names - for(RDIM_BinarySectionNode *n = params->binary_sections.first; n != 0; n = n->next) - { - rdim_bake_string_map_insert(arena, strings, n->v.name); - } - - //- rjf: bake source file normalized full paths - for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - rdim_bake_string_map_insert(arena, strings, n->v[idx].normal_full_path); - } - } - - //- rjf: bake file path parts - for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) - { - rdim_bake_string_map_insert(arena, strings, n->name); - } - - //- rjf: bake unit strings - RDIM_ProfScope("bake unit strings") - { - for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - rdim_bake_string_map_insert(arena, strings, n->v[idx].unit_name); - rdim_bake_string_map_insert(arena, strings, n->v[idx].compiler_name); - rdim_bake_string_map_insert(arena, strings, n->v[idx].source_file); - rdim_bake_string_map_insert(arena, strings, n->v[idx].object_file); - rdim_bake_string_map_insert(arena, strings, n->v[idx].archive_file); - rdim_bake_string_map_insert(arena, strings, n->v[idx].build_path); - } - } - } - - //- rjf: bake type strings - RDIM_ProfScope("bake type strings") - { - for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - rdim_bake_string_map_insert(arena, strings, n->v[idx].name); - } - } - } - - //- rjf: bake udt member names - RDIM_ProfScope("bake udt member names") - { - for(RDIM_UDTChunkNode *n = params->udts.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - for(RDIM_UDTMember *mem = n->v[idx].first_member; mem != 0; mem = mem->next) - { - rdim_bake_string_map_insert(arena, strings, mem->name); - } - for(RDIM_UDTEnumVal *mem = n->v[idx].first_enum_val; mem != 0; mem = mem->next) - { - rdim_bake_string_map_insert(arena, strings, mem->name); - } - } - } - } - - //- rjf: bake src file names - RDIM_ProfScope("bake src file names") - { - for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - rdim_bake_string_map_insert(arena, strings, n->v[idx].normal_full_path); - } - } - } - - //- rjf: bake symbol names - RDIM_ProfScope("bake symbol names") - { - RDIM_SymbolChunkList *symbol_lists[] = - { - ¶ms->global_variables, - ¶ms->thread_variables, - ¶ms->procedures, - }; - for(RDI_U64 list_idx = 0; list_idx < sizeof(symbol_lists)/sizeof(symbol_lists[0]); list_idx += 1) - { - for(RDIM_SymbolChunkNode *n = symbol_lists[list_idx]->first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - rdim_bake_string_map_insert(arena, strings, n->v[idx].name); - rdim_bake_string_map_insert(arena, strings, n->v[idx].link_name); - } - } - } - } - - //- rjf: bake scope names - RDIM_ProfScope("bake scope names") - { - for(RDIM_ScopeChunkNode *n = params->scopes.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - for(RDIM_Local *local = n->v[idx].first_local; local != 0; local = local->next) - { - rdim_bake_string_map_insert(arena, strings, local->name); - } - } - } - } - - return strings; -} - //- rjf: bake name map building RDI_PROC RDIM_BakeNameMap * @@ -2327,7 +2134,7 @@ rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) //- rjf: top-level info RDI_PROC RDIM_BakeSectionList -rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) +rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; RDI_TopLevelInfo *dst_tli = rdim_push_array(arena, RDI_TopLevelInfo, 1); @@ -2343,7 +2150,7 @@ rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeSt //- rjf: binary sections RDI_PROC RDIM_BakeSectionList -rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) +rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; RDIM_BinarySectionList *src_list = ¶ms->binary_sections; @@ -2491,7 +2298,7 @@ rdim_bake_section_list_from_unit(RDIM_Arena *arena, RDIM_Unit *unit) } RDI_PROC RDIM_BakeSectionList -rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) +rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, params->units.total_count+1); @@ -2715,7 +2522,7 @@ rdim_bake_unit_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams //- rjf: source files RDI_PROC RDIM_BakeSectionList -rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) +rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params) { RDIM_BakeSectionList sections = {0}; @@ -2901,7 +2708,7 @@ rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMa //- rjf: type nodes RDI_PROC RDIM_BakeSectionList -rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params) +rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params) { //- rjf: build all type nodes RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count+1); @@ -2974,7 +2781,7 @@ rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM //- rjf: UDTs RDI_PROC RDIM_BakeSectionList -rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) +rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params) { //- rjf: build tables RDI_UDT * udts = push_array(arena, RDI_UDT, params->udts.total_count+1); @@ -3044,7 +2851,7 @@ rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFina //- rjf: global variables RDI_PROC RDIM_BakeSectionList -rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) +rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params) { //- rjf: build all global variables RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, params->global_variables.total_count+1); @@ -3165,7 +2972,7 @@ rdim_bake_global_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParam //- rjf: thread variables RDI_PROC RDIM_BakeSectionList -rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) +rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params) { //- rjf: build all thread variables RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, params->thread_variables.total_count+1); @@ -3207,7 +3014,7 @@ rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeS //- rjf: procedures RDI_PROC RDIM_BakeSectionList -rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) +rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params) { //- rjf: build all procedures RDI_Procedure *procedures = push_array(arena, RDI_Procedure, params->procedures.total_count+1); @@ -3250,7 +3057,7 @@ rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM //- rjf: scopes RDI_PROC RDIM_BakeSectionList -rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params) +rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params) { RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); @@ -3479,7 +3286,7 @@ rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams //- rjf: name maps RDI_PROC RDIM_BakeSectionList -rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) +rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) { RDIM_BakeSectionList sections = {0}; @@ -3519,7 +3326,7 @@ rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RD } RDI_PROC RDIM_BakeSectionList -rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map) +rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map) { RDIM_BakeSectionList sections = {0}; if(map != 0 && map->name_count != 0) @@ -3625,7 +3432,7 @@ rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_Bak //- rjf: file paths RDI_PROC RDIM_BakeSectionList -rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree) +rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree) { RDI_U32 dst_nodes_count = path_tree->count; RDI_FilePathNode *dst_nodes = rdim_push_array(arena, RDI_FilePathNode, dst_nodes_count); @@ -3660,7 +3467,7 @@ rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStri //- rjf: strings RDI_PROC RDIM_BakeSectionList -rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings) +rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings) { RDIM_BakeSectionList sections = {0}; RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, strings->total_count + 1); diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index d28f7e55..6759c331 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -860,26 +860,26 @@ struct RDIM_BakeStringChunkList RDI_U64 total_count; }; -typedef struct RDIM_BakeStringChunkListMapTopology RDIM_BakeStringChunkListMapTopology; -struct RDIM_BakeStringChunkListMapTopology +typedef struct RDIM_BakeStringMapTopology RDIM_BakeStringMapTopology; +struct RDIM_BakeStringMapTopology { RDI_U64 slots_count; }; -typedef struct RDIM_BakeStringChunkListMapBaseIndices RDIM_BakeStringChunkListMapBaseIndices; -struct RDIM_BakeStringChunkListMapBaseIndices +typedef struct RDIM_BakeStringMapBaseIndices RDIM_BakeStringMapBaseIndices; +struct RDIM_BakeStringMapBaseIndices { RDI_U64 *slots_base_idxs; }; -typedef struct RDIM_BakeStringChunkListMap RDIM_BakeStringChunkListMap; -struct RDIM_BakeStringChunkListMap +typedef struct RDIM_BakeStringMapLoose RDIM_BakeStringMapLoose; +struct RDIM_BakeStringMapLoose { RDIM_BakeStringChunkList **slots; }; -typedef struct RDIM_BakeStringMapFinal RDIM_BakeStringMapFinal; -struct RDIM_BakeStringMapFinal +typedef struct RDIM_BakeStringMapTight RDIM_BakeStringMapTight; +struct RDIM_BakeStringMapTight { RDIM_BakeStringChunkList *slots; RDI_U64 *slots_base_idxs; @@ -887,25 +887,6 @@ struct RDIM_BakeStringMapFinal RDI_U64 total_count; }; -typedef struct RDIM_BakeStringNode RDIM_BakeStringNode; -struct RDIM_BakeStringNode -{ - RDIM_BakeStringNode *hash_next; - RDIM_BakeStringNode *order_next; - RDIM_BakeString v; - RDI_U32 idx; -}; - -typedef struct RDIM_BakeStringMap RDIM_BakeStringMap; -struct RDIM_BakeStringMap -{ - RDIM_BakeStringNode *order_first; - RDIM_BakeStringNode *order_last; - RDIM_BakeStringNode **slots; - RDI_U64 slots_count; - RDI_U32 count; -}; - //- rjf: index runs typedef struct RDIM_BakeIdxRunNode RDIM_BakeIdxRunNode; @@ -1147,18 +1128,14 @@ RDI_PROC void rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkLi RDI_PROC RDIM_BakeStringChunkList rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src); //- rjf: bake string chunk list maps -RDI_PROC RDIM_BakeStringChunkListMap *rdim_bake_string_chunk_list_map_make(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top); -RDI_PROC void rdim_bake_string_chunk_list_map_insert(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map, RDI_U64 chunk_cap, RDIM_String8 string); -RDI_PROC void rdim_bake_string_chunk_list_map_join_in_place(RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *dst, RDIM_BakeStringChunkListMap *src); -RDI_PROC RDIM_BakeStringChunkListMapBaseIndices rdim_bake_string_chunk_list_base_indices_from_map(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMap *map); +RDI_PROC RDIM_BakeStringMapLoose *rdim_bake_string_map_loose_make(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top); +RDI_PROC void rdim_bake_string_map_loose_insert(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map, RDI_U64 chunk_cap, RDIM_String8 string); +RDI_PROC void rdim_bake_string_map_loose_join_in_place(RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *dst, RDIM_BakeStringMapLoose *src); +RDI_PROC RDIM_BakeStringMapBaseIndices rdim_bake_string_map_base_indices_from_map_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map); //- rjf: finalized bake string map -RDI_PROC RDIM_BakeStringMapFinal rdim_bake_string_map_final_from_chunk_list_map(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *map_topology, RDIM_BakeStringChunkListMapBaseIndices *map_base_indices, RDIM_BakeStringChunkListMap *map); -RDI_PROC RDI_U64 rdim_bake_idx_from_string(RDIM_BakeStringMapFinal *map, RDIM_String8 string); - -//- rjf: bake string map reading/writing -RDI_PROC RDI_U32 rdim_bake_idx_from_string_OLD(RDIM_BakeStringMap *map, RDIM_String8 string); -RDI_PROC RDI_U32 rdim_bake_string_map_insert(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string); +RDI_PROC RDIM_BakeStringMapTight rdim_bake_string_map_tight_from_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapBaseIndices *map_base_indices, RDIM_BakeStringMapLoose *map); +RDI_PROC RDI_U64 rdim_bake_idx_from_string(RDIM_BakeStringMapTight *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); @@ -1184,28 +1161,25 @@ RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, //~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures //- rjf: basic bake string gathering passes -RDI_PROC void rdim_bake_string_chunk_list_map_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TopLevelInfo *tli); -RDI_PROC void rdim_bake_string_chunk_list_map_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BinarySectionList *secs); -RDI_PROC void rdim_bake_string_chunk_list_map_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_BakePathTree *path_tree); +RDI_PROC void rdim_bake_string_map_loose_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TopLevelInfo *tli); +RDI_PROC void rdim_bake_string_map_loose_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BinarySectionList *secs); +RDI_PROC void rdim_bake_string_map_loose_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BakePathTree *path_tree); //- rjf: slice-granularity bake string gathering passes -RDI_PROC void rdim_bake_string_chunk_list_map_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFile *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_chunk_list_map_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Unit *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_chunk_list_map_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Type *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_chunk_list_map_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDT *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_chunk_list_map_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Symbol *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_chunk_list_map_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_Scope *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFile *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Unit *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Type *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDT *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Symbol *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Scope *v, RDI_U64 count); //- rjf: list-granularity bake string gathering passes -RDI_PROC void rdim_bake_string_chunk_list_map_push_src_files(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SrcFileChunkList *list); -RDI_PROC void rdim_bake_string_chunk_list_map_push_units(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UnitChunkList *list); -RDI_PROC void rdim_bake_string_chunk_list_map_push_types(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_TypeChunkList *list); -RDI_PROC void rdim_bake_string_chunk_list_map_push_udts(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_UDTChunkList *list); -RDI_PROC void rdim_bake_string_chunk_list_map_push_symbols(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_SymbolChunkList *list); -RDI_PROC void rdim_bake_string_chunk_list_map_push_scopes(RDIM_Arena *arena, RDIM_BakeStringChunkListMapTopology *top, RDIM_BakeStringChunkListMap *map, RDIM_ScopeChunkList *list); - -//- rjf: bake string map building -RDI_PROC RDIM_BakeStringMap *rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params); +RDI_PROC void rdim_bake_string_map_loose_push_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFileChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_units(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UnitChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_types(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TypeChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_udts(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDTChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_symbols(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SymbolChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_ScopeChunkList *list); //- 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); @@ -1220,54 +1194,54 @@ RDI_PROC RDIM_BakePathTree *rdim_bake_path_tree_from_params(RDIM_Arena *arena, R //~ 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_BakeStringMapFinal *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params); //- rjf: binary sections -RDI_PROC RDIM_BakeSectionList rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params); //- rjf: units RDI_PROC RDIM_BakeSectionList rdim_bake_section_list_from_unit(RDIM_Arena *arena, RDIM_Unit *unit); -RDI_PROC RDIM_BakeSectionList rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_unit_top_level_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *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_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *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_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params); //- rjf: UDTs -RDI_PROC RDIM_BakeSectionList rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params); //- rjf: global variables -RDI_PROC RDIM_BakeSectionList rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params); //- rjf: global vmap RDI_PROC RDIM_BakeSectionList rdim_bake_global_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); //- rjf: thread variables -RDI_PROC RDIM_BakeSectionList rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params); //- rjf: procedures -RDI_PROC RDIM_BakeSectionList rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeParams *params); //- rjf: scopes -RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeParams *params); +RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, 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_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); -RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map); +RDI_PROC RDIM_BakeSectionList rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); +RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map); //- rjf: file paths -RDI_PROC RDIM_BakeSectionList rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings, RDIM_BakePathTree *path_tree); +RDI_PROC RDIM_BakeSectionList rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree); //- rjf: strings -RDI_PROC RDIM_BakeSectionList rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMapFinal *strings); +RDI_PROC RDIM_BakeSectionList rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMapTight *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); diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 747ced64..da0fe2c0 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3476,14 +3476,14 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point) { P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)p; - ProfScope("bake src file strings") rdim_bake_string_chunk_list_map_push_src_files(arena, in->top, in->maps[thread_idx], in->list); + ProfScope("bake src file strings") rdim_bake_string_map_loose_push_src_files(arena, in->top, in->maps[thread_idx], in->list); return 0; } internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point) { P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)p; - ProfScope("bake unit strings") rdim_bake_string_chunk_list_map_push_units(arena, in->top, in->maps[thread_idx], in->list); + ProfScope("bake unit strings") rdim_bake_string_map_loose_push_units(arena, in->top, in->maps[thread_idx], in->list); return 0; } @@ -3494,7 +3494,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point) { for(P2R_BakeTypesStringsInNode *n = in->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_type_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + rdim_bake_string_map_loose_push_type_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); } } return 0; @@ -3507,7 +3507,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point) { for(P2R_BakeUDTsStringsInNode *n = in->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_udt_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + rdim_bake_string_map_loose_push_udt_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); } } return 0; @@ -3520,7 +3520,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point) { for(P2R_BakeSymbolsStringsInNode *n = in->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_symbol_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + rdim_bake_string_map_loose_push_symbol_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); } } return 0; @@ -3533,7 +3533,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point) { for(P2R_BakeScopesStringsInNode *n = in->first; n != 0; n = n->next) { - rdim_bake_string_chunk_list_map_push_scope_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + rdim_bake_string_map_loose_push_scope_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); } } return 0; @@ -3594,14 +3594,6 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_sort_task__entry_point) //- rjf: pass 1: interner/deduper map builds -internal TS_TASK_FUNCTION_DEF(p2r_build_bake_string_map_task__entry_point) -{ - P2R_BuildBakeStringMapIn *in = (P2R_BuildBakeStringMapIn *)p; - RDIM_BakeStringMap *strings = 0; - ProfScope("build interned string map") strings = rdim_bake_string_map_from_params(arena, in->path_tree, in->params); - return strings; -} - internal TS_TASK_FUNCTION_DEF(p2r_build_bake_name_map_task__entry_point) { P2R_BuildBakeNameMapIn *in = (P2R_BuildBakeNameMapIn *)p; @@ -3775,23 +3767,28 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } //- rjf: kick off string map building tasks - RDIM_BakeStringChunkListMapTopology bake_string_chunk_list_map_topology = {(params->procedures.total_count*1 + - params->global_variables.total_count*1 + - params->thread_variables.total_count*1 + - params->types.total_count/2)}; - RDIM_BakeStringChunkListMap **bake_string_chunk_list_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringChunkListMap *, ts_thread_count()); + RDIM_BakeStringMapTopology bake_string_map_topology = {(params->procedures.total_count*1 + + params->global_variables.total_count*1 + + params->thread_variables.total_count*1 + + params->types.total_count/2)}; + RDIM_BakeStringMapLoose **bake_string_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringMapLoose *, ts_thread_count()); for(U64 idx = 0; idx < ts_thread_count(); idx += 1) { - bake_string_chunk_list_maps__in_progress[idx] = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); + bake_string_maps__in_progress[idx] = rdim_bake_string_map_loose_make(arena, &bake_string_map_topology); } TS_TicketList bake_string_map_build_tickets = {0}; { + // rjf: basics + rdim_bake_string_map_loose_push_top_level_info(arena, &bake_string_map_topology, bake_string_maps__in_progress[0], ¶ms->top_level_info); + rdim_bake_string_map_loose_push_binary_sections(arena, &bake_string_map_topology, bake_string_maps__in_progress[0], ¶ms->binary_sections); + rdim_bake_string_map_loose_push_path_tree(arena, &bake_string_map_topology, bake_string_maps__in_progress[0], path_tree); + // rjf: src files ProfScope("kick off src files string map build task") { P2R_BakeSrcFilesStringsIn *in = push_array(scratch.arena, P2R_BakeSrcFilesStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; in->list = ¶ms->src_files; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_src_files_strings_task__entry_point, 0, in)); } @@ -3800,8 +3797,8 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) ProfScope("kick off units string map build task") { P2R_BakeUnitsStringsIn *in = push_array(scratch.arena, P2R_BakeUnitsStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; in->list = ¶ms->units; ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_units_strings_task__entry_point, 0, in)); } @@ -3816,8 +3813,8 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) { P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; P2R_BakeTypesStringsInNode *n = push_array(scratch.arena, P2R_BakeTypesStringsInNode, 1); SLLQueuePush(in->first, in->last, n); n->v = chunk->v + task_idx*items_per_task; @@ -3837,8 +3834,8 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) { P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; P2R_BakeUDTsStringsInNode *n = push_array(scratch.arena, P2R_BakeUDTsStringsInNode, 1); SLLQueuePush(in->first, in->last, n); n->v = chunk->v + task_idx*items_per_task; @@ -3866,8 +3863,8 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) { P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; P2R_BakeSymbolsStringsInNode *n = push_array(scratch.arena, P2R_BakeSymbolsStringsInNode, 1); SLLQueuePush(in->first, in->last, n); n->v = chunk->v + task_idx*items_per_task; @@ -3888,8 +3885,8 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1) { P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->maps = bake_string_chunk_list_maps__in_progress; + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; P2R_BakeScopesStringsInNode *n = push_array(scratch.arena, P2R_BakeScopesStringsInNode, 1); SLLQueuePush(in->first, in->last, n); n->v = chunk->v + task_idx*items_per_task; @@ -3922,21 +3919,21 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) } //- rjf: produce joined string map - RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); + RDIM_BakeStringMapLoose *unsorted_bake_string_map = rdim_bake_string_map_loose_make(arena, &bake_string_map_topology); ProfScope("produce joined string map") { U64 slots_per_task = 16384; - U64 num_tasks = (bake_string_chunk_list_map_topology.slots_count+slots_per_task-1)/slots_per_task; + U64 num_tasks = (bake_string_map_topology.slots_count+slots_per_task-1)/slots_per_task; TS_Ticket *task_tickets = push_array(scratch.arena, TS_Ticket, num_tasks); // rjf: kickoff tasks for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) { P2R_JoinBakeStringMapSlotsIn *in = push_array(scratch.arena, P2R_JoinBakeStringMapSlotsIn, 1); - in->top = &bake_string_chunk_list_map_topology; - in->src_maps = bake_string_chunk_list_maps__in_progress; + in->top = &bake_string_map_topology; + in->src_maps = bake_string_maps__in_progress; in->src_maps_count = ts_thread_count(); - in->dst_map = unsorted_bake_string_chunk_list_map; + in->dst_map = unsorted_bake_string_map; in->slot_idx_range = r1u64(task_idx*slots_per_task, task_idx*slots_per_task + slots_per_task); in->slot_idx_range.max = Min(in->slot_idx_range.max, in->top->slots_count); task_tickets[task_idx] = ts_kickoff(p2r_bake_string_map_join_task__entry_point, 0, in); @@ -3951,22 +3948,22 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) //- rjf: kick off string map sorting tasks TS_TicketList sort_bake_string_map_task_tickets = {0}; - RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map__in_progress = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology); + RDIM_BakeStringMapLoose *sorted_bake_string_map__in_progress = rdim_bake_string_map_loose_make(arena, &bake_string_map_topology); { U64 slots_per_task = 4096; - U64 num_tasks = (bake_string_chunk_list_map_topology.slots_count+slots_per_task-1)/slots_per_task; + U64 num_tasks = (bake_string_map_topology.slots_count+slots_per_task-1)/slots_per_task; for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) { P2R_SortBakeStringMapSlotsIn *in = push_array(scratch.arena, P2R_SortBakeStringMapSlotsIn, 1); { - in->top = &bake_string_chunk_list_map_topology; - in->src_map = unsorted_bake_string_chunk_list_map; - in->dst_map = sorted_bake_string_chunk_list_map__in_progress; + in->top = &bake_string_map_topology; + in->src_map = unsorted_bake_string_map; + in->dst_map = sorted_bake_string_map__in_progress; in->slot_idx = task_idx*slots_per_task; in->slot_count = slots_per_task; - if(in->slot_idx+in->slot_count > bake_string_chunk_list_map_topology.slots_count) + if(in->slot_idx+in->slot_count > bake_string_map_topology.slots_count) { - in->slot_count = bake_string_chunk_list_map_topology.slots_count - in->slot_idx; + in->slot_count = bake_string_map_topology.slots_count - in->slot_idx; } } ts_ticket_list_push(scratch.arena, &sort_bake_string_map_task_tickets, ts_kickoff(p2r_bake_string_map_sort_task__entry_point, 0, in)); @@ -3981,14 +3978,14 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) ts_join(n->v, max_U64); } } - RDIM_BakeStringChunkListMap *sorted_bake_string_chunk_list_map = sorted_bake_string_chunk_list_map__in_progress; + RDIM_BakeStringMapLoose *sorted_bake_string_map = sorted_bake_string_map__in_progress; //- rjf: build finalized string map ProfBegin("build finalized string map base indices"); - RDIM_BakeStringChunkListMapBaseIndices bake_string_chunk_list_map_base_idxes = rdim_bake_string_chunk_list_base_indices_from_map(arena, &bake_string_chunk_list_map_topology, sorted_bake_string_chunk_list_map); + RDIM_BakeStringMapBaseIndices bake_string_map_base_idxes = rdim_bake_string_map_base_indices_from_map_loose(arena, &bake_string_map_topology, sorted_bake_string_map); ProfEnd(); ProfBegin("build finalized string map"); - RDIM_BakeStringMapFinal bake_strings = rdim_bake_string_map_final_from_chunk_list_map(arena, &bake_string_chunk_list_map_topology, &bake_string_chunk_list_map_base_idxes, sorted_bake_string_chunk_list_map); + RDIM_BakeStringMapTight bake_strings = rdim_bake_string_map_tight_from_loose(arena, &bake_string_map_topology, &bake_string_map_base_idxes, sorted_bake_string_map); ProfEnd(); //- rjf: kick off pass 2 tasks diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.h b/src/raddbgi_from_pdb/raddbgi_from_pdb.h index 860dde62..7b1ae67e 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.h +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.h @@ -248,16 +248,16 @@ struct P2R_SymbolStreamConvertOut typedef struct P2R_BakeSrcFilesStringsIn P2R_BakeSrcFilesStringsIn; struct P2R_BakeSrcFilesStringsIn { - RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap **maps; + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; RDIM_SrcFileChunkList *list; }; typedef struct P2R_BakeUnitsStringsIn P2R_BakeUnitsStringsIn; struct P2R_BakeUnitsStringsIn { - RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap **maps; + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; RDIM_UnitChunkList *list; }; @@ -272,8 +272,8 @@ struct P2R_BakeTypesStringsInNode typedef struct P2R_BakeTypesStringsIn P2R_BakeTypesStringsIn; struct P2R_BakeTypesStringsIn { - RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap **maps; + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; P2R_BakeTypesStringsInNode *first; P2R_BakeTypesStringsInNode *last; }; @@ -289,8 +289,8 @@ struct P2R_BakeUDTsStringsInNode typedef struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsIn; struct P2R_BakeUDTsStringsIn { - RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap **maps; + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; P2R_BakeUDTsStringsInNode *first; P2R_BakeUDTsStringsInNode *last; }; @@ -306,8 +306,8 @@ struct P2R_BakeSymbolsStringsInNode typedef struct P2R_BakeSymbolsStringsIn P2R_BakeSymbolsStringsIn; struct P2R_BakeSymbolsStringsIn { - RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap **maps; + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; P2R_BakeSymbolsStringsInNode *first; P2R_BakeSymbolsStringsInNode *last; }; @@ -323,8 +323,8 @@ struct P2R_BakeScopesStringsInNode typedef struct P2R_BakeScopesStringsIn P2R_BakeScopesStringsIn; struct P2R_BakeScopesStringsIn { - RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap **maps; + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; P2R_BakeScopesStringsInNode *first; P2R_BakeScopesStringsInNode *last; }; @@ -334,10 +334,10 @@ struct P2R_BakeScopesStringsIn typedef struct P2R_JoinBakeStringMapSlotsIn P2R_JoinBakeStringMapSlotsIn; struct P2R_JoinBakeStringMapSlotsIn { - RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap **src_maps; + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **src_maps; U64 src_maps_count; - RDIM_BakeStringChunkListMap *dst_map; + RDIM_BakeStringMapLoose *dst_map; Rng1U64 slot_idx_range; }; @@ -346,9 +346,9 @@ struct P2R_JoinBakeStringMapSlotsIn typedef struct P2R_SortBakeStringMapSlotsIn P2R_SortBakeStringMapSlotsIn; struct P2R_SortBakeStringMapSlotsIn { - RDIM_BakeStringChunkListMapTopology *top; - RDIM_BakeStringChunkListMap *src_map; - RDIM_BakeStringChunkListMap *dst_map; + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose *src_map; + RDIM_BakeStringMapLoose *dst_map; U64 slot_idx; U64 slot_count; }; @@ -374,7 +374,7 @@ struct P2R_BuildBakeNameMapIn typedef struct P2R_BakeUnitsTopLevelIn P2R_BakeUnitsTopLevelIn; struct P2R_BakeUnitsTopLevelIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakePathTree *path_tree; RDIM_BakeParams *params; }; @@ -394,7 +394,7 @@ struct P2R_BakeUnitVMapIn typedef struct P2R_BakeSrcFilesIn P2R_BakeSrcFilesIn; struct P2R_BakeSrcFilesIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakePathTree *path_tree; RDIM_BakeParams *params; }; @@ -402,14 +402,14 @@ struct P2R_BakeSrcFilesIn typedef struct P2R_BakeUDTsIn P2R_BakeUDTsIn; struct P2R_BakeUDTsIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakeParams *params; }; typedef struct P2R_BakeGlobalVariablesIn P2R_BakeGlobalVariablesIn; struct P2R_BakeGlobalVariablesIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakeParams *params; }; @@ -422,21 +422,21 @@ struct P2R_BakeGlobalVMapIn typedef struct P2R_BakeThreadVariablesIn P2R_BakeThreadVariablesIn; struct P2R_BakeThreadVariablesIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakeParams *params; }; typedef struct P2R_BakeProceduresIn P2R_BakeProceduresIn; struct P2R_BakeProceduresIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakeParams *params; }; typedef struct P2R_BakeScopesIn P2R_BakeScopesIn; struct P2R_BakeScopesIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakeParams *params; }; @@ -449,20 +449,20 @@ struct P2R_BakeScopeVMapIn typedef struct P2R_BakeFilePathsIn P2R_BakeFilePathsIn; struct P2R_BakeFilePathsIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakePathTree *path_tree; }; typedef struct P2R_BakeStringsIn P2R_BakeStringsIn; struct P2R_BakeStringsIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; }; typedef struct P2R_BakeTypeNodesIn P2R_BakeTypeNodesIn; struct P2R_BakeTypeNodesIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakeIdxRunMap *idx_runs; RDIM_BakeParams *params; }; @@ -470,7 +470,7 @@ struct P2R_BakeTypeNodesIn typedef struct P2R_BakeNameMapIn P2R_BakeNameMapIn; struct P2R_BakeNameMapIn { - RDIM_BakeStringMapFinal *strings; + RDIM_BakeStringMapTight *strings; RDIM_BakeIdxRunMap *idx_runs; RDIM_BakeParams *params; RDI_NameMapKind kind; @@ -575,7 +575,6 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_join_task__entry_point); internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_sort_task__entry_point); //- rjf: pass 1: interner/deduper map builds -internal TS_TASK_FUNCTION_DEF(p2r_build_bake_string_map_task__entry_point); internal TS_TASK_FUNCTION_DEF(p2r_build_bake_name_map_task__entry_point); //- rjf: pass 2: string-map-dependent debug info stream builds From 091269b1d87a31415ccebfa618f2eb9461a36a0b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 4 Mar 2024 11:53:12 -0800 Subject: [PATCH 163/275] eliminate synchronous per-thread string map building, just do it as-needed on each thread; --- src/lib_raddbgi_make/raddbgi_make.c | 3 +-- src/lib_raddbgi_make/raddbgi_make.h | 1 - src/raddbgi_from_pdb/raddbgi_from_pdb.c | 24 +++++++++++++++--------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 4c10a067..88026e8b 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -1227,7 +1227,6 @@ rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *li list->chunk_count += 1; } RDIM_BakeString *s = &n->v[n->count]; - s->chunk = n; n->count += 1; list->total_count += 1; return s; @@ -1691,7 +1690,7 @@ rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 s if(node == 0) { node = rdim_push_array(arena, RDIM_BakeNameMapNode, 1); - node->string = rdim_str8_copy(arena, string); + node->string = string; RDIM_SLLStackPush_N(map->slots[slot_idx], node, slot_next); RDIM_SLLQueuePush_N(map->first, map->last, node, order_next); map->name_count += 1; diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index 6759c331..3cb989f0 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -836,7 +836,6 @@ struct RDIM_BakeSectionList typedef struct RDIM_BakeString RDIM_BakeString; struct RDIM_BakeString { - struct RDIM_BakeStringChunkNode *chunk; RDI_U64 hash; RDIM_String8 string; }; diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index da0fe2c0..b285ad3b 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3473,9 +3473,12 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: bake string map building +#define p2r_make_string_map_if_needed() do {if(in->maps[thread_idx] == 0) ProfScope("make map") {in->maps[thread_idx] = rdim_bake_string_map_loose_make(arena, in->top);}} while(0) + internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point) { P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)p; + p2r_make_string_map_if_needed(); ProfScope("bake src file strings") rdim_bake_string_map_loose_push_src_files(arena, in->top, in->maps[thread_idx], in->list); return 0; } @@ -3483,6 +3486,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point) internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point) { P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)p; + p2r_make_string_map_if_needed(); ProfScope("bake unit strings") rdim_bake_string_map_loose_push_units(arena, in->top, in->maps[thread_idx], in->list); return 0; } @@ -3490,6 +3494,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point) internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point) { P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)p; + p2r_make_string_map_if_needed(); ProfScope("bake type strings") { for(P2R_BakeTypesStringsInNode *n = in->first; n != 0; n = n->next) @@ -3503,6 +3508,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point) internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point) { P2R_BakeUDTsStringsIn *in = (P2R_BakeUDTsStringsIn *)p; + p2r_make_string_map_if_needed(); ProfScope("bake udt strings") { for(P2R_BakeUDTsStringsInNode *n = in->first; n != 0; n = n->next) @@ -3516,6 +3522,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point) internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point) { P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)p; + p2r_make_string_map_if_needed(); ProfScope("bake symbol strings") { for(P2R_BakeSymbolsStringsInNode *n = in->first; n != 0; n = n->next) @@ -3529,6 +3536,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point) internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point) { P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)p; + p2r_make_string_map_if_needed(); ProfScope("bake scope strings") { for(P2R_BakeScopesStringsInNode *n = in->first; n != 0; n = n->next) @@ -3539,6 +3547,8 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point) return 0; } +#undef p2r_make_string_map_if_needed + //- rjf: bake string map joining internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_join_task__entry_point) @@ -3772,17 +3782,8 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) params->thread_variables.total_count*1 + params->types.total_count/2)}; RDIM_BakeStringMapLoose **bake_string_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringMapLoose *, ts_thread_count()); - for(U64 idx = 0; idx < ts_thread_count(); idx += 1) - { - bake_string_maps__in_progress[idx] = rdim_bake_string_map_loose_make(arena, &bake_string_map_topology); - } TS_TicketList bake_string_map_build_tickets = {0}; { - // rjf: basics - rdim_bake_string_map_loose_push_top_level_info(arena, &bake_string_map_topology, bake_string_maps__in_progress[0], ¶ms->top_level_info); - rdim_bake_string_map_loose_push_binary_sections(arena, &bake_string_map_topology, bake_string_maps__in_progress[0], ¶ms->binary_sections); - rdim_bake_string_map_loose_push_path_tree(arena, &bake_string_map_topology, bake_string_maps__in_progress[0], path_tree); - // rjf: src files ProfScope("kick off src files string map build task") { @@ -3944,6 +3945,11 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in) { ts_join(task_tickets[task_idx], max_U64); } + + // rjf: insert small top-level stuff + rdim_bake_string_map_loose_push_top_level_info(arena, &bake_string_map_topology, unsorted_bake_string_map, ¶ms->top_level_info); + rdim_bake_string_map_loose_push_binary_sections(arena, &bake_string_map_topology, unsorted_bake_string_map, ¶ms->binary_sections); + rdim_bake_string_map_loose_push_path_tree(arena, &bake_string_map_topology, unsorted_bake_string_map, path_tree); } //- rjf: kick off string map sorting tasks From 0c436f0d5b966e9b8a3d8cfaa37c2caf82ad1c20 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 Mar 2024 14:17:41 -0800 Subject: [PATCH 164/275] first pass at demon replacement layer; just trimming out old code & cruft & reading & naming pass --- project.4coder | 2 +- src/demon/win32/demon_os_win32.c | 2 +- src/demon2/demon2_core.c | 118 ++ src/demon2/demon2_core.h | 209 +++ src/demon2/demon2_core.mdesk | 80 + src/demon2/demon2_inc.c | 10 + src/demon2/demon2_inc.h | 15 + src/demon2/generated/demon2.meta.c | 8 + src/demon2/generated/demon2.meta.h | 63 + src/demon2/win32/demon2_core_win32.c | 2473 ++++++++++++++++++++++++++ src/demon2/win32/demon2_core_win32.h | 272 +++ src/raddbg/raddbg.h | 2 + src/scratch/ryan_scratch.c | 42 +- 13 files changed, 3286 insertions(+), 10 deletions(-) create mode 100644 src/demon2/demon2_core.c create mode 100644 src/demon2/demon2_core.h create mode 100644 src/demon2/demon2_core.mdesk create mode 100644 src/demon2/demon2_inc.c create mode 100644 src/demon2/demon2_inc.h create mode 100644 src/demon2/generated/demon2.meta.c create mode 100644 src/demon2/generated/demon2.meta.h create mode 100644 src/demon2/win32/demon2_core_win32.c create mode 100644 src/demon2/win32/demon2_core_win32.h diff --git a/project.4coder b/project.4coder index 4dfe8d84..f39bd033 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build raddbgi_from_pdb telemetry debug", + .win = "build ryan_scratch", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/demon/win32/demon_os_win32.c b/src/demon/win32/demon_os_win32.c index a27f816d..41a42a1c 100644 --- a/src/demon/win32/demon_os_win32.c +++ b/src/demon/win32/demon_os_win32.c @@ -13,7 +13,7 @@ global DWORD demon_w32_resume_tid = 0; global B32 demon_w32_exception_not_handled = 0; global DEMON_Entity* demon_w32_halter_process = 0; global DWORD demon_w32_halter_thread_id = 0; - +. global B32 demon_w32_new_process_pending = 0; global Arena *demon_w32_ext_arena = 0 ; diff --git a/src/demon2/demon2_core.c b/src/demon2/demon2_core.c new file mode 100644 index 00000000..ee3b7ed6 --- /dev/null +++ b/src/demon2/demon2_core.c @@ -0,0 +1,118 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Type Functions (Helpers, Implemented Once) + +//- rjf: handles + +internal DMN_Handle +dmn_handle_zero(void) +{ + DMN_Handle h = {0}; + return h; +} + +internal B32 +dmn_handle_match(DMN_Handle a, DMN_Handle b) +{ + return a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1]; +} + +//- rjf: trap chunk lists + +internal void +dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap) +{ + DMN_TrapChunkNode *node = list->last; + if(node == 0 || node->count >= node->cap) + { + node = push_array(arena, DMN_TrapChunkNode, 1); + node->cap = cap; + node->v = push_array_no_zero(arena, DMN_Trap, node->cap); + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + } + MemoryCopyStruct(&node->v[node->count], trap); + node->count += 1; + list->trap_count += 1; +} + +internal void +dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) +{ + if(dst->last == 0) + { + MemoryCopyStruct(dst, to_push); + } + else if(to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->node_count += to_push->node_count; + dst->trap_count += to_push->trap_count; + } + MemoryZeroStruct(to_push); +} + +internal void +dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) +{ + for(DMN_TrapChunkNode *src_n = to_push->first; src_n != 0; src_n = src_n->next) + { + DMN_TrapChunkNode *dst_n = push_array(arena, DMN_TrapChunkNode, 1); + dst_n->v = src_n->v; + dst_n->cap = src_n->cap; + dst_n->count = src_n->count; + SLLQueuePush(dst->first, dst->last, dst_n); + dst->node_count += 1; + dst->trap_count += dst_n->count; + } +} + +//- rjf: handle lists + +internal void +dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle) +{ + DMN_HandleNode *node = push_array(arena, DMN_HandleNode, 1); + SLLQueuePush(list->first, list->last, node); + node->v = handle; + list->count += 1; +} + +internal DMN_HandleArray +dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list) +{ + DMN_HandleArray array = {0}; + array.count = list->count; + array.handles = push_array_no_zero(arena, DMN_Handle, array.count); + U64 idx = 0; + for(DMN_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) + { + array.handles[idx] = n->v; + } + return array; +} + +internal DMN_HandleArray +dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src) +{ + DMN_HandleArray dst = {0}; + dst.count = src->count; + dst.handles = push_array_no_zero(arena, DMN_Handle, dst.count); + MemoryCopy(dst.handles, src->handles, sizeof(DMN_Handle)*dst.count); + return dst; +} + +//- rjf: event list building + +internal DMN_Event * +dmn_event_list_push(Arena *arena, DMN_EventList *list) +{ + DMN_EventNode *n = push_array(arena, DMN_EventNode, 1); + SLLQueuePush(list->first, list->last, n); + list->count += 1; + DMN_Event *result = &n->v; + return result; +} diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h new file mode 100644 index 00000000..081d532b --- /dev/null +++ b/src/demon2/demon2_core.h @@ -0,0 +1,209 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON2_CORE_H +#define DEMON2_CORE_H + +//////////////////////////////// +//~ rjf: Handle Types + +typedef struct DMN_Handle DMN_Handle; +struct DMN_Handle +{ + U32 u32[2]; +}; + +typedef struct DMN_HandleNode DMN_HandleNode; +struct DMN_HandleNode +{ + DMN_HandleNode *next; + DMN_Handle v; +}; + +typedef struct DMN_HandleList DMN_HandleList; +struct DMN_HandleList +{ + DMN_HandleNode *first; + DMN_HandleNode *last; + U64 count; +}; + +typedef struct DMN_HandleArray DMN_HandleArray; +struct DMN_HandleArray +{ + DMN_Handle *handles; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/demon2.meta.h" + +//////////////////////////////// +//~ rjf: Event Types + +typedef struct DMN_Event DMN_Event; +struct DMN_Event +{ + DMN_EventKind kind; + DMN_ErrorKind error_kind; + DMN_MemoryEventKind memory_kind; + DMN_ExceptionKind exception_kind; + DMN_Handle process; + DMN_Handle thread; + DMN_Handle module; + U64 address; + U64 size; + String8 string; + U32 code; // code gives pid & tid on CreateProcess and CreateThread (respectfully) + U32 flags; + S32 signo; + S32 sigcode; + U64 instruction_pointer; + U64 stack_pointer; + U64 user_data; + B32 exception_repeated; +}; + +typedef struct DMN_EventNode DMN_EventNode; +struct DMN_EventNode +{ + DMN_EventNode *next; + DMN_Event v; +}; + +typedef struct DMN_EventList DMN_EventList; +struct DMN_EventList +{ + DMN_EventNode *first; + DMN_EventNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Run Control Types + +typedef struct DMN_Trap DMN_Trap; +struct DMN_Trap +{ + DMN_Handle process; + U64 vaddr; + U64 id; +}; + +typedef struct DMN_TrapChunkNode DMN_TrapChunkNode; +struct DMN_TrapChunkNode +{ + DMN_TrapChunkNode *next; + DMN_Trap *v; + U64 cap; + U64 count; +}; + +typedef struct DMN_TrapChunkList DMN_TrapChunkList; +struct DMN_TrapChunkList +{ + DMN_TrapChunkNode *first; + DMN_TrapChunkNode *last; + U64 node_count; + U64 trap_count; +}; + +typedef struct DMN_RunCtrls DMN_RunCtrls; +struct DMN_RunCtrls +{ + DMN_Handle single_step_thread; + B8 ignore_previous_exception; + B8 run_entities_are_unfrozen; + B8 run_entities_are_processes; + DMN_Handle *run_entities; + U64 run_entity_count; + DMN_TrapChunkList traps; +}; + +//////////////////////////////// +//~ rjf: System Process Listing Types + +typedef struct DMN_ProcessIter DMN_ProcessIter; +struct DMN_ProcessIter +{ + U64 v[2]; +}; + +typedef struct DMN_ProcessInfo DMN_ProcessInfo; +struct DMN_ProcessInfo +{ + String8 name; + U32 pid; +}; + +//////////////////////////////// +//~ rjf: Basic Type Functions (Helpers, Implemented Once) + +//- rjf: handles +internal DMN_Handle dmn_handle_zero(void); +internal B32 dmn_handle_match(DMN_Handle a, DMN_Handle b); + +//- rjf: trap chunk lists +internal void dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap); +internal void dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); +internal void dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); + +//- rjf: handle lists +internal void dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle); +internal DMN_HandleArray dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list); +internal DMN_HandleArray dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src); + +//- rjf: event list building +internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) + +internal void dmn_init(void); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS) + +internal DMN_EventList dmn_run(Arena *arena, DMN_RunCtrls *ctrls); +internal void dmn_halt(U64 code, U64 user_data); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Process Launching/Attaching/Killing/Detaching (Implemented Per-OS) + +internal U32 dmn_launch_process(OS_LaunchOptions *options); +internal B32 dmn_attach_process(U32 pid); +internal B32 dmn_kill_process(DMN_Handle process, U32 exit_code); +internal B32 dmn_detach_process(DMN_Handle process); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Entities (Implemented Per-OS) + +//- rjf: basic entity info extraction +internal Architecture dmn_arch_from_handle(DMN_Handle handle); +internal String8 dmn_string_from_handle(Arena *arena, DMN_Handle handle); + +//- rjf: processes +internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); +internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); +#define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +#define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) + +//- rjf: modules +internal Rng1U64 dmn_vaddr_range_from_module(DMN_Handle handle); + +//- rjf: threads +internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); +internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); +internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); +internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks System Process Listing (Implemented Per-OS) + +internal void dmn_process_iter_begin(DMN_ProcessIter *iter); +internal B32 dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out); +internal void dmn_process_iter_end(DMN_ProcessIter *iter); + +#endif // DEMON2_CORE_H diff --git a/src/demon2/demon2_core.mdesk b/src/demon2/demon2_core.mdesk new file mode 100644 index 00000000..3df0d2fd --- /dev/null +++ b/src/demon2/demon2_core.mdesk @@ -0,0 +1,80 @@ +//////////////////////////////// +//~ rjf: Event Kind Tables + +@table(name) +DMN_EventKindTable: +{ + {Null} + {Error} + {HandshakeComplete} + {CreateProcess} + {ExitProcess} + {CreateThread} + {ExitThread} + {LoadModule} + {UnloadModule} + {Breakpoint} + {Trap} + {SingleStep} + {Exception} + {Halt} + {Memory} + {DebugString} + {SetThreadName} +} + +@table(name) +DMN_ErrorKindTable: +{ + {Null} + {NotAttached} + {UnexpectedFailure} + {InvalidHandle} +} + +@table(name) +DMN_MemoryEventKindTable: +{ + {Null} + {Commit} + {Reserve} + {Decommit} + {Release} +} + +@table(name) +DMN_ExceptionKindTable: +{ + {Null} + {MemoryRead} + {MemoryWrite} + {MemoryExecute} + {CppThrow} +} + +//////////////////////////////// +//~ rjf: Generators + +@enum DMN_EventKind: +{ + @expand(DMN_EventKindTable a) `$(a.name)`, + COUNT +} + +@enum DMN_ErrorKind: +{ + @expand(DMN_ErrorKindTable a) `$(a.name)`, + COUNT +} + +@enum DMN_MemoryEventKind: +{ + @expand(DMN_MemoryEventKindTable a) `$(a.name)`, + COUNT +} + +@enum DMN_ExceptionKind: +{ + @expand(DMN_ExceptionKindTable a) `$(a.name)`, + COUNT +} diff --git a/src/demon2/demon2_inc.c b/src/demon2/demon2_inc.c new file mode 100644 index 00000000..f6bb4837 --- /dev/null +++ b/src/demon2/demon2_inc.c @@ -0,0 +1,10 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "demon2_core.c" + +#if OS_WINDOWS +# include "win32/demon2_core_win32.c" +#else +# error Demon layer backend not defined for this operating system. +#endif diff --git a/src/demon2/demon2_inc.h b/src/demon2/demon2_inc.h new file mode 100644 index 00000000..e724c098 --- /dev/null +++ b/src/demon2/demon2_inc.h @@ -0,0 +1,15 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON2_INC_H +#define DEMON2_INC_H + +#include "demon2_core.h" + +#if OS_WINDOWS +# include "win32/demon2_core_win32.h" +#else +# error Demon layer backend not defined for this operating system. +#endif + +#endif // DEMON2_INC_H diff --git a/src/demon2/generated/demon2.meta.c b/src/demon2/generated/demon2.meta.c new file mode 100644 index 00000000..32e20884 --- /dev/null +++ b/src/demon2/generated/demon2.meta.c @@ -0,0 +1,8 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +C_LINKAGE_END + diff --git a/src/demon2/generated/demon2.meta.h b/src/demon2/generated/demon2.meta.h new file mode 100644 index 00000000..0cb8af87 --- /dev/null +++ b/src/demon2/generated/demon2.meta.h @@ -0,0 +1,63 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DEMON2_META_H +#define DEMON2_META_H + +typedef enum DMN_EventKind +{ +DMN_EventKind_Null, +DMN_EventKind_Error, +DMN_EventKind_HandshakeComplete, +DMN_EventKind_CreateProcess, +DMN_EventKind_ExitProcess, +DMN_EventKind_CreateThread, +DMN_EventKind_ExitThread, +DMN_EventKind_LoadModule, +DMN_EventKind_UnloadModule, +DMN_EventKind_Breakpoint, +DMN_EventKind_Trap, +DMN_EventKind_SingleStep, +DMN_EventKind_Exception, +DMN_EventKind_Halt, +DMN_EventKind_Memory, +DMN_EventKind_DebugString, +DMN_EventKind_SetThreadName, +DMN_EventKind_COUNT, +} DMN_EventKind; + +typedef enum DMN_ErrorKind +{ +DMN_ErrorKind_Null, +DMN_ErrorKind_NotAttached, +DMN_ErrorKind_UnexpectedFailure, +DMN_ErrorKind_InvalidHandle, +DMN_ErrorKind_COUNT, +} DMN_ErrorKind; + +typedef enum DMN_MemoryEventKind +{ +DMN_MemoryEventKind_Null, +DMN_MemoryEventKind_Commit, +DMN_MemoryEventKind_Reserve, +DMN_MemoryEventKind_Decommit, +DMN_MemoryEventKind_Release, +DMN_MemoryEventKind_COUNT, +} DMN_MemoryEventKind; + +typedef enum DMN_ExceptionKind +{ +DMN_ExceptionKind_Null, +DMN_ExceptionKind_MemoryRead, +DMN_ExceptionKind_MemoryWrite, +DMN_ExceptionKind_MemoryExecute, +DMN_ExceptionKind_CppThrow, +DMN_ExceptionKind_COUNT, +} DMN_ExceptionKind; + +C_LINKAGE_BEGIN +C_LINKAGE_END + +#endif // DEMON2_META_H diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c new file mode 100644 index 00000000..276e4132 --- /dev/null +++ b/src/demon2/win32/demon2_core_win32.c @@ -0,0 +1,2473 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Helpers + +//- rjf: entity id -> hash + +internal U64 +dmn_w32_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal U64 +dmn_w32_hash_from_id(U64 id) +{ + return dmn_w32_hash_from_string(str8_struct(&id)); +} + +//- rjf: entity <-> handle + +internal DMN_Handle +dmn_w32_handle_from_entity(DMN_W32_Entity *entity) +{ + U32 idx = (U32)(entity - dmn_w32_shared->entities_base); + U32 gen = entity->gen; + DMN_Handle handle = {idx, gen}; + return handle; +} + +internal DMN_W32_Entity * +dmn_w32_entity_from_handle(DMN_Handle handle) +{ + U32 idx = handle.u32[0]; + U32 gen = handle.u32[1]; + DMN_W32_Entity *entity = dmn_w32_shared->entities_base; + if(entity->gen != gen) + { + entity = &dmn_w32_entity_nil; + } + return entity; +} + +//- rjf: entity allocation/deallocation + +internal DMN_W32_Entity * +dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) +{ + // rjf: allocate + DMN_W32_Entity *e = dmn_w32_shared->entities_first_free; + { + if(e != 0) + { + SLLStackPop(dmn_w32_shared->entities_first_free); + } + else + { + e = push_array_no_zero(dmn_w32_shared->entities_arena, DMN_W32_Entity, 1); + dmn_w32_shared->entities_count += 1; + } + U32 gen = e->gen; + MemoryZeroStruct(e); + e->gen = gen+1; + } + + // rjf: fill + { + e->kind = kind; + e->id = id; + e->parent = parent; + e->next = e->prev = e->first = e->last = &dmn_w32_entity_nil; + if(parent != &dmn_w32_entity_nil) + { + DLLPushBack_NPZ(&dmn_w32_entity_nil, parent->first, parent->last, e, next, prev); + } + } + + // rjf: insert into id -> entity map + if(id != 0) + { + U64 hash = dmn_w32_hash_from_id(id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->id == id) + { + node = n; + break; + } + } + if(node == 0) + { + node = dmn_w32_shared->entities_id_hash_node_free; + if(node != 0) + { + SLLStackPop(dmn_w32_shared->entities_id_hash_node_free); + } + else + { + node = push_array(dmn_w32_shared->arena, DMN_W32_EntityIDHashNode, 1); + } + DLLPushBack(slot->first, slot->last, node); + } + node->id = id; + node->entity = e; + } + + return e; +} + +internal void +dmn_w32_entity_release(DMN_W32_Entity *entity) +{ + // rjf: unhook root + if(entity->parent != &dmn_w32_entity_nil) + { + DLLRemove_NPZ(&dmn_w32_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + } + + // rjf: walk every entity in this tree, free each + if(entity != &dmn_w32_entity_nil) + { + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + DMN_W32_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *t = first_task; t != 0; t = t->next) + { + for(DMN_W32_Entity *child = entity->first; child != &dmn_w32_entity_nil; child = child->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + + // rjf: free entity + SLLStackPush(dmn_w32_shared->entities_first_free, t->e); + t->e->gen += 1; + + // rjf: remove from id -> entity map + if(t->e->id != 0) + { + U64 hash = dmn_w32_hash_from_id(t->e->id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->id == t->e->id && n->entity == t->e) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(dmn_w32_shared->entities_id_hash_node_free, n); + break; + } + } + } + } + scratch_end(scratch); + } +} + +//- rjf: kind*id -> entity + +internal DMN_W32_Entity * +dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id) +{ + DMN_W32_Entity *result = &dmn_w32_entity_nil; + U64 hash = dmn_w32_hash_from_id(id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->kind == kind && n->id == id) + { + node = n; + break; + } + } + if(node != 0) + { + result = node->entity; + } + return result; +} + +//- rjf: win32-level process reads/writes + +internal U64 +dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) +{ + U64 bytes_read = 0; + U8 *ptr = (U8*)dst; + U8 *opl = ptr + dim_1u64(range); + U64 cursor = range.min; + for(;ptr < opl;) + { + SIZE_T to_read = (SIZE_T)(opl - ptr); + SIZE_T actual_read = 0; + if(!ReadProcessMemory(process, (LPCVOID)cursor, ptr, to_read, &actual_read)) + { + bytes_read += actual_read; + break; + } + ptr += actual_read; + cursor += actual_read; + bytes_read += actual_read; + } + return bytes_read; +} + +internal B32 +dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src) +{ + B32 result = 1; + U8 *ptr = (U8*)src; + U8 *opl = ptr + dim_1u64(range); + U64 cursor = range.min; + for(;ptr < opl;) + { + SIZE_T to_write = (SIZE_T)(opl - ptr); + SIZE_T actual_write = 0; + if(!WriteProcessMemory(process, (LPVOID)cursor, ptr, to_write, &actual_write)) + { + result = 0; + break; + } + ptr += actual_write; + cursor += actual_write; + } + return result; +} + +internal String8 +dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) +{ + // TODO(rjf): @rewrite + // + // OLD: this could be done better with a demon_w32_read_memory + // that returns a read amount instead of a success/fail. + // + // (dmn_w32_process_read now does this, so we can switch to it) + + // scan piece by piece + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 max_cap = 256; + U64 cap = max_cap; + U64 read_p = address; + for (;;){ + U8 *block = push_array(scratch.arena, U8, cap); + for (;cap > 0;){ + if (demon_w32_read_memory(process_handle, block, read_p, cap)){ + break; + } + cap /= 2; + } + read_p += cap; + + U64 block_opl = 0; + for (;block_opl < cap; block_opl += 1){ + if (block[block_opl] == 0){ + break; + } + } + + if (block_opl > 0){ + str8_list_push(scratch.arena, &list, str8(block, block_opl)); + } + + if (block_opl < cap || cap == 0){ + break; + } + } + + // assemble results + String8 result = str8_list_join(arena, &list, 0); + scratch_end(scratch); + return(result); +} + +internal String16 +dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) +{ + // TODO(rjf): @rewrite + // + // OLD: this could be done better with a demon_w32_read_memory + // that returns a read amount instead of a success/fail. + // + // (dmn_w32_process_read now does this, so we can switch to it) + + // scan piece by piece + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 max_cap = 256; + U64 cap = max_cap; + U64 read_p = address; + for (;;){ + U8 *block = push_array(scratch.arena, U8, cap); + for (;cap > 1;){ + if (demon_w32_read_memory(process_handle, block, read_p, cap)){ + break; + } + cap /= 2; + } + read_p += cap; + + U16 *block16 = (U16*)block; + (void)block16; + U64 block_opl = 0; + for (;block_opl < cap; block_opl += 2){ + if (*(U16*)(block + block_opl) == 0){ + break; + } + } + + if (block_opl > 0){ + str8_list_push(scratch.arena, &list, str8(block, block_opl)); + } + + if (block_opl < cap || cap == 0){ + break; + } + } + + // assemble results + String8 joined = str8_list_join(arena, &list, 0); + String16 result = {(U16*)joined.str, joined.size/2}; + scratch_end(scratch); + return(result); +} + +//- rjf: win32-level thread register reads/writes + +internal U16 +dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave) +{ + U16 result = 0; + U32 top = (fxsave->StatusWord >> 11) & 7; + for(U32 fpr = 0; fpr < 8; fpr += 1) + { + U32 tag = 3; + if(fxsave->TagWord & (1 << fpr)) + { + U32 st = (fpr - top)&7; + + REGS_Reg80 *fp = (REGS_Reg80*)&fxsave->FloatRegisters[st*16]; + U16 exponent = fp->sign1_exp15 & bitmask15; + U64 integer_part = fp->int1_frac63 >> 63; + U64 fraction_part = fp->int1_frac63 & bitmask63; + + // tag: 0 - normal; 1 - zero; 2 - special + tag = 2; + if(exponent == 0) + { + if(integer_part == 0 && fraction_part == 0) + { + tag = 1; + } + } + else if(exponent != bitmask15 && integer_part != 0) + { + tag = 0; + } + } + result |= tag << (2 * fpr); + } + return result; +} + +internal U16 +dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw) +{ + U16 compact = 0; + for(U32 fpr = 0; fpr < 8; fpr++) + { + U32 tag = (ftw >> (fpr * 2)) & 3; + if(tag != 3) + { + compact |= (1 << fpr); + } + } + return compact; +} + +internal B32 +dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block) +{ + B32 result = 0; + switch(arch) + { + //////////////////////////// + //- rjf: unimplemented win32/arch combos + // + case Architecture_Null: + case Architecture_arm64: + case Architecture_arm32: + case Architecture_COUNT: + {NotImplemented;}break; + + //////////////////////////// + //- rjf: x86 + // + case Architecture_x86: + { + REGS_RegBlockX86 *dst = (REGS_RegBlockX86 *)reg_block; + + //- rjf: get thread context + WOW64_CONTEXT ctx = {0}; + ctx.ContextFlags = DMN_W32_CTX_X86_ALL; + if(!Wow64GetThreadContext(thread, (WOW64_CONTEXT *)&ctx)) + { + break; + } + result = 1; + + //- rjf: convert WOW64_CONTEXT -> REGS_RegBlockX86 + XSAVE_FORMAT *fxsave = (XSAVE_FORMAT *)ctx.ExtendedRegisters; + dst->eax.u32 = ctx.Eax; + dst->ebx.u32 = ctx.Ebx; + dst->ecx.u32 = ctx.Ecx; + dst->edx.u32 = ctx.Edx; + dst->esi.u32 = ctx.Esi; + dst->edi.u32 = ctx.Edi; + dst->esp.u32 = ctx.Esp; + dst->ebp.u32 = ctx.Ebp; + dst->eip.u32 = ctx.Eip; + dst->cs.u16 = ctx.SegCs; + dst->ds.u16 = ctx.SegDs; + dst->es.u16 = ctx.SegEs; + dst->fs.u16 = ctx.SegFs; + dst->gs.u16 = ctx.SegGs; + dst->ss.u16 = ctx.SegSs; + dst->dr0.u32 = ctx.Dr0; + dst->dr1.u32 = ctx.Dr1; + dst->dr2.u32 = ctx.Dr2; + dst->dr3.u32 = ctx.Dr3; + dst->dr6.u32 = ctx.Dr6; + dst->dr7.u32 = ctx.Dr7; + // NOTE(rjf): this bit is "supposed to always be 1", according to old info. + // may need to be investigated. + dst->eflags.u32 = ctx.EFlags | 0x2; + dst->fcw.u16 = fxsave->ControlWord; + dst->fsw.u16 = fxsave->StatusWord; + dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(fxsave); + dst->fop.u16 = fxsave->ErrorOpcode; + dst->fip.u32 = fxsave->ErrorOffset; + dst->fcs.u16 = fxsave->ErrorSelector; + dst->fdp.u32 = fxsave->DataOffset; + dst->fds.u16 = fxsave->DataSelector; + dst->mxcsr.u32 = fxsave->MxCsr; + dst->mxcsr_mask.u32 = fxsave->MxCsr_Mask; + { + M128A *float_s = fxsave->FloatRegisters; + REGS_Reg80 *float_d = &dst->fpr0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, sizeof(*float_d)); + } + } + { + M128A *xmm_s = fxsave->XmmRegisters; + REGS_Reg256 *xmm_d = &dst->ymm0; + for(U32 n = 0; n < 8; n += 1, xmm_s += 1, xmm_d += 1) + { + MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); + } + } + + //- rjf: read FS/GS base + WOW64_LDT_ENTRY ldt = {0}; + if(Wow64GetThreadSelectorEntry(thread, ctx.SegFs, &ldt)) + { + U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); + dst->fsbase.u32 = base; + } + if(Wow64GetThreadSelectorEntry(thread, ctx.SegGs, &ldt)) + { + U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); + dst->gsbase.u32 = base; + } + }break; + + //////////////////////////// + //- rjf: x64 + // + case Architecture_x64: + { + Temp scratch = scratch_begin(0, 0); + REGS_RegBlockX64 *dst = (REGS_RegBlockX64 *)reg_block; + + //- rjf: unpack info about available features + U32 feature_mask = GetEnabledXStateFeatures(); + B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); + + //- rjf: set up context + CONTEXT *ctx = 0; + U32 ctx_flags = DMN_W32_CTX_X64_ALL; + if(avx_enabled) + { + ctx_flags |= DMN_W32_CTX_INTEL_XSTATE; + } + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) + { + ctx = 0; + } + } + + //- rjf: unpack features available on this context + B32 avx_available = 0; + if(ctx != 0) + { + if(avx_enabled) + { + SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); + } + DWORD64 xstate_flags = 0; + if(GetXStateFeaturesMask(ctx, &xstate_flags)) + { + avx_available = !!(xstate_flags & XSTATE_MASK_AVX); + } + } + + //- rjf: get thread context + if(!GetThreadContext(thread, ctx)) + { + ctx = 0; + } + + //- rjf: bad context -> abort + if(ctx == 0) + { + break; + } + result = 1; + + //- rjf: convert context -> REGS_RegBlockX64 + XSAVE_FORMAT *xsave = &ctx->FltSave; + dst->rax.u64 = ctx->Rax; + dst->rcx.u64 = ctx->Rcx; + dst->rdx.u64 = ctx->Rdx; + dst->rbx.u64 = ctx->Rbx; + dst->rsp.u64 = ctx->Rsp; + dst->rbp.u64 = ctx->Rbp; + dst->rsi.u64 = ctx->Rsi; + dst->rdi.u64 = ctx->Rdi; + dst->r8.u64 = ctx->R8; + dst->r9.u64 = ctx->R9; + dst->r10.u64 = ctx->R10; + dst->r11.u64 = ctx->R11; + dst->r12.u64 = ctx->R12; + dst->r13.u64 = ctx->R13; + dst->r14.u64 = ctx->R14; + dst->r15.u64 = ctx->R15; + dst->rip.u64 = ctx->Rip; + dst->cs.u16 = ctx->SegCs; + dst->ds.u16 = ctx->SegDs; + dst->es.u16 = ctx->SegEs; + dst->fs.u16 = ctx->SegFs; + dst->gs.u16 = ctx->SegGs; + dst->ss.u16 = ctx->SegSs; + dst->dr0.u32 = ctx->Dr0; + dst->dr1.u32 = ctx->Dr1; + dst->dr2.u32 = ctx->Dr2; + dst->dr3.u32 = ctx->Dr3; + dst->dr6.u32 = ctx->Dr6; + dst->dr7.u32 = ctx->Dr7; + // NOTE(rjf): this bit is "supposed to always be 1", according to old info. + // may need to be investigated. + dst->rflags.u64 = ctx->EFlags | 0x2; + dst->fcw.u16 = xsave->ControlWord; + dst->fsw.u16 = xsave->StatusWord; + dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(xsave); + dst->fop.u16 = xsave->ErrorOpcode; + dst->fcs.u16 = xsave->ErrorSelector; + dst->fds.u16 = xsave->DataSelector; + dst->fip.u32 = xsave->ErrorOffset; + dst->fdp.u32 = xsave->DataOffset; + dst->mxcsr.u32 = xsave->MxCsr; + dst->mxcsr_mask.u32 = xsave->MxCsr_Mask; + { + M128A *float_s = xsave->FloatRegisters; + REGS_Reg80 *float_d = &dst->fpr0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, sizeof(*float_d)); + } + } + if(!avx_available) + { + M128A *xmm_s = xsave->XmmRegisters; + REGS_Reg256 *xmm_d = &dst->ymm0; + for(U32 n = 0; n < 16; n += 1, xmm_s += 1, xmm_d += 1) + { + MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); + } + } + if(avx_available) + { + DWORD part0_length = 0; + M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); + DWORD part1_length = 0; + M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); + Assert(part0_length == part1_length); + DWORD count = part0_length/sizeof(part0[0]); + count = ClampTop(count, 16); + REGS_Reg256 *ymm_d = &dst->ymm0; + for (DWORD i = 0; i < count; i += 1, part0 += 1, part1 += 1, ymm_d += 1) + { + // TODO(rjf): confirm ordering of writes + ymm_d->u64[3] = part0->Low; + ymm_d->u64[2] = part0->High; + ymm_d->u64[1] = part1->Low; + ymm_d->u64[0] = part1->High; + } + } + + scratch_end(scratch); + }break; + } + return result; +} + +internal B32 +dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block) +{ + B32 result = 0; + switch(arch) + { + //////////////////////////// + //- rjf: unimplemented win32/arch combos + // + case Architecture_Null: + case Architecture_arm64: + case Architecture_arm32: + case Architecture_COUNT: + {NotImplemented;}break; + + //////////////////////////// + //- rjf: x86 + // + case Architecture_x86: + { + REGS_RegBlockX86 *src = (REGS_RegBlockX86 *)reg_block; + + //- rjf: convert REGS_RegBlockX86 -> WOW64_CONTEXT + WOW64_CONTEXT ctx = {0}; + XSAVE_FORMAT *fxsave = (XSAVE_FORMAT*)ctx.ExtendedRegisters; + ctx.ContextFlags = DMN_W32_CTX_X86_ALL; + ctx.Eax = src->eax.u32; + ctx.Ebx = src->ebx.u32; + ctx.Ecx = src->ecx.u32; + ctx.Edx = src->edx.u32; + ctx.Esi = src->esi.u32; + ctx.Edi = src->edi.u32; + ctx.Esp = src->esp.u32; + ctx.Ebp = src->ebp.u32; + ctx.Eip = src->eip.u32; + ctx.SegCs = src->cs.u16; + ctx.SegDs = src->ds.u16; + ctx.SegEs = src->es.u16; + ctx.SegFs = src->fs.u16; + ctx.SegGs = src->gs.u16; + ctx.SegSs = src->ss.u16; + ctx.Dr0 = src->dr0.u32; + ctx.Dr1 = src->dr1.u32; + ctx.Dr2 = src->dr2.u32; + ctx.Dr3 = src->dr3.u32; + ctx.Dr6 = src->dr6.u32; + ctx.Dr7 = src->dr7.u32; + ctx.EFlags = src->eflags.u32; + fxsave->ControlWord = src->fcw.u16; + fxsave->StatusWord = src->fsw.u16; + fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); + fxsave->ErrorOpcode = src->fop.u16; + fxsave->ErrorSelector = src->fcs.u16; + fxsave->DataSelector = src->fds.u16; + fxsave->ErrorOffset = src->fip.u32; + fxsave->DataOffset = src->fdp.u32; + fxsave->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; + fxsave->MxCsr_Mask = src->mxcsr_mask.u32; + { + M128A *float_d = fxsave->FloatRegisters; + REGS_Reg80 *float_s = &src->fpr0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, 10); + } + } + { + M128A *xmm_d = fxsave->XmmRegisters; + REGS_Reg256 *xmm_s = &src->ymm0; + for(U32 n = 0; n < 8; n += 1, xmm_d += 1, xmm_s += 1) + { + MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); + } + } + + //- rjf: set thread context + B32 result = 0; + if(Wow64SetThreadContext(thread, &ctx)) + { + result = 1; + } + }break; + + //////////////////////////// + //- rjf: x64 + // + case Architecture_x64: + { + Temp scratch = scratch_begin(0, 0); + REGS_RegBlockX64 *src = (REGS_RegBlockX64 *)reg_block; + + //- rjf: unpack info about available features + U32 feature_mask = GetEnabledXStateFeatures(); + B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); + + //- rjf: set up context + CONTEXT *ctx = 0; + U32 ctx_flags = DMN_W32_CTX_X64_ALL; + if(avx_enabled) + { + ctx_flags |= DMN_W32_CTX_INTEL_XSTATE; + } + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) + { + ctx = 0; + } + } + + //- rjf: unpack features available on this context + B32 avx_available = 0; + if(ctx != 0) + { + if(avx_enabled) + { + SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); + } + DWORD64 xstate_flags = 0; + if(GetXStateFeaturesMask(ctx, &xstate_flags)) + { + avx_available = !!(xstate_flags & XSTATE_MASK_AVX); + } + } + + //- rjf: get thread context + if(!GetThreadContext(thread, ctx)) + { + ctx = 0; + } + + //- rjf: bad context -> abort + if(ctx == 0) + { + break; + } + + //- rjf: convert REGS_RegBlockX64 -> CONTEXT + XSAVE_FORMAT *fxsave = &ctx->FltSave; + ctx->ContextFlags = ctx_flags; + ctx->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; + ctx->Rax = src->rax.u64; + ctx->Rcx = src->rcx.u64; + ctx->Rdx = src->rdx.u64; + ctx->Rbx = src->rbx.u64; + ctx->Rsp = src->rsp.u64; + ctx->Rbp = src->rbp.u64; + ctx->Rsi = src->rsi.u64; + ctx->Rdi = src->rdi.u64; + ctx->R8 = src->r8.u64; + ctx->R9 = src->r9.u64; + ctx->R10 = src->r10.u64; + ctx->R11 = src->r11.u64; + ctx->R12 = src->r12.u64; + ctx->R13 = src->r13.u64; + ctx->R14 = src->r14.u64; + ctx->R15 = src->r15.u64; + ctx->Rip = src->rip.u64; + ctx->SegCs = src->cs.u16; + ctx->SegDs = src->ds.u16; + ctx->SegEs = src->es.u16; + ctx->SegFs = src->fs.u16; + ctx->SegGs = src->gs.u16; + ctx->SegSs = src->ss.u16; + ctx->Dr0 = src->dr0.u32; + ctx->Dr1 = src->dr1.u32; + ctx->Dr2 = src->dr2.u32; + ctx->Dr3 = src->dr3.u32; + ctx->Dr6 = src->dr6.u32; + ctx->Dr7 = src->dr7.u32; + ctx->EFlags = src->rflags.u64; + fxsave->ControlWord = src->fcw.u16; + fxsave->StatusWord = src->fsw.u16; + fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); + fxsave->ErrorOpcode = src->fop.u16; + fxsave->ErrorSelector = src->fcs.u16; + fxsave->DataSelector = src->fds.u16; + fxsave->ErrorOffset = src->fip.u32; + fxsave->DataOffset = src->fdp.u32; + { + M128A *float_d = fxsave->FloatRegisters; + REGS_Reg80 *float_s = &src->fpr0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, 10); + } + } + if(!avx_available) + { + M128A *xmm_d = fxsave->XmmRegisters; + REGS_Reg256 *xmm_s = &src->ymm0; + for(U32 n = 0; n < 8; n += 1, xmm_d += 1, xmm_s += 1) + { + MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); + } + } + if(avx_available) + { + DWORD part0_length = 0; + M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); + DWORD part1_length = 0; + M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); + Assert(part0_length == part1_length); + DWORD count = part0_length/sizeof(part0[0]); + count = ClampTop(count, 16); + REGS_Reg256 *ymm_d = &src->ymm0; + for(DWORD i = 0; i < count; i += 1, part0 += 1, part1 += 1, ymm_d += 1) + { + // TODO(allen): Are we writing these out in the right order? Seems weird right? + part0->Low = ymm_d->u64[3]; + part0->High = ymm_d->u64[2]; + part1->Low = ymm_d->u64[1]; + part1->High = ymm_d->u64[0]; + } + } + + //- rjf: set thread context + if(SetThreadContext(thread, ctx)) + { + result = 1; + } + scratch_end(scratch); + }break; + } + return result; +} + +//- rjf: win32-level thread injection + +internal DWORD +dmn_w32_inject_thread(HANDLE process, U64 start_address) +{ + LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address; + DWORD thread_id = 0; + HANDLE thread = CreateRemoteThread(process, 0, 0, start, 0, 0, &thread_id); + if(thread != 0) + { + CloseHandle(thread); + } + return thread_id; +} + +//- rjf: module image analysis + +internal DMN_W32_ImageInfo +dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) +{ + // rjf: find PE offset + U32 pe_offset = 0; + { + U64 dos_magic_off = base_vaddr; + U16 dos_magic = 0; + dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); + if(dos_magic == PE_DOS_MAGIC) + { + U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); + dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset); + } + } + + // rjf: get COFF header + B32 got_coff_header = 0; + U64 coff_header_off = 0; + COFF_Header coff_header = {0}; + if(pe_offset > 0) + { + U64 pe_magic_off = base_vaddr + pe_offset; + U32 pe_magic = 0; + dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); + if(pe_magic == PE_MAGIC) + { + coff_header_off = pe_magic_off + sizeof(pe_magic); + if(dmn_w32_process_read_struct(process, coff_header_off, &coff_header)) + { + got_coff_header = 1; + } + } + } + + // rjf: get arch and size + DMN_W32_ImageInfo result = zero_struct; + if(got_coff_header) + { + U64 optional_size_off = 0; + Architecture arch = Architecture_Null; + switch(coff_header.machine) + { + case COFF_MachineType_X86: + { + arch = Architecture_x86; + optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image); + }break; + case COFF_MachineType_X64: + { + arch = Architecture_x64; + optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image); + }break; + default: + {}break; + } + if(arch != Architecture_Null) + { + U64 optional_off = coff_header_off + sizeof(coff_header); + U32 size = 0; + if(dmn_w32_process_read_struct(process, optional_off+optional_size_off, &size) >= sizeof(size)) + { + result.arch = arch; + result.size = size; + } + } + } + + return result; +} + +//- rjf: module full path extraction + +internal String8 +dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: extract path from module + String16 path16 = {0}; + String8 path8 = {0}; + { + // rjf: handle -> full path + if(module->handle != 0) + { + DWORD cap16 = GetFinalPathNameByHandleW(module->handle, 0, 0, VOLUME_NAME_DOS); + U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); + DWORD size16 = GetFinalPathNameByHandleW(module->handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); + path16 = str16(buffer16, size16); + } + + // rjf: fallback (main module only): process -> full path + if(path16.size == 0 && module->module.is_main) + { + DMN_W32_Entity *process = module->parent; + DWORD size = KB(4); + U16 *buf = push_array_no_zero(scratch.arena, U16, size); + if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size)) + { + path16 = str16(buf, size); + } + } + + // rjf: fallback (any module - no guarantee): address_of_name -> full path + if(path16.size == 0 && module->module.address_of_name_pointer != 0) + { + DMN_W32_Entity *process = module->parent; + U64 ptr_size = bit_size_from_arch(process->arch)/8; + U64 name_pointer = 0; + if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) + { + if(name_pointer != 0) + { + if(module->module.name_is_unicode) + { + path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer); + } + else + { + path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer); + } + } + } + } + } + + // rjf: produce finalized result + String8 result = {0}; + { + if(path16.size > 0) + { + // rjf: skip the extended path thing if necessary + if(path16.size >= 4 && + path16.str[0] == L'\\' && + path16.str[1] == L'\\' && + path16.str[2] == L'?' && + path16.str[3] == L'\\') + { + path16.size -= 4; + path16.str += 4; + } + + // rjf: convert to UTF-8 + result = str8_from_16(arena, path16); + } + else + { + // rjf: skip the extended path thing if necessary + if (path8.size >= 4 && + path8.str[0] == L'\\' && + path8.str[1] == L'\\' && + path8.str[2] == L'?' && + path8.str[3] == L'\\') + { + path8.size -= 4; + path8.str += 4; + } + + // rjf: copy to output arena + result = push_str8_copy(arena, path8); + } + } + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) + +internal void +dmn_init(void) +{ + Arena *arena = arena_alloc(); + dmn_w32_shared = push_array(arena, DMN_W32_Shared, 1); + dmn_w32_shared->arena = arena; + dmn_w32_shared->detach_arena = arena_alloc(); + dmn_w32_shared->entities_arena = arena_alloc__sized(GB(8), KB(64)); + dmn_w32_shared->entities_base = dmn_w32_entity_alloc(&dmn_w32_entity_nil, DMN_W32_EntityKind_Root, 0); + dmn_w32_shared->entities_id_hash_slots_count = 4096; + dmn_w32_shared->entities_id_hash_slots = push_array(arena, DMN_W32_EntityIDHashSlot, dmn_w32_shared->entities_id_hash_slots_count); + + // rjf: load Windows 10+ GetThreadDescription API + { + dmn_w32_GetThreadDescription = (DMN_W32_GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetThreadDescription"); + } + + // rjf: setup environment variables + { + CHAR *this_proc_env = GetEnvironmentStrings(); + U64 start_idx = 0; + for(U64 idx = 0;; idx += 1) + { + if(this_proc_env[idx] == 0) + { + if(start_idx == idx) + { + break; + } + else + { + String8 string = str8((U8 *)this_proc_env + start_idx, idx - start_idx); + str8_list_push(dmn_w32_shared->arena, &dmn_w32_shared->env_strings, string); + start_idx = idx+1; + } + } + } + } +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS) + +internal DMN_EventList +dmn_run(Arena *arena, DMN_RunCtrls *ctrls) +{ + DMN_EventList events = {0}; + + ////////////////////////////// + //- rjf: determine event generation path + // + typedef enum DMN_W32_EventGenPath + { + DMN_W32_EventGenPath_Run, + DMN_W32_EventGenPath_DetachProcesses, + } + DMN_W32_EventGenPath; + DMN_W32_EventGenPath event_gen_path = DMN_W32_EventGenPath_Run; + if(dmn_w32_shared->detach_processes.first != 0) + { + event_gen_path = DMN_W32_EventGenPath_DetachProcesses; + } + + ////////////////////////////// + //- rjf: produce debug events + // + switch(event_gen_path) + { + //////////////////////////// + //- rjf: produce debug events from regular running + // + case DMN_W32_EventGenPath_Run: + { + Temp scratch = scratch_begin(&arena, 1); + + ////////////////////////// + //- rjf: set single step bit + // + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) + { + Architecture arch = dmn_arch_from_handle(ctrls->single_step_thread); + switch(arch) + { + //- rjf: unimplemented win32/arch combos + case Architecture_Null: + case Architecture_arm64: + case Architecture_arm32: + case Architecture_COUNT: + {NotImplemented;}break; + + //- rjf: x86/64 + case Architecture_x86: + { + REGS_RegBlockX86 regs = {0}; + dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); + regs.eflags.u32 |= 0x100; + dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); + }break; + case Architecture_x64: + { + REGS_RegBlockX64 regs = {0}; + dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); + regs.rflags.u64 |= 0x100; + dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); + }break; + } + } + + ////////////////////////// + //- rjf: write all traps into memory + // + U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, ctrls->traps.trap_count); + { + U64 trap_idx = 0; + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) + { + DMN_Trap *trap = n->v+n_idx; + trap_swap_bytes[trap_idx] = 0xCC; + dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), trap_swap_bytes+trap_idx); + U8 int3 = 0xCC; + dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3); + } + } + } + + ////////////////////////// + //- rjf: produce list of threads which will run + // + DMN_W32_EntityNode *first_run_thread = 0; + DMN_W32_EntityNode *last_run_thread = 0; + { + //- rjf: scan all processes + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; + process != 0; + process = process->next) + { + if(process->kind != DMN_W32_EntityKind_Process) {continue;} + + //- rjf: determine if this process is frozen + B32 process_is_frozen = 0; + if(ctrls->run_entities_are_processes) + { + for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(process))) + { + process_is_frozen = 1; + break; + } + } + } + + //- rjf: scan all threads in this process + for(DMN_W32_Entity *thread = process->first; + thread != 0; + thread = thread->next) + { + if(thread->kind != DMN_W32_EntityKind_Thread) {continue;} + + //- rjf: determine if this thread is frozen + B32 is_frozen = 0; + { + // rjf: single-step? freeze if not the single-step thread. + if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread) && + !dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->single_step_thread)) + { + is_frozen = 1; + } + + // rjf: not single-stepping? determine based on run controls freezing info + else + { + if(ctrls->run_entities_are_processes) + { + is_frozen = process_is_frozen; + } + else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(thread))) + { + is_frozen = 1; + break; + } + } + if(ctrls->run_entities_are_unfrozen) + { + is_frozen ^= 1; + } + } + } + + //- rjf: disregard all other rules if this is the halter thread + if(dmn_w32_shared->halter_tid == thread->id) + { + is_frozen = 0; + } + + //- rjf: add to list + if(!is_frozen) + { + DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); + n->v = thread; + SLLQueuePush(first_run_thread, last_run_thread, n); + } + } + } + } + + ////////////////////////// + //- rjf: resume threads which will run + // + for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) + { + DMN_W32_Entity *thread = n->v; + DWORD resume_result = ResumeThread(thread->handle); + switch(resume_result) + { + case 0xffffffffu: + { + // TODO(rjf): error - unknown cause. need to do GetLastError, FormatMessage + }break; + default: + { + DWORD desired_counter = 0; + DWORD current_counter = resume_result - 1; + if(current_counter != desired_counter) + { + // NOTE(rjf): Warning. The user has manually suspended this thread, + // so even though from Demon's perspective it thinks this thread + // should run, it will not, because the user has manually called + // SuspendThread or used CREATE_SUSPENDED or whatever. + } + }break; + } + } + + ////////////////////////// + //- rjf: if run threads are marked as having reported an explicit trap + // on their last run, shift their RIPs past that trap instruction, so + // that they may continue + // + for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) + { + DMN_W32_Entity *thread = n->v; + if(thread->thread.last_run_reported_trap) + { + Temp temp = temp_begin(scratch.arena); + U64 regs_block_size = regs_block_size_from_architecture(thread->arch); + void *regs_block = push_array(temp.arena, U8, regs_block_size); + B32 good = demon_os_read_regs(thread, regs_block); + U64 pre_rip = regs_rip_from_arch_block(thread->arch, regs_block); + if(good && pre_rip == thread->thread.last_run_reported_trap_pre_rip) + { + regs_arch_block_write_rip(thread->arch, regs_block, thread->thread.last_run_reported_trap_post_rip); + demon_os_write_regs(thread, regs_block); + } + temp_end(temp); + thread->thread.last_run_reported_trap = 0; + thread->thread.last_run_reported_trap_post_rip = 0; + } + } + + ////////////////////////// + //- rjf: choose win32 resume code + // + DWORD resume_code = DBG_CONTINUE; + { + if(dmn_w32_shared->exception_not_handled && !ctrls->ignore_previous_exception) + { + dmn_w32_shared->exception_not_handled = 0; + resume_code = DBG_EXCEPTION_NOT_HANDLED; + } + } + + ////////////////////////// + //- rjf: inform windows that we're resuming, run, & obtain next debug event + // + DEBUG_EVENT evt = {0}; + B32 evt_good = 0; + { + B32 resume_good = 0; + if(dmn_w32_shared->resume_needed) + { + dmn_w32_shared->resume_needed = 0; + resume_good = !!ContinueDebugEvent(dmn_w32_shared->resume_pid, dmn_w32_shared->resume_tid, resume_code); + dmn_w32_shared->resume_needed = 0; + dmn_w32_shared->resume_tid = 0; + dmn_w32_shared->resume_pid = 0; + } + if(resume_good) + { + evt_good = !!WaitForDebugEvent(&evt, INFINITE); + if(evt_good) + { + dmn_w32_shared->resume_needed = 1; + dmn_w32_shared->resume_pid = evt.dwProcessId; + dmn_w32_shared->resume_tid = evt.dwThreadId; + } + } + } + + ////////////////////////// + //- rjf: suspend threads which ran + // + if(evt_good) for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) + { + DMN_W32_Entity *thread = n->v; + DWORD suspend_result = SuspendThread(thread->handle); + switch(suspend_result) + { + case 0xffffffffu: + { + // TODO(rjf): error - unknown cause. need to do do GetLastError, FormatMessage + // + // NOTE(rjf): this can happen when the event is EXIT_THREAD_DEBUG_EVENT + // or EXIT_PROCESS_DEBUG_EVENT. after such an event, SuspendThread + // gives error code 5 (access denied). this has no adverse effects, but + // if we want to start reporting errors we should take care to avoid + // calling SuspendThread in that case. + }break; + default: + { + DWORD desired_counter = 1; + DWORD current_counter = suspend_result + 1; + if(current_counter != desired_counter) + { + // NOTE(rjf): Warning. We've suspended to something higher than 1. + // In this case, it means the user probably created the thread in + // a suspended state, or they called SuspendThread. + } + }break; + } + } + + ////////////////////////// + //- rjf: process the new event + // + if(evt_good) + { + switch(evt.dwDebugEventCode) + { + ////////////////////// + //- rjf: process was created + // + case CREATE_PROCESS_DEBUG_EVENT: + { + // rjf: zero out "process pending" state + dmn_w32_shared->new_process_pending = 0; + + // rjf: unpack event + HANDLE process_handle = evt.u.CreateProcessInfo.hProcess; + HANDLE thread_handle = evt.u.CreateProcessInfo.hThread; + HANDLE module_handle = evt.u.CreateProcessInfo.hFile; + U64 tls_base = (U64)evt.u.CreateProcessInfo.lpThreadLocalBase; + U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage; + U64 module_name_vaddr = (U64)evt.u.CreateProcessInfo.lpImageName; + B32 module_name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0); + DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process_handle, module_base); + + // rjf: create entities (thread/module are implied for initial - they are not reported by win32) + DMN_W32_Entity *process = dmn_w32_entity_alloc(dmn_w32_shared->entities_base, DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); + { + process->handle = process_handle; + process->arch = image_info.arch; + thread->handle = thread_handle; + thread->thread.thread_local_base = tls_base; + module->handle = module_handle; + module->module.vaddr_range = r1u64(module_base, image_info.size); + module->module.is_main = 1; + module->module.address_of_name_pointer = module_name_vaddr; + module->module.name_is_unicode = module_name_is_unicode; + } + + // rjf: put thread into suspended state, so it matches expected initial state + SuspendThread(thread_handle); + + // rjf: set up per-process injected code (to run halter threads on & + // generate debug events) + { + U8 injection_code[DMN_W32_INJECTED_CODE_SIZE]; + MemorySet(injection_code, 0xCC, DMN_W32_INJECTED_CODE_SIZE); + injection_code[0] = 0xC3; + U64 injection_size = DMN_W32_INJECTED_CODE_SIZE + sizeof(DMN_W32_InjectedBreak); + U64 injection_address = (U64)VirtualAllocEx(process_handle, 0, injection_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE); + dmn_w32_process_write(process_handle, r1u64(injection_address, injection_address+sizeof(injection_code)), injection_code); + process->proc.injection_address = injection_address; + } + + // rjf: generate events + { + // rjf: create process + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_w32_handle_from_entity(process); + e->code = evt.dwProcessId; + } + + // rjf: create thread + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->code = evt.dwThreadId; + } + + // rjf: load module + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->address = module_base; + e->size = image_info.size; + e->string = dmn_w32_full_path_from_module(arena, module_handle); + } + } + }break; + + ////////////////////// + //- rjf: process exited + // + case EXIT_PROCESS_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: generate events for children + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + switch(child->kind) + { + case DMN_W32_EntityKind_Thread: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(child); + }break; + case DMN_W32_EntityKind_Module: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(child); + e->string = dmn_w32_full_path_from_module(arena, child); + }break; + } + } + + // rjf: generate event for process + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_w32_handle_from_entity(process); + e->code = evt.u.ExitProcess.dwExitCode; + } + + // rjf: release entity storage + dmn_w32_entity_release(process); + + // rjf: detach + DebugActiveProcessStop(evt.dwProcessId); + }break; + + ////////////////////// + //- rjf: thread was created + // + case CREATE_THREAD_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: create thread entity + DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); + { + thread->handle = evt.u.CreateThread.hThread; + thread->thread.thread_local_base = (U64)evt.u.CreateThread.lpThreadLocalBase; + } + + // rjf: suspend thread immediately upon creation, to match with expected suspension state + DWORD sus_result = SuspendThread(thread->handle); + (void)sus_result; + + // rjf: unpack thread name + String8 thread_name = {0}; + if(dmn_w32_GetThreadDescription != 0) + { + WCHAR *thread_name_w = 0; + HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); + if(SUCCEEDED(hr)) + { + thread_name = str8_from_16(arena, str16_cstring((U16 *)thread_name_w)); + LocalFree(thread_name_w); + } + } + + // rjf: determine if this is a "halter thread" - the threads we spawn to halt processes + B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); + + // rjf: generate events for non-halter threads + if(!is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->code = evt.dwThreadId; + e->string = thread_name; + } + }break; + + ////////////////////// + //- rjf: thread exited + // + case EXIT_THREAD_DEBUG_EVENT: + { + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *process = thread->parent; + + // rjf: determine if this is the halter thread + B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); + + // rjf: generate a halt event if this thread is the halter + if(is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Halt; + dmn_w32_shared->halter_process = dmn_handle_zero(); + dmn_w32_shared->halter_tid = 0; + } + + // rjf: if this thread is *not* the halter, then generate a regular exit-thread event + if(!is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->code = evt.u.ExitThread.dwExitCode; + } + + // rjf: release entity storage + dmn_w32_entity_release(thread); + }break; + + ////////////////////// + //- rjf: DLL was loaded + // + case LOAD_DLL_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: extract image info + U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll; + DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process->handle, module_base); + + // rjf: create module entity + DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); + { + module->handle = evt.u.LoadDll.hFile; + module->module.vaddr_range = r1u64(module_base, module_base+image_info.size); + module->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName; + module->module.name_is_unicode = (evt.u.LoadDll.fUnicode != 0); + } + + // rjf: generate event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->address = module_base; + e->size = image_info.size; + e->string = dmn_w32_full_path_from_module(arena, module); + } + }break; + + ////////////////////// + //- rjf: DLL was unloaded + // + case UNLOAD_DLL_DEBUG_EVENT: + { + U64 module_base = (U64)evt.u.UnloadDll.lpBaseOfDll; + DMN_W32_Entity *module = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Module, module_base); + DMN_W32_Entity *process = module->parent; + + // rjf: generate event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->string = dmn_w32_full_path_from_module(arena, module); + } + + // rjf: release entity storage + dmn_w32_entity_release(module); + }break; + + ////////////////////// + //- rjf: exception was hit + // + case EXCEPTION_DEBUG_EVENT: + { + // NOTE(rjf): Notes on multithreaded breakpoint events + // (2021/11/1): + // + // When many threads are simultaneously running, multiple threads + // may hit a trap "at the same time". When this happens there will be + // multiple events in an internal queue that we cannot see. If there + // is another event in the queue we will not see it until we call + // ContinueDebugEvent again, in a subsequent call to demon_os_run. + // + // When we get a trap event, the instruction pointer stored + // in the event will have the address of the int 3 instruction that + // was hit. Our RIP register, however, will be one byte past that. + // So, to get the behavior we want, we need to set the RIP register + // back to the address of the int 3. + // + // To deal with the fact that we may get breakpoint events later that + // were actually from this run what we do is: + // + // #1. If we get a trap event, and it corresponds to a user submitted + // trap, then we treat it is a breakpoint event. + // #2. If we get a trap event, and it does NOT correspond to a user + // trap in this call: + // #A. If the actual unmodified instruction byte is NOT an int 3, + // then this is a queued event from a previous run that is no + // longer applicable and we skip it. + // #B. If the actual unmodified instruction is an int 3, then this + // becomes a trap event and we do not reset RIP. + + // NOTE(rjf): The exception record struct has a 32-bit version and a + // 64-bit version. We only currently handle the 64-bit version. + + //- rjf: unpack + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *process = thread->parent; + EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; + EXCEPTION_RECORD *exception = &edi->ExceptionRecord; + U64 instruction_pointer = (U64)exception->ExceptionAddress; + + //- rjf: determine if this is the first breakpoint in a process + // (breakpoint notifying us that the debugger is attached) + B32 first_bp = 0; + if(!process->proc.did_first_bp && exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT) + { + process->proc.did_first_bp = 1; + first_bp = 1; + } + + //- rjf: determine if this exception is a trap + B32 is_trap = (!first_bp && + (exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT || + exception->ExceptionCode == DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN)); + + //- rjf: check if this trap is a usage-code-specified trap or something else + B32 hit_user_trap = 0; + if(is_trap) + { + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + if(dmn_handle_match(n->v[idx].process, dmn_w32_handle_from_entity(process)) && n->v[idx].vaddr == instruction_pointer) + { + hit_user_trap = 1; + break; + } + } + } + } + + //- rjf: check if trap is explicit in the actual code memory + B32 hit_explicit_trap = 0; + if(is_trap && !hit_user_trap) + { + U8 instruction_byte = 0; + if(dmn_w32_process_read_struct(process->handle, instruction_pointer, &instruction_byte)) + { + hit_explicit_trap = (instruction_byte == 0xCC || instruction_byte == 0xCD); + } + } + + //- rjf: determine whether to roll back instruction pointer + B32 should_do_rollback = (is_trap); + + //- rjf: roll back thread's instruction pointer + U64 post_trap_rip = 0; + if(should_do_rollback) + { + Temp temp = temp_begin(scratch.arena); + U64 regs_block_size = regs_block_size_from_architecture(thread->arch); + void *regs_block = push_array(scratch.arena, U8, regs_block_size); + if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block)) + { + post_trap_rip = regs_rip_from_arch_block(thread->arch, regs_block); + regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer); + dmn_w32_thread_write_reg_block(thread->arch, thread, regs_block); + } + temp_end(temp); + } + + //- rjf: not a user trap, not an explicit trap, then it's a trap that + // this thread hit previously but has since skipped + B32 hit_previous_trap = (is_trap && !hit_user_trap && !hit_explicit_trap); + + //- rjf: determine whether to skip this event + B32 skip_event = (hit_previous_trap); + + //- rjf: generate event + if(!skip_event) + { + // rjf: fill top-level info + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->code = exception->ExceptionCode; + e->flags = exception->ExceptionFlags; + e->instruction_pointer = (U64)exception->ExceptionAddress; + + // rjf: explicit trap -> mark this thread as having reported this trap + if(hit_explicit_trap) + { + thread->thread.last_run_reported_trap = 1; + thread->thread.last_run_reported_trap_pre_rip = instruction_pointer; + thread->thread.last_run_reported_trap_post_rip = post_trap_rip; + } + + //- rjf: fill according to exception code + switch(exception->ExceptionCode) + { + //- rjf: fill breakpoint event info + case DMN_W32_EXCEPTION_BREAKPOINT: + { + DMN_EventKind report_event_kind = DMN_EventKind_Trap; + if(first_bp) + { + report_event_kind = DMN_EventKind_HandshakeComplete; + } + else if(hit_user_trap) + { + report_event_kind = DMN_EventKind_Breakpoint; + } + e->kind = report_event_kind; + }break; + + //- rjf: fill stack buffer overrun event info + case DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN: + { + e->kind = DMN_EventKind_Trap; + }break; + + //- rjf: fill single-step event info + case DMN_W32_EXCEPTION_SINGLE_STEP: + { + e->kind = DMN_EventKind_SingleStep; + }break; + + //- rjf: fill throw info + case DMN_W32_EXCEPTION_THROW: + { + U64 exception_sp = 0; + U64 exception_ip = 0; + if(exception->NumberParameters >= 3) + { + exception_sp = (U64)exception->ExceptionInformation[1]; + exception_ip = (U64)exception->ExceptionInformation[2]; + } + e->stack_pointer = exception_sp; + e->exception_kind = DMN_ExceptionKind_CppThrow; + e->exception_repeated = (edi->dwFirstChance == 0); + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + + //- rjf: fill access violation info + case DMN_W32_EXCEPTION_ACCESS_VIOLATION: + case DMN_W32_EXCEPTION_IN_PAGE_ERROR: + { + U64 exception_address = 0; + DMN_ExceptionKind exception_kind = DMN_ExceptionKind_Null; + if(exception->NumberParameters >= 2) + { + switch(exception->ExceptionInformation[0]) + { + case 0: exception_kind = DMN_ExceptionKind_MemoryRead; break; + case 1: exception_kind = DMN_ExceptionKind_MemoryWrite; break; + case 8: exception_kind = DMN_ExceptionKind_MemoryExecute; break; + } + exception_address = exception->ExceptionInformation[1]; + } + e->address = exception_address; + e->exception_kind = exception_kind; + e->exception_repeated = (edi->dwFirstChance == 0); + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + + //- rjf: fill set-thread-name info + case DMN_W32_EXCEPTION_SET_THREAD_NAME: + if(exception->NumberParameters >= 2) + { + U64 thread_name_address = exception->ExceptionInformation[1]; + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + String8List thread_name_strings = {0}; + { + U64 read_addr = thread_name_address; + U64 total_string_size = 0; + for(;total_string_size < KB(4);) + { + U8 *buffer = push_array_no_zero(scratch.arena, U8, 256); + B32 good_read = demon_os_read_memory(process, buffer, read_addr, 256); + if(good_read) + { + U64 size = 256; + for(U64 idx = 0; idx < 256; idx += 1) + { + if(buffer[idx] == 0) + { + size = idx; + break; + } + } + String8 string_part = str8(buffer, size); + str8_list_push(scratch.arena, &thread_name_strings, string_part); + total_string_size += size; + read_addr += size; + if(size < 256) + { + break; + } + } + } + } + e->kind = DMN_EventKind_SetThreadName; + e->string = str8_list_join(arena, &thread_name_strings, 0); + if(exception->NumberParameters > 2) + { + e->code = exception->ExceptionInformation[2]; + } + }break; + + //- rjf: unhandled exception case + default: + { + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + } + } + }break; + + ////////////////////// + //- rjf: output debug string was gathered + // + case OUTPUT_DEBUG_STRING_EVENT: + { + // rjf: unpack event + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; + U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; + + // rjf: read memory + U8 *buffer = push_array_no_zero(arena, U8, string_size + 1); + dmn_w32_process_read(process->handle, r1u64(string_address, string_address+string_size), buffer); + buffer[string_size] = 0; + + // rjf: generate event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_DebugString; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->string = str8(buffer, string_size); + if(string_size != 0 && buffer[string_size-1] == 0) + { + e->string.size -= 1; + } + } + }break; + + ////////////////////// + //- rjf: a "rip event" - a "system debugging error". + // + case RIP_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + }break; + + ////////////////////// + //- rjf: default case - some kind of debugging event that we don't currently consume. + // + default: + { + NoOp; + }break; + } + } + + //- rjf: gather new thread-names + if(dmn_w32_GetThreadDescription != 0) + { + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; + process != &dmn_w32_entity_nil; + process = process->next) + { + if(process->kind != DMN_W32_EntityKind_Process) { continue; } + for(DMN_W32_Entity *thread = process->first; + thread != 0; + thread = thread->next) + { + if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } + if(thread->thread.last_name_hash == 0 || + thread->thread.name_gather_time_us+1000000 <= os_now_microseconds()) + { + String8 name = {0}; + { + WCHAR *thread_name_w = 0; + HRESULT hr = demon_w32_GetThreadDescription(thread->handle, &thread_name_w); + if(SUCCEEDED(hr)) + { + name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w)); + LocalFree(thread_name_w); + } + } + U64 name_hash = dmn_w32_hash_from_string(name); + if(name.size != 0 && name_hash != thread->thread.last_name_hash) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_SetThreadName; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->string = push_str8_copy(arena, name); + } + thread->thread.name_gather_time_us = os_now_microseconds(); + thread->thread.last_name_hash = name_hash; + } + } + } + } + + ////////////////////////// + //- rjf: restore original memory at trap locations + // + { + U64 trap_idx = 0; + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) + { + DMN_Trap *trap = n->v+n_idx; + U8 og_byte = trap_swap_bytes[trap_idx]; + if(og_byte != 0xCC) + { + dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &og_byte); + } + } + } + } + + ////////////////////////// + //- rjf: unset single step bit + // + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) + { + Architecture arch = dmn_arch_from_handle(ctrls->single_step_thread); + switch(arch) + { + //- rjf: unimplemented win32/arch combos + case Architecture_Null: + case Architecture_arm64: + case Architecture_arm32: + case Architecture_COUNT: + {NotImplemented;}break; + + //- rjf: x86/64 + case Architecture_x86: + { + REGS_RegBlockX86 regs = {0}; + dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); + regs.eflags.u32 &= ~0x100; + dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); + }break; + case Architecture_x64: + { + REGS_RegBlockX64 regs = {0}; + dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); + regs.rflags.u64 &= ~0x100; + dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); + }break; + } + } + + scratch_end(scratch); + }break; + + //////////////////////////// + //- rjf: produce debug events from queued up detached processes + // + case DMN_W32_EventGenPath_DetachProcesses: + { + for(DMN_HandleNode *n = dmn_w32_shared->detach_processes.first; n != 0; n = n->next) + { + DMN_W32_Entity *process = dmn_w32_entity_from_handle(n->v); + + // rjf: push exit thread events + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(child); + } + } + + // rjf: push unload module events + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Module) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(child); + e->string = dmn_w32_full_path_from_module(arena, child); + } + } + + // rjf: push exit process event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_w32_handle_from_entity(process); + } + + // rjf: free process + dmn_w32_entity_release(process); + } + + // rjf: reset queued up detached processes + MemoryZeroStruct(&dmn_w32_shared->detach_processes); + arena_clear(dmn_w32_shared->detach_arena); + }break; + } + + return events; +} + +internal void +dmn_halt(U64 code, U64 user_data) +{ + if(!dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) + { + DMN_W32_Entity *process = &dmn_w32_entity_nil; + for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first; + entity != &dmn_w32_entity_nil; + entity = entity->next) + { + if(entity->kind == DMN_W32_EntityKind_Process) + { + process = entity; + break; + } + } + if(process != &dmn_w32_entity_nil) + { + dmn_w32_shared->halter_process = dmn_w32_handle_from_entity(process); + DMN_W32_InjectedBreak injection = {code, user_data}; + U64 data_injection_address = process->proc.injection_address + DMN_W32_INJECTED_CODE_SIZE; + dmn_w32_process_write_struct(process->handle, data_injection_address, &injection); + dmn_w32_shared->halter_tid = dmn_w32_inject_thread(process->handle, process->proc.injection_address); + } + } +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Process Launching/Attaching/Killing/Detaching (Implemented Per-OS) + +internal U32 +dmn_launch_process(OS_LaunchOptions *options) +{ + Temp scratch = scratch_begin(0, 0); + U32 result = 0; + + //- rjf: produce exe / arguments string + String8 cmd = {0}; + if(options->cmd_line.first != 0) + { + String8List args = {0}; + String8 exe_path = options->cmd_line.first->string; + str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); + for(String8Node *n = options->cmd_line.first->next; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &args, n->string); + } + StringJoin join_params = {0}; + join_params.sep = str8_lit(" "); + cmd = str8_list_join(scratch.arena, &args, &join_params); + } + + //- rjf: produce environment strings + String8 env = {0}; + { + String8List all_opts = options->env; + if(options->inherit_env != 0) + { + MemoryZeroStruct(&all_opts); + for(String8Node *n = options->env.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + } + StringJoin join_params2 = {0}; + join_params2.sep = str8_lit("\0"); + join_params2.post = str8_lit("\0"); + env = str8_list_join(scratch.arena, &all_opts, &join_params2); + } + + //- rjf: produce utf-16 strings + String16 cmd16 = str16_from_8(scratch.arena, cmd); + String16 dir16 = str16_from_8(scratch.arena, options->path); + String16 env16 = str16_from_8(scratch.arena, env); + + //- rjf: launch + DWORD access_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; + STARTUPINFOW startup_info = {sizeof(startup_info)}; + PROCESS_INFORMATION process_info = {0}; + AllocConsole(); + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + { + // check if we are 32-bit app, and just close it immediately + BOOL is_wow = 0; + IsWow64Process(process_info.hProcess, &is_wow); + if(is_wow) + { + MessageBox(0, "Sorry, The RAD Debugger only debugs 64-bit applications currently.", "Process error", MB_OK|MB_ICONSTOP); + DebugActiveProcessStop(process_info.dwProcessId); + TerminateProcess(process_info.hProcess,0xffffffff); + } + else + { + result = process_info.dwProcessId; + dmn_w32_shared->new_process_pending = 1; + } + CloseHandle(process_info.hProcess); + CloseHandle(process_info.hThread); + } + else + { + MessageBox(0, "Error starting process.", "Process error", MB_OK|MB_ICONSTOP); + } + FreeConsole(); + + //- rjf: eliminate all handles which have stuck around from the AllocConsole + { + SetStdHandle(STD_INPUT_HANDLE, 0); + SetStdHandle(STD_OUTPUT_HANDLE, 0); + SetStdHandle(STD_ERROR_HANDLE, 0); + } + + scratch_end(scratch); + return result; +} + +internal B32 +dmn_attach_process(U32 pid) +{ + B32 result = 0; + if(DebugActiveProcess((DWORD)pid)) + { + result = 1; + dmn_w32_shared->new_process_pending = 1; + } + return result; +} + +internal B32 +dmn_kill_process(DMN_Handle process, U32 exit_code) +{ + B32 result = 0; + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + if(TerminateProcess(process_entity->handle, exit_code)) + { + result = 1; + } + return result; +} + +internal B32 +dmn_detach_process(DMN_Handle process) +{ + B32 result = 0; + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + + // rjf: resume threads + for(DMN_W32_Entity *child = process_entity->first; + child != &dmn_w32_entity_nil; + child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + DWORD resume_result = ResumeThread(child->handle); + (void)resume_result; + } + } + + // rjf: detach + { + DWORD pid = (DWORD)process_entity->id; + if(DebugActiveProcessStop(pid)) + { + result = 1; + } + } + + // rjf: push into list of processes to generate events for later + if(result != 0) + { + dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); + } +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Entities (Implemented Per-OS) + +//- rjf: basic entity info extraction + +internal Architecture +dmn_arch_from_handle(DMN_Handle handle) +{ + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + Architecture arch = entity->arch; + return arch; +} + +internal String8 +dmn_string_from_handle(Arena *arena, DMN_Handle handle) +{ + String8 string = {0}; + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + switch(entity->kind) + { + default:{}break; + case DMN_W32_EntityKind_Module: + { + string = dmn_w32_full_path_from_module(arena, entity); + }break; + } + return string; +} + +//- rjf: processes + +internal U64 +dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) +{ + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); + U64 result = dmn_w32_process_read(entity->handle, range, dst); + return result; +} + +internal B32 +dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) +{ + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); + B32 result = dmn_w32_process_write(entity->handle, range, src); + return result; +} + +//- rjf: modules + +internal Rng1U64 +dmn_vaddr_range_from_module(DMN_Handle handle) +{ + Rng1U64 range = {0}; + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + if(entity->kind == DMN_W32_EntityKind_Module) + { + range = entity->module.vaddr_range; + } + return range; +} + +//- rjf: threads + +internal U64 +dmn_stack_base_vaddr_from_thread(DMN_Handle handle) +{ + U64 result = 0; + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + if(thread->kind == DMN_W32_EntityKind_Thread) + { + DMN_W32_Entity *process = thread->parent; + U64 tlb = thread->thread.thread_local_base; + U64 result = 0; + switch(thread->arch) + { + case Architecture_Null: + case Architecture_arm64: + case Architecture_arm32: + case Architecture_COUNT: + {NotImplemented;}break; + case Architecture_x64: + { + U64 stack_base_addr = tlb + 0x8; + dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); + }break; + case Architecture_x86: + { + U64 stack_base_addr = tlb + 0x4; + dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result); + }break; + } + } + return result; +} + +internal U64 +dmn_tls_root_vaddr_from_thread(DMN_Handle handle) +{ + U64 result = 0; + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + if(entity->kind == DMN_W32_EntityKind_Thread) + { + result = entity->thread.thread_local_base; + } + return result; +} + +internal B32 +dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) +{ + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + B32 result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block); + return result; +} + +internal B32 +dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) +{ + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + B32 result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block); + return result; +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks System Process Listing (Implemented Per-OS) + +internal void +dmn_process_iter_begin(DMN_ProcessIter *iter) +{ + MemoryZeroStruct(iter); + iter->v[0] = (U64)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); +} + +internal B32 +dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out) +{ + B32 result = 0; + + //- rjf: get the next process entry + PROCESSENTRY32W process_entry = {sizeof(process_entry)}; + HANDLE snapshot = (HANDLE)iter->v[0]; + if(iter->v[1] == 0) + { + if(Process32FirstW(snapshot, &process_entry)) + { + result = 1; + } + } + else + { + if(Process32NextW(snapshot, &process_entry)) + { + result = 1; + } + } + + //- rjf: increment counter + iter->v[1] += 1; + + //- rjf: convert to process info + if(result) + { + info_out->name = str8_from_16(arena, str16_cstring((U16*)process_entry.szExeFile)); + info_out->pid = (U32)process_entry.th32ProcessID; + } + + return result; +} + +internal void +dmn_process_iter_end(DMN_ProcessIter *iter) +{ + CloseHandle((HANDLE)iter->v[0]); + MemoryZeroStruct(iter); +} diff --git a/src/demon2/win32/demon2_core_win32.h b/src/demon2/win32/demon2_core_win32.h new file mode 100644 index 00000000..55a7a463 --- /dev/null +++ b/src/demon2/win32/demon2_core_win32.h @@ -0,0 +1,272 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON2_CORE_WIN32_H +#define DEMON2_CORE_WIN32_H + +//////////////////////////////// +//~ rjf: Windows Includes + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +//////////////////////////////// +//~ rjf: Win32 Exception Codes + +#define DMN_W32_EXCEPTION_BREAKPOINT 0x80000003u +#define DMN_W32_EXCEPTION_SINGLE_STEP 0x80000004u +#define DMN_W32_EXCEPTION_LONG_JUMP 0x80000026u +#define DMN_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u +#define DMN_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu +#define DMN_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u +#define DMN_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u +#define DMN_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du +#define DMN_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu +#define DMN_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu +#define DMN_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u +#define DMN_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u +#define DMN_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u +#define DMN_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u +#define DMN_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u +#define DMN_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u +#define DMN_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u +#define DMN_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du +#define DMN_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u +#define DMN_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u +#define DMN_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u +#define DMN_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu +#define DMN_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u +#define DMN_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u +#define DMN_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u +#define DMN_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u +#define DMN_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u +#define DMN_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u +#define DMN_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au +#define DMN_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u +#define DMN_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u +#define DMN_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u +#define DMN_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u +#define DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u +#define DMN_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u +#define DMN_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u +#define DMN_W32_EXCEPTION_NO_MEMORY 0xC0000017u +#define DMN_W32_EXCEPTION_THROW 0xE06D7363u +#define DMN_W32_EXCEPTION_SET_THREAD_NAME 0x406d1388u + +//////////////////////////////// +//~ rjf: Win32 Register Codes + +#define DMN_W32_CTX_X86 0x00010000 +#define DMN_W32_CTX_X64 0x00100000 + +#define DMN_W32_CTX_INTEL_CONTROL 0x0001 +#define DMN_W32_CTX_INTEL_INTEGER 0x0002 +#define DMN_W32_CTX_INTEL_SEGMENTS 0x0004 +#define DMN_W32_CTX_INTEL_FLOATS 0x0008 +#define DMN_W32_CTX_INTEL_DEBUG 0x0010 +#define DMN_W32_CTX_INTEL_EXTENDED 0x0020 +#define DMN_W32_CTX_INTEL_XSTATE 0x0040 + +#define DMN_W32_CTX_X86_ALL (DMN_W32_CTX_X86 | \ +DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ +DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_DEBUG | \ +DMN_W32_CTX_INTEL_EXTENDED) +#define DMN_W32_CTX_X64_ALL (DMN_W32_CTX_X64 | \ +DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ +DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_FLOATS | \ +DMN_W32_CTX_INTEL_DEBUG) + +//////////////////////////////// +//~ rjf: Per-Entity State + +typedef enum DMN_W32_EntityKind +{ + DMN_W32_EntityKind_Null, + DMN_W32_EntityKind_Root, + DMN_W32_EntityKind_Process, + DMN_W32_EntityKind_Thread, + DMN_W32_EntityKind_Module, + DMN_W32_EntityKind_COUNT +} +DMN_W32_EntityKind; + +typedef struct DMN_W32_Entity DMN_W32_Entity; +struct DMN_W32_Entity +{ + DMN_W32_Entity *first; + DMN_W32_Entity *last; + DMN_W32_Entity *next; + DMN_W32_Entity *prev; + DMN_W32_Entity *parent; + DMN_W32_EntityKind kind; + U32 gen; + U64 id; + HANDLE handle; + Architecture arch; + union + { + struct + { + U64 injection_address; + B32 did_first_bp; + } + proc; + struct + { + U64 thread_local_base; + U64 last_name_hash; + U64 name_gather_time_us; + B32 last_run_reported_trap; + U64 last_run_reported_trap_pre_rip; + U64 last_run_reported_trap_post_rip; + } + thread; + struct + { + Rng1U64 vaddr_range; + U64 address_of_name_pointer; + B32 is_main; + B32 name_is_unicode; + } + module; + }; +}; + +typedef struct DMN_W32_EntityNode DMN_W32_EntityNode; +struct DMN_W32_EntityNode +{ + DMN_W32_EntityNode *next; + DMN_W32_Entity *v; +}; + +typedef struct DMN_W32_EntityIDHashNode DMN_W32_EntityIDHashNode; +struct DMN_W32_EntityIDHashNode +{ + DMN_W32_EntityIDHashNode *next; + DMN_W32_EntityIDHashNode *prev; + U64 id; + DMN_W32_Entity *entity; +}; + +typedef struct DMN_W32_EntityIDHashSlot DMN_W32_EntityIDHashSlot; +struct DMN_W32_EntityIDHashSlot +{ + DMN_W32_EntityIDHashNode *first; + DMN_W32_EntityIDHashNode *last; +}; + +//////////////////////////////// +//~ rjf: Injection Types + +typedef struct DMN_W32_InjectedBreak DMN_W32_InjectedBreak; +struct DMN_W32_InjectedBreak +{ + U64 code; + U64 user_data; +}; + +#define DMN_W32_INJECTED_CODE_SIZE 32 + +//////////////////////////////// +//~ rjf: Image Info Types + +typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo; +struct DMN_W32_ImageInfo +{ + Architecture arch; + U32 size; +}; + +//////////////////////////////// +//~ rjf: Dynamically-Loaded Win32 Function Types + +typedef HRESULT DMN_W32_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription); + +//////////////////////////////// +//~ rjf: Shared State Bundle + +typedef struct DMN_W32_Shared DMN_W32_Shared; +struct DMN_W32_Shared +{ + // rjf: top-level info + Arena *arena; + String8List env_strings; + + // rjf: detaching info + Arena *detach_arena; + DMN_HandleList detach_processes; + + // rjf: entity state + Arena *entities_arena; + DMN_W32_Entity *entities_base; + DMN_W32_Entity *entities_first_free; + U64 entities_count; + DMN_W32_EntityIDHashSlot *entities_id_hash_slots; + U64 entities_id_hash_slots_count; + DMN_W32_EntityIDHashNode *entities_id_hash_node_free; + + // rjf: launch state + B32 new_process_pending; + + // rjf: run results + B32 resume_needed; + U32 resume_pid; + U32 resume_tid; + B32 exception_not_handled; + + // rjf: halting info + DMN_Handle halter_process; + U32 halter_tid; +}; + +//////////////////////////////// +//~ rjf: Globals + +global DMN_W32_Shared *dmn_w32_shared = 0; +global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil}; +global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0; + +//////////////////////////////// +//~ rjf: Helpers + +//- rjf: hashes +internal U64 dmn_w32_hash_from_string(String8 string); +internal U64 dmn_w32_hash_from_id(U64 id); + +//- rjf: entity <-> handle +internal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity); +internal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle); + +//- rjf: entity allocation/deallocation +internal DMN_W32_Entity *dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id); +internal void dmn_w32_entity_release(DMN_W32_Entity *entity); + +//- rjf: kind*id -> entity +internal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id); + +//- rjf: win32-level process reads/writes +internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst); +internal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src); +internal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); +internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); +#define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +#define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) + +//- rjf: win32-level thread register reads/writes +internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave); +internal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw); +internal B32 dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block); +internal B32 dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block); + +//- rjf: win32-level thread injection +internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); + +//- rjf: module image analysis +internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); + +//- rjf: module full path extraction +internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module); + +#endif // DEMON2_CORE_WIN32_H diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 36d1909e..3d325472 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -9,6 +9,8 @@ // [x] CRT asserts - stepping over int 29 should work just like stepping over // an int3 // [ ] committing needs to happen when navigating focus away for any reason +// [ ] better discoverability for view rules - have better help hover tooltip, +// info on arguments, and better autocomplete lister // // [ ] source view -> floating margin/line-nums // [ ] theme colors -> more explicit about e.g. opaque backgrounds vs. floating diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 11fa3a04..0f4ef693 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -1,14 +1,40 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#include "lib_raddbgi_format/raddbgi_format.h" -#include "lib_raddbgi_format/raddbgi_format.c" -#include "lib_raddbgi_format/raddbgi_format_parse.h" -#include "lib_raddbgi_format/raddbgi_format_parse.c" -#include "lib_raddbgi_make/raddbgi_make.h" -#include "lib_raddbgi_make/raddbgi_make.c" +//////////////////////////////// +//~ rjf: Build Options -int main(int argument_count, char **arguments) +#define BUILD_VERSION_MAJOR 0 +#define BUILD_VERSION_MINOR 9 +#define BUILD_VERSION_PATCH 8 +#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" +#define BUILD_TITLE "ryan_scratch" +#define BUILD_CONSOLE_INTERFACE 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "regs/regs.h" +#include "coff/coff.h" +#include "pe/pe.h" +#include "demon2/demon2_inc.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "regs/regs.c" +#include "coff/coff.c" +#include "pe/pe.c" +#include "demon2/demon2_inc.c" + +//////////////////////////////// +//~ rjf: Entry Point + +internal void +entry_point(CmdLine *cmdline) { - return 0; + } From 4074551a1ad5034570016de94177f1d4eb0c4b91 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 Mar 2024 14:27:40 -0800 Subject: [PATCH 165/275] hook up demon2 initialization to base layer entry point --- src/base/base_entry_point.c | 3 +++ src/dbgi/dbgi.c | 4 ++-- src/demon/win32/demon_os_win32.c | 2 +- src/txti/txti.c | 4 ++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index 83aba9ef..f42cfc3d 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -42,6 +42,9 @@ main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **argum #if defined(DEMON_CORE_H) demon_init(); #endif +#if defined(DEMON2_CORE_H) + dmn_init(); +#endif #if defined(CTRL_CORE_H) ctrl_init(); #endif diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index 7db04545..ba702134 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -638,7 +638,7 @@ dbgi_p2u_pop_events(Arena *arena, U64 endt_us) internal void dbgi_parse_thread_entry_point(void *p) { - ProfThreadName("[dbgi] parse #%I64U", (U64)p); + ThreadNameF("[dbgi] parse #%I64U", (U64)p); for(;;) { Temp scratch = scratch_begin(0, 0); @@ -1159,7 +1159,7 @@ dbgi_qsort_compare_fuzzy_search_items(DBGI_FuzzySearchItem *a, DBGI_FuzzySearchI internal void dbgi_fuzzy_thread__entry_point(void *p) { - ProfThreadName("[dbgi] fuzzy search #%I64U", (U64)p); + ThreadNameF("[dbgi] fuzzy search #%I64U", (U64)p); DBGI_FuzzySearchThread *thread = &dbgi_shared->fuzzy_threads[(U64)p]; for(;;) { diff --git a/src/demon/win32/demon_os_win32.c b/src/demon/win32/demon_os_win32.c index 41a42a1c..a27f816d 100644 --- a/src/demon/win32/demon_os_win32.c +++ b/src/demon/win32/demon_os_win32.c @@ -13,7 +13,7 @@ global DWORD demon_w32_resume_tid = 0; global B32 demon_w32_exception_not_handled = 0; global DEMON_Entity* demon_w32_halter_process = 0; global DWORD demon_w32_halter_thread_id = 0; -. + global B32 demon_w32_new_process_pending = 0; global Arena *demon_w32_ext_arena = 0 ; diff --git a/src/txti/txti.c b/src/txti/txti.c index 52be44d3..e7d9da25 100644 --- a/src/txti/txti.c +++ b/src/txti/txti.c @@ -941,7 +941,7 @@ internal void txti_mut_thread_entry_point(void *p) { U64 mut_thread_idx = (U64)p; - ProfThreadName("[txti] mut #%I64u", mut_thread_idx); + ThreadNameF("[txti] mut #%I64u", mut_thread_idx); TXTI_MutThread *mut_thread = &txti_state->mut_threads[mut_thread_idx]; for(;;) { @@ -1246,7 +1246,7 @@ txti_mut_thread_entry_point(void *p) internal void txti_detector_thread_entry_point(void *p) { - ProfThreadName("[txti] detector"); + ThreadNameF("[txti] detector"); for(;;) { if(ins_atomic_u64_eval(&txti_state->detector_thread_enabled)) From f85718f1e2ed44f6118540cc96b3d6371fac4d76 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 Mar 2024 14:48:23 -0800 Subject: [PATCH 166/275] fix eval header --- src/eval/eval_core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 93c5d03b..662dc26e 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -213,7 +213,7 @@ internal U64 eval_num_from_string(EVAL_String2NumMap *map, String8 string); //- rjf: string -> expr internal EVAL_String2ExprMap eval_string2expr_map_make(Arena *arena, U64 slot_count); -internal void eval_string2expr_map_insert(Arena *arena, EVAL_String2NumMap *map, String8 string, EVAL_Expr *expr); +internal void eval_string2expr_map_insert(Arena *arena, EVAL_String2ExprMap *map, String8 string, EVAL_Expr *expr); internal void eval_string2expr_map_inc_poison(EVAL_String2ExprMap *map, String8 string); internal void eval_string2expr_map_dec_poison(EVAL_String2ExprMap *map, String8 string); internal EVAL_Expr *eval_expr_from_string(EVAL_String2ExprMap *map, String8 string); From e25364a8353a62523fa6b84b6e2f4742a902bd62 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 Mar 2024 14:55:49 -0800 Subject: [PATCH 167/275] strip out some unnecessary apis from the demon layer, since we'll be doing per-entity caching in ctrl and keep demon as close to a thin abstraction as possible --- src/demon2/demon2_core.h | 14 ++----- src/demon2/win32/demon2_core_win32.c | 62 ++++++---------------------- src/scratch/ryan_scratch.c | 54 ++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 64 deletions(-) diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index 081d532b..0beedca4 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -7,10 +7,11 @@ //////////////////////////////// //~ rjf: Handle Types -typedef struct DMN_Handle DMN_Handle; -struct DMN_Handle +typedef union DMN_Handle DMN_Handle; +union DMN_Handle { U32 u32[2]; + U64 u64[1]; }; typedef struct DMN_HandleNode DMN_HandleNode; @@ -178,11 +179,7 @@ internal B32 dmn_kill_process(DMN_Handle process, U32 exit_code); internal B32 dmn_detach_process(DMN_Handle process); //////////////////////////////// -//~ rjf: @dmn_os_hooks Entities (Implemented Per-OS) - -//- rjf: basic entity info extraction -internal Architecture dmn_arch_from_handle(DMN_Handle handle); -internal String8 dmn_string_from_handle(Arena *arena, DMN_Handle handle); +//~ rjf: @dmn_os_hooks Process/Thread Reads/Writes (Implemented Per-OS) //- rjf: processes internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); @@ -190,9 +187,6 @@ internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void #define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) #define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -//- rjf: modules -internal Rng1U64 dmn_vaddr_range_from_module(DMN_Handle handle); - //- rjf: threads internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index 276e4132..f0a40960 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -265,7 +265,7 @@ dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) for (;;){ U8 *block = push_array(scratch.arena, U8, cap); for (;cap > 0;){ - if (demon_w32_read_memory(process_handle, block, read_p, cap)){ + if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ break; } cap /= 2; @@ -314,7 +314,7 @@ dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) for (;;){ U8 *block = push_array(scratch.arena, U8, cap); for (;cap > 1;){ - if (demon_w32_read_memory(process_handle, block, read_p, cap)){ + if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ break; } cap /= 2; @@ -1139,7 +1139,8 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) // if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) { - Architecture arch = dmn_arch_from_handle(ctrls->single_step_thread); + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + Architecture arch = thread->arch; switch(arch) { //- rjf: unimplemented win32/arch combos @@ -1310,12 +1311,12 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) Temp temp = temp_begin(scratch.arena); U64 regs_block_size = regs_block_size_from_architecture(thread->arch); void *regs_block = push_array(temp.arena, U8, regs_block_size); - B32 good = demon_os_read_regs(thread, regs_block); + B32 good = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block); U64 pre_rip = regs_rip_from_arch_block(thread->arch, regs_block); if(good && pre_rip == thread->thread.last_run_reported_trap_pre_rip) { regs_arch_block_write_rip(thread->arch, regs_block, thread->thread.last_run_reported_trap_post_rip); - demon_os_write_regs(thread, regs_block); + dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block); } temp_end(temp); thread->thread.last_run_reported_trap = 0; @@ -1478,7 +1479,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) e->module = dmn_w32_handle_from_entity(module); e->address = module_base; e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module_handle); + e->string = dmn_w32_full_path_from_module(arena, module); } } }break; @@ -1874,7 +1875,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) for(;total_string_size < KB(4);) { U8 *buffer = push_array_no_zero(scratch.arena, U8, 256); - B32 good_read = demon_os_read_memory(process, buffer, read_addr, 256); + B32 good_read = dmn_w32_process_read(process->handle, r1u64(read_addr, read_addr+256), buffer); if(good_read) { U64 size = 256; @@ -1986,7 +1987,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) String8 name = {0}; { WCHAR *thread_name_w = 0; - HRESULT hr = demon_w32_GetThreadDescription(thread->handle, &thread_name_w); + HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); if(SUCCEEDED(hr)) { name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w)); @@ -2033,7 +2034,8 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) // if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) { - Architecture arch = dmn_arch_from_handle(ctrls->single_step_thread); + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + Architecture arch = thread->arch; switch(arch) { //- rjf: unimplemented win32/arch combos @@ -2297,33 +2299,7 @@ dmn_detach_process(DMN_Handle process) } //////////////////////////////// -//~ rjf: @dmn_os_hooks Entities (Implemented Per-OS) - -//- rjf: basic entity info extraction - -internal Architecture -dmn_arch_from_handle(DMN_Handle handle) -{ - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - Architecture arch = entity->arch; - return arch; -} - -internal String8 -dmn_string_from_handle(Arena *arena, DMN_Handle handle) -{ - String8 string = {0}; - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - switch(entity->kind) - { - default:{}break; - case DMN_W32_EntityKind_Module: - { - string = dmn_w32_full_path_from_module(arena, entity); - }break; - } - return string; -} +//~ rjf: @dmn_os_hooks Process/Thread Reads/Writes (Implemented Per-OS) //- rjf: processes @@ -2343,20 +2319,6 @@ dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) return result; } -//- rjf: modules - -internal Rng1U64 -dmn_vaddr_range_from_module(DMN_Handle handle) -{ - Rng1U64 range = {0}; - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - if(entity->kind == DMN_W32_EntityKind_Module) - { - range = entity->module.vaddr_range; - } - return range; -} - //- rjf: threads internal U64 diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 0f4ef693..6616ce90 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -14,21 +14,67 @@ //////////////////////////////// //~ rjf: Includes +//- rjf: [lib] +#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" + //- rjf: [h] #include "base/base_inc.h" #include "os/os_inc.h" -#include "regs/regs.h" +#include "task_system/task_system.h" +#include "raddbgi_make_local/raddbgi_make_local.h" +#include "mdesk/mdesk.h" +#include "hash_store/hash_store.h" +#include "file_stream/file_stream.h" +#include "text_cache/text_cache.h" +#include "path/path.h" +#include "txti/txti.h" #include "coff/coff.h" #include "pe/pe.h" -#include "demon2/demon2_inc.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_from_pdb/raddbgi_from_pdb.h" +#include "regs/regs.h" +#include "regs/raddbgi/regs_raddbgi.h" +#include "type_graph/type_graph.h" +#include "dbgi/dbgi.h" +#include "demon/demon_inc.h" +#include "eval/eval_inc.h" +#include "unwind/unwind.h" +#include "ctrl/ctrl_inc.h" //- rjf: [c] #include "base/base_inc.c" #include "os/os_inc.c" -#include "regs/regs.c" +#include "task_system/task_system.c" +#include "raddbgi_make_local/raddbgi_make_local.c" +#include "mdesk/mdesk.c" +#include "hash_store/hash_store.c" +#include "file_stream/file_stream.c" +#include "text_cache/text_cache.c" +#include "path/path.c" +#include "txti/txti.c" #include "coff/coff.c" #include "pe/pe.c" -#include "demon2/demon2_inc.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_from_pdb/raddbgi_from_pdb.c" +#include "regs/regs.c" +#include "regs/raddbgi/regs_raddbgi.c" +#include "type_graph/type_graph.c" +#include "dbgi/dbgi.c" +#include "demon/demon_inc.c" +#include "eval/eval_inc.c" +#include "unwind/unwind.c" +#include "ctrl/ctrl_inc.c" //////////////////////////////// //~ rjf: Entry Point From 0d0c599e000d3b5edc50419d9bfa2a7f4a04072e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 Mar 2024 16:54:57 -0800 Subject: [PATCH 168/275] begin process of moving pe unwinding info into pe layer; more demon2 work checkpoint --- src/ctrl/ctrl_core.c | 9 - src/demon2/win32/demon2_core_win32.c | 353 +++++++++++----------- src/demon2/win32/demon2_core_win32.h | 27 +- src/pe/pe.c | 96 +++--- src/pe/pe.h | 435 +++++++++++++++++---------- src/scratch/ryan_scratch.c | 8 +- 6 files changed, 518 insertions(+), 410 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index c7d7041f..90f77226 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -691,15 +691,6 @@ ctrl_halt(void) demon_halt(0, 0); } -//- rjf: entity introspection - -internal U32 -ctrl_id_from_machine_entity(CTRL_MachineID id, DEMON_Handle handle) -{ - U32 result = 0; - return result; -} - //- rjf: exe -> dbg path mapping internal String8 diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index f0a40960..2f42d85f 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -2,9 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: Helpers - -//- rjf: entity id -> hash +//~ rjf: Basic Helpers internal U64 dmn_w32_hash_from_string(String8 string) @@ -23,6 +21,9 @@ dmn_w32_hash_from_id(U64 id) return dmn_w32_hash_from_string(str8_struct(&id)); } +//////////////////////////////// +//~ rjf: Entity Helpers + //- rjf: entity <-> handle internal DMN_Handle @@ -198,7 +199,107 @@ dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id) return result; } -//- rjf: win32-level process reads/writes +//////////////////////////////// +//~ rjf: Module Info Extraction + +internal String8 +dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: extract path from module + String16 path16 = {0}; + String8 path8 = {0}; + { + // rjf: handle -> full path + if(module->handle != 0) + { + DWORD cap16 = GetFinalPathNameByHandleW(module->handle, 0, 0, VOLUME_NAME_DOS); + U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); + DWORD size16 = GetFinalPathNameByHandleW(module->handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); + path16 = str16(buffer16, size16); + } + + // rjf: fallback (main module only): process -> full path + if(path16.size == 0 && module->module.is_main) + { + DMN_W32_Entity *process = module->parent; + DWORD size = KB(4); + U16 *buf = push_array_no_zero(scratch.arena, U16, size); + if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size)) + { + path16 = str16(buf, size); + } + } + + // rjf: fallback (any module - no guarantee): address_of_name -> full path + if(path16.size == 0 && module->module.address_of_name_pointer != 0) + { + DMN_W32_Entity *process = module->parent; + U64 ptr_size = bit_size_from_arch(process->arch)/8; + U64 name_pointer = 0; + if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) + { + if(name_pointer != 0) + { + if(module->module.name_is_unicode) + { + path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer); + } + else + { + path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer); + } + } + } + } + } + + // rjf: produce finalized result + String8 result = {0}; + { + if(path16.size > 0) + { + // rjf: skip the extended path thing if necessary + if(path16.size >= 4 && + path16.str[0] == L'\\' && + path16.str[1] == L'\\' && + path16.str[2] == L'?' && + path16.str[3] == L'\\') + { + path16.size -= 4; + path16.str += 4; + } + + // rjf: convert to UTF-8 + result = str8_from_16(arena, path16); + } + else + { + // rjf: skip the extended path thing if necessary + if (path8.size >= 4 && + path8.str[0] == L'\\' && + path8.str[1] == L'\\' && + path8.str[2] == L'?' && + path8.str[3] == L'\\') + { + path8.size -= 4; + path8.str += 4; + } + + // rjf: copy to output arena + result = push_str8_copy(arena, path8); + } + } + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Win32-Level Process/Thread Reads/Writes + +//- rjf: processes internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) @@ -346,7 +447,78 @@ dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) return(result); } -//- rjf: win32-level thread register reads/writes +internal DMN_W32_ImageInfo +dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) +{ + // rjf: find PE offset + U32 pe_offset = 0; + { + U64 dos_magic_off = base_vaddr; + U16 dos_magic = 0; + dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); + if(dos_magic == PE_DOS_MAGIC) + { + U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); + dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset); + } + } + + // rjf: get COFF header + B32 got_coff_header = 0; + U64 coff_header_off = 0; + COFF_Header coff_header = {0}; + if(pe_offset > 0) + { + U64 pe_magic_off = base_vaddr + pe_offset; + U32 pe_magic = 0; + dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); + if(pe_magic == PE_MAGIC) + { + coff_header_off = pe_magic_off + sizeof(pe_magic); + if(dmn_w32_process_read_struct(process, coff_header_off, &coff_header)) + { + got_coff_header = 1; + } + } + } + + // rjf: get arch and size + DMN_W32_ImageInfo result = zero_struct; + if(got_coff_header) + { + U64 optional_size_off = 0; + Architecture arch = Architecture_Null; + switch(coff_header.machine) + { + case COFF_MachineType_X86: + { + arch = Architecture_x86; + optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image); + }break; + case COFF_MachineType_X64: + { + arch = Architecture_x64; + optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image); + }break; + default: + {}break; + } + if(arch != Architecture_Null) + { + U64 optional_off = coff_header_off + sizeof(coff_header); + U32 size = 0; + if(dmn_w32_process_read_struct(process, optional_off+optional_size_off, &size) >= sizeof(size)) + { + result.arch = arch; + result.size = size; + } + } + } + + return result; +} + +//- rjf: threads internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave) @@ -872,7 +1044,7 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block return result; } -//- rjf: win32-level thread injection +//- rjf: remote thread injection internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address) @@ -887,175 +1059,6 @@ dmn_w32_inject_thread(HANDLE process, U64 start_address) return thread_id; } -//- rjf: module image analysis - -internal DMN_W32_ImageInfo -dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) -{ - // rjf: find PE offset - U32 pe_offset = 0; - { - U64 dos_magic_off = base_vaddr; - U16 dos_magic = 0; - dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); - if(dos_magic == PE_DOS_MAGIC) - { - U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); - dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset); - } - } - - // rjf: get COFF header - B32 got_coff_header = 0; - U64 coff_header_off = 0; - COFF_Header coff_header = {0}; - if(pe_offset > 0) - { - U64 pe_magic_off = base_vaddr + pe_offset; - U32 pe_magic = 0; - dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); - if(pe_magic == PE_MAGIC) - { - coff_header_off = pe_magic_off + sizeof(pe_magic); - if(dmn_w32_process_read_struct(process, coff_header_off, &coff_header)) - { - got_coff_header = 1; - } - } - } - - // rjf: get arch and size - DMN_W32_ImageInfo result = zero_struct; - if(got_coff_header) - { - U64 optional_size_off = 0; - Architecture arch = Architecture_Null; - switch(coff_header.machine) - { - case COFF_MachineType_X86: - { - arch = Architecture_x86; - optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image); - }break; - case COFF_MachineType_X64: - { - arch = Architecture_x64; - optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image); - }break; - default: - {}break; - } - if(arch != Architecture_Null) - { - U64 optional_off = coff_header_off + sizeof(coff_header); - U32 size = 0; - if(dmn_w32_process_read_struct(process, optional_off+optional_size_off, &size) >= sizeof(size)) - { - result.arch = arch; - result.size = size; - } - } - } - - return result; -} - -//- rjf: module full path extraction - -internal String8 -dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: extract path from module - String16 path16 = {0}; - String8 path8 = {0}; - { - // rjf: handle -> full path - if(module->handle != 0) - { - DWORD cap16 = GetFinalPathNameByHandleW(module->handle, 0, 0, VOLUME_NAME_DOS); - U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); - DWORD size16 = GetFinalPathNameByHandleW(module->handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); - path16 = str16(buffer16, size16); - } - - // rjf: fallback (main module only): process -> full path - if(path16.size == 0 && module->module.is_main) - { - DMN_W32_Entity *process = module->parent; - DWORD size = KB(4); - U16 *buf = push_array_no_zero(scratch.arena, U16, size); - if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size)) - { - path16 = str16(buf, size); - } - } - - // rjf: fallback (any module - no guarantee): address_of_name -> full path - if(path16.size == 0 && module->module.address_of_name_pointer != 0) - { - DMN_W32_Entity *process = module->parent; - U64 ptr_size = bit_size_from_arch(process->arch)/8; - U64 name_pointer = 0; - if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) - { - if(name_pointer != 0) - { - if(module->module.name_is_unicode) - { - path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer); - } - else - { - path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer); - } - } - } - } - } - - // rjf: produce finalized result - String8 result = {0}; - { - if(path16.size > 0) - { - // rjf: skip the extended path thing if necessary - if(path16.size >= 4 && - path16.str[0] == L'\\' && - path16.str[1] == L'\\' && - path16.str[2] == L'?' && - path16.str[3] == L'\\') - { - path16.size -= 4; - path16.str += 4; - } - - // rjf: convert to UTF-8 - result = str8_from_16(arena, path16); - } - else - { - // rjf: skip the extended path thing if necessary - if (path8.size >= 4 && - path8.str[0] == L'\\' && - path8.str[1] == L'\\' && - path8.str[2] == L'?' && - path8.str[3] == L'\\') - { - path8.size -= 4; - path8.str += 4; - } - - // rjf: copy to output arena - result = push_str8_copy(arena, path8); - } - } - - scratch_end(scratch); - return result; -} - //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) diff --git a/src/demon2/win32/demon2_core_win32.h b/src/demon2/win32/demon2_core_win32.h index 55a7a463..572691c6 100644 --- a/src/demon2/win32/demon2_core_win32.h +++ b/src/demon2/win32/demon2_core_win32.h @@ -229,12 +229,14 @@ global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0; //////////////////////////////// -//~ rjf: Helpers +//~ rjf: Basic Helpers -//- rjf: hashes internal U64 dmn_w32_hash_from_string(String8 string); internal U64 dmn_w32_hash_from_id(U64 id); +//////////////////////////////// +//~ rjf: Entity Helpers + //- rjf: entity <-> handle internal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity); internal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle); @@ -246,27 +248,30 @@ internal void dmn_w32_entity_release(DMN_W32_Entity *entity); //- rjf: kind*id -> entity internal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id); -//- rjf: win32-level process reads/writes +//////////////////////////////// +//~ rjf: Module Info Extraction + +internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module); + +//////////////////////////////// +//~ rjf: Win32-Level Process/Thread Reads/Writes + +//- rjf: processes internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst); internal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src); internal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); #define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) #define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); -//- rjf: win32-level thread register reads/writes +//- rjf: threads internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave); internal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw); internal B32 dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block); internal B32 dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block); -//- rjf: win32-level thread injection +//- rjf: remote thread injection internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); -//- rjf: module image analysis -internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); - -//- rjf: module full path extraction -internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module); - #endif // DEMON2_CORE_WIN32_H diff --git a/src/pe/pe.c b/src/pe/pe.c index 39447b98..f2b243f9 100644 --- a/src/pe/pe.c +++ b/src/pe/pe.c @@ -1,6 +1,54 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Basic Enum Functions + +internal U32 +pe_slot_count_from_unwind_op_code(PE_UnwindOpCode opcode) +{ + U32 result = 0; + switch(opcode) + { + case PE_UnwindOpCode_PUSH_NONVOL: result = 1; break; + case PE_UnwindOpCode_ALLOC_LARGE: result = 2; break; + case PE_UnwindOpCode_ALLOC_SMALL: result = 1; break; + case PE_UnwindOpCode_SET_FPREG: result = 1; break; + case PE_UnwindOpCode_SAVE_NONVOL: result = 2; break; + case PE_UnwindOpCode_SAVE_NONVOL_FAR: result = 3; break; + case PE_UnwindOpCode_EPILOG: result = 2; break; + case PE_UnwindOpCode_SPARE_CODE: result = 3; break; + case PE_UnwindOpCode_SAVE_XMM128: result = 2; break; + case PE_UnwindOpCode_SAVE_XMM128_FAR: result = 3; break; + case PE_UnwindOpCode_PUSH_MACHFRAME: result = 1; break; + } + return result; +} + +internal String8 +pe_string_from_windows_subsystem(PE_WindowsSubsystem subsystem) +{ + String8 result = {0}; + switch(subsystem) + { + default:{}break; + case PE_WindowsSubsystem_UNKNOWN: result = str8_lit("UNKNOWN"); break; + case PE_WindowsSubsystem_NATIVE: result = str8_lit("NATIVE"); break; + case PE_WindowsSubsystem_WINDOWS_GUI: result = str8_lit("WINDOWS_GUI"); break; + case PE_WindowsSubsystem_WINDOWS_CUI: result = str8_lit("WINDOWS_CUI"); break; + case PE_WindowsSubsystem_OS2_CUI: result = str8_lit("OS2_CUI"); break; + case PE_WindowsSubsystem_POSIX_CUI: result = str8_lit("POSIX_CUI"); break; + case PE_WindowsSubsystem_NATIVE_WINDOWS: result = str8_lit("NATIVE_WINDOWS"); break; + case PE_WindowsSubsystem_WINDOWS_CE_GUI: result = str8_lit("WINDOWS_CE_GUID"); break; + case PE_WindowsSubsystem_EFI_APPLICATION: result = str8_lit("EFI_APPLICATION"); break; + case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER: result = str8_lit("EFI_BOOT_SERVICE_DRIVER"); break; + case PE_WindowsSubsystem_EFI_ROM: result = str8_lit("EFI_ROM"); break; + case PE_WindowsSubsystem_XBOX: result = str8_lit("XBOX"); break; + case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: result = str8_lit("WINDOWS_BOOT_APPLICATION"); break; + } + return result; +} + //////////////////////////////// //~ rjf: Parser Functions @@ -535,7 +583,7 @@ pe_resource_dir_push_dir_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID PE_Resource *res = &res_node->data; res->id = id; - res->type = PE_ResData_DIR; + res->kind = PE_ResDataKind_DIR; res->u.dir = sub_dir; return res_node; @@ -558,7 +606,7 @@ pe_resource_dir_push_entry_node(Arena *arena, PE_ResourceDir *dir, COFF_Resource PE_Resource *res = &res_node->data; res->id = id; - res->type = PE_ResData_COFF_RESOURCE; + res->kind = PE_ResDataKind_COFF_RESOURCE; res->u.coff_res.type = type; res->u.coff_res.data_version = data_version; res->u.coff_res.version = version; @@ -716,7 +764,7 @@ pe_resource_table_from_directory_data(Arena *arena, String8 data) entry->id.type = COFF_ResourceIDType_STRING; entry->id.u.string = str8_from_16(arena, name16); - entry->type = is_dir ? PE_ResData_DIR : PE_ResData_COFF_LEAF; + entry->kind = is_dir ? PE_ResDataKind_DIR : PE_ResDataKind_COFF_LEAF; if (is_dir) { struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1); @@ -745,7 +793,7 @@ pe_resource_table_from_directory_data(Arena *arena, String8 data) entry->id.type = COFF_ResourceIDType_NUMBER; entry->id.u.number = coff_entry.name.id; - entry->type = is_dir ? PE_ResData_DIR : PE_ResData_COFF_LEAF; + entry->kind = is_dir ? PE_ResDataKind_DIR : PE_ResDataKind_COFF_LEAF; if (is_dir) { struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1); @@ -766,43 +814,3 @@ pe_resource_table_from_directory_data(Arena *arena, String8 data) scratch_end(scratch); return bottom_frame->table; } - -//////////////////////////////// - -internal String8 -pe_get_dos_program(void) -{ - // generated from pe/dos_program.asm - static U8 program[] = { - 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, - 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x24, 0x00, 0x00 - }; - return str8(program, sizeof(program)); -} - -//////////////////////////////// - -internal String8 -pe_string_from_subsystem(PE_WindowsSubsystem subsystem) -{ - switch (subsystem) { - case PE_WindowsSubsystem_UNKNOWN: return str8_lit("UNKNOWN"); - case PE_WindowsSubsystem_NATIVE: return str8_lit("NATIVE"); - case PE_WindowsSubsystem_WINDOWS_GUI: return str8_lit("WINDOWS_GUI"); - case PE_WindowsSubsystem_WINDOWS_CUI: return str8_lit("WINDOWS_CUI"); - case PE_WindowsSubsystem_OS2_CUI: return str8_lit("OS2_CUI"); - case PE_WindowsSubsystem_POSIX_CUI: return str8_lit("POSIX_CUI"); - case PE_WindowsSubsystem_NATIVE_WINDOWS: return str8_lit("NATIVE_WINDOWS"); - case PE_WindowsSubsystem_WINDOWS_CE_GUI: return str8_lit("WINDOWS_CE_GUID"); - case PE_WindowsSubsystem_EFI_APPLICATION: return str8_lit("EFI_APPLICATION"); - case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER: return str8_lit("EFI_BOOT_SERVICE_DRIVER"); - case PE_WindowsSubsystem_EFI_ROM: return str8_lit("EFI_ROM"); - case PE_WindowsSubsystem_XBOX: return str8_lit("XBOX"); - case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: return str8_lit("WINDOWS_BOOT_APPLICATION"); - default: break; - } - return str8(0,0); -} - diff --git a/src/pe/pe.h b/src/pe/pe.h index 28635a48..ebb89f4b 100644 --- a/src/pe/pe.h +++ b/src/pe/pe.h @@ -1,13 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -/* date = September 6th 2023 8:54 am */ - #ifndef PE_H #define PE_H //////////////////////////////// -//~ rjf: PE Format Types +//~ rjf: PE Format-Defined Types/Constants #pragma pack(push,1) @@ -287,7 +285,7 @@ enum PE_GlobalFlags_HEAP_ENABLE_TAG_BY_DLL = (1 << 15), PE_GlobalFlags_DISABLE_STACK_EXTENSION = (1 << 16), PE_GlobalFlags_ENABLE_CSRDEBUG = (1 << 17), - PE_GlobalFlags_ENABLE_KDEBUG_SYMBOL_LOAD = (1 << 18), + PE_GlobalFlags_ENABLE_KDEBUG_SYMBOL_LOAD = (1 << 18), PE_GlobalFlags_DISABLE_PAGE_KERNEL_STACKS = (1 << 19), PE_GlobalFlags_ENABLE_SYSTEM_CRIT_BREAKS = (1 << 20), PE_GlobalFlags_HEAP_DISABLE_COALESCING = (1 << 21), @@ -445,11 +443,273 @@ struct PE_TLSHeader64 U32 characteristics; // COFF_SectionFlags but only align flags are used. }; +#define PE_RES_ALIGN 4u + +global read_only U8 PE_RES_MAGIC[] = +{ + 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +typedef U32 PE_ResourceKind; +enum +{ + PE_ResourceKind_CURSOR = 0x1, + PE_ResourceKind_BITMAP = 0x2, + PE_ResourceKind_ICON = 0x3, + PE_ResourceKind_MENU = 0x4, + PE_ResourceKind_DIALOG = 0x5, + PE_ResourceKind_STRING = 0x6, + PE_ResourceKind_FONTDIR = 0x7, + PE_ResourceKind_FONT = 0x8, + PE_ResourceKind_ACCELERATOR = 0x9, + PE_ResourceKind_RCDATA = 0xA, + PE_ResourceKind_MESSAGETABLE = 0xB, + PE_ResourceKind_GROUP_CURSOR = 0xC, + PE_ResourceKind_GROUP_ICON = 0xE, + PE_ResourceKind_VERSION = 0x10, + PE_ResourceKind_DLGINCLUDE = 0x11, + PE_ResourceKind_PLUGPLAY = 0x13, + PE_ResourceKind_VXD = 0x14, + PE_ResourceKind_ANICURSOR = 0x15, + PE_ResourceKind_ANIICON = 0x16, + PE_ResourceKind_HTML = 0x17, + PE_ResourceKind_MANIFEST = 0x18, + PE_ResourceKind_BITMAP_NEW = 0x2002, + PE_ResourceKind_MENU_NEW = 0x2004, + PE_ResourceKind_DIALOG_NEW = 0x2005, +}; + +typedef enum PE_ResDataKind +{ + PE_ResDataKind_NULL, + PE_ResDataKind_DIR, + PE_ResDataKind_COFF_LEAF, + PE_ResDataKind_COFF_RESOURCE, +} +PE_ResDataKind; + +typedef struct PE_ResourceHeader PE_ResourceHeader; +struct PE_ResourceHeader +{ + COFF_ResourceHeaderPrefix prefix; + U16 type; + U16 pad0; + U16 name; + U16 pad1; + U32 data_version; + COFF_ResourceMemoryFlags memory_flags; + U16 language_id; + U32 version; + U32 characteristics; +}; + +typedef U16 PE_BaseRelocKind; +enum +{ + PE_BaseRelocKind_ABSOLUTE = 0, // No reallocation is applied. Can be used as padding. + PE_BaseRelocKind_HIGH = 1, + PE_BaseRelocKind_LOW = 2, + PE_BaseRelocKind_HIGHLOW = 3, + PE_BaseRelocKind_HIGHADJ = 4, + PE_BaseRelocKind_MIPS_JMPADDR = 5, + PE_BaseRelocKind_ARM_MOV32 = 5, + PE_BaseRelocKind_RISCV_HIGH20 = 5, + // 6 is reserved + PE_BaseRelocKind_THUMB_MOV32 = 7, + PE_BaseRelocKind_RISCV_LOW12I = 7, + PE_BaseRelocKind_RISCV_LOW12S = 8, + PE_BaseRelocKind_LOONGARCH32_MARK_LA = 8, + PE_BaseRelocKind_LOONGARCH64_MARK_LA = 8, + PE_BaseRelocKind_MIPS_JMPADDR16 = 9, + PE_BaseRelocKind_DIR64 = 10, +}; +#define PE_BaseRelocOffsetFromEntry(x) ((x) & 0x1fff) +#define PE_BaseRelocKindFromEntry(x) (((x) >> 12) & 0xf) +#define PE_BaseRelocMake(k, off) ((((U16)(k) & 0xf) << 12) | (U16)((off) & 0x1fff)) + +typedef U32 PE_UnwindOpCode; +enum +{ + PE_UnwindOpCode_PUSH_NONVOL = 0, + PE_UnwindOpCode_ALLOC_LARGE = 1, + PE_UnwindOpCode_ALLOC_SMALL = 2, + PE_UnwindOpCode_SET_FPREG = 3, + PE_UnwindOpCode_SAVE_NONVOL = 4, + PE_UnwindOpCode_SAVE_NONVOL_FAR = 5, + PE_UnwindOpCode_EPILOG = 6, + PE_UnwindOpCode_SPARE_CODE = 7, + PE_UnwindOpCode_SAVE_XMM128 = 8, + PE_UnwindOpCode_SAVE_XMM128_FAR = 9, + PE_UnwindOpCode_PUSH_MACHFRAME = 10, +}; + +typedef U8 PE_UnwindGprRegX64; +enum +{ + PE_UnwindGprRegX64_RAX = 0, + PE_UnwindGprRegX64_RCX = 1, + PE_UnwindGprRegX64_RDX = 2, + PE_UnwindGprRegX64_RBX = 3, + PE_UnwindGprRegX64_RSP = 4, + PE_UnwindGprRegX64_RBP = 5, + PE_UnwindGprRegX64_RSI = 6, + PE_UnwindGprRegX64_RDI = 7, + PE_UnwindGprRegX64_R8 = 8, + PE_UnwindGprRegX64_R9 = 9, + PE_UnwindGprRegX64_R10 = 10, + PE_UnwindGprRegX64_R11 = 11, + PE_UnwindGprRegX64_R12 = 12, + PE_UnwindGprRegX64_R13 = 13, + PE_UnwindGprRegX64_R14 = 14, + PE_UnwindGprRegX64_R15 = 15, +}; + +typedef U8 PE_UnwindInfoFlags; +enum +{ + PE_UnwindInfoFlag_EHANDLER = (1<<0), + PE_UnwindInfoFlag_UHANDLER = (1<<1), + PE_UnwindInfoFlag_FHANDLER = 3, + PE_UnwindInfoFlag_CHAINED = (1<<2), +}; + +#define PE_UNWIND_OPCODE_FROM_FLAGS(f) ((f)&0xF) +#define PE_UNWIND_INFO_FROM_FLAGS(f) (((f) >> 4)&0xF) + +typedef union PE_UnwindCode PE_UnwindCode; +union PE_UnwindCode +{ + struct + { + U8 off_in_prolog; + U8 flags; + }; + U16 u16; +}; + +#define PE_UNWIND_INFO_VERSION_FROM_HDR(x) ((x)&0x7) +#define PE_UNWIND_INFO_FLAGS_FROM_HDR(x) (((x) >> 3)&0x1F) +#define PE_UNWIND_INFO_REG_FROM_FRAME(x) ((x)&0xF) +#define PE_UNWIND_INFO_OFF_FROM_FRAME(x) (((x) >> 4)&0xF) + +typedef struct PE_UnwindInfo PE_UnwindInfo; +struct PE_UnwindInfo +{ + U8 header; + U8 prolog_size; + U8 codes_num; + U8 frame; +}; + #pragma pack(pop) +//////////////////////////////// +//~ rjf: DOS Program + +// generated from pe/dos_program.asm +read_only global U8 pe_dos_program_data[] = +{ + 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, + 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x24, 0x00, 0x00 +}; +read_only global String8 pe_dos_program = {pe_dos_program_data, sizeof(pe_dos_program_data)}; + //////////////////////////////// //~ rjf: Parsed Info Types +//- rjf: relocation blocks + +typedef struct PE_BaseRelocBlock PE_BaseRelocBlock; +struct PE_BaseRelocBlock +{ + U64 page_virt_off; + U64 entry_count; + U16 *entries; +}; + +typedef struct PE_BaseRelocBlockNode PE_BaseRelocBlockNode; +struct PE_BaseRelocBlockNode +{ + PE_BaseRelocBlockNode *next; + PE_BaseRelocBlock v; +}; + +typedef struct PE_BaseRelocBlockList PE_BaseRelocBlockList; +struct PE_BaseRelocBlockList +{ + PE_BaseRelocBlockNode *first; + PE_BaseRelocBlockNode *last; + U64 count; +}; + +//- rjf: resources + +typedef struct PE_Resource PE_Resource; +struct PE_Resource +{ + COFF_ResourceID id; + PE_ResDataKind kind; + union + { + COFF_ResourceDataEntry leaf; + struct PE_ResourceDir *dir; + struct + { + COFF_ResourceID type; + U32 data_version; + U32 version; + COFF_ResourceMemoryFlags memory_flags; + String8 data; + } + coff_res; + } + u; +}; + +typedef struct PE_ResourceNode PE_ResourceNode; +struct PE_ResourceNode +{ + PE_ResourceNode *next; + PE_Resource data; +}; + +typedef struct PE_ResourceList PE_ResourceList; +struct PE_ResourceList +{ + PE_ResourceNode *first; + PE_ResourceNode *last; + U64 count; +}; + +typedef struct PE_ResourceArray PE_ResourceArray; +struct PE_ResourceArray +{ + PE_Resource *v; + U64 count; +}; + +typedef struct PE_ResourceDir PE_ResourceDir; +struct PE_ResourceDir +{ + U32 characteristics; + COFF_TimeStamp time_stamp; + U16 major_version; + U16 minor_version; + PE_ResourceList named_list; + PE_ResourceList id_list; +}; + +//- rjf: bundle + typedef struct PE_BinInfo PE_BinInfo; struct PE_BinInfo { @@ -475,161 +735,10 @@ struct PE_BinInfo }; //////////////////////////////// -//~ rjf: Parsed Info Extraction Helper Types +//~ rjf: Basic Enum Functions -typedef U16 PE_BaseRelocKind; -enum -{ - PE_BaseRelocKind_ABSOLUTE = 0, // No reallocation is applied. Can be used as padding. - PE_BaseRelocKind_HIGH = 1, - PE_BaseRelocKind_LOW = 2, - PE_BaseRelocKind_HIGHLOW = 3, - PE_BaseRelocKind_HIGHADJ = 4, - PE_BaseRelocKind_MIPS_JMPADDR = 5, - PE_BaseRelocKind_ARM_MOV32 = 5, - PE_BaseRelocKind_RISCV_HIGH20 = 5, - // 6 is reserved - PE_BaseRelocKind_THUMB_MOV32 = 7, - PE_BaseRelocKind_RISCV_LOW12I = 7, - PE_BaseRelocKind_RISCV_LOW12S = 8, - PE_BaseRelocKind_LOONGARCH32_MARK_LA = 8, - PE_BaseRelocKind_LOONGARCH64_MARK_LA = 8, - PE_BaseRelocKind_MIPS_JMPADDR16 = 9, - PE_BaseRelocKind_DIR64 = 10, -}; -#define PE_BaseRelocOffsetFromEntry(x) ((x) & 0x1fff) -#define PE_BaseRelocKindFromEntry(x) (((x) >> 12) & 0xf) -#define PE_BaseRelocMake(k, off) ((((U16)(k) & 0xf) << 12) | (U16)((off) & 0x1fff)) - -typedef struct PE_BaseRelocBlock PE_BaseRelocBlock; -struct PE_BaseRelocBlock -{ - U64 page_virt_off; - U64 entry_count; - U16 *entries; -}; - -typedef struct PE_BaseRelocBlockNode PE_BaseRelocBlockNode; -struct PE_BaseRelocBlockNode -{ - PE_BaseRelocBlockNode *next; - PE_BaseRelocBlock v; -}; - -typedef struct PE_BaseRelocBlockList PE_BaseRelocBlockList; -struct PE_BaseRelocBlockList -{ - PE_BaseRelocBlockNode *first; - PE_BaseRelocBlockNode *last; - U64 count; -}; - -//////////////////////////////// -//~ Resources - -#define PE_RES_ALIGN 4u - -read_only U8 PE_RES_MAGIC[] = { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -enum -{ - PE_Resource_CURSOR = 0x1, - PE_Resource_BITMAP = 0x2, - PE_Resource_ICON = 0x3, - PE_Resource_MENU = 0x4, - PE_Resource_DIALOG = 0x5, - PE_Resource_STRING = 0x6, - PE_Resource_FONTDIR = 0x7, - PE_Resource_FONT = 0x8, - PE_Resource_ACCELERATOR = 0x9, - PE_Resource_RCDATA = 0xA, - PE_Resource_MESSAGETABLE = 0xB, - PE_Resource_GROUP_CURSOR = 0xC, - PE_Resource_GROUP_ICON = 0xE, - PE_Resource_VERSION = 0x10, - PE_Resource_DLGINCLUDE = 0x11, - PE_Resource_PLUGPLAY = 0x13, - PE_Resource_VXD = 0x14, - PE_Resource_ANICURSOR = 0x15, - PE_Resource_ANIICON = 0x16, - PE_Resource_HTML = 0x17, - PE_Resource_MANIFEST = 0x18, - PE_Resource_BITMAP_NEW = 0x2002, - PE_Resource_MENU_NEW = 0x2004, - PE_Resource_DIALOG_NEW = 0x2005, -}; -typedef U32 PE_ResourceType; - -#pragma pack(push, 1) -typedef struct PE_ResourceHeader -{ - COFF_ResourceHeaderPrefix prefix; - U16 type; - U16 pad0; - U16 name; - U16 pad1; - U32 data_version; - COFF_ResourceMemoryFlags memory_flags; - U16 language_id; - U32 version; - U32 characteristics; -} PE_ResourceHeader; -#pragma pack(pop) - -typedef enum -{ - PE_ResData_NULL, - PE_ResData_DIR, - PE_ResData_COFF_LEAF, - PE_ResData_COFF_RESOURCE, -} PE_ResDataType; - -typedef struct PE_Resource -{ - COFF_ResourceID id; - PE_ResDataType type; - union { - COFF_ResourceDataEntry leaf; - struct PE_ResourceDir *dir; - struct { - COFF_ResourceID type; - U32 data_version; - U32 version; - COFF_ResourceMemoryFlags memory_flags; - String8 data; - } coff_res; - } u; -} PE_Resource; - -typedef struct PE_ResourceNode -{ - struct PE_ResourceNode *next; - PE_Resource data; -} PE_ResourceNode; - -typedef struct PE_ResourceList -{ - U64 count; - PE_ResourceNode *first; - PE_ResourceNode *last; -} PE_ResourceList; - -typedef struct PE_ResourceArray -{ - U64 count; - PE_Resource *v; -} PE_ResourceArray; - -typedef struct PE_ResourceDir -{ - U32 characteristics; - COFF_TimeStamp time_stamp; - U16 major_version; - U16 minor_version; - PE_ResourceList named_list; - PE_ResourceList id_list; -} PE_ResourceDir; +internal U32 pe_slot_count_from_unwind_op_code(PE_UnwindOpCode opcode); +internal String8 pe_string_from_windows_subsystem(PE_WindowsSubsystem subsystem); //////////////////////////////// //~ rjf: Parser Functions @@ -661,12 +770,4 @@ internal PE_Resource * pe_resource_dir_search(PE_ResourceDir *dir, COFF_Reso internal PE_ResourceArray pe_resource_list_to_array(Arena *arena, PE_ResourceList *list); internal PE_ResourceDir * pe_resource_table_from_directory_data(Arena *arena, String8 data); -//////////////////////////////// - -internal String8 pe_get_dos_program(void); - -//////////////////////////////// - -internal String8 pe_string_from_subsystem(PE_WindowsSubsystem subsystem); - -#endif //PE_H +#endif // PE_H diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 6616ce90..02e32ecf 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -43,10 +43,10 @@ #include "regs/raddbgi/regs_raddbgi.h" #include "type_graph/type_graph.h" #include "dbgi/dbgi.h" -#include "demon/demon_inc.h" +#include "demon2/demon2_inc.h" #include "eval/eval_inc.h" #include "unwind/unwind.h" -#include "ctrl/ctrl_inc.h" +#include "ctrl2/ctrl2_inc.h" //- rjf: [c] #include "base/base_inc.c" @@ -71,10 +71,10 @@ #include "regs/raddbgi/regs_raddbgi.c" #include "type_graph/type_graph.c" #include "dbgi/dbgi.c" -#include "demon/demon_inc.c" +#include "demon2/demon2_inc.c" #include "eval/eval_inc.c" #include "unwind/unwind.c" -#include "ctrl/ctrl_inc.c" +#include "ctrl2/ctrl2_inc.c" //////////////////////////////// //~ rjf: Entry Point From 49ccf50fd46e39e88790df297dccbfe22e1a658f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 8 Mar 2024 12:49:06 -0800 Subject: [PATCH 169/275] first pass at integrating new demon2 layer into debugger, need to change ctrl a bit to adopt some of the things that were previously being left up to demon layers --- src/ctrl/ctrl_core.c | 821 ++++++++++++++++++++++--------------- src/ctrl/ctrl_core.h | 273 +++++++----- src/dasm/dasm.c | 4 +- src/dasm/dasm.h | 6 +- src/demon2/demon2_core.h | 12 +- src/df/core/df_core.c | 10 +- src/df/core/df_core.h | 6 +- src/scratch/ryan_scratch.c | 4 +- 8 files changed, 676 insertions(+), 460 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 90f77226..36e00aaa 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -41,6 +41,18 @@ ctrl_init(void) ctrl_state->process_memory_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); ctrl_state->process_memory_cache.stripes[idx].cv = os_condition_variable_alloc(); } + ctrl_state->thread_reg_cache.slots_count = 1024; + ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); + ctrl_state->thread_reg_cache.stripes_count = 8; + ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); + for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) + { + ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); + ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); + } + ctrl_state->ctrl_entity_arena = arena_alloc(); + ctrl_state->ctrl_entity_hash_slots_count = 4096; + ctrl_state->ctrl_entity_hash_slots = push_array(arena, CTRL_EntityHashSlot, ctrl_state->ctrl_entity_hash_slots_count); ctrl_state->u2c_ring_size = KB(64); ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); ctrl_state->u2c_ring_mutex = os_mutex_alloc(); @@ -49,7 +61,7 @@ ctrl_init(void) ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); ctrl_state->c2u_ring_mutex = os_mutex_alloc(); ctrl_state->c2u_ring_cv = os_condition_variable_alloc(); - ctrl_state->demon_event_arena = arena_alloc(); + ctrl_state->dmn_event_arena = arena_alloc(); ctrl_state->user_entry_point_arena = arena_alloc(); for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) { @@ -94,44 +106,35 @@ ctrl_hash_from_string(String8 string) return result; } +internal U64 +ctrl_hash_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle) +{ + U64 buf[] = {machine_id, handle.u64[0]}; + U64 hash = ctrl_hash_from_string(str8((U8 *)buf, sizeof(buf))); + return hash; +} + internal CTRL_EventCause -ctrl_event_cause_from_demon_event_kind(DEMON_EventKind event_kind) +ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) { CTRL_EventCause cause = CTRL_EventCause_Null; switch(event_kind) { default:{}break; - case DEMON_EventKind_Error: {cause = CTRL_EventCause_Error;}break; - case DEMON_EventKind_Exception:{cause = CTRL_EventCause_InterruptedByException;}break; - case DEMON_EventKind_Trap: {cause = CTRL_EventCause_InterruptedByTrap;}break; - case DEMON_EventKind_Halt: {cause = CTRL_EventCause_InterruptedByHalt;}break; + case DMN_EventKind_Error: {cause = CTRL_EventCause_Error;}break; + case DMN_EventKind_Exception:{cause = CTRL_EventCause_InterruptedByException;}break; + case DMN_EventKind_Trap: {cause = CTRL_EventCause_InterruptedByTrap;}break; + case DMN_EventKind_Halt: {cause = CTRL_EventCause_InterruptedByHalt;}break; } return cause; } internal B32 -ctrl_handle_match(CTRL_Handle a, CTRL_Handle b) +ctrl_handle_match(DMN_Handle a, DMN_Handle b) { return MemoryMatchStruct(&a, &b); } -//////////////////////////////// -//~ rjf: Ctrl <-> Demon Handle Translation Functions - -internal DEMON_Handle -ctrl_demon_handle_from_ctrl(CTRL_Handle h) -{ - DEMON_Handle result = h.u64[0]; - return result; -} - -internal CTRL_Handle -ctrl_handle_from_demon(DEMON_Handle h) -{ - CTRL_Handle result = {h}; - return result; -} - //////////////////////////////// //~ rjf: Machine/Handle Pair Type Functions @@ -206,14 +209,14 @@ ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src) } internal void -ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DEMON_Handle module, CTRL_UserBreakpointList *user_bps, DEMON_TrapChunkList *traps_out) +ctrl_append_resolved_module_user_bp_traps(Arena *arena, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) { Temp scratch = scratch_begin(&arena, 1); DBGI_Scope *scope = dbgi_scope_open(); - String8 exe_path = demon_full_path_from_module(scratch.arena, module); + String8 exe_path = dmn_full_path_from_module(scratch.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; - U64 base_vaddr = demon_base_vaddr_from_module(module); + U64 base_vaddr = dmn_base_vaddr_from_module(module); for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) { CTRL_UserBreakpoint *bp = &n->v; @@ -265,8 +268,8 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE for(U32 i = 0; i < voff_count; i += 1) { U64 vaddr = voffs[i] + base_vaddr; - DEMON_Trap trap = {process, vaddr, (U64)bp}; - demon_trap_chunk_list_push(arena, traps_out, 256, &trap); + DMN_Trap trap = {process, vaddr, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); } } }break; @@ -292,8 +295,8 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE { U64 proc_voff = rdi_first_voff_from_proc(rdi, ids[match_i]); U64 proc_vaddr = proc_voff + base_vaddr; - DEMON_Trap trap = {process, proc_vaddr + voff, (U64)bp}; - demon_trap_chunk_list_push(arena, traps_out, 256, &trap); + DMN_Trap trap = {process, proc_vaddr + voff, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); } } } @@ -306,15 +309,15 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE } internal void -ctrl_append_resolved_process_user_bp_traps(Arena *arena, DEMON_Handle process, CTRL_UserBreakpointList *user_bps, DEMON_TrapChunkList *traps_out) +ctrl_append_resolved_process_user_bp_traps(Arena *arena, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) { for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) { CTRL_UserBreakpoint *bp = &n->v; if(bp->kind == CTRL_UserBreakpointKind_VirtualAddress) { - DEMON_Trap trap = {process, bp->u64, (U64)bp}; - demon_trap_chunk_list_push(arena, traps_out, 256, &trap); + DMN_Trap trap = {process, bp->u64, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); } } } @@ -688,7 +691,7 @@ ctrl_reggen_idx(void) internal void ctrl_halt(void) { - demon_halt(0, 0); + dmn_halt(0, 0); } //- rjf: exe -> dbg path mapping @@ -744,26 +747,25 @@ ctrl_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path) //- rjf: handle -> arch internal Architecture -ctrl_arch_from_handle(CTRL_MachineID machine, CTRL_Handle handle) +ctrl_arch_from_handle(CTRL_MachineID machine, DMN_Handle handle) { - return demon_arch_from_object(ctrl_demon_handle_from_ctrl(handle)); + return dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(handle)); } //- rjf: process memory reading/writing internal U64 -ctrl_process_read(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *dst) +ctrl_process_read(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *dst) { - U64 actual_bytes_read = demon_read_memory(ctrl_demon_handle_from_ctrl(process), dst, range.min, dim_1u64(range)); + U64 actual_bytes_read = dmn_process_read(process, range, dst); return actual_bytes_read; } internal B32 -ctrl_process_write(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *src) +ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *src) { ProfBeginFunction(); - U64 size = dim_1u64(range); - B32 result = demon_write_memory(ctrl_demon_handle_from_ctrl(process), range.min, src, size); + B32 result = dmn_process_write(process, range, src); //- rjf: success -> increment memgen if(result) @@ -785,7 +787,7 @@ ctrl_process_write(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range { Task *next; CTRL_MachineID machine_id; - CTRL_Handle process; + DMN_Handle process; Rng1U64 range; }; Task *first_task = 0; @@ -838,7 +840,7 @@ ctrl_process_write(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range //- rjf: process memory cache interaction internal U128 -ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated) +ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated) { U64 key_hash_data[] = { @@ -853,7 +855,7 @@ ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Han } internal U128 -ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated, U64 endt_us) +ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, U64 endt_us) { U128 result = {0}; U64 size = dim_1u64(range); @@ -986,7 +988,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle //- rjf: process memory cache reading helpers internal CTRL_ProcessMemorySlice -ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, U64 endt_us) +ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, U64 endt_us) { CTRL_ProcessMemorySlice result = {0}; if(range.max > range.min && @@ -1109,7 +1111,7 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac } internal CTRL_ProcessMemorySlice -ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us) +ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 endt_us) { CTRL_ProcessMemorySlice result = ctrl_query_cached_data_from_process_vaddr_range(arena, machine_id, process, r1u64(vaddr, vaddr+limit), endt_us); for(U64 idx = 0; idx < result.data.size; idx += 1) @@ -1125,42 +1127,42 @@ ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CT //- rjf: register reading/writing -internal void * -ctrl_reg_block_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread) +internal B32 +ctrl_thread_read_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block) { - void *regs = demon_read_regs(ctrl_demon_handle_from_ctrl(thread)); - return regs; + B32 good = dmn_thread_read_reg_block(thread, block); + return good; } internal B32 -ctrl_thread_write_reg_block(CTRL_MachineID machine_id, CTRL_Handle thread, void *block) +ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block) { - B32 good = demon_write_regs(ctrl_demon_handle_from_ctrl(thread), block); + B32 good = dmn_thread_write_reg_block(thread, block); ins_atomic_u64_inc_eval(&ctrl_state->reggen_idx); return good; } internal U64 -ctrl_rip_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread) +ctrl_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) { U64 result = 0; void *regs = ctrl_reg_block_from_thread(machine_id, thread); if(regs != 0) { - Architecture arch = demon_arch_from_object(ctrl_demon_handle_from_ctrl(thread)); + Architecture arch = dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(thread)); result = regs_rip_from_arch_block(arch, regs); } return result; } internal B32 -ctrl_thread_write_rip(CTRL_MachineID machine_id, CTRL_Handle thread, U64 rip) +ctrl_thread_write_rip(CTRL_MachineID machine_id, DMN_Handle thread, U64 rip) { B32 result = 0; void *regs = ctrl_reg_block_from_thread(machine_id, thread); if(regs != 0) { - Architecture arch = demon_arch_from_object(ctrl_demon_handle_from_ctrl(thread)); + Architecture arch = dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(thread)); regs_arch_block_write_rip(arch, regs, rip); ctrl_thread_write_reg_block(machine_id, thread, regs); result = 1; @@ -1169,30 +1171,29 @@ ctrl_thread_write_rip(CTRL_MachineID machine_id, CTRL_Handle thread, U64 rip) } internal U64 -ctrl_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread) +ctrl_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) { U64 result = 0; - DEMON_Handle demon_handle = ctrl_demon_handle_from_ctrl(thread); - result = demon_tls_root_vaddr_from_thread(demon_handle); + result = dmn_tls_root_vaddr_from_thread(thread); return result; } //- rjf: process * vaddr -> module -internal CTRL_Handle -ctrl_module_from_process_vaddr(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr) +internal DMN_Handle +ctrl_module_from_process_vaddr(CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr) { - CTRL_Handle handle = {0}; + DMN_Handle handle = {0}; { Temp scratch = scratch_begin(0, 0); - DEMON_HandleArray modules = demon_modules_from_process(scratch.arena, ctrl_demon_handle_from_ctrl(process)); + DMN_HandleArray modules = dmn_modules_from_process(scratch.arena, ctrl_dmn_handle_from_ctrl(process)); for(U64 idx = 0; idx < modules.count; idx += 1) { - DEMON_Handle m = modules.handles[idx]; - Rng1U64 m_vaddr_rng = demon_vaddr_range_from_module(m); + DMN_Handle m = modules.handles[idx]; + Rng1U64 m_vaddr_rng = dmn_vaddr_range_from_module(m); if(contains_1u64(m_vaddr_rng, vaddr)) { - handle = ctrl_handle_from_demon(m); + handle = m; break; } } @@ -1204,12 +1205,12 @@ ctrl_module_from_process_vaddr(CTRL_MachineID machine_id, CTRL_Handle process, U //- rjf: unwinding internal CTRL_Unwind -ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, CTRL_Handle thread) +ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle thread) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); DBGI_Scope *scope = dbgi_scope_open(); - Architecture arch = demon_arch_from_object(ctrl_demon_handle_from_ctrl(thread)); + Architecture arch = dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(thread)); U64 arch_reg_block_size = regs_block_size_from_architecture(arch); CTRL_Unwind unwind = {0}; unwind.error = 1; @@ -1235,7 +1236,7 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Ha UNW_MemView stack_memview = {0}; if(regs_block_good) { - U64 stack_base_unrounded = demon_stack_base_vaddr_from_thread(ctrl_demon_handle_from_ctrl(thread)); + U64 stack_base_unrounded = dmn_stack_base_vaddr_from_thread(thread); U64 stack_top_unrounded = regs_rsp_from_arch_block(arch, regs_block); U64 stack_base = AlignPow2(stack_base_unrounded, KB(4)); U64 stack_top = AlignDownPow2(stack_top_unrounded, KB(4)); @@ -1263,7 +1264,7 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Ha // rjf: regs -> rip*module*binary U64 rip = regs_rip_from_arch_block(arch, regs_block); - CTRL_Handle module = ctrl_module_from_process_vaddr(machine_id, process, rip); + DMN_Handle module = ctrl_module_from_process_vaddr(machine_id, process, rip); // rjf: cancel on 0 rip if(rip == 0) @@ -1272,7 +1273,7 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Ha } // rjf: binary -> all the binary info - String8 binary_full_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module)); + String8 binary_full_path = dmn_full_path_from_module(scratch.arena, ctrl_dmn_handle_from_ctrl(module)); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_full_path, 0); String8 binary_data = str8((U8 *)dbgi->exe_base, dbgi->exe_props.size); @@ -1292,7 +1293,7 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Ha unwind.count += 1; // rjf: unwind one step - UNW_Result unwind_step = unw_pe_x64(binary_data, &dbgi->pe, demon_vaddr_range_from_module(ctrl_demon_handle_from_ctrl(module)).min, &memview, (UNW_X64_Regs *)regs_block); + UNW_Result unwind_step = unw_pe_x64(binary_data, &dbgi->pe, dmn_vaddr_range_from_module(ctrl_dmn_handle_from_ctrl(module)).min, &memview, (UNW_X64_Regs *)regs_block); // rjf: cancel on bad step if(unwind_step.dead != 0) @@ -1467,7 +1468,7 @@ ctrl_c2u_pop_events(Arena *arena) //~ rjf: User -> Memory Stream Communication internal B32 -ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us) +ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us) { B32 good = 0; OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) @@ -1491,7 +1492,7 @@ ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 va } internal void -ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, CTRL_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated) +ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, DMN_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated) { OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) { @@ -1512,6 +1513,135 @@ ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, CTRL_Handle *out_process, //////////////////////////////// //~ rjf: Control-Thread-Only Functions +//- rjf: entity tree construction + +internal CTRL_Entity * +ctrl_thread__entity_alloc(CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle) +{ + // rjf: allocate + CTRL_Entity *entity = ctrl_state->ctrl_entity_free; + { + if(entity != 0) + { + SLLStackPop(ctrl_state->ctrl_entity_free); + } + else + { + entity = push_array_no_zero(ctrl_state->ctrl_entity_arena, CTRL_Entity, 1); + } + MemoryZeroStruct(entity); + } + + // rjf: fill + { + entity->kind = kind; + entity->machine_id = machine_id; + entity->handle = handle; + entity->parent = parent; + entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; + if(parent != &ctrl_entity_nil) + { + DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); + } + } + + // rjf: insert into hash map + { + U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); + U64 slot_idx = hash%ctrl_state->ctrl_entity_hash_slots_count; + CTRL_EntityHashSlot *slot = &ctrl_state->ctrl_entity_hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) + { + node = n; + break; + } + } + if(node == 0) + { + node = ctrl_state->ctrl_entity_hash_node_free; + if(node != 0) + { + SLLStackPop(ctrl_state->ctrl_entity_hash_node_free); + } + else + { + node = push_array_no_zero(ctrl_state->ctrl_entity_arena, CTRL_EntityHashNode, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->entity = entity; + } + } + + return entity; +} + +internal void +ctrl_thread__entity_release(CTRL_Entity *entity) +{ + // rjf: unhook root + if(entity->parent != &ctrl_entity_nil) + { + DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + } + + // rjf: walk every entity in this tree, free each + if(entity != &ctrl_entity_nil) + { + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + CTRL_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *t = first_task; t != 0; t = t->next) + { + for(CTRL_Entity *child = entity->first; child != &ctrl_entity_nil; child = child->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + + // rjf: free entity + SLLStackPush(ctrl_state->ctrl_entity_free, t->e); + + // rjf: remove from hash map + { + U64 hash = ctrl_hash_from_machine_id_handle(t->e->machine_id, t->e->handle); + U64 slot_idx = hash%ctrl_state->ctrl_entity_hash_slots_count; + CTRL_EntityHashSlot *slot = &ctrl_state->ctrl_entity_hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->machine_id == t->e->machine_id && dmn_handle_match(n->entity->handle, t->e->handle)) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(ctrl_state->ctrl_entity_hash_node_free, n); + break; + } + } + } + } + scratch_end(scratch); + } +} + +internal CTRL_Entity * +ctrl_thread__entity_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + + return entity; +} + //- rjf: entry point internal void @@ -1519,7 +1649,15 @@ ctrl_thread__entry_point(void *p) { ThreadNameF("[ctrl] thread"); ProfBeginFunction(); - demon_primary_thread_begin(); + + //- rjf: set up initial entities + { + CTRL_Entity *root = ctrl_thread__entity_alloc(&ctrl_entity_nil, CTRL_EntityKind_Root, 0, dmn_handle_zero()); + CTRL_Entity *local_machine = ctrl_thread__entity_alloc(root, CTRL_EntityKind_Machine, CTRL_MachineID_Local, dmn_handle_zero()); + (void)local_machine; + } + + //- rjf: loop Temp scratch = scratch_begin(0, 0); for(;;) { @@ -1530,7 +1668,6 @@ ctrl_thread__entry_point(void *p) //- rjf: process messages { - demon_exclusive_mode_begin(); B32 done = 0; for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0 && done == 0; msg_n = msg_n->next) { @@ -1562,20 +1699,20 @@ ctrl_thread__entry_point(void *p) }break; } } - demon_exclusive_mode_end(); } } + scratch_end(scratch); ProfEnd(); } //- rjf: attached process running/event gathering -internal DEMON_Event * -ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_ctrls, CTRL_Spoof *spoof) +internal DMN_Event * +ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof) { ProfBeginFunction(); - DEMON_Event *event = push_array(arena, DEMON_Event, 1); + DMN_Event *event = push_array(arena, DMN_Event, 1); Temp scratch = scratch_begin(&arena, 1); //- rjf: loop -> try to get event, run, repeat @@ -1586,17 +1723,17 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c ProfScope("get next event") { // rjf: grab first event - DEMON_EventNode *next_event_node = ctrl_state->first_demon_event_node; + DMN_EventNode *next_event_node = ctrl_state->first_dmn_event_node; // rjf: determine if we should filter B32 should_filter_event = 0; if(next_event_node != 0) { - DEMON_Event *ev = &next_event_node->v; + DMN_Event *ev = &next_event_node->v; switch(ev->kind) { default:{}break; - case DEMON_EventKind_Exception: + case DMN_EventKind_Exception: { // NOTE(rjf): first chance exceptions -> try ignoring should_filter_event = (ev->exception_repeated == 0 && (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)); @@ -1631,14 +1768,14 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) { DBGI_Scope *scope = dbgi_scope_open(); - DEMON_HandleArray modules = demon_modules_from_process(scratch.arena, ev->process); + DMN_HandleArray modules = dmn_modules_from_process(scratch.arena, ev->process); if(modules.count != 0) { // rjf: determine base address of asan shadow space U64 asan_shadow_base_vaddr = 0; B32 asan_shadow_variable_exists_but_is_zero = 0; - CTRL_Handle module = ctrl_handle_from_demon(modules.handles[0]); - String8 module_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module)); + DMN_Handle module = modules.handles[0]; + String8 module_path = dmn_full_path_from_module(scratch.arena, ctrl_dmn_handle_from_ctrl(module)); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_GlobalVariables); @@ -1656,10 +1793,10 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c { RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, ids[0]); U64 global_var_voff = global_var->voff; - U64 global_var_vaddr = global_var->voff + demon_base_vaddr_from_module(ctrl_demon_handle_from_ctrl(module)); - Architecture arch = demon_arch_from_object(ev->thread); + U64 global_var_vaddr = global_var->voff + dmn_base_vaddr_from_module(ctrl_dmn_handle_from_ctrl(module)); + Architecture arch = dmn_arch_from_object(ev->thread); U64 addr_size = bit_size_from_arch(arch)/8; - ctrl_process_read(CTRL_MachineID_Client, ctrl_handle_from_demon(ev->process), r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); + ctrl_process_read(CTRL_MachineID_Local, ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0); } } @@ -1693,7 +1830,7 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c if(next_event_node != 0 && !should_filter_event) { got_event = 1; - SLLQueuePop(ctrl_state->first_demon_event_node, ctrl_state->last_demon_event_node); + SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); MemoryCopyStruct(event, &next_event_node->v); event->string = push_str8_copy(arena, event->string); run_ctrls->ignore_previous_exception = 1; @@ -1702,55 +1839,55 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c // rjf: good event but filtered? pop from queue if(next_event_node != 0 && should_filter_event) { - SLLQueuePop(ctrl_state->first_demon_event_node, ctrl_state->last_demon_event_node); + SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); run_ctrls->ignore_previous_exception = 0; } } - //- rjf: no event -> demon_run for a new one - if(got_event == 0) ProfScope("no event -> demon_run for a new one") + //- rjf: no event -> dmn_run for a new one + if(got_event == 0) ProfScope("no event -> dmn_run for a new one") { // rjf: prep spoof - B32 do_spoof = (spoof != 0 && run_ctrls->single_step_thread == 0); + B32 do_spoof = (spoof != 0 && dmn_handle_match(run_ctrls->single_step_thread, dmn_handle_zero())); U64 size_of_spoof = 0; if(do_spoof) ProfScope("prep spoof") { - Architecture arch = demon_arch_from_object(ctrl_demon_handle_from_ctrl(spoof->process)); - demon_read_memory(ctrl_demon_handle_from_ctrl(spoof->process), &spoof_old_ip_value, spoof->vaddr, sizeof(spoof_old_ip_value)); + Architecture arch = dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(spoof->process)); + dmn_read_memory(ctrl_dmn_handle_from_ctrl(spoof->process), &spoof_old_ip_value, spoof->vaddr, sizeof(spoof_old_ip_value)); size_of_spoof = bit_size_from_arch(arch)/8; } // rjf: set spoof if(do_spoof) ProfScope("set spoof") { - demon_write_memory(ctrl_demon_handle_from_ctrl(spoof->process), spoof->vaddr, &spoof->new_ip_value, size_of_spoof); + dmn_write_memory(ctrl_dmn_handle_from_ctrl(spoof->process), spoof->vaddr, &spoof->new_ip_value, size_of_spoof); } // rjf: run for new events ProfScope("run for new events") { - DEMON_EventList events = demon_run(scratch.arena, run_ctrls); - for(DEMON_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next) + DMN_EventList events = dmn_run(scratch.arena, run_ctrls); + for(DMN_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next) { - DEMON_EventNode *dst_n = ctrl_state->free_demon_event_node; + DMN_EventNode *dst_n = ctrl_state->free_dmn_event_node; if(dst_n != 0) { - SLLStackPop(ctrl_state->free_demon_event_node); + SLLStackPop(ctrl_state->free_dmn_event_node); } else { - dst_n = push_array(ctrl_state->demon_event_arena, DEMON_EventNode, 1); + dst_n = push_array(ctrl_state->dmn_event_arena, DMN_EventNode, 1); } MemoryCopyStruct(&dst_n->v, &src_n->v); - dst_n->v.string = push_str8_copy(ctrl_state->demon_event_arena, dst_n->v.string); - SLLQueuePush(ctrl_state->first_demon_event_node, ctrl_state->last_demon_event_node, dst_n); + dst_n->v.string = push_str8_copy(ctrl_state->dmn_event_arena, dst_n->v.string); + SLLQueuePush(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node, dst_n); } } // rjf: unset spoof if(do_spoof) ProfScope("unset spoof") { - demon_write_memory(ctrl_demon_handle_from_ctrl(spoof->process), spoof->vaddr, &spoof_old_ip_value, size_of_spoof); + dmn_write_memory(ctrl_dmn_handle_from_ctrl(spoof->process), spoof->vaddr, &spoof_old_ip_value, size_of_spoof); } // rjf: inc generation counters @@ -1767,10 +1904,10 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c // simply been sent other debug events first if(spoof != 0) { - U64 spoof_thread_rip = demon_read_ip(ctrl_demon_handle_from_ctrl(spoof->thread)); + U64 spoof_thread_rip = dmn_read_ip(ctrl_dmn_handle_from_ctrl(spoof->thread)); if(spoof_thread_rip == spoof->new_ip_value) { - demon_write_ip(ctrl_demon_handle_from_ctrl(spoof->thread), spoof_old_ip_value); + dmn_write_ip(ctrl_dmn_handle_from_ctrl(spoof->thread), spoof_old_ip_value); } } @@ -1779,95 +1916,95 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c ProfScope("push ctrl events associated with this demon event") switch(event->kind) { default:{}break; - case DEMON_EventKind_CreateProcess: + case DMN_EventKind_CreateProcess: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); out_evt->kind = CTRL_EventKind_NewProc; out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Client; - out_evt->entity = ctrl_handle_from_demon(event->process); - out_evt->arch = demon_arch_from_object(event->process); + out_evt->machine_id = CTRL_MachineID_Local; + out_evt->entity = event->process; + out_evt->arch = dmn_arch_from_object(event->process); out_evt->entity_id = event->code; ctrl_state->process_counter += 1; }break; - case DEMON_EventKind_CreateThread: + case DMN_EventKind_CreateThread: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); out_evt->kind = CTRL_EventKind_NewThread; out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Client; - out_evt->entity = ctrl_handle_from_demon(event->thread); - out_evt->parent = ctrl_handle_from_demon(event->process); - out_evt->arch = demon_arch_from_object(event->process); + out_evt->machine_id = CTRL_MachineID_Local; + out_evt->entity = event->thread; + out_evt->parent = event->process; + out_evt->arch = dmn_arch_from_object(event->process); out_evt->entity_id = event->code; - out_evt->stack_base = demon_stack_base_vaddr_from_thread(event->thread); - out_evt->tls_root = demon_tls_root_vaddr_from_thread(event->thread); + out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); + out_evt->tls_root = dmn_tls_root_vaddr_from_thread(event->thread); out_evt->rip_vaddr = event->instruction_pointer; out_evt->string = event->string; }break; - case DEMON_EventKind_LoadModule: + case DMN_EventKind_LoadModule: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); String8 module_path = event->string; dbgi_binary_open(module_path); out_evt->kind = CTRL_EventKind_NewModule; out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Client; - out_evt->entity = ctrl_handle_from_demon(event->module); - out_evt->parent = ctrl_handle_from_demon(event->process); - out_evt->arch = demon_arch_from_object(event->module); + out_evt->machine_id = CTRL_MachineID_Local; + out_evt->entity = event->module; + out_evt->parent = event->process; + out_evt->arch = dmn_arch_from_object(event->module); out_evt->entity_id = event->code; out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); - out_evt->rip_vaddr = demon_base_vaddr_from_module(event->module); + out_evt->rip_vaddr = dmn_base_vaddr_from_module(event->module); out_evt->string = module_path; }break; - case DEMON_EventKind_ExitProcess: + case DMN_EventKind_ExitProcess: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); out_evt->kind = CTRL_EventKind_EndProc; out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Client; - out_evt->entity = ctrl_handle_from_demon(event->process); + out_evt->machine_id = CTRL_MachineID_Local; + out_evt->entity = event->process; out_evt->u64_code = event->code; ctrl_state->process_counter -= 1; }break; - case DEMON_EventKind_ExitThread: + case DMN_EventKind_ExitThread: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); out_evt->kind = CTRL_EventKind_EndThread; out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Client; - out_evt->entity = ctrl_handle_from_demon(event->thread); + out_evt->machine_id = CTRL_MachineID_Local; + out_evt->entity = event->thread; out_evt->entity_id = event->code; }break; - case DEMON_EventKind_UnloadModule: + case DMN_EventKind_UnloadModule: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); String8 module_path = event->string; dbgi_binary_close(module_path); out_evt->kind = CTRL_EventKind_EndModule; out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Client; - out_evt->entity = ctrl_handle_from_demon(event->module); + out_evt->machine_id = CTRL_MachineID_Local; + out_evt->entity = event->module; }break; - case DEMON_EventKind_DebugString: + case DMN_EventKind_DebugString: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); out_evt->kind = CTRL_EventKind_DebugString; out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Client; - out_evt->entity = ctrl_handle_from_demon(event->thread); - out_evt->parent = ctrl_handle_from_demon(event->process); + out_evt->machine_id = CTRL_MachineID_Local; + out_evt->entity = event->thread; + out_evt->parent = event->process; out_evt->string = event->string; }break; - case DEMON_EventKind_SetThreadName: + case DMN_EventKind_SetThreadName: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); out_evt->kind = CTRL_EventKind_ThreadName; out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Client; - out_evt->entity = ctrl_handle_from_demon(event->thread); - out_evt->parent = ctrl_handle_from_demon(event->process); + out_evt->machine_id = CTRL_MachineID_Local; + out_evt->entity = event->thread; + out_evt->parent = event->process; out_evt->string = event->string; out_evt->entity_id = event->code; }break; @@ -1875,7 +2012,7 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c ctrl_c2u_push_events(&evts); //- rjf: clear process memory cache, if we've just started a lone process - if(event->kind == DEMON_EventKind_CreateProcess && ctrl_state->process_counter == 1) + if(event->kind == DMN_EventKind_CreateProcess && ctrl_state->process_counter == 1) { CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; for(U64 slot_idx = 0; slot_idx < cache->slots_count; slot_idx += 1) @@ -1896,10 +2033,10 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c } //- rjf: out of queued up demon events -> clear event arena - if(ctrl_state->first_demon_event_node == 0) + if(ctrl_state->first_dmn_event_node == 0) { - ctrl_state->free_demon_event_node = 0; - arena_clear(ctrl_state->demon_event_arena); + ctrl_state->free_dmn_event_node = 0; + arena_clear(ctrl_state->dmn_event_arena); } scratch_end(scratch); @@ -1912,8 +2049,8 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c internal B32 ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size) { - DEMON_Handle process = (DEMON_Handle)u; - U64 read_size = demon_read_memory(process, out, addr, size); + DMN_Handle process = *(DMN_Handle *)u; + U64 read_size = dmn_process_read(process, r1u64(addr, addr+size), out); B32 result = (read_size == size); return result; } @@ -1935,7 +2072,7 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg) opts.env = msg->env_string_list; opts.inherit_env = msg->env_inherit; } - U32 id = demon_launch_process(&opts); + U32 id = dmn_launch_process(&opts); //- rjf: record start { @@ -1946,12 +2083,12 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg) } //- rjf: run to handshake - DEMON_Event *stop_event = 0; + DMN_Event *stop_event = 0; if(id != 0) { // rjf: prep run controls - DEMON_Handle unfrozen_process = 0; - DEMON_RunCtrls run_ctrls = {0}; + DMN_Handle unfrozen_process = {0}; + DMN_RunCtrls run_ctrls = {0}; { run_ctrls.run_entities_are_unfrozen = 1; run_ctrls.run_entities_are_processes = 1; @@ -1962,20 +2099,20 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg) // rjf: run until handshake-signifying events for(B32 done = 0; done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; - case DEMON_EventKind_CreateProcess: + case DMN_EventKind_CreateProcess: { unfrozen_process = event->process; run_ctrls.run_entity_count = 1; }break; - case DEMON_EventKind_Error: - case DEMON_EventKind_Breakpoint: - case DEMON_EventKind_Exception: - case DEMON_EventKind_ExitProcess: - case DEMON_EventKind_HandshakeComplete: + case DMN_EventKind_Error: + case DMN_EventKind_Breakpoint: + case DMN_EventKind_Exception: + case DMN_EventKind_ExitProcess: + case DMN_EventKind_HandshakeComplete: { done = 1; stop_event = event; @@ -2001,10 +2138,10 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg) event->kind = CTRL_EventKind_Stopped; if(stop_event != 0) { - event->cause = ctrl_event_cause_from_demon_event_kind(stop_event->kind); - event->machine_id = CTRL_MachineID_Client; - event->entity = ctrl_handle_from_demon(stop_event->thread); - event->parent = ctrl_handle_from_demon(stop_event->process); + event->cause = ctrl_event_cause_from_dmn_event_kind(stop_event->kind); + event->machine_id = CTRL_MachineID_Local; + event->entity = stop_event->thread; + event->parent = stop_event->process; event->exception_code = stop_event->code; event->vaddr_rng = r1u64(stop_event->address, stop_event->address); event->rip_vaddr = stop_event->instruction_pointer; @@ -2017,7 +2154,7 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg) CTRL_EventList evts = {0}; CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); evt->kind = CTRL_EventKind_LaunchAndHandshakeDone; - evt->machine_id= CTRL_MachineID_Client; + evt->machine_id= CTRL_MachineID_Local; evt->msg_id = msg->msg_id; evt->entity_id = id; ctrl_c2u_push_events(&evts); @@ -2044,7 +2181,7 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) opts.env = msg->env_string_list; opts.inherit_env = msg->env_inherit; } - U32 id = demon_launch_process(&opts); + U32 id = dmn_launch_process(&opts); ////////////////////////////// //- rjf: record start @@ -2059,22 +2196,22 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) ////////////////////////////// //- rjf: run to initialization (entry point) // - DEMON_Event *stop_event = 0; + DMN_Event *stop_event = 0; if(id != 0) { - DEMON_Handle unfrozen_process[8] = {0}; - DEMON_RunCtrls run_ctrls = {0}; + DMN_Handle unfrozen_process[8] = {0}; + DMN_RunCtrls run_ctrls = {0}; run_ctrls.run_entities_are_unfrozen = 1; run_ctrls.run_entities_are_processes = 1; for(B32 done = 0; done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; //- rjf: new process -> freeze process - case DEMON_EventKind_CreateProcess: + case DMN_EventKind_CreateProcess: if(run_ctrls.run_entity_count < ArrayCount(unfrozen_process)) { unfrozen_process[run_ctrls.run_entity_count] = event->process; @@ -2083,13 +2220,13 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) }break; //- rjf: breakpoint -> if it's the entry point, we're done. otherwise, keep going - case DEMON_EventKind_Breakpoint: + case DMN_EventKind_Breakpoint: { - for(DEMON_TrapChunkNode *n = run_ctrls.traps.first; n != 0; n = n->next) + for(DMN_TrapChunkNode *n = run_ctrls.traps.first; n != 0; n = n->next) { for(U64 idx = 0; idx < n->count; idx += 1) { - if(n->v[idx].address == event->instruction_pointer) + if(n->v[idx].vaddr == event->instruction_pointer) { done = 1; stop_event = event; @@ -2101,21 +2238,21 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) }break; //- rjf: exception -> done - case DEMON_EventKind_Exception: + case DMN_EventKind_Exception: { done = 1; stop_event = event; }break; //- rjf: process ended? -> remove from unfrozen processes. zero processes -> done. - case DEMON_EventKind_ExitProcess: + case DMN_EventKind_ExitProcess: { for(U64 idx = 0; idx < run_ctrls.run_entity_count; idx += 1) { - if(run_ctrls.run_entities[idx] == event->process && + if(dmn_handle_match(run_ctrls.run_entities[idx], event->process) && idx+1 < run_ctrls.run_entity_count) { - MemoryCopy(run_ctrls.run_entities+idx, run_ctrls.run_entities+idx+1, sizeof(DEMON_Handle)*(run_ctrls.run_entity_count-(idx+1))); + MemoryCopy(run_ctrls.run_entities+idx, run_ctrls.run_entities+idx+1, sizeof(DMN_Handle)*(run_ctrls.run_entity_count-(idx+1))); break; } } @@ -2131,7 +2268,7 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) }break; //- rjf: done with handshake -> ready to find entry point. search launched processes - case DEMON_EventKind_HandshakeComplete: + case DMN_EventKind_HandshakeComplete: { DBGI_Scope *scope = dbgi_scope_open(); @@ -2139,11 +2276,11 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) for(U64 process_idx = 0; process_idx < run_ctrls.run_entity_count; process_idx += 1) { //- rjf: unpack first module info - DEMON_HandleArray modules = demon_modules_from_process(scratch.arena, run_ctrls.run_entities[process_idx]); + DMN_HandleArray modules = dmn_modules_from_process(scratch.arena, run_ctrls.run_entities[process_idx]); if(modules.count == 0) { continue; } - DEMON_Handle module = modules.handles[0]; - U64 module_base_vaddr = demon_base_vaddr_from_module(module); - String8 exe_path = demon_full_path_from_module(scratch.arena, module); + DMN_Handle module = modules.handles[0]; + U64 module_base_vaddr = dmn_base_vaddr_from_module(module); + String8 exe_path = dmn_full_path_from_module(scratch.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); @@ -2171,8 +2308,8 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) if(voff != 0) { entries_found = 1; - DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - demon_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); + DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); } } } @@ -2196,8 +2333,8 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); if(voff != 0) { - DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - demon_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); + DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); break; } } @@ -2230,8 +2367,8 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) if(voff != 0) { entries_found = 1; - DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - demon_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); + DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); } } } @@ -2242,8 +2379,8 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) U64 voff = dbgi->pe.entry_point; if(voff != 0) { - DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - demon_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); + DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); } } @@ -2274,8 +2411,8 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) if(voff != 0) { entries_found = 1; - DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - demon_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); + DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); } } } @@ -2316,10 +2453,10 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) event->msg_id = msg->msg_id; if(stop_event != 0) { - event->cause = ctrl_event_cause_from_demon_event_kind(stop_event->kind); - event->machine_id = CTRL_MachineID_Client; - event->entity = ctrl_handle_from_demon(stop_event->thread); - event->parent = ctrl_handle_from_demon(stop_event->process); + event->cause = ctrl_event_cause_from_dmn_event_kind(stop_event->kind); + event->machine_id = CTRL_MachineID_Local; + event->entity = stop_event->thread; + event->parent = stop_event->process; event->exception_code = stop_event->code; event->vaddr_rng = r1u64(stop_event->address, stop_event->address); event->rip_vaddr = stop_event->instruction_pointer; @@ -2334,7 +2471,7 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) CTRL_EventList evts = {0}; CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); evt->kind = CTRL_EventKind_LaunchAndInitDone; - evt->machine_id= CTRL_MachineID_Client; + evt->machine_id= CTRL_MachineID_Local; evt->msg_id = msg->msg_id; evt->entity_id = id; ctrl_c2u_push_events(&evts); @@ -2352,28 +2489,28 @@ ctrl_thread__attach(CTRL_Msg *msg) DBGI_Scope *scope = dbgi_scope_open(); //- rjf: attach - B32 attach_successful = demon_attach_process(msg->entity_id); + B32 attach_successful = dmn_attach_process(msg->entity_id); //- rjf: run to handshake if(attach_successful) { - DEMON_Handle unfrozen_process = 0; - DEMON_RunCtrls run_ctrls = {0}; + DMN_Handle unfrozen_process = {0}; + DMN_RunCtrls run_ctrls = {0}; run_ctrls.run_entities_are_unfrozen = 1; run_ctrls.run_entities_are_processes = 1; for(B32 done = 0; done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; - case DEMON_EventKind_CreateProcess: + case DMN_EventKind_CreateProcess: { unfrozen_process = event->process; run_ctrls.run_entities = &unfrozen_process; run_ctrls.run_entity_count = 1; }break; - case DEMON_EventKind_HandshakeComplete: + case DMN_EventKind_HandshakeComplete: { done = 1; }break; @@ -2386,7 +2523,7 @@ ctrl_thread__attach(CTRL_Msg *msg) CTRL_EventList evts = {0}; CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); evt->kind = CTRL_EventKind_AttachDone; - evt->machine_id= CTRL_MachineID_Client; + evt->machine_id= CTRL_MachineID_Local; evt->msg_id = msg->msg_id; evt->entity_id = !!attach_successful * msg->entity_id; ctrl_c2u_push_events(&evts); @@ -2403,24 +2540,24 @@ ctrl_thread__kill(CTRL_Msg *msg) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DBGI_Scope *scope = dbgi_scope_open(); - DEMON_Handle process = ctrl_demon_handle_from_ctrl(msg->entity); + DMN_Handle process = msg->entity; U32 exit_code = msg->exit_code; //- rjf: send kill - B32 kill_worked = demon_kill_process(process, exit_code); + B32 kill_worked = dmn_kill_process(process, exit_code); //- rjf: wait for process to be dead - if(demon_object_exists(process) && kill_worked) + if(dmn_object_exists(process) && kill_worked) { - DEMON_RunCtrls run_ctrls = {0}; + DMN_RunCtrls run_ctrls = {0}; run_ctrls.run_entities_are_unfrozen = 1; run_ctrls.run_entities_are_processes = 1; run_ctrls.run_entities = &process; run_ctrls.run_entity_count = 1; for(B32 done = 0; done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, 0); - if(event->kind == DEMON_EventKind_ExitProcess && event->process == process) + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) { done = 1; } @@ -2432,7 +2569,7 @@ ctrl_thread__kill(CTRL_Msg *msg) CTRL_EventList evts = {0}; CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); evt->kind = CTRL_EventKind_KillDone; - evt->machine_id= CTRL_MachineID_Client; + evt->machine_id= CTRL_MachineID_Local; evt->msg_id = msg->msg_id; if(kill_worked) { @@ -2452,23 +2589,23 @@ ctrl_thread__detach(CTRL_Msg *msg) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DBGI_Scope *scope = dbgi_scope_open(); - DEMON_Handle process = ctrl_demon_handle_from_ctrl(msg->entity); + DMN_Handle process = msg->entity; //- rjf: detach - B32 detach_worked = demon_detach_process(process); + B32 detach_worked = dmn_detach_process(process); //- rjf: wait for process to be dead - if(demon_object_exists(process) && detach_worked) + if(dmn_object_exists(process) && detach_worked) { - DEMON_RunCtrls run_ctrls = {0}; + DMN_RunCtrls run_ctrls = {0}; run_ctrls.run_entities_are_unfrozen = 1; run_ctrls.run_entities_are_processes = 1; run_ctrls.run_entities = &process; run_ctrls.run_entity_count = 1; for(B32 done = 0; done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, 0); - if(event->kind == DEMON_EventKind_ExitProcess && event->process == process) + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) { done = 1; } @@ -2480,7 +2617,7 @@ ctrl_thread__detach(CTRL_Msg *msg) CTRL_EventList evts = {0}; CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); evt->kind = CTRL_EventKind_DetachDone; - evt->machine_id= CTRL_MachineID_Client; + evt->machine_id= CTRL_MachineID_Local; evt->msg_id = msg->msg_id; if(detach_worked) { @@ -2500,30 +2637,30 @@ ctrl_thread__run(CTRL_Msg *msg) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DBGI_Scope *scope = dbgi_scope_open(); - DEMON_Event *stop_event = 0; + DMN_Event *stop_event = 0; CTRL_EventCause stop_cause = CTRL_EventCause_Null; - DEMON_Handle target_thread = ctrl_demon_handle_from_ctrl(msg->entity); - DEMON_Handle target_process = ctrl_demon_handle_from_ctrl(msg->parent); + DMN_Handle target_thread = msg->entity; + DMN_Handle target_process = msg->parent; U64 spoof_ip_vaddr = 911; ////////////////////////////// //- rjf: gather processes // - DEMON_HandleArray processes = demon_all_processes(scratch.arena); + DMN_HandleArray processes = dmn_all_processes(scratch.arena); ////////////////////////////// //- rjf: gather all initial breakpoints // - DEMON_TrapChunkList user_traps = {0}; + DMN_TrapChunkList user_traps = {0}; { // rjf: resolve module-dependent user bps for(U64 process_idx = 0; process_idx < processes.count; process_idx += 1) { - DEMON_Handle process = processes.handles[process_idx]; - DEMON_HandleArray modules = demon_modules_from_process(scratch.arena, process); + DMN_Handle process = processes.handles[process_idx]; + DMN_HandleArray modules = dmn_modules_from_process(scratch.arena, process); for(U64 module_idx = 0; module_idx < modules.count; module_idx += 1) { - DEMON_Handle module = modules.handles[module_idx]; + DMN_Handle module = modules.handles[module_idx]; ctrl_append_resolved_module_user_bp_traps(scratch.arena, process, module, &msg->user_bps, &user_traps); } } @@ -2551,21 +2688,21 @@ ctrl_thread__run(CTRL_Msg *msg) if(stop_event == 0) { // rjf: gather stuck threads - DEMON_HandleList stuck_threads = {0}; + DMN_HandleList stuck_threads = {0}; for(U64 i = 0; i < processes.count; i += 1) { - DEMON_Handle process = processes.handles[i]; - DEMON_HandleArray threads = demon_threads_from_process(scratch.arena, process); + DMN_Handle process = processes.handles[i]; + DMN_HandleArray threads = dmn_threads_from_process(scratch.arena, process); for(U64 j = 0; j < threads.count; j += 1) { - DEMON_Handle thread = threads.handles[j]; - U64 rip = demon_read_ip(thread); + DMN_Handle thread = threads.handles[j]; + U64 rip = dmn_read_ip(thread); // rjf: determine if thread is frozen B32 thread_is_frozen = !msg->freeze_state_is_frozen; for(CTRL_MachineIDHandlePairNode *n = msg->freeze_state_threads.first; n != 0; n = n->next) { - if(ctrl_demon_handle_from_ctrl(n->v.handle) == thread) + if(dmn_handle_match(n->v.handle, thread)) { thread_is_frozen ^= 1; break; @@ -2575,12 +2712,12 @@ ctrl_thread__run(CTRL_Msg *msg) // rjf: not frozen? -> check if stuck & gather if so if(thread_is_frozen == 0) { - for(DEMON_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) + for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) { B32 is_on_user_bp = 0; - for(DEMON_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) + for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) { - if(trap_ptr->process == process && trap_ptr->address == rip) + if(dmn_handle_match(trap_ptr->process, process) && trap_ptr->vaddr == rip) { is_on_user_bp = 1; } @@ -2595,12 +2732,12 @@ ctrl_thread__run(CTRL_Msg *msg) } } - if(is_on_user_bp && (!is_on_net_trap || thread != target_thread)) + if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread, target_thread))) { - demon_handle_list_push(scratch.arena, &stuck_threads, thread); + dmn_handle_list_push(scratch.arena, &stuck_threads, thread); } - if(is_on_user_bp && is_on_net_trap && thread == target_thread) + if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread, target_thread)) { target_thread_is_on_user_bp_and_trap_net_trap = 1; } @@ -2610,28 +2747,28 @@ ctrl_thread__run(CTRL_Msg *msg) } // rjf: actually step stuck threads - for(DEMON_HandleNode *node = stuck_threads.first; + for(DMN_HandleNode *node = stuck_threads.first; node != 0; node = node->next) { - DEMON_RunCtrls run_ctrls = {0}; + DMN_RunCtrls run_ctrls = {0}; run_ctrls.single_step_thread = node->v; for(B32 done = 0; done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; - case DEMON_EventKind_Error: stop_cause = CTRL_EventCause_Error; goto stop; - case DEMON_EventKind_Exception: stop_cause = CTRL_EventCause_InterruptedByException; goto stop; - case DEMON_EventKind_Trap: stop_cause = CTRL_EventCause_InterruptedByTrap; goto stop; - case DEMON_EventKind_Halt: stop_cause = CTRL_EventCause_InterruptedByHalt; goto stop; + case DMN_EventKind_Error: stop_cause = CTRL_EventCause_Error; goto stop; + case DMN_EventKind_Exception: stop_cause = CTRL_EventCause_InterruptedByException; goto stop; + case DMN_EventKind_Trap: stop_cause = CTRL_EventCause_InterruptedByTrap; goto stop; + case DMN_EventKind_Halt: stop_cause = CTRL_EventCause_InterruptedByHalt; goto stop; stop:; { stop_event = event; done = 1; }break; - case DEMON_EventKind_SingleStep: + case DMN_EventKind_SingleStep: { done = 1; }break; @@ -2643,22 +2780,22 @@ ctrl_thread__run(CTRL_Msg *msg) ////////////////////////////// //- rjf: resolve trap net // - DEMON_TrapChunkList trap_net_traps = {0}; + DMN_TrapChunkList trap_net_traps = {0}; for(CTRL_TrapNode *node = msg->traps.first; node != 0; node = node->next) { - DEMON_Trap trap = {target_process, node->v.vaddr}; - demon_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap); + DMN_Trap trap = {target_process, node->v.vaddr}; + dmn_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap); } ////////////////////////////// //- rjf: join user breakpoints and trap net traps // - DEMON_TrapChunkList joined_traps = {0}; + DMN_TrapChunkList joined_traps = {0}; { - demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &user_traps); - demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &user_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); } ////////////////////////////// @@ -2677,7 +2814,7 @@ ctrl_thread__run(CTRL_Msg *msg) // if(stop_event == 0) { - U64 sp_check_value = demon_read_sp(target_thread); + U64 sp_check_value = dmn_read_sp(target_thread); B32 spoof_mode = 0; CTRL_Spoof spoof = {0}; for(;;) @@ -2685,7 +2822,7 @@ ctrl_thread__run(CTRL_Msg *msg) ////////////////////////// //- rjf: choose low level traps // - DEMON_TrapChunkList *trap_list = &joined_traps; + DMN_TrapChunkList *trap_list = &joined_traps; if(spoof_mode) { trap_list = &user_traps; @@ -2703,16 +2840,16 @@ ctrl_thread__run(CTRL_Msg *msg) ////////////////////////// //- rjf: setup run controls // - DEMON_RunCtrls run_ctrls = {0}; + DMN_RunCtrls run_ctrls = {0}; run_ctrls.ignore_previous_exception = 1; run_ctrls.run_entity_count = msg->freeze_state_threads.count; - run_ctrls.run_entities = push_array(scratch.arena, DEMON_Handle, run_ctrls.run_entity_count); + run_ctrls.run_entities = push_array(scratch.arena, DMN_Handle, run_ctrls.run_entity_count); run_ctrls.run_entities_are_unfrozen = !msg->freeze_state_is_frozen; { U64 idx = 0; for(CTRL_MachineIDHandlePairNode *n = msg->freeze_state_threads.first; n != 0; n = n->next) { - run_ctrls.run_entities[idx] = ctrl_demon_handle_from_ctrl(n->v.handle); + run_ctrls.run_entities[idx] = n->v.handle; idx += 1; } } @@ -2721,61 +2858,61 @@ ctrl_thread__run(CTRL_Msg *msg) ////////////////////////// //- rjf: get next event // - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, run_spoof); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, run_spoof); ////////////////////////// //- rjf: determine event handling // B32 hard_stop = 0; - CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind); + CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); B32 use_stepping_logic = 0; switch(event->kind) { default:{}break; - case DEMON_EventKind_Error: - case DEMON_EventKind_Halt: - case DEMON_EventKind_SingleStep: - case DEMON_EventKind_Trap: + case DMN_EventKind_Error: + case DMN_EventKind_Halt: + case DMN_EventKind_SingleStep: + case DMN_EventKind_Trap: { hard_stop = 1; }break; - case DEMON_EventKind_Exception: - case DEMON_EventKind_Breakpoint: + case DMN_EventKind_Exception: + case DMN_EventKind_Breakpoint: { use_stepping_logic = 1; }break; - case DEMON_EventKind_CreateProcess: + case DMN_EventKind_CreateProcess: { - DEMON_TrapChunkList new_traps = {0}; + DMN_TrapChunkList new_traps = {0}; ctrl_append_resolved_process_user_bp_traps(scratch.arena, event->process, &msg->user_bps, &new_traps); - demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); }break; - case DEMON_EventKind_LoadModule: + case DMN_EventKind_LoadModule: { - DEMON_TrapChunkList new_traps = {0}; + DMN_TrapChunkList new_traps = {0}; ctrl_append_resolved_module_user_bp_traps(scratch.arena, event->process, event->module, &msg->user_bps, &new_traps); - demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); - demon_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); }break; } ////////////////////////// //- rjf: unpack info about thread attached to event // - Architecture arch = demon_arch_from_object(event->thread); + Architecture arch = dmn_arch_from_object(event->thread); U64 reg_size = regs_block_size_from_architecture(arch); - void *thread_regs_block = demon_read_regs(event->thread); + void *thread_regs_block = dmn_read_regs(event->thread); U64 thread_rip_vaddr = regs_rip_from_arch_block(arch, thread_regs_block); - DEMON_Handle module = 0; + DMN_Handle module = {0}; U64 thread_rip_voff = 0; { Temp temp = temp_begin(scratch.arena); - DEMON_HandleArray modules = demon_modules_from_process(temp.arena, event->process); + DMN_HandleArray modules = dmn_modules_from_process(temp.arena, event->process); if(modules.count != 0) { for(U64 idx = 0; idx < modules.count; idx += 1) { - Rng1U64 vaddr_range = demon_vaddr_range_from_module(modules.handles[idx]); + Rng1U64 vaddr_range = dmn_vaddr_range_from_module(modules.handles[idx]); if(contains_1u64(vaddr_range, thread_rip_vaddr)) { module = modules.handles[idx]; @@ -2799,12 +2936,12 @@ ctrl_thread__run(CTRL_Msg *msg) B32 exception_stop = 0; if(use_stepping_logic) { - if(event->kind == DEMON_EventKind_Exception) + if(event->kind == DMN_EventKind_Exception) { // rjf: spoof check if(spoof_mode && - target_process == event->process && - target_thread == event->thread && + dmn_handle_match(target_process, event->process) && + dmn_handle_match(target_thread, event->thread) && spoof.new_ip_value == event->instruction_pointer) { hit_spoof = 1; @@ -2837,21 +2974,21 @@ ctrl_thread__run(CTRL_Msg *msg) CTRL_TrapFlags hit_trap_flags = 0; if(use_stepping_logic) { - if(event->kind == DEMON_EventKind_Breakpoint) + if(event->kind == DMN_EventKind_Breakpoint) { Temp temp = temp_begin(scratch.arena); String8List conditions = {0}; // rjf: user breakpoints - for(DEMON_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) + for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) { - DEMON_Trap *trap = n->v; - DEMON_Trap *opl = n->v + n->count; + DMN_Trap *trap = n->v; + DMN_Trap *opl = n->v + n->count; for(;trap < opl; trap += 1) { - if(trap->process == event->process && - trap->address == event->instruction_pointer && - (event->thread != target_thread || !target_thread_is_on_user_bp_and_trap_net_trap)) + if(dmn_handle_match(trap->process, event->process) && + trap->vaddr == event->instruction_pointer && + (!dmn_handle_match(event->thread, target_thread) || !target_thread_is_on_user_bp_and_trap_net_trap)) { CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)trap->id; hit_user_bp = 1; @@ -2866,7 +3003,7 @@ ctrl_thread__run(CTRL_Msg *msg) // rjf: evaluate hit stop conditions if(conditions.node_count != 0) { - String8 exe_path = demon_full_path_from_module(temp.arena, module); + String8 exe_path = dmn_full_path_from_module(temp.arena, module); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) @@ -2906,10 +3043,10 @@ ctrl_thread__run(CTRL_Msg *msg) EVAL_Result eval = {0}; if(bytecode.size != 0) { - U64 module_base = demon_base_vaddr_from_module(module); + U64 module_base = dmn_base_vaddr_from_module(module); U64 tls_base = 0; // TODO(rjf) EVAL_Machine machine = {0}; - machine.u = (void *)event->process; + machine.u = &event->process; machine.arch = arch; machine.memory_read = ctrl_eval_memory_read; machine.reg_data = thread_regs_block; @@ -2933,7 +3070,7 @@ ctrl_thread__run(CTRL_Msg *msg) } // rjf: gather trap net hits - if(!hit_user_bp && event->process == target_process) + if(!hit_user_bp && dmn_handle_match(event->process, target_process)) { for(CTRL_TrapNode *node = msg->traps.first; node != 0; @@ -2956,28 +3093,28 @@ ctrl_thread__run(CTRL_Msg *msg) CTRL_EventCause cond_bp_single_step_stop_cause = CTRL_EventCause_Null; if(hit_conditional_bp_but_filtered) { - DEMON_RunCtrls single_step_ctrls = {0}; + DMN_RunCtrls single_step_ctrls = {0}; single_step_ctrls.single_step_thread = event->thread; for(B32 single_step_done = 0; single_step_done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &single_step_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &single_step_ctrls, 0); switch(event->kind) { default:{}break; - case DEMON_EventKind_Error: - case DEMON_EventKind_Exception: - case DEMON_EventKind_Halt: - case DEMON_EventKind_Trap: + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: { cond_bp_single_step_stop = 1; single_step_done = 1; use_stepping_logic = 0; - cond_bp_single_step_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind); + cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); }break; - case DEMON_EventKind_SingleStep: + case DMN_EventKind_SingleStep: { single_step_done = 1; - cond_bp_single_step_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind); + cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); }break; } } @@ -2995,7 +3132,7 @@ ctrl_thread__run(CTRL_Msg *msg) B32 step_past_trap_net = 0; if(use_stepping_logic && hit_trap_net_bp) { - if(event->thread != target_thread) + if(!dmn_handle_match(event->thread, target_thread)) { step_past_trap_net = 1; use_stepping_logic = 0; @@ -3006,7 +3143,7 @@ ctrl_thread__run(CTRL_Msg *msg) B32 use_trap_net_logic = 0; if(use_stepping_logic && hit_trap_net_bp) { - if(event->thread == target_thread) + if(dmn_handle_match(event->thread, target_thread)) { use_trap_net_logic = 1; } @@ -3016,7 +3153,7 @@ ctrl_thread__run(CTRL_Msg *msg) B32 stack_pointer_matches = 0; if(use_trap_net_logic) { - U64 sp = demon_read_sp(target_thread); + U64 sp = dmn_read_sp(target_thread); stack_pointer_matches = (sp == sp_check_value); } @@ -3027,29 +3164,29 @@ ctrl_thread__run(CTRL_Msg *msg) { if(hit_trap_flags & CTRL_TrapFlag_SingleStepAfterHit) { - DEMON_RunCtrls single_step_ctrls = {0}; + DMN_RunCtrls single_step_ctrls = {0}; single_step_ctrls.single_step_thread = target_thread; for(B32 single_step_done = 0; single_step_done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &single_step_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &single_step_ctrls, 0); switch(event->kind) { default:{}break; - case DEMON_EventKind_Error: - case DEMON_EventKind_Exception: - case DEMON_EventKind_Halt: - case DEMON_EventKind_Trap: + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: { single_step_stop = 1; single_step_done = 1; use_stepping_logic = 0; use_trap_net_logic = 0; - single_step_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind); + single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); }break; - case DEMON_EventKind_SingleStep: + case DMN_EventKind_SingleStep: { single_step_done = 1; - single_step_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind); + single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); }break; } } @@ -3064,10 +3201,10 @@ ctrl_thread__run(CTRL_Msg *msg) { // rjf: setup spoof mode begin_spoof_mode = 1; - U64 spoof_sp = demon_read_sp(target_thread); + U64 spoof_sp = dmn_read_sp(target_thread); spoof_mode = 1; - spoof.process = ctrl_handle_from_demon(target_process); - spoof.thread = ctrl_handle_from_demon(target_thread); + spoof.process = target_process; + spoof.thread = target_thread; spoof.vaddr = spoof_sp; spoof.new_ip_value = spoof_ip_vaddr; } @@ -3082,7 +3219,7 @@ ctrl_thread__run(CTRL_Msg *msg) if(stack_pointer_matches) { save_stack_pointer = 1; - sp_check_value = demon_read_sp(target_thread); + sp_check_value = dmn_read_sp(target_thread); } } } @@ -3112,27 +3249,27 @@ ctrl_thread__run(CTRL_Msg *msg) CTRL_EventCause step_past_trap_net_stop_cause = CTRL_EventCause_Null; if(step_past_trap_net) { - DEMON_RunCtrls single_step_ctrls = {0}; + DMN_RunCtrls single_step_ctrls = {0}; single_step_ctrls.single_step_thread = event->thread; for(B32 single_step_done = 0; single_step_done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &single_step_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &single_step_ctrls, 0); switch(event->kind) { default:{}break; - case DEMON_EventKind_Error: - case DEMON_EventKind_Exception: - case DEMON_EventKind_Halt: - case DEMON_EventKind_Trap: + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: { step_past_trap_net_stop = 1; single_step_done = 1; - step_past_trap_net_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind); + step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); }break; - case DEMON_EventKind_SingleStep: + case DMN_EventKind_SingleStep: { single_step_done = 1; - step_past_trap_net_stop_cause = ctrl_event_cause_from_demon_event_kind(event->kind); + step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); }break; } } @@ -3186,9 +3323,9 @@ ctrl_thread__run(CTRL_Msg *msg) CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); event->kind = CTRL_EventKind_Stopped; event->cause = stop_cause; - event->machine_id = CTRL_MachineID_Client; - event->entity = ctrl_handle_from_demon(stop_event->thread); - event->parent = ctrl_handle_from_demon(stop_event->process); + event->machine_id = CTRL_MachineID_Local; + event->entity = stop_event->thread; + event->parent = stop_event->process; event->exception_code = stop_event->code; event->vaddr_rng = r1u64(stop_event->address, stop_event->address); event->rip_vaddr = stop_event->instruction_pointer; @@ -3216,23 +3353,23 @@ ctrl_thread__single_step(CTRL_Msg *msg) } //- rjf: single step - DEMON_Event *stop_event = 0; + DMN_Event *stop_event = 0; CTRL_EventCause stop_cause = CTRL_EventCause_Null; { - DEMON_RunCtrls run_ctrls = {0}; - run_ctrls.single_step_thread = ctrl_demon_handle_from_ctrl(msg->entity); + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.single_step_thread = msg->entity; for(B32 done = 0; done == 0;) { - DEMON_Event *event = ctrl_thread__next_demon_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; - case DEMON_EventKind_Error: {stop_cause = CTRL_EventCause_Error;}goto end_single_step; - case DEMON_EventKind_Exception: {stop_cause = CTRL_EventCause_InterruptedByException;}goto end_single_step; - case DEMON_EventKind_Halt: {stop_cause = CTRL_EventCause_InterruptedByHalt;}goto end_single_step; - case DEMON_EventKind_Trap: {stop_cause = CTRL_EventCause_InterruptedByTrap;}goto end_single_step; - case DEMON_EventKind_SingleStep: {stop_cause = CTRL_EventCause_Finished;}goto end_single_step; - case DEMON_EventKind_Breakpoint: {stop_cause = CTRL_EventCause_UserBreakpoint;}goto end_single_step; + case DMN_EventKind_Error: {stop_cause = CTRL_EventCause_Error;}goto end_single_step; + case DMN_EventKind_Exception: {stop_cause = CTRL_EventCause_InterruptedByException;}goto end_single_step; + case DMN_EventKind_Halt: {stop_cause = CTRL_EventCause_InterruptedByHalt;}goto end_single_step; + case DMN_EventKind_Trap: {stop_cause = CTRL_EventCause_InterruptedByTrap;}goto end_single_step; + case DMN_EventKind_SingleStep: {stop_cause = CTRL_EventCause_Finished;}goto end_single_step; + case DMN_EventKind_Breakpoint: {stop_cause = CTRL_EventCause_UserBreakpoint;}goto end_single_step; end_single_step: { stop_event = event; @@ -3249,9 +3386,9 @@ ctrl_thread__single_step(CTRL_Msg *msg) CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); event->kind = CTRL_EventKind_Stopped; event->cause = stop_cause; - event->machine_id = CTRL_MachineID_Client; - event->entity = ctrl_handle_from_demon(stop_event->thread); - event->parent = ctrl_handle_from_demon(stop_event->process); + event->machine_id = CTRL_MachineID_Local; + event->entity = stop_event->thread; + event->parent = stop_event->process; event->exception_code = stop_event->code; event->vaddr_rng = r1u64(stop_event->address, stop_event->address); event->rip_vaddr = stop_event->instruction_pointer; @@ -3276,7 +3413,7 @@ ctrl_mem_stream_thread__entry_point(void *p) { //- rjf: unpack next request CTRL_MachineID machine_id = 0; - CTRL_Handle process = {0}; + DMN_Handle process = {0}; Rng1U64 vaddr_range = {0}; B32 zero_terminated = 0; ctrl_u2ms_dequeue_req(&machine_id, &process, &vaddr_range, &zero_terminated); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index f507548d..840cef5c 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -10,16 +10,7 @@ typedef U64 CTRL_MsgID; typedef U64 CTRL_MachineID; -#define CTRL_MachineID_Client (1) - -//////////////////////////////// -//~ rjf: Handle Type - -typedef struct CTRL_Handle CTRL_Handle; -struct CTRL_Handle -{ - U64 u64[1]; -}; +#define CTRL_MachineID_Local (1) //////////////////////////////// //~ rjf: Machine/Handle Pair Types @@ -28,7 +19,7 @@ typedef struct CTRL_MachineIDHandlePair CTRL_MachineIDHandlePair; struct CTRL_MachineIDHandlePair { CTRL_MachineID machine_id; - CTRL_Handle handle; + DMN_Handle handle; }; typedef struct CTRL_MachineIDHandlePairNode CTRL_MachineIDHandlePairNode; @@ -46,6 +37,52 @@ struct CTRL_MachineIDHandlePairList U64 count; }; +//////////////////////////////// +//~ rjf: Entity Types + +typedef enum CTRL_EntityKind +{ + CTRL_EntityKind_Null, + CTRL_EntityKind_Root, + CTRL_EntityKind_Machine, + CTRL_EntityKind_Process, + CTRL_EntityKind_Thread, + CTRL_EntityKind_Module, + CTRL_EntityKind_COUNT +} +CTRL_EntityKind; + +typedef struct CTRL_Entity CTRL_Entity; +struct CTRL_Entity +{ + CTRL_Entity *first; + CTRL_Entity *last; + CTRL_Entity *next; + CTRL_Entity *prev; + CTRL_Entity *parent; + CTRL_EntityKind kind; + Architecture arch; + CTRL_MachineID machine_id; + DMN_Handle handle; + Rng1U64 vaddr_range; + String8 name; +}; + +typedef struct CTRL_EntityHashNode CTRL_EntityHashNode; +struct CTRL_EntityHashNode +{ + CTRL_EntityHashNode *next; + CTRL_EntityHashNode *prev; + CTRL_Entity *entity; +}; + +typedef struct CTRL_EntityHashSlot CTRL_EntityHashSlot; +struct CTRL_EntityHashSlot +{ + CTRL_EntityHashNode *first; + CTRL_EntityHashNode *last; +}; + //////////////////////////////// //~ rjf: Unwind Types @@ -105,8 +142,8 @@ struct CTRL_TrapList typedef struct CTRL_Spoof CTRL_Spoof; struct CTRL_Spoof { - CTRL_Handle process; - CTRL_Handle thread; + DMN_Handle process; + DMN_Handle thread; U64 vaddr; U64 new_ip_value; }; @@ -177,8 +214,8 @@ struct CTRL_Msg CTRL_MsgKind kind; CTRL_MsgID msg_id; CTRL_MachineID machine_id; - CTRL_Handle entity; - CTRL_Handle parent; + DMN_Handle entity; + DMN_Handle parent; U32 entity_id; U32 exit_code; B32 env_inherit; @@ -281,8 +318,8 @@ struct CTRL_Event CTRL_ExceptionKind exception_kind; CTRL_MsgID msg_id; CTRL_MachineID machine_id; - CTRL_Handle entity; - CTRL_Handle parent; + DMN_Handle entity; + DMN_Handle parent; Architecture arch; U64 u64_code; U32 entity_id; @@ -338,7 +375,7 @@ struct CTRL_ProcessMemoryCacheNode CTRL_ProcessMemoryCacheNode *prev; Arena *arena; CTRL_MachineID machine_id; - CTRL_Handle process; + DMN_Handle process; U64 range_hash_slots_count; CTRL_ProcessMemoryRangeHashSlot *range_hash_slots; }; @@ -374,6 +411,42 @@ struct CTRL_ProcessMemorySlice U64 *byte_changed_flags; }; +//////////////////////////////// +//~ rjf: Thread Register Cache Types + +typedef struct CTRL_ThreadRegCacheNode CTRL_ThreadRegCacheNode; +struct CTRL_ThreadRegCacheNode +{ + CTRL_ThreadRegCacheNode *next; + CTRL_ThreadRegCacheNode *prev; + CTRL_MachineID machine_id; + DMN_Handle thread; + U128 regs_hash; +}; + +typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; +struct CTRL_ThreadRegCacheSlot +{ + CTRL_ThreadRegCacheNode *first; + CTRL_ThreadRegCacheNode *last; +}; + +typedef struct CTRL_ThreadRegCacheStripe CTRL_ThreadRegCacheStripe; +struct CTRL_ThreadRegCacheStripe +{ + Arena *arena; + OS_Handle rw_mutex; +}; + +typedef struct CTRL_ThreadRegCache CTRL_ThreadRegCache; +struct CTRL_ThreadRegCache +{ + U64 slots_count; + CTRL_ThreadRegCacheSlot *slots; + U64 stripes_count; + CTRL_ThreadRegCacheStripe *stripes; +}; + //////////////////////////////// //~ rjf: Wakeup Hook Function Types @@ -396,8 +469,9 @@ struct CTRL_State EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT]; EVAL_String2NumMap arch_string2alias_tables[Architecture_COUNT]; - // rjf: process memory cache + // rjf: caches CTRL_ProcessMemoryCache process_memory_cache; + CTRL_ThreadRegCache thread_reg_cache; // rjf: user -> ctrl msg ring buffer U64 u2c_ring_size; @@ -417,10 +491,16 @@ struct CTRL_State // rjf: ctrl thread state OS_Handle ctrl_thread; - Arena *demon_event_arena; - DEMON_EventNode *first_demon_event_node; - DEMON_EventNode *last_demon_event_node; - DEMON_EventNode *free_demon_event_node; + Arena *ctrl_entity_arena; + CTRL_Entity *ctrl_entity_root; + CTRL_Entity *ctrl_entity_free; + CTRL_EntityHashSlot *ctrl_entity_hash_slots; + CTRL_EntityHashNode *ctrl_entity_hash_node_free; + U64 ctrl_entity_hash_slots_count; + Arena *dmn_event_arena; + DMN_EventNode *first_dmn_event_node; + DMN_EventNode *last_dmn_event_node; + DMN_EventNode *free_dmn_event_node; Arena *user_entry_point_arena; String8List user_entry_points; U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; @@ -443,29 +523,22 @@ struct CTRL_State //~ rjf: Globals global CTRL_State *ctrl_state = 0; - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void ctrl_init(void); - -//////////////////////////////// -//~ rjf: Wakeup Callback Registration - -internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); +read_only global CTRL_Entity ctrl_entity_nil = +{ + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, +}; //////////////////////////////// //~ rjf: Basic Type Functions internal U64 ctrl_hash_from_string(String8 string); -internal CTRL_EventCause ctrl_event_cause_from_demon_event_kind(DEMON_EventKind event_kind); -internal B32 ctrl_handle_match(CTRL_Handle a, CTRL_Handle b); - -//////////////////////////////// -//~ rjf: Ctrl <-> Demon Handle Translation Functions - -internal DEMON_Handle ctrl_demon_handle_from_ctrl(CTRL_Handle h); -internal CTRL_Handle ctrl_handle_from_demon(DEMON_Handle h); +internal U64 ctrl_hash_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle); +internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); +internal B32 ctrl_handle_match(DMN_Handle a, DMN_Handle b); //////////////////////////////// //~ rjf: Machine/Handle Pair Type Functions @@ -484,8 +557,8 @@ internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src); internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp); internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src); -internal void ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DEMON_Handle module, CTRL_UserBreakpointList *user_bps, DEMON_TrapChunkList *traps_out); -internal void ctrl_append_resolved_process_user_bp_traps(Arena *arena, DEMON_Handle process, CTRL_UserBreakpointList *user_bps, DEMON_TrapChunkList *traps_out); +internal void ctrl_append_resolved_module_user_bp_traps(Arena *arena, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_append_resolved_process_user_bp_traps(Arena *arena, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); //////////////////////////////// //~ rjf: Message Type Functions @@ -512,80 +585,82 @@ internal String8 ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *eve internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); //////////////////////////////// -//~ rjf: Shared Functions +//~ rjf: Main Layer Initialization -//- rjf: run index +internal void ctrl_init(void); + +//////////////////////////////// +//~ rjf: Wakeup Callback Registration + +internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); + +//////////////////////////////// +//~ rjf: Process Memory Functions + +//- rjf: process memory cache interaction +internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated); +internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, U64 endt_us); + +//- rjf: process memory cache reading helpers +internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, U64 endt_us); +internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 endt_us); + +//- rjf: process memory writing +internal B32 ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *src); + +//////////////////////////////// +//~ rjf: Thread Register Functions + +//- rjf: thread register cache reading +internal void *ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us); +internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); + +//- rjf: thread register writing +internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block); + +//////////////////////////////// +//~ rjf: Unwinding Functions + +internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread); + +//////////////////////////////// +//~ rjf: Halting All Attached Processes + +internal void ctrl_halt(void); + +//////////////////////////////// +//~ rjf: Shared Accessor Functions + +//- rjf: run indices internal U64 ctrl_run_idx(void); internal U64 ctrl_memgen_idx(void); internal U64 ctrl_reggen_idx(void); -//- rjf: halt everything -internal void ctrl_halt(void); - -//- rjf: exe -> dbg path mapping -internal String8 ctrl_inferred_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path); -internal String8 ctrl_forced_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path); -internal String8 ctrl_natural_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path); -internal String8 ctrl_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path); - -//- rjf: handle -> arch -internal Architecture ctrl_arch_from_handle(CTRL_MachineID machine, CTRL_Handle handle); - -//- rjf: process memory reading/writing -internal U64 ctrl_process_read(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *dst); -internal B32 ctrl_process_write(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *src); - -//- rjf: process memory cache interaction -internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated); -internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated, U64 endt_us); - -//- rjf: process memory cache reading helpers -internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, U64 endt_us); -internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us); - -//- rjf: register reading/writing -internal void *ctrl_reg_block_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread); -internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, CTRL_Handle thread, void *block); -internal U64 ctrl_rip_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread); -internal B32 ctrl_thread_write_rip(CTRL_MachineID machine_id, CTRL_Handle thread, U64 rip); -internal U64 ctrl_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread); - -//- rjf: process * vaddr -> module -internal CTRL_Handle ctrl_module_from_process_vaddr(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr); - -//- rjf: unwinding -internal CTRL_Unwind ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, CTRL_Handle thread); - //- rjf: name -> register/alias hash tables, for eval internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); internal EVAL_String2NumMap *ctrl_string2alias_from_arch(Architecture arch); //////////////////////////////// -//~ rjf: User -> Ctrl Communication +//~ rjf: Control-Thread Functions +//- rjf: user -> control thread communication internal B32 ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us); internal CTRL_MsgList ctrl_u2c_pop_msgs(Arena *arena); -//////////////////////////////// -//~ rjf: Ctrl -> User Communication - +//- rjf: control -> user thread communication internal void ctrl_c2u_push_events(CTRL_EventList *events); internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); -//////////////////////////////// -//~ rjf: User -> Memory Stream Communication - -internal B32 ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us); -internal void ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, CTRL_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated); - -//////////////////////////////// -//~ rjf: Control-Thread-Only Functions +//- rjf: entity tree construction +internal CTRL_Entity *ctrl_thread__entity_alloc(CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle); +internal void ctrl_thread__entity_release(CTRL_Entity *entity); +internal CTRL_Entity *ctrl_thread__entity_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle); //- rjf: entry point internal void ctrl_thread__entry_point(void *p); //- rjf: attached process running/event gathering -internal DEMON_Event *ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_ctrls, CTRL_Spoof *spoof); +internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); //- rjf: eval helpers internal B32 ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size); @@ -600,9 +675,13 @@ internal void ctrl_thread__run(CTRL_Msg *msg); internal void ctrl_thread__single_step(CTRL_Msg *msg); //////////////////////////////// -//~ rjf: Memory-Stream-Thread-Only Functions +//~ rjf: Memory-Stream Thread Functions + +//- rjf: user -> memory stream communication +internal B32 ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us); +internal void ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, DMN_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated); //- rjf: entry point internal void ctrl_mem_stream_thread__entry_point(void *p); -#endif //CTRL_CORE_H +#endif // CTRL_CORE_H diff --git a/src/dasm/dasm.c b/src/dasm/dasm.c index 734b35f5..0a0c9855 100644 --- a/src/dasm/dasm.c +++ b/src/dasm/dasm.c @@ -179,7 +179,7 @@ dasm_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_coun //- rjf: opening handles & correllation with module internal DASM_Handle -dasm_handle_from_ctrl_process_range(CTRL_MachineID machine, CTRL_Handle process, Rng1U64 vaddr_range) +dasm_handle_from_ctrl_process_range(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range) { DASM_Handle result = {0}; if(machine != 0 && process.u64[0] != 0) @@ -389,7 +389,7 @@ dasm_decode_thread_entry_point(void *p) //- rjf: request -> ctrl info B32 is_first_to_task = 0; CTRL_MachineID ctrl_machine_id = 0; - CTRL_Handle ctrl_process = {0}; + DMN_Handle ctrl_process = {0}; Rng1U64 vaddr_range = {0}; Architecture arch = Architecture_Null; U64 *bytes_processed_counter = 0; diff --git a/src/dasm/dasm.h b/src/dasm/dasm.h index a49412e0..61200578 100644 --- a/src/dasm/dasm.h +++ b/src/dasm/dasm.h @@ -77,7 +77,7 @@ struct DASM_Entity // rjf: key info CTRL_MachineID machine_id; - CTRL_Handle process; + DMN_Handle process; Rng1U64 vaddr_range; U64 id; @@ -114,7 +114,7 @@ typedef struct DASM_BinaryInfo DASM_BinaryInfo; struct DASM_BinaryInfo { CTRL_MachineID machine_id; - CTRL_Handle process; + DMN_Handle process; Rng1U64 vaddr_range; U64 bytes_processed; U64 bytes_to_process; @@ -187,7 +187,7 @@ internal DASM_InstChunkList dasm_inst_chunk_list_from_arch_addr_data(Arena *aren //~ rjf: Cache Lookups //- rjf: opening handles & correllation with module -internal DASM_Handle dasm_handle_from_ctrl_process_range(CTRL_MachineID machine, CTRL_Handle process, Rng1U64 vaddr_range); +internal DASM_Handle dasm_handle_from_ctrl_process_range(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range); //- rjf: asking for top-level info of a handle internal DASM_BinaryInfo dasm_binary_info_from_handle(Arena *arena, DASM_Handle handle); diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index 0beedca4..5eeacd22 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -182,16 +182,16 @@ internal B32 dmn_detach_process(DMN_Handle process); //~ rjf: @dmn_os_hooks Process/Thread Reads/Writes (Implemented Per-OS) //- rjf: processes -internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); -internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); +internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); +internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); #define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) #define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) //- rjf: threads -internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); -internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); -internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); -internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); +internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); +internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); +internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); +internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); //////////////////////////////// //~ rjf: @dmn_os_hooks System Process Listing (Implemented Per-OS) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 7f48339e..46e3ffac 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -2025,7 +2025,7 @@ df_entity_equip_ctrl_machine_id(DF_Entity *entity, CTRL_MachineID machine_id) } internal void -df_entity_equip_ctrl_handle(DF_Entity *entity, CTRL_Handle handle) +df_entity_equip_ctrl_handle(DF_Entity *entity, DMN_Handle handle) { df_require_entity_nonnil(entity, return); entity->ctrl_handle = handle; @@ -2419,7 +2419,7 @@ df_machine_entity_from_machine_id(CTRL_MachineID machine_id) } internal DF_Entity * -df_entity_from_ctrl_handle(CTRL_MachineID machine_id, CTRL_Handle handle) +df_entity_from_ctrl_handle(CTRL_MachineID machine_id, DMN_Handle handle) { DF_Entity *result = &df_g_nil_entity; if(handle.u64[0] != 0) @@ -6417,7 +6417,7 @@ df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) // rjf: set up initial entities { DF_Entity *local_machine = df_entity_alloc(0, df_state->entities_root, DF_EntityKind_Machine); - df_entity_equip_ctrl_machine_id(local_machine, CTRL_MachineID_Client); + df_entity_equip_ctrl_machine_id(local_machine, CTRL_MachineID_Local); df_entity_equip_name(0, local_machine, str8_lit("This PC")); } @@ -7512,7 +7512,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) }break; case DF_CoreCmdKind_FreezeLocalMachine: { - CTRL_MachineID machine_id = CTRL_MachineID_Client; + CTRL_MachineID machine_id = CTRL_MachineID_Local; DF_CmdParams params = df_cmd_params_zero(); params.entity = df_handle_from_entity(df_machine_entity_from_machine_id(machine_id)); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); @@ -7520,7 +7520,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) }break; case DF_CoreCmdKind_ThawLocalMachine: { - CTRL_MachineID machine_id = CTRL_MachineID_Client; + CTRL_MachineID machine_id = CTRL_MachineID_Local; DF_CmdParams params = df_cmd_params_zero(); params.entity = df_handle_from_entity(df_machine_entity_from_machine_id(machine_id)); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index df3e866d..5edc70ae 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -447,7 +447,7 @@ struct DF_Entity // rjf: ctrl entity equipment CTRL_MachineID ctrl_machine_id; - CTRL_Handle ctrl_handle; + DMN_Handle ctrl_handle; Architecture arch; U32 ctrl_id; U64 stack_base; @@ -1447,7 +1447,7 @@ internal void df_entity_equip_cfg_src(DF_Entity *entity, DF_CfgSrc cfg_src); //- rjf: control layer correllation equipment internal void df_entity_equip_ctrl_machine_id(DF_Entity *entity, CTRL_MachineID machine_id); -internal void df_entity_equip_ctrl_handle(DF_Entity *entity, CTRL_Handle handle); +internal void df_entity_equip_ctrl_handle(DF_Entity *entity, DMN_Handle handle); internal void df_entity_equip_arch(DF_Entity *entity, Architecture arch); internal void df_entity_equip_ctrl_id(DF_Entity *entity, U32 id); internal void df_entity_equip_stack_base(DF_Entity *entity, U64 stack_base); @@ -1468,7 +1468,7 @@ internal DF_Entity *df_entity_root(void); internal DF_EntityList df_push_entity_list_with_kind(Arena *arena, DF_EntityKind kind); internal DF_Entity *df_entity_from_id(DF_EntityID id); internal DF_Entity *df_machine_entity_from_machine_id(CTRL_MachineID machine_id); -internal DF_Entity *df_entity_from_ctrl_handle(CTRL_MachineID machine_id, CTRL_Handle handle); +internal DF_Entity *df_entity_from_ctrl_handle(CTRL_MachineID machine_id, DMN_Handle handle); internal DF_Entity *df_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id); internal DF_Entity *df_entity_from_name_and_kind(String8 string, DF_EntityKind kind); internal DF_Entity *df_entity_from_u64_and_kind(U64 u64, DF_EntityKind kind); diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 02e32ecf..d21ad724 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -46,7 +46,7 @@ #include "demon2/demon2_inc.h" #include "eval/eval_inc.h" #include "unwind/unwind.h" -#include "ctrl2/ctrl2_inc.h" +#include "ctrl/ctrl_inc.h" //- rjf: [c] #include "base/base_inc.c" @@ -74,7 +74,7 @@ #include "demon2/demon2_inc.c" #include "eval/eval_inc.c" #include "unwind/unwind.c" -#include "ctrl2/ctrl2_inc.c" +#include "ctrl/ctrl_inc.c" //////////////////////////////// //~ rjf: Entry Point From 90d9f3b7c287b97c910d9627b6f0c05547a4fad7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 09:05:00 -0700 Subject: [PATCH 170/275] fix task entry points in breakpad converter --- .../raddbgi_breakpad_from_pdb_main.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c b/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c index 35312932..491baf79 100644 --- a/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c +++ b/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c @@ -61,8 +61,7 @@ struct P2B_BakeUnitVMapOut RDI_U64 vmap_entries_count; }; -internal void * -p2b_bake_unit_vmap_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2b_bake_unit_vmap_task__entry_point) { P2B_BakeUnitVMapIn *in = (P2B_BakeUnitVMapIn *)p; P2B_BakeUnitVMapOut *out = push_array(arena, P2B_BakeUnitVMapOut, 1); @@ -100,8 +99,7 @@ struct P2B_BakeUnitOut RDI_Line *unit_lines; }; -internal void * -p2b_bake_unit_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2b_bake_unit_task__entry_point) { P2B_BakeUnitIn *in = (P2B_BakeUnitIn *)p; P2B_BakeUnitOut *out = push_array(arena, P2B_BakeUnitOut, 1); @@ -138,8 +136,7 @@ struct P2B_DumpProcChunkIn RDIM_SymbolChunkNode *chunk; }; -internal void * -p2b_dump_proc_chunk_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2b_dump_proc_chunk_task__entry_point) { P2B_DumpProcChunkIn *in = (P2B_DumpProcChunkIn *)p; String8List *out = push_array(arena, String8List, 1); From 27493017776bf28c508679ed3a5b2c4fbf498875 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 11:41:53 -0700 Subject: [PATCH 171/275] checkpoint - moving ctrl mostly over to demon2; sketching out a few missing cache pieces --- src/ctrl/ctrl_core.c | 1335 ++++++++++++-------------- src/ctrl/ctrl_core.h | 29 +- src/demon2/demon2_core.h | 1 + src/demon2/win32/demon2_core_win32.c | 9 + 4 files changed, 660 insertions(+), 714 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 36e00aaa..cd951f07 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -6,92 +6,6 @@ #include "generated/ctrl.meta.c" -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -ctrl_init(void) -{ - Arena *arena = arena_alloc(); - ctrl_state = push_array(arena, CTRL_State, 1); - ctrl_state->arena = arena; - for(Architecture arch = (Architecture)0; arch < Architecture_COUNT; arch = (Architecture)(arch+1)) - { - String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); - U64 reg_count = regs_reg_code_count_from_architecture(arch); - String8 *alias_names = regs_alias_code_string_table_from_architecture(arch); - U64 alias_count = regs_alias_code_count_from_architecture(arch); - ctrl_state->arch_string2reg_tables[arch] = eval_string2num_map_make(ctrl_state->arena, 256); - ctrl_state->arch_string2alias_tables[arch] = eval_string2num_map_make(ctrl_state->arena, 256); - for(U64 idx = 1; idx < reg_count; idx += 1) - { - eval_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); - } - for(U64 idx = 1; idx < alias_count; idx += 1) - { - eval_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); - } - } - ctrl_state->process_memory_cache.slots_count = 256; - ctrl_state->process_memory_cache.slots = push_array(arena, CTRL_ProcessMemoryCacheSlot, ctrl_state->process_memory_cache.slots_count); - ctrl_state->process_memory_cache.stripes_count = 8; - ctrl_state->process_memory_cache.stripes = push_array(arena, CTRL_ProcessMemoryCacheStripe, ctrl_state->process_memory_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->process_memory_cache.stripes_count; idx += 1) - { - ctrl_state->process_memory_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); - ctrl_state->process_memory_cache.stripes[idx].cv = os_condition_variable_alloc(); - } - ctrl_state->thread_reg_cache.slots_count = 1024; - ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); - ctrl_state->thread_reg_cache.stripes_count = 8; - ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) - { - ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); - ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); - } - ctrl_state->ctrl_entity_arena = arena_alloc(); - ctrl_state->ctrl_entity_hash_slots_count = 4096; - ctrl_state->ctrl_entity_hash_slots = push_array(arena, CTRL_EntityHashSlot, ctrl_state->ctrl_entity_hash_slots_count); - ctrl_state->u2c_ring_size = KB(64); - ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); - ctrl_state->u2c_ring_mutex = os_mutex_alloc(); - ctrl_state->u2c_ring_cv = os_condition_variable_alloc(); - ctrl_state->c2u_ring_size = KB(64); - ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); - ctrl_state->c2u_ring_mutex = os_mutex_alloc(); - ctrl_state->c2u_ring_cv = os_condition_variable_alloc(); - ctrl_state->dmn_event_arena = arena_alloc(); - ctrl_state->user_entry_point_arena = arena_alloc(); - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(ctrl_exception_code_kind_default_enable_table[k]) - { - ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); - } - } - ctrl_state->u2ms_ring_size = KB(64); - ctrl_state->u2ms_ring_base = push_array(arena, U8, ctrl_state->u2ms_ring_size); - ctrl_state->u2ms_ring_mutex = os_mutex_alloc(); - ctrl_state->u2ms_ring_cv = os_condition_variable_alloc(); - ctrl_state->ctrl_thread = os_launch_thread(ctrl_thread__entry_point, 0, 0); - ctrl_state->ms_thread_count = Clamp(1, os_logical_core_count()-1, 4); - ctrl_state->ms_threads = push_array(arena, OS_Handle, ctrl_state->ms_thread_count); - for(U64 idx = 0; idx < ctrl_state->ms_thread_count; idx += 1) - { - ctrl_state->ms_threads[idx] = os_launch_thread(ctrl_mem_stream_thread__entry_point, (void *)idx, 0); - } -} - -//////////////////////////////// -//~ rjf: Wakeup Callback Registration - -internal void -ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) -{ - ctrl_state->wakeup_hook = wakeup_hook; -} - //////////////////////////////// //~ rjf: Basic Type Functions @@ -208,120 +122,6 @@ ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src) return dst; } -internal void -ctrl_append_resolved_module_user_bp_traps(Arena *arena, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) -{ - Temp scratch = scratch_begin(&arena, 1); - DBGI_Scope *scope = dbgi_scope_open(); - String8 exe_path = dmn_full_path_from_module(scratch.arena, module); - DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RDI_Parsed *rdi = &dbgi->rdi; - U64 base_vaddr = dmn_base_vaddr_from_module(module); - for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) - { - CTRL_UserBreakpoint *bp = &n->v; - switch(bp->kind) - { - default:{}break; - - //- rjf: file:line-based breakpoints - case CTRL_UserBreakpointKind_FileNameAndLineColNumber: - { - // rjf: unpack & normalize - TxtPt pt = bp->pt; - String8 filename = bp->string; - String8 filename_normalized = push_str8_copy(scratch.arena, filename); - for(U64 idx = 0; idx < filename_normalized.size; idx += 1) - { - filename_normalized.str[idx] = char_to_lower(filename_normalized.str[idx]); - filename_normalized.str[idx] = char_to_correct_slash(filename_normalized.str[idx]); - } - - // rjf: filename -> src_id - U32 src_id = 0; - { - RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_NormalSourcePaths); - if(mapptr != 0) - { - RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - src_id = ids[0]; - } - } - } - } - - // rjf: src_id * pt -> push - { - RDI_SourceFile *src = rdi_element_from_idx(rdi, source_files, src_id); - RDI_ParsedLineMap line_map = {0}; - rdi_line_map_from_source_file(rdi, src, &line_map); - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); - for(U32 i = 0; i < voff_count; i += 1) - { - U64 vaddr = voffs[i] + base_vaddr; - DMN_Trap trap = {process, vaddr, (U64)bp}; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } - }break; - - //- rjf: symbol:voff-based breakpoints - case CTRL_UserBreakpointKind_SymbolNameAndOffset: - { - String8 symbol_name = bp->string; - U64 voff = bp->u64; - if(rdi != 0 && rdi->procedures != 0) - { - RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); - if(mapptr != 0) - { - RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, symbol_name.str, symbol_name.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - for(U32 match_i = 0; match_i < id_count; match_i += 1) - { - U64 proc_voff = rdi_first_voff_from_proc(rdi, ids[match_i]); - U64 proc_vaddr = proc_voff + base_vaddr; - DMN_Trap trap = {process, proc_vaddr + voff, (U64)bp}; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } - } - } - }break; - } - } - dbgi_scope_close(scope); - scratch_end(scratch); -} - -internal void -ctrl_append_resolved_process_user_bp_traps(Arena *arena, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) -{ - for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) - { - CTRL_UserBreakpoint *bp = &n->v; - if(bp->kind == CTRL_UserBreakpointKind_VirtualAddress) - { - DMN_Trap trap = {process, bp->u64, (U64)bp}; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } -} - //////////////////////////////// //~ rjf: Message Type Functions @@ -661,182 +461,96 @@ ctrl_event_from_serialized_string(Arena *arena, String8 string) } //////////////////////////////// -//~ rjf: Shared Functions - -//- rjf: run index - -internal U64 -ctrl_run_idx(void) -{ - U64 result = ins_atomic_u64_eval(&ctrl_state->run_idx); - return result; -} - -internal U64 -ctrl_memgen_idx(void) -{ - U64 result = ins_atomic_u64_eval(&ctrl_state->memgen_idx); - return result; -} - -internal U64 -ctrl_reggen_idx(void) -{ - U64 result = ins_atomic_u64_eval(&ctrl_state->reggen_idx); - return result; -} - -//- rjf: halt everything +//~ rjf: Main Layer Initialization internal void -ctrl_halt(void) +ctrl_init(void) { - dmn_halt(0, 0); -} - -//- rjf: exe -> dbg path mapping - -internal String8 -ctrl_inferred_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 result = {0}; + Arena *arena = arena_alloc(); + ctrl_state = push_array(arena, CTRL_State, 1); + ctrl_state->arena = arena; + for(Architecture arch = (Architecture)0; arch < Architecture_COUNT; arch = (Architecture)(arch+1)) { - // TODO(rjf): do preliminary header parse of EXE if possible, look for connected debug info path - } - scratch_end(scratch); - return result; -} - -internal String8 -ctrl_forced_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path) -{ - String8 result = {0}; - // TODO(rjf) - return result; -} - -internal String8 -ctrl_natural_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path) -{ - String8 exe_extension = str8_skip_last_dot(exe_path); - String8 dbg_extension = {0}; - if(str8_match(exe_extension, str8_lit("exe"), 0)) {dbg_extension = str8_lit("pdb");} - if(str8_match(exe_extension, str8_lit("elf"), 0)) {dbg_extension = str8_lit("debug");} - String8 result = {0}; - if(dbg_extension.size != 0) - { - result = push_str8f(arena, "%S.%S", str8_chop_last_dot(exe_path), dbg_extension); - } - return result; -} - -internal String8 -ctrl_og_dbg_path_from_exe_path(Arena *arena, String8 exe_path) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 forced_og_dbg_path = ctrl_forced_og_dbg_path_from_exe_path(scratch.arena, exe_path); - String8 inferred_og_dbg_path = ctrl_inferred_og_dbg_path_from_exe_path(scratch.arena, exe_path); - String8 natural_og_dbg_path = ctrl_natural_og_dbg_path_from_exe_path(scratch.arena, exe_path); - String8 og_dbg_path = forced_og_dbg_path.size?forced_og_dbg_path : inferred_og_dbg_path.size?inferred_og_dbg_path : natural_og_dbg_path; - og_dbg_path = push_str8_copy(arena, og_dbg_path); - scratch_end(scratch); - return og_dbg_path; -} - -//- rjf: handle -> arch - -internal Architecture -ctrl_arch_from_handle(CTRL_MachineID machine, DMN_Handle handle) -{ - return dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(handle)); -} - -//- rjf: process memory reading/writing - -internal U64 -ctrl_process_read(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *dst) -{ - U64 actual_bytes_read = dmn_process_read(process, range, dst); - return actual_bytes_read; -} - -internal B32 -ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *src) -{ - ProfBeginFunction(); - B32 result = dmn_process_write(process, range, src); - - //- rjf: success -> increment memgen - if(result) - { - ins_atomic_u64_inc_eval(&ctrl_state->memgen_idx); - } - - //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless - // writes within calling frame's "view" of the memory, at the expense of a small amount of - // time. - if(result) - { - Temp scratch = scratch_begin(0, 0); - U64 endt_us = os_now_microseconds()+5000; - - //- rjf: gather tasks for all affected cached regions - typedef struct Task Task; - struct Task + String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); + U64 reg_count = regs_reg_code_count_from_architecture(arch); + String8 *alias_names = regs_alias_code_string_table_from_architecture(arch); + U64 alias_count = regs_alias_code_count_from_architecture(arch); + ctrl_state->arch_string2reg_tables[arch] = eval_string2num_map_make(ctrl_state->arena, 256); + ctrl_state->arch_string2alias_tables[arch] = eval_string2num_map_make(ctrl_state->arena, 256); + for(U64 idx = 1; idx < reg_count; idx += 1) { - Task *next; - CTRL_MachineID machine_id; - DMN_Handle process; - Rng1U64 range; - }; - Task *first_task = 0; - Task *last_task = 0; - CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; - for(U64 slot_idx = 0; slot_idx < cache->slots_count; slot_idx += 1) - { - U64 stripe_idx = slot_idx%cache->stripes_count; - CTRL_ProcessMemoryCacheSlot *slot = &cache->slots[slot_idx]; - CTRL_ProcessMemoryCacheStripe *stripe = &cache->stripes[stripe_idx]; - OS_MutexScopeW(stripe->rw_mutex) - { - for(CTRL_ProcessMemoryCacheNode *proc_n = slot->first; proc_n != 0; proc_n = proc_n->next) - { - for(U64 range_hash_idx = 0; range_hash_idx < proc_n->range_hash_slots_count; range_hash_idx += 1) - { - CTRL_ProcessMemoryRangeHashSlot *range_slot = &proc_n->range_hash_slots[range_hash_idx]; - for(CTRL_ProcessMemoryRangeHashNode *n = range_slot->first; n != 0; n = n->next) - { - Rng1U64 intersection_w_range = intersect_1u64(range, n->vaddr_range); - if(dim_1u64(intersection_w_range) != 0 && dim_1u64(n->vaddr_range) <= KB(64)) - { - Task *task = push_array(scratch.arena, Task, 1); - task->machine_id = proc_n->machine_id; - task->process = proc_n->process; - task->range = n->vaddr_range; - SLLQueuePush(first_task, last_task, task); - } - } - } - } - } + eval_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); } - - //- rjf: for all tasks, wait for up-to-date results - for(Task *task = first_task; task != 0; task = task->next) + for(U64 idx = 1; idx < alias_count; idx += 1) { - Temp temp = temp_begin(scratch.arena); - ctrl_query_cached_data_from_process_vaddr_range(temp.arena, task->machine_id, task->process, task->range, endt_us); - temp_end(temp); + eval_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); } - - scratch_end(scratch); } - - ProfEnd(); - return result; + ctrl_state->process_memory_cache.slots_count = 256; + ctrl_state->process_memory_cache.slots = push_array(arena, CTRL_ProcessMemoryCacheSlot, ctrl_state->process_memory_cache.slots_count); + ctrl_state->process_memory_cache.stripes_count = 8; + ctrl_state->process_memory_cache.stripes = push_array(arena, CTRL_ProcessMemoryCacheStripe, ctrl_state->process_memory_cache.stripes_count); + for(U64 idx = 0; idx < ctrl_state->process_memory_cache.stripes_count; idx += 1) + { + ctrl_state->process_memory_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); + ctrl_state->process_memory_cache.stripes[idx].cv = os_condition_variable_alloc(); + } + ctrl_state->thread_reg_cache.slots_count = 1024; + ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); + ctrl_state->thread_reg_cache.stripes_count = 8; + ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); + for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) + { + ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); + ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); + } + ctrl_state->entity_rw_mutex = os_rw_mutex_alloc(); + ctrl_state->entity_arena = arena_alloc(); + ctrl_state->entity_root = &ctrl_entity_nil; + ctrl_state->entity_hash_slots_count = 4096; + ctrl_state->entity_hash_slots = push_array(arena, CTRL_EntityHashSlot, ctrl_state->entity_hash_slots_count); + ctrl_state->u2c_ring_size = KB(64); + ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); + ctrl_state->u2c_ring_mutex = os_mutex_alloc(); + ctrl_state->u2c_ring_cv = os_condition_variable_alloc(); + ctrl_state->c2u_ring_size = KB(64); + ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); + ctrl_state->c2u_ring_mutex = os_mutex_alloc(); + ctrl_state->c2u_ring_cv = os_condition_variable_alloc(); + ctrl_state->dmn_event_arena = arena_alloc(); + ctrl_state->user_entry_point_arena = arena_alloc(); + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(ctrl_exception_code_kind_default_enable_table[k]) + { + ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); + } + } + ctrl_state->u2ms_ring_size = KB(64); + ctrl_state->u2ms_ring_base = push_array(arena, U8, ctrl_state->u2ms_ring_size); + ctrl_state->u2ms_ring_mutex = os_mutex_alloc(); + ctrl_state->u2ms_ring_cv = os_condition_variable_alloc(); + ctrl_state->ctrl_thread = os_launch_thread(ctrl_thread__entry_point, 0, 0); + ctrl_state->ms_thread_count = Clamp(1, os_logical_core_count()-1, 4); + ctrl_state->ms_threads = push_array(arena, OS_Handle, ctrl_state->ms_thread_count); + for(U64 idx = 0; idx < ctrl_state->ms_thread_count; idx += 1) + { + ctrl_state->ms_threads[idx] = os_launch_thread(ctrl_mem_stream_thread__entry_point, (void *)idx, 0); + } } +//////////////////////////////// +//~ rjf: Wakeup Callback Registration + +internal void +ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) +{ + ctrl_state->wakeup_hook = wakeup_hook; +} + +//////////////////////////////// +//~ rjf: Process Memory Functions + //- rjf: process memory cache interaction internal U128 @@ -1125,15 +839,115 @@ ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CT return result; } -//- rjf: register reading/writing +//- rjf: process memory writing internal B32 -ctrl_thread_read_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block) +ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *src) { - B32 good = dmn_thread_read_reg_block(thread, block); - return good; + ProfBeginFunction(); + B32 result = dmn_process_write(process, range, src); + + //- rjf: success -> increment memgen + if(result) + { + ins_atomic_u64_inc_eval(&ctrl_state->memgen_idx); + } + + //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless + // writes within calling frame's "view" of the memory, at the expense of a small amount of + // time. + if(result) + { + Temp scratch = scratch_begin(0, 0); + U64 endt_us = os_now_microseconds()+5000; + + //- rjf: gather tasks for all affected cached regions + typedef struct Task Task; + struct Task + { + Task *next; + CTRL_MachineID machine_id; + DMN_Handle process; + Rng1U64 range; + }; + Task *first_task = 0; + Task *last_task = 0; + CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; + for(U64 slot_idx = 0; slot_idx < cache->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%cache->stripes_count; + CTRL_ProcessMemoryCacheSlot *slot = &cache->slots[slot_idx]; + CTRL_ProcessMemoryCacheStripe *stripe = &cache->stripes[stripe_idx]; + OS_MutexScopeW(stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *proc_n = slot->first; proc_n != 0; proc_n = proc_n->next) + { + for(U64 range_hash_idx = 0; range_hash_idx < proc_n->range_hash_slots_count; range_hash_idx += 1) + { + CTRL_ProcessMemoryRangeHashSlot *range_slot = &proc_n->range_hash_slots[range_hash_idx]; + for(CTRL_ProcessMemoryRangeHashNode *n = range_slot->first; n != 0; n = n->next) + { + Rng1U64 intersection_w_range = intersect_1u64(range, n->vaddr_range); + if(dim_1u64(intersection_w_range) != 0 && dim_1u64(n->vaddr_range) <= KB(64)) + { + Task *task = push_array(scratch.arena, Task, 1); + task->machine_id = proc_n->machine_id; + task->process = proc_n->process; + task->range = n->vaddr_range; + SLLQueuePush(first_task, last_task, task); + } + } + } + } + } + } + + //- rjf: for all tasks, wait for up-to-date results + for(Task *task = first_task; task != 0; task = task->next) + { + Temp temp = temp_begin(scratch.arena); + ctrl_query_cached_data_from_process_vaddr_range(temp.arena, task->machine_id, task->process, task->range, endt_us); + temp_end(temp); + } + + scratch_end(scratch); + } + + ProfEnd(); + return result; } +//////////////////////////////// +//~ rjf: Thread Register Functions + +//- rjf: thread register cache reading + +internal void * +ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us) +{ + return 0; +} + +internal U64 +ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) +{ + return 0; +} + +internal U64 +ctrl_query_cached_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) +{ + return 0; +} + +internal U64 +ctrl_query_cached_rsp_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) +{ + return 0; +} + +//- rjf: thread register writing + internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block) { @@ -1142,75 +956,18 @@ ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void * return good; } -internal U64 -ctrl_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) -{ - U64 result = 0; - void *regs = ctrl_reg_block_from_thread(machine_id, thread); - if(regs != 0) - { - Architecture arch = dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(thread)); - result = regs_rip_from_arch_block(arch, regs); - } - return result; -} - -internal B32 -ctrl_thread_write_rip(CTRL_MachineID machine_id, DMN_Handle thread, U64 rip) -{ - B32 result = 0; - void *regs = ctrl_reg_block_from_thread(machine_id, thread); - if(regs != 0) - { - Architecture arch = dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(thread)); - regs_arch_block_write_rip(arch, regs, rip); - ctrl_thread_write_reg_block(machine_id, thread, regs); - result = 1; - } - return result; -} - -internal U64 -ctrl_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) -{ - U64 result = 0; - result = dmn_tls_root_vaddr_from_thread(thread); - return result; -} - -//- rjf: process * vaddr -> module - -internal DMN_Handle -ctrl_module_from_process_vaddr(CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr) -{ - DMN_Handle handle = {0}; - { - Temp scratch = scratch_begin(0, 0); - DMN_HandleArray modules = dmn_modules_from_process(scratch.arena, ctrl_dmn_handle_from_ctrl(process)); - for(U64 idx = 0; idx < modules.count; idx += 1) - { - DMN_Handle m = modules.handles[idx]; - Rng1U64 m_vaddr_rng = dmn_vaddr_range_from_module(m); - if(contains_1u64(m_vaddr_rng, vaddr)) - { - handle = m; - break; - } - } - scratch_end(scratch); - } - return handle; -} - -//- rjf: unwinding +//////////////////////////////// +//~ rjf: Unwinding Functions internal CTRL_Unwind -ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle thread) +ctrl_unwind_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); DBGI_Scope *scope = dbgi_scope_open(); - Architecture arch = dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(thread)); + CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(machine_id, thread); + CTRL_Entity *process_entity = thread_entity->parent; + Architecture arch = thread_entity->arch; U64 arch_reg_block_size = regs_block_size_from_architecture(arch); CTRL_Unwind unwind = {0}; unwind.error = 1; @@ -1220,21 +977,11 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Han case Architecture_x64: { // rjf: grab initial register block - void *regs_block = push_array(scratch.arena, U8, arch_reg_block_size); - B32 regs_block_good = 0; - { - void *regs_raw = ctrl_reg_block_from_thread(machine_id, thread); - if(regs_raw != 0) - { - MemoryCopy(regs_block, regs_raw, arch_reg_block_size); - regs_block_good = 1; - } - } + void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread, endt_us); // rjf: grab initial memory view B32 stack_memview_good = 0; UNW_MemView stack_memview = {0}; - if(regs_block_good) { U64 stack_base_unrounded = dmn_stack_base_vaddr_from_thread(thread); U64 stack_top_unrounded = regs_rsp_from_arch_block(arch, regs_block); @@ -1243,9 +990,8 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Han U64 stack_size = stack_base - stack_top; if(stack_base >= stack_top) { - String8 stack_memory = {0}; - stack_memory.str = push_array_no_zero(scratch.arena, U8, stack_size); - stack_memory.size = ctrl_process_read(machine_id, process, r1u64(stack_top, stack_top+stack_size), stack_memory.str); + CTRL_ProcessMemorySlice stack_memory_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, machine_id, process_entity->handle, r1u64(stack_top, stack_top+stack_size), endt_us); + String8 stack_memory = stack_memory_slice.data; if(stack_memory.size != 0) { stack_memview_good = 1; @@ -1262,9 +1008,21 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Han { unwind.error = 0; - // rjf: regs -> rip*module*binary + // rjf: regs -> rip*module U64 rip = regs_rip_from_arch_block(arch, regs_block); - DMN_Handle module = ctrl_module_from_process_vaddr(machine_id, process, rip); + DMN_Handle module = {0}; + String8 module_name = {0}; + Rng1U64 module_vaddr_range = {0}; + for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next) + { + if(contains_1u64(m->vaddr_range, rip)) + { + module = m->handle; + module_name = m->name; + module_vaddr_range = m->vaddr_range; + break; + } + } // rjf: cancel on 0 rip if(rip == 0) @@ -1272,8 +1030,8 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Han break; } - // rjf: binary -> all the binary info - String8 binary_full_path = dmn_full_path_from_module(scratch.arena, ctrl_dmn_handle_from_ctrl(module)); + // rjf: module -> all the binary info + String8 binary_full_path = module_name; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_full_path, 0); String8 binary_data = str8((U8 *)dbgi->exe_base, dbgi->exe_props.size); @@ -1293,7 +1051,7 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Han unwind.count += 1; // rjf: unwind one step - UNW_Result unwind_step = unw_pe_x64(binary_data, &dbgi->pe, dmn_vaddr_range_from_module(ctrl_dmn_handle_from_ctrl(module)).min, &memview, (UNW_X64_Regs *)regs_block); + UNW_Result unwind_step = unw_pe_x64(binary_data, &dbgi->pe, module_vaddr_range.min, &memview, (UNW_X64_Regs *)regs_block); // rjf: cancel on bad step if(unwind_step.dead != 0) @@ -1318,6 +1076,41 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Han return unwind; } +//////////////////////////////// +//~ rjf: Halting All Attached Processes + +internal void +ctrl_halt(void) +{ + dmn_halt(0, 0); +} + +//////////////////////////////// +//~ rjf: Shared Accessor Functions + +//- rjf: run indices + +internal U64 +ctrl_run_idx(void) +{ + U64 result = ins_atomic_u64_eval(&ctrl_state->run_idx); + return result; +} + +internal U64 +ctrl_memgen_idx(void) +{ + U64 result = ins_atomic_u64_eval(&ctrl_state->memgen_idx); + return result; +} + +internal U64 +ctrl_reggen_idx(void) +{ + U64 result = ins_atomic_u64_eval(&ctrl_state->reggen_idx); + return result; +} + //- rjf: name -> register/alias hash tables, for eval internal EVAL_String2NumMap * @@ -1332,8 +1125,33 @@ ctrl_string2alias_from_arch(Architecture arch) return &ctrl_state->arch_string2alias_tables[arch]; } +//- rjf: entity state reading + +internal CTRL_Entity * +ctrl_entity_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + { + U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); + U64 slot_idx = hash%ctrl_state->entity_hash_slots_count; + CTRL_EntityHashSlot *slot = &ctrl_state->entity_hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) + { + entity = n->entity; + break; + } + } + } + return entity; +} + //////////////////////////////// -//~ rjf: User -> Ctrl Communication +//~ rjf: Control-Thread Functions + +//- rjf: user -> control thread communication internal B32 ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) @@ -1395,8 +1213,7 @@ ctrl_u2c_pop_msgs(Arena *arena) return msgs; } -//////////////////////////////// -//~ rjf: Ctrl -> User Communication +//- rjf: control -> user thread communication internal void ctrl_c2u_push_events(CTRL_EventList *events) @@ -1464,184 +1281,133 @@ ctrl_c2u_pop_events(Arena *arena) return events; } -//////////////////////////////// -//~ rjf: User -> Memory Stream Communication - -internal B32 -ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us) -{ - B32 good = 0; - OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) - { - U64 unconsumed_size = ctrl_state->u2ms_ring_write_pos-ctrl_state->u2ms_ring_read_pos; - U64 available_size = ctrl_state->u2ms_ring_size-unconsumed_size; - if(available_size >= sizeof(machine_id)+sizeof(process)+sizeof(vaddr_range)) - { - good = 1; - ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &machine_id); - ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &process); - ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &vaddr_range); - ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &zero_terminated); - break; - } - if(os_now_microseconds() >= endt_us) {break;} - os_condition_variable_wait(ctrl_state->u2ms_ring_cv, ctrl_state->u2ms_ring_mutex, endt_us); - } - os_condition_variable_broadcast(ctrl_state->u2ms_ring_cv); - return good; -} - -internal void -ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, DMN_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated) -{ - OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) - { - U64 unconsumed_size = ctrl_state->u2ms_ring_write_pos-ctrl_state->u2ms_ring_read_pos; - if(unconsumed_size >= sizeof(*out_machine_id)+sizeof(*out_process)+sizeof(*out_vaddr_range)) - { - ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_machine_id); - ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_process); - ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_vaddr_range); - ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_zero_terminated); - break; - } - os_condition_variable_wait(ctrl_state->u2ms_ring_cv, ctrl_state->u2ms_ring_mutex, max_U64); - } - os_condition_variable_broadcast(ctrl_state->u2ms_ring_cv); -} - -//////////////////////////////// -//~ rjf: Control-Thread-Only Functions - //- rjf: entity tree construction internal CTRL_Entity * ctrl_thread__entity_alloc(CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle) { - // rjf: allocate - CTRL_Entity *entity = ctrl_state->ctrl_entity_free; + CTRL_Entity *entity = &ctrl_entity_nil; + OS_MutexScopeW(ctrl_state->entity_rw_mutex) { - if(entity != 0) + // rjf: allocate + entity = ctrl_state->entity_free; { - SLLStackPop(ctrl_state->ctrl_entity_free); - } - else - { - entity = push_array_no_zero(ctrl_state->ctrl_entity_arena, CTRL_Entity, 1); - } - MemoryZeroStruct(entity); - } - - // rjf: fill - { - entity->kind = kind; - entity->machine_id = machine_id; - entity->handle = handle; - entity->parent = parent; - entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; - if(parent != &ctrl_entity_nil) - { - DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); - } - } - - // rjf: insert into hash map - { - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); - U64 slot_idx = hash%ctrl_state->ctrl_entity_hash_slots_count; - CTRL_EntityHashSlot *slot = &ctrl_state->ctrl_entity_hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) + if(entity != 0) { - node = n; - break; - } - } - if(node == 0) - { - node = ctrl_state->ctrl_entity_hash_node_free; - if(node != 0) - { - SLLStackPop(ctrl_state->ctrl_entity_hash_node_free); + SLLStackPop(ctrl_state->entity_free); } else { - node = push_array_no_zero(ctrl_state->ctrl_entity_arena, CTRL_EntityHashNode, 1); + entity = push_array_no_zero(ctrl_state->entity_arena, CTRL_Entity, 1); + } + MemoryZeroStruct(entity); + } + + // rjf: fill + { + entity->kind = kind; + entity->machine_id = machine_id; + entity->handle = handle; + entity->parent = parent; + entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; + if(parent != &ctrl_entity_nil) + { + DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); + } + } + + // rjf: insert into hash map + { + U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); + U64 slot_idx = hash%ctrl_state->entity_hash_slots_count; + CTRL_EntityHashSlot *slot = &ctrl_state->entity_hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) + { + node = n; + break; + } + } + if(node == 0) + { + node = ctrl_state->entity_hash_node_free; + if(node != 0) + { + SLLStackPop(ctrl_state->entity_hash_node_free); + } + else + { + node = push_array_no_zero(ctrl_state->entity_arena, CTRL_EntityHashNode, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->entity = entity; } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->entity = entity; } } - return entity; } internal void ctrl_thread__entity_release(CTRL_Entity *entity) { - // rjf: unhook root - if(entity->parent != &ctrl_entity_nil) + OS_MutexScopeW(ctrl_state->entity_rw_mutex) { - DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); - } - - // rjf: walk every entity in this tree, free each - if(entity != &ctrl_entity_nil) - { - Temp scratch = scratch_begin(0, 0); - typedef struct Task Task; - struct Task + // rjf: unhook root + if(entity->parent != &ctrl_entity_nil) { - Task *next; - CTRL_Entity *e; - }; - Task start_task = {0, entity}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *t = first_task; t != 0; t = t->next) + DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + } + + // rjf: walk every entity in this tree, free each + if(entity != &ctrl_entity_nil) { - for(CTRL_Entity *child = entity->first; child != &ctrl_entity_nil; child = child->next) + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task { - Task *t = push_array(scratch.arena, Task, 1); - t->e = child; - SLLQueuePush(first_task, last_task, t); - } - - // rjf: free entity - SLLStackPush(ctrl_state->ctrl_entity_free, t->e); - - // rjf: remove from hash map + Task *next; + CTRL_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *t = first_task; t != 0; t = t->next) { - U64 hash = ctrl_hash_from_machine_id_handle(t->e->machine_id, t->e->handle); - U64 slot_idx = hash%ctrl_state->ctrl_entity_hash_slots_count; - CTRL_EntityHashSlot *slot = &ctrl_state->ctrl_entity_hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + for(CTRL_Entity *child = entity->first; child != &ctrl_entity_nil; child = child->next) { - if(n->entity->machine_id == t->e->machine_id && dmn_handle_match(n->entity->handle, t->e->handle)) + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + + // rjf: free entity + SLLStackPush(ctrl_state->entity_free, t->e); + + // rjf: remove from hash map + { + U64 hash = ctrl_hash_from_machine_id_handle(t->e->machine_id, t->e->handle); + U64 slot_idx = hash%ctrl_state->entity_hash_slots_count; + CTRL_EntityHashSlot *slot = &ctrl_state->entity_hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) { - DLLRemove(slot->first, slot->last, n); - SLLStackPush(ctrl_state->ctrl_entity_hash_node_free, n); - break; + if(n->entity->machine_id == t->e->machine_id && dmn_handle_match(n->entity->handle, t->e->handle)) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(ctrl_state->entity_hash_node_free, n); + break; + } } } } + scratch_end(scratch); } - scratch_end(scratch); } } -internal CTRL_Entity * -ctrl_thread__entity_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle) -{ - CTRL_Entity *entity = &ctrl_entity_nil; - - return entity; -} - //- rjf: entry point internal void @@ -1706,6 +1472,123 @@ ctrl_thread__entry_point(void *p) ProfEnd(); } +//- rjf: breakpoint resolution + +internal void +ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +{ + Temp scratch = scratch_begin(&arena, 1); + DBGI_Scope *scope = dbgi_scope_open(); + CTRL_Entity *module_entity = ctrl_entity_from_machine_id_handle(machine_id, module); + String8 exe_path = module_entity->name; + DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); + RDI_Parsed *rdi = &dbgi->rdi; + U64 base_vaddr = module_entity->vaddr_range.min; + for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) + { + CTRL_UserBreakpoint *bp = &n->v; + switch(bp->kind) + { + default:{}break; + + //- rjf: file:line-based breakpoints + case CTRL_UserBreakpointKind_FileNameAndLineColNumber: + { + // rjf: unpack & normalize + TxtPt pt = bp->pt; + String8 filename = bp->string; + String8 filename_normalized = push_str8_copy(scratch.arena, filename); + for(U64 idx = 0; idx < filename_normalized.size; idx += 1) + { + filename_normalized.str[idx] = char_to_lower(filename_normalized.str[idx]); + filename_normalized.str[idx] = char_to_correct_slash(filename_normalized.str[idx]); + } + + // rjf: filename -> src_id + U32 src_id = 0; + { + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_NormalSourcePaths); + if(mapptr != 0) + { + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + src_id = ids[0]; + } + } + } + } + + // rjf: src_id * pt -> push + { + RDI_SourceFile *src = rdi_element_from_idx(rdi, source_files, src_id); + RDI_ParsedLineMap line_map = {0}; + rdi_line_map_from_source_file(rdi, src, &line_map); + U32 voff_count = 0; + U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); + for(U32 i = 0; i < voff_count; i += 1) + { + U64 vaddr = voffs[i] + base_vaddr; + DMN_Trap trap = {process, vaddr, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + } + }break; + + //- rjf: symbol:voff-based breakpoints + case CTRL_UserBreakpointKind_SymbolNameAndOffset: + { + String8 symbol_name = bp->string; + U64 voff = bp->u64; + if(rdi != 0 && rdi->procedures != 0) + { + RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); + if(mapptr != 0) + { + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, symbol_name.str, symbol_name.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + for(U32 match_i = 0; match_i < id_count; match_i += 1) + { + U64 proc_voff = rdi_first_voff_from_proc(rdi, ids[match_i]); + U64 proc_vaddr = proc_voff + base_vaddr; + DMN_Trap trap = {process, proc_vaddr + voff, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + } + } + } + }break; + } + } + dbgi_scope_close(scope); + scratch_end(scratch); +} + +internal void +ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +{ + for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) + { + CTRL_UserBreakpoint *bp = &n->v; + if(bp->kind == CTRL_UserBreakpointKind_VirtualAddress) + { + DMN_Trap trap = {process, bp->u64, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + } +} + //- rjf: attached process running/event gathering internal DMN_Event * @@ -1768,14 +1651,14 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) { DBGI_Scope *scope = dbgi_scope_open(); - DMN_HandleArray modules = dmn_modules_from_process(scratch.arena, ev->process); - if(modules.count != 0) + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, ev->process); + CTRL_Entity *module = process->first; + if(module != &ctrl_entity_nil) { // rjf: determine base address of asan shadow space U64 asan_shadow_base_vaddr = 0; B32 asan_shadow_variable_exists_but_is_zero = 0; - DMN_Handle module = modules.handles[0]; - String8 module_path = dmn_full_path_from_module(scratch.arena, ctrl_dmn_handle_from_ctrl(module)); + String8 module_path = module->name; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_GlobalVariables); @@ -1793,10 +1676,10 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls { RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, ids[0]); U64 global_var_voff = global_var->voff; - U64 global_var_vaddr = global_var->voff + dmn_base_vaddr_from_module(ctrl_dmn_handle_from_ctrl(module)); - Architecture arch = dmn_arch_from_object(ev->thread); + U64 global_var_vaddr = global_var->voff + module->vaddr_range.min; + Architecture arch = process->arch; U64 addr_size = bit_size_from_arch(arch)/8; - ctrl_process_read(CTRL_MachineID_Local, ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); + dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0); } } @@ -1852,15 +1735,16 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls U64 size_of_spoof = 0; if(do_spoof) ProfScope("prep spoof") { - Architecture arch = dmn_arch_from_object(ctrl_dmn_handle_from_ctrl(spoof->process)); - dmn_read_memory(ctrl_dmn_handle_from_ctrl(spoof->process), &spoof_old_ip_value, spoof->vaddr, sizeof(spoof_old_ip_value)); + CTRL_Entity *spoof_process = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, spoof->process); + Architecture arch = spoof_process->arch; size_of_spoof = bit_size_from_arch(arch)/8; + dmn_process_read(spoof_process->handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); } // rjf: set spoof if(do_spoof) ProfScope("set spoof") { - dmn_write_memory(ctrl_dmn_handle_from_ctrl(spoof->process), spoof->vaddr, &spoof->new_ip_value, size_of_spoof); + dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); } // rjf: run for new events @@ -1887,7 +1771,7 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls // rjf: unset spoof if(do_spoof) ProfScope("unset spoof") { - dmn_write_memory(ctrl_dmn_handle_from_ctrl(spoof->process), spoof->vaddr, &spoof_old_ip_value, size_of_spoof); + dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); } // rjf: inc generation counters @@ -1904,10 +1788,15 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls // simply been sent other debug events first if(spoof != 0) { - U64 spoof_thread_rip = dmn_read_ip(ctrl_dmn_handle_from_ctrl(spoof->thread)); + CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, spoof->thread); + Architecture arch = thread->arch; + void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_architecture(arch)); + dmn_thread_read_reg_block(spoof->thread, regs_block); + U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block); if(spoof_thread_rip == spoof->new_ip_value) { - dmn_write_ip(ctrl_dmn_handle_from_ctrl(spoof->thread), spoof_old_ip_value); + regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value); + dmn_thread_write_reg_block(spoof->thread, regs_block); } } @@ -1923,7 +1812,7 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls out_evt->msg_id = msg->msg_id; out_evt->machine_id = CTRL_MachineID_Local; out_evt->entity = event->process; - out_evt->arch = dmn_arch_from_object(event->process); + out_evt->arch = event->arch; out_evt->entity_id = event->code; ctrl_state->process_counter += 1; }break; @@ -1935,7 +1824,7 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls out_evt->machine_id = CTRL_MachineID_Local; out_evt->entity = event->thread; out_evt->parent = event->process; - out_evt->arch = dmn_arch_from_object(event->process); + out_evt->arch = event->arch; out_evt->entity_id = event->code; out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); out_evt->tls_root = dmn_tls_root_vaddr_from_thread(event->thread); @@ -1952,10 +1841,10 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls out_evt->machine_id = CTRL_MachineID_Local; out_evt->entity = event->module; out_evt->parent = event->process; - out_evt->arch = dmn_arch_from_object(event->module); + out_evt->arch = event->arch; out_evt->entity_id = event->code; out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); - out_evt->rip_vaddr = dmn_base_vaddr_from_module(event->module); + out_evt->rip_vaddr = event->address; out_evt->string = module_path; }break; case DMN_EventKind_ExitProcess: @@ -2275,12 +2164,11 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) //- rjf: add traps for all possible entry points for(U64 process_idx = 0; process_idx < run_ctrls.run_entity_count; process_idx += 1) { - //- rjf: unpack first module info - DMN_HandleArray modules = dmn_modules_from_process(scratch.arena, run_ctrls.run_entities[process_idx]); - if(modules.count == 0) { continue; } - DMN_Handle module = modules.handles[0]; - U64 module_base_vaddr = dmn_base_vaddr_from_module(module); - String8 exe_path = dmn_full_path_from_module(scratch.arena, module); + //- rjf: unpack process & first module info + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, run_ctrls.run_entities[process_idx]); + CTRL_Entity *module = process->first; + U64 module_base_vaddr = module->vaddr_range.min; + String8 exe_path = module->name; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); @@ -2547,7 +2435,7 @@ ctrl_thread__kill(CTRL_Msg *msg) B32 kill_worked = dmn_kill_process(process, exit_code); //- rjf: wait for process to be dead - if(dmn_object_exists(process) && kill_worked) + if(kill_worked) { DMN_RunCtrls run_ctrls = {0}; run_ctrls.run_entities_are_unfrozen = 1; @@ -2595,7 +2483,7 @@ ctrl_thread__detach(CTRL_Msg *msg) B32 detach_worked = dmn_detach_process(process); //- rjf: wait for process to be dead - if(dmn_object_exists(process) && detach_worked) + if(detach_worked) { DMN_RunCtrls run_ctrls = {0}; run_ctrls.run_entities_are_unfrozen = 1; @@ -2643,32 +2531,26 @@ ctrl_thread__run(CTRL_Msg *msg) DMN_Handle target_process = msg->parent; U64 spoof_ip_vaddr = 911; - ////////////////////////////// - //- rjf: gather processes - // - DMN_HandleArray processes = dmn_all_processes(scratch.arena); - ////////////////////////////// //- rjf: gather all initial breakpoints // DMN_TrapChunkList user_traps = {0}; + for(CTRL_Entity *machine = ctrl_state->entity_root->first; machine != &ctrl_entity_nil; machine = machine->next) { - // rjf: resolve module-dependent user bps - for(U64 process_idx = 0; process_idx < processes.count; process_idx += 1) + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) { - DMN_Handle process = processes.handles[process_idx]; - DMN_HandleArray modules = dmn_modules_from_process(scratch.arena, process); - for(U64 module_idx = 0; module_idx < modules.count; module_idx += 1) + if(process->kind != CTRL_EntityKind_Process) { continue; } + + // rjf: resolve module-dependent user bps + for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) { - DMN_Handle module = modules.handles[module_idx]; - ctrl_append_resolved_module_user_bp_traps(scratch.arena, process, module, &msg->user_bps, &user_traps); + if(module->kind != CTRL_EntityKind_Module) { continue; } + ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, machine->machine_id, process->handle, module->handle, &msg->user_bps, &user_traps); } - } - - // rjf: push virtual-address user breakpoints per-process - for(U64 process_idx = 0; process_idx < processes.count; process_idx += 1) - { - ctrl_append_resolved_process_user_bp_traps(scratch.arena, processes.handles[process_idx], &msg->user_bps, &user_traps); + + // rjf: push virtual-address user breakpoints per-process + ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, machine->machine_id, process->handle, &msg->user_bps, &user_traps); } } @@ -2689,57 +2571,59 @@ ctrl_thread__run(CTRL_Msg *msg) { // rjf: gather stuck threads DMN_HandleList stuck_threads = {0}; - for(U64 i = 0; i < processes.count; i += 1) + for(CTRL_Entity *machine = ctrl_state->entity_root->first; machine != &ctrl_entity_nil; machine = machine->next) { - DMN_Handle process = processes.handles[i]; - DMN_HandleArray threads = dmn_threads_from_process(scratch.arena, process); - for(U64 j = 0; j < threads.count; j += 1) + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) { - DMN_Handle thread = threads.handles[j]; - U64 rip = dmn_read_ip(thread); - - // rjf: determine if thread is frozen - B32 thread_is_frozen = !msg->freeze_state_is_frozen; - for(CTRL_MachineIDHandlePairNode *n = msg->freeze_state_threads.first; n != 0; n = n->next) + if(process->kind != CTRL_EntityKind_Process) { continue; } + for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) { - if(dmn_handle_match(n->v.handle, thread)) + U64 rip = ctrl_query_cached_rip_from_thread(thread->machine_id, thread->handle); + + // rjf: determine if thread is frozen + B32 thread_is_frozen = !msg->freeze_state_is_frozen; + for(CTRL_MachineIDHandlePairNode *n = msg->freeze_state_threads.first; n != 0; n = n->next) { - thread_is_frozen ^= 1; - break; + if(dmn_handle_match(n->v.handle, thread->handle)) + { + thread_is_frozen ^= 1; + break; + } } - } - - // rjf: not frozen? -> check if stuck & gather if so - if(thread_is_frozen == 0) - { - for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) + + // rjf: not frozen? -> check if stuck & gather if so + if(thread_is_frozen == 0) { - B32 is_on_user_bp = 0; - for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) + for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) { - if(dmn_handle_match(trap_ptr->process, process) && trap_ptr->vaddr == rip) + B32 is_on_user_bp = 0; + for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) { - is_on_user_bp = 1; + if(dmn_handle_match(trap_ptr->process, process->handle) && trap_ptr->vaddr == rip) + { + is_on_user_bp = 1; + } } - } - - B32 is_on_net_trap = 0; - for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) - { - if(n->v.vaddr == rip) + + B32 is_on_net_trap = 0; + for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) { - is_on_net_trap = 1; + if(n->v.vaddr == rip) + { + is_on_net_trap = 1; + } + } + + if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread->handle, target_thread))) + { + dmn_handle_list_push(scratch.arena, &stuck_threads, thread->handle); + } + + if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread->handle, target_thread)) + { + target_thread_is_on_user_bp_and_trap_net_trap = 1; } - } - - if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread, target_thread))) - { - dmn_handle_list_push(scratch.arena, &stuck_threads, thread); - } - - if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread, target_thread)) - { - target_thread_is_on_user_bp_and_trap_net_trap = 1; } } } @@ -2814,7 +2698,7 @@ ctrl_thread__run(CTRL_Msg *msg) // if(stop_event == 0) { - U64 sp_check_value = dmn_read_sp(target_thread); + U64 sp_check_value = ctrl_query_cached_rsp_from_thread(CTRL_MachineID_Local, target_thread); B32 spoof_mode = 0; CTRL_Spoof spoof = {0}; for(;;) @@ -2884,13 +2768,13 @@ ctrl_thread__run(CTRL_Msg *msg) case DMN_EventKind_CreateProcess: { DMN_TrapChunkList new_traps = {0}; - ctrl_append_resolved_process_user_bp_traps(scratch.arena, event->process, &msg->user_bps, &new_traps); + ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, CTRL_MachineID_Local, event->process, &msg->user_bps, &new_traps); dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); }break; case DMN_EventKind_LoadModule: { DMN_TrapChunkList new_traps = {0}; - ctrl_append_resolved_module_user_bp_traps(scratch.arena, event->process, event->module, &msg->user_bps, &new_traps); + ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, CTRL_MachineID_Local, event->process, event->module, &msg->user_bps, &new_traps); dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); }break; @@ -2899,29 +2783,27 @@ ctrl_thread__run(CTRL_Msg *msg) ////////////////////////// //- rjf: unpack info about thread attached to event // - Architecture arch = dmn_arch_from_object(event->thread); + CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, event->thread); + Architecture arch = thread->arch; U64 reg_size = regs_block_size_from_architecture(arch); - void *thread_regs_block = dmn_read_regs(event->thread); + void *thread_regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, CTRL_MachineID_Local, event->thread, max_U64); U64 thread_rip_vaddr = regs_rip_from_arch_block(arch, thread_regs_block); DMN_Handle module = {0}; + String8 module_name = {0}; + U64 module_base_vaddr = 0; U64 thread_rip_voff = 0; { - Temp temp = temp_begin(scratch.arena); - DMN_HandleArray modules = dmn_modules_from_process(temp.arena, event->process); - if(modules.count != 0) + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, event->thread); + for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) { - for(U64 idx = 0; idx < modules.count; idx += 1) + if(contains_1u64(module->vaddr_range, thread_rip_vaddr)) { - Rng1U64 vaddr_range = dmn_vaddr_range_from_module(modules.handles[idx]); - if(contains_1u64(vaddr_range, thread_rip_vaddr)) - { - module = modules.handles[idx]; - thread_rip_voff = thread_rip_vaddr - vaddr_range.min; - break; - } + module_name = module->name; + module_base_vaddr = module->vaddr_range.min; + thread_rip_voff = thread_rip_vaddr - module->vaddr_range.min; + break; } } - temp_end(temp); } ////////////////////////// @@ -3003,7 +2885,7 @@ ctrl_thread__run(CTRL_Msg *msg) // rjf: evaluate hit stop conditions if(conditions.node_count != 0) { - String8 exe_path = dmn_full_path_from_module(temp.arena, module); + String8 exe_path = module_name; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) @@ -3043,7 +2925,7 @@ ctrl_thread__run(CTRL_Msg *msg) EVAL_Result eval = {0}; if(bytecode.size != 0) { - U64 module_base = dmn_base_vaddr_from_module(module); + U64 module_base = module_base_vaddr; U64 tls_base = 0; // TODO(rjf) EVAL_Machine machine = {0}; machine.u = &event->process; @@ -3153,7 +3035,7 @@ ctrl_thread__run(CTRL_Msg *msg) B32 stack_pointer_matches = 0; if(use_trap_net_logic) { - U64 sp = dmn_read_sp(target_thread); + U64 sp = ctrl_query_cached_rsp_from_thread(CTRL_MachineID_Local, target_thread); stack_pointer_matches = (sp == sp_check_value); } @@ -3201,7 +3083,7 @@ ctrl_thread__run(CTRL_Msg *msg) { // rjf: setup spoof mode begin_spoof_mode = 1; - U64 spoof_sp = dmn_read_sp(target_thread); + U64 spoof_sp = ctrl_query_cached_rsp_from_thread(CTRL_MachineID_Local, target_thread); spoof_mode = 1; spoof.process = target_process; spoof.thread = target_thread; @@ -3219,7 +3101,7 @@ ctrl_thread__run(CTRL_Msg *msg) if(stack_pointer_matches) { save_stack_pointer = 1; - sp_check_value = dmn_read_sp(target_thread); + sp_check_value = ctrl_query_cached_rsp_from_thread(CTRL_MachineID_Local, target_thread); } } } @@ -3403,6 +3285,51 @@ ctrl_thread__single_step(CTRL_Msg *msg) //////////////////////////////// //~ rjf: Memory-Stream-Thread-Only Functions +//- rjf: user -> memory stream communication + +internal B32 +ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us) +{ + B32 good = 0; + OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) + { + U64 unconsumed_size = ctrl_state->u2ms_ring_write_pos-ctrl_state->u2ms_ring_read_pos; + U64 available_size = ctrl_state->u2ms_ring_size-unconsumed_size; + if(available_size >= sizeof(machine_id)+sizeof(process)+sizeof(vaddr_range)) + { + good = 1; + ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &machine_id); + ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &process); + ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &vaddr_range); + ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &zero_terminated); + break; + } + if(os_now_microseconds() >= endt_us) {break;} + os_condition_variable_wait(ctrl_state->u2ms_ring_cv, ctrl_state->u2ms_ring_mutex, endt_us); + } + os_condition_variable_broadcast(ctrl_state->u2ms_ring_cv); + return good; +} + +internal void +ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, DMN_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated) +{ + OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) + { + U64 unconsumed_size = ctrl_state->u2ms_ring_write_pos-ctrl_state->u2ms_ring_read_pos; + if(unconsumed_size >= sizeof(*out_machine_id)+sizeof(*out_process)+sizeof(*out_vaddr_range)) + { + ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_machine_id); + ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_process); + ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_vaddr_range); + ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_zero_terminated); + break; + } + os_condition_variable_wait(ctrl_state->u2ms_ring_cv, ctrl_state->u2ms_ring_mutex, max_U64); + } + os_condition_variable_broadcast(ctrl_state->u2ms_ring_cv); +} + //- rjf: entry point internal void @@ -3476,7 +3403,7 @@ ctrl_mem_stream_thread__entry_point(void *p) else { range_base = push_array_no_zero(range_arena, U8, range_size); - U64 bytes_read = ctrl_process_read(machine_id, process, vaddr_range_clamped, range_base); + U64 bytes_read = dmn_process_read(process, vaddr_range_clamped, range_base); if(bytes_read == 0) { arena_release(range_arena); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 840cef5c..e4bd7653 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -473,6 +473,15 @@ struct CTRL_State CTRL_ProcessMemoryCache process_memory_cache; CTRL_ThreadRegCache thread_reg_cache; + // rjf: entity tree + OS_Handle entity_rw_mutex; + Arena *entity_arena; + CTRL_Entity *entity_root; + CTRL_Entity *entity_free; + CTRL_EntityHashSlot *entity_hash_slots; + CTRL_EntityHashNode *entity_hash_node_free; + U64 entity_hash_slots_count; + // rjf: user -> ctrl msg ring buffer U64 u2c_ring_size; U8 *u2c_ring_base; @@ -491,12 +500,6 @@ struct CTRL_State // rjf: ctrl thread state OS_Handle ctrl_thread; - Arena *ctrl_entity_arena; - CTRL_Entity *ctrl_entity_root; - CTRL_Entity *ctrl_entity_free; - CTRL_EntityHashSlot *ctrl_entity_hash_slots; - CTRL_EntityHashNode *ctrl_entity_hash_node_free; - U64 ctrl_entity_hash_slots_count; Arena *dmn_event_arena; DMN_EventNode *first_dmn_event_node; DMN_EventNode *last_dmn_event_node; @@ -557,8 +560,6 @@ internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src); internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp); internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src); -internal void ctrl_append_resolved_module_user_bp_traps(Arena *arena, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_append_resolved_process_user_bp_traps(Arena *arena, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); //////////////////////////////// //~ rjf: Message Type Functions @@ -614,6 +615,8 @@ internal B32 ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, R //- rjf: thread register cache reading internal void *ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us); internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); +internal U64 ctrl_query_cached_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); +internal U64 ctrl_query_cached_rsp_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); //- rjf: thread register writing internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block); @@ -621,7 +624,7 @@ internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle t //////////////////////////////// //~ rjf: Unwinding Functions -internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread); +internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us); //////////////////////////////// //~ rjf: Halting All Attached Processes @@ -640,6 +643,9 @@ internal U64 ctrl_reggen_idx(void); internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); internal EVAL_String2NumMap *ctrl_string2alias_from_arch(Architecture arch); +//- rjf: entity state reading +internal CTRL_Entity *ctrl_entity_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle); + //////////////////////////////// //~ rjf: Control-Thread Functions @@ -654,11 +660,14 @@ internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); //- rjf: entity tree construction internal CTRL_Entity *ctrl_thread__entity_alloc(CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle); internal void ctrl_thread__entity_release(CTRL_Entity *entity); -internal CTRL_Entity *ctrl_thread__entity_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle); //- rjf: entry point internal void ctrl_thread__entry_point(void *p); +//- rjf: breakpoint resolution +internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); + //- rjf: attached process running/event gathering internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index 5eeacd22..5cff7a56 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -54,6 +54,7 @@ struct DMN_Event DMN_Handle process; DMN_Handle thread; DMN_Handle module; + Architecture arch; U64 address; U64 size; String8 string; diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index 2f42d85f..afee68fa 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -1462,6 +1462,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_CreateProcess; e->process = dmn_w32_handle_from_entity(process); + e->arch = image_info.arch; e->code = evt.dwProcessId; } @@ -1471,6 +1472,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) e->kind = DMN_EventKind_CreateThread; e->process = dmn_w32_handle_from_entity(process); e->thread = dmn_w32_handle_from_entity(thread); + e->arch = image_info.arch; e->code = evt.dwThreadId; } @@ -1480,6 +1482,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) e->kind = DMN_EventKind_LoadModule; e->process = dmn_w32_handle_from_entity(process); e->module = dmn_w32_handle_from_entity(module); + e->arch = image_info.arch; e->address = module_base; e->size = image_info.size; e->string = dmn_w32_full_path_from_module(arena, module); @@ -1543,6 +1546,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); { thread->handle = evt.u.CreateThread.hThread; + thread->arch = process->arch; thread->thread.thread_local_base = (U64)evt.u.CreateThread.lpThreadLocalBase; } @@ -1573,6 +1577,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) e->kind = DMN_EventKind_CreateThread; e->process = dmn_w32_handle_from_entity(process); e->thread = dmn_w32_handle_from_entity(thread); + e->arch = thread->arch; e->code = evt.dwThreadId; e->string = thread_name; } @@ -1627,6 +1632,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); { module->handle = evt.u.LoadDll.hFile; + module->arch = image_info.arch; module->module.vaddr_range = r1u64(module_base, module_base+image_info.size); module->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName; module->module.name_is_unicode = (evt.u.LoadDll.fUnicode != 0); @@ -1638,6 +1644,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) e->kind = DMN_EventKind_LoadModule; e->process = dmn_w32_handle_from_entity(process); e->module = dmn_w32_handle_from_entity(module); + e->arch = module->arch; e->address = module_base; e->size = image_info.size; e->string = dmn_w32_full_path_from_module(arena, module); @@ -2299,6 +2306,8 @@ dmn_detach_process(DMN_Handle process) { dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); } + + return result; } //////////////////////////////// From 4a3cc9bb3961b9380b021a444aba63687e21db05 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 13:55:13 -0700 Subject: [PATCH 172/275] get raddbg building on new demon layer --- project.4coder | 2 +- src/ctrl/ctrl_inc.h | 2 +- src/dasm/dasm.c | 10 ++++++---- src/dasm/dasm.h | 3 ++- src/df/core/df_core.c | 36 +++++++++++++++++++----------------- src/df/gfx/df_views.c | 16 +++++++++------- src/df/gfx/df_views.h | 2 +- src/raddbg/raddbg_main.cpp | 4 ++-- 8 files changed, 41 insertions(+), 34 deletions(-) diff --git a/project.4coder b/project.4coder index f39bd033..be4e0ac7 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build ryan_scratch", + .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/ctrl/ctrl_inc.h b/src/ctrl/ctrl_inc.h index e485f6d0..24b17db2 100644 --- a/src/ctrl/ctrl_inc.h +++ b/src/ctrl/ctrl_inc.h @@ -74,4 +74,4 @@ #include "ctrl_core.h" -#endif //CTRL_INC_H +#endif // CTRL_INC_H diff --git a/src/dasm/dasm.c b/src/dasm/dasm.c index 0a0c9855..5434c9e9 100644 --- a/src/dasm/dasm.c +++ b/src/dasm/dasm.c @@ -179,7 +179,7 @@ dasm_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_coun //- rjf: opening handles & correllation with module internal DASM_Handle -dasm_handle_from_ctrl_process_range(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range) +dasm_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range, Architecture arch) { DASM_Handle result = {0}; if(machine != 0 && process.u64[0] != 0) @@ -196,7 +196,8 @@ dasm_handle_from_ctrl_process_range(CTRL_MachineID machine, DMN_Handle process, { if(e->machine_id == machine && ctrl_handle_match(e->process, process) && - MemoryMatchStruct(&e->vaddr_range, &vaddr_range)) + MemoryMatchStruct(&e->vaddr_range, &vaddr_range) && + e->arch == arch) { entity = e; break; @@ -209,6 +210,7 @@ dasm_handle_from_ctrl_process_range(CTRL_MachineID machine, DMN_Handle process, entity->machine_id = machine; entity->process = process; entity->vaddr_range= vaddr_range; + entity->arch = arch; entity->id = ins_atomic_u64_inc_eval(&dasm_shared->entity_id_gen); entity->decode_inst_arena = arena_alloc__sized(MB(256), KB(64)); entity->decode_string_arena = arena_alloc__sized(GB(1), KB(64)); @@ -413,7 +415,7 @@ dasm_decode_thread_entry_point(void *p) ctrl_machine_id = entity->machine_id; ctrl_process = entity->process; vaddr_range = entity->vaddr_range; - arch = ctrl_arch_from_handle(ctrl_machine_id, ctrl_process); + arch = entity->arch; bytes_processed_counter = &entity->bytes_processed; U64 bytes_to_process = dim_1u64(vaddr_range); ins_atomic_u64_eval_assign(&entity->bytes_processed, 0); @@ -465,7 +467,7 @@ dasm_decode_thread_entry_point(void *p) if(good_task) { data.str = push_array_no_zero(scratch.arena, U8, dim_1u64(chunk_vaddr_range)); - data.size = ctrl_process_read(ctrl_machine_id, ctrl_process, chunk_vaddr_range, data.str); + data.size = dmn_process_read(ctrl_process, chunk_vaddr_range, data.str); if(data.size != 0) { inst_list = dasm_inst_chunk_list_from_arch_addr_data(scratch.arena, bytes_processed_counter, arch, chunk_vaddr_range.min, data); diff --git a/src/dasm/dasm.h b/src/dasm/dasm.h index 61200578..6bf4450c 100644 --- a/src/dasm/dasm.h +++ b/src/dasm/dasm.h @@ -79,6 +79,7 @@ struct DASM_Entity CTRL_MachineID machine_id; DMN_Handle process; Rng1U64 vaddr_range; + Architecture arch; U64 id; // rjf: top-level info @@ -187,7 +188,7 @@ internal DASM_InstChunkList dasm_inst_chunk_list_from_arch_addr_data(Arena *aren //~ rjf: Cache Lookups //- rjf: opening handles & correllation with module -internal DASM_Handle dasm_handle_from_ctrl_process_range(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range); +internal DASM_Handle dasm_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range, Architecture arch); //- rjf: asking for top-level info of a handle internal DASM_BinaryInfo dasm_binary_info_from_handle(Arena *arena, DASM_Handle handle); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 46e3ffac..8ef806e3 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1404,7 +1404,7 @@ internal DASM_Handle df_dasm_handle_from_process_vaddr(DF_Entity *process, U64 vaddr) { Rng1U64 disasm_vaddr_rng = r1u64(AlignDownPow2(vaddr, KB(4)), AlignDownPow2(vaddr, KB(4)) + KB(16)); - DASM_Handle dasm_handle = dasm_handle_from_ctrl_process_range(process->ctrl_machine_id, process->ctrl_handle, disasm_vaddr_rng); + DASM_Handle dasm_handle = dasm_handle_from_ctrl_process_range_arch(process->ctrl_machine_id, process->ctrl_handle, disasm_vaddr_rng, process->arch); return dasm_handle; } @@ -2710,11 +2710,9 @@ df_debug_info_path_from_module(Arena *arena, DF_Entity *module) } else { - Temp scratch = scratch_begin(&arena, 1); String8 exe_path = module->name; - String8 dbg_path = ctrl_og_dbg_path_from_exe_path(arena, exe_path); + String8 dbg_path = push_str8f(arena, "%S.pdb", str8_chop_last_dot(exe_path)); result = dbg_path; - scratch_end(scratch); } ProfEnd(); return result; @@ -2830,8 +2828,8 @@ df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; { Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - machine_code.str = push_array_no_zero(scratch.arena, U8, max_instruction_size_from_arch(arch)); - machine_code.size = ctrl_process_read(process->ctrl_machine_id, process->ctrl_handle, rng, machine_code.str); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, rng, max_U64); + machine_code = machine_code_slice.data; } // rjf: build traps if machine code was read successfully @@ -2897,8 +2895,8 @@ df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; if(good_line_info) { - machine_code.str = push_array_no_zero(scratch.arena, U8, dim_1u64(line_vaddr_rng)); - machine_code.size = ctrl_process_read(process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, machine_code.str); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, max_U64); + machine_code = machine_code_slice.data; } // rjf: machine code => ctrl flow analysis @@ -3022,8 +3020,8 @@ df_trap_net_from_thread__step_into_line(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; if(good_line_info) { - machine_code.str = push_array_no_zero(scratch.arena, U8, dim_1u64(line_vaddr_rng)); - machine_code.size = ctrl_process_read(process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, machine_code.str); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, max_U64); + machine_code = machine_code_slice.data; } // rjf: machine code => ctrl flow analysis @@ -3581,10 +3579,10 @@ df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 //- rjf: read module's TLS index U64 tls_index = 0; { - U64 bytes_read = ctrl_process_read(process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, &tls_index); - if(bytes_read < sizeof(U64)) + CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, max_U64); + if(tls_index_slice.data.size >= addr_size) { - tls_index = 0; + tls_index = *(U64 *)tls_index_slice.data.str; } } @@ -3658,14 +3656,14 @@ internal CTRL_Unwind df_push_unwind_from_thread(Arena *arena, DF_Entity *thread) { DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - CTRL_Unwind unwind = ctrl_unwind_from_process_thread(arena, thread->ctrl_machine_id, process->ctrl_handle, thread->ctrl_handle); + CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, thread->ctrl_machine_id, thread->ctrl_handle, 0); return unwind; } internal U64 df_rip_from_thread(DF_Entity *thread) { - U64 result = ctrl_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); + U64 result = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); return result; } @@ -3718,7 +3716,10 @@ df_push_member_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity * internal B32 df_set_thread_rip(DF_Entity *thread, U64 vaddr) { - B32 result = ctrl_thread_write_rip(thread->ctrl_machine_id, thread->ctrl_handle, vaddr); + Temp scratch = scratch_begin(0, 0); + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, thread->ctrl_machine_id, thread->ctrl_handle, max_U64); + regs_arch_block_write_rip(thread->arch, block, vaddr); + B32 result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, block); // rjf: early mutation of unwind cache for immediate frontend effect if(result) @@ -3738,6 +3739,7 @@ df_set_thread_rip(DF_Entity *thread, U64 vaddr) } } + scratch_end(scratch); return result; } @@ -4134,7 +4136,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ //- rjf: unpack arguments DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - U64 tls_root_vaddr = ctrl_tls_root_vaddr_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); + U64 tls_root_vaddr = ctrl_query_cached_tls_root_vaddr_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); DF_Entity *process = thread->parent; U64 unwind_count = ctrl_ctx->unwind_count; CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index a93de0d0..d7fa44bb 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -240,9 +240,9 @@ df_process_info_list_from_query(Arena *arena, String8 query) //- rjf: build list DF_ProcessInfoList list = {0}; { - DEMON_ProcessIter iter = {0}; - demon_proc_iter_begin(&iter); - for(DEMON_ProcessInfo info = {0}; demon_proc_iter_next(scratch.arena, &iter, &info);) + DMN_ProcessIter iter = {0}; + dmn_process_iter_begin(&iter); + for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &iter, &info);) { // rjf: skip root-level or otherwise 0-pid processes if(info.pid == 0) @@ -290,7 +290,7 @@ df_process_info_list_from_query(Arena *arena, String8 query) list.count += 1; } } - demon_proc_iter_end(&iter); + dmn_process_iter_end(&iter); } scratch_end(scratch); @@ -7552,8 +7552,9 @@ DF_VIEW_CMD_FUNCTION_DEF(Memory) DF_VIEW_UI_FUNCTION_DEF(Memory) { - Temp scratch = scratch_begin(0, 0); ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); ////////////////////////////// //- rjf: unpack state @@ -7766,8 +7767,8 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) // rjf: try to read new memory for this range U64 bytes_to_read = dim_1u64(chunk_aligned_range_bytes); U8 *buffer = push_array_no_zero(scratch.arena, U8, bytes_to_read); - U64 half1_bytes_read = ctrl_process_read(process->ctrl_machine_id, process->ctrl_handle, r1u64(chunk_aligned_range_bytes.min, chunk_aligned_range_bytes.min+bytes_to_read/2), buffer+0); - U64 half2_bytes_read = ctrl_process_read(process->ctrl_machine_id, process->ctrl_handle, r1u64(chunk_aligned_range_bytes.min+bytes_to_read/2, chunk_aligned_range_bytes.max), buffer+bytes_to_read/2); + U64 half1_bytes_read = dmn_process_read(process->ctrl_handle, r1u64(chunk_aligned_range_bytes.min, chunk_aligned_range_bytes.min+bytes_to_read/2), buffer+0); + U64 half2_bytes_read = dmn_process_read(process->ctrl_handle, r1u64(chunk_aligned_range_bytes.min+bytes_to_read/2, chunk_aligned_range_bytes.max), buffer+bytes_to_read/2); // rjf: worked? -> clear cache & store if(half1_bytes_read+half2_bytes_read >= bytes_to_read) @@ -8340,6 +8341,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) } } + hs_scope_close(hs_scope); scratch_end(scratch); ProfEnd(); } diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index b32c90a0..064609d8 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -144,7 +144,7 @@ struct DF_EntityListerItemArray typedef struct DF_ProcessInfo DF_ProcessInfo; struct DF_ProcessInfo { - DEMON_ProcessInfo info; + DMN_ProcessInfo info; B32 is_attached; FuzzyMatchRangeList attached_match_ranges; FuzzyMatchRangeList name_match_ranges; diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 24565311..827a4c01 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -43,7 +43,7 @@ #include "regs/raddbgi/regs_raddbgi.h" #include "type_graph/type_graph.h" #include "dbgi/dbgi.h" -#include "demon/demon_inc.h" +#include "demon2/demon2_inc.h" #include "eval/eval_inc.h" #include "unwind/unwind.h" #include "ctrl/ctrl_inc.h" @@ -81,7 +81,7 @@ #include "regs/raddbgi/regs_raddbgi.c" #include "type_graph/type_graph.c" #include "dbgi/dbgi.c" -#include "demon/demon_inc.c" +#include "demon2/demon2_inc.c" #include "eval/eval_inc.c" #include "unwind/unwind.c" #include "ctrl/ctrl_inc.c" From d1e88f781e5102654946ef3231cbc52b06e30dab Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 14:20:24 -0700 Subject: [PATCH 173/275] tweak ctrl entity building to be bucketed per 'entity store' - we can now have multiple 'entity stores', one on the frontend thread, one on the ctrl thread, and keep them in sync at specific points via event lists --- src/ctrl/ctrl_core.c | 421 +++++++++++++++++++++++++----------------- src/ctrl/ctrl_core.h | 47 +++-- src/df/core/df_core.c | 4 +- src/df/core/df_core.h | 1 + 4 files changed, 282 insertions(+), 191 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index cd951f07..44f6eaec 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -460,6 +460,233 @@ ctrl_event_from_serialized_string(Arena *arena, String8 string) return event; } +//////////////////////////////// +//~ rjf: Entity Type Functions + +//- rjf: cache creation/destruction + +internal CTRL_EntityStore * +ctrl_entity_store_alloc(void) +{ + Arena *arena = arena_alloc(); + CTRL_EntityStore *store = push_array(arena, CTRL_EntityStore, 1); + store->arena = arena; + return store; +} + +internal void +ctrl_entity_store_release(CTRL_EntityStore *cache) +{ + arena_release(cache->arena); +} + +//- rjf: entity construction/deletion + +internal CTRL_Entity * +ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + { + // rjf: allocate + entity = store->free; + { + if(entity != 0) + { + SLLStackPop(store->free); + } + else + { + entity = push_array_no_zero(store->arena, CTRL_Entity, 1); + } + MemoryZeroStruct(entity); + } + + // rjf: fill + { + entity->kind = kind; + entity->machine_id = machine_id; + entity->handle = handle; + entity->parent = parent; + entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; + if(parent != &ctrl_entity_nil) + { + DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); + } + } + + // rjf: insert into hash map + { + U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); + U64 slot_idx = hash%store->hash_slots_count; + CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) + { + node = n; + break; + } + } + if(node == 0) + { + node = store->hash_node_free; + if(node != 0) + { + SLLStackPop(store->hash_node_free); + } + else + { + node = push_array_no_zero(store->arena, CTRL_EntityHashNode, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->entity = entity; + } + } + } + return entity; +} + +internal void +ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity) +{ + // rjf: unhook root + if(entity->parent != &ctrl_entity_nil) + { + DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + } + + // rjf: walk every entity in this tree, free each + if(entity != &ctrl_entity_nil) + { + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + CTRL_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *t = first_task; t != 0; t = t->next) + { + for(CTRL_Entity *child = entity->first; child != &ctrl_entity_nil; child = child->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + + // rjf: free entity + SLLStackPush(store->free, t->e); + + // rjf: remove from hash map + { + U64 hash = ctrl_hash_from_machine_id_handle(t->e->machine_id, t->e->handle); + U64 slot_idx = hash%store->hash_slots_count; + CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->machine_id == t->e->machine_id && dmn_handle_match(n->entity->handle, t->e->handle)) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(store->hash_node_free, n); + break; + } + } + } + } + scratch_end(scratch); + } +} + +//- rjf: entity store lookups + +internal CTRL_Entity * +ctrl_entity_from_machine_id_handle(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle handle) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + { + U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); + U64 slot_idx = hash%store->hash_slots_count; + CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) + { + entity = n->entity; + break; + } + } + } + return entity; +} + +//- rjf: applying events to entity caches + +internal void +ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) +{ + //- rjf: construct root-level entities + if(!store->root) + { + CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, 0, dmn_handle_zero()); + CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, CTRL_MachineID_Local, dmn_handle_zero()); + (void)local_machine; + } + + //- rjf: scan events & construct entities + for(CTRL_EventNode *n = list->first; n != 0; n = n->next) + { + CTRL_Event *event = &n->v; + switch(event->kind) + { + //- rjf: processes + case CTRL_EventKind_NewProc: + { + CTRL_Entity *machine = ctrl_entity_from_machine_id_handle(store, event->machine_id, dmn_handle_zero()); + CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->machine_id, event->entity); + process->arch = event->arch; + }break; + case CTRL_EventKind_EndProc: + { + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); + ctrl_entity_release(store, process); + }break; + + //- rjf: threads + case CTRL_EventKind_NewThread: + { + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); + CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->machine_id, event->entity); + thread->arch = event->arch; + }break; + case CTRL_EventKind_EndThread: + { + CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); + ctrl_entity_release(store, thread); + }break; + + //- rjf: modules + case CTRL_EventKind_NewModule: + { + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); + CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->machine_id, event->entity); + module->arch = event->arch; + }break; + case CTRL_EventKind_EndModule: + { + CTRL_Entity *module = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); + ctrl_entity_release(store, module); + }break; + } + } +} + //////////////////////////////// //~ rjf: Main Layer Initialization @@ -504,11 +731,7 @@ ctrl_init(void) ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); } - ctrl_state->entity_rw_mutex = os_rw_mutex_alloc(); - ctrl_state->entity_arena = arena_alloc(); - ctrl_state->entity_root = &ctrl_entity_nil; - ctrl_state->entity_hash_slots_count = 4096; - ctrl_state->entity_hash_slots = push_array(arena, CTRL_EntityHashSlot, ctrl_state->entity_hash_slots_count); + ctrl_state->ctrl_thread_entity_store = ctrl_entity_store_alloc(); ctrl_state->u2c_ring_size = KB(64); ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); ctrl_state->u2c_ring_mutex = os_mutex_alloc(); @@ -925,24 +1148,28 @@ ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, internal void * ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us) { + // TODO(rjf) return 0; } internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) { + // TODO(rjf) return 0; } internal U64 ctrl_query_cached_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) { + // TODO(rjf) return 0; } internal U64 ctrl_query_cached_rsp_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) { + // TODO(rjf) return 0; } @@ -960,12 +1187,12 @@ ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void * //~ rjf: Unwinding Functions internal CTRL_Unwind -ctrl_unwind_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us) +ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); DBGI_Scope *scope = dbgi_scope_open(); - CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(machine_id, thread); + CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); CTRL_Entity *process_entity = thread_entity->parent; Architecture arch = thread_entity->arch; U64 arch_reg_block_size = regs_block_size_from_architecture(arch); @@ -1125,29 +1352,6 @@ ctrl_string2alias_from_arch(Architecture arch) return &ctrl_state->arch_string2alias_tables[arch]; } -//- rjf: entity state reading - -internal CTRL_Entity * -ctrl_entity_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle) -{ - CTRL_Entity *entity = &ctrl_entity_nil; - { - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); - U64 slot_idx = hash%ctrl_state->entity_hash_slots_count; - CTRL_EntityHashSlot *slot = &ctrl_state->entity_hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) - { - entity = n->entity; - break; - } - } - } - return entity; -} - //////////////////////////////// //~ rjf: Control-Thread Functions @@ -1220,6 +1424,7 @@ ctrl_c2u_push_events(CTRL_EventList *events) { if(events->count != 0) ProfScope("ctrl_c2u_push_events") { + ctrl_entity_store_apply_events(ctrl_state->ctrl_thread_entity_store, events); for(CTRL_EventNode *n = events->first; n != 0; n = n ->next) { Temp scratch = scratch_begin(0, 0); @@ -1281,133 +1486,6 @@ ctrl_c2u_pop_events(Arena *arena) return events; } -//- rjf: entity tree construction - -internal CTRL_Entity * -ctrl_thread__entity_alloc(CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle) -{ - CTRL_Entity *entity = &ctrl_entity_nil; - OS_MutexScopeW(ctrl_state->entity_rw_mutex) - { - // rjf: allocate - entity = ctrl_state->entity_free; - { - if(entity != 0) - { - SLLStackPop(ctrl_state->entity_free); - } - else - { - entity = push_array_no_zero(ctrl_state->entity_arena, CTRL_Entity, 1); - } - MemoryZeroStruct(entity); - } - - // rjf: fill - { - entity->kind = kind; - entity->machine_id = machine_id; - entity->handle = handle; - entity->parent = parent; - entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; - if(parent != &ctrl_entity_nil) - { - DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); - } - } - - // rjf: insert into hash map - { - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); - U64 slot_idx = hash%ctrl_state->entity_hash_slots_count; - CTRL_EntityHashSlot *slot = &ctrl_state->entity_hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) - { - node = n; - break; - } - } - if(node == 0) - { - node = ctrl_state->entity_hash_node_free; - if(node != 0) - { - SLLStackPop(ctrl_state->entity_hash_node_free); - } - else - { - node = push_array_no_zero(ctrl_state->entity_arena, CTRL_EntityHashNode, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->entity = entity; - } - } - } - return entity; -} - -internal void -ctrl_thread__entity_release(CTRL_Entity *entity) -{ - OS_MutexScopeW(ctrl_state->entity_rw_mutex) - { - // rjf: unhook root - if(entity->parent != &ctrl_entity_nil) - { - DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); - } - - // rjf: walk every entity in this tree, free each - if(entity != &ctrl_entity_nil) - { - Temp scratch = scratch_begin(0, 0); - typedef struct Task Task; - struct Task - { - Task *next; - CTRL_Entity *e; - }; - Task start_task = {0, entity}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *t = first_task; t != 0; t = t->next) - { - for(CTRL_Entity *child = entity->first; child != &ctrl_entity_nil; child = child->next) - { - Task *t = push_array(scratch.arena, Task, 1); - t->e = child; - SLLQueuePush(first_task, last_task, t); - } - - // rjf: free entity - SLLStackPush(ctrl_state->entity_free, t->e); - - // rjf: remove from hash map - { - U64 hash = ctrl_hash_from_machine_id_handle(t->e->machine_id, t->e->handle); - U64 slot_idx = hash%ctrl_state->entity_hash_slots_count; - CTRL_EntityHashSlot *slot = &ctrl_state->entity_hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->machine_id == t->e->machine_id && dmn_handle_match(n->entity->handle, t->e->handle)) - { - DLLRemove(slot->first, slot->last, n); - SLLStackPush(ctrl_state->entity_hash_node_free, n); - break; - } - } - } - } - scratch_end(scratch); - } - } -} - //- rjf: entry point internal void @@ -1416,13 +1494,6 @@ ctrl_thread__entry_point(void *p) ThreadNameF("[ctrl] thread"); ProfBeginFunction(); - //- rjf: set up initial entities - { - CTRL_Entity *root = ctrl_thread__entity_alloc(&ctrl_entity_nil, CTRL_EntityKind_Root, 0, dmn_handle_zero()); - CTRL_Entity *local_machine = ctrl_thread__entity_alloc(root, CTRL_EntityKind_Machine, CTRL_MachineID_Local, dmn_handle_zero()); - (void)local_machine; - } - //- rjf: loop Temp scratch = scratch_begin(0, 0); for(;;) @@ -1479,7 +1550,7 @@ ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID m { Temp scratch = scratch_begin(&arena, 1); DBGI_Scope *scope = dbgi_scope_open(); - CTRL_Entity *module_entity = ctrl_entity_from_machine_id_handle(machine_id, module); + CTRL_Entity *module_entity = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, machine_id, module); String8 exe_path = module_entity->name; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; @@ -1651,7 +1722,7 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) { DBGI_Scope *scope = dbgi_scope_open(); - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, ev->process); + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, ev->process); CTRL_Entity *module = process->first; if(module != &ctrl_entity_nil) { @@ -1735,7 +1806,7 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls U64 size_of_spoof = 0; if(do_spoof) ProfScope("prep spoof") { - CTRL_Entity *spoof_process = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, spoof->process); + CTRL_Entity *spoof_process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->process); Architecture arch = spoof_process->arch; size_of_spoof = bit_size_from_arch(arch)/8; dmn_process_read(spoof_process->handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); @@ -1788,7 +1859,7 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls // simply been sent other debug events first if(spoof != 0) { - CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, spoof->thread); + CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->thread); Architecture arch = thread->arch; void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_architecture(arch)); dmn_thread_read_reg_block(spoof->thread, regs_block); @@ -2165,7 +2236,7 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) for(U64 process_idx = 0; process_idx < run_ctrls.run_entity_count; process_idx += 1) { //- rjf: unpack process & first module info - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, run_ctrls.run_entities[process_idx]); + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, run_ctrls.run_entities[process_idx]); CTRL_Entity *module = process->first; U64 module_base_vaddr = module->vaddr_range.min; String8 exe_path = module->name; @@ -2535,7 +2606,9 @@ ctrl_thread__run(CTRL_Msg *msg) //- rjf: gather all initial breakpoints // DMN_TrapChunkList user_traps = {0}; - for(CTRL_Entity *machine = ctrl_state->entity_root->first; machine != &ctrl_entity_nil; machine = machine->next) + for(CTRL_Entity *machine = ctrl_state->ctrl_thread_entity_store->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) { if(machine->kind != CTRL_EntityKind_Machine) { continue; } for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) @@ -2571,7 +2644,9 @@ ctrl_thread__run(CTRL_Msg *msg) { // rjf: gather stuck threads DMN_HandleList stuck_threads = {0}; - for(CTRL_Entity *machine = ctrl_state->entity_root->first; machine != &ctrl_entity_nil; machine = machine->next) + for(CTRL_Entity *machine = ctrl_state->ctrl_thread_entity_store->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) { if(machine->kind != CTRL_EntityKind_Machine) { continue; } for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) @@ -2783,7 +2858,7 @@ ctrl_thread__run(CTRL_Msg *msg) ////////////////////////// //- rjf: unpack info about thread attached to event // - CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, event->thread); + CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->thread); Architecture arch = thread->arch; U64 reg_size = regs_block_size_from_architecture(arch); void *thread_regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, CTRL_MachineID_Local, event->thread, max_U64); @@ -2793,7 +2868,7 @@ ctrl_thread__run(CTRL_Msg *msg) U64 module_base_vaddr = 0; U64 thread_rip_voff = 0; { - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(CTRL_MachineID_Local, event->thread); + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) { if(contains_1u64(module->vaddr_range, thread_rip_vaddr)) diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index e4bd7653..9ef1c66a 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -83,6 +83,17 @@ struct CTRL_EntityHashSlot CTRL_EntityHashNode *last; }; +typedef struct CTRL_EntityStore CTRL_EntityStore; +struct CTRL_EntityStore +{ + Arena *arena; + CTRL_Entity *root; + CTRL_Entity *free; + CTRL_EntityHashSlot *hash_slots; + CTRL_EntityHashNode *hash_node_free; + U64 hash_slots_count; +}; + //////////////////////////////// //~ rjf: Unwind Types @@ -473,15 +484,6 @@ struct CTRL_State CTRL_ProcessMemoryCache process_memory_cache; CTRL_ThreadRegCache thread_reg_cache; - // rjf: entity tree - OS_Handle entity_rw_mutex; - Arena *entity_arena; - CTRL_Entity *entity_root; - CTRL_Entity *entity_free; - CTRL_EntityHashSlot *entity_hash_slots; - CTRL_EntityHashNode *entity_hash_node_free; - U64 entity_hash_slots_count; - // rjf: user -> ctrl msg ring buffer U64 u2c_ring_size; U8 *u2c_ring_base; @@ -500,6 +502,7 @@ struct CTRL_State // rjf: ctrl thread state OS_Handle ctrl_thread; + CTRL_EntityStore *ctrl_thread_entity_store; Arena *dmn_event_arena; DMN_EventNode *first_dmn_event_node; DMN_EventNode *last_dmn_event_node; @@ -585,6 +588,23 @@ internal void ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventLis internal String8 ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event); internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); +//////////////////////////////// +//~ rjf: Entity Type Functions + +//- rjf: cache creation/destruction +internal CTRL_EntityStore *ctrl_entity_store_alloc(void); +internal void ctrl_entity_store_release(CTRL_EntityStore *cache); + +//- rjf: entity construction/deletion +internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle); +internal void ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity); + +//- rjf: entity store lookups +internal CTRL_Entity *ctrl_entity_from_machine_id_handle(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle handle); + +//- rjf: applying events to entity caches +internal void ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list); + //////////////////////////////// //~ rjf: Main Layer Initialization @@ -624,7 +644,7 @@ internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle t //////////////////////////////// //~ rjf: Unwinding Functions -internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us); +internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us); //////////////////////////////// //~ rjf: Halting All Attached Processes @@ -643,9 +663,6 @@ internal U64 ctrl_reggen_idx(void); internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); internal EVAL_String2NumMap *ctrl_string2alias_from_arch(Architecture arch); -//- rjf: entity state reading -internal CTRL_Entity *ctrl_entity_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle); - //////////////////////////////// //~ rjf: Control-Thread Functions @@ -657,10 +674,6 @@ internal CTRL_MsgList ctrl_u2c_pop_msgs(Arena *arena); internal void ctrl_c2u_push_events(CTRL_EventList *events); internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); -//- rjf: entity tree construction -internal CTRL_Entity *ctrl_thread__entity_alloc(CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle); -internal void ctrl_thread__entity_release(CTRL_Entity *entity); - //- rjf: entry point internal void ctrl_thread__entry_point(void *p); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 8ef806e3..b73595c3 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3656,7 +3656,7 @@ internal CTRL_Unwind df_push_unwind_from_thread(Arena *arena, DF_Entity *thread) { DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, thread->ctrl_machine_id, thread->ctrl_handle, 0); + CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, 0); return unwind; } @@ -6398,6 +6398,7 @@ df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) df_state->entities_base = push_array(df_state->entities_arena, DF_Entity, 0); df_state->entities_count = 0; df_state->ctrl_msg_arena = arena_alloc(); + df_state->ctrl_entity_store = ctrl_entity_store_alloc(); df_state->ctrl_stop_arena = arena_alloc(); df_state->entities_root = df_entity_alloc(0, &df_g_nil_entity, DF_EntityKind_Root); df_state->cmd_spec_table_size = 1024; @@ -6549,6 +6550,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) //- rjf: consume & process events CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); + ctrl_entity_store_apply_events(df_state->ctrl_entity_store, &events); for(CTRL_EventNode *event_n = events.first; event_n != 0; event_n = event_n->next) { CTRL_Event *event = &event_n->v; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 5edc70ae..1192d43d 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1179,6 +1179,7 @@ struct DF_State B32 ctrl_solo_stepping_mode; // rjf: control thread ctrl -> user reading state + CTRL_EntityStore *ctrl_entity_store; Arena *ctrl_stop_arena; CTRL_Event ctrl_last_stop_event; From 8639faabdde8c0a148a936f29864a09e46328405 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 14:56:02 -0700 Subject: [PATCH 174/275] ctrl entity string allocation & tracking, for thread names & module names; fix process memory cache in edge cases --- src/ctrl/ctrl_core.c | 171 ++++++++++++++++++++++----- src/ctrl/ctrl_core.h | 21 +++- src/demon2/demon2_core.h | 1 + src/demon2/win32/demon2_core_win32.c | 7 ++ 4 files changed, 165 insertions(+), 35 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 44f6eaec..75abeeba 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -471,6 +471,8 @@ ctrl_entity_store_alloc(void) Arena *arena = arena_alloc(); CTRL_EntityStore *store = push_array(arena, CTRL_EntityStore, 1); store->arena = arena; + store->hash_slots_count = 1024; + store->hash_slots = push_array(arena, CTRL_EntityHashSlot, store->hash_slots_count); return store; } @@ -480,10 +482,101 @@ ctrl_entity_store_release(CTRL_EntityStore *cache) arena_release(cache->arena); } +internal U64 +ctrl_name_bucket_idx_from_string_size(U64 size) +{ + U64 size_rounded = u64_up_to_pow2(size+1); + size_rounded = ClampBot((1<<4), size_rounded); + U64 bucket_idx = 0; + switch(size_rounded) + { + case 1<<4: {bucket_idx = 0;}break; + case 1<<5: {bucket_idx = 1;}break; + case 1<<6: {bucket_idx = 2;}break; + case 1<<7: {bucket_idx = 3;}break; + case 1<<8: {bucket_idx = 4;}break; + case 1<<9: {bucket_idx = 5;}break; + case 1<<10:{bucket_idx = 6;}break; + default:{bucket_idx = ArrayCount(((CTRL_EntityStore *)0)->free_string_chunks)-1;}break; + } + return bucket_idx; +} + +internal String8 +ctrl_entity_string_alloc(CTRL_EntityStore *store, String8 string) +{ + if(string.size == 0) {return str8_zero();} + U64 bucket_idx = ctrl_name_bucket_idx_from_string_size(string.size); + CTRL_EntityStringChunkNode *node = store->free_string_chunks[bucket_idx]; + + // rjf: pull from bucket free list + if(node != 0) + { + if(bucket_idx == ArrayCount(store->free_string_chunks)-1) + { + node = 0; + CTRL_EntityStringChunkNode *prev = 0; + for(CTRL_EntityStringChunkNode *n = store->free_string_chunks[bucket_idx]; + n != 0; + prev = n, n = n->next) + { + if(n->size >= string.size+1) + { + if(prev == 0) + { + store->free_string_chunks[bucket_idx] = n->next; + } + else + { + prev->next = n->next; + } + node = n; + break; + } + } + } + else + { + SLLStackPop(store->free_string_chunks[bucket_idx]); + } + } + + // rjf: no found node -> allocate new + if(node == 0) + { + U64 chunk_size = 0; + if(bucket_idx < ArrayCount(store->free_string_chunks)-1) + { + chunk_size = 1<<(bucket_idx+4); + } + else + { + chunk_size = u64_up_to_pow2(string.size); + } + U8 *chunk_memory = push_array(store->arena, U8, chunk_size); + node = (CTRL_EntityStringChunkNode *)chunk_memory; + } + + // rjf: fill string & return + String8 allocated_string = str8((U8 *)node, string.size); + MemoryCopy((U8 *)node, string.str, string.size); + return allocated_string; +} + +internal void +ctrl_entity_string_release(CTRL_EntityStore *store, String8 string) +{ + if(string.size == 0) {return;} + U64 bucket_idx = ctrl_name_bucket_idx_from_string_size(string.size); + CTRL_EntityStringChunkNode *node = (CTRL_EntityStringChunkNode *)string.str; + node->size = u64_up_to_pow2(string.size); + SLLStackPush(store->free_string_chunks[bucket_idx], node); +} + //- rjf: entity construction/deletion internal CTRL_Entity * -ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle) +ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle) { CTRL_Entity *entity = &ctrl_entity_nil; { @@ -504,6 +597,7 @@ ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind // rjf: fill { entity->kind = kind; + entity->arch = arch; entity->machine_id = machine_id; entity->handle = handle; entity->parent = parent; @@ -603,6 +697,18 @@ ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity) } } +//- rjf: entity equipment + +internal void +ctrl_entity_equip_string(CTRL_EntityStore *store, CTRL_Entity *entity, String8 string) +{ + if(entity->string.size != 0) + { + ctrl_entity_string_release(store, entity->string); + } + entity->string = ctrl_entity_string_alloc(store, string); +} + //- rjf: entity store lookups internal CTRL_Entity * @@ -634,8 +740,8 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) //- rjf: construct root-level entities if(!store->root) { - CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, 0, dmn_handle_zero()); - CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, CTRL_MachineID_Local, dmn_handle_zero()); + CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Architecture_Null, 0, dmn_handle_zero()); + CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, architecture_from_context(), CTRL_MachineID_Local, dmn_handle_zero()); (void)local_machine; } @@ -649,8 +755,7 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) case CTRL_EventKind_NewProc: { CTRL_Entity *machine = ctrl_entity_from_machine_id_handle(store, event->machine_id, dmn_handle_zero()); - CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->machine_id, event->entity); - process->arch = event->arch; + CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->machine_id, event->entity); }break; case CTRL_EventKind_EndProc: { @@ -662,21 +767,25 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) case CTRL_EventKind_NewThread: { CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); - CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->machine_id, event->entity); - thread->arch = event->arch; + CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->machine_id, event->entity); }break; case CTRL_EventKind_EndThread: { CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); ctrl_entity_release(store, thread); }break; + case CTRL_EventKind_ThreadName: + { + CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); + ctrl_entity_equip_string(store, thread, event->string); + }break; //- rjf: modules case CTRL_EventKind_NewModule: { CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); - CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->machine_id, event->entity); - module->arch = event->arch; + CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->machine_id, event->entity); + ctrl_entity_equip_string(store, module, event->string); }break; case CTRL_EventKind_EndModule: { @@ -811,31 +920,23 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle B32 is_stale = 0; OS_MutexScopeR(process_stripe->rw_mutex) { - for(;;) + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { - for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) { - if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + U64 range_slot_idx = range_hash%n->range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; + for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) { - U64 range_slot_idx = range_hash%n->range_hash_slots_count; - CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; - for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) + if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) { - if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) - { - result = range_n->hash; - is_good = 1; - is_stale = range_n->memgen_idx < ctrl_memgen_idx(); - goto read_cache__break_all; - } + result = range_n->hash; + is_good = 1; + is_stale = (range_n->memgen_idx < ctrl_memgen_idx()); + goto read_cache__break_all; } } } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait_rw_r(process_stripe->cv, process_stripe->rw_mutex, endt_us); } read_cache__break_all:; } @@ -918,6 +1019,12 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle { break; } + + //- rjf: done? -> exit + if(is_good && !is_stale) + { + break; + } } return result; } @@ -1245,7 +1352,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma if(contains_1u64(m->vaddr_range, rip)) { module = m->handle; - module_name = m->name; + module_name = m->string; module_vaddr_range = m->vaddr_range; break; } @@ -1551,7 +1658,7 @@ ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID m Temp scratch = scratch_begin(&arena, 1); DBGI_Scope *scope = dbgi_scope_open(); CTRL_Entity *module_entity = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, machine_id, module); - String8 exe_path = module_entity->name; + String8 exe_path = module_entity->string; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; U64 base_vaddr = module_entity->vaddr_range.min; @@ -1729,7 +1836,7 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls // rjf: determine base address of asan shadow space U64 asan_shadow_base_vaddr = 0; B32 asan_shadow_variable_exists_but_is_zero = 0; - String8 module_path = module->name; + String8 module_path = module->string; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_GlobalVariables); @@ -2239,7 +2346,7 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, run_ctrls.run_entities[process_idx]); CTRL_Entity *module = process->first; U64 module_base_vaddr = module->vaddr_range.min; - String8 exe_path = module->name; + String8 exe_path = module->string; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); RDI_Parsed *rdi = &dbgi->rdi; RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); @@ -2873,7 +2980,7 @@ ctrl_thread__run(CTRL_Msg *msg) { if(contains_1u64(module->vaddr_range, thread_rip_vaddr)) { - module_name = module->name; + module_name = module->string; module_base_vaddr = module->vaddr_range.min; thread_rip_voff = thread_rip_vaddr - module->vaddr_range.min; break; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 9ef1c66a..e7ce56e9 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -65,7 +65,7 @@ struct CTRL_Entity CTRL_MachineID machine_id; DMN_Handle handle; Rng1U64 vaddr_range; - String8 name; + String8 string; }; typedef struct CTRL_EntityHashNode CTRL_EntityHashNode; @@ -83,6 +83,13 @@ struct CTRL_EntityHashSlot CTRL_EntityHashNode *last; }; +typedef struct CTRL_EntityStringChunkNode CTRL_EntityStringChunkNode; +struct CTRL_EntityStringChunkNode +{ + CTRL_EntityStringChunkNode *next; + U64 size; +}; + typedef struct CTRL_EntityStore CTRL_EntityStore; struct CTRL_EntityStore { @@ -92,6 +99,7 @@ struct CTRL_EntityStore CTRL_EntityHashSlot *hash_slots; CTRL_EntityHashNode *hash_node_free; U64 hash_slots_count; + CTRL_EntityStringChunkNode *free_string_chunks[8]; }; //////////////////////////////// @@ -593,12 +601,19 @@ internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 stri //- rjf: cache creation/destruction internal CTRL_EntityStore *ctrl_entity_store_alloc(void); -internal void ctrl_entity_store_release(CTRL_EntityStore *cache); +internal void ctrl_entity_store_release(CTRL_EntityStore *store); + +//- rjf: string allocation/deletion +internal String8 ctrl_entity_string_alloc(CTRL_EntityStore *store, String8 string); +internal void ctrl_entity_string_release(CTRL_EntityStore *store, String8 string); //- rjf: entity construction/deletion -internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, CTRL_MachineID machine_id, DMN_Handle handle); +internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle); internal void ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity); +//- rjf: entity equipment +internal void ctrl_entity_equip_string(CTRL_EntityStore *store, CTRL_Entity *entity, String8 string); + //- rjf: entity store lookups internal CTRL_Entity *ctrl_entity_from_machine_id_handle(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle handle); diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index 5cff7a56..cc202c5d 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -189,6 +189,7 @@ internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); #define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) //- rjf: threads +internal Architecture dmn_arch_from_thread(DMN_Handle handle); internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index afee68fa..c06d2b45 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -2333,6 +2333,13 @@ dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) //- rjf: threads +internal Architecture +dmn_arch_from_thread(DMN_Handle handle) +{ + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + return entity->arch; +} + internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle) { From 871419de3907903f2da9eb78cb51596357ee694b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 15:49:36 -0700 Subject: [PATCH 175/275] bugfixes in new demon layer; adjust retry mechanism in process memory cache query; ui fixes --- src/ctrl/ctrl_core.c | 26 ++++++++++++++++++++++++-- src/ctrl/ctrl_core.h | 1 + src/demon2/win32/demon2_core_win32.c | 6 +++--- src/df/core/df_core.c | 12 ++++++------ src/ui/ui_core.c | 3 ++- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 75abeeba..a0444c90 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -970,6 +970,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle } //- rjf: not good -> create range node if necessary + U64 last_time_requested_us = 0; if(!is_good) { OS_MutexScopeW(process_stripe->rw_mutex) @@ -985,6 +986,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle { if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) { + last_time_requested_us = range_n->last_time_requested_us; range_node_exists = 1; break; } @@ -1009,9 +1011,29 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle } //- rjf: not good, or is stale -> submit hash request - if(!is_good || is_stale) + if((!is_good || is_stale) && os_now_microseconds() >= last_time_requested_us+10000) { ctrl_u2ms_enqueue_req(machine_id, process, range, zero_terminated, endt_us); + OS_MutexScopeW(process_stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + { + if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + { + U64 range_slot_idx = range_hash%n->range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; + B32 range_node_exists = 0; + for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) + { + if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) + { + range_n->last_time_requested_us = os_now_microseconds(); + break; + } + } + } + } + } } //- rjf: out of time? -> exit @@ -3576,7 +3598,7 @@ ctrl_mem_stream_thread__entry_point(void *p) if(got_task && memgen_idx != preexisting_memgen_idx) { range_size = dim_1u64(vaddr_range_clamped); - U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, KB(64)); + U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, os_page_size()); range_arena = arena_alloc__sized(range_size+ARENA_HEADER_SIZE, range_size+ARENA_HEADER_SIZE); if(range_arena == 0) { diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index e7ce56e9..b33c59d6 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -377,6 +377,7 @@ struct CTRL_ProcessMemoryRangeHashNode Rng1U64 vaddr_range_clamped; U128 hash; U64 memgen_idx; + U64 last_time_requested_us; B32 is_taken; }; diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index c06d2b45..eed84eb6 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -1198,7 +1198,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { //- rjf: scan all processes for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != 0; + process != &dmn_w32_entity_nil; process = process->next) { if(process->kind != DMN_W32_EntityKind_Process) {continue;} @@ -1345,7 +1345,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) DEBUG_EVENT evt = {0}; B32 evt_good = 0; { - B32 resume_good = 0; + B32 resume_good = 1; if(dmn_w32_shared->resume_needed) { dmn_w32_shared->resume_needed = 0; @@ -1987,7 +1987,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { if(process->kind != DMN_W32_EntityKind_Process) { continue; } for(DMN_W32_Entity *thread = process->first; - thread != 0; + thread != &dmn_w32_entity_nil; thread = thread->next) { if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index b73595c3..61008dee 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -2828,7 +2828,7 @@ df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; { Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, rng, max_U64); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, rng, os_now_microseconds()+5000); machine_code = machine_code_slice.data; } @@ -2895,7 +2895,7 @@ df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; if(good_line_info) { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, max_U64); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+5000); machine_code = machine_code_slice.data; } @@ -3020,7 +3020,7 @@ df_trap_net_from_thread__step_into_line(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; if(good_line_info) { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, max_U64); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+5000); machine_code = machine_code_slice.data; } @@ -3579,7 +3579,7 @@ df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 //- rjf: read module's TLS index U64 tls_index = 0; { - CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, max_U64); + CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, os_now_microseconds()+5000); if(tls_index_slice.data.size >= addr_size) { tls_index = *(U64 *)tls_index_slice.data.str; @@ -3592,13 +3592,13 @@ df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 U64 thread_info_addr = root_vaddr; U64 tls_addr_off = tls_index*addr_size; U64 tls_addr_array = 0; - CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0); + CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), os_now_microseconds()+5000); String8 tls_addr_array_data = tls_addr_array_slice.data; if(tls_addr_array_data.size >= 8) { MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); } - CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0); + CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), os_now_microseconds()+5000); String8 result_data = result_slice.data; if(result_data.size >= 8) { diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 863b92a2..714ce9ef 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2635,7 +2635,8 @@ ui_signal_from_box(UI_Box *box) //- rjf: mouse is over this box's rect, no other hot key? -> set hot key, mark hovering // { - if(contains_2f32(rect, ui_state->mouse) && + if(box->flags & UI_BoxFlag_MouseClickable && + contains_2f32(rect, ui_state->mouse) && !contains_2f32(blacklist_rect, ui_state->mouse) && (ui_key_match(ui_state->hot_box_key, ui_key_zero()) || ui_key_match(ui_state->hot_box_key, box->key)) && (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key)) && From ea74f928cd8c9cc8c42c8dee3543cd3f634c5cde Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 15:51:26 -0700 Subject: [PATCH 176/275] fix process memory cache query mechanism when ring buffer is near capacity --- src/ctrl/ctrl_core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index a0444c90..5c4b696a 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1013,8 +1013,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle //- rjf: not good, or is stale -> submit hash request if((!is_good || is_stale) && os_now_microseconds() >= last_time_requested_us+10000) { - ctrl_u2ms_enqueue_req(machine_id, process, range, zero_terminated, endt_us); - OS_MutexScopeW(process_stripe->rw_mutex) + if(ctrl_u2ms_enqueue_req(machine_id, process, range, zero_terminated, endt_us)) OS_MutexScopeW(process_stripe->rw_mutex) { for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { From c417f15912944d1afb0a548be47553975c588726 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 09:05:00 -0700 Subject: [PATCH 177/275] fix task entry points in breakpad converter --- .../raddbgi_breakpad_from_pdb_main.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c b/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c index 35312932..491baf79 100644 --- a/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c +++ b/src/raddbgi_breakpad_from_pdb/raddbgi_breakpad_from_pdb_main.c @@ -61,8 +61,7 @@ struct P2B_BakeUnitVMapOut RDI_U64 vmap_entries_count; }; -internal void * -p2b_bake_unit_vmap_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2b_bake_unit_vmap_task__entry_point) { P2B_BakeUnitVMapIn *in = (P2B_BakeUnitVMapIn *)p; P2B_BakeUnitVMapOut *out = push_array(arena, P2B_BakeUnitVMapOut, 1); @@ -100,8 +99,7 @@ struct P2B_BakeUnitOut RDI_Line *unit_lines; }; -internal void * -p2b_bake_unit_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2b_bake_unit_task__entry_point) { P2B_BakeUnitIn *in = (P2B_BakeUnitIn *)p; P2B_BakeUnitOut *out = push_array(arena, P2B_BakeUnitOut, 1); @@ -138,8 +136,7 @@ struct P2B_DumpProcChunkIn RDIM_SymbolChunkNode *chunk; }; -internal void * -p2b_dump_proc_chunk_task__entry_point(Arena *arena, void *p) +internal TS_TASK_FUNCTION_DEF(p2b_dump_proc_chunk_task__entry_point) { P2B_DumpProcChunkIn *in = (P2B_DumpProcChunkIn *)p; String8List *out = push_array(arena, String8List, 1); From 936c6149e309b2e56731e92d8e0635467a79c632 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 16:35:43 -0700 Subject: [PATCH 178/275] remove timeout on thread register cache accessor --- src/ctrl/ctrl_core.c | 6 +++--- src/ctrl/ctrl_core.h | 2 +- src/df/core/df_core.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 5c4b696a..d6c8df1c 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1274,7 +1274,7 @@ ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, //- rjf: thread register cache reading internal void * -ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us) +ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread) { // TODO(rjf) return 0; @@ -1332,7 +1332,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma case Architecture_x64: { // rjf: grab initial register block - void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread, endt_us); + void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread); // rjf: grab initial memory view B32 stack_memview_good = 0; @@ -2989,7 +2989,7 @@ ctrl_thread__run(CTRL_Msg *msg) CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->thread); Architecture arch = thread->arch; U64 reg_size = regs_block_size_from_architecture(arch); - void *thread_regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, CTRL_MachineID_Local, event->thread, max_U64); + void *thread_regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, CTRL_MachineID_Local, event->thread); U64 thread_rip_vaddr = regs_rip_from_arch_block(arch, thread_regs_block); DMN_Handle module = {0}; String8 module_name = {0}; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index b33c59d6..59c72af2 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -649,7 +649,7 @@ internal B32 ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, R //~ rjf: Thread Register Functions //- rjf: thread register cache reading -internal void *ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us); +internal void *ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread); internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); internal U64 ctrl_query_cached_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); internal U64 ctrl_query_cached_rsp_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 61008dee..496fad24 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3717,7 +3717,7 @@ internal B32 df_set_thread_rip(DF_Entity *thread, U64 vaddr) { Temp scratch = scratch_begin(0, 0); - void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, thread->ctrl_machine_id, thread->ctrl_handle, max_U64); + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, thread->ctrl_machine_id, thread->ctrl_handle); regs_arch_block_write_rip(thread->arch, block, vaddr); B32 result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, block); From 2fff68cfcfcbbd18431ff1b7f81c9c08a759ebca Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 Mar 2024 15:10:39 -0700 Subject: [PATCH 179/275] make tpi hash parsing gracefully exit on empty input data --- src/pdb/pdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pdb/pdb.c b/src/pdb/pdb.c index f0f2eb2b..c6eed0b4 100644 --- a/src/pdb/pdb.c +++ b/src/pdb/pdb.c @@ -310,7 +310,7 @@ pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, Str U32 stride = tpi->hash_key_size; U32 bucket_count = tpi->hash_bucket_count; - if (1 <= stride && stride <= 8 && bucket_count > 0){ + if (1 <= stride && stride <= 8 && bucket_count > 0 && data.str != 0){ // allocate buckets PDB_TpiHashBlock **buckets = push_array(arena, PDB_TpiHashBlock*, bucket_count); From 22e6352056b8aff532d712fc026ae993ea84fc2d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 Mar 2024 15:25:05 -0700 Subject: [PATCH 180/275] raddbgi_breakpad_from_pdb: add a few missing null checks for edge cases --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index b285ad3b..19228f85 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +// TODO(rjf): eliminate redundant null checks, just always allocate +// empty results, and have nulls gracefully fall through +// +// (search for != 0 instances, inserted to prevent prior crashes) + //////////////////////////////// //~ rjf: Basic Helpers @@ -525,6 +530,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) P2R_UnitConvertIn *in = (P2R_UnitConvertIn *)p; P2R_UnitConvertOut *out = push_array(arena, P2R_UnitConvertOut, 1); ProfScope("build units, initial src file map, & collect unit source files") + if(in->comp_units != 0) { U64 units_chunk_cap = in->comp_units->count; P2R_SrcFileMap src_file_map = {0}; @@ -2575,6 +2581,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // P2R_TPIHashParseIn tpi_hash_in = {0}; TS_Ticket tpi_hash_ticket = {0}; + if(tpi != 0) { tpi_hash_in.strtbl = strtbl; tpi_hash_in.tpi = tpi; @@ -2588,6 +2595,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // P2R_TPILeafParseIn tpi_leaf_in = {0}; TS_Ticket tpi_leaf_ticket = {0}; + if(tpi != 0) { tpi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(tpi); tpi_leaf_in.itype_first = tpi->itype_first; @@ -2599,6 +2607,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // P2R_TPIHashParseIn ipi_hash_in = {0}; TS_Ticket ipi_hash_ticket = {0}; + if(ipi != 0) { ipi_hash_in.strtbl = strtbl; ipi_hash_in.tpi = ipi; @@ -2612,6 +2621,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // P2R_TPILeafParseIn ipi_leaf_in = {0}; TS_Ticket ipi_leaf_ticket = {0}; + if(ipi != 0) { ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); ipi_leaf_in.itype_first = ipi->itype_first; @@ -2681,7 +2691,8 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: calculate EXE's max voff // U64 exe_voff_max = 0; - { + if(coff_sections != 0) + { COFF_SectionHeader *coff_sec_ptr = coff_sections->sections; COFF_SectionHeader *coff_ptr_opl = coff_sec_ptr + coff_section_count; for(;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) @@ -2743,7 +2754,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: build binary sections list // RDIM_BinarySectionList binary_sections = {0}; - ProfScope("build binary section list") + if(coff_sections != 0) ProfScope("build binary section list") { COFF_SectionHeader *coff_ptr = coff_sections->sections; COFF_SectionHeader *coff_opl = coff_ptr + coff_section_count; @@ -2801,7 +2812,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) P2R_LinkNameMap link_name_map__in_progress = {0}; P2R_LinkNameMapBuildIn link_name_map_build_in = {0}; TS_Ticket link_name_map_ticket = {0}; - ProfScope("kick off link name map build task") + if(sym != 0) ProfScope("kick off link name map build task") { link_name_map__in_progress.buckets_count = symbol_count_prediction; link_name_map__in_progress.buckets = push_array(arena, P2R_LinkNameNode *, link_name_map__in_progress.buckets_count); @@ -3376,8 +3387,8 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //////////////////////////// //- rjf: kick off all symbol conversion tasks // - U64 global_stream_subdivision_tasks_count = (sym->sym_ranges.count+16383)/16384; - U64 global_stream_syms_per_task = sym->sym_ranges.count/global_stream_subdivision_tasks_count; + U64 global_stream_subdivision_tasks_count = sym ? (sym->sym_ranges.count+16383)/16384 : 0; + U64 global_stream_syms_per_task = sym ? sym->sym_ranges.count/global_stream_subdivision_tasks_count : 0; U64 tasks_count = comp_unit_count + global_stream_subdivision_tasks_count; P2R_SymbolStreamConvertIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamConvertIn, tasks_count); TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); From aa7c30d85be6db46b800c66fe956e9b3f07421dc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 14 Mar 2024 21:09:43 -0700 Subject: [PATCH 181/275] ctrl: first pass at new thread registers cache; also checkpoint for progress on moving to new demon layer --- src/ctrl/ctrl_core.c | 114 ++++++++++++++++++++++++--- src/ctrl/ctrl_core.h | 4 +- src/demon2/win32/demon2_core_win32.c | 22 ++++-- src/raddbg/raddbg_main.cpp | 2 +- 4 files changed, 120 insertions(+), 22 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index d6c8df1c..b7eb4b6f 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -666,7 +666,7 @@ ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity) Task *last_task = &start_task; for(Task *t = first_task; t != 0; t = t->next) { - for(CTRL_Entity *child = entity->first; child != &ctrl_entity_nil; child = child->next) + for(CTRL_Entity *child = t->e->first; child != &ctrl_entity_nil; child = child->next) { Task *t = push_array(scratch.arena, Task, 1); t->e = child; @@ -786,6 +786,7 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->machine_id, event->entity); ctrl_entity_equip_string(store, module, event->string); + module->vaddr_range = event->vaddr_rng; }break; case CTRL_EventKind_EndModule: { @@ -1276,8 +1277,73 @@ ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, internal void * ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread) { - // TODO(rjf) - return 0; + CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache; + Architecture arch = dmn_arch_from_thread(thread); + U64 reg_block_size = regs_block_size_from_architecture(arch); + U64 hash = ctrl_hash_from_machine_id_handle(machine_id, thread); + U64 slot_idx = hash%cache->slots_count; + U64 stripe_idx = slot_idx%cache->stripes_count; + CTRL_ThreadRegCacheSlot *slot = &cache->slots[slot_idx]; + CTRL_ThreadRegCacheStripe *stripe = &cache->stripes[stripe_idx]; + void *result = push_array(arena, U8, reg_block_size); + OS_MutexScopeR(stripe->rw_mutex) + { + // rjf: find existing node + CTRL_ThreadRegCacheNode *node = 0; + for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) + { + if(n->machine_id == machine_id && dmn_handle_match(n->thread, thread)) + { + node = n; + break; + } + } + + // rjf: allocate existing node + if(!node) + { + OS_MutexScopeRWPromote(stripe->rw_mutex) + { + for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) + { + if(n->machine_id == machine_id && dmn_handle_match(n->thread, thread)) + { + node = n; + break; + } + } + if(!node) + { + node = push_array(stripe->arena, CTRL_ThreadRegCacheNode, 1); + DLLPushBack(slot->first, slot->last, node); + node->machine_id = machine_id; + node->thread = thread; + node->block_size = reg_block_size; + node->block = push_array(stripe->arena, U8, reg_block_size); + } + } + for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) + { + if(n->machine_id == machine_id && dmn_handle_match(n->thread, thread)) + { + node = n; + break; + } + } + } + + // rjf: copy from node + if(node) + { + U64 current_reggen_idx = ctrl_reggen_idx(); + if(node->reggen_idx != current_reggen_idx && dmn_thread_read_reg_block(thread, node->block)) + { + node->reggen_idx = current_reggen_idx; + } + MemoryCopy(result, node->block, reg_block_size); + } + } + return result; } internal U64 @@ -1290,15 +1356,23 @@ ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Hand internal U64 ctrl_query_cached_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) { - // TODO(rjf) - return 0; + Temp scratch = scratch_begin(0, 0); + Architecture arch = dmn_arch_from_thread(thread); + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread); + U64 result = regs_rip_from_arch_block(arch, block); + scratch_end(scratch); + return result; } internal U64 ctrl_query_cached_rsp_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) { - // TODO(rjf) - return 0; + Temp scratch = scratch_begin(0, 0); + Architecture arch = dmn_arch_from_thread(thread); + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread); + U64 result = regs_rsp_from_arch_block(arch, block); + scratch_end(scratch); + return result; } //- rjf: thread register writing @@ -1370,7 +1444,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma Rng1U64 module_vaddr_range = {0}; for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next) { - if(contains_1u64(m->vaddr_range, rip)) + if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, rip)) { module = m->handle; module_name = m->string; @@ -1851,7 +1925,15 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls { DBGI_Scope *scope = dbgi_scope_open(); CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, ev->process); - CTRL_Entity *module = process->first; + CTRL_Entity *module = &ctrl_entity_nil; + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Module) + { + module = child; + break; + } + } if(module != &ctrl_entity_nil) { // rjf: determine base address of asan shadow space @@ -2365,7 +2447,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) { //- rjf: unpack process & first module info CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, run_ctrls.run_entities[process_idx]); - CTRL_Entity *module = process->first; + CTRL_Entity *module = &ctrl_entity_nil; + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Module) + { + module = child; + break; + } + } U64 module_base_vaddr = module->vaddr_range.min; String8 exe_path = module->string; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); @@ -2999,7 +3089,7 @@ ctrl_thread__run(CTRL_Msg *msg) CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) { - if(contains_1u64(module->vaddr_range, thread_rip_vaddr)) + if(module->kind == CTRL_EntityKind_Module && contains_1u64(module->vaddr_range, thread_rip_vaddr)) { module_name = module->string; module_base_vaddr = module->vaddr_range.min; @@ -3129,7 +3219,7 @@ ctrl_thread__run(CTRL_Msg *msg) if(bytecode.size != 0) { U64 module_base = module_base_vaddr; - U64 tls_base = 0; // TODO(rjf) + U64 tls_base = ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID_Local, event->thread); EVAL_Machine machine = {0}; machine.u = &event->process; machine.arch = arch; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 59c72af2..b0b444c2 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -441,7 +441,9 @@ struct CTRL_ThreadRegCacheNode CTRL_ThreadRegCacheNode *prev; CTRL_MachineID machine_id; DMN_Handle thread; - U128 regs_hash; + U64 block_size; + void *block; + U64 reggen_idx; }; typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index eed84eb6..d944a6d2 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -40,7 +40,7 @@ dmn_w32_entity_from_handle(DMN_Handle handle) { U32 idx = handle.u32[0]; U32 gen = handle.u32[1]; - DMN_W32_Entity *entity = dmn_w32_shared->entities_base; + DMN_W32_Entity *entity = dmn_w32_shared->entities_base + idx; if(entity->gen != gen) { entity = &dmn_w32_entity_nil; @@ -141,7 +141,7 @@ dmn_w32_entity_release(DMN_W32_Entity *entity) Task *last_task = &start_task; for(Task *t = first_task; t != 0; t = t->next) { - for(DMN_W32_Entity *child = entity->first; child != &dmn_w32_entity_nil; child = child->next) + for(DMN_W32_Entity *child = t->e->first; child != &dmn_w32_entity_nil; child = child->next) { Task *t = push_array(scratch.arena, Task, 1); t->e = child; @@ -581,9 +581,10 @@ dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block) //- rjf: unimplemented win32/arch combos // case Architecture_Null: + case Architecture_COUNT: + {}break; case Architecture_arm64: case Architecture_arm32: - case Architecture_COUNT: {NotImplemented;}break; //////////////////////////// @@ -824,9 +825,10 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block //- rjf: unimplemented win32/arch combos // case Architecture_Null: + case Architecture_COUNT: + {}break; case Architecture_arm64: case Architecture_arm32: - case Architecture_COUNT: {NotImplemented;}break; //////////////////////////// @@ -1148,9 +1150,10 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { //- rjf: unimplemented win32/arch combos case Architecture_Null: + case Architecture_COUNT: + {}break; case Architecture_arm64: case Architecture_arm32: - case Architecture_COUNT: {NotImplemented;}break; //- rjf: x86/64 @@ -1219,7 +1222,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) //- rjf: scan all threads in this process for(DMN_W32_Entity *thread = process->first; - thread != 0; + thread != &dmn_w32_entity_nil; thread = thread->next) { if(thread->kind != DMN_W32_EntityKind_Thread) {continue;} @@ -1432,6 +1435,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) process->handle = process_handle; process->arch = image_info.arch; thread->handle = thread_handle; + thread->arch = image_info.arch; thread->thread.thread_local_base = tls_base; module->handle = module_handle; module->module.vaddr_range = r1u64(module_base, image_info.size); @@ -2050,9 +2054,10 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { //- rjf: unimplemented win32/arch combos case Architecture_Null: + case Architecture_COUNT: + {}break; case Architecture_arm64: case Architecture_arm32: - case Architecture_COUNT: {NotImplemented;}break; //- rjf: x86/64 @@ -2353,9 +2358,10 @@ dmn_stack_base_vaddr_from_thread(DMN_Handle handle) switch(thread->arch) { case Architecture_Null: + case Architecture_COUNT: + {}break; case Architecture_arm64: case Architecture_arm32: - case Architecture_COUNT: {NotImplemented;}break; case Architecture_x64: { diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 827a4c01..4fc4e296 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 8 +#define BUILD_VERSION_PATCH 9 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "The RAD Debugger" #define OS_FEATURE_GRAPHICAL 1 From 8f0e39024fe8c5fff02f18968186d456ae9481ab Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 14 Mar 2024 21:24:12 -0700 Subject: [PATCH 182/275] fix additional demon2 typo --- src/demon2/win32/demon2_core_win32.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index d944a6d2..ba395799 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -2354,7 +2354,6 @@ dmn_stack_base_vaddr_from_thread(DMN_Handle handle) { DMN_W32_Entity *process = thread->parent; U64 tlb = thread->thread.thread_local_base; - U64 result = 0; switch(thread->arch) { case Architecture_Null: From 808d26684e400b45206e67e861e811f4d79046b9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 15 Mar 2024 14:16:30 -0700 Subject: [PATCH 183/275] fix unchecked zero pointers in bake string map joining task, when zero pointers are legal --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 19228f85..86b9cf99 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3571,11 +3571,13 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_join_task__entry_point) { for(U64 slot_idx = in->slot_idx_range.min; slot_idx < in->slot_idx_range.max; slot_idx += 1) { - if(in->dst_map->slots[slot_idx] == 0) + B32 src_slots_good = (in->src_maps[src_map_idx] != 0 && in->src_maps[src_map_idx]->slots != 0); + B32 dst_slot_is_zero = (in->dst_map->slots[slot_idx] == 0); + if(src_slots_good && dst_slot_is_zero) { in->dst_map->slots[slot_idx] = in->src_maps[src_map_idx]->slots[slot_idx]; } - else if(in->src_maps[src_map_idx]->slots[slot_idx] != 0) + else if(src_slots_good && in->src_maps[src_map_idx]->slots[slot_idx] != 0) { rdim_bake_string_chunk_list_concat_in_place(in->dst_map->slots[slot_idx], in->src_maps[src_map_idx]->slots[slot_idx]); } From d3cdb97a4e58fb7c280b961946a3bf70b34eca2c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 17 Mar 2024 12:16:40 -0700 Subject: [PATCH 184/275] notes --- src/raddbg/raddbg.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 3d325472..11efef73 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -8,9 +8,11 @@ // using mouse-move events here // [x] CRT asserts - stepping over int 29 should work just like stepping over // an int3 +// [ ] check new callstack caching rules very strongly // [ ] committing needs to happen when navigating focus away for any reason // [ ] better discoverability for view rules - have better help hover tooltip, // info on arguments, and better autocomplete lister +// [ ] freezing thread while running -> soft-halt // // [ ] source view -> floating margin/line-nums // [ ] theme colors -> more explicit about e.g. opaque backgrounds vs. floating From fbf4cce0e750c7d51ac7cd8a4318a375714f7d2b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 Mar 2024 15:10:39 -0700 Subject: [PATCH 185/275] make tpi hash parsing gracefully exit on empty input data --- src/pdb/pdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pdb/pdb.c b/src/pdb/pdb.c index f0f2eb2b..c6eed0b4 100644 --- a/src/pdb/pdb.c +++ b/src/pdb/pdb.c @@ -310,7 +310,7 @@ pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, Str U32 stride = tpi->hash_key_size; U32 bucket_count = tpi->hash_bucket_count; - if (1 <= stride && stride <= 8 && bucket_count > 0){ + if (1 <= stride && stride <= 8 && bucket_count > 0 && data.str != 0){ // allocate buckets PDB_TpiHashBlock **buckets = push_array(arena, PDB_TpiHashBlock*, bucket_count); From 14d3037aec46598bde790d197269e03db09bba1e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 Mar 2024 15:25:05 -0700 Subject: [PATCH 186/275] raddbgi_breakpad_from_pdb: add a few missing null checks for edge cases --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index b285ad3b..19228f85 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -1,6 +1,11 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +// TODO(rjf): eliminate redundant null checks, just always allocate +// empty results, and have nulls gracefully fall through +// +// (search for != 0 instances, inserted to prevent prior crashes) + //////////////////////////////// //~ rjf: Basic Helpers @@ -525,6 +530,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) P2R_UnitConvertIn *in = (P2R_UnitConvertIn *)p; P2R_UnitConvertOut *out = push_array(arena, P2R_UnitConvertOut, 1); ProfScope("build units, initial src file map, & collect unit source files") + if(in->comp_units != 0) { U64 units_chunk_cap = in->comp_units->count; P2R_SrcFileMap src_file_map = {0}; @@ -2575,6 +2581,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // P2R_TPIHashParseIn tpi_hash_in = {0}; TS_Ticket tpi_hash_ticket = {0}; + if(tpi != 0) { tpi_hash_in.strtbl = strtbl; tpi_hash_in.tpi = tpi; @@ -2588,6 +2595,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // P2R_TPILeafParseIn tpi_leaf_in = {0}; TS_Ticket tpi_leaf_ticket = {0}; + if(tpi != 0) { tpi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(tpi); tpi_leaf_in.itype_first = tpi->itype_first; @@ -2599,6 +2607,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // P2R_TPIHashParseIn ipi_hash_in = {0}; TS_Ticket ipi_hash_ticket = {0}; + if(ipi != 0) { ipi_hash_in.strtbl = strtbl; ipi_hash_in.tpi = ipi; @@ -2612,6 +2621,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) // P2R_TPILeafParseIn ipi_leaf_in = {0}; TS_Ticket ipi_leaf_ticket = {0}; + if(ipi != 0) { ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); ipi_leaf_in.itype_first = ipi->itype_first; @@ -2681,7 +2691,8 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: calculate EXE's max voff // U64 exe_voff_max = 0; - { + if(coff_sections != 0) + { COFF_SectionHeader *coff_sec_ptr = coff_sections->sections; COFF_SectionHeader *coff_ptr_opl = coff_sec_ptr + coff_section_count; for(;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) @@ -2743,7 +2754,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: build binary sections list // RDIM_BinarySectionList binary_sections = {0}; - ProfScope("build binary section list") + if(coff_sections != 0) ProfScope("build binary section list") { COFF_SectionHeader *coff_ptr = coff_sections->sections; COFF_SectionHeader *coff_opl = coff_ptr + coff_section_count; @@ -2801,7 +2812,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) P2R_LinkNameMap link_name_map__in_progress = {0}; P2R_LinkNameMapBuildIn link_name_map_build_in = {0}; TS_Ticket link_name_map_ticket = {0}; - ProfScope("kick off link name map build task") + if(sym != 0) ProfScope("kick off link name map build task") { link_name_map__in_progress.buckets_count = symbol_count_prediction; link_name_map__in_progress.buckets = push_array(arena, P2R_LinkNameNode *, link_name_map__in_progress.buckets_count); @@ -3376,8 +3387,8 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //////////////////////////// //- rjf: kick off all symbol conversion tasks // - U64 global_stream_subdivision_tasks_count = (sym->sym_ranges.count+16383)/16384; - U64 global_stream_syms_per_task = sym->sym_ranges.count/global_stream_subdivision_tasks_count; + U64 global_stream_subdivision_tasks_count = sym ? (sym->sym_ranges.count+16383)/16384 : 0; + U64 global_stream_syms_per_task = sym ? sym->sym_ranges.count/global_stream_subdivision_tasks_count : 0; U64 tasks_count = comp_unit_count + global_stream_subdivision_tasks_count; P2R_SymbolStreamConvertIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamConvertIn, tasks_count); TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); From 1269b9358845c86404c00e590d13e36a5b8aac4f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 15 Mar 2024 14:16:30 -0700 Subject: [PATCH 187/275] fix unchecked zero pointers in bake string map joining task, when zero pointers are legal --- src/raddbgi_from_pdb/raddbgi_from_pdb.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 19228f85..86b9cf99 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3571,11 +3571,13 @@ internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_join_task__entry_point) { for(U64 slot_idx = in->slot_idx_range.min; slot_idx < in->slot_idx_range.max; slot_idx += 1) { - if(in->dst_map->slots[slot_idx] == 0) + B32 src_slots_good = (in->src_maps[src_map_idx] != 0 && in->src_maps[src_map_idx]->slots != 0); + B32 dst_slot_is_zero = (in->dst_map->slots[slot_idx] == 0); + if(src_slots_good && dst_slot_is_zero) { in->dst_map->slots[slot_idx] = in->src_maps[src_map_idx]->slots[slot_idx]; } - else if(in->src_maps[src_map_idx]->slots[slot_idx] != 0) + else if(src_slots_good && in->src_maps[src_map_idx]->slots[slot_idx] != 0) { rdim_bake_string_chunk_list_concat_in_place(in->dst_map->slots[slot_idx], in->src_maps[src_map_idx]->slots[slot_idx]); } From c2709d78b8938ee0864a299d2fb0c1c3b6966075 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 17 Mar 2024 12:21:57 -0700 Subject: [PATCH 188/275] dont over-ambitiously consider the unwind cache up-to-date if some thread unwinds failed --- src/df/core/df_core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 7f48339e..a7ff9ff9 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6931,8 +6931,11 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) break; } } - df_state->unwind_cache_memgen_idx = new_memgen_idx; - df_state->unwind_cache_reggen_idx = new_reggen_idx; + if(good) + { + df_state->unwind_cache_memgen_idx = new_memgen_idx; + df_state->unwind_cache_reggen_idx = new_reggen_idx; + } } //- rjf: clear tls base cache From e0e84c2ee382b9cd0e2f34b48d7f3befdb3c1a8f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 Mar 2024 11:28:47 -0700 Subject: [PATCH 189/275] further progress on integrating new demon layer --- src/ctrl/ctrl_core.c | 62 ++++++++++++++-------------- src/ctrl/ctrl_core.h | 17 ++++---- src/demon2/demon2_core.h | 7 ++++ src/demon2/win32/demon2_core_win32.c | 30 +++++++++++++- src/demon2/win32/demon2_core_win32.h | 5 +++ src/df/core/df_core.c | 35 +++++++++------- src/df/gfx/df_gfx.c | 4 +- src/df/gfx/df_view_rule_hooks.c | 6 +-- src/df/gfx/df_views.c | 2 +- 9 files changed, 105 insertions(+), 63 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index b7eb4b6f..d7b2e0a4 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -933,7 +933,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle { result = range_n->hash; is_good = 1; - is_stale = (range_n->memgen_idx < ctrl_memgen_idx()); + is_stale = (range_n->mem_gen != dmn_mem_gen()); goto read_cache__break_all; } } @@ -1169,6 +1169,20 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac result.data.size = dim_1u64(range); result.byte_bad_flags = byte_bad_flags; result.byte_changed_flags = byte_changed_flags; + if(byte_bad_flags != 0) + { + for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) + { + result.any_byte_bad = result.any_byte_bad || !!result.byte_bad_flags[idx]; + } + } + if(byte_changed_flags != 0) + { + for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) + { + result.any_byte_changed = result.any_byte_changed || !!result.byte_changed_flags[idx]; + } + } hs_scope_close(scope); scratch_end(scratch); @@ -1199,12 +1213,6 @@ ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, ProfBeginFunction(); B32 result = dmn_process_write(process, range, src); - //- rjf: success -> increment memgen - if(result) - { - ins_atomic_u64_inc_eval(&ctrl_state->memgen_idx); - } - //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless // writes within calling frame's "view" of the memory, at the expense of a small amount of // time. @@ -1335,10 +1343,10 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, // rjf: copy from node if(node) { - U64 current_reggen_idx = ctrl_reggen_idx(); - if(node->reggen_idx != current_reggen_idx && dmn_thread_read_reg_block(thread, node->block)) + U64 current_reg_gen = dmn_reg_gen(); + if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, node->block)) { - node->reggen_idx = current_reggen_idx; + node->reg_gen = current_reg_gen; } MemoryCopy(result, node->block, reg_block_size); } @@ -1381,7 +1389,6 @@ internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block) { B32 good = dmn_thread_write_reg_block(thread, block); - ins_atomic_u64_inc_eval(&ctrl_state->reggen_idx); return good; } @@ -1421,7 +1428,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma { CTRL_ProcessMemorySlice stack_memory_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, machine_id, process_entity->handle, r1u64(stack_top, stack_top+stack_size), endt_us); String8 stack_memory = stack_memory_slice.data; - if(stack_memory.size != 0) + if(stack_memory.size != 0 && !stack_memory_slice.any_byte_bad) { stack_memview_good = 1; stack_memview.data = stack_memory.str; @@ -1517,26 +1524,26 @@ ctrl_halt(void) //////////////////////////////// //~ rjf: Shared Accessor Functions -//- rjf: run indices +//- rjf: run generation counter internal U64 -ctrl_run_idx(void) +ctrl_run_gen(void) { - U64 result = ins_atomic_u64_eval(&ctrl_state->run_idx); + U64 result = dmn_run_gen(); return result; } internal U64 -ctrl_memgen_idx(void) +ctrl_mem_gen(void) { - U64 result = ins_atomic_u64_eval(&ctrl_state->memgen_idx); + U64 result = dmn_mem_gen(); return result; } internal U64 -ctrl_reggen_idx(void) +ctrl_reg_gen(void) { - U64 result = ins_atomic_u64_eval(&ctrl_state->reggen_idx); + U64 result = dmn_reg_gen(); return result; } @@ -2054,13 +2061,6 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls { dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); } - - // rjf: inc generation counters - { - ins_atomic_u64_inc_eval(&ctrl_state->run_idx); - ins_atomic_u64_inc_eval(&ctrl_state->memgen_idx); - ins_atomic_u64_inc_eval(&ctrl_state->reggen_idx); - } } } @@ -3651,7 +3651,7 @@ ctrl_mem_stream_thread__entry_point(void *p) //- rjf: take task B32 got_task = 0; - U64 preexisting_memgen_idx = 0; + U64 preexisting_mem_gen = 0; U128 preexisting_hash = {0}; Rng1U64 vaddr_range_clamped = {0}; OS_MutexScopeW(process_stripe->rw_mutex) @@ -3667,7 +3667,7 @@ ctrl_mem_stream_thread__entry_point(void *p) if(MemoryMatchStruct(&range_n->vaddr_range, &vaddr_range) && range_n->zero_terminated == zero_terminated) { got_task = !ins_atomic_u32_eval_cond_assign(&range_n->is_taken, 1, 0); - preexisting_memgen_idx = range_n->memgen_idx; + preexisting_mem_gen = range_n->mem_gen; preexisting_hash = range_n->hash; vaddr_range_clamped = range_n->vaddr_range_clamped; goto take_task__break_all; @@ -3683,8 +3683,8 @@ ctrl_mem_stream_thread__entry_point(void *p) Arena *range_arena = 0; void *range_base = 0; U64 zero_terminated_size = 0; - U64 memgen_idx = ctrl_memgen_idx(); - if(got_task && memgen_idx != preexisting_memgen_idx) + U64 mem_gen = dmn_mem_gen(); + if(got_task && mem_gen != preexisting_mem_gen) { range_size = dim_1u64(vaddr_range_clamped); U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, os_page_size()); @@ -3746,7 +3746,7 @@ ctrl_mem_stream_thread__entry_point(void *p) if(!u128_match(u128_zero(), hash)) { range_n->hash = hash; - range_n->memgen_idx = memgen_idx; + range_n->mem_gen = mem_gen; } ins_atomic_u32_eval_assign(&range_n->is_taken, 0); goto commit__break_all; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index b0b444c2..b55a3d8a 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -376,7 +376,7 @@ struct CTRL_ProcessMemoryRangeHashNode B32 zero_terminated; Rng1U64 vaddr_range_clamped; U128 hash; - U64 memgen_idx; + U64 mem_gen; U64 last_time_requested_us; B32 is_taken; }; @@ -429,6 +429,8 @@ struct CTRL_ProcessMemorySlice String8 data; U64 *byte_bad_flags; U64 *byte_changed_flags; + B32 any_byte_bad; + B32 any_byte_changed; }; //////////////////////////////// @@ -443,7 +445,7 @@ struct CTRL_ThreadRegCacheNode DMN_Handle thread; U64 block_size; void *block; - U64 reggen_idx; + U64 reg_gen; }; typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; @@ -483,9 +485,6 @@ struct CTRL_State { Arena *arena; CTRL_WakeupFunctionType *wakeup_hook; - U64 run_idx; - U64 memgen_idx; - U64 reggen_idx; // rjf: name -> register/alias hash tables for eval EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT]; @@ -672,10 +671,10 @@ internal void ctrl_halt(void); //////////////////////////////// //~ rjf: Shared Accessor Functions -//- rjf: run indices -internal U64 ctrl_run_idx(void); -internal U64 ctrl_memgen_idx(void); -internal U64 ctrl_reggen_idx(void); +//- rjf: generation counters +internal U64 ctrl_run_gen(void); +internal U64 ctrl_mem_gen(void); +internal U64 ctrl_reg_gen(void); //- rjf: name -> register/alias hash tables, for eval internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index cc202c5d..dc79b254 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -165,6 +165,13 @@ internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list); internal void dmn_init(void); +//////////////////////////////// +//~ rjf: @dmn_os_hooks Run/Memory/Register Counters + +internal U64 dmn_run_gen(void); +internal U64 dmn_mem_gen(void); +internal U64 dmn_reg_gen(void); + //////////////////////////////// //~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS) diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index ba395799..6dc81a1d 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -343,6 +343,7 @@ dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src) ptr += actual_write; cursor += actual_write; } + ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen); return result; } @@ -953,6 +954,7 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block //- rjf: bad context -> abort if(ctx == 0) { + DWORD error = GetLastError(); break; } @@ -1043,6 +1045,7 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block scratch_end(scratch); }break; } + ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); return result; } @@ -1104,6 +1107,30 @@ dmn_init(void) } } +//////////////////////////////// +//~ rjf: @dmn_os_hooks Run/Memory/Register Counters + +internal U64 +dmn_run_gen(void) +{ + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->run_gen); + return result; +} + +internal U64 +dmn_mem_gen(void) +{ + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->mem_gen); + return result; +} + +internal U64 +dmn_reg_gen(void) +{ + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->reg_gen); + return result; +} + //////////////////////////////// //~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS) @@ -1366,6 +1393,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) dmn_w32_shared->resume_pid = evt.dwProcessId; dmn_w32_shared->resume_tid = evt.dwThreadId; } + ins_atomic_u64_inc_eval(&dmn_w32_shared->run_gen); } } @@ -1776,7 +1804,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { post_trap_rip = regs_rip_from_arch_block(thread->arch, regs_block); regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer); - dmn_w32_thread_write_reg_block(thread->arch, thread, regs_block); + dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block); } temp_end(temp); } diff --git a/src/demon2/win32/demon2_core_win32.h b/src/demon2/win32/demon2_core_win32.h index 572691c6..d75ee249 100644 --- a/src/demon2/win32/demon2_core_win32.h +++ b/src/demon2/win32/demon2_core_win32.h @@ -194,6 +194,11 @@ struct DMN_W32_Shared Arena *arena; String8List env_strings; + // rjf: run/mem/reg gens + U64 run_gen; + U64 mem_gen; + U64 reg_gen; + // rjf: detaching info Arena *detach_arena; DMN_HandleList detach_processes; diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 496fad24..ccd3e4fa 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -2895,7 +2895,7 @@ df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; if(good_line_info) { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+5000); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+50000); machine_code = machine_code_slice.data; } @@ -3656,7 +3656,7 @@ internal CTRL_Unwind df_push_unwind_from_thread(Arena *arena, DF_Entity *thread) { DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, 0); + CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, os_now_microseconds()+5000); return unwind; } @@ -6545,8 +6545,8 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) Temp scratch = scratch_begin(&arena, 1); //- rjf: grab next reggen/memgen - U64 new_memgen_idx = ctrl_memgen_idx(); - U64 new_reggen_idx = ctrl_reggen_idx(); + U64 new_mem_gen = ctrl_mem_gen(); + U64 new_reg_gen = ctrl_reg_gen(); //- rjf: consume & process events CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); @@ -6908,8 +6908,8 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } //- rjf: refresh unwind cache - if((df_state->unwind_cache_memgen_idx != new_memgen_idx || - df_state->unwind_cache_reggen_idx != new_reggen_idx) && + if((df_state->unwind_cache_memgen_idx != new_mem_gen || + df_state->unwind_cache_reggen_idx != new_reg_gen) && !df_ctrl_targets_running()) ProfScope("per-thread unwind gather") { B32 good = 1; @@ -6935,41 +6935,44 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) break; } } - df_state->unwind_cache_memgen_idx = new_memgen_idx; - df_state->unwind_cache_reggen_idx = new_reggen_idx; + if(good) + { + df_state->unwind_cache_memgen_idx = new_mem_gen; + df_state->unwind_cache_reggen_idx = new_reg_gen; + } } //- rjf: clear tls base cache - if((df_state->tls_base_cache_reggen_idx != new_reggen_idx || - df_state->tls_base_cache_memgen_idx != new_memgen_idx) && + if((df_state->tls_base_cache_reggen_idx != new_reg_gen || + df_state->tls_base_cache_memgen_idx != new_mem_gen) && !df_ctrl_targets_running()) { DF_RunTLSBaseCache *cache = &df_state->tls_base_cache; arena_clear(cache->arena); cache->slots_count = 0; cache->slots = 0; - df_state->tls_base_cache_reggen_idx = new_reggen_idx; - df_state->tls_base_cache_memgen_idx = new_memgen_idx; + df_state->tls_base_cache_reggen_idx = new_reg_gen; + df_state->tls_base_cache_memgen_idx = new_mem_gen; } //- rjf: clear locals cache - if(df_state->locals_cache_reggen_idx != new_reggen_idx && !df_ctrl_targets_running()) + if(df_state->locals_cache_reggen_idx != new_reg_gen && !df_ctrl_targets_running()) { DF_RunLocalsCache *cache = &df_state->locals_cache; arena_clear(cache->arena); cache->table_size = 0; cache->table = 0; - df_state->locals_cache_reggen_idx = new_reggen_idx; + df_state->locals_cache_reggen_idx = new_reg_gen; } //- rjf: clear members cache - if(df_state->member_cache_reggen_idx != new_reggen_idx && !df_ctrl_targets_running()) + if(df_state->member_cache_reggen_idx != new_reg_gen && !df_ctrl_targets_running()) { DF_RunLocalsCache *cache = &df_state->member_cache; arena_clear(cache->arena); cache->table_size = 0; cache->table = 0; - df_state->member_cache_reggen_idx = new_reggen_idx; + df_state->member_cache_reggen_idx = new_reg_gen; } scratch_end(scratch); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 3bd9d716..46adcc50 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -3111,8 +3111,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D avg_ui_hash_chain_length = chain_length_sum / chain_count; } ui_labelf("Target Hz: %.2f", 1.f/df_dt()); - ui_labelf("Ctrl Run Index: %I64u", ctrl_run_idx()); - ui_labelf("Ctrl Mem Gen Index: %I64u", ctrl_memgen_idx()); + ui_labelf("Ctrl Run Index: %I64u", ctrl_run_gen()); + ui_labelf("Ctrl Mem Gen Index: %I64u", ctrl_mem_gen()); ui_labelf("Window %p", window); ui_set_next_pref_width(ui_children_sum(1)); ui_set_next_pref_height(ui_children_sum(1)); diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index fd772b5f..5e9d2562 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -565,7 +565,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) Vec4F32 rgba = {0}; Vec4F32 hsva = {0}; { - if(state->memgen_idx >= ctrl_memgen_idx()) + if(state->memgen_idx >= ctrl_mem_gen()) { hsva = state->hsva; rgba = rgba_from_hsva(hsva); @@ -575,7 +575,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process); state->hsva = hsva = hsva_from_rgba(rgba); - state->memgen_idx = ctrl_memgen_idx(); + state->memgen_idx = ctrl_mem_gen(); } } Vec4F32 initial_hsva = hsva; @@ -624,7 +624,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) { Vec4F32 rgba = rgba_from_hsva(hsva); df_view_rule_hooks__eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, rgba); - state->memgen_idx = ctrl_memgen_idx(); + state->memgen_idx = ctrl_mem_gen(); } //- rjf: commit possible edited value to state diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index d7fa44bb..ad8e38ff 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -7756,7 +7756,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) U8 *visible_memory = 0; { Rng1U64 chunk_aligned_range_bytes = r1u64(AlignDownPow2(viz_range_bytes.min, KB(4)), AlignPow2(viz_range_bytes.max, KB(4))); - U64 current_memgen_idx = ctrl_memgen_idx(); + U64 current_memgen_idx = ctrl_mem_gen(); B32 range_changed = (chunk_aligned_range_bytes.min != mv->last_viewed_memory_cache_range.min || chunk_aligned_range_bytes.max != mv->last_viewed_memory_cache_range.max); B32 mem_changed = (current_memgen_idx != mv->last_viewed_memory_cache_memgen_idx); From 1466b27385a939ef3be414eea32330264f487c25 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 Mar 2024 11:48:48 -0700 Subject: [PATCH 190/275] tweak registers cache lookup rules, to correctly return stale results on failed reads --- project.4coder | 2 +- src/ctrl/ctrl_core.c | 8 ++++++-- src/df/core/df_core.c | 3 +-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/project.4coder b/project.4coder index be4e0ac7..0fb436c2 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { .rjf_f1 = { - .win = "build raddbg", + .win = "build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index d7b2e0a4..358dd253 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1344,11 +1344,15 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, if(node) { U64 current_reg_gen = dmn_reg_gen(); - if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, node->block)) + if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, result)) { node->reg_gen = current_reg_gen; + MemoryCopy(node->block, result, reg_block_size); + } + else + { + MemoryCopy(result, node->block, reg_block_size); } - MemoryCopy(result, node->block, reg_block_size); } } return result; diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index ccd3e4fa..9572c86d 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3655,8 +3655,7 @@ df_architecture_from_entity(DF_Entity *entity) internal CTRL_Unwind df_push_unwind_from_thread(Arena *arena, DF_Entity *thread) { - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, os_now_microseconds()+5000); + CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, 0); return unwind; } From 2c9ff37b2c551323d7f1b2067bf55bcc662a00b0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 Mar 2024 13:53:12 -0700 Subject: [PATCH 191/275] sketch out new unwind cache types --- src/ctrl/ctrl_core.c | 18 ++++++------------ src/ctrl/ctrl_core.h | 29 ++++++++++++++++++++++++++++- src/dasm/dasm.c | 2 +- src/df/core/df_core.c | 1 - 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 358dd253..ce051f0c 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -43,12 +43,6 @@ ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) return cause; } -internal B32 -ctrl_handle_match(DMN_Handle a, DMN_Handle b) -{ - return MemoryMatchStruct(&a, &b); -} - //////////////////////////////// //~ rjf: Machine/Handle Pair Type Functions @@ -923,7 +917,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle { for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { - if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) { U64 range_slot_idx = range_hash%n->range_hash_slots_count; CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; @@ -950,7 +944,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle B32 process_node_exists = 0; for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { - if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) { process_node_exists = 1; break; @@ -978,7 +972,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle { for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { - if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) { U64 range_slot_idx = range_hash%n->range_hash_slots_count; CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; @@ -1018,7 +1012,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle { for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { - if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) { U64 range_slot_idx = range_hash%n->range_hash_slots_count; CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; @@ -3662,7 +3656,7 @@ ctrl_mem_stream_thread__entry_point(void *p) { for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { - if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) { U64 range_slot_idx = range_hash%n->range_hash_slots_count; CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; @@ -3739,7 +3733,7 @@ ctrl_mem_stream_thread__entry_point(void *p) { for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { - if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) { U64 range_slot_idx = range_hash%n->range_hash_slots_count; CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index b55a3d8a..68d8d818 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -471,6 +471,34 @@ struct CTRL_ThreadRegCache CTRL_ThreadRegCacheStripe *stripes; }; +//////////////////////////////// +//~ rjf: Unwind Cache Types + +typedef struct CTRL_UnwindCacheNode CTRL_UnwindCacheNode; +struct CTRL_UnwindCacheNode +{ + CTRL_UnwindCacheNode *next; + CTRL_UnwindCacheNode *prev; + + // rjf: key + CTRL_MachineID machine_id; + DMN_Handle thread; + U64 run_gen; + U64 mem_gen; + U64 reg_gen; + + // rjf: artifacts + CTRL_Unwind unwind; + U64 tls_base_vaddr; +}; + +typedef struct CTRL_UnwindCacheSlot CTRL_UnwindCacheSlot; +struct CTRL_UnwindCacheSlot +{ + CTRL_UnwindCacheNode *first; + CTRL_UnwindCacheNode *last; +}; + //////////////////////////////// //~ rjf: Wakeup Hook Function Types @@ -554,7 +582,6 @@ read_only global CTRL_Entity ctrl_entity_nil = internal U64 ctrl_hash_from_string(String8 string); internal U64 ctrl_hash_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle); internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); -internal B32 ctrl_handle_match(DMN_Handle a, DMN_Handle b); //////////////////////////////// //~ rjf: Machine/Handle Pair Type Functions diff --git a/src/dasm/dasm.c b/src/dasm/dasm.c index 5434c9e9..8eb51f1d 100644 --- a/src/dasm/dasm.c +++ b/src/dasm/dasm.c @@ -195,7 +195,7 @@ dasm_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle proc for(DASM_Entity *e = slot->first; e != 0; e = e->next) { if(e->machine_id == machine && - ctrl_handle_match(e->process, process) && + dmn_handle_match(e->process, process) && MemoryMatchStruct(&e->vaddr_range, &vaddr_range) && e->arch == arch) { diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 9572c86d..eaebebc1 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6931,7 +6931,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) if(cache_node->unwind.error != 0) { good = 0; - break; } } if(good) From 236214db2548c503b5f6a15e6ca15d4625c22407 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 Mar 2024 16:13:01 -0700 Subject: [PATCH 192/275] eliminate unnecessary layers in frontend --- src/ctrl/ctrl_core.h | 28 ------- src/df/core/df_core.c | 178 +++++++++++++++--------------------------- src/df/core/df_core.h | 9 +-- src/df/gfx/df_gfx.c | 2 +- 4 files changed, 66 insertions(+), 151 deletions(-) diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 68d8d818..b9785303 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -471,34 +471,6 @@ struct CTRL_ThreadRegCache CTRL_ThreadRegCacheStripe *stripes; }; -//////////////////////////////// -//~ rjf: Unwind Cache Types - -typedef struct CTRL_UnwindCacheNode CTRL_UnwindCacheNode; -struct CTRL_UnwindCacheNode -{ - CTRL_UnwindCacheNode *next; - CTRL_UnwindCacheNode *prev; - - // rjf: key - CTRL_MachineID machine_id; - DMN_Handle thread; - U64 run_gen; - U64 mem_gen; - U64 reg_gen; - - // rjf: artifacts - CTRL_Unwind unwind; - U64 tls_base_vaddr; -}; - -typedef struct CTRL_UnwindCacheSlot CTRL_UnwindCacheSlot; -struct CTRL_UnwindCacheSlot -{ - CTRL_UnwindCacheNode *first; - CTRL_UnwindCacheNode *last; -}; - //////////////////////////////// //~ rjf: Wakeup Hook Function Types diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index eaebebc1..e008839c 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -2822,7 +2822,7 @@ df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread) // rjf: thread => unpacked info DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = df_rip_from_thread(thread); + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); // rjf: ip => machine code String8 machine_code = {0}; @@ -2861,7 +2861,7 @@ df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread) DF_Entity *module = df_module_from_thread(thread); DF_Entity *binary = df_binary_file_from_module(module); Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = df_rip_from_thread(thread); + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); // rjf: ip => line vaddr range Rng1U64 line_vaddr_rng = {0}; @@ -2986,7 +2986,7 @@ df_trap_net_from_thread__step_into_line(Arena *arena, DF_Entity *thread) DF_Entity *module = df_module_from_thread(thread); DF_Entity *binary = df_binary_file_from_module(module); Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = df_rip_from_thread(thread); + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); // rjf: ip => line vaddr range Rng1U64 line_vaddr_rng = {0}; @@ -3377,27 +3377,6 @@ df_text_line_dasm2src_info_from_binary_voff(DF_Entity *binary, U64 voff) return result; } -internal DF_TextLineDasm2SrcInfoList -df_text_line_dasm2src_info_from_voff(Arena *arena, U64 voff) -{ - Temp scratch = scratch_begin(&arena, 1); - DF_TextLineDasm2SrcInfoList result = {0}; - DF_EntityList binaries = df_push_active_binary_list(scratch.arena); - for(DF_EntityNode *n = binaries.first; n != 0; n = n->next) - { - DF_TextLineDasm2SrcInfo info = df_text_line_dasm2src_info_from_binary_voff(n->entity, voff); - if(!df_entity_is_nil(info.file)) - { - DF_TextLineDasm2SrcInfoNode *dst_n = push_array(arena, DF_TextLineDasm2SrcInfoNode, 1); - dst_n->v = info; - SLLQueuePush(result.first, result.last, dst_n); - result.count += 1; - } - } - scratch_end(scratch); - return result; -} - //- rjf: symbol -> voff lookups internal U64 @@ -3652,42 +3631,6 @@ df_architecture_from_entity(DF_Entity *entity) return entity->arch; } -internal CTRL_Unwind -df_push_unwind_from_thread(Arena *arena, DF_Entity *thread) -{ - CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, 0); - return unwind; -} - -internal U64 -df_rip_from_thread(DF_Entity *thread) -{ - U64 result = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); - return result; -} - -internal U64 -df_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count) -{ - Temp scratch = scratch_begin(0, 0); - U64 result = df_rip_from_thread(thread); - if(unwind_count != 0) - { - CTRL_Unwind unwind = df_push_unwind_from_thread(scratch.arena, thread); - U64 unwind_idx = 0; - for(CTRL_UnwindFrame *frame = unwind.first; frame != 0; frame = frame->next, unwind_idx += 1) - { - if(unwind_count == unwind_idx) - { - result = frame->rip; - break; - } - } - } - scratch_end(scratch); - return result; -} - internal EVAL_String2NumMap * df_push_locals_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity *binary, U64 voff) { @@ -3724,16 +3667,19 @@ df_set_thread_rip(DF_Entity *thread, U64 vaddr) if(result) { DF_RunUnwindCache *unwind_cache = &df_state->unwind_cache; - DF_Handle thread_handle = df_handle_from_entity(thread); - U64 hash = df_hash_from_string(str8_struct(&thread_handle)); - U64 slot_idx = hash % unwind_cache->table_size; - DF_RunUnwindCacheSlot *slot = &unwind_cache->table[slot_idx]; - for(DF_RunUnwindCacheNode *n = slot->first; n != 0; n = n->hash_next) + if(unwind_cache->slots_count != 0) { - if(df_handle_match(n->thread, thread_handle) && n->unwind.first != 0) + DF_Handle thread_handle = df_handle_from_entity(thread); + U64 hash = df_hash_from_string(str8_struct(&thread_handle)); + U64 slot_idx = hash % unwind_cache->slots_count; + DF_RunUnwindCacheSlot *slot = &unwind_cache->slots[slot_idx]; + for(DF_RunUnwindCacheNode *n = slot->first; n != 0; n = n->hash_next) { - n->unwind.first->rip = vaddr; - break; + if(df_handle_match(n->thread, thread_handle) && n->unwind.first != 0) + { + n->unwind.first->rip = vaddr; + break; + } } } } @@ -6189,25 +6135,41 @@ df_push_active_target_list(Arena *arena) internal CTRL_Unwind df_query_cached_unwind_from_thread(DF_Entity *thread) { - ProfBeginFunction(); - CTRL_Unwind result = {0}; DF_RunUnwindCache *cache = &df_state->unwind_cache; - if(cache->table_size != 0) + if(cache->slots_count == 0) { - DF_Handle handle = df_handle_from_entity(thread); - U64 hash = df_hash_from_string(str8_struct(&handle)); - U64 slot_idx = hash % cache->table_size; - DF_RunUnwindCacheSlot *slot = &cache->table[slot_idx]; - for(DF_RunUnwindCacheNode *n = slot->first; n != 0; n = n->hash_next) + cache->slots_count = 1024; + cache->slots = push_array(cache->arena, DF_RunUnwindCacheSlot, cache->slots_count); + } + DF_Handle handle = df_handle_from_entity(thread); + U64 hash = df_hash_from_string(str8_struct(&handle)); + U64 slot_idx = hash % cache->slots_count; + DF_RunUnwindCacheSlot *slot = &cache->slots[slot_idx]; + DF_RunUnwindCacheNode *node = 0; + for(DF_RunUnwindCacheNode *n = slot->first; n != 0; n = n->hash_next) + { + if(df_handle_match(n->thread, handle)) { - if(df_handle_match(n->thread, handle)) - { - result = n->unwind; - break; - } + node = n; + break; } } - ProfEnd(); + CTRL_Unwind result = {0}; + if(node == 0) + { + result = ctrl_unwind_from_thread(cache->arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, 0); + if(!result.error) + { + node = push_array(cache->arena, DF_RunUnwindCacheNode, 1); + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + node->thread = handle; + node->unwind = result; + } + } + else + { + result = node->unwind; + } return result; } @@ -6227,14 +6189,21 @@ internal U64 df_query_cached_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count) { U64 result = 0; - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - U64 unwind_idx = 0; - for(CTRL_UnwindFrame *frame = unwind.first; frame != 0; frame = frame->next, unwind_idx += 1) + if(unwind_count == 0) { - if(unwind_idx == unwind_count) + result = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); + } + else + { + CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); + U64 unwind_idx = 0; + for(CTRL_UnwindFrame *frame = unwind.first; frame != 0; frame = frame->next, unwind_idx += 1) { - result = frame->rip; - break; + if(unwind_idx == unwind_count) + { + result = frame->rip; + break; + } } } return result; @@ -6589,7 +6558,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) // rjf: thread hit user breakpoint -> increment breakpoint hit count if(event->cause == CTRL_EventCause_UserBreakpoint) { - U64 stop_thread_vaddr = df_rip_from_thread(stop_thread); + U64 stop_thread_vaddr = ctrl_query_cached_rip_from_thread(stop_thread->ctrl_machine_id, stop_thread->ctrl_handle); DF_Entity *process = df_entity_ancestor_from_kind(stop_thread, DF_EntityKind_Process); DF_Entity *module = df_module_from_process_vaddr(process, stop_thread_vaddr); DF_Entity *binary = df_binary_file_from_module(module); @@ -6906,38 +6875,17 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } } - //- rjf: refresh unwind cache + //- rjf: clear unwind cache if((df_state->unwind_cache_memgen_idx != new_mem_gen || df_state->unwind_cache_reggen_idx != new_reg_gen) && !df_ctrl_targets_running()) ProfScope("per-thread unwind gather") { - B32 good = 1; - DF_EntityList all_threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread); DF_RunUnwindCache *cache = &df_state->unwind_cache; arena_clear(cache->arena); - cache->table_size = 1024; - cache->table = push_array(cache->arena, DF_RunUnwindCacheSlot, cache->table_size); - for(DF_EntityNode *n = all_threads.first; n != 0; n = n->next) - { - DF_Entity *thread = n->entity; - DF_Handle thread_handle = df_handle_from_entity(thread); - U64 hash = df_hash_from_string(str8_struct(&thread_handle)); - U64 slot_idx = hash % cache->table_size; - DF_RunUnwindCacheSlot *slot = &cache->table[slot_idx]; - DF_RunUnwindCacheNode *cache_node = push_array(cache->arena, DF_RunUnwindCacheNode, 1); - cache_node->thread = thread_handle; - cache_node->unwind = df_push_unwind_from_thread(cache->arena, thread); - SLLQueuePush_NZ(0, slot->first, slot->last, cache_node, hash_next); - if(cache_node->unwind.error != 0) - { - good = 0; - } - } - if(good) - { - df_state->unwind_cache_memgen_idx = new_mem_gen; - df_state->unwind_cache_reggen_idx = new_reg_gen; - } + cache->slots_count = 0; + cache->slots = 0; + df_state->unwind_cache_memgen_idx = new_mem_gen; + df_state->unwind_cache_reggen_idx = new_reg_gen; } //- rjf: clear tls base cache diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 1192d43d..1a8f907a 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -940,7 +940,6 @@ struct DF_RunUnwindCacheNode DF_RunUnwindCacheNode *hash_next; DF_Handle thread; CTRL_Unwind unwind; - U64 tls_base_vaddr; }; typedef struct DF_RunUnwindCacheSlot DF_RunUnwindCacheSlot; @@ -954,8 +953,8 @@ typedef struct DF_RunUnwindCache DF_RunUnwindCache; struct DF_RunUnwindCache { Arena *arena; - U64 table_size; - DF_RunUnwindCacheSlot *table; + U64 slots_count; + DF_RunUnwindCacheSlot *slots; }; //- rjf: per-run tls-base-vaddr cache @@ -1534,7 +1533,6 @@ internal DF_TextLineSrc2DasmInfoListArray df_text_line_src2dasm_info_list_array_ //- rjf: voff -> src lookups internal DF_TextLineDasm2SrcInfo df_text_line_dasm2src_info_from_binary_voff(DF_Entity *binary, U64 voff); -internal DF_TextLineDasm2SrcInfoList df_text_line_dasm2src_info_from_voff(Arena *arena, U64 voff); //- rjf: symbol -> voff lookups internal U64 df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name); @@ -1548,9 +1546,6 @@ internal DF_Entity *df_module_from_process_vaddr(DF_Entity *process, U64 vaddr); internal DF_Entity *df_module_from_thread(DF_Entity *thread); internal U64 df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 rip_vaddr); internal Architecture df_architecture_from_entity(DF_Entity *entity); -internal CTRL_Unwind df_push_unwind_from_thread(Arena *arena, DF_Entity *thread); -internal U64 df_rip_from_thread(DF_Entity *thread); -internal U64 df_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count); internal EVAL_String2NumMap *df_push_locals_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity *binary, U64 voff); internal EVAL_String2NumMap *df_push_member_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity *binary, U64 voff); internal B32 df_set_thread_rip(DF_Entity *thread, U64 vaddr); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 46adcc50..47813529 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -2131,7 +2131,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D if(thread->kind == DF_EntityKind_Thread) { // rjf: grab rip - U64 rip_vaddr = (unwind_count == 0 ? df_rip_from_thread(thread) : df_query_cached_rip_from_thread_unwind(thread, unwind_count)); + U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); // rjf: extract thread/rip info DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); From 54677e05ece9f388ef214a3b3b9f809cbf299e69 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 Mar 2024 16:21:17 -0700 Subject: [PATCH 193/275] fix incorrect metagen pointer comparisons --- src/metagen/metagen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/metagen/metagen.c b/src/metagen/metagen.c index 838328c5..5da28126 100644 --- a/src/metagen/metagen.c +++ b/src/metagen/metagen.c @@ -372,7 +372,7 @@ mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node //- rjf: consume prefix operators MG_StrExpr *leafmost_op = &mg_str_expr_nil; - for(;it < opl && !md_node_is_nil(it);) + for(;it != opl && !md_node_is_nil(it);) { MG_StrExprOp found_op = MG_StrExprOp_Null; for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1); @@ -431,7 +431,7 @@ mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node } //- rjf: parse binary operator extensions at this precedence level - for(;it < opl && !md_node_is_nil(it);) + for(;it != opl && !md_node_is_nil(it);) { // rjf: find binary op kind of `it` MG_StrExprOp found_op = MG_StrExprOp_Null; From a694a77eba10490389f2be835c9ffd991ad6c300 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 Mar 2024 16:49:34 -0700 Subject: [PATCH 194/275] fix halting, unattached running, and caching generations in demon2 --- src/demon2/win32/demon2_core_win32.c | 34 +++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index 6dc81a1d..aa37f3f3 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -1144,6 +1144,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) // typedef enum DMN_W32_EventGenPath { + DMN_W32_EventGenPath_NotAttached, DMN_W32_EventGenPath_Run, DMN_W32_EventGenPath_DetachProcesses, } @@ -1153,12 +1154,41 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { event_gen_path = DMN_W32_EventGenPath_DetachProcesses; } + else + { + B32 any_processes_live = dmn_w32_shared->new_process_pending; + if(!any_processes_live) + { + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; process != &dmn_w32_entity_nil; process = process->next) + { + if(process->kind == DMN_W32_EntityKind_Process) + { + any_processes_live = 1; + break; + } + } + } + if(!any_processes_live) + { + event_gen_path = DMN_W32_EventGenPath_NotAttached; + } + } ////////////////////////////// //- rjf: produce debug events // switch(event_gen_path) { + //////////////////////////// + //- rjf: produce not-attached error events + // + case DMN_W32_EventGenPath_NotAttached: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Error; + e->error_kind = DMN_ErrorKind_NotAttached; + }break; + //////////////////////////// //- rjf: produce debug events from regular running // @@ -1394,6 +1424,8 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) dmn_w32_shared->resume_tid = evt.dwThreadId; } ins_atomic_u64_inc_eval(&dmn_w32_shared->run_gen); + ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen); + ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); } } @@ -2166,7 +2198,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) internal void dmn_halt(U64 code, U64 user_data) { - if(!dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) + if(dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) { DMN_W32_Entity *process = &dmn_w32_entity_nil; for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first; From 982f2b6babee7cbf3a519171e5842f2737051d31 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 10:33:20 -0700 Subject: [PATCH 195/275] extend process memory cache queries with output channel for staleness detection - in some cases this is crucial, in other cases you don't care & want to passively accept stale redsults --- src/ctrl/ctrl_core.c | 81 ++++++++++++++++++--------------- src/ctrl/ctrl_core.h | 3 +- src/df/core/df_core.c | 2 +- src/df/gfx/df_view_rule_hooks.c | 8 ++-- 4 files changed, 52 insertions(+), 42 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index ce051f0c..eaa97541 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -896,7 +896,7 @@ ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Hand } internal U128 -ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, U64 endt_us) +ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, B32 *out_is_stale, U64 endt_us) { U128 result = {0}; U64 size = dim_1u64(range); @@ -1033,6 +1033,10 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle //- rjf: out of time? -> exit if(os_now_microseconds() >= endt_us) { + if(is_good && is_stale && out_is_stale) + { + out_is_stale[0] = 1; + } break; } @@ -1072,8 +1076,10 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac { U64 page_base_vaddr = page_range.min + page_idx*page_size; U128 page_key = ctrl_hash_store_key_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); - U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, endt_us); + B32 page_is_stale = 0; + U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, &page_is_stale, endt_us); U128 page_last_hash = hs_hash_from_key(page_key, 1); + result.stale = (result.stale || page_is_stale); page_hashes[page_idx] = page_hash; page_last_hashes[page_idx] = page_last_hash; } @@ -1399,49 +1405,51 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); DBGI_Scope *scope = dbgi_scope_open(); + CTRL_Unwind unwind = {0}; + unwind.error = 1; + + //- rjf: unpack args CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); CTRL_Entity *process_entity = thread_entity->parent; Architecture arch = thread_entity->arch; U64 arch_reg_block_size = regs_block_size_from_architecture(arch); - CTRL_Unwind unwind = {0}; - unwind.error = 1; - switch(arch) + + //- rjf: grab initial register block + void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread); + + //- rjf: grab initial memory view + B32 stack_memview_good = 0; + UNW_MemView stack_memview = {0}; + { + U64 stack_base_unrounded = dmn_stack_base_vaddr_from_thread(thread); + U64 stack_top_unrounded = regs_rsp_from_arch_block(arch, regs_block); + U64 stack_base = AlignPow2(stack_base_unrounded, KB(4)); + U64 stack_top = AlignDownPow2(stack_top_unrounded, KB(4)); + U64 stack_size = stack_base - stack_top; + if(stack_base >= stack_top) + { + CTRL_ProcessMemorySlice stack_memory_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, machine_id, process_entity->handle, r1u64(stack_top, stack_top+stack_size), endt_us); + String8 stack_memory = stack_memory_slice.data; + if(stack_memory.size != 0 && !stack_memory_slice.any_byte_bad && !stack_memory_slice.stale) + { + stack_memview_good = 1; + stack_memview.data = stack_memory.str; + stack_memview.addr_first = stack_top; + stack_memview.addr_opl = stack_base; + } + } + } + + //- rjf: loop & unwind + UNW_MemView memview = stack_memview; + if(stack_memview_good) switch(arch) { default:{}break; case Architecture_x64: { - // rjf: grab initial register block - void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread); - - // rjf: grab initial memory view - B32 stack_memview_good = 0; - UNW_MemView stack_memview = {0}; + unwind.error = 0; + for(;;) { - U64 stack_base_unrounded = dmn_stack_base_vaddr_from_thread(thread); - U64 stack_top_unrounded = regs_rsp_from_arch_block(arch, regs_block); - U64 stack_base = AlignPow2(stack_base_unrounded, KB(4)); - U64 stack_top = AlignDownPow2(stack_top_unrounded, KB(4)); - U64 stack_size = stack_base - stack_top; - if(stack_base >= stack_top) - { - CTRL_ProcessMemorySlice stack_memory_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, machine_id, process_entity->handle, r1u64(stack_top, stack_top+stack_size), endt_us); - String8 stack_memory = stack_memory_slice.data; - if(stack_memory.size != 0 && !stack_memory_slice.any_byte_bad) - { - stack_memview_good = 1; - stack_memview.data = stack_memory.str; - stack_memview.addr_first = stack_top; - stack_memview.addr_opl = stack_base; - } - } - } - - // rjf: loop & unwind - UNW_MemView memview = stack_memview; - if(stack_memview_good) for(;;) - { - unwind.error = 0; - // rjf: regs -> rip*module U64 rip = regs_rip_from_arch_block(arch, regs_block); DMN_Handle module = {0}; @@ -1504,6 +1512,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma } }break; } + dbgi_scope_close(scope); scratch_end(scratch); ProfEnd(); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index b9785303..916f3db4 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -429,6 +429,7 @@ struct CTRL_ProcessMemorySlice String8 data; U64 *byte_bad_flags; U64 *byte_changed_flags; + B32 stale; B32 any_byte_bad; B32 any_byte_changed; }; @@ -636,7 +637,7 @@ internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); //- rjf: process memory cache interaction internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated); -internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, U64 endt_us); +internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, B32 *out_is_stale, U64 endt_us); //- rjf: process memory cache reading helpers internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, U64 endt_us); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index e008839c..2a526015 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6867,7 +6867,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } } - // rjf: collect s top info + // rjf: collect stop info arena_clear(df_state->ctrl_stop_arena); MemoryCopyStruct(&df_state->ctrl_last_stop_event, event); df_state->ctrl_last_stop_event.string = push_str8_copy(df_state->ctrl_stop_arena, df_state->ctrl_last_stop_event.string); diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 5e9d2562..da3d8842 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -700,7 +700,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) } //- rjf: address range -> hash - U128 hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 1, 0); + U128 hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 1, 0, 0); //- rjf: hash -> data String8 data = hs_data_from_hash(hs_scope, hash); @@ -891,7 +891,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) } //- rjf: address range -> hash - U128 hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0, 0); + U128 hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0, 0, 0); //- rjf: hash & topology -> texture TEX_Topology topology = tex_topology_make(v2s32((S32)topology_info.width, (S32)topology_info.height), topology_info.fmt); @@ -1151,8 +1151,8 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo) } //- rjf: address range -> hash - U128 index_buffer_hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, index_buffer_vaddr_range, 0, 0); - U128 vertex_buffer_hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vertex_buffer_vaddr_range, 0, 0); + U128 index_buffer_hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, index_buffer_vaddr_range, 0, 0, 0); + U128 vertex_buffer_hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vertex_buffer_vaddr_range, 0, 0, 0); //- rjf: get gpu buffers R_Handle index_buffer = geo_buffer_from_key_hash(geo_scope, index_buffer_key, index_buffer_hash); From 3994adae9235e57704a96e50aa93f427d3370860 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 11:56:28 -0700 Subject: [PATCH 196/275] double-buffer frontend unwind cache --- src/ctrl/ctrl_core.c | 8 ++--- src/df/core/df_core.c | 84 +++++++++++++++++++++++-------------------- src/df/core/df_core.h | 3 +- src/df/gfx/df_views.c | 5 ++- 4 files changed, 56 insertions(+), 44 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index eaa97541..65d42656 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -819,7 +819,7 @@ ctrl_init(void) } ctrl_state->process_memory_cache.slots_count = 256; ctrl_state->process_memory_cache.slots = push_array(arena, CTRL_ProcessMemoryCacheSlot, ctrl_state->process_memory_cache.slots_count); - ctrl_state->process_memory_cache.stripes_count = 8; + ctrl_state->process_memory_cache.stripes_count = os_logical_core_count(); ctrl_state->process_memory_cache.stripes = push_array(arena, CTRL_ProcessMemoryCacheStripe, ctrl_state->process_memory_cache.stripes_count); for(U64 idx = 0; idx < ctrl_state->process_memory_cache.stripes_count; idx += 1) { @@ -828,14 +828,13 @@ ctrl_init(void) } ctrl_state->thread_reg_cache.slots_count = 1024; ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); - ctrl_state->thread_reg_cache.stripes_count = 8; + ctrl_state->thread_reg_cache.stripes_count = os_logical_core_count(); ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) { - ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); + ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); } - ctrl_state->ctrl_thread_entity_store = ctrl_entity_store_alloc(); ctrl_state->u2c_ring_size = KB(64); ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); ctrl_state->u2c_ring_mutex = os_mutex_alloc(); @@ -844,6 +843,7 @@ ctrl_init(void) ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); ctrl_state->c2u_ring_mutex = os_mutex_alloc(); ctrl_state->c2u_ring_cv = os_condition_variable_alloc(); + ctrl_state->ctrl_thread_entity_store = ctrl_entity_store_alloc(); ctrl_state->dmn_event_arena = arena_alloc(); ctrl_state->user_entry_point_arena = arena_alloc(); for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 2a526015..75c2525d 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3558,7 +3558,7 @@ df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 //- rjf: read module's TLS index U64 tls_index = 0; { - CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, os_now_microseconds()+5000); + CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, 0); if(tls_index_slice.data.size >= addr_size) { tls_index = *(U64 *)tls_index_slice.data.str; @@ -3571,13 +3571,13 @@ df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 U64 thread_info_addr = root_vaddr; U64 tls_addr_off = tls_index*addr_size; U64 tls_addr_array = 0; - CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), os_now_microseconds()+5000); + CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0); String8 tls_addr_array_data = tls_addr_array_slice.data; if(tls_addr_array_data.size >= 8) { MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); } - CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), os_now_microseconds()+5000); + CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0); String8 result_data = result_slice.data; if(result_data.size >= 8) { @@ -3666,7 +3666,7 @@ df_set_thread_rip(DF_Entity *thread, U64 vaddr) // rjf: early mutation of unwind cache for immediate frontend effect if(result) { - DF_RunUnwindCache *unwind_cache = &df_state->unwind_cache; + DF_RunUnwindCache *unwind_cache = &df_state->unwind_caches[df_state->unwind_cache_gen%ArrayCount(df_state->unwind_caches)]; if(unwind_cache->slots_count != 0) { DF_Handle thread_handle = df_handle_from_entity(thread); @@ -6135,40 +6135,49 @@ df_push_active_target_list(Arena *arena) internal CTRL_Unwind df_query_cached_unwind_from_thread(DF_Entity *thread) { - DF_RunUnwindCache *cache = &df_state->unwind_cache; - if(cache->slots_count == 0) - { - cache->slots_count = 1024; - cache->slots = push_array(cache->arena, DF_RunUnwindCacheSlot, cache->slots_count); - } + CTRL_Unwind result = {0}; DF_Handle handle = df_handle_from_entity(thread); U64 hash = df_hash_from_string(str8_struct(&handle)); - U64 slot_idx = hash % cache->slots_count; - DF_RunUnwindCacheSlot *slot = &cache->slots[slot_idx]; - DF_RunUnwindCacheNode *node = 0; - for(DF_RunUnwindCacheNode *n = slot->first; n != 0; n = n->hash_next) + for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->unwind_caches); cache_idx += 1) { - if(df_handle_match(n->thread, handle)) + DF_RunUnwindCache *cache = &df_state->unwind_caches[(df_state->unwind_cache_gen+cache_idx)%ArrayCount(df_state->unwind_caches)]; + if(cache_idx == 0 && cache->slots_count == 0) + { + cache->slots_count = 1024; + cache->slots = push_array(cache->arena, DF_RunUnwindCacheSlot, cache->slots_count); + } + else if(cache->slots_count == 0) { - node = n; break; } - } - CTRL_Unwind result = {0}; - if(node == 0) - { - result = ctrl_unwind_from_thread(cache->arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, 0); - if(!result.error) + U64 slot_idx = hash%cache->slots_count; + DF_RunUnwindCacheSlot *slot = &cache->slots[slot_idx]; + DF_RunUnwindCacheNode *node = 0; + for(DF_RunUnwindCacheNode *n = slot->first; n != 0; n = n->hash_next) { - node = push_array(cache->arena, DF_RunUnwindCacheNode, 1); - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - node->thread = handle; - node->unwind = result; + if(df_handle_match(n->thread, handle)) + { + node = n; + break; + } + } + if(node != 0) + { + result = node->unwind; + break; + } + else + { + result = ctrl_unwind_from_thread(cache->arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, 0); + if(!result.error) + { + node = push_array(cache->arena, DF_RunUnwindCacheNode, 1); + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + node->thread = handle; + node->unwind = result; + break; + } } - } - else - { - result = node->unwind; } return result; } @@ -6176,12 +6185,7 @@ df_query_cached_unwind_from_thread(DF_Entity *thread) internal U64 df_query_cached_rip_from_thread(DF_Entity *thread) { - U64 result = 0; - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - if(unwind.first != 0) - { - result = unwind.first->rip; - } + U64 result = df_query_cached_rip_from_thread_unwind(thread, 0); return result; } @@ -6405,7 +6409,10 @@ df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) } // rjf: set up per-run caches - df_state->unwind_cache.arena = arena_alloc(); + for(U64 idx = 0; idx < ArrayCount(df_state->unwind_caches); idx += 1) + { + df_state->unwind_caches[idx].arena = arena_alloc(); + } df_state->tls_base_cache.arena = arena_alloc(); df_state->locals_cache.arena = arena_alloc(); df_state->member_cache.arena = arena_alloc(); @@ -6880,7 +6887,8 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) df_state->unwind_cache_reggen_idx != new_reg_gen) && !df_ctrl_targets_running()) ProfScope("per-thread unwind gather") { - DF_RunUnwindCache *cache = &df_state->unwind_cache; + df_state->unwind_cache_gen += 1; + DF_RunUnwindCache *cache = &df_state->unwind_caches[df_state->unwind_cache_gen%ArrayCount(df_state->unwind_caches)]; arena_clear(cache->arena); cache->slots_count = 0; cache->slots = 0; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 1a8f907a..76c97340 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1135,7 +1135,8 @@ struct DF_State // rjf: per-run caches U64 unwind_cache_reggen_idx; U64 unwind_cache_memgen_idx; - DF_RunUnwindCache unwind_cache; + DF_RunUnwindCache unwind_caches[2]; + U64 unwind_cache_gen; U64 tls_base_cache_reggen_idx; U64 tls_base_cache_memgen_idx; DF_RunTLSBaseCache tls_base_cache; diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index ad8e38ff..d411c08c 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -6235,6 +6235,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) } // rjf: find live threads mapping to this disassembly + ProfScope("find live threads mapping to this disassembly") { DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); DF_EntityList threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread); @@ -6243,7 +6244,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) DF_Entity *thread = thread_n->entity; U64 unwind_count = (thread == selected_thread) ? ctrl_ctx.unwind_count : 0; U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - if(contains_1u64(disasm_vaddr_rng, rip_vaddr)) + if(contains_1u64(disasm_vaddr_rng, rip_vaddr)) ProfScope("in-range rip scan") { U64 rip_off = rip_vaddr - disasm_vaddr_rng.min; S64 line_num = dasm_inst_array_idx_from_off__linear_scan(&insts, rip_off)+1; @@ -6257,6 +6258,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) } // rjf: find breakpoints mapping to this disassembly + ProfScope("find breakpoints mapping to this disassembly") { DF_EntityList bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); for(DF_EntityNode *n = bps.first; n != 0; n = n->next) @@ -6277,6 +6279,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) } // rjf: find watch pins mapping to this disassembly + ProfScope("find watch pins mapping to this disassembly") { DF_EntityList pins = df_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); for(DF_EntityNode *n = pins.first; n != 0; n = n->next) From e9129975e3b6fa3b7a6c982778e8dda6c47c3b1e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 13:32:22 -0700 Subject: [PATCH 197/275] double buffer locals cache & tls base cache; introduce synchronizing mechanism for run vs. non-run ctrl thread states, to only attempt demon reads/queries during non-running times --- src/ctrl/ctrl_core.c | 47 ++++++++++++++++++++---------- src/ctrl/ctrl_core.h | 4 +++ src/demon2/demon2_core.c | 35 +++++++++++++++++++++++ src/demon2/demon2_core.h | 6 ++++ src/df/core/df_core.c | 62 +++++++++++++++++++++++++++++----------- src/df/core/df_core.h | 6 ++-- src/df/gfx/df_views.c | 2 +- 7 files changed, 127 insertions(+), 35 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 65d42656..49f6be97 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -800,6 +800,7 @@ ctrl_init(void) Arena *arena = arena_alloc(); ctrl_state = push_array(arena, CTRL_State, 1); ctrl_state->arena = arena; + ctrl_state->ctrl_run_mutex = os_mutex_alloc(); for(Architecture arch = (Architecture)0; arch < Architecture_COUNT; arch = (Architecture)(arch+1)) { String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); @@ -1344,12 +1345,17 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, if(node) { U64 current_reg_gen = dmn_reg_gen(); - if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, result)) + B32 need_stale = 1; + if(node->reg_gen != current_reg_gen) { - node->reg_gen = current_reg_gen; - MemoryCopy(node->block, result, reg_block_size); + OS_MutexScope(ctrl_state->ctrl_run_mutex) if(ctrl_state->ctrl_run_state == 0 && dmn_thread_read_reg_block(thread, result)) + { + need_stale = 0; + node->reg_gen = current_reg_gen; + MemoryCopy(node->block, result, reg_block_size); + } } - else + if(need_stale) { MemoryCopy(result, node->block, reg_block_size); } @@ -1719,6 +1725,12 @@ ctrl_thread__entry_point(void *p) //- rjf: get next messages CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); + //- rjf: begin run state + OS_MutexScope(ctrl_state->ctrl_run_mutex) + { + ctrl_state->ctrl_run_state = 1; + } + //- rjf: process messages { B32 done = 0; @@ -1753,6 +1765,12 @@ ctrl_thread__entry_point(void *p) } } } + + //- rjf: end run state + OS_MutexScope(ctrl_state->ctrl_run_mutex) + { + ctrl_state->ctrl_run_state = 0; + } } scratch_end(scratch); @@ -2879,7 +2897,7 @@ ctrl_thread__run(CTRL_Msg *msg) if(process->kind != CTRL_EntityKind_Process) { continue; } for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) { - U64 rip = ctrl_query_cached_rip_from_thread(thread->machine_id, thread->handle); + U64 rip = dmn_rip_from_thread(thread->handle); // rjf: determine if thread is frozen B32 thread_is_frozen = !msg->freeze_state_is_frozen; @@ -2998,7 +3016,7 @@ ctrl_thread__run(CTRL_Msg *msg) // if(stop_event == 0) { - U64 sp_check_value = ctrl_query_cached_rsp_from_thread(CTRL_MachineID_Local, target_thread); + U64 sp_check_value = dmn_rsp_from_thread(target_thread); B32 spoof_mode = 0; CTRL_Spoof spoof = {0}; for(;;) @@ -3085,9 +3103,7 @@ ctrl_thread__run(CTRL_Msg *msg) // CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->thread); Architecture arch = thread->arch; - U64 reg_size = regs_block_size_from_architecture(arch); - void *thread_regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, CTRL_MachineID_Local, event->thread); - U64 thread_rip_vaddr = regs_rip_from_arch_block(arch, thread_regs_block); + U64 thread_rip_vaddr = dmn_rsp_from_thread(event->thread); DMN_Handle module = {0}; String8 module_name = {0}; U64 module_base_vaddr = 0; @@ -3226,15 +3242,16 @@ ctrl_thread__run(CTRL_Msg *msg) if(bytecode.size != 0) { U64 module_base = module_base_vaddr; - U64 tls_base = ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID_Local, event->thread); + U64 tls_base = dmn_tls_root_vaddr_from_thread(event->thread); EVAL_Machine machine = {0}; machine.u = &event->process; machine.arch = arch; machine.memory_read = ctrl_eval_memory_read; - machine.reg_data = thread_regs_block; - machine.reg_size = reg_size; + machine.reg_size = regs_block_size_from_architecture(arch); + machine.reg_data = push_array(scratch.arena, U8, machine.reg_size); machine.module_base = &module_base; machine.tls_base = &tls_base; + dmn_thread_read_reg_block(event->thread, machine.reg_data); eval = eval_interpret(&machine, bytecode); } if(eval.code == EVAL_ResultCode_Good && eval.value.u64 == 0) @@ -3335,7 +3352,7 @@ ctrl_thread__run(CTRL_Msg *msg) B32 stack_pointer_matches = 0; if(use_trap_net_logic) { - U64 sp = ctrl_query_cached_rsp_from_thread(CTRL_MachineID_Local, target_thread); + U64 sp = dmn_rsp_from_thread(target_thread); stack_pointer_matches = (sp == sp_check_value); } @@ -3383,7 +3400,7 @@ ctrl_thread__run(CTRL_Msg *msg) { // rjf: setup spoof mode begin_spoof_mode = 1; - U64 spoof_sp = ctrl_query_cached_rsp_from_thread(CTRL_MachineID_Local, target_thread); + U64 spoof_sp = dmn_rsp_from_thread(target_thread); spoof_mode = 1; spoof.process = target_process; spoof.thread = target_thread; @@ -3401,7 +3418,7 @@ ctrl_thread__run(CTRL_Msg *msg) if(stack_pointer_matches) { save_stack_pointer = 1; - sp_check_value = ctrl_query_cached_rsp_from_thread(CTRL_MachineID_Local, target_thread); + sp_check_value = dmn_rsp_from_thread(target_thread); } } } diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 916f3db4..f74f2a83 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -491,6 +491,10 @@ struct CTRL_State EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT]; EVAL_String2NumMap arch_string2alias_tables[Architecture_COUNT]; + // rjf: access locking mechanism + OS_Handle ctrl_run_mutex; + B32 ctrl_run_state; + // rjf: caches CTRL_ProcessMemoryCache process_memory_cache; CTRL_ThreadRegCache thread_reg_cache; diff --git a/src/demon2/demon2_core.c b/src/demon2/demon2_core.c index ee3b7ed6..86c1c3c6 100644 --- a/src/demon2/demon2_core.c +++ b/src/demon2/demon2_core.c @@ -116,3 +116,38 @@ dmn_event_list_push(Arena *arena, DMN_EventList *list) DMN_Event *result = &n->v; return result; } + +//////////////////////////////// +//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) + +internal U64 +dmn_rip_from_thread(DMN_Handle thread) +{ + U64 result = 0; + Temp scratch = scratch_begin(0, 0); + { + Architecture arch = dmn_arch_from_thread(thread); + U64 reg_block_size = regs_block_size_from_architecture(arch); + void *reg_block = push_array(scratch.arena, U8, reg_block_size); + dmn_thread_read_reg_block(thread, reg_block); + result = regs_rip_from_arch_block(arch, reg_block); + } + scratch_end(scratch); + return result; +} + +internal U64 +dmn_rsp_from_thread(DMN_Handle thread) +{ + U64 result = 0; + Temp scratch = scratch_begin(0, 0); + { + Architecture arch = dmn_arch_from_thread(thread); + U64 reg_block_size = regs_block_size_from_architecture(arch); + void *reg_block = push_array(scratch.arena, U8, reg_block_size); + dmn_thread_read_reg_block(thread, reg_block); + result = regs_rsp_from_arch_block(arch, reg_block); + } + scratch_end(scratch); + return result; +} diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index dc79b254..2ae5efc8 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -160,6 +160,12 @@ internal DMN_HandleArray dmn_handle_array_copy(Arena *arena, DMN_HandleArray *sr //- rjf: event list building internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list); +//////////////////////////////// +//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) + +internal U64 dmn_rip_from_thread(DMN_Handle thread); +internal U64 dmn_rsp_from_thread(DMN_Handle thread); + //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 75c2525d..1d7c255c 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6217,13 +6217,18 @@ internal U64 df_query_cached_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 rip_vaddr) { U64 result = 0; + for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->tls_base_caches); cache_idx += 1) { - DF_RunTLSBaseCache *cache = &df_state->tls_base_cache; - if(cache->slots_count == 0) + DF_RunTLSBaseCache *cache = &df_state->tls_base_caches[(df_state->tls_base_cache_gen+cache_idx)%ArrayCount(df_state->tls_base_caches)]; + if(cache_idx == 0 && cache->slots_count == 0) { cache->slots_count = 256; cache->slots = push_array(cache->arena, DF_RunTLSBaseCacheSlot, cache->slots_count); } + else if(cache->slots_count == 0) + { + break; + } DF_Handle handle = df_handle_from_entity(process); U64 hash = df_hash_from_seed_string(df_hash_from_string(str8_struct(&handle)), str8_struct(&rip_vaddr)); U64 slot_idx = hash%cache->slots_count; @@ -6239,14 +6244,22 @@ df_query_cached_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 roo } if(node == 0) { - node = push_array(cache->arena, DF_RunTLSBaseCacheNode, 1); - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - node->process = handle; - node->root_vaddr = root_vaddr; - node->rip_vaddr = rip_vaddr; - node->tls_base_vaddr = df_tls_base_vaddr_from_process_root_rip(process, root_vaddr, rip_vaddr); + U64 tls_base_vaddr = df_tls_base_vaddr_from_process_root_rip(process, root_vaddr, rip_vaddr); + if(tls_base_vaddr != 0) + { + node = push_array(cache->arena, DF_RunTLSBaseCacheNode, 1); + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + node->process = handle; + node->root_vaddr = root_vaddr; + node->rip_vaddr = rip_vaddr; + node->tls_base_vaddr = tls_base_vaddr; + } + } + if(node != 0 && node->tls_base_vaddr != 0) + { + result = node->tls_base_vaddr; + break; } - result = node->tls_base_vaddr; } return result; } @@ -6256,13 +6269,18 @@ df_query_cached_locals_map_from_binary_voff(DF_Entity *binary, U64 voff) { ProfBeginFunction(); EVAL_String2NumMap *map = &eval_string2num_map_nil; + for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->locals_caches); cache_idx += 1) { - DF_RunLocalsCache *cache = &df_state->locals_cache; - if(cache->table_size == 0) + DF_RunLocalsCache *cache = &df_state->locals_caches[(df_state->locals_cache_gen+cache_idx)%ArrayCount(df_state->locals_caches)]; + if(cache_idx == 0 && cache->table_size == 0) { cache->table_size = 256; cache->table = push_array(cache->arena, DF_RunLocalsCacheSlot, cache->table_size); } + else if(cache->table_size == 0) + { + break; + } DF_Handle handle = df_handle_from_entity(binary); U64 hash = df_hash_from_string(str8_struct(&handle)); U64 slot_idx = hash % cache->table_size; @@ -6290,9 +6308,10 @@ df_query_cached_locals_map_from_binary_voff(DF_Entity *binary, U64 voff) } dbgi_scope_close(scope); } - if(node != 0) + if(node != 0 && node->locals_map->slots_count != 0) { map = node->locals_map; + break; } } ProfEnd(); @@ -6413,8 +6432,14 @@ df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) { df_state->unwind_caches[idx].arena = arena_alloc(); } - df_state->tls_base_cache.arena = arena_alloc(); - df_state->locals_cache.arena = arena_alloc(); + for(U64 idx = 0; idx < ArrayCount(df_state->tls_base_caches); idx += 1) + { + df_state->tls_base_caches[idx].arena = arena_alloc(); + } + for(U64 idx = 0; idx < ArrayCount(df_state->locals_caches); idx += 1) + { + df_state->locals_caches[idx].arena = arena_alloc(); + } df_state->member_cache.arena = arena_alloc(); // rjf: set up eval view cache @@ -6901,7 +6926,8 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) df_state->tls_base_cache_memgen_idx != new_mem_gen) && !df_ctrl_targets_running()) { - DF_RunTLSBaseCache *cache = &df_state->tls_base_cache; + df_state->tls_base_cache_gen += 1; + DF_RunTLSBaseCache *cache = &df_state->tls_base_caches[df_state->tls_base_cache_gen%ArrayCount(df_state->tls_base_caches)]; arena_clear(cache->arena); cache->slots_count = 0; cache->slots = 0; @@ -6910,9 +6936,11 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } //- rjf: clear locals cache - if(df_state->locals_cache_reggen_idx != new_reg_gen && !df_ctrl_targets_running()) + if(df_state->locals_cache_reggen_idx != new_reg_gen && + !df_ctrl_targets_running()) { - DF_RunLocalsCache *cache = &df_state->locals_cache; + df_state->locals_cache_gen += 1; + DF_RunLocalsCache *cache = &df_state->locals_caches[df_state->locals_cache_gen%ArrayCount(df_state->locals_caches)]; arena_clear(cache->arena); cache->table_size = 0; cache->table = 0; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 76c97340..4df932cd 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1139,9 +1139,11 @@ struct DF_State U64 unwind_cache_gen; U64 tls_base_cache_reggen_idx; U64 tls_base_cache_memgen_idx; - DF_RunTLSBaseCache tls_base_cache; + DF_RunTLSBaseCache tls_base_caches[2]; + U64 tls_base_cache_gen; U64 locals_cache_reggen_idx; - DF_RunLocalsCache locals_cache; + DF_RunLocalsCache locals_caches[2]; + U64 locals_cache_gen; U64 member_cache_reggen_idx; DF_RunLocalsCache member_cache; diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index d411c08c..a6f1eacb 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -6244,7 +6244,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) DF_Entity *thread = thread_n->entity; U64 unwind_count = (thread == selected_thread) ? ctrl_ctx.unwind_count : 0; U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - if(contains_1u64(disasm_vaddr_rng, rip_vaddr)) ProfScope("in-range rip scan") + if(contains_1u64(disasm_vaddr_rng, rip_vaddr)) { U64 rip_off = rip_vaddr - disasm_vaddr_rng.min; S64 line_num = dasm_inst_array_idx_from_off__linear_scan(&insts, rip_off)+1; From 9de678ec2280f45687baa9d7eb9862f350da1562 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 13:51:26 -0700 Subject: [PATCH 198/275] disable debug heap by default; get unwindg path off caching layers & use demon reads directly --- src/ctrl/ctrl_core.c | 12 +++++++----- src/demon2/win32/demon2_core_win32.c | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 49f6be97..d982e31f 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1421,7 +1421,8 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma U64 arch_reg_block_size = regs_block_size_from_architecture(arch); //- rjf: grab initial register block - void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread); + void *regs_block = push_array(scratch.arena, U8, arch_reg_block_size); + B32 regs_block_good = dmn_thread_read_reg_block(thread, regs_block); //- rjf: grab initial memory view B32 stack_memview_good = 0; @@ -1434,9 +1435,10 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma U64 stack_size = stack_base - stack_top; if(stack_base >= stack_top) { - CTRL_ProcessMemorySlice stack_memory_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, machine_id, process_entity->handle, r1u64(stack_top, stack_top+stack_size), endt_us); - String8 stack_memory = stack_memory_slice.data; - if(stack_memory.size != 0 && !stack_memory_slice.any_byte_bad && !stack_memory_slice.stale) + U8 *stack_memory_base = push_array(scratch.arena, U8, stack_size); + U64 actual_stack_bytes_read = dmn_process_read(process_entity->handle, r1u64(stack_top, stack_top+stack_size), stack_memory_base); + String8 stack_memory = str8(stack_memory_base, actual_stack_bytes_read); + if(stack_memory.size >= stack_size) { stack_memview_good = 1; stack_memview.data = stack_memory.str; @@ -1448,7 +1450,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma //- rjf: loop & unwind UNW_MemView memview = stack_memview; - if(stack_memview_good) switch(arch) + if(regs_block_good && stack_memview_good) switch(arch) { default:{}break; case Architecture_x64: diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index aa37f3f3..6035162b 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -2254,6 +2254,7 @@ dmn_launch_process(OS_LaunchOptions *options) if(options->inherit_env != 0) { MemoryZeroStruct(&all_opts); + str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); for(String8Node *n = options->env.first; n != 0; n = n->next) { str8_list_push(scratch.arena, &all_opts, n->string); From 14ac7141e763c0163e91e82fe95173edb1327334 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 13:53:14 -0700 Subject: [PATCH 199/275] double buffer member cache --- src/df/core/df_core.c | 20 +++++++++++++++----- src/df/core/df_core.h | 3 ++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 1d7c255c..9321cd09 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6323,13 +6323,18 @@ df_query_cached_member_map_from_binary_voff(DF_Entity *binary, U64 voff) { ProfBeginFunction(); EVAL_String2NumMap *map = &eval_string2num_map_nil; + for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->member_caches); cache_idx += 1) { - DF_RunLocalsCache *cache = &df_state->member_cache; - if(cache->table_size == 0) + DF_RunLocalsCache *cache = &df_state->member_caches[(df_state->member_cache_gen+cache_idx)%ArrayCount(df_state->member_caches)]; + if(cache_idx == 0 && cache->table_size == 0) { cache->table_size = 256; cache->table = push_array(cache->arena, DF_RunLocalsCacheSlot, cache->table_size); } + else if(cache->table_size == 0) + { + break; + } DF_Handle handle = df_handle_from_entity(binary); U64 hash = df_hash_from_string(str8_struct(&handle)); U64 slot_idx = hash % cache->table_size; @@ -6357,9 +6362,10 @@ df_query_cached_member_map_from_binary_voff(DF_Entity *binary, U64 voff) } dbgi_scope_close(scope); } - if(node != 0) + if(node != 0 && node->locals_map->slots_count != 0) { map = node->locals_map; + break; } } ProfEnd(); @@ -6440,7 +6446,10 @@ df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) { df_state->locals_caches[idx].arena = arena_alloc(); } - df_state->member_cache.arena = arena_alloc(); + for(U64 idx = 0; idx < ArrayCount(df_state->member_caches); idx += 1) + { + df_state->member_caches[idx].arena = arena_alloc(); + } // rjf: set up eval view cache df_state->eval_view_cache.slots_count = 4096; @@ -6950,7 +6959,8 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) //- rjf: clear members cache if(df_state->member_cache_reggen_idx != new_reg_gen && !df_ctrl_targets_running()) { - DF_RunLocalsCache *cache = &df_state->member_cache; + df_state->member_cache_gen += 1; + DF_RunLocalsCache *cache = &df_state->member_caches[df_state->member_cache_gen%ArrayCount(df_state->member_caches)]; arena_clear(cache->arena); cache->table_size = 0; cache->table = 0; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 4df932cd..7ba02bf4 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1145,7 +1145,8 @@ struct DF_State DF_RunLocalsCache locals_caches[2]; U64 locals_cache_gen; U64 member_cache_reggen_idx; - DF_RunLocalsCache member_cache; + DF_RunLocalsCache member_caches[2]; + U64 member_cache_gen; // rjf: eval view cache DF_EvalViewCache eval_view_cache; From ca01e66ea20255a8e7b8d51750c8df05d063a537 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 14:12:40 -0700 Subject: [PATCH 200/275] plug in tls root vaddr path --- src/ctrl/ctrl_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index d982e31f..936d4d03 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1367,8 +1367,8 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) { - // TODO(rjf) - return 0; + U64 result = dmn_tls_root_vaddr_from_thread(thread); + return result; } internal U64 From 07bbf1b43cf9768d37139c50561c8b5530b6ca50 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 15:15:33 -0700 Subject: [PATCH 201/275] organize demon2 by thread api --- src/demon2/demon2_core.h | 32 ++- src/demon2/win32/demon2_core_win32.c | 312 +++++++++++++-------------- 2 files changed, 169 insertions(+), 175 deletions(-) diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index 2ae5efc8..adb84bd4 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -172,28 +172,26 @@ internal U64 dmn_rsp_from_thread(DMN_Handle thread); internal void dmn_init(void); //////////////////////////////// -//~ rjf: @dmn_os_hooks Run/Memory/Register Counters - -internal U64 dmn_run_gen(void); -internal U64 dmn_mem_gen(void); -internal U64 dmn_reg_gen(void); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS) - -internal DMN_EventList dmn_run(Arena *arena, DMN_RunCtrls *ctrls); -internal void dmn_halt(U64 code, U64 user_data); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Process Launching/Attaching/Killing/Detaching (Implemented Per-OS) +//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) internal U32 dmn_launch_process(OS_LaunchOptions *options); internal B32 dmn_attach_process(U32 pid); internal B32 dmn_kill_process(DMN_Handle process, U32 exit_code); internal B32 dmn_detach_process(DMN_Handle process); +internal DMN_EventList dmn_run(Arena *arena, DMN_RunCtrls *ctrls); //////////////////////////////// -//~ rjf: @dmn_os_hooks Process/Thread Reads/Writes (Implemented Per-OS) +//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) + +internal void dmn_halt(U64 code, U64 user_data); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) + +//- rjf: run/memory/register counters +internal U64 dmn_run_gen(void); +internal U64 dmn_mem_gen(void); +internal U64 dmn_reg_gen(void); //- rjf: processes internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); @@ -208,9 +206,7 @@ internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); -//////////////////////////////// -//~ rjf: @dmn_os_hooks System Process Listing (Implemented Per-OS) - +//- rjf: system process listing internal void dmn_process_iter_begin(DMN_ProcessIter *iter); internal B32 dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out); internal void dmn_process_iter_end(DMN_ProcessIter *iter); diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index 6035162b..ddf921c9 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -1108,31 +1108,158 @@ dmn_init(void) } //////////////////////////////// -//~ rjf: @dmn_os_hooks Run/Memory/Register Counters +//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) -internal U64 -dmn_run_gen(void) +internal U32 +dmn_launch_process(OS_LaunchOptions *options) { - U64 result = ins_atomic_u64_eval(&dmn_w32_shared->run_gen); + Temp scratch = scratch_begin(0, 0); + U32 result = 0; + + //- rjf: produce exe / arguments string + String8 cmd = {0}; + if(options->cmd_line.first != 0) + { + String8List args = {0}; + String8 exe_path = options->cmd_line.first->string; + str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); + for(String8Node *n = options->cmd_line.first->next; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &args, n->string); + } + StringJoin join_params = {0}; + join_params.sep = str8_lit(" "); + cmd = str8_list_join(scratch.arena, &args, &join_params); + } + + //- rjf: produce environment strings + String8 env = {0}; + { + String8List all_opts = options->env; + if(options->inherit_env != 0) + { + MemoryZeroStruct(&all_opts); + str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); + for(String8Node *n = options->env.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + } + StringJoin join_params2 = {0}; + join_params2.sep = str8_lit("\0"); + join_params2.post = str8_lit("\0"); + env = str8_list_join(scratch.arena, &all_opts, &join_params2); + } + + //- rjf: produce utf-16 strings + String16 cmd16 = str16_from_8(scratch.arena, cmd); + String16 dir16 = str16_from_8(scratch.arena, options->path); + String16 env16 = str16_from_8(scratch.arena, env); + + //- rjf: launch + DWORD access_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; + STARTUPINFOW startup_info = {sizeof(startup_info)}; + PROCESS_INFORMATION process_info = {0}; + AllocConsole(); + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + { + // check if we are 32-bit app, and just close it immediately + BOOL is_wow = 0; + IsWow64Process(process_info.hProcess, &is_wow); + if(is_wow) + { + MessageBox(0, "Sorry, The RAD Debugger only debugs 64-bit applications currently.", "Process error", MB_OK|MB_ICONSTOP); + DebugActiveProcessStop(process_info.dwProcessId); + TerminateProcess(process_info.hProcess,0xffffffff); + } + else + { + result = process_info.dwProcessId; + dmn_w32_shared->new_process_pending = 1; + } + CloseHandle(process_info.hProcess); + CloseHandle(process_info.hThread); + } + else + { + MessageBox(0, "Error starting process.", "Process error", MB_OK|MB_ICONSTOP); + } + FreeConsole(); + + //- rjf: eliminate all handles which have stuck around from the AllocConsole + { + SetStdHandle(STD_INPUT_HANDLE, 0); + SetStdHandle(STD_OUTPUT_HANDLE, 0); + SetStdHandle(STD_ERROR_HANDLE, 0); + } + + scratch_end(scratch); return result; } -internal U64 -dmn_mem_gen(void) +internal B32 +dmn_attach_process(U32 pid) { - U64 result = ins_atomic_u64_eval(&dmn_w32_shared->mem_gen); + B32 result = 0; + if(DebugActiveProcess((DWORD)pid)) + { + result = 1; + dmn_w32_shared->new_process_pending = 1; + } return result; } -internal U64 -dmn_reg_gen(void) +internal B32 +dmn_kill_process(DMN_Handle process, U32 exit_code) { - U64 result = ins_atomic_u64_eval(&dmn_w32_shared->reg_gen); + B32 result = 0; + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + if(TerminateProcess(process_entity->handle, exit_code)) + { + result = 1; + } return result; } -//////////////////////////////// -//~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS) +internal B32 +dmn_detach_process(DMN_Handle process) +{ + B32 result = 0; + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + + // rjf: resume threads + for(DMN_W32_Entity *child = process_entity->first; + child != &dmn_w32_entity_nil; + child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + DWORD resume_result = ResumeThread(child->handle); + (void)resume_result; + } + } + + // rjf: detach + { + DWORD pid = (DWORD)process_entity->id; + if(DebugActiveProcessStop(pid)) + { + result = 1; + } + } + + // rjf: push into list of processes to generate events for later + if(result != 0) + { + dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); + } + + return result; +} internal DMN_EventList dmn_run(Arena *arena, DMN_RunCtrls *ctrls) @@ -2195,6 +2322,9 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) return events; } +//////////////////////////////// +//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) + internal void dmn_halt(U64 code, U64 user_data) { @@ -2223,162 +2353,31 @@ dmn_halt(U64 code, U64 user_data) } //////////////////////////////// -//~ rjf: @dmn_os_hooks Process Launching/Attaching/Killing/Detaching (Implemented Per-OS) +//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) -internal U32 -dmn_launch_process(OS_LaunchOptions *options) +//- rjf: run/memory/register counters + +internal U64 +dmn_run_gen(void) { - Temp scratch = scratch_begin(0, 0); - U32 result = 0; - - //- rjf: produce exe / arguments string - String8 cmd = {0}; - if(options->cmd_line.first != 0) - { - String8List args = {0}; - String8 exe_path = options->cmd_line.first->string; - str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); - for(String8Node *n = options->cmd_line.first->next; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &args, n->string); - } - StringJoin join_params = {0}; - join_params.sep = str8_lit(" "); - cmd = str8_list_join(scratch.arena, &args, &join_params); - } - - //- rjf: produce environment strings - String8 env = {0}; - { - String8List all_opts = options->env; - if(options->inherit_env != 0) - { - MemoryZeroStruct(&all_opts); - str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); - for(String8Node *n = options->env.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - } - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - env = str8_list_join(scratch.arena, &all_opts, &join_params2); - } - - //- rjf: produce utf-16 strings - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, options->path); - String16 env16 = str16_from_8(scratch.arena, env); - - //- rjf: launch - DWORD access_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - PROCESS_INFORMATION process_info = {0}; - AllocConsole(); - if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) - { - // check if we are 32-bit app, and just close it immediately - BOOL is_wow = 0; - IsWow64Process(process_info.hProcess, &is_wow); - if(is_wow) - { - MessageBox(0, "Sorry, The RAD Debugger only debugs 64-bit applications currently.", "Process error", MB_OK|MB_ICONSTOP); - DebugActiveProcessStop(process_info.dwProcessId); - TerminateProcess(process_info.hProcess,0xffffffff); - } - else - { - result = process_info.dwProcessId; - dmn_w32_shared->new_process_pending = 1; - } - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); - } - else - { - MessageBox(0, "Error starting process.", "Process error", MB_OK|MB_ICONSTOP); - } - FreeConsole(); - - //- rjf: eliminate all handles which have stuck around from the AllocConsole - { - SetStdHandle(STD_INPUT_HANDLE, 0); - SetStdHandle(STD_OUTPUT_HANDLE, 0); - SetStdHandle(STD_ERROR_HANDLE, 0); - } - - scratch_end(scratch); + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->run_gen); return result; } -internal B32 -dmn_attach_process(U32 pid) +internal U64 +dmn_mem_gen(void) { - B32 result = 0; - if(DebugActiveProcess((DWORD)pid)) - { - result = 1; - dmn_w32_shared->new_process_pending = 1; - } + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->mem_gen); return result; } -internal B32 -dmn_kill_process(DMN_Handle process, U32 exit_code) +internal U64 +dmn_reg_gen(void) { - B32 result = 0; - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - if(TerminateProcess(process_entity->handle, exit_code)) - { - result = 1; - } + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->reg_gen); return result; } -internal B32 -dmn_detach_process(DMN_Handle process) -{ - B32 result = 0; - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - - // rjf: resume threads - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; - child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Thread) - { - DWORD resume_result = ResumeThread(child->handle); - (void)resume_result; - } - } - - // rjf: detach - { - DWORD pid = (DWORD)process_entity->id; - if(DebugActiveProcessStop(pid)) - { - result = 1; - } - } - - // rjf: push into list of processes to generate events for later - if(result != 0) - { - dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); - } - - return result; -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Process/Thread Reads/Writes (Implemented Per-OS) - //- rjf: processes internal U64 @@ -2466,8 +2465,7 @@ dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) return result; } -//////////////////////////////// -//~ rjf: @dmn_os_hooks System Process Listing (Implemented Per-OS) +//- rjf: system process listing internal void dmn_process_iter_begin(DMN_ProcessIter *iter) From c636e1ad2ee7300810b1fa209a75367ad076c928 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 15:53:04 -0700 Subject: [PATCH 202/275] extend demon2 with explicit separation between blocking ctrl mechanisms & passive access/introspection/writing mechanisms; extend demon2 api with access mechanism --- src/ctrl/ctrl_core.c | 69 +++--- src/ctrl/ctrl_core.h | 20 +- src/demon2/demon2_core.h | 30 ++- src/demon2/win32/demon2_core_win32.c | 347 ++++++++++++++++----------- src/demon2/win32/demon2_core_win32.h | 5 + src/raddbg/raddbg.h | 17 +- 6 files changed, 293 insertions(+), 195 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 936d4d03..1987676d 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1717,6 +1717,7 @@ ctrl_thread__entry_point(void *p) { ThreadNameF("[ctrl] thread"); ProfBeginFunction(); + DMN_CtrlCtx *ctrl_ctx = dmn_ctrl_begin(); //- rjf: loop Temp scratch = scratch_begin(0, 0); @@ -1746,13 +1747,13 @@ ctrl_thread__entry_point(void *p) case CTRL_MsgKind_COUNT:{}break; //- rjf: target operations - case CTRL_MsgKind_LaunchAndHandshake:{ctrl_thread__launch_and_handshake(msg);}break; - case CTRL_MsgKind_LaunchAndInit: {ctrl_thread__launch_and_init (msg);}break; - case CTRL_MsgKind_Attach: {ctrl_thread__attach (msg);}break; - case CTRL_MsgKind_Kill: {ctrl_thread__kill (msg);}break; - case CTRL_MsgKind_Detach: {ctrl_thread__detach (msg);}break; - case CTRL_MsgKind_Run: {ctrl_thread__run (msg); done = 1;}break; - case CTRL_MsgKind_SingleStep: {ctrl_thread__single_step (msg); done = 1;}break; + case CTRL_MsgKind_LaunchAndHandshake:{ctrl_thread__launch_and_handshake(ctrl_ctx, msg);}break; + case CTRL_MsgKind_LaunchAndInit: {ctrl_thread__launch_and_init (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Run: {ctrl_thread__run (ctrl_ctx, msg); done = 1;}break; + case CTRL_MsgKind_SingleStep: {ctrl_thread__single_step (ctrl_ctx, msg); done = 1;}break; //- rjf: configuration case CTRL_MsgKind_SetUserEntryPoints: @@ -1899,7 +1900,7 @@ ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_MachineID //- rjf: attached process running/event gathering internal DMN_Event * -ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof) +ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof) { ProfBeginFunction(); DMN_Event *event = push_array(arena, DMN_Event, 1); @@ -2042,8 +2043,8 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls } } - //- rjf: no event -> dmn_run for a new one - if(got_event == 0) ProfScope("no event -> dmn_run for a new one") + //- rjf: no event -> dmn_ctrl_run for a new one + if(got_event == 0) ProfScope("no event -> dmn_ctrl_run for a new one") { // rjf: prep spoof B32 do_spoof = (spoof != 0 && dmn_handle_match(run_ctrls->single_step_thread, dmn_handle_zero())); @@ -2065,7 +2066,7 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls // rjf: run for new events ProfScope("run for new events") { - DMN_EventList events = dmn_run(scratch.arena, run_ctrls); + DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls); for(DMN_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next) { DMN_EventNode *dst_n = ctrl_state->free_dmn_event_node; @@ -2255,7 +2256,7 @@ ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size) //- rjf: msg kind implementations internal void -ctrl_thread__launch_and_handshake(CTRL_Msg *msg) +ctrl_thread__launch_and_handshake(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -2269,7 +2270,7 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg) opts.env = msg->env_string_list; opts.inherit_env = msg->env_inherit; } - U32 id = dmn_launch_process(&opts); + U32 id = dmn_ctrl_launch(ctrl_ctx, &opts); //- rjf: record start { @@ -2296,7 +2297,7 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg) // rjf: run until handshake-signifying events for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; @@ -2363,7 +2364,7 @@ ctrl_thread__launch_and_handshake(CTRL_Msg *msg) } internal void -ctrl_thread__launch_and_init(CTRL_Msg *msg) +ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -2378,7 +2379,7 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) opts.env = msg->env_string_list; opts.inherit_env = msg->env_inherit; } - U32 id = dmn_launch_process(&opts); + U32 id = dmn_ctrl_launch(ctrl_ctx, &opts); ////////////////////////////// //- rjf: record start @@ -2402,7 +2403,7 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) run_ctrls.run_entities_are_processes = 1; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; @@ -2686,14 +2687,14 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) } internal void -ctrl_thread__attach(CTRL_Msg *msg) +ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DBGI_Scope *scope = dbgi_scope_open(); //- rjf: attach - B32 attach_successful = dmn_attach_process(msg->entity_id); + B32 attach_successful = dmn_ctrl_attach(ctrl_ctx, msg->entity_id); //- rjf: run to handshake if(attach_successful) @@ -2704,7 +2705,7 @@ ctrl_thread__attach(CTRL_Msg *msg) run_ctrls.run_entities_are_processes = 1; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; @@ -2739,7 +2740,7 @@ ctrl_thread__attach(CTRL_Msg *msg) } internal void -ctrl_thread__kill(CTRL_Msg *msg) +ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -2748,7 +2749,7 @@ ctrl_thread__kill(CTRL_Msg *msg) U32 exit_code = msg->exit_code; //- rjf: send kill - B32 kill_worked = dmn_kill_process(process, exit_code); + B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code); //- rjf: wait for process to be dead if(kill_worked) @@ -2760,7 +2761,7 @@ ctrl_thread__kill(CTRL_Msg *msg) run_ctrls.run_entity_count = 1; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) { done = 1; @@ -2788,7 +2789,7 @@ ctrl_thread__kill(CTRL_Msg *msg) } internal void -ctrl_thread__detach(CTRL_Msg *msg) +ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -2796,7 +2797,7 @@ ctrl_thread__detach(CTRL_Msg *msg) DMN_Handle process = msg->entity; //- rjf: detach - B32 detach_worked = dmn_detach_process(process); + B32 detach_worked = dmn_ctrl_detach(ctrl_ctx, process); //- rjf: wait for process to be dead if(detach_worked) @@ -2808,7 +2809,7 @@ ctrl_thread__detach(CTRL_Msg *msg) run_ctrls.run_entity_count = 1; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) { done = 1; @@ -2836,7 +2837,7 @@ ctrl_thread__detach(CTRL_Msg *msg) } internal void -ctrl_thread__run(CTRL_Msg *msg) +ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -2959,7 +2960,7 @@ ctrl_thread__run(CTRL_Msg *msg) run_ctrls.single_step_thread = node->v; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; @@ -3062,7 +3063,7 @@ ctrl_thread__run(CTRL_Msg *msg) ////////////////////////// //- rjf: get next event // - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, run_spoof); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, run_spoof); ////////////////////////// //- rjf: determine event handling @@ -3298,7 +3299,7 @@ ctrl_thread__run(CTRL_Msg *msg) single_step_ctrls.single_step_thread = event->thread; for(B32 single_step_done = 0; single_step_done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &single_step_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); switch(event->kind) { default:{}break; @@ -3369,7 +3370,7 @@ ctrl_thread__run(CTRL_Msg *msg) single_step_ctrls.single_step_thread = target_thread; for(B32 single_step_done = 0; single_step_done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &single_step_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); switch(event->kind) { default:{}break; @@ -3454,7 +3455,7 @@ ctrl_thread__run(CTRL_Msg *msg) single_step_ctrls.single_step_thread = event->thread; for(B32 single_step_done = 0; single_step_done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &single_step_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); switch(event->kind) { default:{}break; @@ -3539,7 +3540,7 @@ ctrl_thread__run(CTRL_Msg *msg) } internal void -ctrl_thread__single_step(CTRL_Msg *msg) +ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -3561,7 +3562,7 @@ ctrl_thread__single_step(CTRL_Msg *msg) run_ctrls.single_step_thread = msg->entity; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, msg, &run_ctrls, 0); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index f74f2a83..2ac62d9b 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -699,23 +699,23 @@ internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); internal void ctrl_thread__entry_point(void *p); //- rjf: breakpoint resolution -internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); //- rjf: attached process running/event gathering -internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); +internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); //- rjf: eval helpers internal B32 ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size); //- rjf: msg kind implementations -internal void ctrl_thread__launch_and_handshake(CTRL_Msg *msg); -internal void ctrl_thread__launch_and_init(CTRL_Msg *msg); -internal void ctrl_thread__attach(CTRL_Msg *msg); -internal void ctrl_thread__kill(CTRL_Msg *msg); -internal void ctrl_thread__detach(CTRL_Msg *msg); -internal void ctrl_thread__run(CTRL_Msg *msg); -internal void ctrl_thread__single_step(CTRL_Msg *msg); +internal void ctrl_thread__launch_and_handshake(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); //////////////////////////////// //~ rjf: Memory-Stream Thread Functions diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index adb84bd4..6ff8e2d3 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -4,6 +4,20 @@ #ifndef DEMON2_CORE_H #define DEMON2_CORE_H +//////////////////////////////// +//~ rjf: Control-Thread-Only Context +// +// An instance of this struct must ONLY be returned by dmn_ctrl_begin, and only +// used by the thread which called it. All APIs which can ONLY run on the +// control thread, which blocks to control & receive events, will take this +// parameter. All other APIs can be called from any thread. + +typedef struct DMN_CtrlCtx DMN_CtrlCtx; +struct DMN_CtrlCtx +{ + U64 u64 [1]; +}; + //////////////////////////////// //~ rjf: Handle Types @@ -174,11 +188,12 @@ internal void dmn_init(void); //////////////////////////////// //~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) -internal U32 dmn_launch_process(OS_LaunchOptions *options); -internal B32 dmn_attach_process(U32 pid); -internal B32 dmn_kill_process(DMN_Handle process, U32 exit_code); -internal B32 dmn_detach_process(DMN_Handle process); -internal DMN_EventList dmn_run(Arena *arena, DMN_RunCtrls *ctrls); +internal DMN_CtrlCtx *dmn_ctrl_begin(void); +internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_LaunchOptions *options); +internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid); +internal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code); +internal B32 dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process); +internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls); //////////////////////////////// //~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) @@ -193,6 +208,11 @@ internal U64 dmn_run_gen(void); internal U64 dmn_mem_gen(void); internal U64 dmn_reg_gen(void); +//- rjf: non-blocking-control-thread access barriers +internal B32 dmn_access_open(void); +internal void dmn_access_close(void); +#define DMN_AccessScope DeferLoopChecked(dmn_access_open(), dmn_access_close()) + //- rjf: processes internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index ddf921c9..6a86c4e5 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -1073,6 +1073,7 @@ dmn_init(void) Arena *arena = arena_alloc(); dmn_w32_shared = push_array(arena, DMN_W32_Shared, 1); dmn_w32_shared->arena = arena; + dmn_w32_shared->access_mutex = os_mutex_alloc(); dmn_w32_shared->detach_arena = arena_alloc(); dmn_w32_shared->entities_arena = arena_alloc__sized(GB(8), KB(64)); dmn_w32_shared->entities_base = dmn_w32_entity_alloc(&dmn_w32_entity_nil, DMN_W32_EntityKind_Root, 0); @@ -1110,102 +1111,111 @@ dmn_init(void) //////////////////////////////// //~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) +internal DMN_CtrlCtx * +dmn_ctrl_begin(void) +{ + DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; + dmn_w32_ctrl_thread = 1; + return ctx; +} + internal U32 -dmn_launch_process(OS_LaunchOptions *options) +dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_LaunchOptions *options) { Temp scratch = scratch_begin(0, 0); U32 result = 0; - - //- rjf: produce exe / arguments string - String8 cmd = {0}; - if(options->cmd_line.first != 0) + DMN_AccessScope { - String8List args = {0}; - String8 exe_path = options->cmd_line.first->string; - str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); - for(String8Node *n = options->cmd_line.first->next; n != 0; n = n->next) + //- rjf: produce exe / arguments string + String8 cmd = {0}; + if(options->cmd_line.first != 0) { - str8_list_push(scratch.arena, &args, n->string); - } - StringJoin join_params = {0}; - join_params.sep = str8_lit(" "); - cmd = str8_list_join(scratch.arena, &args, &join_params); - } - - //- rjf: produce environment strings - String8 env = {0}; - { - String8List all_opts = options->env; - if(options->inherit_env != 0) - { - MemoryZeroStruct(&all_opts); - str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); - for(String8Node *n = options->env.first; n != 0; n = n->next) + String8List args = {0}; + String8 exe_path = options->cmd_line.first->string; + str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); + for(String8Node *n = options->cmd_line.first->next; n != 0; n = n->next) { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); + str8_list_push(scratch.arena, &args, n->string); } + StringJoin join_params = {0}; + join_params.sep = str8_lit(" "); + cmd = str8_list_join(scratch.arena, &args, &join_params); } - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - env = str8_list_join(scratch.arena, &all_opts, &join_params2); - } - - //- rjf: produce utf-16 strings - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, options->path); - String16 env16 = str16_from_8(scratch.arena, env); - - //- rjf: launch - DWORD access_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - PROCESS_INFORMATION process_info = {0}; - AllocConsole(); - if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) - { - // check if we are 32-bit app, and just close it immediately - BOOL is_wow = 0; - IsWow64Process(process_info.hProcess, &is_wow); - if(is_wow) + + //- rjf: produce environment strings + String8 env = {0}; { - MessageBox(0, "Sorry, The RAD Debugger only debugs 64-bit applications currently.", "Process error", MB_OK|MB_ICONSTOP); - DebugActiveProcessStop(process_info.dwProcessId); - TerminateProcess(process_info.hProcess,0xffffffff); + String8List all_opts = options->env; + if(options->inherit_env != 0) + { + MemoryZeroStruct(&all_opts); + str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); + for(String8Node *n = options->env.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + } + StringJoin join_params2 = {0}; + join_params2.sep = str8_lit("\0"); + join_params2.post = str8_lit("\0"); + env = str8_list_join(scratch.arena, &all_opts, &join_params2); + } + + //- rjf: produce utf-16 strings + String16 cmd16 = str16_from_8(scratch.arena, cmd); + String16 dir16 = str16_from_8(scratch.arena, options->path); + String16 env16 = str16_from_8(scratch.arena, env); + + //- rjf: launch + DWORD access_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; + STARTUPINFOW startup_info = {sizeof(startup_info)}; + PROCESS_INFORMATION process_info = {0}; + AllocConsole(); + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + { + // check if we are 32-bit app, and just close it immediately + BOOL is_wow = 0; + IsWow64Process(process_info.hProcess, &is_wow); + if(is_wow) + { + MessageBox(0, "Sorry, The RAD Debugger only debugs 64-bit applications currently.", "Process error", MB_OK|MB_ICONSTOP); + DebugActiveProcessStop(process_info.dwProcessId); + TerminateProcess(process_info.hProcess,0xffffffff); + } + else + { + result = process_info.dwProcessId; + dmn_w32_shared->new_process_pending = 1; + } + CloseHandle(process_info.hProcess); + CloseHandle(process_info.hThread); } else { - result = process_info.dwProcessId; - dmn_w32_shared->new_process_pending = 1; + MessageBox(0, "Error starting process.", "Process error", MB_OK|MB_ICONSTOP); + } + FreeConsole(); + + //- rjf: eliminate all handles which have stuck around from the AllocConsole + { + SetStdHandle(STD_INPUT_HANDLE, 0); + SetStdHandle(STD_OUTPUT_HANDLE, 0); + SetStdHandle(STD_ERROR_HANDLE, 0); } - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); } - else - { - MessageBox(0, "Error starting process.", "Process error", MB_OK|MB_ICONSTOP); - } - FreeConsole(); - - //- rjf: eliminate all handles which have stuck around from the AllocConsole - { - SetStdHandle(STD_INPUT_HANDLE, 0); - SetStdHandle(STD_OUTPUT_HANDLE, 0); - SetStdHandle(STD_ERROR_HANDLE, 0); - } - scratch_end(scratch); return result; } internal B32 -dmn_attach_process(U32 pid) +dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) { B32 result = 0; - if(DebugActiveProcess((DWORD)pid)) + DMN_AccessScope if(DebugActiveProcess((DWORD)pid)) { result = 1; dmn_w32_shared->new_process_pending = 1; @@ -1214,57 +1224,63 @@ dmn_attach_process(U32 pid) } internal B32 -dmn_kill_process(DMN_Handle process, U32 exit_code) +dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) { B32 result = 0; - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - if(TerminateProcess(process_entity->handle, exit_code)) + DMN_AccessScope { - result = 1; + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + if(TerminateProcess(process_entity->handle, exit_code)) + { + result = 1; + } } return result; } internal B32 -dmn_detach_process(DMN_Handle process) +dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) { B32 result = 0; - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - - // rjf: resume threads - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; - child = child->next) + DMN_AccessScope { - if(child->kind == DMN_W32_EntityKind_Thread) + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + + // rjf: resume threads + for(DMN_W32_Entity *child = process_entity->first; + child != &dmn_w32_entity_nil; + child = child->next) { - DWORD resume_result = ResumeThread(child->handle); - (void)resume_result; + if(child->kind == DMN_W32_EntityKind_Thread) + { + DWORD resume_result = ResumeThread(child->handle); + (void)resume_result; + } + } + + // rjf: detach + { + DWORD pid = (DWORD)process_entity->id; + if(DebugActiveProcessStop(pid)) + { + result = 1; + } + } + + // rjf: push into list of processes to generate events for later + if(result != 0) + { + dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); } } - - // rjf: detach - { - DWORD pid = (DWORD)process_entity->id; - if(DebugActiveProcessStop(pid)) - { - result = 1; - } - } - - // rjf: push into list of processes to generate events for later - if(result != 0) - { - dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); - } - return result; } internal DMN_EventList -dmn_run(Arena *arena, DMN_RunCtrls *ctrls) +dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_EventList events = {0}; + dmn_access_open(); ////////////////////////////// //- rjf: determine event generation path @@ -2319,6 +2335,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) }break; } + dmn_access_close(); return events; } @@ -2378,21 +2395,56 @@ dmn_reg_gen(void) return result; } +//- rjf: non-blocking-control-thread access barriers + +internal B32 +dmn_access_open(void) +{ + B32 result = 0; + if(dmn_w32_ctrl_thread) + { + result = 1; + } + else + { + os_mutex_take(dmn_w32_shared->access_mutex); + result = !dmn_w32_shared->access_run_state; + } + return result; +} + +internal void +dmn_access_close(void) +{ + if(!dmn_w32_ctrl_thread) + { + os_mutex_drop(dmn_w32_shared->access_mutex); + } +} + //- rjf: processes internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); - U64 result = dmn_w32_process_read(entity->handle, range, dst); + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); + result = dmn_w32_process_read(entity->handle, range, dst); + } return result; } internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); - B32 result = dmn_w32_process_write(entity->handle, range, src); + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); + result = dmn_w32_process_write(entity->handle, range, src); + } return result; } @@ -2401,37 +2453,45 @@ dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) internal Architecture dmn_arch_from_thread(DMN_Handle handle) { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - return entity->arch; + Architecture arch = Architecture_Null; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + arch = entity->arch; + } + return arch; } internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle) { U64 result = 0; - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - if(thread->kind == DMN_W32_EntityKind_Thread) + DMN_AccessScope { - DMN_W32_Entity *process = thread->parent; - U64 tlb = thread->thread.thread_local_base; - switch(thread->arch) + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + if(thread->kind == DMN_W32_EntityKind_Thread) { - case Architecture_Null: - case Architecture_COUNT: - {}break; - case Architecture_arm64: - case Architecture_arm32: - {NotImplemented;}break; - case Architecture_x64: + DMN_W32_Entity *process = thread->parent; + U64 tlb = thread->thread.thread_local_base; + switch(thread->arch) { - U64 stack_base_addr = tlb + 0x8; - dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); - }break; - case Architecture_x86: - { - U64 stack_base_addr = tlb + 0x4; - dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result); - }break; + case Architecture_Null: + case Architecture_COUNT: + {}break; + case Architecture_arm64: + case Architecture_arm32: + {NotImplemented;}break; + case Architecture_x64: + { + U64 stack_base_addr = tlb + 0x8; + dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); + }break; + case Architecture_x86: + { + U64 stack_base_addr = tlb + 0x4; + dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result); + }break; + } } } return result; @@ -2441,10 +2501,13 @@ internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle) { U64 result = 0; - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - if(entity->kind == DMN_W32_EntityKind_Thread) + DMN_AccessScope { - result = entity->thread.thread_local_base; + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + if(entity->kind == DMN_W32_EntityKind_Thread) + { + result = entity->thread.thread_local_base; + } } return result; } @@ -2452,16 +2515,24 @@ dmn_tls_root_vaddr_from_thread(DMN_Handle handle) internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - B32 result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block); + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block); + } return result; } internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - B32 result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block); + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block); + } return result; } diff --git a/src/demon2/win32/demon2_core_win32.h b/src/demon2/win32/demon2_core_win32.h index d75ee249..15e2e3ac 100644 --- a/src/demon2/win32/demon2_core_win32.h +++ b/src/demon2/win32/demon2_core_win32.h @@ -194,6 +194,10 @@ struct DMN_W32_Shared Arena *arena; String8List env_strings; + // rjf: access locking mechanism + OS_Handle access_mutex; + B32 access_run_state; + // rjf: run/mem/reg gens U64 run_gen; U64 mem_gen; @@ -232,6 +236,7 @@ struct DMN_W32_Shared global DMN_W32_Shared *dmn_w32_shared = 0; global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil}; global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0; +thread_static B32 dmn_w32_ctrl_thread = 0; //////////////////////////////// //~ rjf: Basic Helpers diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 11efef73..c28a1950 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -1,18 +1,21 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Demon2 Pass Tasks +// +// [ ] solidify synchronization mechanisms for usage of demon2 layer +// [ ] TLS eval correctness +// [ ] TLS eval -> in-process-memory EXE info +// [ ] unwinding -> in-process-memory EXE info +// [ ] freezing thread while running -> soft-halt + //////////////////////////////// //~ rjf: Frontend/UI Pass Tasks // -// [x] hover-eval when window is not focused - maybe just start directly -// using mouse-move events here -// [x] CRT asserts - stepping over int 29 should work just like stepping over -// an int3 -// [ ] check new callstack caching rules very strongly // [ ] committing needs to happen when navigating focus away for any reason // [ ] better discoverability for view rules - have better help hover tooltip, // info on arguments, and better autocomplete lister -// [ ] freezing thread while running -> soft-halt // // [ ] source view -> floating margin/line-nums // [ ] theme colors -> more explicit about e.g. opaque backgrounds vs. floating @@ -81,8 +84,6 @@ // [ ] disasm animation & go-to-address // // [ ] visualize remapped files (via path map) -// -// [x] DBGI layer is case-sensitive even on case-insensitive systems //////////////////////////////// //~ rjf: Hot, Medium Priority Tasks (Low-Hanging-Fruit Features, UI Jank, Cleanup) From 2c8c9a497ca53f0a01885c815cc5e2dbb2320404 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 16:15:20 -0700 Subject: [PATCH 203/275] parameterize ctrl thread registers cache with entity store, rather than relying on implicit demon-api-provided cache --- src/ctrl/ctrl_core.c | 50 ++++++++-------------------- src/ctrl/ctrl_core.h | 11 ++---- src/demon2/demon2_core.h | 3 ++ src/demon2/win32/demon2_core_win32.c | 18 ++++++++++ src/df/core/df_core.c | 14 ++++---- src/regs/generated/regs.meta.c | 2 +- src/regs/regs.mdesk | 2 +- 7 files changed, 46 insertions(+), 54 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 1987676d..fa06d999 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -800,7 +800,6 @@ ctrl_init(void) Arena *arena = arena_alloc(); ctrl_state = push_array(arena, CTRL_State, 1); ctrl_state->arena = arena; - ctrl_state->ctrl_run_mutex = os_mutex_alloc(); for(Architecture arch = (Architecture)0; arch < Architecture_COUNT; arch = (Architecture)(arch+1)) { String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); @@ -1284,10 +1283,11 @@ ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, //- rjf: thread register cache reading internal void * -ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread) +ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread) { CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache; - Architecture arch = dmn_arch_from_thread(thread); + CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); + Architecture arch = thread_entity->arch; U64 reg_block_size = regs_block_size_from_architecture(arch); U64 hash = ctrl_hash_from_machine_id_handle(machine_id, thread); U64 slot_idx = hash%cache->slots_count; @@ -1346,14 +1346,11 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, { U64 current_reg_gen = dmn_reg_gen(); B32 need_stale = 1; - if(node->reg_gen != current_reg_gen) + if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, result)) { - OS_MutexScope(ctrl_state->ctrl_run_mutex) if(ctrl_state->ctrl_run_state == 0 && dmn_thread_read_reg_block(thread, result)) - { - need_stale = 0; - node->reg_gen = current_reg_gen; - MemoryCopy(node->block, result, reg_block_size); - } + need_stale = 0; + node->reg_gen = current_reg_gen; + MemoryCopy(node->block, result, reg_block_size); } if(need_stale) { @@ -1365,34 +1362,24 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, } internal U64 -ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) +ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread) { U64 result = dmn_tls_root_vaddr_from_thread(thread); return result; } internal U64 -ctrl_query_cached_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) +ctrl_query_cached_rip_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread) { Temp scratch = scratch_begin(0, 0); - Architecture arch = dmn_arch_from_thread(thread); - void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread); + CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); + Architecture arch = thread_entity->arch; + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread); U64 result = regs_rip_from_arch_block(arch, block); scratch_end(scratch); return result; } -internal U64 -ctrl_query_cached_rsp_from_thread(CTRL_MachineID machine_id, DMN_Handle thread) -{ - Temp scratch = scratch_begin(0, 0); - Architecture arch = dmn_arch_from_thread(thread); - void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, machine_id, thread); - U64 result = regs_rsp_from_arch_block(arch, block); - scratch_end(scratch); - return result; -} - //- rjf: thread register writing internal B32 @@ -1728,13 +1715,8 @@ ctrl_thread__entry_point(void *p) //- rjf: get next messages CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); - //- rjf: begin run state - OS_MutexScope(ctrl_state->ctrl_run_mutex) - { - ctrl_state->ctrl_run_state = 1; - } - //- rjf: process messages + DMN_CtrlExclusiveAccessScope { B32 done = 0; for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0 && done == 0; msg_n = msg_n->next) @@ -1768,12 +1750,6 @@ ctrl_thread__entry_point(void *p) } } } - - //- rjf: end run state - OS_MutexScope(ctrl_state->ctrl_run_mutex) - { - ctrl_state->ctrl_run_state = 0; - } } scratch_end(scratch); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 2ac62d9b..02ca8006 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -491,10 +491,6 @@ struct CTRL_State EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT]; EVAL_String2NumMap arch_string2alias_tables[Architecture_COUNT]; - // rjf: access locking mechanism - OS_Handle ctrl_run_mutex; - B32 ctrl_run_state; - // rjf: caches CTRL_ProcessMemoryCache process_memory_cache; CTRL_ThreadRegCache thread_reg_cache; @@ -654,10 +650,9 @@ internal B32 ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, R //~ rjf: Thread Register Functions //- rjf: thread register cache reading -internal void *ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id, DMN_Handle thread); -internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); -internal U64 ctrl_query_cached_rip_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); -internal U64 ctrl_query_cached_rsp_from_thread(CTRL_MachineID machine_id, DMN_Handle thread); +internal void *ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread); +internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread); +internal U64 ctrl_query_cached_rip_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread); //- rjf: thread register writing internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block); diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h index 6ff8e2d3..e0e3860e 100644 --- a/src/demon2/demon2_core.h +++ b/src/demon2/demon2_core.h @@ -189,6 +189,9 @@ internal void dmn_init(void); //~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) internal DMN_CtrlCtx *dmn_ctrl_begin(void); +internal void dmn_ctrl_exclusive_access_begin(void); +internal void dmn_ctrl_exclusive_access_end(void); +#define DMN_CtrlExclusiveAccessScope DeferLoop(dmn_ctrl_exclusive_access_begin(), dmn_ctrl_exclusive_access_end()) internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_LaunchOptions *options); internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid); internal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code); diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index 6a86c4e5..39b41e6a 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -1119,6 +1119,24 @@ dmn_ctrl_begin(void) return ctx; } +internal void +dmn_ctrl_exclusive_access_begin(void) +{ + OS_MutexScope(dmn_w32_shared->access_mutex) + { + dmn_w32_shared->access_run_state = 1; + } +} + +internal void +dmn_ctrl_exclusive_access_end(void) +{ + OS_MutexScope(dmn_w32_shared->access_mutex) + { + dmn_w32_shared->access_run_state = 0; + } +} + internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_LaunchOptions *options) { diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 9321cd09..0d3fbf74 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -2822,7 +2822,7 @@ df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread) // rjf: thread => unpacked info DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); // rjf: ip => machine code String8 machine_code = {0}; @@ -2861,7 +2861,7 @@ df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread) DF_Entity *module = df_module_from_thread(thread); DF_Entity *binary = df_binary_file_from_module(module); Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); // rjf: ip => line vaddr range Rng1U64 line_vaddr_rng = {0}; @@ -2986,7 +2986,7 @@ df_trap_net_from_thread__step_into_line(Arena *arena, DF_Entity *thread) DF_Entity *module = df_module_from_thread(thread); DF_Entity *binary = df_binary_file_from_module(module); Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); // rjf: ip => line vaddr range Rng1U64 line_vaddr_rng = {0}; @@ -3659,7 +3659,7 @@ internal B32 df_set_thread_rip(DF_Entity *thread, U64 vaddr) { Temp scratch = scratch_begin(0, 0); - void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, thread->ctrl_machine_id, thread->ctrl_handle); + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); regs_arch_block_write_rip(thread->arch, block, vaddr); B32 result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, block); @@ -4081,7 +4081,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ //- rjf: unpack arguments DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - U64 tls_root_vaddr = ctrl_query_cached_tls_root_vaddr_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); + U64 tls_root_vaddr = ctrl_query_cached_tls_root_vaddr_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); DF_Entity *process = thread->parent; U64 unwind_count = ctrl_ctx->unwind_count; CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); @@ -6195,7 +6195,7 @@ df_query_cached_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count) U64 result = 0; if(unwind_count == 0) { - result = ctrl_query_cached_rip_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); + result = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); } else { @@ -6599,7 +6599,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) // rjf: thread hit user breakpoint -> increment breakpoint hit count if(event->cause == CTRL_EventCause_UserBreakpoint) { - U64 stop_thread_vaddr = ctrl_query_cached_rip_from_thread(stop_thread->ctrl_machine_id, stop_thread->ctrl_handle); + U64 stop_thread_vaddr = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, stop_thread->ctrl_machine_id, stop_thread->ctrl_handle); DF_Entity *process = df_entity_ancestor_from_kind(stop_thread, DF_EntityKind_Process); DF_Entity *module = df_module_from_process_vaddr(process, stop_thread_vaddr); DF_Entity *binary = df_binary_file_from_module(module); diff --git a/src/regs/generated/regs.meta.c b/src/regs/generated/regs.meta.c index 6e8d2707..213acb9b 100644 --- a/src/regs/generated/regs.meta.c +++ b/src/regs/generated/regs.meta.c @@ -5,7 +5,7 @@ internal U64 regs_block_size_from_architecture(Architecture arch) { -U64 result = 0; +U64 result = 8; switch(arch) { default:{}break; diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index 6370a1d4..cfebf067 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -421,7 +421,7 @@ regs_g_reg_code_x86_usage_kind_table: { `internal U64 regs_block_size_from_architecture(Architecture arch)`; `{`; - `U64 result = 0;`; + `U64 result = 8;`; `switch(arch)`; `{`; `default:{}break;`; From 7cd524d39d7a0c6094e3ff48ae907e591c14b0f3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 16:19:35 -0700 Subject: [PATCH 204/275] fix tls base calculation in demon2 --- src/demon2/win32/demon2_core_win32.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index 39b41e6a..ab320c3d 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -2525,6 +2525,23 @@ dmn_tls_root_vaddr_from_thread(DMN_Handle handle) if(entity->kind == DMN_W32_EntityKind_Thread) { result = entity->thread.thread_local_base; + switch(entity->arch) + { + case Architecture_Null: + case Architecture_COUNT: + {}break; + case Architecture_arm64: + case Architecture_arm32: + {NotImplemented;}break; + case Architecture_x64: + { + result += 88; + }break; + case Architecture_x86: + { + result += 44; + }break; + } } } return result; From 928532f386c2f0144dc7243576a6f4bf9668b49b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 16:29:50 -0700 Subject: [PATCH 205/275] do not attempt to refresh tls base calculation cache, if targets running --- src/df/core/df_core.c | 143 +++++++++++++++++++++--------------------- src/raddbg/raddbg.h | 4 +- 2 files changed, 75 insertions(+), 72 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 0d3fbf74..df6ae29f 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -2520,11 +2520,13 @@ df_set_thread_freeze_state(DF_Entity *thread, B32 frozen) } node->handle = thread_handle; df_handle_list_push_node(&df_state->frozen_threads, node); + df_state->entities_mut_soft_halt = 1; } // rjf: frozen => not frozen if(is_frozen && !should_be_frozen) { + df_state->entities_mut_soft_halt = 1; df_handle_list_remove(&df_state->frozen_threads, already_frozen_node); SLLStackPush(df_state->free_handle_node, already_frozen_node); } @@ -3542,83 +3544,84 @@ df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 U64 base_vaddr = 0; Temp scratch = scratch_begin(0, 0); DBGI_Scope *scope = dbgi_scope_open(); - - //- rjf: unpack thread info - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - DF_Entity *binary = df_binary_file_from_module(module); - DBGI_Parse *dbgi = df_dbgi_parse_from_binary_file(scope, binary); - String8 bin_data = str8((U8 *)dbgi->exe_base, dbgi->exe_props.size); - PE_BinInfo *bin = &dbgi->pe; - B32 bin_is_pe = 1; // TODO(rjf): this path needs to change for ELF - U64 addr_size = bit_size_from_arch(bin->arch)/8; - - //- rjf: grab tls range - Rng1U64 tls_vaddr_range = pe_tls_rng_from_bin_base_vaddr(bin_data, bin, df_base_vaddr_from_module(module)); - - //- rjf: read module's TLS index - U64 tls_index = 0; + if(!df_ctrl_targets_running()) { - CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, 0); - if(tls_index_slice.data.size >= addr_size) - { - tls_index = *(U64 *)tls_index_slice.data.str; - } - } - - //- rjf: PE path - if(bin_is_pe) - { - U64 thread_info_addr = root_vaddr; - U64 tls_addr_off = tls_index*addr_size; - U64 tls_addr_array = 0; - CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0); - String8 tls_addr_array_data = tls_addr_array_slice.data; - if(tls_addr_array_data.size >= 8) - { - MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); - } - CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0); - String8 result_data = result_slice.data; - if(result_data.size >= 8) - { - MemoryCopy(&base_vaddr, result_data.str, sizeof(U64)); - } - } - - //- rjf: non-PE path (not implemented) - if(!bin_is_pe) - { - // TODO(rjf): not supported. old code from the prototype that Nick had sketched out: -#if 0 - // TODO(nick): This code works only if the linked c runtime library is glibc. - // Implement CRT detection here. + //- rjf: unpack thread info + DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); + DF_Entity *binary = df_binary_file_from_module(module); + DBGI_Parse *dbgi = df_dbgi_parse_from_binary_file(scope, binary); + String8 bin_data = str8((U8 *)dbgi->exe_base, dbgi->exe_props.size); + PE_BinInfo *bin = &dbgi->pe; + B32 bin_is_pe = 1; // TODO(rjf): this path needs to change for ELF + U64 addr_size = bit_size_from_arch(bin->arch)/8; - U64 dtv_addr = UINT64_MAX; - demon_read_memory(process->demon_handle, &dtv_addr, thread_info_addr, addr_size); + //- rjf: grab tls range + Rng1U64 tls_vaddr_range = pe_tls_rng_from_bin_base_vaddr(bin_data, bin, df_base_vaddr_from_module(module)); - /* - union delta_thread_vector + //- rjf: read module's TLS index + U64 tls_index = 0; + { + CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, 0); + if(tls_index_slice.data.size >= addr_size) { - size_t counter; - struct - { - void *value; - void *to_free; - } pointer; - }; - */ - - U64 dtv_size = 16; - U64 dtv_count = 0; - demon_read_memory(process->demon_handle, &dtv_count, dtv_addr - dtv_size, addr_size); - - if (tls_index > 0 && tls_index < dtv_count) - { - demon_read_memory(process->demon_handle, &result, dtv_addr + dtv_size*tls_index, addr_size); + tls_index = *(U64 *)tls_index_slice.data.str; + } } + + //- rjf: PE path + if(bin_is_pe) + { + U64 thread_info_addr = root_vaddr; + U64 tls_addr_off = tls_index*addr_size; + U64 tls_addr_array = 0; + CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0); + String8 tls_addr_array_data = tls_addr_array_slice.data; + if(tls_addr_array_data.size >= 8) + { + MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); + } + CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0); + String8 result_data = result_slice.data; + if(result_data.size >= 8) + { + MemoryCopy(&base_vaddr, result_data.str, sizeof(U64)); + } + } + + //- rjf: non-PE path (not implemented) + if(!bin_is_pe) + { + // TODO(rjf): not supported. old code from the prototype that Nick had sketched out: +#if 0 + // TODO(nick): This code works only if the linked c runtime library is glibc. + // Implement CRT detection here. + + U64 dtv_addr = UINT64_MAX; + demon_read_memory(process->demon_handle, &dtv_addr, thread_info_addr, addr_size); + + /* + union delta_thread_vector + { + size_t counter; + struct + { + void *value; + void *to_free; + } pointer; + }; + */ + + U64 dtv_size = 16; + U64 dtv_count = 0; + demon_read_memory(process->demon_handle, &dtv_count, dtv_addr - dtv_size, addr_size); + + if (tls_index > 0 && tls_index < dtv_count) + { + demon_read_memory(process->demon_handle, &result, dtv_addr + dtv_size*tls_index, addr_size); + } #endif + } } - dbgi_scope_close(scope); scratch_end(scratch); ProfEnd(); diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index c28a1950..d6f39ba9 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -4,8 +4,8 @@ //////////////////////////////// //~ rjf: Demon2 Pass Tasks // -// [ ] solidify synchronization mechanisms for usage of demon2 layer -// [ ] TLS eval correctness +// [x] solidify synchronization mechanisms for usage of demon2 layer +// [x] TLS eval correctness // [ ] TLS eval -> in-process-memory EXE info // [ ] unwinding -> in-process-memory EXE info // [ ] freezing thread while running -> soft-halt From 71f3d18bf7417dffc53251f640279a34c244030a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 16:30:04 -0700 Subject: [PATCH 206/275] notes --- src/raddbg/raddbg.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index d6f39ba9..eb035e73 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -4,11 +4,11 @@ //////////////////////////////// //~ rjf: Demon2 Pass Tasks // -// [x] solidify synchronization mechanisms for usage of demon2 layer -// [x] TLS eval correctness // [ ] TLS eval -> in-process-memory EXE info // [ ] unwinding -> in-process-memory EXE info -// [ ] freezing thread while running -> soft-halt +// [x] solidify synchronization mechanisms for usage of demon2 layer +// [x] TLS eval correctness +// [x] freezing thread while running -> soft-halt //////////////////////////////// //~ rjf: Frontend/UI Pass Tasks From 995804cc784a833221d9c59bfadd665d8d727d86 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 16:33:48 -0700 Subject: [PATCH 207/275] demon2 -> demon; eliminate original demon layer --- src/base/base_entry_point.c | 3 - src/demon/demon_accel.c | 198 -- src/demon/demon_accel.h | 64 - src/demon/demon_common.c | 271 --- src/demon/demon_common.h | 150 -- src/demon/demon_core.c | 850 +------ src/demon/demon_core.h | 328 ++- .../demon_core.mdesk} | 0 src/demon/demon_inc.c | 9 +- src/demon/demon_inc.h | 11 +- src/demon/demon_os.c | 28 - src/demon/demon_os.h | 98 - .../generated/demon.meta.c} | 0 .../generated/demon.meta.h} | 6 +- src/demon/linux/demon_os_linux.c | 2106 ---------------- src/demon/linux/demon_os_linux.h | 222 -- .../win32/demon_core_win32.c} | 0 .../win32/demon_core_win32.h} | 6 +- src/demon/win32/demon_os_win32.c | 2154 ----------------- src/demon/win32/demon_os_win32.h | 385 --- src/demon2/demon2_core.c | 153 -- src/demon2/demon2_core.h | 237 -- src/demon2/demon2_inc.c | 10 - src/demon2/demon2_inc.h | 15 - src/raddbg/raddbg.h | 4 +- src/raddbg/raddbg_main.cpp | 4 +- src/scratch/ryan_scratch.c | 4 +- 27 files changed, 219 insertions(+), 7097 deletions(-) delete mode 100644 src/demon/demon_accel.c delete mode 100644 src/demon/demon_accel.h delete mode 100644 src/demon/demon_common.c delete mode 100644 src/demon/demon_common.h rename src/{demon2/demon2_core.mdesk => demon/demon_core.mdesk} (100%) delete mode 100644 src/demon/demon_os.c delete mode 100644 src/demon/demon_os.h rename src/{demon2/generated/demon2.meta.c => demon/generated/demon.meta.c} (100%) rename src/{demon2/generated/demon2.meta.h => demon/generated/demon.meta.h} (95%) delete mode 100644 src/demon/linux/demon_os_linux.c delete mode 100644 src/demon/linux/demon_os_linux.h rename src/{demon2/win32/demon2_core_win32.c => demon/win32/demon_core_win32.c} (100%) rename src/{demon2/win32/demon2_core_win32.h => demon/win32/demon_core_win32.h} (99%) delete mode 100644 src/demon/win32/demon_os_win32.c delete mode 100644 src/demon/win32/demon_os_win32.h delete mode 100644 src/demon2/demon2_core.c delete mode 100644 src/demon2/demon2_core.h delete mode 100644 src/demon2/demon2_inc.c delete mode 100644 src/demon2/demon2_inc.h diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index f42cfc3d..cb6219a0 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -40,9 +40,6 @@ main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **argum txti_init(); #endif #if defined(DEMON_CORE_H) - demon_init(); -#endif -#if defined(DEMON2_CORE_H) dmn_init(); #endif #if defined(CTRL_CORE_H) diff --git a/src/demon/demon_accel.c b/src/demon/demon_accel.c deleted file mode 100644 index 156fb9f1..00000000 --- a/src/demon/demon_accel.c +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//- allen: Acceleration Layer Functions - -//- accel helpers -internal DEMON_AccelModule* -demon_accel_module_alloc(void){ - DEMON_AccelModule *result = demon_free_module_accel; - if (result != 0){ - SLLStackPop(demon_free_module_accel); - } - else{ - result = push_array_no_zero(demon_ent_arena, DEMON_AccelModule, 1); - } - MemoryZeroStruct(result); - return(result); -} - -internal void -demon_accel_module_free(DEMON_AccelModule *module){ - SLLStackPush(demon_free_module_accel, module); -} - -internal DEMON_AccelThread* -demon_accel_thread_alloc(void){ - DEMON_AccelThread *result = demon_free_thread_accel; - if (result != 0){ - SLLStackPop(demon_free_thread_accel); - } - else{ - result = push_array_no_zero(demon_ent_arena, DEMON_AccelThread, 1); - } - MemoryZeroStruct(result); - return(result); -} - -internal void -demon_accel_thread_free(DEMON_AccelThread *thread){ - SLLStackPush(demon_free_thread_accel, thread); -} - -internal DEMON_AccelThread* -demon_accel_from_thread(DEMON_Entity *thread){ - DEMON_AccelThread *accel = (DEMON_AccelThread*)thread->accel; - if (accel == 0){ - accel = demon_accel_thread_alloc(); - thread->accel = accel; - } - return(accel); -} - -//- operations on demon objects -internal String8 -demon_accel_full_path_from_module(Arena *arena, DEMON_Entity *module){ - DEMON_AccelModule *accel = (DEMON_AccelModule*)module->accel; - - String8 result = {0}; - - // first time - if (accel == 0){ - result = demon_os_full_path_from_module(arena, module); - - // build chain - DEMON_AccelModule *last_accel = 0; - - U8 *ptr = result.str; - U8 *opl = result.str + result.size; - for (;ptr < opl;){ - U64 size = (U64)(ptr - opl); - U64 clamped_size = ClampTop(result.size, sizeof(Member(DEMON_AccelModule, buf))); - - DEMON_AccelModule *node = demon_accel_module_alloc(); - SLLQueuePush(accel, last_accel, node); - node->total_size = result.size; - MemoryCopy(node->buf, ptr, clamped_size); - - ptr += clamped_size; - } - - // store in module - module->accel = accel; - } - - // read from accel - else{ - U64 size = accel->total_size; - U8 *str = push_array_no_zero(arena, U8, size + 1); - - // copy chain contents to buffer - U8 *ptr = str; - for (DEMON_AccelModule *node = accel; - node != 0; - node = node->next){ - U64 total_size = node->total_size; - U64 clamped_size = ClampTop(total_size, sizeof(node->buf)); - MemoryCopy(ptr, node->buf, clamped_size); - ptr += clamped_size; - } - *ptr = 0; - - // fill result - result.str = str; - result.size = size; - } - - return(result); -} - -internal U64 -demon_accel_stack_base_vaddr_from_thread(DEMON_Entity *thread){ - // get accel data - DEMON_AccelThread *accel = demon_accel_from_thread(thread); - - // fill stack base - if (!accel->has_stack_base){ - accel->has_stack_base = 1; - accel->stack_base = demon_os_stack_base_vaddr_from_thread(thread); - } - - return(accel->stack_base); -} - -internal U64 -demon_accel_tls_root_vaddr_from_thread(DEMON_Entity *thread){ - // get accel data - DEMON_AccelThread *accel = demon_accel_from_thread(thread); - - // fill tls root - if (!accel->has_tls_root){ - accel->has_tls_root = 1; - accel->tls_root = demon_os_tls_root_vaddr_from_thread(thread); - } - - return(accel->tls_root); -} - -internal void* -demon_accel_read_regs(DEMON_Entity *thread){ - // get accel data - DEMON_AccelThread *accel = demon_accel_from_thread(thread); - - // update reg cache - if (accel->reg_cache_time != demon_time){ - accel->reg_cache_time = demon_time; - B32 success = demon_os_read_regs(thread, &accel->regs); - if (!success){ - MemoryZeroStruct(&accel->regs); - } - } - - return(&accel->regs); -} - -internal void -demon_accel_write_regs(DEMON_Entity *thread, void *data){ - // get accel data - DEMON_AccelThread *accel = demon_accel_from_thread(thread); - - // write - U64 data_size = regs_block_size_from_architecture(thread->arch); - B32 success = demon_os_write_regs(thread, data); - - // update cache - if(success) - { - accel->reg_cache_time = demon_time; - MemoryCopy(&accel->regs, data, data_size); - } -} - -//- entity accel free -internal void -demon_accel_free(DEMON_Entity *entity){ - switch (entity->kind){ - default:{}break; - - case DEMON_EntityKind_Module: - { - if (entity->accel != 0){ - for (DEMON_AccelModule *node = (DEMON_AccelModule*)entity->accel, *next = 0; - node != 0; - node = next){ - next = node->next; - demon_accel_module_free(node); - } - } - }break; - - case DEMON_EntityKind_Thread: - { - if (entity->accel != 0){ - demon_accel_thread_free((DEMON_AccelThread*)entity->accel); - } - }break; - } -} diff --git a/src/demon/demon_accel.h b/src/demon/demon_accel.h deleted file mode 100644 index 0b6f8288..00000000 --- a/src/demon/demon_accel.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_ACCEL_H -#define DEMON_ACCEL_H - -//////////////////////////////// -//~ allen: Acceleration Data - -typedef struct DEMON_AccelModule DEMON_AccelModule; -struct DEMON_AccelModule -{ - DEMON_AccelModule *next; - U64 total_size; - U8 buf[240]; -}; - -typedef union DEMON_AccelThread DEMON_AccelThread; -union DEMON_AccelThread -{ - DEMON_AccelThread *next; - struct{ - B32 has_stack_base; - B32 has_tls_root; - U64 stack_base; - U64 tls_root; - - U64 reg_cache_time; - union{ - REGS_RegBlockX64 x64; - REGS_RegBlockX86 x86; - } regs; - }; -}; - -//////////////////////////////// -//~ allen: Acceleration Globals - -global DEMON_AccelModule *demon_free_module_accel = 0; -global DEMON_AccelThread *demon_free_thread_accel = 0; - -//////////////////////////////// -//~ allen: Acceleration Layer Functions - -//- accel helpers -internal DEMON_AccelModule *demon_accel_module_alloc(void); -internal void demon_accel_module_free(DEMON_AccelModule *module); - -internal DEMON_AccelThread *demon_accel_thread_alloc(void); -internal void demon_accel_thread_free(DEMON_AccelThread *thread); -internal DEMON_AccelThread *demon_accel_from_thread(DEMON_Entity *thread); - -//- operations on demon objects -internal String8 demon_accel_full_path_from_module(Arena *arena, DEMON_Entity *module); -internal U64 demon_accel_stack_base_vaddr_from_thread(DEMON_Entity *thread); -internal U64 demon_accel_tls_root_vaddr_from_thread(DEMON_Entity *thread); - -internal void* demon_accel_read_regs(DEMON_Entity *thread); -internal void demon_accel_write_regs(DEMON_Entity *thread, void *data); - -//- entity accel free -internal void demon_accel_free(DEMON_Entity *entity); - -#endif //DEMON_ACCEL_H diff --git a/src/demon/demon_common.c b/src/demon/demon_common.c deleted file mode 100644 index 1ae895d0..00000000 --- a/src/demon/demon_common.c +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): State Safety Helper - -internal B32 -demon_access_begin(void){ - B32 result = 0; - if (demon_primary_thread){ - Assert(demon_run_state); - result = 1; - } - else{ - os_mutex_take(demon_state_mutex); - if (demon_run_state){ - os_mutex_drop(demon_state_mutex); - } - else{ - result = 1; - } - } - return(result); -} - -internal void -demon_access_end(void){ - if (!demon_primary_thread){ - os_mutex_drop(demon_state_mutex); - } -} - -//////////////////////////////// -// NOTE(allen): Entity System - -internal void -demon_common_init(void){ - // access control mechanism - demon_state_mutex = os_mutex_alloc(); - - // time - demon_time = 1; - - // setup arena - demon_ent_arena = arena_alloc(); - - // setup map - demon_ent_map = push_array(demon_ent_arena, DEMON_Map, 1); - demon_ent_map->bucket_count = 4093; - demon_ent_map->buckets = push_array(demon_ent_arena, DEMON_MapSlot*, demon_ent_map->bucket_count); - - // setup entity memory - U64 reserve_size_unaligned = (DEMON_ENTITY_CAP)*sizeof(DEMON_Entity); - U64 reserve_size = AlignPow2(reserve_size_unaligned, DEMON_ENTITY_CMT_SIZE); - demon_ent_cmt = demon_ent_pos = demon_ent_base = (DEMON_Entity*)os_reserve(reserve_size); - demon_ent_opl = demon_ent_base + (reserve_size/sizeof(DEMON_Entity)); - - Assert(demon_ent_base != 0); - - // setup root - demon_ent_root = demon_ent_alloc(); - demon_ent_root->kind = DEMON_EntityKind_Root; -} - -internal DEMON_Entity* -demon_ent_alloc(void){ - DEMON_Entity *result = demon_ent_free; - if (result != 0){ - SLLStackPop(demon_ent_free); - } - else{ - if (demon_ent_pos < demon_ent_opl){ - if (ensure_commit(&demon_ent_cmt, demon_ent_pos + 1, DEMON_ENTITY_CMT_SIZE)){ - result = demon_ent_pos; - demon_ent_pos += 1; - } - } - } - if (result != 0){ - U32 gen = result->gen; - MemoryZeroStruct(result); - result->gen = gen; - } - return(result); -} - -//- handle <-> entity pointer - -internal DEMON_Entity* -demon_ent_ptr_from_handle(DEMON_Handle handle){ - Assert(demon_ent_base != 0); - DEMON_Entity *result = 0; - U32 index = (U32)(handle & 0xFFFFFFFF); - U64 count = (U64)(demon_ent_pos - demon_ent_base); - if (0 < index && index < count){ - DEMON_Entity *entity = demon_ent_base + index; - U32 gen = (U32)(handle >> 32); - if (gen == entity->gen){ - result = entity; - } - } - return(result); -} - -internal DEMON_Handle -demon_ent_handle_from_ptr(DEMON_Entity *entity){ - Assert(demon_ent_base != 0); - DEMON_Handle result = {0}; - if (demon_ent_base < entity && entity < demon_ent_pos){ - U32 index = (U32)(entity - demon_ent_base); - U64 gen = entity->gen; - result = (gen << 32) | index; - } - return(result); -} - -//- high level entity alloc,init,release - -internal DEMON_Entity* -demon_ent_new(DEMON_Entity *parent, DEMON_EntityKind kind, U64 id){ - Assert(demon_ent_base != 0); - DEMON_Entity *result = demon_ent_alloc(); - if (result != 0){ - result->kind = kind; - result->id = id; - result->arch = parent->arch; - result->parent = parent; - DLLPushBack(parent->first, parent->last, result); - demon_ent_map_save(kind, id, result); - } - return(result); -} - -internal void -demon_ent_release_single(DEMON_Entity *entity){ - switch (entity->kind){ - default:{}break; - case DEMON_EntityKind_Process: demon_proc_count -= 1; break; - case DEMON_EntityKind_Thread: demon_thread_count -= 1; break; - case DEMON_EntityKind_Module: demon_module_count -= 1; break; - } - demon_accel_free(entity); - demon_os_entity_cleanup(entity); - DEMON_MapRef ref = demon_ent_map_find(entity->kind, entity->id); - demon_ent_map_erase(ref); - entity->gen += 1; -} - -internal void -demon_ent_release_children(DEMON_Entity *root){ - Assert(demon_ent_base != 0); - if (root->first != 0){ - for (DEMON_Entity *node = root->first; - node != 0; - node = node->next){ - demon_ent_release_children(node); - demon_ent_release_single(node); - } - root->last->next = demon_ent_free; - demon_ent_free = root->first; - root->first = 0; - root->last = 0; - } -} - -internal void -demon_ent_release_root_and_children(DEMON_Entity *root){ - Assert(demon_ent_base != 0); - Assert(root->parent != 0); - - // release children - demon_ent_release_children(root); - - // release root - DEMON_Entity *parent = root->parent; - demon_ent_release_single(root); - DLLRemove(parent->first, parent->last, root); - SLLStackPush(demon_ent_free, root); -} - -//- entity map - -internal U64 -demon_ent_map_hash(U16 kind, U64 id){ - U64 result = ((U64)kind << 32) ^ id; - return(result); -} - -internal void -demon_ent_map_save(U16 kind, U64 id, DEMON_Entity *entity){ - Assert(demon_ent_base != 0); - DEMON_Map *map = demon_ent_map; - - // allocate a new slot - DEMON_MapSlot *slot = map->free_slots; - if (slot != 0){ - SLLStackPop(map->free_slots); - } - else{ - slot = push_array_no_zero(demon_ent_arena, DEMON_MapSlot, 1); - } - - // fill slot - slot->kind = kind; - slot->id = id; - slot->entity = entity; - - // insert into bucket - U64 hash = demon_ent_map_hash(kind, id); - U64 bucket_index = hash%map->bucket_count; - SLLStackPush(map->buckets[bucket_index], slot); -} - -internal DEMON_MapRef -demon_ent_map_find(U16 kind, U64 id){ - Assert(demon_ent_base != 0); - DEMON_Map *map = demon_ent_map; - - // scan bucket - DEMON_MapRef result = {0}; - U64 hash = demon_ent_map_hash(kind, id); - U64 bucket_index = hash%map->bucket_count; - for (DEMON_MapSlot **ptr = &map->buckets[bucket_index], *slot = 0; - *ptr != 0; - ptr = &slot->next){ - slot = *ptr; - if (slot->kind == kind && slot->id == id){ - result.slot = slot; - result.ptr_to_slot = ptr; - break; - } - } - - return(result); -} - -internal DEMON_Entity* -demon_ent_map_entity_from_id(U16 kind, U64 id){ - DEMON_Entity *result = 0; - DEMON_MapRef ref = demon_ent_map_find(kind, id); - if (ref.slot != 0){ - result = ref.slot->entity; - } - return(result); -} - -internal void -demon_ent_map_erase(DEMON_MapRef ref){ - Assert(demon_ent_base != 0); - DEMON_Map *map = demon_ent_map; - - // move slot to free list - if (ref.slot != 0){ - *ref.ptr_to_slot = ref.slot->next; - SLLStackPush(map->free_slots, ref.slot); - } -} - -//////////////////////////////// -// NOTE(allen): Event Helpers - -internal DEMON_Event* -demon_push_event(Arena *arena, DEMON_EventList *list, DEMON_EventKind kind){ - DEMON_EventNode *n = push_array(arena, DEMON_EventNode, 1); - DEMON_Event *result = &n->v; - SLLQueuePush(list->first, list->last, n); - list->count += 1; - result->kind = kind; - return(result); -} - diff --git a/src/demon/demon_common.h b/src/demon/demon_common.h deleted file mode 100644 index 07ec4765..00000000 --- a/src/demon/demon_common.h +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_COMMON_H -#define DEMON_COMMON_H - -//////////////////////////////// -//~ allen: DEMON Entity System - -typedef enum DEMON_EntityKind -{ - DEMON_EntityKind_NULL, - - DEMON_EntityKind_Root, - DEMON_EntityKind_Process, - DEMON_EntityKind_Thread, - DEMON_EntityKind_Module, - - DEMON_EntityKind_COUNT -} -DEMON_EntityKind; - -typedef struct DEMON_Entity DEMON_Entity; -struct DEMON_Entity -{ - // TODO(allen): these could be U32s - DEMON_Entity *next; - DEMON_Entity *prev; - DEMON_Entity *parent; - DEMON_Entity *first; - DEMON_Entity *last; - - DEMON_EntityKind kind; - Architecture arch; - U32 gen; - U64 id; - U64 addr_range_dim; - - // each OS backend decides how to use `ext` for each entity kind - union{ - void *ext; - U64 ext_u64; - }; - - // the accel layer attaches some extra information to some entities - void *accel; -}; - -//- id -> entity map -typedef struct DEMON_MapSlot DEMON_MapSlot; -struct DEMON_MapSlot -{ - DEMON_MapSlot *next; - U16 kind; - U64 id; - DEMON_Entity *entity; -}; - -typedef struct DEMON_Map DEMON_Map; -struct DEMON_Map -{ - DEMON_MapSlot **buckets; - U64 bucket_count; - DEMON_MapSlot *free_slots; -}; - -typedef struct DEMON_MapRef DEMON_MapRef; -struct DEMON_MapRef -{ - DEMON_MapSlot *slot; - DEMON_MapSlot **ptr_to_slot; -}; - -//- rjf: entity extrusive list - -typedef struct DEMON_EntityNode DEMON_EntityNode; -struct DEMON_EntityNode -{ - DEMON_EntityNode *next; - DEMON_Entity *entity; -}; - -//////////////////////////////// -//~ allen: Demon Globals - -thread_static B32 demon_primary_thread = 0; -global B32 demon_run_state = 0; -global OS_Handle demon_state_mutex = {0}; - -global U64 demon_time = 0; - -global Arena *demon_ent_arena = 0; -global DEMON_Map *demon_ent_map = 0; - -global DEMON_Entity *demon_ent_free = 0; -global DEMON_Entity *demon_ent_root = 0; - -global DEMON_Entity *demon_ent_base = 0; -global DEMON_Entity *demon_ent_pos = 0; -global DEMON_Entity *demon_ent_opl = 0; -global void *demon_ent_cmt = 0; - -global U64 demon_proc_count = 0; -global U64 demon_thread_count = 0; -global U64 demon_module_count = 0; - -#if !defined(DEMON_ENTITY_CMT_SIZE) -# define DEMON_ENTITY_CMT_SIZE KB(64) -#endif -#if !defined(DEMON_ENTITY_CAP) -# define DEMON_ENTITY_CAP 65536 -#endif - -StaticAssert(IsPow2(DEMON_ENTITY_CMT_SIZE), check_demon_entity_cmt_size); - -//////////////////////////////// -//~ allen: State Safety Helper - -internal B32 demon_access_begin(void); -internal void demon_access_end(void); - -//////////////////////////////// -//~ allen: Entity System - -internal void demon_common_init(void); -internal DEMON_Entity* demon_ent_alloc(void); - -//- handle <-> entity pointer -internal DEMON_Entity* demon_ent_ptr_from_handle(DEMON_Handle handle); -internal DEMON_Handle demon_ent_handle_from_ptr(DEMON_Entity *entity); - -//- high level entity alloc,init,release -internal DEMON_Entity* demon_ent_new(DEMON_Entity *parent, DEMON_EntityKind kind, U64 id); -internal void demon_ent_release_single(DEMON_Entity *entity); -internal void demon_ent_release_children(DEMON_Entity *root); -internal void demon_ent_release_root_and_children(DEMON_Entity *root); - -//- entity map -internal U64 demon_ent_map_hash(U16 kind, U64 id); -internal void demon_ent_map_save(U16 kind, U64 id, DEMON_Entity *entity); -internal DEMON_MapRef demon_ent_map_find(U16 kind, U64 id); -internal DEMON_Entity* demon_ent_map_entity_from_id(U16 kind, U64 id); -internal void demon_ent_map_erase(DEMON_MapRef map_ref); - -//////////////////////////////// -//~ allen: Event Helpers - -internal DEMON_Event* demon_push_event(Arena *arena, DEMON_EventList *list, DEMON_EventKind kind); - -#endif //DEMON_COMMON_H diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 43077629..86c1c3c6 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -2,148 +2,34 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: Main Layer Initialization +//~ rjf: Basic Type Functions (Helpers, Implemented Once) -internal void -demon_init(void){ - demon_common_init(); - demon_os_init(); +//- rjf: handles + +internal DMN_Handle +dmn_handle_zero(void) +{ + DMN_Handle h = {0}; + return h; } -//////////////////////////////// -//~ rjf: Basic Type Functions - -//- rjf: stringizing - -internal String8 -demon_string_from_event_kind(DEMON_EventKind kind){ - String8 result = str8_lit("unknown"); - switch (kind){ - default: break; - case DEMON_EventKind_Error: result = str8_lit("Error"); break; - case DEMON_EventKind_HandshakeComplete: result = str8_lit("HandshakeComplete"); break; - case DEMON_EventKind_CreateProcess: result = str8_lit("CreateProcess"); break; - case DEMON_EventKind_ExitProcess: result = str8_lit("ExitProcess"); break; - case DEMON_EventKind_CreateThread: result = str8_lit("CreateThread"); break; - case DEMON_EventKind_ExitThread: result = str8_lit("ExitThread"); break; - case DEMON_EventKind_LoadModule: result = str8_lit("LoadModule"); break; - case DEMON_EventKind_UnloadModule: result = str8_lit("UnloadModule"); break; - case DEMON_EventKind_Breakpoint: result = str8_lit("Breakpoint"); break; - case DEMON_EventKind_Trap: result = str8_lit("Trap"); break; - case DEMON_EventKind_SingleStep: result = str8_lit("SingleStep"); break; - case DEMON_EventKind_Exception: result = str8_lit("Exception"); break; - case DEMON_EventKind_Halt: result = str8_lit("Halt"); break; - case DEMON_EventKind_Memory: result = str8_lit("Memory"); break; - case DEMON_EventKind_DebugString: result = str8_lit("DebugString"); break; - case DEMON_EventKind_SetThreadName: result = str8_lit("SetThreadName"); break; - } - return(result); -} - -internal String8 -demon_string_from_memory_event_kind(DEMON_MemoryEventKind kind){ - String8 result = str8_lit("unknown"); - switch (kind){ - default: break; - case DEMON_MemoryEventKind_Commit: result = str8_lit("Commit"); break; - case DEMON_MemoryEventKind_Reserve: result = str8_lit("Reserve"); break; - case DEMON_MemoryEventKind_Decommit: result = str8_lit("Decommit"); break; - case DEMON_MemoryEventKind_Release: result = str8_lit("Release"); break; - } - return(result); -} - -internal String8 -demon_string_from_exception_kind(DEMON_ExceptionKind kind){ - String8 result = str8_lit("unknown"); - switch (kind){ - default: break; - case DEMON_ExceptionKind_MemoryRead: result = str8_lit("MemoryRead"); break; - case DEMON_ExceptionKind_MemoryWrite: result = str8_lit("MemoryWrite"); break; - case DEMON_ExceptionKind_MemoryExecute: result = str8_lit("MemoryExecute"); break; - case DEMON_ExceptionKind_CppThrow: result = str8_lit("CppThrow"); break; - } - return(result); -} - -internal void -demon_string_list_from_event(Arena *arena, String8List *out, DEMON_Event *event){ - B32 need_exception_info = (event->kind == DEMON_EventKind_Exception || - event->kind == DEMON_EventKind_Breakpoint || - event->kind == DEMON_EventKind_Halt || - event->kind == DEMON_EventKind_SingleStep); - - // allen: kind - String8 kind_string = demon_string_from_event_kind(event->kind); - str8_list_pushf(arena, out, "%S: { (%i)", kind_string, event->kind); - - // rjf: basics - { - str8_list_pushf(arena, out, " process: (%I64x)", event->process); - str8_list_pushf(arena, out, " thread: (%I64x)", event->thread); - str8_list_pushf(arena, out, " module: (%I64x)", event->module); - str8_list_pushf(arena, out, " address: (%I64x)", event->address, event->address); - str8_list_pushf(arena, out, " size: (0x%I64x, %I64u)", event->size, event->size); - } - - // rjf: string - if (event->string.size != 0){ - str8_list_pushf(arena, out, " string: \"%S\"", event->string); - } - - // rjf: exception info - if (need_exception_info){ - str8_list_pushf(arena, out, " code: (0x%x, %i)", event->code, event->code); - str8_list_pushf(arena, out, " flags: (0x%x, %i)", event->flags, event->flags); - str8_list_pushf(arena, out, " signo: (0x%x, %i)", event->signo, event->signo); - str8_list_pushf(arena, out, " sigcode: (0x%x, %i)", event->sigcode, event->sigcode); - } - - // rjf: need error info - if (event->kind == DEMON_EventKind_Error){ - str8_list_pushf(arena, out, " error_kind: (0x%x, %i)", event->error_kind, event->error_kind); - } - - // rjf: memory event kind info - if (event->memory_kind != DEMON_MemoryEventKind_Null){ - String8 memory_kind_string = demon_string_from_memory_event_kind(event->memory_kind); - str8_list_pushf(arena, out, " memory_kind: (%S, %i)", - memory_kind_string, event->memory_kind); - } - - // rjf: exception kind - if (need_exception_info){ - String8 exception_kind_string = demon_string_from_exception_kind(event->exception_kind); - str8_list_pushf(arena, out, " exception_kind: (%S, %i)", - exception_kind_string, event->exception_kind); - } - - // rjf: instruction ptr - if (event->instruction_pointer != 0){ - str8_list_pushf(arena, out, " instruction_pointer: (%I64x)", event->instruction_pointer); - } - - // rjf: stack ptr - if (event->stack_pointer != 0){ - str8_list_pushf(arena, out, " stack_pointer: (%I64x)", event->stack_pointer); - } - - str8_list_pushf(arena, out, " user_data: (0x%I64x, %I64u)", - event->user_data, event->user_data); - str8_list_pushf(arena, out, "}"); +internal B32 +dmn_handle_match(DMN_Handle a, DMN_Handle b) +{ + return a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1]; } //- rjf: trap chunk lists internal void -demon_trap_chunk_list_push(Arena *arena, DEMON_TrapChunkList *list, U64 cap, DEMON_Trap *trap) +dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap) { - DEMON_TrapChunkNode *node = list->last; + DMN_TrapChunkNode *node = list->last; if(node == 0 || node->count >= node->cap) { - node = push_array(arena, DEMON_TrapChunkNode, 1); + node = push_array(arena, DMN_TrapChunkNode, 1); node->cap = cap; - node->v = push_array_no_zero(arena, DEMON_Trap, node->cap); + node->v = push_array_no_zero(arena, DMN_Trap, node->cap); SLLQueuePush(list->first, list->last, node); list->node_count += 1; } @@ -153,7 +39,7 @@ demon_trap_chunk_list_push(Arena *arena, DEMON_TrapChunkList *list, U64 cap, DEM } internal void -demon_trap_chunk_list_concat_in_place(DEMON_TrapChunkList *dst, DEMON_TrapChunkList *to_push) +dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) { if(dst->last == 0) { @@ -170,11 +56,11 @@ demon_trap_chunk_list_concat_in_place(DEMON_TrapChunkList *dst, DEMON_TrapChunkL } internal void -demon_trap_chunk_list_concat_shallow_copy(Arena *arena, DEMON_TrapChunkList *dst, DEMON_TrapChunkList *to_push) +dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) { - for(DEMON_TrapChunkNode *src_n = to_push->first; src_n != 0; src_n = src_n->next) + for(DMN_TrapChunkNode *src_n = to_push->first; src_n != 0; src_n = src_n->next) { - DEMON_TrapChunkNode *dst_n = push_array(arena, DEMON_TrapChunkNode, 1); + DMN_TrapChunkNode *dst_n = push_array(arena, DMN_TrapChunkNode, 1); dst_n->v = src_n->v; dst_n->cap = src_n->cap; dst_n->count = src_n->count; @@ -187,685 +73,81 @@ demon_trap_chunk_list_concat_shallow_copy(Arena *arena, DEMON_TrapChunkList *dst //- rjf: handle lists internal void -demon_handle_list_push(Arena *arena, DEMON_HandleList *list, DEMON_Handle handle) +dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle) { - DEMON_HandleNode *node = push_array(arena, DEMON_HandleNode, 1); + DMN_HandleNode *node = push_array(arena, DMN_HandleNode, 1); SLLQueuePush(list->first, list->last, node); node->v = handle; list->count += 1; } -internal DEMON_HandleArray -demon_handle_array_from_list(Arena *arena, DEMON_HandleList *list) +internal DMN_HandleArray +dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list) { - DEMON_HandleArray array = {0}; + DMN_HandleArray array = {0}; array.count = list->count; - array.handles = push_array_no_zero(arena, DEMON_Handle, array.count); + array.handles = push_array_no_zero(arena, DMN_Handle, array.count); U64 idx = 0; - for(DEMON_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) + for(DMN_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) { array.handles[idx] = n->v; } return array; } -internal DEMON_HandleArray -demon_handle_array_copy(Arena *arena, DEMON_HandleArray *src) +internal DMN_HandleArray +dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src) { - DEMON_HandleArray dst = {0}; + DMN_HandleArray dst = {0}; dst.count = src->count; - dst.handles = push_array_no_zero(arena, DEMON_Handle, dst.count); - MemoryCopy(dst.handles, src->handles, sizeof(DEMON_Handle)*dst.count); + dst.handles = push_array_no_zero(arena, DMN_Handle, dst.count); + MemoryCopy(dst.handles, src->handles, sizeof(DMN_Handle)*dst.count); return dst; } -//////////////////////////////// -//~ rjf: Primary Thread & Exclusive Mode Controls +//- rjf: event list building -internal void -demon_primary_thread_begin(void){ - demon_primary_thread = 1; -} - -internal void -demon_exclusive_mode_begin(void){ - Assert(demon_primary_thread); - os_mutex_take(demon_state_mutex); - demon_run_state = 1; - os_mutex_drop(demon_state_mutex); -} - -internal void -demon_exclusive_mode_end(void){ - Assert(demon_primary_thread); - os_mutex_take(demon_state_mutex); - demon_run_state = 0; - os_mutex_drop(demon_state_mutex); -} - -//////////////////////////////// -//~ rjf: Running/Halting - -internal DEMON_EventList -demon_run(Arena *arena, DEMON_RunCtrls *ctrls) +internal DMN_Event * +dmn_event_list_push(Arena *arena, DMN_EventList *list) { - Assert(demon_primary_thread); - Temp scratch = scratch_begin(&arena, 1); - - // convert controls to os controls - B32 full_conversion = 1; - DEMON_OS_RunCtrls os_ctrls = {0}; + DMN_EventNode *n = push_array(arena, DMN_EventNode, 1); + SLLQueuePush(list->first, list->last, n); + list->count += 1; + DMN_Event *result = &n->v; + return result; +} + +//////////////////////////////// +//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) + +internal U64 +dmn_rip_from_thread(DMN_Handle thread) +{ + U64 result = 0; + Temp scratch = scratch_begin(0, 0); { - // convert single_step_thread - if (ctrls->single_step_thread != 0){ - DEMON_Entity *sst_entity = demon_ent_ptr_from_handle(ctrls->single_step_thread); - if (sst_entity != 0 && - sst_entity->kind == DEMON_EntityKind_Thread){ - os_ctrls.single_step_thread = sst_entity; - } - else{ - full_conversion = 0; - goto finish_conversion; - } - } - - // convert exception handling flag - os_ctrls.ignore_previous_exception = ctrls->ignore_previous_exception; - - // convert fronzen threads - os_ctrls.run_entities_are_unfrozen = ctrls->run_entities_are_unfrozen; - os_ctrls.run_entities_are_processes = ctrls->run_entities_are_processes; - os_ctrls.run_entity_count = ctrls->run_entity_count; - os_ctrls.run_entities = push_array_no_zero(scratch.arena, DEMON_Entity*, ctrls->run_entity_count); - { - DEMON_EntityKind expected_entity_kind = DEMON_EntityKind_Thread; - if (os_ctrls.run_entities_are_processes){ - expected_entity_kind = DEMON_EntityKind_Process; - } - - DEMON_Handle *src = ctrls->run_entities; - DEMON_Entity **dst = os_ctrls.run_entities; - for (U64 i = 0; i < ctrls->run_entity_count; i += 1, src += 1, dst += 1){ - DEMON_Entity *frozen_thread = demon_ent_ptr_from_handle(*src); - if (frozen_thread != 0 && - frozen_thread->kind == expected_entity_kind){ - *dst = frozen_thread; - } - else{ - full_conversion = 0; - goto finish_conversion; - } - } - } - - // convert traps - os_ctrls.traps = push_array_no_zero(scratch.arena, DEMON_OS_Trap, ctrls->traps.trap_count); - { - DEMON_OS_Trap *dst = os_ctrls.traps; - - for (DEMON_TrapChunkNode *node = ctrls->traps.first; - node != 0; - node = node->next){ - DEMON_Trap *src = node->v; - U64 node_trap_count = node->count; - for (U64 i = 0; i < node_trap_count; i += 1, src += 1){ - if (src->process != 0){ - DEMON_Entity *trap_process = demon_ent_ptr_from_handle(src->process); - if (trap_process != 0 && - trap_process->kind == DEMON_EntityKind_Process){ - dst->process = trap_process; - dst->address = src->address; - dst += 1; - } - else{ - full_conversion = 0; - goto finish_conversion; - } - } - } - } - - os_ctrls.trap_count = (U64)(dst - os_ctrls.traps); - } - - finish_conversion:; + Architecture arch = dmn_arch_from_thread(thread); + U64 reg_block_size = regs_block_size_from_architecture(arch); + void *reg_block = push_array(scratch.arena, U8, reg_block_size); + dmn_thread_read_reg_block(thread, reg_block); + result = regs_rip_from_arch_block(arch, reg_block); } - - // call the OS implementation of run - DEMON_EventList result = {0}; - if (full_conversion){ - result = demon_os_run(arena, &os_ctrls); - } - else{ - DEMON_Event *event = demon_push_event(arena, &result, DEMON_EventKind_Error); - event->error_kind = DEMON_ErrorKind_InvalidHandle; - } - scratch_end(scratch); - return(result); -} - -internal void -demon_halt(U64 code, U64 user_data){ - demon_os_halt(code, user_data); + return result; } internal U64 -demon_get_time_counter(void){ - return(demon_time); -} - -//////////////////////////////// -//~ rjf: Target Process Launching/Attaching/Killing/Detaching/Halting - -internal U32 -demon_launch_process(OS_LaunchOptions *options){ - Assert(demon_primary_thread); - U32 result = demon_os_launch_process(options); - return(result); -} - -internal B32 -demon_attach_process(U32 pid){ - Assert(demon_primary_thread); - B32 result = demon_os_attach_process(pid); - return(result); -} - -internal B32 -demon_kill_process(DEMON_Handle process, U32 exit_code){ - Assert(demon_primary_thread); - B32 result = 0; - DEMON_Entity *entity = demon_ent_ptr_from_handle(process); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Process){ - result = demon_os_kill_process(entity, exit_code); - } - return(result); -} - -internal B32 -demon_detach_process(DEMON_Handle process){ - Assert(demon_primary_thread); - B32 result = 0; - DEMON_Entity *entity = demon_ent_ptr_from_handle(process); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Process){ - result = demon_os_detach_process(entity); - } - return(result); -} - -//////////////////////////////// -//~ rjf: Entity Functions - -//- rjf: basics - -internal B32 -demon_object_exists(DEMON_Handle object){ - B32 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(object); - result = (entity != 0); - demon_access_end(); - } - return(result); -} - -//- rjf: introspection - -internal Architecture -demon_arch_from_object(DEMON_Handle object){ - Architecture result = Architecture_Null; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(object); - if (entity != 0){ - result = (Architecture)entity->arch; - } - demon_access_end(); - } - return(result); -} - -internal U64 -demon_base_vaddr_from_module(DEMON_Handle module){ - U64 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(module); - if (entity != 0 && entity->kind == DEMON_EntityKind_Module){ - result = entity->id; - } - demon_access_end(); - } - return(result); -} - -internal Rng1U64 -demon_vaddr_range_from_module(DEMON_Handle module) +dmn_rsp_from_thread(DMN_Handle thread) { - Rng1U64 result = {0}; - if(demon_access_begin()) + U64 result = 0; + Temp scratch = scratch_begin(0, 0); { - DEMON_Entity *entity = demon_ent_ptr_from_handle(module); - if(entity != 0 && entity->kind == DEMON_EntityKind_Module) - { - result = r1u64(entity->id, entity->id+entity->addr_range_dim); - } - demon_access_end(); + Architecture arch = dmn_arch_from_thread(thread); + U64 reg_block_size = regs_block_size_from_architecture(arch); + void *reg_block = push_array(scratch.arena, U8, reg_block_size); + dmn_thread_read_reg_block(thread, reg_block); + result = regs_rsp_from_arch_block(arch, reg_block); } - return(result); -} - -internal String8 -demon_full_path_from_module(Arena *arena, DEMON_Handle module){ - String8 result = {0}; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(module); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Module){ - result = demon_accel_full_path_from_module(arena, entity); - } - demon_access_end(); - } - return(result); -} - -internal U64 -demon_stack_base_vaddr_from_thread(DEMON_Handle thread){ - U64 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(thread); - if (entity != 0 && entity->kind == DEMON_EntityKind_Thread){ - result = demon_accel_stack_base_vaddr_from_thread(entity); - } - demon_access_end(); - } - return(result); -} - -internal U64 -demon_tls_root_vaddr_from_thread(DEMON_Handle handle){ - U64 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(handle); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Thread){ - result = demon_accel_tls_root_vaddr_from_thread(entity); - } - demon_access_end(); - } - return(result); -} - -internal DEMON_HandleArray -demon_all_processes(Arena *arena){ - DEMON_HandleArray result = {0}; - - if (demon_access_begin()){ - DEMON_Handle *handles = push_array_no_zero(arena, DEMON_Handle, demon_proc_count); - DEMON_Handle *handle_opl = handles + demon_proc_count; - DEMON_Handle *handle_ptr = handles; - - for (DEMON_Entity *process = demon_ent_root->first; - process != 0 && handle_ptr < handle_opl; - process = process->next){ - if (process->kind == DEMON_EntityKind_Process){ - *handle_ptr = demon_ent_handle_from_ptr(process); - handle_ptr += 1; - } - } - - result.handles = handles; - result.count = (U64)(handle_ptr - handles); - - U64 unused_count = demon_proc_count - result.count; - arena_put_back(arena, sizeof(DEMON_Handle)*unused_count); - demon_access_end(); - } - - return(result); -} - -internal DEMON_HandleArray -demon_threads_from_process(Arena *arena, DEMON_Handle process){ - DEMON_HandleArray result = {0}; - - if (demon_access_begin()){ - DEMON_Handle *handles = push_array_no_zero(arena, DEMON_Handle, demon_thread_count); - DEMON_Handle *handle_opl = handles + demon_thread_count; - DEMON_Handle *handle_ptr = handles; - - DEMON_Entity *process_ptr = demon_ent_ptr_from_handle(process); - - if (process_ptr != 0 && process_ptr->kind == DEMON_EntityKind_Process){ - for (DEMON_Entity *thread = process_ptr->first; - thread != 0 && handle_ptr < handle_opl; - thread = thread->next){ - if (thread->kind == DEMON_EntityKind_Thread){ - *handle_ptr = demon_ent_handle_from_ptr(thread); - handle_ptr += 1; - } - } - } - - result.handles = handles; - result.count = (U64)(handle_ptr - handles); - - U64 unused_count = demon_thread_count - result.count; - arena_put_back(arena, sizeof(DEMON_Handle)*unused_count); - demon_access_end(); - } - - return(result); -} - -internal DEMON_HandleArray -demon_modules_from_process(Arena *arena, DEMON_Handle process){ - DEMON_HandleArray result = {0}; - - if (demon_access_begin()){ - DEMON_Handle *handles = push_array_no_zero(arena, DEMON_Handle, demon_module_count); - DEMON_Handle *handle_opl = handles + demon_module_count; - DEMON_Handle *handle_ptr = handles; - - DEMON_Entity *process_ptr = demon_ent_ptr_from_handle(process); - - if (process_ptr != 0 && process_ptr->kind == DEMON_EntityKind_Process){ - for (DEMON_Entity *module = process_ptr->first; - module != 0 && handle_ptr < handle_opl; - module = module->next){ - if (module->kind == DEMON_EntityKind_Module){ - *handle_ptr = demon_ent_handle_from_ptr(module); - handle_ptr += 1; - } - } - } - - result.handles = handles; - result.count = (U64)(handle_ptr - handles); - - U64 unused_count = demon_module_count - result.count; - arena_put_back(arena, sizeof(DEMON_Handle)*unused_count); - demon_access_end(); - } - - return(result); -} - -//- rjf: target process memory allocation/protection - -internal U64 -demon_reserve_memory(DEMON_Handle process, U64 size){ - U64 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(process); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Process){ - result = demon_os_reserve_memory(entity, size); - } - demon_access_end(); - } - return(result); -} - -internal B32 -demon_set_memory_protect_flags(DEMON_Handle process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags){ - B32 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(process); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Process){ - demon_os_set_memory_protect_flags(entity, page_vaddr, size, flags); - result = 1; - } - demon_access_end(); - } - return(result); -} - -internal B32 -demon_release_memory(DEMON_Handle process, U64 vaddr, U64 size){ - B32 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(process); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Process){ - demon_os_release_memory(entity, vaddr, size); - result = 1; - } - demon_access_end(); - } - return(result); -} - -//- rjf: target process memory reading/writing - -internal U64 -demon_read_memory(DEMON_Handle process, void *dst, U64 src_address, U64 size){ - U64 bytes_read = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(process); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Process){ - bytes_read = demon_os_read_memory(entity, dst, src_address, size); - } - demon_access_end(); - } - return(bytes_read); -} - -internal B32 -demon_write_memory(DEMON_Handle process, U64 dst_address, void *src, U64 size){ - B32 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(process); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Process){ - result = demon_os_write_memory(entity, dst_address, src, size); - } - demon_access_end(); - } - return(result); -} - -#define READ_BLOCK_SIZE 4096 - -internal U64 -demon_read_memory_amap_aligned(DEMON_Handle process, void *dst, U64 src_address, U64 size){ - // Algorithm: - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // ^ ^ ^ - // MIN MAX SMAX - // [MIN,MAX) - range attempting to read - // [MAX,SMAX) - range not yet proven to be impossible to read - - Assert(src_address%READ_BLOCK_SIZE == 0); - Assert(size%READ_BLOCK_SIZE == 0); - - U64 read_size = 0; - U64 min = 0; - U64 max = size; - U64 smax = max; - - for (;;){ - if (max <= min){ - break; - } - - // attempt to read range - U64 attempt_size = max - min; - B32 success = demon_read_memory(process, (U8*)dst + min, src_address + min, attempt_size); - - if (success){ - // increase successful read size - read_size += attempt_size; - // adjust range up - min = max; - max = smax; - } - else{ - // mark this point as too far - smax = max - READ_BLOCK_SIZE; - // bisect the range for the next read attempt - U64 mid = (min + max)/2; - U64 aligned_mid = AlignDownPow2(mid, READ_BLOCK_SIZE); - max = aligned_mid; - } - } - - U64 result = read_size; - return(result); -} - -internal U64 -demon_read_memory_amap(DEMON_Handle process, void *dst, U64 src_address, U64 size){ - U64 read_size = 0; - - if (demon_access_begin()){ - B32 done = 0; - U64 read_opl = src_address + size; - - // pre-aligned part -- [SRC,PRE_OPL) - U64 src_block_opl = AlignPow2(src_address, READ_BLOCK_SIZE); - U64 pre_opl = Min(src_block_opl, read_opl); - if(src_address < pre_opl) - { - U64 attempt_size = pre_opl - src_address; - if(!demon_read_memory(process, dst, src_address, attempt_size)) - { - done = 1; - } - else - { - read_size += attempt_size; - } - } - - // aligned part -- [PRE_OPL,POST_FIRST) - U64 read_opl_block_base = AlignDownPow2(read_opl, READ_BLOCK_SIZE); - U64 post_first = Max(read_opl_block_base, pre_opl); - if (!done && pre_opl < post_first){ - U64 off = pre_opl - src_address; - U64 attempt_size = post_first - pre_opl; - U64 actual_size = demon_read_memory_amap_aligned(process, (U8*)dst + off, - pre_opl, attempt_size); - read_size += actual_size; - if (actual_size < attempt_size){ - done = 1; - } - } - - // post-aligned part -- [POST_FIRST,READ_OPL) - if (!done && post_first < read_opl){ - U64 off = post_first - src_address; - U64 attempt_size = read_opl - post_first; - if (!demon_read_memory(process, (U8*)dst + off, post_first, attempt_size)){ - done = 1; - } - else - { - read_size += attempt_size; - } - } - - demon_access_end(); - } - - U64 result = read_size; - return(result); -} - -#undef READ_BLOCK_SIZE - -//- rjf: thread registers reading/writing - -internal void* -demon_read_regs(DEMON_Handle thread){ - void *result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(thread); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Thread){ - result = demon_accel_read_regs(entity); - } - demon_access_end(); - } - return(result); -} - -internal B32 -demon_write_regs(DEMON_Handle thread, void *data){ - B32 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(thread); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Thread){ - demon_accel_write_regs(entity, data); - result = 1; - } - demon_access_end(); - } - return(result); -} - -internal U64 -demon_read_ip(DEMON_Handle thread){ - U64 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(thread); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Thread){ - void *regs = demon_accel_read_regs(entity); - result = regs_rip_from_arch_block((Architecture)entity->arch, regs); - } - demon_access_end(); - } - return(result); -} - -internal U64 -demon_read_sp(DEMON_Handle thread){ - U64 result = 0; - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(thread); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Thread){ - void *regs = demon_accel_read_regs(entity); - result = regs_rsp_from_arch_block((Architecture)entity->arch, regs); - } - demon_access_end(); - } - return(result); -} - -internal void -demon_write_ip(DEMON_Handle thread, U64 ip){ - if (demon_access_begin()){ - DEMON_Entity *entity = demon_ent_ptr_from_handle(thread); - if (entity != 0 && - entity->kind == DEMON_EntityKind_Thread){ - void *regs = demon_accel_read_regs(entity); - regs_arch_block_write_rip((Architecture)entity->arch, regs, ip); - demon_accel_write_regs(entity, regs); - } - demon_access_end(); - } -} - -//////////////////////////////// -//~ rjf: Process Listing - -internal void -demon_proc_iter_begin(DEMON_ProcessIter *iter){ - demon_os_proc_iter_begin(iter); -} - -internal B32 -demon_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out){ - return(demon_os_proc_iter_next(arena, iter, info_out)); -} - -internal void -demon_proc_iter_end(DEMON_ProcessIter *iter){ - demon_os_proc_iter_end(iter); + scratch_end(scratch); + return result; } diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index f164fcd1..48a2cb63 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -5,111 +5,70 @@ #define DEMON_CORE_H //////////////////////////////// -//~ allen: Demon Low Level Entities +//~ rjf: Control-Thread-Only Context +// +// An instance of this struct must ONLY be returned by dmn_ctrl_begin, and only +// used by the thread which called it. All APIs which can ONLY run on the +// control thread, which blocks to control & receive events, will take this +// parameter. All other APIs can be called from any thread. -typedef U64 DEMON_Handle; - -typedef struct DEMON_HandleNode DEMON_HandleNode; -struct DEMON_HandleNode +typedef struct DMN_CtrlCtx DMN_CtrlCtx; +struct DMN_CtrlCtx { - DEMON_HandleNode *next; - DEMON_Handle v; + U64 u64 [1]; }; -typedef struct DEMON_HandleList DEMON_HandleList; -struct DEMON_HandleList +//////////////////////////////// +//~ rjf: Handle Types + +typedef union DMN_Handle DMN_Handle; +union DMN_Handle { - DEMON_HandleNode *first; - DEMON_HandleNode *last; + U32 u32[2]; + U64 u64[1]; +}; + +typedef struct DMN_HandleNode DMN_HandleNode; +struct DMN_HandleNode +{ + DMN_HandleNode *next; + DMN_Handle v; +}; + +typedef struct DMN_HandleList DMN_HandleList; +struct DMN_HandleList +{ + DMN_HandleNode *first; + DMN_HandleNode *last; U64 count; }; -typedef struct DEMON_HandleArray DEMON_HandleArray; -struct DEMON_HandleArray +typedef struct DMN_HandleArray DMN_HandleArray; +struct DMN_HandleArray { - DEMON_Handle *handles; + DMN_Handle *handles; U64 count; }; //////////////////////////////// -//~ rjf: Memory Protection Flags +//~ rjf: Generated Code -typedef U32 DEMON_MemoryProtectFlags; -enum{ - DEMON_MemoryProtectFlag_Read = (1<<0), - DEMON_MemoryProtectFlag_Write = (1<<1), - DEMON_MemoryProtectFlag_Execute = (1<<2), -}; +#include "generated/demon.meta.h" //////////////////////////////// -//~ allen: Demon Event Types +//~ rjf: Event Types -typedef enum DEMON_EventKind +typedef struct DMN_Event DMN_Event; +struct DMN_Event { - DEMON_EventKind_Null, - DEMON_EventKind_Error, - DEMON_EventKind_HandshakeComplete, - DEMON_EventKind_CreateProcess, - DEMON_EventKind_ExitProcess, - DEMON_EventKind_CreateThread, - DEMON_EventKind_ExitThread, - DEMON_EventKind_LoadModule, - DEMON_EventKind_UnloadModule, - DEMON_EventKind_Breakpoint, - DEMON_EventKind_Trap, - DEMON_EventKind_SingleStep, - DEMON_EventKind_Exception, - DEMON_EventKind_Halt, - DEMON_EventKind_Memory, - DEMON_EventKind_DebugString, - DEMON_EventKind_SetThreadName, - DEMON_EventKind_COUNT -} -DEMON_EventKind; - -typedef enum DEMON_ErrorKind -{ - DEMON_ErrorKind_Null, - DEMON_ErrorKind_NotInitialized, - DEMON_ErrorKind_NotAttached, - DEMON_ErrorKind_UnexpectedFailure, - DEMON_ErrorKind_InvalidHandle, -} -DEMON_ErrorKind; - -typedef enum DEMON_MemoryEventKind -{ - DEMON_MemoryEventKind_Null, - DEMON_MemoryEventKind_Commit, - DEMON_MemoryEventKind_Reserve, - DEMON_MemoryEventKind_Decommit, - DEMON_MemoryEventKind_Release, - DEMON_MemoryEventKind_COUNT -} -DEMON_MemoryEventKind; - -typedef enum DEMON_ExceptionKind -{ - DEMON_ExceptionKind_Null, - DEMON_ExceptionKind_MemoryRead, - DEMON_ExceptionKind_MemoryWrite, - DEMON_ExceptionKind_MemoryExecute, - DEMON_ExceptionKind_CppThrow, - DEMON_ExceptionKind_COUNT -} -DEMON_ExceptionKind; - -typedef struct DEMON_Event DEMON_Event; -struct DEMON_Event -{ - // TODO(allen): condense - DEMON_EventKind kind; - DEMON_ErrorKind error_kind; - DEMON_MemoryEventKind memory_kind; - DEMON_ExceptionKind exception_kind; - DEMON_Handle process; - DEMON_Handle thread; - DEMON_Handle module; + DMN_EventKind kind; + DMN_ErrorKind error_kind; + DMN_MemoryEventKind memory_kind; + DMN_ExceptionKind exception_kind; + DMN_Handle process; + DMN_Handle thread; + DMN_Handle module; + Architecture arch; U64 address; U64 size; String8 string; @@ -123,171 +82,156 @@ struct DEMON_Event B32 exception_repeated; }; -typedef struct DEMON_EventNode DEMON_EventNode; -struct DEMON_EventNode +typedef struct DMN_EventNode DMN_EventNode; +struct DMN_EventNode { - DEMON_EventNode *next; - DEMON_Event v; + DMN_EventNode *next; + DMN_Event v; }; -typedef struct DEMON_EventList DEMON_EventList; -struct DEMON_EventList +typedef struct DMN_EventList DMN_EventList; +struct DMN_EventList { - DEMON_EventNode *first; - DEMON_EventNode *last; + DMN_EventNode *first; + DMN_EventNode *last; U64 count; }; //////////////////////////////// -//~ allen: Demon Run Control Types +//~ rjf: Run Control Types -typedef struct DEMON_Trap DEMON_Trap; -struct DEMON_Trap +typedef struct DMN_Trap DMN_Trap; +struct DMN_Trap { - DEMON_Handle process; - U64 address; + DMN_Handle process; + U64 vaddr; U64 id; }; -typedef struct DEMON_TrapChunkNode DEMON_TrapChunkNode; -struct DEMON_TrapChunkNode +typedef struct DMN_TrapChunkNode DMN_TrapChunkNode; +struct DMN_TrapChunkNode { - DEMON_TrapChunkNode *next; - DEMON_Trap *v; + DMN_TrapChunkNode *next; + DMN_Trap *v; U64 cap; U64 count; }; -typedef struct DEMON_TrapChunkList DEMON_TrapChunkList; -struct DEMON_TrapChunkList +typedef struct DMN_TrapChunkList DMN_TrapChunkList; +struct DMN_TrapChunkList { - DEMON_TrapChunkNode *first; - DEMON_TrapChunkNode *last; + DMN_TrapChunkNode *first; + DMN_TrapChunkNode *last; U64 node_count; U64 trap_count; }; -typedef struct DEMON_RunCtrls DEMON_RunCtrls; -struct DEMON_RunCtrls +typedef struct DMN_RunCtrls DMN_RunCtrls; +struct DMN_RunCtrls { - DEMON_Handle single_step_thread; + DMN_Handle single_step_thread; B8 ignore_previous_exception; B8 run_entities_are_unfrozen; B8 run_entities_are_processes; - DEMON_Handle *run_entities; + DMN_Handle *run_entities; U64 run_entity_count; - DEMON_TrapChunkList traps; + DMN_TrapChunkList traps; }; //////////////////////////////// -//~ allen: Demon Process Listing +//~ rjf: System Process Listing Types -typedef struct DEMON_ProcessIter DEMON_ProcessIter; -struct DEMON_ProcessIter +typedef struct DMN_ProcessIter DMN_ProcessIter; +struct DMN_ProcessIter { U64 v[2]; }; -typedef struct DEMON_ProcessInfo DEMON_ProcessInfo; -struct DEMON_ProcessInfo +typedef struct DMN_ProcessInfo DMN_ProcessInfo; +struct DMN_ProcessInfo { String8 name; U32 pid; }; //////////////////////////////// -//~ rjf: Main Layer Initialization +//~ rjf: Basic Type Functions (Helpers, Implemented Once) -internal void demon_init(void); - -//////////////////////////////// -//~ rjf: Basic Type Functions - -//- rjf: stringizing -internal String8 demon_string_from_event_kind(DEMON_EventKind kind); -internal String8 demon_string_from_memory_event_kind(DEMON_MemoryEventKind kind); -internal String8 demon_string_from_exception_kind(DEMON_ExceptionKind kind); -internal void demon_string_list_from_event(Arena *arena, String8List *out, DEMON_Event *event); +//- rjf: handles +internal DMN_Handle dmn_handle_zero(void); +internal B32 dmn_handle_match(DMN_Handle a, DMN_Handle b); //- rjf: trap chunk lists -internal void demon_trap_chunk_list_push(Arena *arena, DEMON_TrapChunkList *list, U64 cap, DEMON_Trap *trap); -internal void demon_trap_chunk_list_concat_in_place(DEMON_TrapChunkList *dst, DEMON_TrapChunkList *to_push); -internal void demon_trap_chunk_list_concat_shallow_copy(Arena *arena, DEMON_TrapChunkList *dst, DEMON_TrapChunkList *to_push); +internal void dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap); +internal void dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); +internal void dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); //- rjf: handle lists -internal void demon_handle_list_push(Arena *arena, DEMON_HandleList *list, DEMON_Handle handle); -internal DEMON_HandleArray demon_handle_array_from_list(Arena *arena, DEMON_HandleList *list); -internal DEMON_HandleArray demon_handle_array_copy(Arena *arena, DEMON_HandleArray *src); +internal void dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle); +internal DMN_HandleArray dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list); +internal DMN_HandleArray dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src); + +//- rjf: event list building +internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list); //////////////////////////////// -//~ rjf: Primary Thread & Exclusive Mode Controls +//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) -internal void demon_primary_thread_begin(void); -internal void demon_exclusive_mode_begin(void); -internal void demon_exclusive_mode_end(void); +internal U64 dmn_rip_from_thread(DMN_Handle thread); +internal U64 dmn_rsp_from_thread(DMN_Handle thread); //////////////////////////////// -//~ rjf: Running/Halting +//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) -internal DEMON_EventList demon_run(Arena *arena, DEMON_RunCtrls *ctrls); -internal void demon_halt(U64 code, U64 user_data); -internal U64 demon_get_time_counter(void); +internal void dmn_init(void); //////////////////////////////// -//~ rjf: Target Process Launching/Attaching/Killing/Detaching/Halting +//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) -internal U32 demon_launch_process(OS_LaunchOptions *options); -internal B32 demon_attach_process(U32 pid); -internal B32 demon_kill_process(DEMON_Handle process, U32 exit_code); -internal B32 demon_detach_process(DEMON_Handle process); +internal DMN_CtrlCtx *dmn_ctrl_begin(void); +internal void dmn_ctrl_exclusive_access_begin(void); +internal void dmn_ctrl_exclusive_access_end(void); +#define DMN_CtrlExclusiveAccessScope DeferLoop(dmn_ctrl_exclusive_access_begin(), dmn_ctrl_exclusive_access_end()) +internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_LaunchOptions *options); +internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid); +internal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code); +internal B32 dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process); +internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls); //////////////////////////////// -//~ rjf: Entity Functions +//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) -//- rjf: basics -internal B32 demon_object_exists(DEMON_Handle object); - -//- rjf: introspection -internal Architecture demon_arch_from_object(DEMON_Handle object); -internal U64 demon_base_vaddr_from_module(DEMON_Handle module); -internal Rng1U64 demon_vaddr_range_from_module(DEMON_Handle module); -internal String8 demon_full_path_from_module(Arena *arena, DEMON_Handle module); -internal U64 demon_stack_base_vaddr_from_thread(DEMON_Handle thread); -internal U64 demon_tls_root_vaddr_from_thread(DEMON_Handle thread); -internal DEMON_HandleArray demon_all_processes(Arena *arena); -internal DEMON_HandleArray demon_threads_from_process(Arena *arena, DEMON_Handle process); -internal DEMON_HandleArray demon_modules_from_process(Arena *arena, DEMON_Handle process); - -//- rjf: target process memory allocation/protection -internal U64 demon_reserve_memory(DEMON_Handle process, U64 size); -internal B32 demon_set_memory_protect_flags(DEMON_Handle process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags); -internal B32 demon_release_memory(DEMON_Handle process, U64 vaddr, U64 size); - -//- rjf: target process memory reading/writing -internal U64 demon_read_memory(DEMON_Handle process, void *dst, U64 src_address, U64 size); -internal B32 demon_write_memory(DEMON_Handle process, U64 dst_address, void *src, U64 size); -internal U64 demon_read_memory_amap_aligned(DEMON_Handle process, void *dst, U64 src_address, U64 size); -internal U64 demon_read_memory_amap(DEMON_Handle process, void *dst, U64 src_address, U64 size); - -//- rjf: thread registers reading/writing -// IMPORTANT(allen): This API is _trusting_ you. You should never modify the data pointed -// at by that void pointer! It is pointing to the internal cache of the registers, so it -// will become invalid after a call to demon_write_regs, or demon_run. Use it to read -// what you need and be done ASAP and we can avoid an extra copy baked into the API. -internal void *demon_read_regs(DEMON_Handle thread); -internal B32 demon_write_regs(DEMON_Handle thread, void *data); -// TODO(allen): These might be a bad idea when we try to extend to ARM -// They make sense for x86/x64 abstraction, which often needs identical -// code paths except for these parts. Revisit this when ARM is integrated. -internal U64 demon_read_ip(DEMON_Handle thread); -internal U64 demon_read_sp(DEMON_Handle thread); -internal void demon_write_ip(DEMON_Handle thread, U64 ip); +internal void dmn_halt(U64 code, U64 user_data); //////////////////////////////// -//~ rjf: Process Listing +//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) -internal void demon_proc_iter_begin(DEMON_ProcessIter *iter); -internal B32 demon_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out); -internal void demon_proc_iter_end(DEMON_ProcessIter *iter); +//- rjf: run/memory/register counters +internal U64 dmn_run_gen(void); +internal U64 dmn_mem_gen(void); +internal U64 dmn_reg_gen(void); -#endif //DEMON_CORE_H +//- rjf: non-blocking-control-thread access barriers +internal B32 dmn_access_open(void); +internal void dmn_access_close(void); +#define DMN_AccessScope DeferLoopChecked(dmn_access_open(), dmn_access_close()) + +//- rjf: processes +internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); +internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); +#define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +#define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) + +//- rjf: threads +internal Architecture dmn_arch_from_thread(DMN_Handle handle); +internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); +internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); +internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); +internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); + +//- rjf: system process listing +internal void dmn_process_iter_begin(DMN_ProcessIter *iter); +internal B32 dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out); +internal void dmn_process_iter_end(DMN_ProcessIter *iter); + +#endif // DEMON_CORE_H diff --git a/src/demon2/demon2_core.mdesk b/src/demon/demon_core.mdesk similarity index 100% rename from src/demon2/demon2_core.mdesk rename to src/demon/demon_core.mdesk diff --git a/src/demon/demon_inc.c b/src/demon/demon_inc.c index 64a45e09..daab75e2 100644 --- a/src/demon/demon_inc.c +++ b/src/demon/demon_inc.c @@ -2,14 +2,9 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #include "demon_core.c" -#include "demon_common.c" -#include "demon_accel.c" -#include "demon_os.c" #if OS_WINDOWS -# include "win32/demon_os_win32.c" -#elif OS_LINUX -# include "linux/demon_os_linux.c" +# include "win32/demon_core_win32.c" #else -# error No Demon Implementation for This OS +# error Demon layer backend not defined for this operating system. #endif diff --git a/src/demon/demon_inc.h b/src/demon/demon_inc.h index daf2f65d..3328f9b6 100644 --- a/src/demon/demon_inc.h +++ b/src/demon/demon_inc.h @@ -5,16 +5,11 @@ #define DEMON_INC_H #include "demon_core.h" -#include "demon_common.h" -#include "demon_accel.h" -#include "demon_os.h" #if OS_WINDOWS -# include "win32/demon_os_win32.h" -#elif OS_LINUX -# include "linux/demon_os_linux.h" +# include "win32/demon_core_win32.h" #else -# error No Demon Implementation for This OS +# error Demon layer backend not defined for this operating system. #endif -#endif //DEMON_INC_H +#endif // DEMON_INC_H diff --git a/src/demon/demon_os.c b/src/demon/demon_os.c deleted file mode 100644 index 76c55a9b..00000000 --- a/src/demon/demon_os.c +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////// -//~ rjf: Helpers - -internal B32 -demon_os_read_regs(DEMON_Entity *thread, void *dst) -{ - B32 result = 0; - switch(thread->arch) - { - default:{}break; - case Architecture_x86:{result = demon_os_read_regs_x86(thread, (REGS_RegBlockX86 *)dst);}break; - case Architecture_x64:{result = demon_os_read_regs_x64(thread, (REGS_RegBlockX64 *)dst);}break; - } - return result; -} - -internal B32 -demon_os_write_regs(DEMON_Entity *thread, void *src) -{ - B32 result = 0; - switch(thread->arch) - { - default:{}break; - case Architecture_x86:{result = demon_os_write_regs_x86(thread, (REGS_RegBlockX86 *)src);}break; - case Architecture_x64:{result = demon_os_write_regs_x64(thread, (REGS_RegBlockX64 *)src);}break; - } - return result; -} diff --git a/src/demon/demon_os.h b/src/demon/demon_os.h deleted file mode 100644 index fd6aac59..00000000 --- a/src/demon/demon_os.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_OS_H -#define DEMON_OS_H - -// NOTE(allen): -// These are the functions that the OS backends actually implement. -// Demon objects go through a handle validation layer but it is a lot more -// convenient in the OS backends to implement these versions which take the -// already validated DEMON_Entity*. These are also more convenient to call from -// the backend layer, which lets us avoid converting back and forth between -// handles and pointers a lot. - -//////////////////////////////// -//~ NOTE(allen): Demon OS Run Control Types - -typedef struct DEMON_OS_Trap DEMON_OS_Trap; -struct DEMON_OS_Trap -{ - DEMON_Entity *process; - U64 address; -}; - -typedef struct DEMON_OS_RunCtrls DEMON_OS_RunCtrls; -struct DEMON_OS_RunCtrls -{ - DEMON_Entity *single_step_thread; - B8 ignore_previous_exception; - B8 run_entities_are_unfrozen; - B8 run_entities_are_processes; - DEMON_Entity **run_entities; - U64 run_entity_count; - DEMON_OS_Trap *traps; - U64 trap_count; -}; - -//////////////////////////////// -//~ rjf: Helpers - -internal B32 demon_os_read_regs(DEMON_Entity *thread, void *dst); -internal B32 demon_os_write_regs(DEMON_Entity *thread, void *src); - -//////////////////////////////// -//~ rjf: @demon_os_hooks Main Layer Initialization - -internal void demon_os_init(void); - -//////////////////////////////// -//~ rjf: @demon_os_hooks Running/Halting - -internal DEMON_EventList demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls); -internal void demon_os_halt(U64 code, U64 user_data); - -//////////////////////////////// -//~ rjf: @demon_os_hooks Target Process Launching/Attaching/Killing/Detaching/Halting - -internal U32 demon_os_launch_process(OS_LaunchOptions *options); -internal B32 demon_os_attach_process(U32 pid); -internal B32 demon_os_kill_process(DEMON_Entity *process, U32 exit_code); -internal B32 demon_os_detach_process(DEMON_Entity *process); - -//////////////////////////////// -//~ rjf: @demon_os_hooks Entity Functions - -//- rjf: cleanup -internal void demon_os_entity_cleanup(DEMON_Entity *entity); - -//- rjf: introspection -internal String8 demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module); -internal U64 demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread); -internal U64 demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread); - -//- rjf: target process memory allocation/protection -internal U64 demon_os_reserve_memory(DEMON_Entity *process, U64 size); -internal void demon_os_set_memory_protect_flags(DEMON_Entity *process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags); -internal void demon_os_release_memory(DEMON_Entity *process, U64 vaddr, U64 size); - -//- rjf: target process memory reading/writing -internal U64 demon_os_read_memory(DEMON_Entity *process, void *dst, U64 src_address, U64 size); -internal B32 demon_os_write_memory(DEMON_Entity *process, U64 dst_address, void *src, U64 size); -#define demon_os_read_struct(p,dst,src) demon_os_read_memory((p), (dst), (src), sizeof(*(dst))) -#define demon_os_write_struct(p,dst,src) demon_os_write_memory((p), (dst), (src), sizeof(*(src))) - -//- rjf: thread registers reading/writing -internal B32 demon_os_read_regs_x86(DEMON_Entity *thread, REGS_RegBlockX86 *dst); -internal B32 demon_os_write_regs_x86(DEMON_Entity *thread, REGS_RegBlockX86 *src); -internal B32 demon_os_read_regs_x64(DEMON_Entity *thread, REGS_RegBlockX64 *dst); -internal B32 demon_os_write_regs_x64(DEMON_Entity *thread, REGS_RegBlockX64 *src); - -//////////////////////////////// -//~ rjf: @demon_os_hooks Process Listing - -internal void demon_os_proc_iter_begin(DEMON_ProcessIter *iter); -internal B32 demon_os_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out); -internal void demon_os_proc_iter_end(DEMON_ProcessIter *iter); - -#endif //DEMON_OS_H diff --git a/src/demon2/generated/demon2.meta.c b/src/demon/generated/demon.meta.c similarity index 100% rename from src/demon2/generated/demon2.meta.c rename to src/demon/generated/demon.meta.c diff --git a/src/demon2/generated/demon2.meta.h b/src/demon/generated/demon.meta.h similarity index 95% rename from src/demon2/generated/demon2.meta.h rename to src/demon/generated/demon.meta.h index 0cb8af87..1db2313d 100644 --- a/src/demon2/generated/demon2.meta.h +++ b/src/demon/generated/demon.meta.h @@ -3,8 +3,8 @@ //- GENERATED CODE -#ifndef DEMON2_META_H -#define DEMON2_META_H +#ifndef DEMON_META_H +#define DEMON_META_H typedef enum DMN_EventKind { @@ -60,4 +60,4 @@ DMN_ExceptionKind_COUNT, C_LINKAGE_BEGIN C_LINKAGE_END -#endif // DEMON2_META_H +#endif // DEMON_META_H diff --git a/src/demon/linux/demon_os_linux.c b/src/demon/linux/demon_os_linux.c deleted file mode 100644 index 0c92f461..00000000 --- a/src/demon/linux/demon_os_linux.c +++ /dev/null @@ -1,2106 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -// TODO(allen): run controls: ignore_previous_exception - -//////////////////////////////// -//~ allen: Elf Parsing Code - -#include "syms/syms_elf_inc.c" - -//////////////////////////////// -//~ rjf: Globals - -global B32 demon_lnx_already_has_halt_injection = false; -global U64 demon_lnx_halt_code = 0; -global U64 demon_lnx_halt_user_data = 0; - -global B32 demon_lnx_new_process_pending = false; - -global Arena *demon_lnx_event_arena = 0; -global DEMON_EventList demon_lnx_queued_events = {0}; - -global U32 demon_lnx_ptrace_options = (PTRACE_O_TRACEEXIT| - PTRACE_O_EXITKILL| - PTRACE_O_TRACEFORK| - PTRACE_O_TRACEVFORK| - PTRACE_O_TRACECLONE); - -//////////////////////////////// -//~ rjf: Helpers - -internal DEMON_LNX_ThreadExt* -demon_lnx_thread_ext(DEMON_Entity *entity){ - DEMON_LNX_ThreadExt *result = (DEMON_LNX_ThreadExt*)&entity->ext; - return(result); -} - -internal B32 -demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node){ - B32 result = false; - - int attach_result = ptrace(PTRACE_ATTACH, pid, 0, 0); - if (attach_result == -1){ - // TODO(allen): attach denied - } - else{ - // return a new attachment node as soon as the ptrace exists. we use these nodes - // for cleanup on failure *and* for initializing on success. either way we need - // to see all new attachments whether or not they fully initialized correctly. - DEMON_LNX_AttachNode *proc_attachment = push_array_no_zero(arena, DEMON_LNX_AttachNode, 1); - proc_attachment->next = 0; - proc_attachment->pid = pid; - *new_node = proc_attachment; - - int status = 0; - pid_t wait_id = waitpid(pid, &status, __WALL); - // NOTE(allen): if wait_id != pid we don't know what that means; study that case before - // deciding how error handling around it works. - if (wait_id == pid){ - int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); - if (setoptions_result == -1){ - // TODO(allen): setup failed - } - else{ - result = true; - } - } - } - - return(result); -} - -internal String8 -demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid){ - // get symbolic path - Temp scratch = scratch_begin(&arena, 1); - String8 exe_symbol_path = push_str8f(scratch.arena, "/proc/%d/exe", pid); - - // try to read the link for a bit - Temp restore_point = temp_begin(arena); - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - S64 cap = PATH_MAX; - for (S64 r = 0; r < 4; cap *= 2, r += 1){ - temp_end(restore_point); - buffer = push_array_no_zero(arena, U8, cap); - size = readlink((char*)exe_symbol_path.str, (char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // finalize result - String8 result = {0}; - if (!got_final_result || size == -1){ - temp_end(restore_point); - } - else{ - arena_put_back(arena, (cap - size - 1)); - result = str8(buffer, size + 1); - } - - scratch_end(scratch); - return(result); -} - -internal int -demon_lnx_open_memory_fd_for_pid(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - String8 memory_path = push_str8f(scratch.arena, "/proc/%i/mem", pid); - int result = open((char*)memory_path.str, O_RDWR); - scratch_end(scratch); - return(result); -} - -internal Architecture -demon_lnx_arch_from_pid(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - Architecture result = Architecture_Null; - - // exe path - String8 exe_path = demon_lnx_executable_path_from_pid(scratch.arena, pid); - - // handle to exe - int exe_fd = -1; - if (exe_path.size != 0){ - exe_fd = open((char*)exe_path.str, O_RDONLY); - } - - // elf identification - B32 is_elf = false; - U8 e_ident[SYMS_ElfIdentifier_NIDENT] = {0}; - if (exe_fd >= 0){ - if (pread(exe_fd, e_ident, sizeof(e_ident), 0) == sizeof(e_ident)){ - is_elf = (e_ident[SYMS_ElfIdentifier_MAG0] == 0x7f && - e_ident[SYMS_ElfIdentifier_MAG1] == 'E' && - e_ident[SYMS_ElfIdentifier_MAG2] == 'L' && - e_ident[SYMS_ElfIdentifier_MAG3] == 'F'); - } - } - - // elf class - U8 elf_class = 0; - if (is_elf){ - elf_class = e_ident[SYMS_ElfIdentifier_CLASS]; - } - - // exe header data - SYMS_ElfEhdr64 ehdr = {0}; - switch (elf_class){ - case 1: - { - SYMS_ElfEhdr32 ehdr32 = {0}; - if (pread(exe_fd, &ehdr32, sizeof(ehdr32), 0) == sizeof(ehdr32)){ - ehdr = syms_elf_ehdr64_from_ehdr32(ehdr32); - } - }break; - - case 2: - { - pread(exe_fd, &ehdr, sizeof(ehdr), 0); - }break; - } - - // determine machine type - switch (ehdr.e_machine){ - case SYMS_ElfMachineKind_386: - { - result = Architecture_x86; - }break; - - case SYMS_ElfMachineKind_ARM: - { - result = Architecture_arm32; - }break; - - case SYMS_ElfMachineKind_X86_64: - { - result = Architecture_x64; - }break; - - case SYMS_ElfMachineKind_AARCH64: - { - result = Architecture_arm64; - }break; - } - - scratch_end(scratch); - return(result); -} - -internal DEMON_LNX_ProcessAux -demon_lnx_aux_from_pid(pid_t pid, Architecture arch){ - DEMON_LNX_ProcessAux result = {0}; - B32 addr_32bit = (arch == Architecture_x86 || arch == Architecture_arm32); - - // open aux data - Temp scratch = scratch_begin(0, 0); - String8 auxv_symbol_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int aux_fd = open((char*)auxv_symbol_path.str, O_RDONLY); - - // scan aux data - if (aux_fd >= 0){ - for (;;){ - result.filled = true; - - // read next aux - U64 type = 0; - U64 val = 0; - if (addr_32bit){ - SYMS_ElfAuxv32 aux; - if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ - goto brkloop; - } - type = aux.a_type; - val = aux.a_val; - } - else{ - SYMS_ElfAuxv64 aux; - if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ - goto brkloop; - } - type = aux.a_type; - val = aux.a_val; - } - - // place value in result - switch (type){ - default:break; - case SYMS_ElfAuxType_NULL: goto brkloop; break; - case SYMS_ElfAuxType_PHNUM: result.phnum = val; break; - case SYMS_ElfAuxType_PHENT: result.phent = val; break; - case SYMS_ElfAuxType_PHDR: result.phdr = val; break; - case SYMS_ElfAuxType_EXECFN: result.execfn = val; break; - } - } - brkloop:; - - close(aux_fd); - } - - scratch_end(scratch); - return(result); -} - -internal DEMON_LNX_PhdrInfo -demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phentsize, U64 phcount){ - DEMON_LNX_PhdrInfo result = {0}; - result.range.min = max_U64; - - // how much phdr will we read? - U64 phdr_size_expected = (is_32bit?sizeof(SYMS_ElfPhdr32):sizeof(SYMS_ElfPhdr64)); - U64 phdr_stride = (phentsize?phentsize:phdr_size_expected); - U64 phdr_read_size = ClampTop(phdr_stride, phdr_size_expected); - - // scan table - U64 va = phvaddr; - for (U64 i = 0; i < phcount; i += 1, va += phdr_stride){ - - // get type and range - SYMS_ElfPKind p_type = 0; - U64 p_vaddr = 0; - U64 p_memsz = 0; - - if (is_32bit){ - SYMS_ElfPhdr32 phdr32 = {0}; - demon_lnx_read_memory(memory_fd, &phdr32, va, phdr_read_size); - p_type = phdr32.p_type; - p_vaddr = phdr32.p_vaddr; - p_memsz = phdr32.p_memsz; - } - else{ - SYMS_ElfPhdr64 phdr64 = {0}; - demon_lnx_read_memory(memory_fd, &phdr64, va, phdr_read_size); - p_type = phdr64.p_type; - p_vaddr = phdr64.p_vaddr; - p_memsz = phdr64.p_memsz; - } - - // save useful info - switch (p_type){ - case SYMS_ElfPKind_Dynamic: - { - result.dynamic = p_vaddr; - }break; - case SYMS_ElfPKind_Load: - { - U64 min = p_vaddr; - U64 max = p_vaddr + p_memsz; - result.range.min = Min(result.range.min, min); - result.range.max = Max(result.range.max, max); - }break; - } - } - - return(result); -} - -internal DEMON_LNX_ModuleNode* -demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){ - Architecture arch = (Architecture)process->arch; - B32 is_32bit = (arch == Architecture_x86 || arch == Architecture_arm32); - int memory_fd = (int)process->ext_u64; - - // aux from pid - DEMON_LNX_ProcessAux aux = demon_lnx_aux_from_pid((pid_t)process->id, arch); - - // extract info from program headers - DEMON_LNX_PhdrInfo phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, - aux.phdr, aux.phent, aux.phnum); - - // linkmap first from memory space & dyn address - U64 first_linkmap_va = 0; - if (phdr_info.dynamic != 0){ - U64 off = phdr_info.dynamic; - for (;;){ - SYMS_ElfDyn64 dyn = {0}; - if (is_32bit){ - SYMS_ElfDyn32 dyn32 = {0}; - demon_lnx_read_memory(memory_fd, &dyn32, off, sizeof(dyn32)); - dyn.tag = dyn32.tag; - dyn.val = dyn32.val; - off += sizeof(dyn32); - } - else{ - demon_lnx_read_memory(memory_fd, &dyn, off, sizeof(dyn)); - off += sizeof(dyn); - } - - if (dyn.tag == SYMS_ElfDynTag_NULL){ - break; - } - - if (dyn.tag == SYMS_ElfDynTag_PLTGOT){ - // True for x86 and x64 - // vas[0] virtual address of .dynamic - // vas[2] callback for resolving function address of relocation and if successful jumps to it. - // - // Code that sets up PLTGOT is in glibc/sysdeps/x86_64/dl_machine.h -> elf_machine_runtime_setup - U64 vas_off = dyn.val; - U64 vas[3] = {0}; - demon_lnx_read_memory(memory_fd, vas, vas_off, sizeof(vas)); - first_linkmap_va = vas[1]; - break; - } - } - } - - // setup output list - DEMON_LNX_ModuleNode *first = 0; - DEMON_LNX_ModuleNode *last = 0; - - // main module - { - DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); - SLLQueuePush(first, last, node); - node->vaddr = phdr_info.range.min; - node->size = phdr_info.range.max - phdr_info.range.min; - node->name = aux.execfn; - } - - // iterate link maps - if (first_linkmap_va != 0){ - U64 linkmap_va = first_linkmap_va; - - for (;;){ - SYMS_ElfLinkMap64 linkmap = {0}; - if (is_32bit){ - // TOOD(nick): endian awarness - SYMS_ElfLinkMap32 linkmap32 = {0}; - demon_lnx_read_memory(memory_fd, &linkmap32, linkmap_va, sizeof(linkmap32)); - linkmap.base = linkmap32.base; - linkmap.name = linkmap32.name; - linkmap.ld = linkmap32.ld; - linkmap.next = linkmap32.next; - } - else{ - demon_lnx_read_memory(memory_fd, &linkmap, linkmap_va, sizeof(linkmap)); - } - - if (linkmap.base != 0){ - // find phdrs for this module - SYMS_U64 phvaddr = 0; - SYMS_U64 phentsize = 0; - SYMS_U64 phcount = 0; - - if (is_32bit){ - SYMS_ElfEhdr32 ehdr = {0}; - demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); - phvaddr = ehdr.e_phoff + linkmap.base; - phentsize = ehdr.e_phentsize; - phcount = ehdr.e_phnum; - } - else{ - SYMS_ElfEhdr64 ehdr = {0}; - demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); - phvaddr = ehdr.e_phoff + linkmap.base; - phentsize = ehdr.e_phentsize; - phcount = ehdr.e_phnum; - } - - // extract info from phdrs - DEMON_LNX_PhdrInfo module_phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, - phvaddr, phentsize, phcount); - - // save module node - DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); - SLLQueuePush(first, last, node); - node->vaddr = linkmap.base; - node->size = module_phdr_info.range.max - module_phdr_info.range.min; - node->name = linkmap.name; - } - - linkmap_va = linkmap.next; - if (linkmap_va == 0){ - break; - } - } - } - - return(first); -} - -internal U64 -demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size){ - U64 bytes_read = 0; - U8 *ptr = (U8*)dst; - U8 *opl = ptr + size; - U64 cursor = src; - for (;ptr < opl;){ - size_t to_read = (size_t)(opl - ptr); - ssize_t actual_read = pread(memory_fd, ptr, to_read, cursor); - if (actual_read == -1){ - break; - } - ptr += actual_read; - cursor += actual_read; - bytes_read += actual_read; - } - return(bytes_read); -} - -internal B32 -demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size){ - B32 result = true; - U8 *ptr = (U8*)src; - U8 *opl = ptr + size; - U64 cursor = dst; - for (;ptr < opl;){ - size_t to_write = (size_t)(opl - ptr); - ssize_t actual_write = pwrite(memory_fd, ptr, to_write, cursor); - if (actual_write == -1){ - result = false; - break; - } - ptr += actual_write; - cursor += actual_write; - } - return(result); -} - -internal String8 -demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address){ - // TODO(allen): this could be done better with a demon_lnx_read_memory - // that returns a read amount instead of a success/fail. - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 0;){ - if (demon_lnx_read_memory(memory_fd, block, read_p, cap)){ - break; - } - cap /= 2; - } - read_p += cap; - - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 1){ - if (block[block_opl] == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 result = str8_list_join(arena, &list, 0); - scratch_end(scratch); - return(result); -} - -internal void -demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src){ - dst->rax.u64 = src->rax; - dst->rcx.u64 = src->rcx; - dst->rdx.u64 = src->rdx; - dst->rbx.u64 = src->rbx; - dst->rsp.u64 = src->rsp; - dst->rbp.u64 = src->rbp; - dst->rsi.u64 = src->rsi; - dst->rdi.u64 = src->rdi; - dst->r8.u64 = src->r8; - dst->r9.u64 = src->r9; - dst->r10.u64 = src->r10; - dst->r11.u64 = src->r11; - dst->r12.u64 = src->r12; - dst->r13.u64 = src->r13; - dst->r14.u64 = src->r14; - dst->r15.u64 = src->r15; - dst->cs.u16 = src->cs; - dst->ds.u16 = src->ds; - dst->es.u16 = src->es; - dst->fs.u16 = src->fs; - dst->gs.u16 = src->gs; - dst->ss.u16 = src->ss; - dst->fsbase.u64 = src->fsbase; - dst->gsbase.u64 = src->gsbase; - dst->rip.u64 = src->rip; - dst->rflags.u64 = src->rflags; -} - -internal void -demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src){ - dst->rax = src->rax.u64; - dst->rcx = src->rcx.u64; - dst->rdx = src->rdx.u64; - dst->rbx = src->rbx.u64; - dst->rsp = src->rsp.u64; - dst->rbp = src->rbp.u64; - dst->rsi = src->rsi.u64; - dst->rdi = src->rdi.u64; - dst->r8 = src->r8.u64; - dst->r9 = src->r9.u64; - dst->r10 = src->r10.u64; - dst->r11 = src->r11.u64; - dst->r12 = src->r12.u64; - dst->r13 = src->r13.u64; - dst->r14 = src->r14.u64; - dst->r15 = src->r15.u64; - dst->cs = src->cs.u16; - dst->ds = src->ds.u16; - dst->es = src->es.u16; - dst->fs = src->fs.u16; - dst->gs = src->gs.u16; - dst->ss = src->ss.u16; - dst->fsbase = src->fsbase.u64; - dst->gsbase = src->gsbase.u64; - dst->rip = src->rip.u64; - dst->rflags = src->rflags.u64; -} - -//////////////////////////////// - -internal String8 -demon_lnx_read_int_string(Arena *arena, int fd, int radix){ - String8 integer = str8(0,0); - - int to_read = 0; - int to_seek = 0; - for (;;){ - char b = 0; - if (read(fd, &b, sizeof(b)) == 0){ - break; - } - to_seek += 1; - if ( ! char_is_digit(b, radix)){ - break; - } - to_read += 1; - } - - if (lseek(fd, -to_seek, SEEK_CUR) != -1) { - char *buf = push_array_no_zero(arena, char, to_read + 1); - read(fd, buf, to_read); - buf[to_read] = '\0'; - integer = str8((U8*)buf, (U64)to_read); - } - - return(integer); -} - -internal U64 -demon_lnx_read_u64(int fd, int radix){ - Temp scratch = scratch_begin(0, 0); - String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); - U64 result = u64_from_str8(integer, radix); - scratch_end(scratch); - return(result); -} - -internal S64 -demon_lnx_read_s64(int fd, int radix){ - Temp scratch = scratch_begin(0, 0); - String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); - S64 result = s64_from_str8(integer, radix); - scratch_end(scratch); - return(result); -} - -internal B32 -demon_lnx_read_expect(int fd, char expect){ - char got = 0; - read(fd, &got, sizeof(got)); - B32 result = (got == expect); - if (!result){ - lseek(fd, -1, SEEK_CUR); - } - return(result); -} - -internal int -demon_lnx_read_whitespace(int fd){ - int whitespace_size = 0; - for (;;){ - if (!demon_lnx_read_expect(fd, ' ')){ - if (!demon_lnx_read_expect(fd, '\t')){ - break; - } - } - whitespace_size += 1; - } - return whitespace_size; -} - -internal String8 -demon_lnx_read_string(Arena *arena, int fd){ - String8 result = str8(0,0); - - int to_read = 0; - int to_seek = 0; - for (;;){ - char b = 0; - if (read(fd, &b, sizeof(b)) == 0) { - break; - } - to_seek += 1; - if (b == '\0' || b == '\n'){ - break; - } - to_read += 1; - } - - if (to_seek > 0 && lseek(fd, -to_seek, SEEK_CUR) != -1){ - char *buf = push_array_no_zero(arena, char, to_read + 1); - read(fd, buf, to_read); - buf[to_read] = '\0'; - result = str8((U8*)buf, to_read); - } - - return(result); -} - -internal int -demon_lnx_open_maps(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - String8 path = push_str8f(scratch.arena, "/proc/%d/maps", pid); - int maps = open((char*)path.str, O_RDONLY); - scratch_end(scratch); - return(maps); -} - -internal B32 -demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out){ - B32 is_parsed = false; - MemoryZeroStruct(entry_out); - do{ - U64 address_lo = 0; - U64 address_hi = 0; - DEMON_LNX_PermFlags perms = 0; - U64 offset = 0; - U64 dev_major = 0; - U64 dev_minor = 0; - U64 inode = 0; - String8 pathname = str8(0,0); - - // address range - address_lo = demon_lnx_read_u64(maps, 16); - if (!demon_lnx_read_expect(maps, '-')){ - break; - } - address_hi = demon_lnx_read_u64(maps, 16); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // permission flags - char b; - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='r'){ - perms |= DEMON_LNX_PermFlags_Read; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='w'){ - perms |= DEMON_LNX_PermFlags_Write; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='x'){ - perms |= DEMON_LNX_PermFlags_Exec; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b == 'p'){ - perms |= DEMON_LNX_PermFlags_Private; - } - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // offset - offset = demon_lnx_read_u64(maps, 16); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // dev - dev_major = demon_lnx_read_u64(maps, 10); - if (!demon_lnx_read_expect(maps, ':')){ - break; - } - dev_minor = demon_lnx_read_u64(maps, 10); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // inode - inode = demon_lnx_read_u64(maps, 10); - if (demon_lnx_read_whitespace(maps) == 10){ - break; - } - - // pathname - pathname = demon_lnx_read_string(arena, maps); - - // emit entry if en - b = 0; - read(maps, &b, sizeof(b)); - if (b != '\n' && b != '\0') { - break; - } - - // fill result - entry_out->address_lo = address_lo; - entry_out->address_hi = address_hi; - entry_out->perms = perms; - entry_out->offset = offset; - entry_out->dev_major = (U32)dev_major; - entry_out->dev_minor = (U32)dev_minor; - entry_out->inode = inode; - entry_out->pathname = pathname; - entry_out->type = DEMON_LNX_MapsEntryType_Null; - entry_out->stack_tid = 0; - - if (str8_match(pathname, str8_lit("/"), StringMatchFlag_RightSideSloppy)){ - entry_out->type = DEMON_LNX_MapsEntryType_Path; - } else if (str8_match(pathname, str8_lit("[heap]"), 0)){ - entry_out->type = DEMON_LNX_MapsEntryType_Heap; - } else if (str8_match(pathname, str8_lit("[stack]"), 0)){ - entry_out->type = DEMON_LNX_MapsEntryType_Stack; - } else if (str8_match(pathname, str8_lit("[stack:"), StringMatchFlag_RightSideSloppy)){ - entry_out->type = DEMON_LNX_MapsEntryType_Stack; - String8 tid = str8_substr(pathname, r1u64(7, pathname.size - 8)); - entry_out->stack_tid = (pid_t)u64_from_str8(tid, 10); - } - - is_parsed = true; - }while(0); - return(is_parsed); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Main Layer Initialization - -internal void -demon_os_init(void){ - demon_lnx_event_arena = arena_alloc(); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Running/Halting - -internal DEMON_EventList -demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){ - DEMON_EventList result = {0}; - - if (demon_ent_root == 0){ - demon_push_event(arena, &result, DEMON_EventKind_NotInitialized); - } - else if (demon_ent_root->first == 0 && !demon_lnx_new_process_pending){ - demon_push_event(arena, &result, DEMON_EventKind_NotAttached); - } - else{ - Temp scratch = scratch_begin(&arena, 1); - - // use queued events if there are any - if (demon_lnx_queued_events.first != 0){ - // copy event queue - for (DEMON_Event *node = demon_lnx_queued_events.first; - node != 0; - node = node->next){ - DEMON_Event *copy = push_array_no_zero(arena, DEMON_Event, 1); - MemoryCopyStruct(copy, node); - SLLQueuePush(result.first, result.last, copy); - } - result.count = demon_lnx_queued_events.count; - - // zero stored queue - MemoryZeroStruct(&demon_lnx_queued_events); - arena_clear(demon_lnx_event_arena); - } - - // get the single step thread (if any) - DEMON_Entity *single_step_thread = controls->single_step_thread; - - // do setup - B32 did_setup = false; - U8 *trap_swap_bytes = 0; - - if (result.first == 0){ - // TODO(allen): per-Architecture implementation of single steps - // set single step bit - if (single_step_thread != 0){ - switch (single_step_thread->arch){ - case Architecture_x86: - { - // TODO(allen): possibly buggy - SYMS_RegX86 regs = {0}; - demon_os_read_regs_x86(single_step_thread, ®s); - regs.eflags.u32 |= 0x100; - demon_os_write_regs_x86(single_step_thread, ®s); - }break; - - case Architecture_x64: - { - // TODO(allen): possibly buggy - SYMS_RegX64 regs = {0}; - demon_os_read_regs_x64(single_step_thread, ®s); - regs.rflags.u64 |= 0x100; - demon_os_write_regs_x64(single_step_thread, ®s); - }break; - } - } - - // TODO(allen): per-Architecture implementation of traps - trap_swap_bytes = push_array_no_zero(scratch.arena, U8, controls->trap_count); - - { - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - if (demon_os_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)){ - U8 int3 = 0xCC; - demon_os_write_memory(trap->process, trap->address, &int3, 1); - } - else{ - trap_swap_bytes[i] = 0xCC; - } - } - } - - did_setup = true; - } - - // do run - B32 did_run = false; - if (did_setup){ - // continue non-frozen threads - DEMON_LNX_EntityNode *resume_threads = 0; - for (DEMON_Entity *process = demon_ent_root->first; - process != 0; - process = process->next){ - if (process->kind == DEMON_EntityKind_Process){ - - // determine if this process is frozen - B32 process_is_frozen = false; - if (controls->run_entities_are_processes){ - for (U64 i = 0; i < controls->run_entity_count; i += 1){ - if (controls->run_entities[i] == process){ - process_is_frozen = true; - break; - } - } - } - - for (DEMON_Entity *thread = process->first; - thread != 0; - thread = thread->next){ - if (thread->kind == DEMON_EntityKind_Thread){ - // determine if this thread is frozen - B32 is_frozen = false; - - if (controls->single_step_thread != 0 && - controls->single_step_thread != thread){ - is_frozen = true; - } - else{ - - if (controls->run_entities_are_processes){ - is_frozen = process_is_frozen; - } - else{ - for (U64 i = 0; i < controls->run_entity_count; i += 1){ - if (controls->run_entities[i] == thread){ - is_frozen = true; - break; - } - } - } - - if (controls->run_entities_are_unfrozen){ - is_frozen = !is_frozen; - } - } - - // continue if not frozen - if (!is_frozen){ - errno = 0; - ptrace(PTRACE_CONT, (pid_t)thread->id, 0, 0); - DEMON_LNX_EntityNode *thread_node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); - SLLStackPush(resume_threads, thread_node); - thread_node->entity = thread; - } - } - } - } - } - - // get next stop - wait_for_stop: - B32 did_dummy_stop = false; - int status = 0; - pid_t wait_id = waitpid(-1, &status, __WALL); - - // increment demon time - demon_time += 1; - - // handle devent - DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, wait_id); - if (thread == 0){ - if (wait_id >= 0){ - // TODO(allen): this isn't a great situation! From what I can tell there's no - // options that I am super happy with for going from unknown tid -> pid. - // We can parse it out of /proc//status; but I don't want to do that until - // I'm forced to, because it seems like this shouldn't happen if the ptrace - // API works correctly and we don't have any bugs in our demon entity system. - } - } - else{ - B32 thread_exit = false; - U64 exit_code = 0; - - DEMON_Entity *process = thread->parent; - // NOTE(allen): hitting this assert should never ever be possible, if our entities - // are wired up correctly. it doesn't matter what ptrace or waitpid are doing. - Assert(process != 0); - - // read register info - U64 instruction_pointer = 0; - union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0}; - - switch (thread->arch){ - case Architecture_x86: - { - demon_os_read_regs_x86(thread, ®s.x86); - instruction_pointer = regs.x86.eip.u32; - }break; - - case Architecture_x64: - { - demon_os_read_regs_x64(thread, ®s.x64); - instruction_pointer = regs.x64.rip.u64; - }break; - } - - // check stop status - if (WIFEXITED(status)){ - thread_exit = true; - } - if (WIFSIGNALED(status)){ - exit_code = WTERMSIG(status); - thread_exit = true; - } - - // extra event list - DEMON_EventList stop_events = {0}; - - if (WIFSTOPPED(status)){ - switch (WSTOPSIG(status)){ - case SIGTRAP: - { - switch (status >> 8){ - case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): - { - // TODO(allen): (not sure actually, study this part) - thread_exit = true; - }break; - - case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): - { - // new thread coming - unsigned long new_tid = 0; - int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid); - if (get_message_result == -1){ - // TODO(allen): this isn't right, time to give up on getting this process. - // this will likely lead to getting unrecognized wait_id s later. So we need - // this stuff in the log to make sense of it still. - } - else{ - // thread entity - DEMON_Entity *new_thread = demon_ent_new(process, DEMON_EntityKind_Thread, new_tid); - demon_thread_count += 1; - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); - thread_ext->expecting_dummy_sigstop = true; - - // thread event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(new_thread); - } - }break; - - case (SIGTRAP | (PTRACE_EVENT_FORK << 8)): - case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)): - { - // new process coming - unsigned long new_pid = 0; - int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid); - if (get_message_result == -1){ - // TODO(allen): this isn't right, time to give up on getting this process. - // this will likely lead to getting unrecognized wait_id s later. So we need - // this stuff in the log to make sense of it still. - } - else{ - Architecture arch = demon_lnx_arch_from_pid(new_pid); - - // process entity - DEMON_Entity *new_process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, new_pid); - new_process->arch = arch; - new_process->ext_u64 = demon_lnx_open_memory_fd_for_pid(new_pid); - - demon_lnx_new_process_pending = false; - - // thread entity - DEMON_Entity *new_thread = demon_ent_new(new_process, DEMON_EntityKind_Thread, new_pid); - demon_thread_count += 1; - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); - thread_ext->expecting_dummy_sigstop = true; - - // process event - { - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(new_process); - } - - // thread event - { - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(new_process); - e->thread = demon_ent_handle_from_ptr(new_thread); - } - } - }break; - - default: - { - // check single step - DEMON_EventKind e_kind = DEMON_EventKind_Trap; - if (thread == single_step_thread){ - e_kind = DEMON_EventKind_SingleStep; - } - - // check bp - if (e_kind == DEMON_EventKind_Trap){ - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - if (trap->process == process && trap->address == instruction_pointer - 1){ - e_kind = DEMON_EventKind_Breakpoint; - break; - } - } - } - - // adjust ip after breakpoint - if (e_kind == DEMON_EventKind_Breakpoint){ - // TODO(allen): possibly buggy - switch (thread->arch){ - case Architecture_x86: - { - instruction_pointer -= 1; - regs.x86.eip.u32 = instruction_pointer; - demon_os_write_regs_x86(thread, ®s.x86); - }break; - - case Architecture_x64: - { - instruction_pointer -= 1; - regs.x64.rip.u64 = instruction_pointer; - demon_os_write_regs_x64(thread, ®s.x64); - }break; - } - } - - // event - DEMON_Event *e = demon_push_event(arena, &stop_events, e_kind); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - }break; - } - }break; - - case SIGSTOP: - { - // TODO(allen): we need to figure out how we want to tell apart: - // SIGSTOP All-Stop, SIGSTOP Halt, SIGSTOP "User" - // what we're doing right now == big-time race conditions - - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); - - if (thread_ext->expecting_dummy_sigstop){ - thread_ext->expecting_dummy_sigstop = false; - did_dummy_stop = true; - } - else if (demon_lnx_already_has_halt_injection){ - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Halt); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - } - else{ - // TODO(allen): a signal we don't want to mess with (except to record that it happened maybe) - // we should "hand it back" - } - }break; - - default: - { -#if 0 - // these are a little special. the program cannot continue after these - // unless the user first does something to change the state (move the IP, change a variable, w/e) - case SIGABRT:case SIGFPE:case SIGSEGV: -#endif - - // event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Exception); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - e->signo = WSTOPSIG(status); - }break; - } - } - - // entity cleanup - if (thread_exit){ - if (thread->id == process->id){ - // generate events for threads & modules - for (DEMON_Entity *entity = process->first; - entity != 0; - entity = entity->next){ - if (entity->kind == DEMON_EntityKind_Thread){ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(entity); - } - else{ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(entity); - } - } - - // exit event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitProcess); - e->process = demon_ent_handle_from_ptr(process); - e->code = exit_code; - - // free entity - demon_ent_release_root_and_children(process); - } - else{ - // exit event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->code = exit_code; - - // free entity - demon_ent_release_root_and_children(thread); - } - } - - // update all module lists (for each process ...) - DEMON_EventList module_change_events = {0}; - - for (DEMON_Entity *proc_node = demon_ent_root->first; - proc_node != 0; - proc_node = proc_node->next){ - DEMON_LNX_ModuleNode *first_module = demon_lnx_module_list_from_process(scratch.arena, proc_node); - - DEMON_LNX_EntityNode *first_unloaded = 0; - DEMON_LNX_EntityNode *last_unloaded = 0; - - // compute the delta (mark known modules, save list of unloaded modules) - for (DEMON_Entity *entity = proc_node->first; - entity != 0; - entity = entity->next){ - if (entity->kind == DEMON_EntityKind_Module){ - U64 base = entity->id; - U64 name = entity->ext_u64; - B32 still_exists = false; - for (DEMON_LNX_ModuleNode *module_node = first_module; - module_node != 0; - module_node = module_node->next){ - if (module_node->vaddr == base && module_node->name == name){ - module_node->already_known = true; - still_exists = true; - break; - } - } - if (!still_exists){ - DEMON_LNX_EntityNode *node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); - SLLQueuePush(first_unloaded, last_unloaded, node); - node->entity = entity; - } - } - } - - // handle unloads - for (DEMON_LNX_EntityNode *unloaded_node = first_unloaded; - unloaded_node != 0; - unloaded_node = unloaded_node->next){ - DEMON_Entity *module = unloaded_node->entity; - - // event - { - DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(proc_node); - e->module = demon_ent_handle_from_ptr(module); - } - - // free entity - demon_ent_release_root_and_children(module); - } - - // handle loads - for (DEMON_LNX_ModuleNode *module_node = first_module; - module_node != 0; - module_node = module_node->next){ - if (!module_node->already_known){ - // entity - DEMON_Entity *module = demon_ent_new(proc_node, DEMON_EntityKind_Module, module_node->vaddr); - demon_module_count += 1; - module->ext_u64 = module_node->name; - - // event - { - DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_LoadModule); - e->process = demon_ent_handle_from_ptr(proc_node); - e->module = demon_ent_handle_from_ptr(module); - e->address = module_node->vaddr; - e->size = module_node->size; - } - } - } - } - - // concat the events list (with module changes first) - result.count = module_change_events.count + stop_events.count; - result.first = module_change_events.first; - result.last = module_change_events.last; - if (stop_events.first != 0){ - if (result.first != 0){ - result.last->next = stop_events.first; - result.last = stop_events.last; - } - else{ - result.first = stop_events.first; - result.last = stop_events.last; - } - } - } - - // do we have a reason to keep going? - B32 skip_this_stop = false; - if (did_dummy_stop && result.count == 0){ - skip_this_stop = true; - } - - // ignore this stop, resume and wait again - if (skip_this_stop){ - if (wait_id != 0){ - ptrace(PTRACE_CONT, (pid_t)wait_id, 0, 0); - } - goto wait_for_stop; - } - - // stop all running threads - for (DEMON_LNX_EntityNode *node = resume_threads; - node != 0; - node = node->next){ - DEMON_Entity *thread = node->entity; - pid_t thread_id = (pid_t)thread->id; - if (thread_id != wait_id){ - union sigval sv = {0}; - sigqueue(thread_id, SIGSTOP, sv); - - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); - thread_ext->expecting_dummy_sigstop = true; - } - } - - did_run = true; - } - - // cleanup - if (did_run){ - // TODO(allen): per-Architecture - // unset traps - { - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - U8 og_byte = trap_swap_bytes[i]; - if (og_byte != 0xCC){ - demon_os_write_memory(trap->process, trap->address, &og_byte, 1); - } - } - } - - // TODO(allen): per-Architecture - // unset single step bit - // the single step bit is automatically unset whenever we single step - // but if *something else* happened, it will still be there ready to - // confound us later; so here we're just being sure it's taken out. - if (single_step_thread != 0){ - // TODO(allen): possibly buggy - switch (single_step_thread->arch){ - case Architecture_x86: - { - SYMS_RegX86 regs = {0}; - demon_os_read_regs_x86(single_step_thread, ®s); - regs.eflags.u32 &= ~0x100; - demon_os_write_regs_x86(single_step_thread, ®s); - }break; - - case Architecture_x64: - { - SYMS_RegX64 regs = {0}; - demon_os_read_regs_x64(single_step_thread, ®s); - regs.rflags.u64 &= ~0x100; - demon_os_write_regs_x64(single_step_thread, ®s); - }break; - } - } - } - - scratch_end(scratch); - } - - return(result); -} - -internal void -demon_os_halt(U64 code, U64 user_data){ - if (demon_ent_root != 0 && !demon_lnx_already_has_halt_injection){ - DEMON_Entity *process = demon_ent_root->first; - if (process != 0){ - demon_lnx_already_has_halt_injection = true; - demon_lnx_halt_code = code; - demon_lnx_halt_user_data = user_data; - union sigval sv = {0}; - if (sigqueue(process->id, SIGSTOP, sv) == -1){ - demon_lnx_already_has_halt_injection = false; - } - } - } -} - -// NOTE(allen): siginfo hint from old code: -#if 0 -{ - switch (siginfo.si_code){ - // SI_KERNEL (hit int3; 0xCC) - case 0x80: - { - // TODO(allen): breakpoint event - }break; - - // TRAP_UNK, TRAP_HWBKPT, TRAP_BRKPT, TRAP_TRACE - case 0x5: case 0x4: case 0x1: case 0x2: - { - // TODO(allen): breakpoint event (?) - }break; - - case 0x3: case 0x0: - { - // TODO(allen): do nothing I guess? - }break; - } -} -#endif - -//////////////////////////////// -//~ rjf: @demon_os_hooks Target Process Launching/Attaching/Killing/Detaching/Halting - -internal U32 -demon_os_launch_process(OS_LaunchOptions *options){ - U32 result = 0; - Temp scratch = scratch_begin(0, 0); - - // arrange options - char *binary = 0; - char **args = 0; - if (options->cmd_line.node_count > 0){ - args = push_array_no_zero(scratch.arena, char*, options->cmd_line.node_count + 1); - char **arg_ptr = args; - for (String8Node *node = options->cmd_line.first; - node != 0; - node = node->next, arg_ptr += 1){ - String8 string = push_str8_copy(scratch.arena, node->string); - *arg_ptr = (char*)string.str; - } - *arg_ptr = 0; - binary = args[0]; - } - - char *path = 0; - { - String8 string = push_str8_copy(scratch.arena, options->path); - path = (char*)string.str; - } - - char **env = 0; - if (options->env.node_count > 0){ - env = push_array_no_zero(scratch.arena, char*, options->env.node_count + 1); - char **env_ptr = env; - for (String8Node *node = options->env.first; - node != 0; - node = node->next, env_ptr += 1){ - String8 string = push_str8_copy(scratch.arena, node->string); - *env_ptr = (char*)string.str; - } - *env_ptr = 0; - } - - // fork - if (binary != 0){ - pid_t pid = fork(); - if (pid == -1){ - // TODO(allen): fork error - } - else if (pid == 0){ - // NOTE(allen): child process - int ptrace_result = ptrace(PTRACE_TRACEME, 0, 0, 0); - if (ptrace_result != -1){ - int chdir_result = chdir(path); - if (chdir_result != -1){ - execve(binary, args, env); - } - } - // failed to init fully; abort so the parent can clean up the child - abort(); - } - else{ - // NOTE(allen): parent process - - // wait for child - int status = 0; - pid_t wait_id = waitpid(pid, &status, __WALL); - - // determine child launch status - enum{ - LaunchCode_Null, - LaunchCode_FailBeforePtrace, - LaunchCode_FailAfterPtrace, - LaunchCode_Success, - }; - U32 launch_result = LaunchCode_Null; - // NOTE(allen): if wait_id != pid we don't know what that means; study that case before - // deciding how error handling around it works. - if (wait_id == pid){ - if (WIFSTOPPED(status)){ - if (WSTOPSIG(status) == SIGTRAP){ - launch_result = LaunchCode_Success; - } - else{ - launch_result = LaunchCode_FailAfterPtrace; - } - } - else{ - launch_result = LaunchCode_FailBeforePtrace; - } - } - - // handle launch result - switch (launch_result){ - default: - { - // TODO(allen): error that we do not understand - }break; - - case LaunchCode_FailBeforePtrace: - { - // TODO(allen): child ptrace init failed - }break; - - case LaunchCode_FailAfterPtrace: - { - // need to specifically pull the exit status out of the child - // or it will sit around as a zombie forever since it is ptraced. - B32 cleanup_good = false; - int detach_result = ptrace(PTRACE_DETACH, pid, 0, (void*)SIGCONT); - if (detach_result != -1){ - int status_cleanup = 0; - pid_t wait_id_cleanup = waitpid(pid, &status_cleanup, __WALL); - if (wait_id_cleanup == pid){ - cleanup_good = true; - } - } - if (cleanup_good){ - // TODO(allen): child init failed - } - else{ - // TODO(allen): child init failed; something went wrong and a process may have leaked - } - }break; - - case LaunchCode_Success: - { - int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); - if (setoptions_result == -1){ - // TODO(allen): ptrace setup failed; need to kill the child and clean it up - } - else{ - result = pid; - - Architecture arch = demon_lnx_arch_from_pid(pid); - - // process entity - DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, pid); - demon_proc_count += 1; - process->arch = arch; - process->ext_u64 = demon_lnx_open_memory_fd_for_pid(pid); - - // thread entity - DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, pid); - demon_thread_count += 1; - - // process event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(process); - } - - // thread event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - - // get module list - DEMON_LNX_ModuleNode *module_list = demon_lnx_module_list_from_process(scratch.arena, process); - - // for each module ... - for (DEMON_LNX_ModuleNode *node = module_list; - node != 0; - node = node->next){ - // module entity - DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, node->vaddr); - demon_module_count += 1; - module->ext_u64 = node->name; - - // event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_LoadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(module); - e->address = node->vaddr; - e->size = node->size; - } - } - - // handshake event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_HandshakeComplete); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - } - }break; - } - } - } - - scratch_end(scratch); - return(result); -} - -internal B32 -demon_os_attach_process(U32 pid){ - B32 result = false; - - Temp scratch = scratch_begin(0, 0); - DEMON_LNX_AttachNode *attachments = 0; - DEMON_LNX_AttachNode *the_process = 0; - - // TODO(allen): double check that this logic only lets us - // "attach" when pid is the id of the main thread of a process. - - // attach this process - B32 attached_proc = false; - if (kill(pid, 0) == -1){ - // TODO(allen): process does not exist - } - else{ - attached_proc = demon_lnx_attach_pid(scratch.arena, pid, &the_process); - if (the_process != 0){ - SLLStackPush(attachments, the_process); - } - } - - // open thread list - if (attached_proc){ - String8 threads_path = push_str8f(scratch.arena, "/proc/%d/task", pid); - DIR *proc_dir = opendir((char*)threads_path.str); - if (proc_dir == 0){ - // TODO(allen): could not read proc threads somehow; no good! - } - else{ - - // attach all threads - B32 attached_all_threads = true; - for (;;){ - struct dirent *entry = readdir(proc_dir); - if (entry == 0){ - break; - } - - String8 name = str8_cstring(entry->d_name); - if (str8_is_integer(name, 10)){ - pid_t tid = u64_from_str8(name, 10); - if (tid != pid){ - DEMON_LNX_AttachNode *new_attachment = 0; - B32 attached_this_thread = demon_lnx_attach_pid(scratch.arena, tid, &new_attachment); - if (new_attachment != 0){ - SLLStackPush(attachments, new_attachment); - } - if (!attached_this_thread){ - attached_all_threads = false; - break; - } - } - } - } - closedir(proc_dir); - - if (attached_all_threads){ - result = true; - } - } - } - - // initialize new entities on success - if (result){ - Architecture arch = demon_lnx_arch_from_pid(the_process->pid); - - // process entity - DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, the_process->pid); - demon_proc_count += 1; - process->arch = arch; - process->ext_u64 = demon_lnx_open_memory_fd_for_pid(the_process->pid); - - // process event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(process); - } - - // TODO(allen): happens on windows here? - - for (DEMON_LNX_AttachNode *node = attachments; - node != 0; - node = node->next){ - DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, node->pid); - demon_thread_count += 1; - - // thread event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - } - - // TODO(allen): sync modules in process - } - - // cleanup on failure - else{ - for (DEMON_LNX_AttachNode *node = attachments; - node != 0; - node = node->next){ - ptrace(PTRACE_DETACH, node->pid, 0, (void*)SIGCONT); - } - } - - scratch_end(scratch); - return(result); -} - -internal B32 -demon_os_kill_process(DEMON_Entity *process, U32 exit_code){ - B32 result = false; - if (process != 0){ - if (kill(process->id, SIGKILL) != -1){ - result = true; - } - } - return(result); -} - -internal B32 -demon_os_detach_process(DEMON_Entity *process){ - B32 result = false; - if (process != 0){ - int detach_result = ptrace(PTRACE_DETACH, process->id, 0, 0); - result = (detach_result != -1); - } - return(0); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Entity Functions - -//- rjf: cleanup - -internal void -demon_os_entity_cleanup(DEMON_Entity *entity) -{ - // NOTE(rjf): no-op -} - -//- rjf: introspection - -internal String8 -demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){ - DEMON_Entity *process = module->parent; - int memory_fd = (int)process->ext_u64; - U64 name_va = module->ext_u64; - String8 result = demon_lnx_read_memory_str(arena, memory_fd, name_va); - return(result); -} - -internal U64 -demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread){ - Temp scratch = scratch_begin(0, 0); - - U64 stack_base = 0; - - DEMON_Entity *process = thread->parent; - - // id for main thread is zero - B32 is_main_thread = (thread->id == process->id); - pid_t match_tid = is_main_thread ? 0 : thread->id; - - // open /proc/$pid/maps - int maps = demon_lnx_open_maps(process->id); - - // look for entry with stack markings and matching thread id - for (;;){ - DEMON_LNX_MapsEntry e; - Temp temp = temp_begin(scratch.arena); - if (!demon_lnx_next_map(temp.arena, maps, &e)){ - break; - } - if (e.type == DEMON_LNX_MapsEntryType_Stack && e.stack_tid == match_tid){ - stack_base = e.address_lo; - break; - } - temp_end(temp); - } - - scratch_end(scratch); - return(stack_base); -} - -internal U64 -demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){ - U64 result = 0; - switch (thread->arch){ - case Architecture_x64: - case Architecture_x86: - { - U32 fsbase = 0; - pid_t tid = (pid_t)thread->id; - if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){ - result = (U64)fsbase; - } - if (thread->arch == Architecture_x64){ - result += 8; - } - else{ - result += 4; - } - }break; - } - return(result); -} - -//- rjf: target process memory allocation/protection - -internal U64 -demon_os_reserve_memory(DEMON_Entity *process, U64 size){ - U64 result = 0; - NotImplemented; - return(result); -} - -internal void -demon_os_set_memory_protect_flags(DEMON_Entity *process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags){ - NotImplemented; -} - -internal void -demon_os_release_memory(DEMON_Entity *process, U64 vaddr, U64 size){ - NotImplemented; -} - -//- rjf: target process memory reading/writing - -internal U64 -demon_os_read_memory(DEMON_Entity *process, void *dst, U64 src_address, U64 size){ - int memory_fd = (int)process->ext_u64; - U64 result = demon_lnx_read_memory(memory_fd, dst, src_address, size); - return(result); -} - -internal B32 -demon_os_write_memory(DEMON_Entity *process, U64 dst_address, void *src, U64 size){ - int memory_fd = (int)process->ext_u64; - B32 result = demon_lnx_write_memory(memory_fd, dst_address, src, size); - return(result); -} - -//- rjf: thread registers reading/writing - -internal B32 -demon_os_read_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *dst){ - B32 result = false; - NotImplemented; - return(result); -} - -internal B32 -demon_os_write_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *src){ - B32 result = false; - NotImplemented; - return(result); -} - -internal B32 -demon_os_read_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *dst){ - pid_t tid = (pid_t)thread->id; - - // gpr - B32 got_gpr = false; - DEMON_LNX_UserX64 ctx = {0}; - struct iovec iov_gpr = {0}; - iov_gpr.iov_len = sizeof(ctx); - iov_gpr.iov_base = &ctx; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr) != -1){ - demon_lnx_regs_x64_from_usr_regs_x64(dst, &ctx.regs); - got_gpr = true; - } - - // fpr - B32 got_fpr = false; - if (got_gpr){ - B32 got_xsave = false; - { - U8 xsave_buffer[KB(4)]; - struct iovec iov_xsave = {0}; - iov_xsave.iov_len = sizeof(xsave_buffer); - iov_xsave.iov_base = xsave_buffer; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave) != -1){ - SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; - syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &xsave->legacy); - - // TODO(allen): this is a lie; ymm can technically move around - // we need some more low-level-assembly-fu to do this hardcore. - B32 has_ymm_registers = ((xsave->header.xstate_bv & 4) != 0); - if (has_ymm_registers){ - syms_x64_regs__set_full_regs_from_xsave_avx_extension(dst, xsave->ymmh); - } - - got_xsave = true; - } - } - - B32 got_fxsave = false; - if (!got_xsave){ - SYMS_XSaveLegacy fxsave = {0}; - struct iovec iov_fxsave = {0}; - iov_fxsave.iov_len = sizeof(fxsave); - iov_fxsave.iov_base = &fxsave; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave) != -1){ - syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &fxsave); - got_fxsave = true; - } - } - - if (got_xsave || got_fxsave){ - got_fpr = true; - } - } - - // debug - B32 got_debug = false; - if (got_fpr){ - got_debug = true; - SYMS_Reg32 *dr_d = &dst->dr0; - for (U32 i = 0; i < 8; i += 1, dr_d += 1){ - if (i != 4 && i != 5){ - U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); - errno = 0; - int peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0); - if (errno == 0){ - dr_d->u32 = (U32)peek_result; - } - else{ - got_debug = false; - } - } - } - } - - // got everything - B32 result = got_debug; - return(result); -} - -internal B32 -demon_os_write_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *src){ - pid_t tid = (pid_t)thread->id; - - // gpr - DEMON_LNX_UserX64 ctx = {0}; - demon_lnx_usr_regs_x64_from_regs_x64(&ctx.regs, src); - - struct iovec iov_gpr = {0}; - iov_gpr.iov_base = &ctx; - iov_gpr.iov_len = sizeof(ctx); - int gpr_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr); - B32 gpr_success = (gpr_result != -1); - - // fpr - int xsave_result = 0; - int fxsave_result = 0; - - { - U8 xsave_buffer[KB(4)] = {0}; - SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; - syms_x64_regs__set_xsave_legacy_from_full_regs(&xsave->legacy, src); - - xsave->header.xstate_bv = 7; - - // TODO(allen): this is a lie; ymm can technically move around - // we need some more low-level-assembly-fu to do this hardcore. - syms_x64_regs__set_xsave_avx_extension_from_full_regs(xsave->ymmh, src); - - { - struct iovec iov_xsave = {0}; - iov_xsave.iov_base = &xsave; - iov_xsave.iov_len = sizeof(xsave); - xsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave); - } - - if (xsave_result == -1){ - struct iovec iov_fxsave = {0}; - iov_fxsave.iov_base = &xsave->legacy; - iov_fxsave.iov_len = sizeof(xsave->legacy); - fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave); - } - } - - B32 fpr_success = (xsave_result != -1 || fxsave_result != -1); - - // debug - B32 dr_success = true; - { - SYMS_Reg32 *dr_s = &src->dr0; - for (U32 i = 0; i < 8; i += 1, dr_s += 1){ - if (i != 4 && i != 5){ - U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); - errno = 0; - int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s->u32); - if (poke_result == -1){ - dr_success = false; - } - } - } - } - - // assemble result - B32 result = (gpr_success && fpr_success && dr_success); - - return(result); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Process Listing - -internal void -demon_os_proc_iter_begin(DEMON_ProcessIter *iter){ - DIR *dir = opendir("/proc"); - MemoryZeroStruct(iter); - iter->v[0] = IntFromPtr(dir); -} - -internal B32 -demon_os_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out){ - // scan for a process id - B32 got_pid = false; - String8 pid_string = {0}; - - DIR *dir = (DIR*)PtrFromInt(iter->v[0]); - if (dir != 0 && iter->v[1] == 0){ - for (;;){ - struct dirent *d = readdir(dir); - if (d == 0){ - break; - } - - // check file name is integer - String8 file_name = str8_cstring((char*)d->d_name); - B32 is_integer = str8_is_integer(file_name, 10); - - // break on integers (which represent processes) - if (is_integer){ - got_pid = true; - pid_string = file_name; - break; - } - } - } - - // mark iterator dead if nothing found - if (!got_pid){ - iter->v[1] = 1; - } - - // if got process id convert pid -> process info - B32 result = false; - if (got_pid){ - // determine the name we will report - pid_t pid = u64_from_str8(pid_string, 10); - String8 name = demon_lnx_executable_path_from_pid(arena, pid); - if (name.size == 0){ - name = str8_lit(""); - } - - // finish conversion - info_out->name = name; - info_out->pid = pid; - result = true; - } - - return(result); -} - -internal void -demon_os_proc_iter_end(DEMON_ProcessIter *iter){ - DIR *dir = (DIR*)PtrFromInt(iter->v[0]); - if (dir != 0){ - closedir(dir); - } - MemoryZeroStruct(iter); -} diff --git a/src/demon/linux/demon_os_linux.h b/src/demon/linux/demon_os_linux.h deleted file mode 100644 index 4e039e35..00000000 --- a/src/demon/linux/demon_os_linux.h +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_OS_LINUX_H -#define DEMON_OS_LINUX_H - -// TODO(allen): Potential Upgrades: -// -// memory fd upgrade - Right now for each process we hold open a file -// descriptor for the process's memory (/proc/%d/mem) for the entire lifetime -// of the process; it could be opened and closed with some kind of LRU cache -// to put a finite cap on the number of handles the demon holds -// - -//////////////////////////////// -//~ NOTE(allen): Get The Linux Includes - -#include -#include -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ NOTE(allen): Linux Demon Types - -//- entities - -// Demon Linux Entity Extensions -// Process: ext_u64 set to memory file descriptor -// Thread : ext_u64 cast to DEMON_LNX_ThreadExt -// Module : ext_u64 set to U64 (address of name) - -struct DEMON_LNX_ThreadExt{ - B32 expecting_dummy_sigstop; -}; -StaticAssert(sizeof(DEMON_LNX_ThreadExt) <= sizeof(Member(DEMON_Entity, ext_u64)), check_demon_lnx_thread_ext); - -//- helpers - -struct DEMON_LNX_AttachNode{ - DEMON_LNX_AttachNode *next; - pid_t pid; -}; - -struct DEMON_LNX_ProcessAux{ - B32 filled; - U64 phnum; - U64 phent; - U64 phdr; - U64 execfn; -}; - -struct DEMON_LNX_PhdrInfo{ - Rng1U64 range; - U64 dynamic; -}; - -struct DEMON_LNX_ModuleNode{ - DEMON_LNX_ModuleNode *next; - U64 vaddr; - U64 size; - U64 name; - U64 already_known; -}; - -struct DEMON_LNX_EntityNode{ - DEMON_LNX_EntityNode *next; - DEMON_Entity *entity; -}; - -//////////////////////////////// -//~ NOTE(allen): Linux Demon Register Layouts - -// these are defined in but only for one architecture at a time -// (and we can't really trick it into giving us both in any obvious way) -// we define them here so that we have them all "at once" - -struct DEMON_LNX_UserRegsX64{ - U64 r15; - U64 r14; - U64 r13; - U64 r12; - U64 rbp; - U64 rbx; - U64 r11; - U64 r10; - U64 r9; - U64 r8; - U64 rax; - U64 rcx; - U64 rdx; - U64 rsi; - U64 rdi; - U64 orig_rax; - U64 rip; - U64 cs; - U64 rflags; - U64 rsp; - U64 ss; - U64 fsbase; - U64 gsbase; - U64 ds; - U64 es; - U64 fs; - U64 gs; -}; - -struct DEMON_LNX_UserX64{ - DEMON_LNX_UserRegsX64 regs; - S32 u_fpvalid, _pad0; - SYMS_XSaveLegacy i387; - U64 u_tsize, u_dsize, u_ssize, start_code, start_stack; - U64 signal; - S32 reserved, _pad1; - U64 u_ar0, u_fpstate; - U64 magic; - U8 u_comm[32]; - U64 u_debugreg[8]; -}; - -struct DEMON_LNX_UserRegsX86{ - U32 ebx; - U32 ecx; - U32 edx; - U32 esi; - U32 edi; - U32 ebp; - U32 eax; - U32 ds; - U32 es; - U32 fs; - U32 gs; - U32 orig_eax; - U32 eip; - U32 cs; - U32 eflags; - U32 sp; - U32 ss; -}; - -struct DEMON_LNX_UserX86{ - DEMON_LNX_UserRegsX86 regs; - S32 u_fpvalid; - SYMS_FSave i387; - U32 u_tsize, u_dsize, u_ssize, start_code, start_stack; - S32 signal, reserved; - U32 u_ar0, u_fpstate; - U32 magic; - U8 u_comm[32]; - U32 u_debugreg[8]; -}; - -//////////////////////////////// - -enum -{ - DEMON_LNX_PermFlags_Read = (1 << 0), - DEMON_LNX_PermFlags_Write = (1 << 1), - DEMON_LNX_PermFlags_Exec = (1 << 2), - DEMON_LNX_PermFlags_Private = (1 << 3) -}; -typedef int DEMON_LNX_PermFlags; - -enum -{ - DEMON_LNX_MapsEntryType_Null, - DEMON_LNX_MapsEntryType_Path, - DEMON_LNX_MapsEntryType_Heap, - DEMON_LNX_MapsEntryType_Stack, - DEMON_LNX_MapsEntryType_VDSO, -}; -typedef int DEMON_LNX_MapsEntryType; - -struct DEMON_LNX_MapsEntry -{ - U64 address_lo; - U64 address_hi; - DEMON_LNX_PermFlags perms; - U64 offset; - U32 dev_major; - U32 dev_minor; - U64 inode; - String8 pathname; - DEMON_LNX_MapsEntryType type; - pid_t stack_tid; -}; - -//////////////////////////////// -//~ rjf: Helpers - -internal DEMON_LNX_ThreadExt* demon_lnx_thread_ext(DEMON_Entity *entity); - -internal B32 demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node); - -internal String8 demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid); -internal int demon_lnx_open_memory_fd_for_pid(pid_t pid); - -internal Architecture demon_lnx_arch_from_pid(pid_t pid); -internal DEMON_LNX_ProcessAux demon_lnx_aux_from_pid(pid_t pid, Architecture arch); -internal DEMON_LNX_PhdrInfo demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, - U64 phvaddr, U64 phstride, U64 phcount); -internal DEMON_LNX_ModuleNode* demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process); - -internal U64 demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size); -internal B32 demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size); -internal String8 demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address); - -internal void demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src); -internal void demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src); - -internal String8 demon_lnx_read_int_string(int fd); -internal B32 demon_lnx_read_expect(int fd, char expect); -internal int demon_lnx_read_whitespace(int fd); -internal String8 demon_lnx_read_string(Arena *arena, int fd); - -internal int demon_lnx_open_maps(pid_t pid); -internal B32 demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out); - -#endif //DEMON_OS_LINUX_H diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon/win32/demon_core_win32.c similarity index 100% rename from src/demon2/win32/demon2_core_win32.c rename to src/demon/win32/demon_core_win32.c diff --git a/src/demon2/win32/demon2_core_win32.h b/src/demon/win32/demon_core_win32.h similarity index 99% rename from src/demon2/win32/demon2_core_win32.h rename to src/demon/win32/demon_core_win32.h index 15e2e3ac..02dd05d1 100644 --- a/src/demon2/win32/demon2_core_win32.h +++ b/src/demon/win32/demon_core_win32.h @@ -1,8 +1,8 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef DEMON2_CORE_WIN32_H -#define DEMON2_CORE_WIN32_H +#ifndef DEMON_CORE_WIN32_H +#define DEMON_CORE_WIN32_H //////////////////////////////// //~ rjf: Windows Includes @@ -284,4 +284,4 @@ internal B32 dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, vo //- rjf: remote thread injection internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); -#endif // DEMON2_CORE_WIN32_H +#endif // DEMON_CORE_WIN32_H diff --git a/src/demon/win32/demon_os_win32.c b/src/demon/win32/demon_os_win32.c deleted file mode 100644 index a27f816d..00000000 --- a/src/demon/win32/demon_os_win32.c +++ /dev/null @@ -1,2154 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Globals - -global GetThreadDescriptionFunctionType *demon_w32_GetThreadDescription = 0; - -global B32 demon_w32_resume_needed = 0; -global DWORD demon_w32_resume_pid = 0; -global DWORD demon_w32_resume_tid = 0; - -global B32 demon_w32_exception_not_handled = 0; -global DEMON_Entity* demon_w32_halter_process = 0; -global DWORD demon_w32_halter_thread_id = 0; - -global B32 demon_w32_new_process_pending = 0; - -global Arena *demon_w32_ext_arena = 0 ; -global DEMON_W32_Ext *demon_w32_proc_ext_free = 0; - -global Arena *demon_w32_detach_proc_arena = 0; -global DEMON_EntityNode *demon_w32_first_detached_proc = 0; -global DEMON_EntityNode *demon_w32_last_detached_proc = 0; - -global String8List demon_w32_environment = {0}; - -//////////////////////////////// -//~ rjf: Helpers - -internal U64 -demon_w32_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal DEMON_W32_Ext* -demon_w32_ext_alloc(void){ - DEMON_W32_Ext *result = demon_w32_proc_ext_free; - if (result != 0){ - SLLStackPop(demon_w32_proc_ext_free); - } - else{ - result = push_array_no_zero(demon_w32_ext_arena, DEMON_W32_Ext, 1); - } - MemoryZeroStruct(result); - return(result); -} - -internal DEMON_W32_Ext* -demon_w32_ext(DEMON_Entity *entity){ - DEMON_W32_Ext *result = (DEMON_W32_Ext*)entity->ext; - return(result); -} - -internal U64 -demon_w32_read_memory(HANDLE process_handle, void *dst, U64 src_address, U64 size){ - U64 bytes_read = 0; - U8 *ptr = (U8*)dst; - U8 *opl = ptr + size; - U64 cursor = src_address; - for (;ptr < opl;){ - SIZE_T to_read = (SIZE_T)(opl - ptr); - SIZE_T actual_read = 0; - if (!ReadProcessMemory(process_handle, (LPCVOID)cursor, ptr, to_read, &actual_read)){ - bytes_read += actual_read; - break; - } - ptr += actual_read; - cursor += actual_read; - bytes_read += actual_read; - } - return bytes_read; -} - -internal B32 -demon_w32_write_memory(HANDLE process_handle, U64 dst_address, void *src, U64 size){ - B32 result = 1; - U8 *ptr = (U8*)src; - U8 *opl = ptr + size; - U64 cursor = dst_address; - for (;ptr < opl;){ - SIZE_T to_write = (SIZE_T)(opl - ptr); - SIZE_T actual_write = 0; - if (!WriteProcessMemory(process_handle, (LPVOID)cursor, ptr, to_write, &actual_write)){ - result = 0; - break; - } - ptr += actual_write; - cursor += actual_write; - } - return(result); -} - -internal String8 -demon_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address){ - // TODO(allen): this could be done better with a demon_w32_read_memory - // that returns a read amount instead of a success/fail. - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 0;){ - if (demon_w32_read_memory(process_handle, block, read_p, cap)){ - break; - } - cap /= 2; - } - read_p += cap; - - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 1){ - if (block[block_opl] == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 result = str8_list_join(arena, &list, 0); - scratch_end(scratch); - return(result); -} - -internal String16 -demon_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address){ - // TODO(allen): this could be done better with a demon_w32_read_memory - // that returns a read amount instead of a success/fail. - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 1;){ - if (demon_w32_read_memory(process_handle, block, read_p, cap)){ - break; - } - cap /= 2; - } - read_p += cap; - - U16 *block16 = (U16*)block; - (void)block16; - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 2){ - if (*(U16*)(block + block_opl) == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 joined = str8_list_join(arena, &list, 0); - String16 result = {(U16*)joined.str, joined.size/2}; - scratch_end(scratch); - return(result); -} - -internal DEMON_W32_ImageInfo -demon_w32_image_info_from_base(HANDLE process_handle, U64 base){ - // find pe offset in dos header - U32 pe_offset = 0; - - { - U64 dos_magic_off = base; - U16 dos_magic = 0; - demon_w32_read_struct(process_handle, &dos_magic, dos_magic_off); - if (dos_magic == DEMON_DOS_MAGIC){ - U64 pe_offset_off = base + OffsetOf(DEMON_DosHeader, coff_file_offset); - demon_w32_read_struct(process_handle, &pe_offset, pe_offset_off); - } - } - - // get coff header - B32 got_coff_header = 0; - U64 coff_header_off = 0; - DEMON_CoffHeader coff_header = {0}; - - if (pe_offset > 0){ - U64 pe_magic_off = base + pe_offset; - U32 pe_magic = 0; - demon_w32_read_struct(process_handle, &pe_magic, pe_magic_off); - if (pe_magic == DEMON_PE_MAGIC){ - coff_header_off = pe_magic_off + sizeof(pe_magic); - if (demon_w32_read_struct(process_handle, &coff_header, coff_header_off)){ - got_coff_header = 1; - } - } - } - - // get arch and size - DEMON_W32_ImageInfo result = zero_struct; - if (got_coff_header){ - U64 optional_size_off = 0; - - Architecture arch = Architecture_Null; - switch (coff_header.machine){ - case DEMON_CoffMachineType_X86: - { - arch = Architecture_x86; - optional_size_off = OffsetOf(DEMON_PeOptionalHeader32, sizeof_image); - }break; - - case DEMON_CoffMachineType_X64: - { - arch = Architecture_x64; - optional_size_off = OffsetOf(DEMON_PeOptionalHeader32Plus, sizeof_image); - }break; - - default: - {}break; - } - - if (arch != Architecture_Null){ - U64 optional_off = coff_header_off + sizeof(coff_header); - U32 size = 0; - if (demon_w32_read_struct(process_handle, &size, optional_off + optional_size_off)){ - result.arch = arch; - result.size = size; - } - } - } - - return(result); -} - -internal DWORD -demon_w32_inject_thread(DEMON_Entity *process, U64 start_address){ - LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address; - DEMON_Entity *entity = process; - DEMON_W32_Ext *process_ext = demon_w32_ext(entity); - DWORD thread_id = 0; - HANDLE thread = CreateRemoteThread(process_ext->proc.handle, 0, 0, start, 0, 0, &thread_id); - if (thread != 0){ - CloseHandle(thread); - } - return(thread_id); -} - -internal U16 -demon_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave){ - U16 result = 0; - U32 top = (fxsave->StatusWord >> 11) & 7; - for (U32 fpr = 0; fpr < 8; fpr += 1){ - U32 tag = 3; - if (fxsave->TagWord & (1 << fpr)){ - U32 st = (fpr - top)&7; - - REGS_Reg80 *fp = (REGS_Reg80*)&fxsave->FloatRegisters[st*16]; - U16 exponent = fp->sign1_exp15 & bitmask15; - U64 integer_part = fp->int1_frac63 >> 63; - U64 fraction_part = fp->int1_frac63 & bitmask63; - - // tag: 0 - normal; 1 - zero; 2 - special - tag = 2; - if (exponent == 0){ - if (integer_part == 0 && fraction_part == 0){ - tag = 1; - } - } - else if (exponent != bitmask15 && integer_part != 0){ - tag = 0; - } - } - result |= tag << (2 * fpr); - } - return(result); -} - -internal U16 -demon_w32_xsave_tag_word_from_real_tag_word(U16 ftw){ - U16 compact = 0; - for (U32 fpr = 0; fpr < 8; fpr++){ - U32 tag = (ftw >> (fpr * 2)) & 3; - if (tag != 3){ - compact |= (1 << fpr); - } - } - return(compact); -} - -internal DWORD -demon_w32_win32_from_memory_protect_flags(DEMON_MemoryProtectFlags flags){ - DWORD result = 0; - switch (flags){ - default: - case DEMON_MemoryProtectFlag_Read|DEMON_MemoryProtectFlag_Write: - case DEMON_MemoryProtectFlag_Write: - { - result = PAGE_READWRITE; - }break; - case DEMON_MemoryProtectFlag_Read|DEMON_MemoryProtectFlag_Write|DEMON_MemoryProtectFlag_Execute: - { - result = PAGE_EXECUTE_READWRITE; - }break; - case DEMON_MemoryProtectFlag_Execute: - { - result = PAGE_EXECUTE; - }break; - case DEMON_MemoryProtectFlag_Read: - { - result = PAGE_READONLY; - }break; - } - return(result); -} - -//////////////////////////////// -//~ rjf: Experiments - -internal void -demon_w32_peak_at_tls(DEMON_Handle thread_handle){ - DEMON_Entity *thread = demon_ent_ptr_from_handle(thread_handle); - if (thread != 0 && thread->kind == DEMON_EntityKind_Thread){ - - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - U64 tlb = thread_ext->thread.thread_local_base; - - U8 buffer[0x1000]; - demon_os_read_memory(thread->parent, buffer, tlb, 0x1000); - - int x = 0; - (void)x; - } -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Main Layer Initialization - -internal void -demon_os_init(void){ - demon_w32_ext_arena = arena_alloc(); - demon_w32_detach_proc_arena = arena_alloc(); - - // rjf: load Windows 10+ GetThreadDescription API - { - demon_w32_GetThreadDescription = (GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetThreadDescription"); - } - - // rjf: setup environment variables - { - CHAR *this_proc_env = GetEnvironmentStrings(); - U64 start_idx = 0; - for(U64 idx = 0;; idx += 1) - { - if(this_proc_env[idx] == 0) - { - if(start_idx == idx) - { - break; - } - else - { - String8 string = str8((U8 *)this_proc_env + start_idx, idx - start_idx); - str8_list_push(demon_w32_ext_arena, &demon_w32_environment, string); - start_idx = idx+1; - } - } - } - } -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Running/Halting - -internal DEMON_EventList -demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){ - DEMON_EventList result = {0}; - - if (demon_ent_root == 0){ - DEMON_Event *event = demon_push_event(arena, &result, DEMON_EventKind_Error); - event->error_kind = DEMON_ErrorKind_NotInitialized; - } - else if (demon_ent_root->first == 0 && !demon_w32_new_process_pending){ - DEMON_Event *event = demon_push_event(arena, &result, DEMON_EventKind_Error); - event->error_kind = DEMON_ErrorKind_NotAttached; - } - else if(demon_w32_first_detached_proc != 0) - { - for(DEMON_EntityNode *n = demon_w32_first_detached_proc; n != 0; n = n->next) - { - DEMON_Entity *process = n->entity; - - // rjf: push exit thread events - for(DEMON_Entity *child = process->first; child != 0; child = child->next) - { - if(child->kind == DEMON_EntityKind_Thread) - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(child); - } - } - - // rjf: push unload module events - for(DEMON_Entity *child = process->first; child != 0; child = child->next) - { - if(child->kind == DEMON_EntityKind_Module) - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(child); - e->string = demon_os_full_path_from_module(arena, child); - } - } - - // rjf: push exit process event - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitProcess); - e->process = demon_ent_handle_from_ptr(process); - e->code = 0; - } - - // rjf: free process - demon_ent_release_root_and_children(process); - } - demon_w32_first_detached_proc = 0; - demon_w32_last_detached_proc = 0; - arena_clear(demon_w32_detach_proc_arena); - } - else{ - Temp scratch = scratch_begin(&arena, 1); - - // get the single step thread (if any) - DEMON_Entity *single_step_thread = ctrls->single_step_thread; - - // TODO(allen): dedup per architecture? - // set single step bit - if (single_step_thread != 0){ - // TODO(allen): possibly buggy - switch(single_step_thread->arch) - { - default:{NotImplemented;}break; - case Architecture_x86: - { - REGS_RegBlockX86 regs = {0}; - demon_os_read_regs_x86(single_step_thread, ®s); - regs.eflags.u32 |= 0x100; - demon_os_write_regs_x86(single_step_thread, ®s); - }break; - - case Architecture_x64: - { - REGS_RegBlockX64 regs = {0}; - demon_os_read_regs_x64(single_step_thread, ®s); - regs.rflags.u64 |= 0x100; - demon_os_write_regs_x64(single_step_thread, ®s); - }break; - } - } - - // TODO(allen): per-Architecture implementation of traps - // set traps - U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, ctrls->trap_count); - - { - DEMON_OS_Trap *trap = ctrls->traps; - for (U64 i = 0; i < ctrls->trap_count; i += 1, trap += 1){ - if (demon_os_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)){ - U8 int3 = 0xCC; - demon_os_write_memory(trap->process, trap->address, &int3, 1); - } - else{ - trap_swap_bytes[i] = 0xCC; - } - } - } - - // determine how to resume from the last event - DWORD resume_code = DBG_CONTINUE; - if (demon_w32_exception_not_handled){ - if (!ctrls->ignore_previous_exception){ - resume_code = DBG_EXCEPTION_NOT_HANDLED; - } - } - demon_w32_exception_not_handled = 0; - - // list threads that run this time - DEMON_W32_EntityNode *first_run_thread = 0; - DEMON_W32_EntityNode *last_run_thread = 0; - - for(DEMON_Entity *process = demon_ent_root->first; - process != 0; - process = process->next){ - if (process->kind == DEMON_EntityKind_Process){ - - // determine if this process is frozen - B32 process_is_frozen = 0; - if (ctrls->run_entities_are_processes){ - for (U64 i = 0; i < ctrls->run_entity_count; i += 1){ - if (ctrls->run_entities[i] == process){ - process_is_frozen = 1; - break; - } - } - } - - for (DEMON_Entity *thread = process->first; - thread != 0; - thread = thread->next){ - if (thread->kind == DEMON_EntityKind_Thread){ - // determine if this thread is frozen - B32 is_frozen = 0; - - if (ctrls->single_step_thread != 0 && - ctrls->single_step_thread != thread){ - is_frozen = 1; - } - else{ - - if (ctrls->run_entities_are_processes){ - is_frozen = process_is_frozen; - } - else{ - for (U64 i = 0; i < ctrls->run_entity_count; i += 1){ - if (ctrls->run_entities[i] == thread){ - is_frozen = 1; - break; - } - } - } - - if (ctrls->run_entities_are_unfrozen){ - is_frozen = !is_frozen; - } - } - - // rjf: disregard all other rules if this is the halter thread - if(demon_w32_halter_thread_id == thread->id) - { - is_frozen = 0; - } - - // add this thread to the list - if (!is_frozen){ - DEMON_W32_EntityNode *node = push_array_no_zero(scratch.arena, DEMON_W32_EntityNode, 1); - SLLQueuePush(first_run_thread, last_run_thread, node); - node->entity = thread; - } - } - } - } - } - - // prep suspension state of threads that will be allowed to run - for(DEMON_W32_EntityNode *node = first_run_thread; - node != 0; - node = node->next) - { - DEMON_Entity *thread = node->entity; - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - DWORD resume_result = ResumeThread(thread_ext->thread.handle); - if(resume_result == max_U32) - { - // TODO(allen): Error. Unknown cause (do GetLastError, FromatMessage) - } - else - { - DWORD desired_counter = 0; - DWORD current_counter = resume_result - 1; - if(current_counter != desired_counter) - { - // NOTE(rjf): Warning. The user has manually suspended this thread, - // so even though from Demon's perspective it thinks this thread - // should run, it will not, because the user has manually called - // SuspendThread or used CREATE_SUSPENDED or whatever. - } - } - } - - // rjf: if run threads are marked as having reported an explicit trap - // on their last run, shift their RIPs past that trap instruction, so - // that they may continue - for(DEMON_W32_EntityNode *node = first_run_thread; - node != 0; - node = node->next) - { - DEMON_Entity *thread = node->entity; - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - if(thread_ext->thread.last_run_reported_trap) - { - Temp temp = temp_begin(scratch.arena); - U64 regs_block_size = regs_block_size_from_architecture(thread->arch); - void *regs_block = push_array(temp.arena, U8, regs_block_size); - B32 good = demon_os_read_regs(thread, regs_block); - U64 pre_rip = regs_rip_from_arch_block(thread->arch, regs_block); - if(good && pre_rip == thread_ext->thread.last_run_reported_trap_pre_rip) - { - regs_arch_block_write_rip(thread->arch, regs_block, thread_ext->thread.last_run_reported_trap_post_rip); - demon_os_write_regs(thread, regs_block); - } - temp_end(temp); - thread_ext->thread.last_run_reported_trap = 0; - thread_ext->thread.last_run_reported_trap_post_rip = 0; - } - } - - // send last saved continue signal - B32 good_state = 1; - if (demon_w32_resume_needed != 0){ - if (!ContinueDebugEvent(demon_w32_resume_pid, demon_w32_resume_tid, resume_code)){ - good_state = 0; - } - - demon_w32_resume_needed = 0; - demon_w32_resume_pid = 0; - demon_w32_resume_tid = 0; - } - - // wait for a new event from targets - DEBUG_EVENT evt = {0}; - B32 got_new_event = 0; - if (good_state){ - got_new_event = WaitForDebugEvent(&evt, INFINITE); - } - if (got_new_event){ - demon_w32_resume_needed = 1; - demon_w32_resume_pid = evt.dwProcessId; - demon_w32_resume_tid = evt.dwThreadId; - } - - // increment demon time - demon_time += 1; - - // reset all threads to paused state - if (got_new_event){ - for (DEMON_W32_EntityNode *node = first_run_thread; - node != 0; - node = node->next){ - DEMON_Entity *thread = node->entity; - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - DWORD suspend_result = SuspendThread(thread_ext->thread.handle); - if (suspend_result == max_U32){ - // TODO(allen): Error. Unknown cause (do GetLastError, FromatMessage) - // NOTE(allen): This can happen when the event is EXIT_THREAD_DEBUG_EVENT - // or EXIT_PROCESS_DEBUG_EVENT. After such an event SuspendThread - // gives error code 5 (access denied). This has no adverse effects, but if - // want to start reporting errors we should take care to avoid calling - // SuspendThread in that case. - } - else{ - DWORD desired_counter = 1; - DWORD current_counter = suspend_result + 1; - if (current_counter != desired_counter){ - // NOTE(rjf): Warning. We've suspended to something higher than 1. - // In this case, it means the user probably created the thread in - // a suspended state, or they called SuspendThread. - } - } - } - } - - // rjf: process event - if (got_new_event){ - got_new_event = 1; - - switch (evt.dwDebugEventCode){ - case CREATE_PROCESS_DEBUG_EVENT: - { - // pull outs - HANDLE process_handle = evt.u.CreateProcessInfo.hProcess; - HANDLE thread_handle = evt.u.CreateProcessInfo.hThread; - U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage; - DEMON_W32_ImageInfo image_info = demon_w32_image_info_from_base(process_handle, module_base); - - // init process entity - DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, evt.dwProcessId); - demon_proc_count += 1; - process->arch = image_info.arch; - DEMON_W32_Ext *process_ext = demon_w32_ext_alloc(); - process->ext = process_ext; - process_ext->proc.handle = process_handle; - - demon_w32_new_process_pending = 0; - - // init new associated entities - DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, evt.dwThreadId); - demon_thread_count += 1; - DEMON_W32_Ext *thread_ext = demon_w32_ext_alloc(); - thread->ext = thread_ext; - thread_ext->thread.handle = thread_handle; - thread_ext->thread.thread_local_base = (U64)evt.u.CreateProcessInfo.lpThreadLocalBase; - SuspendThread(thread_ext->thread.handle); - - DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, module_base); - demon_module_count += 1; - module->addr_range_dim = image_info.size; - DEMON_W32_Ext *module_ext = demon_w32_ext_alloc(); - module->ext = module_ext; - module_ext->module.handle = evt.u.CreateProcessInfo.hFile; - module_ext->module.address_of_name_pointer = (U64)evt.u.CreateProcessInfo.lpImageName; - module_ext->module.is_main = 1; - module_ext->module.name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0); - - // injection memory - { - U8 injection_code[DEMON_W32_INJECTED_CODE_SIZE]; - injection_code[0] = 0xC3; - for (U64 i = 1; i < DEMON_W32_INJECTED_CODE_SIZE; i += 1){ - injection_code[i] = 0xCC; - } - - U64 injection_size = DEMON_W32_INJECTED_CODE_SIZE + sizeof(DEMON_W32_InjectedBreak); - U64 injection_address = (U64)VirtualAllocEx(process_ext->proc.handle, 0, injection_size, - MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE); - demon_os_write_memory(process, injection_address, injection_code, sizeof(injection_code)); - process_ext->proc.injection_address = injection_address; - } - - // generate events - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(process); - e->code = evt.dwProcessId; - } - - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->code = evt.dwThreadId; - } - - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_LoadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(module); - e->address = module_base; - e->size = image_info.size; - e->string = demon_os_full_path_from_module(arena, module); - } - }break; - - case EXIT_PROCESS_DEBUG_EVENT: - { - // get process entity - DEMON_Entity *process = demon_ent_map_entity_from_id(DEMON_EntityKind_Process, evt.dwProcessId); - - if (process != 0){ - // update halter process pointer - if (process == demon_w32_halter_process){ - demon_w32_halter_process = 0; - } - - // generate events for threads & modules - for (DEMON_Entity *entity = process->first; - entity != 0; - entity = entity->next){ - if (entity->kind == DEMON_EntityKind_Thread){ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(entity); - } - else{ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(entity); - e->string = demon_os_full_path_from_module(arena, entity); - } - } - - // generate event for self - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitProcess); - e->process = demon_ent_handle_from_ptr(process); - e->code = evt.u.ExitProcess.dwExitCode; - - // free entity - demon_ent_release_root_and_children(process); - - // rjf: detach - { - DWORD pid = evt.dwProcessId; - DebugActiveProcessStop(pid); - } - } - }break; - - case CREATE_THREAD_DEBUG_EVENT: - { - // get process entity - DEMON_Entity *process = demon_ent_map_entity_from_id(DEMON_EntityKind_Process, evt.dwProcessId); - - if (process != 0){ - // init new entity - DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, evt.dwThreadId); - demon_thread_count += 1; - DEMON_W32_Ext *thread_ext = demon_w32_ext_alloc(); - thread->ext = thread_ext; - thread_ext->thread.handle = evt.u.CreateThread.hThread; - thread_ext->thread.thread_local_base = (U64)evt.u.CreateThread.lpThreadLocalBase; - DWORD sus_result = SuspendThread(thread_ext->thread.handle); - (void)sus_result; - - // rjf: unpack thread name - String8 thread_name = {0}; - if(demon_w32_GetThreadDescription != 0) - { - WCHAR *thread_name_w = 0; - HRESULT hr = demon_w32_GetThreadDescription(evt.u.CreateThread.hThread, &thread_name_w); - if(SUCCEEDED(hr)) - { - thread_name = str8_from_16(arena, str16_cstring((U16 *)thread_name_w)); - LocalFree(thread_name_w); - } - } - - // rjf: determine if this is the halter thread - B32 is_halter = (evt.dwThreadId == demon_w32_halter_thread_id); - - // generate event for non-halters - if (is_halter == 0){ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->code = evt.dwThreadId; - e->string = thread_name; - } - } - }break; - - case EXIT_THREAD_DEBUG_EVENT: - { - // get thread and process entity - DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, evt.dwThreadId); - - if (thread != 0){ - DEMON_Entity *process = thread->parent; - - // rjf: determine if this is the halter thread - B32 is_halter = (evt.dwThreadId == demon_w32_halter_thread_id); - - // rjf: generate a halt event if we're the halter - if (is_halter){ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_Halt); - demon_w32_halter_process = 0; - (void)e; - } - - // rjf: generate normal thread exit event on non-halter-thread exist - if (!is_halter){ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->code = evt.u.ExitThread.dwExitCode; - } - - // free entity - demon_ent_release_root_and_children(thread); - } - }break; - - case LOAD_DLL_DEBUG_EVENT: - { - // get process entity - DEMON_Entity *process = demon_ent_map_entity_from_id(DEMON_EntityKind_Process, evt.dwProcessId); - - if (process != 0){ - // get image info - DEMON_W32_Ext *process_ext = demon_w32_ext(process); - HANDLE process_handle = process_ext->proc.handle; - U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll; - DEMON_W32_ImageInfo image_info = demon_w32_image_info_from_base(process_handle, module_base); - - // init new entity - DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, module_base); - module->addr_range_dim = image_info.size; - demon_module_count += 1; - DEMON_W32_Ext *module_ext = demon_w32_ext_alloc(); - module->ext = module_ext; - module_ext->module.handle = evt.u.LoadDll.hFile; - module_ext->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName; - module_ext->module.is_main = 0; - module_ext->module.name_is_unicode = (evt.u.LoadDll.fUnicode != 0); - - // generate events - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_LoadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(module); - e->address = module_base; - e->size = image_info.size; - e->string = demon_os_full_path_from_module(arena, module); - } - } - }break; - - case UNLOAD_DLL_DEBUG_EVENT: - { - // get module and process entity - U64 module_base = (U64)evt.u.UnloadDll.lpBaseOfDll; - DEMON_Entity *module = demon_ent_map_entity_from_id(DEMON_EntityKind_Module, module_base); - - if (module != 0){ - DEMON_Entity *process = module->parent; - - // generate events - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(module); - e->string = demon_os_full_path_from_module(arena, module); - } - - // free entity - demon_ent_release_root_and_children(module); - } - }break; - - case EXCEPTION_DEBUG_EVENT: - { - // NOTE(rjf): Notes on multithreaded breakpoint events - // (2021/11/1): - // - // When many threads are simultaneously running, multiple threads - // may hit a trap "at the same time". When this happens there will be - // multiple events in an internal queue that we cannot see. If there - // is another event in the queue we will not see it until we call - // ContinueDebugEvent again, in a subsequent call to demon_os_run. - // - // When we get a trap event, the instruction pointer stored - // in the event will have the address of the int 3 instruction that - // was hit. Our RIP register, however, will be one byte past that. - // So, to get the behavior we want, we need to set the RIP register - // back to the address of the int 3. - // - // To deal with the fact that we may get breakpoint events later that - // were actually from this run what we do is: - // - // #1. If we get a trap event, and it corresponds to a user submitted - // trap, then we treat it is a breakpoint event. - // #2. If we get a trap event, and it does NOT correspond to a user - // trap in this call: - // #A. If the actual unmodified instruction byte is NOT an int 3, - // then this is a queued event from a previous run that is no - // longer applicable and we skip it. - // #B. If the actual unmodified instruction is an int 3, then this - // becomes a trap event and we do not reset RIP. - - // get thread and process entity - DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, evt.dwThreadId); - - if (thread != 0){ - DEMON_Entity *process = thread->parent; - Assert(process->kind == DEMON_EntityKind_Process); - - DEMON_W32_Ext *process_ext = demon_w32_ext(process); - - // TODO(allen): the exception record has two forms, one for 32 bit and one for 64 bit mode. - - EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; - EXCEPTION_RECORD *exception = &edi->ExceptionRecord; - U64 instruction_pointer = (U64)exception->ExceptionAddress; - - // check if first BP - B32 first_bp = 0; - if (exception->ExceptionCode == DEMON_W32_EXCEPTION_BREAKPOINT && - !process_ext->proc.did_first_bp){ - process_ext->proc.did_first_bp = 1; - first_bp = 1; - } - - // rjf: check if trap - B32 is_trap = (!first_bp && - (exception->ExceptionCode == DEMON_W32_EXCEPTION_BREAKPOINT || - exception->ExceptionCode == DEMON_W32_EXCEPTION_STACK_BUFFER_OVERRUN)); - - // rjf: check if this trap is currently registered - B32 hit_user_trap = 0; - if (is_trap){ - DEMON_OS_Trap *trap = ctrls->traps; - for (U64 i = 0; i < ctrls->trap_count; i += 1, trap += 1){ - if (trap->process == process && trap->address == instruction_pointer){ - hit_user_trap = 1; - break; - } - } - } - - // rjf: check if trap is explicit in the actual code memory - B32 hit_explicit_trap = 0; - if (is_trap && !hit_user_trap){ - U8 instruction_byte = 0; - if (demon_os_read_memory(process, &instruction_byte, instruction_pointer, 1)){ - // TODO(rjf): x86/x64 specific check - // TODO(rjf): do we need to check to make sure the instruction - // pointer has not changed? - hit_explicit_trap = (instruction_byte == 0xCC || - instruction_byte == 0xCD); - } - } - - // rjf: determine whether to roll back instruction pointer - B32 rollback = (is_trap); - - // rjf: roll back - U64 post_trap_rip = 0; - if(rollback) - { - Temp temp = temp_begin(scratch.arena); - U64 regs_block_size = regs_block_size_from_architecture(thread->arch); - void *regs_block = push_array(scratch.arena, U8, regs_block_size); - if(demon_os_read_regs(thread, regs_block)) - { - post_trap_rip = regs_rip_from_arch_block(thread->arch, regs_block); - regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer); - demon_os_write_regs(thread, regs_block); - } - temp_end(temp); - } - - // allen: if this is not a user trap or explicit trap it's a previous trap - B32 hit_previous_trap = (is_trap && !hit_user_trap && !hit_explicit_trap); - - // determine whether to skip this event - B32 skip_event = (hit_previous_trap); - - // emit event - if(!skip_event) - { - // rjf: fill top-level info - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_Exception); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->code = exception->ExceptionCode; - e->flags = exception->ExceptionFlags; - e->instruction_pointer = (U64)exception->ExceptionAddress; - - // rjf: explicit trap -> mark this thread as having reported this trap - if(hit_explicit_trap) - { - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - thread_ext->thread.last_run_reported_trap = 1; - thread_ext->thread.last_run_reported_trap_pre_rip = instruction_pointer; - thread_ext->thread.last_run_reported_trap_post_rip = post_trap_rip; - } - - // rjf: fill by exception code - switch (exception->ExceptionCode){ - case DEMON_W32_EXCEPTION_BREAKPOINT: - { - // rjf: determine event kind - DEMON_EventKind report_event_kind = DEMON_EventKind_Trap; - if (first_bp){ - report_event_kind = DEMON_EventKind_HandshakeComplete; - } - else if (hit_user_trap){ - report_event_kind = DEMON_EventKind_Breakpoint; - } - - // set event kind - e->kind = report_event_kind; - }break; - - case DEMON_W32_EXCEPTION_STACK_BUFFER_OVERRUN: - { - e->kind = DEMON_EventKind_Trap; - }break; - - case DEMON_W32_EXCEPTION_SINGLE_STEP: - { - e->kind = DEMON_EventKind_SingleStep; - }break; - - case DEMON_W32_EXCEPTION_THROW: - { - U64 exception_sp = 0; - U64 exception_ip = 0; - if (exception->NumberParameters >= 3){ - exception_sp = (U64)exception->ExceptionInformation[1]; - exception_ip = (U64)exception->ExceptionInformation[2]; - } - e->stack_pointer = exception_sp; - e->exception_kind = DEMON_ExceptionKind_CppThrow; - e->exception_repeated = (edi->dwFirstChance == 0); - demon_w32_exception_not_handled = (edi->dwFirstChance != 0); - }break; - - case DEMON_W32_EXCEPTION_ACCESS_VIOLATION: - case DEMON_W32_EXCEPTION_IN_PAGE_ERROR: - { - U64 exception_address = 0; - DEMON_ExceptionKind exception_kind = DEMON_ExceptionKind_Null; - if (exception->NumberParameters >= 2){ - switch (exception->ExceptionInformation[0]){ - case 0: exception_kind = DEMON_ExceptionKind_MemoryRead; break; - case 1: exception_kind = DEMON_ExceptionKind_MemoryWrite; break; - case 8: exception_kind = DEMON_ExceptionKind_MemoryExecute; break; - } - exception_address = exception->ExceptionInformation[1]; - } - - e->address = exception_address; - e->exception_kind = exception_kind; - e->exception_repeated = (edi->dwFirstChance == 0); - demon_w32_exception_not_handled = (edi->dwFirstChance != 0); - }break; - - case DEMON_W32_EXCEPTION_SET_THREAD_NAME: - { - if(exception->NumberParameters >= 2) - { - U64 thread_name_address = exception->ExceptionInformation[1]; - DEMON_Entity *process = demon_ent_map_entity_from_id(DEMON_EntityKind_Process, evt.dwProcessId); - String8List thread_name_strings = {0}; - { - U64 read_addr = thread_name_address; - U64 total_string_size = 0; - for(;total_string_size < KB(4);) - { - U8 *buffer = push_array_no_zero(scratch.arena, U8, 256); - B32 good_read = demon_os_read_memory(process, buffer, read_addr, 256); - if(good_read) - { - U64 size = 256; - for(U64 idx = 0; idx < 256; idx += 1) - { - if(buffer[idx] == 0) - { - size = idx; - break; - } - } - String8 string_part = str8(buffer, size); - str8_list_push(scratch.arena, &thread_name_strings, string_part); - total_string_size += size; - read_addr += size; - if(size < 256) - { - break; - } - } - } - } - e->kind = DEMON_EventKind_SetThreadName; - e->string = str8_list_join(arena, &thread_name_strings, 0); - if(exception->NumberParameters > 2) - { - e->code = exception->ExceptionInformation[2]; - } - } - }break; - - default: - { - demon_w32_exception_not_handled = (edi->dwFirstChance != 0); - }break; - } - } - } - }break; - - case OUTPUT_DEBUG_STRING_EVENT: - { - // get process entity - DEMON_Entity *process = demon_ent_map_entity_from_id(DEMON_EntityKind_Process, evt.dwProcessId); - DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, evt.dwThreadId); - - U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; - U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; - - // TODO(allen): is the string in UTF-8 or UTF-16? - - U8 *buffer = push_array_no_zero(arena, U8, string_size + 1); - demon_os_read_memory(process, buffer, string_address, string_size); - buffer[string_size] = 0; - - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_DebugString); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->string = str8(buffer, string_size); - if(string_size != 0 && buffer[string_size-1] == 0) - { - e->string.size -= 1; - } - }break; - - case RIP_EVENT: - { - DEMON_Entity *process = demon_ent_map_entity_from_id(DEMON_EntityKind_Process, evt.dwProcessId); - DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, evt.dwThreadId); - - // TODO(allen): this is not the right way to handle this event - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_Exception); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->flags = 0; - e->address = 0; - }break; - - default: - { - got_new_event = 0; - }break; - } - } - - //- rjf: gather new thread-names - if(demon_w32_GetThreadDescription != 0) - { - for(DEMON_Entity *process = demon_ent_root->first; - process != 0; - process = process->next) - { - if(process->kind != DEMON_EntityKind_Process) { continue; } - for(DEMON_Entity *thread = process->first; - thread != 0; - thread = thread->next) - { - if(thread->kind != DEMON_EntityKind_Thread) { continue; } - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - if(thread_ext->thread.last_name_hash == 0 || - thread_ext->thread.name_gather_time_us+1000000 <= os_now_microseconds()) - { - String8 name = {0}; - { - WCHAR *thread_name_w = 0; - HRESULT hr = demon_w32_GetThreadDescription(thread_ext->thread.handle, &thread_name_w); - if(SUCCEEDED(hr)) - { - name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w)); - LocalFree(thread_name_w); - } - } - U64 name_hash = demon_w32_hash_from_string(name); - if(name.size != 0 && name_hash != thread_ext->thread.last_name_hash) - { - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_SetThreadName); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->string = push_str8_copy(arena, name); - } - thread_ext->thread.name_gather_time_us = os_now_microseconds(); - thread_ext->thread.last_name_hash = name_hash; - } - } - } - } - - // TODO(allen): handle errors? if (!got_new_event) ? if (!good_state) ? - - // TODO(allen): per-Architecture - // unset traps - { - DEMON_OS_Trap *trap = ctrls->traps; - for (U64 i = 0; i < ctrls->trap_count; i += 1, trap += 1){ - U8 og_byte = trap_swap_bytes[i]; - if (og_byte != 0xCC){ - demon_os_write_memory(trap->process, trap->address, &og_byte, 1); - } - } - } - - // TODO(allen): per-Architecture - // unset single step bit - // the single step bit is automatically unset whenever we single step - // but if *something else* happened, it will still be there ready to - // confound us later; so here we're just being sure it's taken out. - if (single_step_thread != 0){ - // TODO(allen): possibly buggy - switch(single_step_thread->arch) - { - default:{NotImplemented;}break; - case Architecture_x86: - { - REGS_RegBlockX86 regs = {0}; - demon_os_read_regs_x86(single_step_thread, ®s); - regs.eflags.u32 &= ~0x100; - demon_os_write_regs_x86(single_step_thread, ®s); - }break; - - case Architecture_x64: - { - REGS_RegBlockX64 regs = {0}; - demon_os_read_regs_x64(single_step_thread, ®s); - regs.rflags.u64 &= ~0x100; - demon_os_write_regs_x64(single_step_thread, ®s); - }break; - } - } - - scratch_end(scratch); - } - - return(result); -} - -internal void -demon_os_halt(U64 code, U64 user_data){ - if (demon_ent_root != 0 && demon_w32_halter_process == 0){ - DEMON_Entity *process = demon_ent_root->first; - if (process != 0){ - DEMON_W32_Ext *process_ext = demon_w32_ext(process); - - demon_w32_halter_process = process; - DEMON_W32_InjectedBreak injection = {code, user_data}; - U64 data_injection_address = process_ext->proc.injection_address + DEMON_W32_INJECTED_CODE_SIZE; - demon_os_write_struct(process, data_injection_address, &injection); - demon_w32_halter_thread_id = demon_w32_inject_thread(process, process_ext->proc.injection_address); - } - } -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Target Process Launching/Attaching/Killing/Detaching/Halting - -internal U32 -demon_os_launch_process(OS_LaunchOptions *options){ - Temp scratch = scratch_begin(0, 0); - - // TODO(allen): maybe a good command line escaper/parser function pair? - String8 cmd = {0}; - if(options->cmd_line.first != 0) - { - String8List args = {0}; - String8 exe_path = options->cmd_line.first->string; - str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); - for(String8Node *n = options->cmd_line.first->next; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &args, n->string); - } - StringJoin join_params = {0}; - join_params.sep = str8_lit(" "); - cmd = str8_list_join(scratch.arena, &args, &join_params); - } - - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - String8List all_opts = options->env; - if(options->inherit_env != 0) - { - MemoryZeroStruct(&all_opts); - for(String8Node *n = options->env.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = demon_w32_environment.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - } - String8 env = str8_list_join(scratch.arena, &all_opts, &join_params2); - - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, options->path); - String16 env16 = str16_from_8(scratch.arena, env); - - U32 result = 0; - - //- rjf: launch - DWORD access_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - PROCESS_INFORMATION process_info = {0}; - AllocConsole(); - if (CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, - &startup_info, &process_info)){ - // check if we are 32-bit app, and just close it immediately - BOOL is_wow = 0; - IsWow64Process(process_info.hProcess, &is_wow); - if ( is_wow ){ - MessageBox(0,"Sorry, The RAD Debugger only debugs 64-bit applications currently.","Process error",MB_OK|MB_ICONSTOP); - DebugActiveProcessStop(process_info.dwProcessId); - TerminateProcess(process_info.hProcess,0xffffffff); - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); - } - else{ - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); - result = process_info.dwProcessId; - demon_w32_new_process_pending = 1; - } - } - else{ - MessageBox(0,"Error starting process.","Process error",MB_OK|MB_ICONSTOP); - } - FreeConsole(); - - //- rjf: eliminate all handles which have stuck around from the AllocConsole - { - SetStdHandle(STD_INPUT_HANDLE, 0); - SetStdHandle(STD_OUTPUT_HANDLE, 0); - SetStdHandle(STD_ERROR_HANDLE, 0); - } - - scratch_end(scratch); - return(result); -} - -internal B32 -demon_os_attach_process(U32 pid){ - B32 result = 0; - if (DebugActiveProcess((DWORD)pid)){ - result = 1; - demon_w32_new_process_pending = 1; - } - return(result); -} - -internal B32 -demon_os_kill_process(DEMON_Entity *process, U32 exit_code){ - B32 result = 0; - DEMON_W32_Ext *ext = demon_w32_ext(process); - if (TerminateProcess(ext->proc.handle, exit_code)){ - result = 1; - } - return(result); -} - -internal B32 -demon_os_detach_process(DEMON_Entity *process){ - B32 result = 0; - - // rjf: resume threads - for(DEMON_Entity *child = process->first; child != 0; child = child->next) - { - if(child->kind == DEMON_EntityKind_Thread) - { - DEMON_W32_Ext *thread_ext = demon_w32_ext(child); - DWORD resume_result = ResumeThread(thread_ext->thread.handle); - } - } - - // rjf: detach - { - DWORD pid = (DWORD)process->id; - if(DebugActiveProcessStop(pid)) - { - result = 1; - } - } - - // rjf: push into list - if(result != 0) - { - DEMON_EntityNode *n = push_array(demon_w32_detach_proc_arena, DEMON_EntityNode, 1); - n->entity = process; - SLLQueuePush(demon_w32_first_detached_proc, demon_w32_last_detached_proc, n); - } - - return(result); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Entity Functions - -//- rjf: cleanup - -internal void -demon_os_entity_cleanup(DEMON_Entity *entity) -{ - if (entity->kind == DEMON_EntityKind_Process){ - DEMON_W32_Ext *ext = demon_w32_ext(entity); - SLLStackPush(demon_w32_proc_ext_free, ext); - } - else if(entity->kind == DEMON_EntityKind_Module) - { - DEMON_W32_Ext *ext = demon_w32_ext(entity); - CloseHandle(ext->module.handle); - } -} - -//- rjf: introspection - -internal String8 -demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - // object -> handle - DEMON_W32_Ext *module_ext = (DEMON_W32_Ext*)module->ext; - HANDLE handle = module_ext->module.handle; - - String16 path16 = {0}; - String8 path8 = {0}; - - // handle -> full path - if (handle != 0){ - DWORD cap16 = GetFinalPathNameByHandleW(handle, 0, 0, VOLUME_NAME_DOS); - U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); - DWORD size16 = GetFinalPathNameByHandleW(handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); - path16 = str16(buffer16, size16); - } - - // fallback (main module only): process -> full path - if (path16.size == 0 && module_ext->module.is_main){ - // process handle - DEMON_Entity *process = module->parent; - DEMON_W32_Ext *process_ext = (DEMON_W32_Ext*)process->ext; - HANDLE process_handle = process_ext->proc.handle; - - DWORD size = KB(4); - U16 *buf = push_array_no_zero(scratch.arena, U16, size); - if (QueryFullProcessImageNameW(process_handle, 0, (WCHAR*)buf, &size)){ - path16 = str16(buf, size); - } - } - - // fallback (any module - no gaurantee): address_of_name -> full path - if (path16.size == 0 && module_ext->module.address_of_name_pointer != 0){ - // process handle - DEMON_Entity *process = module->parent; - DEMON_W32_Ext *process_ext = (DEMON_W32_Ext*)process->ext; - HANDLE process_handle = process_ext->proc.handle; - - // TODO(allen): address size independence - U64 ptr_size = 8; - - U64 name_pointer = 0; - if (demon_w32_read_memory(process_handle, &name_pointer, module_ext->module.address_of_name_pointer, ptr_size)){ - if (name_pointer != 0){ - if (module_ext->module.name_is_unicode){ - path16 = demon_w32_read_memory_str16(scratch.arena, process_handle, name_pointer); - } - else{ - path8 = demon_w32_read_memory_str(scratch.arena, process_handle, name_pointer); - } - } - } - } - - // finalize the result - String8 result = {0}; - - if (path16.size > 0){ - // skip the extended path thing if necessary - if (path16.size >= 4 && - path16.str[0] == L'\\' && - path16.str[1] == L'\\' && - path16.str[2] == L'?' && - path16.str[3] == L'\\'){ - path16.size -= 4; - path16.str += 4; - } - - // convert result - result = str8_from_16(arena, path16); - } - else{ - // skip the extended path thing if necessary - if (path8.size >= 4 && - path8.str[0] == L'\\' && - path8.str[1] == L'\\' && - path8.str[2] == L'?' && - path8.str[3] == L'\\'){ - path8.size -= 4; - path8.str += 4; - } - - // copy the result - result = push_str8_copy(arena, path8); - } - - scratch_end(scratch); - ProfEnd(); - return(result); -} - -internal U64 -demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread) -{ - DEMON_Entity *process = thread->parent; - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - U64 tlb = thread_ext->thread.thread_local_base; - U64 result = 0; - switch (thread->arch) - { - default:{NotImplemented;}break; - case Architecture_x64: - { - U64 stack_base_addr = tlb + 0x8; - demon_os_read_memory(process, &result, stack_base_addr, 8); - }break; - case Architecture_x86: - { - U64 stack_base_addr = tlb + 0x4; - demon_os_read_memory(process, &result, stack_base_addr, 4); - }break; - } - return(result); -} - -internal U64 -demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread) -{ - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - U64 result = thread_ext->thread.thread_local_base; - switch(thread->arch) - { - default:{NotImplemented;}break; - case Architecture_x64: - { - result += 88; - }break; - case Architecture_x86: - { - result += 44; - }break; - } - return(result); -} - -//- rjf: target process memory allocation/protection - -internal U64 -demon_os_reserve_memory(DEMON_Entity *process, U64 size){ - DEMON_W32_Ext *ext = demon_w32_ext(process); - void *ptr = VirtualAllocEx(ext->proc.handle, 0, size, MEM_RESERVE, PAGE_NOACCESS); - U64 result = (U64)ptr; - return(result); -} - -internal void -demon_os_set_memory_protect_flags(DEMON_Entity *process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags){ - DEMON_W32_Ext *ext = demon_w32_ext(process); - DWORD w32_flags = demon_w32_win32_from_memory_protect_flags(flags); - DWORD old_flags = 0; - DWORD alloc_type = (flags == 0 ? MEM_DECOMMIT : MEM_COMMIT); - VirtualAllocEx(ext->proc.handle, (void *)page_vaddr, size, alloc_type, w32_flags); - (void)old_flags; -} - -internal void -demon_os_release_memory(DEMON_Entity *process, U64 vaddr, U64 size){ - DEMON_W32_Ext *ext = demon_w32_ext(process); - VirtualFreeEx(ext->proc.handle, (void *)vaddr, 0, MEM_RELEASE); -} - -//- rjf: target process memory reading/writing - -internal U64 -demon_os_read_memory(DEMON_Entity *process, void *dst, U64 src_address, U64 size){ - DEMON_W32_Ext *process_ext = demon_w32_ext(process); - HANDLE handle = process_ext->proc.handle; - U64 result = demon_w32_read_memory(handle, dst, src_address, size); - return(result); -} - -internal B32 -demon_os_write_memory(DEMON_Entity *process, U64 dst_address, void *src, U64 size){ - DEMON_W32_Ext *process_ext = demon_w32_ext(process); - HANDLE handle = process_ext->proc.handle; - B32 result = demon_w32_write_memory(handle, dst_address, src, size); - return(result); -} - -//- rjf: thread registers reading/writing - -internal B32 -demon_os_read_regs_x86(DEMON_Entity *thread, REGS_RegBlockX86 *dst){ - B32 result = 0; - - // NOTE(allen): Get Thread Context - WOW64_CONTEXT ctx = {0}; - ctx.ContextFlags = DEMON_W32_CTX_X86_ALL; - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - HANDLE handle = thread_ext->thread.handle; - if (Wow64GetThreadContext(handle, (WOW64_CONTEXT *)&ctx)){ - result = 1; - - // NOTE(allen): Convert WOW64_CONTEXT -> REGS_RegBlockX86 - dst->eax.u32 = ctx.Eax; - dst->ebx.u32 = ctx.Ebx; - dst->ecx.u32 = ctx.Ecx; - dst->edx.u32 = ctx.Edx; - dst->esi.u32 = ctx.Esi; - dst->edi.u32 = ctx.Edi; - dst->esp.u32 = ctx.Esp; - dst->ebp.u32 = ctx.Ebp; - dst->eip.u32 = ctx.Eip; - dst->cs.u16 = ctx.SegCs; - dst->ds.u16 = ctx.SegDs; - dst->es.u16 = ctx.SegEs; - dst->fs.u16 = ctx.SegFs; - dst->gs.u16 = ctx.SegGs; - dst->ss.u16 = ctx.SegSs; - dst->dr0.u32 = ctx.Dr0; - dst->dr1.u32 = ctx.Dr1; - dst->dr2.u32 = ctx.Dr2; - dst->dr3.u32 = ctx.Dr3; - dst->dr6.u32 = ctx.Dr6; - dst->dr7.u32 = ctx.Dr7; - - // NOTE(allen): This bit is "supposed to always be 1" I guess. - // TODO(allen): Not sure what this is all about but I haven't investigated it yet. - // This might be totally not necessary or something. - dst->eflags.u32 = ctx.EFlags | 0x2; - - XSAVE_FORMAT *fxsave = (XSAVE_FORMAT*)ctx.ExtendedRegisters; - dst->fcw.u16 = fxsave->ControlWord; - dst->fsw.u16 = fxsave->StatusWord; - dst->ftw.u16 = demon_w32_real_tag_word_from_xsave(fxsave); - dst->fop.u16 = fxsave->ErrorOpcode; - dst->fip.u32 = fxsave->ErrorOffset; - dst->fcs.u16 = fxsave->ErrorSelector; - dst->fdp.u32 = fxsave->DataOffset; - dst->fds.u16 = fxsave->DataSelector; - dst->mxcsr.u32 = fxsave->MxCsr; - dst->mxcsr_mask.u32 = fxsave->MxCsr_Mask; - - M128A *float_s = fxsave->FloatRegisters; - REGS_Reg80 *float_d = &dst->fpr0; - for (U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1){ - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } - - M128A *xmm_s = fxsave->XmmRegisters; - REGS_Reg256 *xmm_d = &dst->ymm0; - for (U32 n = 0; n < 8; n += 1, xmm_s += 1, xmm_d += 1){ - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); - } - - // read FS/GS base - WOW64_LDT_ENTRY ldt = {0}; - - if (Wow64GetThreadSelectorEntry(handle, ctx.SegFs, &ldt)){ - U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); - dst->fsbase.u32 = base; - } - if (Wow64GetThreadSelectorEntry(handle, ctx.SegGs, &ldt)){ - U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); - dst->gsbase.u32 = base; - } - } - - return(result); -} - -internal B32 -demon_os_write_regs_x86(DEMON_Entity *thread, REGS_RegBlockX86 *src){ - // NOTE(allen): Convert REGS_RegBlockX86 -> WOW64_CONTEXT - WOW64_CONTEXT ctx = {0}; - ctx.ContextFlags = DEMON_W32_CTX_X86_ALL; - ctx.Eax = src->eax.u32; - ctx.Ebx = src->ebx.u32; - ctx.Ecx = src->ecx.u32; - ctx.Edx = src->edx.u32; - ctx.Esi = src->esi.u32; - ctx.Edi = src->edi.u32; - ctx.Esp = src->esp.u32; - ctx.Ebp = src->ebp.u32; - ctx.Eip = src->eip.u32; - ctx.SegCs = src->cs.u16; - ctx.SegDs = src->ds.u16; - ctx.SegEs = src->es.u16; - ctx.SegFs = src->fs.u16; - ctx.SegGs = src->gs.u16; - ctx.SegSs = src->ss.u16; - ctx.Dr0 = src->dr0.u32; - ctx.Dr1 = src->dr1.u32; - ctx.Dr2 = src->dr2.u32; - ctx.Dr3 = src->dr3.u32; - ctx.Dr6 = src->dr6.u32; - ctx.Dr7 = src->dr7.u32; - ctx.EFlags = src->eflags.u32; - - XSAVE_FORMAT *fxsave = (XSAVE_FORMAT*)ctx.ExtendedRegisters; - fxsave->ControlWord = src->fcw.u16; - fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = demon_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); - fxsave->ErrorOpcode = src->fop.u16; - fxsave->ErrorSelector = src->fcs.u16; - fxsave->DataSelector = src->fds.u16; - fxsave->ErrorOffset = src->fip.u32; - fxsave->DataOffset = src->fdp.u32; - fxsave->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; - fxsave->MxCsr_Mask = src->mxcsr_mask.u32; - - M128A *float_d = fxsave->FloatRegisters; - REGS_Reg80 *float_s = &src->fpr0; - for (U32 n = 0; - n < 8; - n += 1, float_s += 1, float_d += 1){ - MemoryCopy(float_d, float_s, 10); - } - - M128A *xmm_d = fxsave->XmmRegisters; - REGS_Reg256 *xmm_s = &src->ymm0; - for (U32 n = 0; - n < 8; - n += 1, xmm_d += 1, xmm_s += 1){ - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); - } - - // set thread context - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - HANDLE handle = thread_ext->thread.handle; - B32 result = 0; - if (Wow64SetThreadContext(handle, &ctx)){ - result = 1; - } - - return(result); -} - -internal B32 -demon_os_read_regs_x64(DEMON_Entity *thread, REGS_RegBlockX64 *dst){ - Temp scratch = scratch_begin(0, 0); - - // NOTE(allen): Check available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); - - // NOTE(allen): Setup the context - CONTEXT *ctx = 0; - U32 ctx_flags = DEMON_W32_CTX_X64_ALL; - if (avx_enabled){ - ctx_flags |= DEMON_W32_CTX_INTEL_XSTATE; - } - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){ - void *ctx_memory = push_array(scratch.arena, U8, size); - if (!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)){ - ctx = 0; - } - } - - B32 avx_available = 0; - - if (ctx != 0){ - // NOTE(allen): Finish Context Setup - if (avx_enabled){ - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); - } - - // NOTE(allen): Determine what features are available on this particular ctx - // TODO(allen): Experiment carefully with this nonsense. - // Does avx_enabled = avx_available in all circumstances or not? - DWORD64 xstate_flags = 0; - if (GetXStateFeaturesMask(ctx, &xstate_flags)){ - if (xstate_flags & XSTATE_MASK_AVX){ - avx_available = 1; - } - } - } - - // get thread context - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - HANDLE thread_handle = thread_ext->thread.handle; - if (!GetThreadContext(thread_handle, ctx)){ - ctx = 0; - } - - B32 result = 0; - if (ctx != 0){ - result = 1; - - // NOTE(allen): Convert CONTEXT -> REGS_RegBlockX64 - dst->rax.u64 = ctx->Rax; - dst->rcx.u64 = ctx->Rcx; - dst->rdx.u64 = ctx->Rdx; - dst->rbx.u64 = ctx->Rbx; - dst->rsp.u64 = ctx->Rsp; - dst->rbp.u64 = ctx->Rbp; - dst->rsi.u64 = ctx->Rsi; - dst->rdi.u64 = ctx->Rdi; - dst->r8.u64 = ctx->R8; - dst->r9.u64 = ctx->R9; - dst->r10.u64 = ctx->R10; - dst->r11.u64 = ctx->R11; - dst->r12.u64 = ctx->R12; - dst->r13.u64 = ctx->R13; - dst->r14.u64 = ctx->R14; - dst->r15.u64 = ctx->R15; - dst->rip.u64 = ctx->Rip; - dst->cs.u16 = ctx->SegCs; - dst->ds.u16 = ctx->SegDs; - dst->es.u16 = ctx->SegEs; - dst->fs.u16 = ctx->SegFs; - dst->gs.u16 = ctx->SegGs; - dst->ss.u16 = ctx->SegSs; - dst->dr0.u32 = ctx->Dr0; - dst->dr1.u32 = ctx->Dr1; - dst->dr2.u32 = ctx->Dr2; - dst->dr3.u32 = ctx->Dr3; - dst->dr6.u32 = ctx->Dr6; - dst->dr7.u32 = ctx->Dr7; - - // NOTE(allen): This bit is "supposed to always be 1" I guess. - // TODO(allen): Not sure what this is all about but I haven't investigated it yet. - // This might be totally not necessary or something. - dst->rflags.u64 = ctx->EFlags | 0x2; - - XSAVE_FORMAT *xsave = &ctx->FltSave; - dst->fcw.u16 = xsave->ControlWord; - dst->fsw.u16 = xsave->StatusWord; - dst->ftw.u16 = demon_w32_real_tag_word_from_xsave(xsave); - dst->fop.u16 = xsave->ErrorOpcode; - dst->fcs.u16 = xsave->ErrorSelector; - dst->fds.u16 = xsave->DataSelector; - dst->fip.u32 = xsave->ErrorOffset; - dst->fdp.u32 = xsave->DataOffset; - dst->mxcsr.u32 = xsave->MxCsr; - dst->mxcsr_mask.u32 = xsave->MxCsr_Mask; - - M128A *float_s = xsave->FloatRegisters; - REGS_Reg80 *float_d = &dst->fpr0; - for (U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1){ - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } - - if (!avx_available){ - M128A *xmm_s = xsave->XmmRegisters; - REGS_Reg256 *xmm_d = &dst->ymm0; - for (U32 n = 0; n < 16; n += 1, xmm_s += 1, xmm_d += 1){ - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); - } - } - - if (avx_available){ - DWORD part0_length = 0; - M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); - DWORD part1_length = 0; - M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); - Assert(part0_length == part1_length); - - DWORD count = part0_length/sizeof(part0[0]); - count = ClampTop(count, 16); - REGS_Reg256 *ymm_d = &dst->ymm0; - for (DWORD i = 0; - i < count; - i += 1, part0 += 1, part1 += 1, ymm_d += 1){ - // TODO(allen): Are we writing these out in the right order? Seems weird right? - ymm_d->u64[3] = part0->Low; - ymm_d->u64[2] = part0->High; - ymm_d->u64[1] = part1->Low; - ymm_d->u64[0] = part1->High; - } - } - - } - - scratch_end(scratch); - return(result); -} - -internal B32 -demon_os_write_regs_x64(DEMON_Entity *thread, REGS_RegBlockX64 *src){ - Temp scratch = scratch_begin(0, 0); - - // NOTE(allen): Check available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); - - // NOTE(allen): Setup the context - CONTEXT *ctx = 0; - U32 ctx_flags = DEMON_W32_CTX_X64_ALL; - if (avx_enabled){ - ctx_flags |= DEMON_W32_CTX_INTEL_XSTATE; - } - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){ - void *ctx_memory = push_array(scratch.arena, U8, size); - if (!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)){ - ctx = 0; - } - } - - B32 avx_available = 0; - - if (ctx != 0){ - // NOTE(allen): Finish Context Setup - if (avx_enabled){ - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); - } - - // NOTE(allen): Determine what features are available on this particular ctx - // TODO(allen): Experiment carefully with this nonsense. - // Does avx_enabled = avx_available in all circumstances or not? - DWORD64 xstate_flags = 0; - if (GetXStateFeaturesMask(ctx, &xstate_flags)){ - if (xstate_flags & XSTATE_MASK_AVX){ - avx_available = 1; - } - } - } - - B32 result = 0; - if (ctx != 0){ - // NOTE(allen): Convert REGS_RegBlockX64 -> CONTEXT - ctx->ContextFlags = ctx_flags; - - ctx->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; - - ctx->Rax = src->rax.u64; - ctx->Rcx = src->rcx.u64; - ctx->Rdx = src->rdx.u64; - ctx->Rbx = src->rbx.u64; - ctx->Rsp = src->rsp.u64; - ctx->Rbp = src->rbp.u64; - ctx->Rsi = src->rsi.u64; - ctx->Rdi = src->rdi.u64; - ctx->R8 = src->r8.u64; - ctx->R9 = src->r9.u64; - ctx->R10 = src->r10.u64; - ctx->R11 = src->r11.u64; - ctx->R12 = src->r12.u64; - ctx->R13 = src->r13.u64; - ctx->R14 = src->r14.u64; - ctx->R15 = src->r15.u64; - ctx->Rip = src->rip.u64; - ctx->SegCs = src->cs.u16; - ctx->SegDs = src->ds.u16; - ctx->SegEs = src->es.u16; - ctx->SegFs = src->fs.u16; - ctx->SegGs = src->gs.u16; - ctx->SegSs = src->ss.u16; - ctx->Dr0 = src->dr0.u32; - ctx->Dr1 = src->dr1.u32; - ctx->Dr2 = src->dr2.u32; - ctx->Dr3 = src->dr3.u32; - ctx->Dr6 = src->dr6.u32; - ctx->Dr7 = src->dr7.u32; - - ctx->EFlags = src->rflags.u64; - - XSAVE_FORMAT *fxsave = &ctx->FltSave; - fxsave->ControlWord = src->fcw.u16; - fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = demon_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); - fxsave->ErrorOpcode = src->fop.u16; - fxsave->ErrorSelector = src->fcs.u16; - fxsave->DataSelector = src->fds.u16; - fxsave->ErrorOffset = src->fip.u32; - fxsave->DataOffset = src->fdp.u32; - - M128A *float_d = fxsave->FloatRegisters; - REGS_Reg80 *float_s = &src->fpr0; - for (U32 n = 0; - n < 8; - n += 1, float_s += 1, float_d += 1){ - MemoryCopy(float_d, float_s, 10); - } - - if (!avx_available){ - M128A *xmm_d = fxsave->XmmRegisters; - REGS_Reg256 *xmm_s = &src->ymm0; - for (U32 n = 0; - n < 8; - n += 1, xmm_d += 1, xmm_s += 1){ - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); - } - } - - if (avx_available){ - DWORD part0_length = 0; - M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); - DWORD part1_length = 0; - M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); - Assert(part0_length == part1_length); - - DWORD count = part0_length/sizeof(part0[0]); - count = ClampTop(count, 16); - REGS_Reg256 *ymm_d = &src->ymm0; - for (DWORD i = 0; - i < count; - i += 1, part0 += 1, part1 += 1, ymm_d += 1){ - // TODO(allen): Are we writing these out in the right order? Seems weird right? - part0->Low = ymm_d->u64[3]; - part0->High = ymm_d->u64[2]; - part1->Low = ymm_d->u64[1]; - part1->High = ymm_d->u64[0]; - } - } - - //- set thread context - DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); - HANDLE thread_handle = thread_ext->thread.handle; - if (SetThreadContext(thread_handle, ctx)){ - result = 1; - } - } - - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Process Listing - -internal void -demon_os_proc_iter_begin(DEMON_ProcessIter *iter){ - MemoryZeroStruct(iter); - iter->v[0] = (U64)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); -} - -internal B32 -demon_os_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out){ - // get the next process entry - B32 result = 0; - PROCESSENTRY32W process_entry = {sizeof(process_entry)}; - HANDLE snapshot = (HANDLE)iter->v[0]; - if (iter->v[1] == 0){ - if (Process32FirstW(snapshot, &process_entry)){ - result = 1; - } - } - else{ - if (Process32NextW(snapshot, &process_entry)){ - result = 1; - } - } - - // increment counter - iter->v[1] += 1; - - // convert to process info - if (result){ - info_out->name = str8_from_16(arena, str16_cstring((U16*)process_entry.szExeFile)); - info_out->pid = (U32)process_entry.th32ProcessID; - } - - return(result); -} - -internal void -demon_os_proc_iter_end(DEMON_ProcessIter *iter){ - CloseHandle((HANDLE)iter->v[0]); - MemoryZeroStruct(iter); -} diff --git a/src/demon/win32/demon_os_win32.h b/src/demon/win32/demon_os_win32.h deleted file mode 100644 index 7233e0d0..00000000 --- a/src/demon/win32/demon_os_win32.h +++ /dev/null @@ -1,385 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_OS_WIN32_H -#define DEMON_OS_WIN32_H - -//////////////////////////////// -//~ NOTE(allen): Win32 Demon Headers Negotation - -// windows headers -#define WIN32_LEAN_AND_MEAN -#include -#include -#include - -//////////////////////////////// -//~ NOTE(allen): Win32 Demon Types - -//- entities - -// Demon Win32 Entity Extensions -// Process: ext points to independently allocated DEMON_W32_Ext -// Thread : ext points to independently allocated DEMON_W32_Ext -// Module : ext set to HANDLE - -typedef union DEMON_W32_Ext DEMON_W32_Ext; -union DEMON_W32_Ext -{ - DEMON_W32_Ext *next; - struct{ - HANDLE handle; - U64 injection_address; - B32 did_first_bp; - } proc; - struct{ - HANDLE handle; - U64 thread_local_base; - U64 last_name_hash; - U64 name_gather_time_us; - B32 last_run_reported_trap; - U64 last_run_reported_trap_pre_rip; - U64 last_run_reported_trap_post_rip; - } thread; - struct{ - HANDLE handle; - U64 address_of_name_pointer; - B32 is_main; - B32 name_is_unicode; - } module; -}; - -//- helpers - -typedef struct DEMON_W32_InjectedBreak DEMON_W32_InjectedBreak; -struct DEMON_W32_InjectedBreak -{ - U64 code; - U64 user_data; -}; -#define DEMON_W32_INJECTED_CODE_SIZE 32 - -typedef struct DEMON_W32_ImageInfo DEMON_W32_ImageInfo; -struct DEMON_W32_ImageInfo -{ - Architecture arch; - U32 size; -}; - -typedef struct DEMON_W32_EntityNode DEMON_W32_EntityNode; -struct DEMON_W32_EntityNode -{ - DEMON_W32_EntityNode *next; - DEMON_Entity *entity; -}; - -typedef HRESULT GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription); - -//////////////////////////////// -//~ NOTE(allen): Win32 Demon Exceptions - -#define DEMON_W32_EXCEPTION_BREAKPOINT 0x80000003u -#define DEMON_W32_EXCEPTION_SINGLE_STEP 0x80000004u -#define DEMON_W32_EXCEPTION_LONG_JUMP 0x80000026u -#define DEMON_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u -#define DEMON_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu -#define DEMON_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u -#define DEMON_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u -#define DEMON_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du -#define DEMON_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu -#define DEMON_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu -#define DEMON_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u -#define DEMON_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u -#define DEMON_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u -#define DEMON_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u -#define DEMON_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u -#define DEMON_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u -#define DEMON_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u -#define DEMON_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du -#define DEMON_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u -#define DEMON_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u -#define DEMON_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u -#define DEMON_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu -#define DEMON_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u -#define DEMON_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u -#define DEMON_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u -#define DEMON_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u -#define DEMON_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u -#define DEMON_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u -#define DEMON_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au -#define DEMON_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u -#define DEMON_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u -#define DEMON_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u -#define DEMON_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u -#define DEMON_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u -#define DEMON_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u -#define DEMON_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u -#define DEMON_W32_EXCEPTION_NO_MEMORY 0xC0000017u -#define DEMON_W32_EXCEPTION_THROW 0xE06D7363u -#define DEMON_W32_EXCEPTION_SET_THREAD_NAME 0x406d1388u - -//////////////////////////////// -//~ NOTE(allen): Win32 Demon Register API Codes - -#define DEMON_W32_CTX_X86 0x00010000 -#define DEMON_W32_CTX_X64 0x00100000 - -#define DEMON_W32_CTX_INTEL_CONTROL 0x0001 -#define DEMON_W32_CTX_INTEL_INTEGER 0x0002 -#define DEMON_W32_CTX_INTEL_SEGMENTS 0x0004 -#define DEMON_W32_CTX_INTEL_FLOATS 0x0008 -#define DEMON_W32_CTX_INTEL_DEBUG 0x0010 -#define DEMON_W32_CTX_INTEL_EXTENDED 0x0020 -#define DEMON_W32_CTX_INTEL_XSTATE 0x0040 - -#define DEMON_W32_CTX_X86_ALL (DEMON_W32_CTX_X86 | \ -DEMON_W32_CTX_INTEL_CONTROL | DEMON_W32_CTX_INTEL_INTEGER | \ -DEMON_W32_CTX_INTEL_SEGMENTS | DEMON_W32_CTX_INTEL_DEBUG | \ -DEMON_W32_CTX_INTEL_EXTENDED) -#define DEMON_W32_CTX_X64_ALL (DEMON_W32_CTX_X64 | \ -DEMON_W32_CTX_INTEL_CONTROL | DEMON_W32_CTX_INTEL_INTEGER | \ -DEMON_W32_CTX_INTEL_SEGMENTS | DEMON_W32_CTX_INTEL_FLOATS | \ -DEMON_W32_CTX_INTEL_DEBUG) - -//////////////////////////////// -//~ rjf: DOS Header Types - -// this is the "MZ" as a 16-bit short -#define DEMON_DOS_MAGIC 0x5a4d - -#pragma pack(push,1) -typedef struct DEMON_DosHeader DEMON_DosHeader; -struct DEMON_DosHeader -{ - U16 magic; - U16 last_page_size; - U16 page_count; - U16 reloc_count; - U16 paragraph_header_size; - U16 min_paragraph; - U16 max_paragraph; - U16 init_ss; - U16 init_sp; - U16 checksum; - U16 init_ip; - U16 init_cs; - U16 reloc_table_file_off; - U16 overlay_number; - U16 reserved[4]; - U16 oem_id; - U16 oem_info; - U16 reserved2[10]; - U32 coff_file_offset; -}; -#pragma pack(pop) - -//////////////////////////////// -//~ rjf: Coff Header Types - -#define DEMON_PE_MAGIC 0x00004550u - -typedef U16 DEMON_CoffMachineType; -enum{ - DEMON_CoffMachineType_UNKNOWN = 0x0, - DEMON_CoffMachineType_X86 = 0x14c, - DEMON_CoffMachineType_X64 = 0x8664, - DEMON_CoffMachineType_ARM33 = 0x1d3, - DEMON_CoffMachineType_ARM = 0x1c0, - DEMON_CoffMachineType_ARM64 = 0xaa64, - DEMON_CoffMachineType_ARMNT = 0x1c4, - DEMON_CoffMachineType_EBC = 0xebc, - DEMON_CoffMachineType_IA64 = 0x200, - DEMON_CoffMachineType_M32R = 0x9041, - DEMON_CoffMachineType_MIPS16 = 0x266, - DEMON_CoffMachineType_MIPSFPU = 0x366, - DEMON_CoffMachineType_MIPSFPU16 = 0x466, - DEMON_CoffMachineType_POWERPC = 0x1f0, - DEMON_CoffMachineType_POWERPCFP = 0x1f1, - DEMON_CoffMachineType_R4000 = 0x166, - DEMON_CoffMachineType_RISCV32 = 0x5032, - DEMON_CoffMachineType_RISCV64 = 0x5064, - DEMON_CoffMachineType_RISCV128 = 0x5128, - DEMON_CoffMachineType_SH3 = 0x1a2, - DEMON_CoffMachineType_SH3DSP = 0x1a3, - DEMON_CoffMachineType_SH4 = 0x1a6, - DEMON_CoffMachineType_SH5 = 0x1a8, - DEMON_CoffMachineType_THUMB = 0x1c2, - DEMON_CoffMachineType_WCEMIPSV2 = 0x169, - DEMON_CoffMachineType_COUNT = 25 -}; - -typedef U16 DEMON_CoffFlags; -enum{ - DEMON_CoffFlag_RELOC_STRIPPED = (1 << 0), - DEMON_CoffFlag_EXECUTABLE_IMAGE = (1 << 1), - DEMON_CoffFlag_LINE_NUMS_STRIPPED = (1 << 2), - DEMON_CoffFlag_SYM_STRIPPED = (1 << 3), - DEMON_CoffFlag_RESERVED_0 = (1 << 4), - DEMON_CoffFlag_LARGE_ADDRESS_AWARE = (1 << 5), - DEMON_CoffFlag_RESERVED_1 = (1 << 6), - DEMON_CoffFlag_RESERVED_2 = (1 << 7), - DEMON_CoffFlag_32BIT_MACHINE = (1 << 8), - DEMON_CoffFlag_DEBUG_STRIPPED = (1 << 9), - DEMON_CoffFlag_REMOVABLE_RUN_FROM_SWAP = (1 << 10), - DEMON_CoffFlag_NET_RUN_FROM_SWAP = (1 << 11), - DEMON_CoffFlag_SYSTEM = (1 << 12), - DEMON_CoffFlag_DLL = (1 << 13), - DEMON_CoffFlag_UP_SYSTEM_ONLY = (1 << 14), - DEMON_CoffFlag_BYTES_RESERVED_HI = (1 << 15), -}; - -#pragma pack(push,1) -typedef struct DEMON_CoffHeader DEMON_CoffHeader; -struct DEMON_CoffHeader -{ - DEMON_CoffMachineType machine; - U16 section_count; - U32 time_date_stamp; - // TODO: rename to "unix_timestamp" - U32 pointer_to_symbol_table; - U32 number_of_symbols; - // TODO: rename to "symbol_count" - U16 size_of_optional_header; - // TODO: rename to "optional_header_size" - DEMON_CoffFlags flags; -}; -#pragma pack(pop) - -//////////////////////////////// -//~ rjf: PE Header Types - -#pragma pack(push, 1) - -typedef U16 DEMON_PeWindowsSubsystem; -enum{ - DEMON_PeWindowsSubsystem_UNKNOWN = 0, - DEMON_PeWindowsSubsystem_NATIVE = 1, - DEMON_PeWindowsSubsystem_WINDOWS_GUI = 2, - DEMON_PeWindowsSubsystem_WINDOWS_CUI = 3, - DEMON_PeWindowsSubsystem_OS2_CUI = 5, - DEMON_PeWindowsSubsystem_POSIX_CUI = 7, - DEMON_PeWindowsSubsystem_NATIVE_WINDOWS = 8, - DEMON_PeWindowsSubsystem_WINDOWS_CE_GUI = 9, - DEMON_PeWindowsSubsystem_EFI_APPLICATION = 10, - DEMON_PeWindowsSubsystem_EFI_BOOT_SERVICE_DRIVER = 11, - DEMON_PeWindowsSubsystem_EFI_RUNTIME_DRIVER = 12, - DEMON_PeWindowsSubsystem_EFI_ROM = 13, - DEMON_PeWindowsSubsystem_XBOX = 14, - DEMON_PeWindowsSubsystem_WINDOWS_BOOT_APPLICATION = 16, - DEMON_PeWindowsSubsystem_COUNT = 14 -}; - -typedef U16 DEMON_DllCharacteristics; -enum{ - DEMON_DllCharacteristic_HIGH_ENTROPY_VA = (1 << 5), - DEMON_DllCharacteristic_DYNAMIC_BASE = (1 << 6), - DEMON_DllCharacteristic_FORCE_INTEGRITY = (1 << 7), - DEMON_DllCharacteristic_NX_COMPAT = (1 << 8), - DEMON_DllCharacteristic_NO_ISOLATION = (1 << 9), - DEMON_DllCharacteristic_NO_SEH = (1 << 10), - DEMON_DllCharacteristic_NO_BIND = (1 << 11), - DEMON_DllCharacteristic_APPCONTAINER = (1 << 12), - DEMON_DllCharacteristic_WDM_DRIVER = (1 << 13), - DEMON_DllCharacteristic_GUARD_CF = (1 << 14), - DEMON_DllCharacteristic_TERMINAL_SERVER_AWARE = (1 << 15), -}; - -typedef struct DEMON_PeOptionalHeader32 DEMON_PeOptionalHeader32; -struct DEMON_PeOptionalHeader32 -{ - U16 magic; - U8 major_linker_version; - U8 minor_linker_version; - U32 sizeof_code; - U32 sizeof_inited_data; - U32 sizeof_uninited_data; - U32 entry_point_va; - U32 code_base; - U32 data_base; - U32 image_base; - U32 section_alignment; - U32 file_alignment; - U16 major_os_ver; - U16 minor_os_ver; - U16 major_img_ver; - U16 minor_img_ver; - U16 major_subsystem_ver; - U16 minor_subsystem_ver; - U32 win32_version_value; - U32 sizeof_image; - U32 sizeof_headers; - U32 check_sum; - DEMON_PeWindowsSubsystem subsystem; - DEMON_DllCharacteristics dll_characteristics; - U32 sizeof_stack_reserve; - U32 sizeof_stack_commit; - U32 sizeof_heap_reserve; - U32 sizeof_heap_commit; - U32 loader_flags; - U32 data_dir_count; -}; - -typedef struct DEMON_PeOptionalHeader32Plus DEMON_PeOptionalHeader32Plus; -struct DEMON_PeOptionalHeader32Plus -{ - U16 magic; - U8 major_linker_version; - U8 minor_linker_version; - U32 sizeof_code; - U32 sizeof_inited_data; - U32 sizeof_uninited_data; - U32 entry_point_va; - U32 code_base; - U64 image_base; - U32 section_alignment; - U32 file_alignment; - U16 major_os_ver; - U16 minor_os_ver; - U16 major_img_ver; - U16 minor_img_ver; - U16 major_subsystem_ver; - U16 minor_subsystem_ver; - U32 win32_version_value; - U32 sizeof_image; - U32 sizeof_headers; - U32 check_sum; - DEMON_PeWindowsSubsystem subsystem; - DEMON_DllCharacteristics dll_characteristics; - U64 sizeof_stack_reserve; - U64 sizeof_stack_commit; - U64 sizeof_heap_reserve; - U64 sizeof_heap_commit; - U32 loader_flags; - U32 data_dir_count; -}; - -#pragma pack(pop) - -//////////////////////////////// -//~ rjf: Helpers - -internal U64 demon_w32_hash_from_string(String8 string); -internal DEMON_W32_Ext* demon_w32_ext_alloc(void); -internal DEMON_W32_Ext* demon_w32_ext(DEMON_Entity *entity); - -internal U64 demon_w32_read_memory(HANDLE process_handle, void *dst, U64 src_address, U64 size); -internal B32 demon_w32_write_memory(HANDLE process_handle, U64 dst_address, void *src, U64 size); -internal String8 demon_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); -internal String16 demon_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); - -#define demon_w32_read_struct(h,dst,src) demon_w32_read_memory((h), (dst), (src), sizeof(*(dst))) - -internal DEMON_W32_ImageInfo demon_w32_image_info_from_base(HANDLE process_handle, U64 base); -internal DWORD demon_w32_inject_thread(DEMON_Entity *process, U64 start_address); - -internal U16 demon_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave); -internal U16 demon_w32_xsave_tag_word_from_real_tag_word(U16 ftw); - -internal DWORD demon_w32_win32_from_memory_protect_flags(DEMON_MemoryProtectFlags flags); - -//////////////////////////////// -//~ rjf: Experiments - -internal void demon_w32_peak_at_tls(DEMON_Handle handle); - -#endif //DEMON_OS_WIN32_H diff --git a/src/demon2/demon2_core.c b/src/demon2/demon2_core.c deleted file mode 100644 index 86c1c3c6..00000000 --- a/src/demon2/demon2_core.c +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Type Functions (Helpers, Implemented Once) - -//- rjf: handles - -internal DMN_Handle -dmn_handle_zero(void) -{ - DMN_Handle h = {0}; - return h; -} - -internal B32 -dmn_handle_match(DMN_Handle a, DMN_Handle b) -{ - return a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1]; -} - -//- rjf: trap chunk lists - -internal void -dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap) -{ - DMN_TrapChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, DMN_TrapChunkNode, 1); - node->cap = cap; - node->v = push_array_no_zero(arena, DMN_Trap, node->cap); - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - } - MemoryCopyStruct(&node->v[node->count], trap); - node->count += 1; - list->trap_count += 1; -} - -internal void -dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) -{ - if(dst->last == 0) - { - MemoryCopyStruct(dst, to_push); - } - else if(to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->node_count += to_push->node_count; - dst->trap_count += to_push->trap_count; - } - MemoryZeroStruct(to_push); -} - -internal void -dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) -{ - for(DMN_TrapChunkNode *src_n = to_push->first; src_n != 0; src_n = src_n->next) - { - DMN_TrapChunkNode *dst_n = push_array(arena, DMN_TrapChunkNode, 1); - dst_n->v = src_n->v; - dst_n->cap = src_n->cap; - dst_n->count = src_n->count; - SLLQueuePush(dst->first, dst->last, dst_n); - dst->node_count += 1; - dst->trap_count += dst_n->count; - } -} - -//- rjf: handle lists - -internal void -dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle) -{ - DMN_HandleNode *node = push_array(arena, DMN_HandleNode, 1); - SLLQueuePush(list->first, list->last, node); - node->v = handle; - list->count += 1; -} - -internal DMN_HandleArray -dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list) -{ - DMN_HandleArray array = {0}; - array.count = list->count; - array.handles = push_array_no_zero(arena, DMN_Handle, array.count); - U64 idx = 0; - for(DMN_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) - { - array.handles[idx] = n->v; - } - return array; -} - -internal DMN_HandleArray -dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src) -{ - DMN_HandleArray dst = {0}; - dst.count = src->count; - dst.handles = push_array_no_zero(arena, DMN_Handle, dst.count); - MemoryCopy(dst.handles, src->handles, sizeof(DMN_Handle)*dst.count); - return dst; -} - -//- rjf: event list building - -internal DMN_Event * -dmn_event_list_push(Arena *arena, DMN_EventList *list) -{ - DMN_EventNode *n = push_array(arena, DMN_EventNode, 1); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - DMN_Event *result = &n->v; - return result; -} - -//////////////////////////////// -//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) - -internal U64 -dmn_rip_from_thread(DMN_Handle thread) -{ - U64 result = 0; - Temp scratch = scratch_begin(0, 0); - { - Architecture arch = dmn_arch_from_thread(thread); - U64 reg_block_size = regs_block_size_from_architecture(arch); - void *reg_block = push_array(scratch.arena, U8, reg_block_size); - dmn_thread_read_reg_block(thread, reg_block); - result = regs_rip_from_arch_block(arch, reg_block); - } - scratch_end(scratch); - return result; -} - -internal U64 -dmn_rsp_from_thread(DMN_Handle thread) -{ - U64 result = 0; - Temp scratch = scratch_begin(0, 0); - { - Architecture arch = dmn_arch_from_thread(thread); - U64 reg_block_size = regs_block_size_from_architecture(arch); - void *reg_block = push_array(scratch.arena, U8, reg_block_size); - dmn_thread_read_reg_block(thread, reg_block); - result = regs_rsp_from_arch_block(arch, reg_block); - } - scratch_end(scratch); - return result; -} diff --git a/src/demon2/demon2_core.h b/src/demon2/demon2_core.h deleted file mode 100644 index e0e3860e..00000000 --- a/src/demon2/demon2_core.h +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON2_CORE_H -#define DEMON2_CORE_H - -//////////////////////////////// -//~ rjf: Control-Thread-Only Context -// -// An instance of this struct must ONLY be returned by dmn_ctrl_begin, and only -// used by the thread which called it. All APIs which can ONLY run on the -// control thread, which blocks to control & receive events, will take this -// parameter. All other APIs can be called from any thread. - -typedef struct DMN_CtrlCtx DMN_CtrlCtx; -struct DMN_CtrlCtx -{ - U64 u64 [1]; -}; - -//////////////////////////////// -//~ rjf: Handle Types - -typedef union DMN_Handle DMN_Handle; -union DMN_Handle -{ - U32 u32[2]; - U64 u64[1]; -}; - -typedef struct DMN_HandleNode DMN_HandleNode; -struct DMN_HandleNode -{ - DMN_HandleNode *next; - DMN_Handle v; -}; - -typedef struct DMN_HandleList DMN_HandleList; -struct DMN_HandleList -{ - DMN_HandleNode *first; - DMN_HandleNode *last; - U64 count; -}; - -typedef struct DMN_HandleArray DMN_HandleArray; -struct DMN_HandleArray -{ - DMN_Handle *handles; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/demon2.meta.h" - -//////////////////////////////// -//~ rjf: Event Types - -typedef struct DMN_Event DMN_Event; -struct DMN_Event -{ - DMN_EventKind kind; - DMN_ErrorKind error_kind; - DMN_MemoryEventKind memory_kind; - DMN_ExceptionKind exception_kind; - DMN_Handle process; - DMN_Handle thread; - DMN_Handle module; - Architecture arch; - U64 address; - U64 size; - String8 string; - U32 code; // code gives pid & tid on CreateProcess and CreateThread (respectfully) - U32 flags; - S32 signo; - S32 sigcode; - U64 instruction_pointer; - U64 stack_pointer; - U64 user_data; - B32 exception_repeated; -}; - -typedef struct DMN_EventNode DMN_EventNode; -struct DMN_EventNode -{ - DMN_EventNode *next; - DMN_Event v; -}; - -typedef struct DMN_EventList DMN_EventList; -struct DMN_EventList -{ - DMN_EventNode *first; - DMN_EventNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Run Control Types - -typedef struct DMN_Trap DMN_Trap; -struct DMN_Trap -{ - DMN_Handle process; - U64 vaddr; - U64 id; -}; - -typedef struct DMN_TrapChunkNode DMN_TrapChunkNode; -struct DMN_TrapChunkNode -{ - DMN_TrapChunkNode *next; - DMN_Trap *v; - U64 cap; - U64 count; -}; - -typedef struct DMN_TrapChunkList DMN_TrapChunkList; -struct DMN_TrapChunkList -{ - DMN_TrapChunkNode *first; - DMN_TrapChunkNode *last; - U64 node_count; - U64 trap_count; -}; - -typedef struct DMN_RunCtrls DMN_RunCtrls; -struct DMN_RunCtrls -{ - DMN_Handle single_step_thread; - B8 ignore_previous_exception; - B8 run_entities_are_unfrozen; - B8 run_entities_are_processes; - DMN_Handle *run_entities; - U64 run_entity_count; - DMN_TrapChunkList traps; -}; - -//////////////////////////////// -//~ rjf: System Process Listing Types - -typedef struct DMN_ProcessIter DMN_ProcessIter; -struct DMN_ProcessIter -{ - U64 v[2]; -}; - -typedef struct DMN_ProcessInfo DMN_ProcessInfo; -struct DMN_ProcessInfo -{ - String8 name; - U32 pid; -}; - -//////////////////////////////// -//~ rjf: Basic Type Functions (Helpers, Implemented Once) - -//- rjf: handles -internal DMN_Handle dmn_handle_zero(void); -internal B32 dmn_handle_match(DMN_Handle a, DMN_Handle b); - -//- rjf: trap chunk lists -internal void dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap); -internal void dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); -internal void dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); - -//- rjf: handle lists -internal void dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle); -internal DMN_HandleArray dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list); -internal DMN_HandleArray dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src); - -//- rjf: event list building -internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list); - -//////////////////////////////// -//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) - -internal U64 dmn_rip_from_thread(DMN_Handle thread); -internal U64 dmn_rsp_from_thread(DMN_Handle thread); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) - -internal void dmn_init(void); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) - -internal DMN_CtrlCtx *dmn_ctrl_begin(void); -internal void dmn_ctrl_exclusive_access_begin(void); -internal void dmn_ctrl_exclusive_access_end(void); -#define DMN_CtrlExclusiveAccessScope DeferLoop(dmn_ctrl_exclusive_access_begin(), dmn_ctrl_exclusive_access_end()) -internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_LaunchOptions *options); -internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid); -internal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code); -internal B32 dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process); -internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) - -internal void dmn_halt(U64 code, U64 user_data); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) - -//- rjf: run/memory/register counters -internal U64 dmn_run_gen(void); -internal U64 dmn_mem_gen(void); -internal U64 dmn_reg_gen(void); - -//- rjf: non-blocking-control-thread access barriers -internal B32 dmn_access_open(void); -internal void dmn_access_close(void); -#define DMN_AccessScope DeferLoopChecked(dmn_access_open(), dmn_access_close()) - -//- rjf: processes -internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); -internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); -#define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -#define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) - -//- rjf: threads -internal Architecture dmn_arch_from_thread(DMN_Handle handle); -internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); -internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); -internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); -internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); - -//- rjf: system process listing -internal void dmn_process_iter_begin(DMN_ProcessIter *iter); -internal B32 dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out); -internal void dmn_process_iter_end(DMN_ProcessIter *iter); - -#endif // DEMON2_CORE_H diff --git a/src/demon2/demon2_inc.c b/src/demon2/demon2_inc.c deleted file mode 100644 index f6bb4837..00000000 --- a/src/demon2/demon2_inc.c +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "demon2_core.c" - -#if OS_WINDOWS -# include "win32/demon2_core_win32.c" -#else -# error Demon layer backend not defined for this operating system. -#endif diff --git a/src/demon2/demon2_inc.h b/src/demon2/demon2_inc.h deleted file mode 100644 index e724c098..00000000 --- a/src/demon2/demon2_inc.h +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON2_INC_H -#define DEMON2_INC_H - -#include "demon2_core.h" - -#if OS_WINDOWS -# include "win32/demon2_core_win32.h" -#else -# error Demon layer backend not defined for this operating system. -#endif - -#endif // DEMON2_INC_H diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index eb035e73..9e4442c2 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -2,11 +2,11 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: Demon2 Pass Tasks +//~ rjf: Demon Pass Tasks // // [ ] TLS eval -> in-process-memory EXE info // [ ] unwinding -> in-process-memory EXE info -// [x] solidify synchronization mechanisms for usage of demon2 layer +// [x] solidify synchronization mechanisms for usage of demon layer // [x] TLS eval correctness // [x] freezing thread while running -> soft-halt diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 4fc4e296..888aea56 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -43,7 +43,7 @@ #include "regs/raddbgi/regs_raddbgi.h" #include "type_graph/type_graph.h" #include "dbgi/dbgi.h" -#include "demon2/demon2_inc.h" +#include "demon/demon_inc.h" #include "eval/eval_inc.h" #include "unwind/unwind.h" #include "ctrl/ctrl_inc.h" @@ -81,7 +81,7 @@ #include "regs/raddbgi/regs_raddbgi.c" #include "type_graph/type_graph.c" #include "dbgi/dbgi.c" -#include "demon2/demon2_inc.c" +#include "demon/demon_inc.c" #include "eval/eval_inc.c" #include "unwind/unwind.c" #include "ctrl/ctrl_inc.c" diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index d21ad724..6616ce90 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -43,7 +43,7 @@ #include "regs/raddbgi/regs_raddbgi.h" #include "type_graph/type_graph.h" #include "dbgi/dbgi.h" -#include "demon2/demon2_inc.h" +#include "demon/demon_inc.h" #include "eval/eval_inc.h" #include "unwind/unwind.h" #include "ctrl/ctrl_inc.h" @@ -71,7 +71,7 @@ #include "regs/raddbgi/regs_raddbgi.c" #include "type_graph/type_graph.c" #include "dbgi/dbgi.c" -#include "demon2/demon2_inc.c" +#include "demon/demon_inc.c" #include "eval/eval_inc.c" #include "unwind/unwind.c" #include "ctrl/ctrl_inc.c" From c26274ac705513cdd1b839215fd997aecd3c30c5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 17:17:08 -0700 Subject: [PATCH 208/275] disable single-step-stuck-thread behavior when launching-and-initing, such that breakpoints on entry point will not be stepped over --- src/ctrl/ctrl_core.c | 18 ++++++- src/ctrl/ctrl_core.h | 5 +- src/df/core/df_core.c | 121 +++++++++++++++++++++++------------------- src/df/core/df_core.h | 3 ++ src/raddbg/raddbg.h | 4 +- 5 files changed, 92 insertions(+), 59 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index fa06d999..390c5a6e 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1715,6 +1715,11 @@ ctrl_thread__entry_point(void *p) //- rjf: get next messages CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); + //- rjf: enable stuck-thread-step behavior in all cases - can be silently enabled by launch_and_init for subsequent messages + { + ctrl_state->disable_stuck_thread_step = 0; + } + //- rjf: process messages DMN_CtrlExclusiveAccessScope { @@ -2658,6 +2663,13 @@ ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ctrl_c2u_push_events(&evts); } + ////////////////////////////// + //- rjf: disable 'step-over-stuck' behavior + // + { + ctrl_state->disable_stuck_thread_step = 1; + } + scratch_end(scratch); ProfEnd(); } @@ -2862,7 +2874,11 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // the user breakpoint. // B32 target_thread_is_on_user_bp_and_trap_net_trap = 0; - if(stop_event == 0) + if(ctrl_state->disable_stuck_thread_step) + { + ctrl_state->disable_stuck_thread_step = 0; + } + else if(stop_event == 0 && !ctrl_state->disable_stuck_thread_step) { // rjf: gather stuck threads DMN_HandleList stuck_threads = {0}; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 02ca8006..cf459fe7 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -522,6 +522,7 @@ struct CTRL_State String8List user_entry_points; U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; U64 process_counter; + B32 disable_stuck_thread_step; // rjf: user -> memstream ring buffer U64 u2ms_ring_size; @@ -694,8 +695,8 @@ internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); internal void ctrl_thread__entry_point(void *p); //- rjf: breakpoint resolution -internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); //- rjf: attached process running/event gathering internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index df6ae29f..a96dbe5e 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3757,6 +3757,71 @@ df_log_from_entity(DF_Entity *entity) //////////////////////////////// //~ rjf: Target Controls +//- rjf: control user breakpoint gathering + +internal CTRL_UserBreakpointList +df_push_ctrl_user_breakpoints(Arena *arena) +{ + CTRL_UserBreakpointList user_bps_out = {0}; + DF_EntityList user_bp_entities = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); + for(DF_EntityNode *user_bp_n = user_bp_entities.first; + user_bp_n != 0; + user_bp_n = user_bp_n->next) + { + // rjf: unpack user breakpoint entity + DF_Entity *user_bp = user_bp_n->entity; + if(user_bp->b32 == 0) + { + continue; + } + DF_Entity *file = df_entity_ancestor_from_kind(user_bp, DF_EntityKind_File); + DF_Entity *symb = df_entity_child_from_kind(user_bp, DF_EntityKind_EntryPointName); + DF_EntityList overrides = df_possible_overrides_from_entity(arena, file); + for(DF_EntityNode *override_n = overrides.first; override_n != 0; override_n = override_n->next) + { + DF_Entity *override = override_n->entity; + DF_Entity *condition_child = df_entity_child_from_kind(user_bp, DF_EntityKind_Condition); + String8 condition = condition_child->name; + + // rjf: generate user breakpoint info depending on breakpoint placement + CTRL_UserBreakpointKind ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; + String8 ctrl_user_bp_string = {0}; + TxtPt ctrl_user_bp_pt = {0}; + U64 ctrl_user_bp_u64 = 0; + { + if(user_bp->flags & DF_EntityFlag_HasTextPoint) + { + ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; + ctrl_user_bp_string = df_full_path_from_entity(arena, override); + ctrl_user_bp_pt = user_bp->text_point; + } + else if(user_bp->flags & DF_EntityFlag_HasVAddr) + { + ctrl_user_bp_kind = CTRL_UserBreakpointKind_VirtualAddress; + ctrl_user_bp_u64 = user_bp->vaddr; + } + else if(!df_entity_is_nil(symb)) + { + ctrl_user_bp_kind = CTRL_UserBreakpointKind_SymbolNameAndOffset; + ctrl_user_bp_string = symb->name; + ctrl_user_bp_u64 = user_bp->u64; + } + } + + // rjf: push user breakpoint to list + { + CTRL_UserBreakpoint ctrl_user_bp = {ctrl_user_bp_kind}; + ctrl_user_bp.string = ctrl_user_bp_string; + ctrl_user_bp.pt = ctrl_user_bp_pt; + ctrl_user_bp.u64 = ctrl_user_bp_u64; + ctrl_user_bp.condition = condition; + ctrl_user_breakpoint_list_push(arena, &user_bps_out, &ctrl_user_bp); + } + } + } + return user_bps_out; +} + //- rjf: control message dispatching internal void @@ -3796,61 +3861,7 @@ df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_TrapList *run_traps) { MemoryCopyStruct(&msg.traps, run_traps); } - for(DF_EntityNode *user_bp_n = user_bps.first; - user_bp_n != 0; - user_bp_n = user_bp_n->next) - { - // rjf: unpack user breakpoint entity - DF_Entity *user_bp = user_bp_n->entity; - if(user_bp->b32 == 0) - { - continue; - } - DF_Entity *file = df_entity_ancestor_from_kind(user_bp, DF_EntityKind_File); - DF_Entity *symb = df_entity_child_from_kind(user_bp, DF_EntityKind_EntryPointName); - DF_EntityList overrides = df_possible_overrides_from_entity(scratch.arena, file); - for(DF_EntityNode *override_n = overrides.first; override_n != 0; override_n = override_n->next) - { - DF_Entity *override = override_n->entity; - DF_Entity *condition_child = df_entity_child_from_kind(user_bp, DF_EntityKind_Condition); - String8 condition = condition_child->name; - - // rjf: generate user breakpoint info depending on breakpoint placement - CTRL_UserBreakpointKind ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; - String8 ctrl_user_bp_string = {0}; - TxtPt ctrl_user_bp_pt = {0}; - U64 ctrl_user_bp_u64 = 0; - { - if(user_bp->flags & DF_EntityFlag_HasTextPoint) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; - ctrl_user_bp_string = df_full_path_from_entity(scratch.arena, override); - ctrl_user_bp_pt = user_bp->text_point; - } - else if(user_bp->flags & DF_EntityFlag_HasVAddr) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_VirtualAddress; - ctrl_user_bp_u64 = user_bp->vaddr; - } - else if(!df_entity_is_nil(symb)) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_SymbolNameAndOffset; - ctrl_user_bp_string = symb->name; - ctrl_user_bp_u64 = user_bp->u64; - } - } - - // rjf: push user breakpoint to list - { - CTRL_UserBreakpoint ctrl_user_bp = {ctrl_user_bp_kind}; - ctrl_user_bp.string = ctrl_user_bp_string; - ctrl_user_bp.pt = ctrl_user_bp_pt; - ctrl_user_bp.u64 = ctrl_user_bp_u64; - ctrl_user_bp.condition = condition; - ctrl_user_breakpoint_list_push(scratch.arena, &msg.user_bps, &ctrl_user_bp); - } - } - } + msg.user_bps = df_push_ctrl_user_breakpoints(scratch.arena); if(df_state->ctrl_solo_stepping_mode && !df_entity_is_nil(run_thread)) { msg.freeze_state_is_frozen = 0; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 7ba02bf4..07e42d08 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1563,6 +1563,9 @@ internal DF_Entity *df_log_from_entity(DF_Entity *entity); //////////////////////////////// //~ rjf: Target Controls +//- rjf: control user breakpoint gathering +internal CTRL_UserBreakpointList df_push_ctrl_user_breakpoints(Arena *arena); + //- rjf: control message dispatching internal void df_push_ctrl_msg(CTRL_Msg *msg); diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 9e4442c2..60701850 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -2,10 +2,12 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: Demon Pass Tasks +//~ rjf: Demon/Cleanup Pass Tasks // // [ ] TLS eval -> in-process-memory EXE info // [ ] unwinding -> in-process-memory EXE info +// [ ] "root" concept in hash store, which buckets keys & allows usage code to +// jettison a collection of keys in retained mode fashion // [x] solidify synchronization mechanisms for usage of demon layer // [x] TLS eval correctness // [x] freezing thread while running -> soft-halt From 83ecb4b86a2c811afd7cd19638f929e15d6611d5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 Mar 2024 17:27:54 -0700 Subject: [PATCH 209/275] ctrl thread stepping machine: read initial stack-pointer-check-value *before* single-stepping stuck threads, otherwise we can obtain an incorrect stack check value if the single-step causes a call. --- src/ctrl/ctrl_core.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 390c5a6e..9090a929 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -2861,6 +2861,15 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } } + ////////////////////////////// + //- rjf: read initial stack-pointer-check value + // + // This MUST happen before any threads move, including single-stepping stuck + // threads, because otherwise, their stack pointer may change, if single-stepping + // causes e.g. entrance into a function via a call instruction. + // + U64 sp_check_value = dmn_rsp_from_thread(target_thread); + ////////////////////////////// //- rjf: single step "stuck threads" // @@ -3011,7 +3020,6 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // if(stop_event == 0) { - U64 sp_check_value = dmn_rsp_from_thread(target_thread); B32 spoof_mode = 0; CTRL_Spoof spoof = {0}; for(;;) From e136a6753535a84504239894b738bff7779ca7f7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 11:00:00 -0700 Subject: [PATCH 210/275] demon/win32: correctly report exception repetitions for unhandled exception cases --- src/demon/win32/demon_core_win32.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index ab320c3d..297ddd7c 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -2144,6 +2144,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //- rjf: unhandled exception case default: { + e->exception_repeated = (edi->dwFirstChance == 0); dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); }break; } From aa85b2cdbbcda3bfd0455793d67ea2c938725c6c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 12:57:00 -0700 Subject: [PATCH 211/275] correctly pass unicode environments to launched child processes; also treat unicode command line arguments correctly --- src/demon/win32/demon_core_win32.c | 5 ++-- src/os/core/win32/os_core_win32.c | 38 +++++++++++++++--------------- src/raddbg/raddbg_main.cpp | 12 +++++++++- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index 297ddd7c..cb9ee117 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -1087,7 +1087,7 @@ dmn_init(void) // rjf: setup environment variables { - CHAR *this_proc_env = GetEnvironmentStrings(); + WCHAR *this_proc_env = GetEnvironmentStringsW(); U64 start_idx = 0; for(U64 idx = 0;; idx += 1) { @@ -1099,7 +1099,8 @@ dmn_init(void) } else { - String8 string = str8((U8 *)this_proc_env + start_idx, idx - start_idx); + String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); + String8 string = str8_from_16(dmn_w32_shared->arena, string16); str8_list_push(dmn_w32_shared->arena, &dmn_w32_shared->env_strings, string); start_idx = idx+1; } diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 32e6b094..87f2f154 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -217,7 +217,7 @@ os_init(void) // rjf: setup environment variables { - CHAR *this_proc_env = GetEnvironmentStrings(); + WCHAR *this_proc_env = GetEnvironmentStringsW(); U64 start_idx = 0; for(U64 idx = 0;; idx += 1) { @@ -229,7 +229,8 @@ os_init(void) } else { - String8 string = str8((U8 *)this_proc_env + start_idx, idx - start_idx); + String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); + String8 string = str8_from_16(w32_perm_arena, string16); str8_list_push(w32_perm_arena, &w32_environment, string); start_idx = idx+1; } @@ -1223,7 +1224,7 @@ os_launch_process(OS_LaunchOptions *options, OS_Handle *handle_out){ env16 = str16_from_8(scratch.arena, env); } - DWORD creation_flags = 0; + DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; if(options->consoleless) { creation_flags |= CREATE_NO_WINDOW; @@ -1760,36 +1761,35 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) #undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside #define OS_WINDOWS 1 -#if BUILD_CONSOLE_INTERFACE -int main(int argc, char **argv) +internal void +w32_entry_point_caller(int argc, WCHAR **wargv) { SetUnhandledExceptionFilter(&win32_exception_filter); + Arena *args_arena = arena_alloc__sized(MB(1), KB(32)); + char **argv = push_array(args_arena, char *, argc); for(int i = 0; i < argc; i += 1) { - String8 arg8 = str8_cstring(argv[i]); + String16 arg16 = str16_cstring((U16 *)wargv[i]); + String8 arg8 = str8_from_16(args_arena, arg16); if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive)) { win32_g_is_quiet = 1; } + argv[i] = (char *)arg8.str; } main_thread_base_entry_point(entry_point, argv, (U64)argc); +} + +#if BUILD_CONSOLE_INTERFACE +int wmain(int argc, WCHAR **argv) +{ + w32_entry_point_caller(argc, argv); return 0; } #else -int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) +int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) { - SetUnhandledExceptionFilter(&win32_exception_filter); - char **argv = __argv; - int argc = __argc; - for(int i = 0; i < argc; i += 1) - { - String8 arg8 = str8_cstring(argv[i]); - if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive)) - { - win32_g_is_quiet = 1; - } - } - main_thread_base_entry_point(entry_point, argv, (U64)argc); + w32_entry_point_caller(__argc, __wargv); return 0; } #endif diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 888aea56..cac25614 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -205,11 +205,21 @@ entry_point(CmdLine *cmd_line) str8_list_push(scratch.arena, &passthrough_args_list, n->string); } + // rjf: get current path + String8 current_path = os_string_from_system_path(scratch.arena, OS_SystemPath_Current); + // rjf: equip exe if(args.first->string.size != 0) { + String8 exe_name = args.first->string; DF_Entity *exe = df_entity_alloc(0, target, DF_EntityKind_Executable); - df_entity_equip_name(0, exe, args.first->string); + PathStyle style = path_style_from_str8(exe_name); + if(style == PathStyle_Relative) + { + exe_name = push_str8f(scratch.arena, "%S/%S", current_path, exe_name); + exe_name = path_normalized_from_string(scratch.arena, exe_name); + } + df_entity_equip_name(0, exe, exe_name); } // rjf: equip path From 23c1ea0e6817181fe152b425ce59efb6aa2846db Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 13:02:17 -0700 Subject: [PATCH 212/275] ui: if only one view scroll axis is specified on a box, always use scroll info to fill it, regardless of which axis that scroll took place on --- src/ui/ui_core.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 714ce9ef..80cffce5 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2523,10 +2523,18 @@ ui_signal_from_box(UI_Box *box) } if(!(box->flags & UI_BoxFlag_ViewScrollX)) { + if(delta.y == 0) + { + delta.y = delta.x; + } delta.x = 0; } if(!(box->flags & UI_BoxFlag_ViewScrollY)) { + if(delta.x == 0) + { + delta.x = delta.y; + } delta.y = 0; } os_eat_event(ui_state->events, evt); From e5df25b31472abaeb6b0610d7e00e9ce773fd511 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 13:24:00 -0700 Subject: [PATCH 213/275] use stderr-based fatal crash reporting, rather than windows gui, with programs built as console interfaces rather than guis --- src/os/core/win32/os_core_win32.c | 13 +++++++++++-- src/raddbgi_dump/raddbgi_dump_main.c | 2 +- src/raddbgi_from_pdb/raddbgi_from_pdb_main.c | 2 +- src/scratch/ryan_scratch.c | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 87f2f154..9ee8c18f 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1648,7 +1648,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) if(!raddbg_pdb_valid) { buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, - L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get call stack.\n"); + L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\n"); } else { @@ -1696,9 +1696,13 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) if(idx==0) { +#if BUILD_CONSOLE_INTERFACE + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); +#else buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, - L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue in\n" + L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); +#endif buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); } @@ -1745,6 +1749,10 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); +#if BUILD_CONSOLE_INTERFACE + fwprintf(stderr, L"\n--- Fatal Exception ---\n"); + fwprintf(stderr, L"%s\n\n", buffer); +#else TASKDIALOGCONFIG dialog = {0}; dialog.cbSize = sizeof(dialog); dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; @@ -1754,6 +1762,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) dialog.pszContent = buffer; dialog.pfCallback = &win32_dialog_callback; TaskDialogIndirect(&dialog, 0, 0, 0); +#endif ExitProcess(1); } diff --git a/src/raddbgi_dump/raddbgi_dump_main.c b/src/raddbgi_dump/raddbgi_dump_main.c index 9374c49f..6120be19 100644 --- a/src/raddbgi_dump/raddbgi_dump_main.c +++ b/src/raddbgi_dump/raddbgi_dump_main.c @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 8 +#define BUILD_VERSION_PATCH 9 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "raddbgi_dump" #define BUILD_CONSOLE_INTERFACE 1 diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c index f553a268..bc0ef474 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb_main.c @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 8 +#define BUILD_VERSION_PATCH 9 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "raddbgi_from_pdb" #define BUILD_CONSOLE_INTERFACE 1 diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 6616ce90..01d1f5c3 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 8 +#define BUILD_VERSION_PATCH 9 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "ryan_scratch" #define BUILD_CONSOLE_INTERFACE 1 From 1c3792a3dabe0e1bccd8740a3b0639e5d1286cbc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 13:34:43 -0700 Subject: [PATCH 214/275] tighten architecture-specific path for unwinder --- src/ctrl/ctrl_core.c | 128 ++++++++++++++++++++++--------------------- src/raddbg/raddbg.h | 4 ++ 2 files changed, 70 insertions(+), 62 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 9090a929..ef1f9755 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1437,75 +1437,79 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma //- rjf: loop & unwind UNW_MemView memview = stack_memview; - if(regs_block_good && stack_memview_good) switch(arch) + if(regs_block_good && stack_memview_good) { - default:{}break; - case Architecture_x64: + unwind.error = 0; + for(;;) { - unwind.error = 0; - for(;;) + // rjf: regs -> rip*module + U64 rip = regs_rip_from_arch_block(arch, regs_block); + DMN_Handle module = {0}; + String8 module_name = {0}; + Rng1U64 module_vaddr_range = {0}; + for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next) { - // rjf: regs -> rip*module - U64 rip = regs_rip_from_arch_block(arch, regs_block); - DMN_Handle module = {0}; - String8 module_name = {0}; - Rng1U64 module_vaddr_range = {0}; - for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next) - { - if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, rip)) - { - module = m->handle; - module_name = m->string; - module_vaddr_range = m->vaddr_range; - break; - } - } - - // rjf: cancel on 0 rip - if(rip == 0) - { - break; - } - - // rjf: module -> all the binary info - String8 binary_full_path = module_name; - DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_full_path, 0); - String8 binary_data = str8((U8 *)dbgi->exe_base, dbgi->exe_props.size); - - // rjf: cancel on bad data - if(binary_data.size == 0) - { - unwind.error = 1; - break; - } - - // rjf: valid step -> push frame - CTRL_UnwindFrame *frame = push_array(arena, CTRL_UnwindFrame, 1); - frame->rip = rip; - frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); - MemoryCopy(frame->regs, regs_block, arch_reg_block_size); - DLLPushBack(unwind.first, unwind.last, frame); - unwind.count += 1; - - // rjf: unwind one step - UNW_Result unwind_step = unw_pe_x64(binary_data, &dbgi->pe, module_vaddr_range.min, &memview, (UNW_X64_Regs *)regs_block); - - // rjf: cancel on bad step - if(unwind_step.dead != 0) - { - break; - } - if(unwind_step.missed_read != 0) - { - unwind.error = 1; - break; - } - if(unwind_step.stack_pointer == 0) + if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, rip)) { + module = m->handle; + module_name = m->string; + module_vaddr_range = m->vaddr_range; break; } } - }break; + + // rjf: cancel on 0 rip + if(rip == 0) + { + break; + } + + // rjf: module -> all the binary info + String8 binary_full_path = module_name; + DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_full_path, 0); + String8 binary_data = str8((U8 *)dbgi->exe_base, dbgi->exe_props.size); + + // rjf: cancel on bad data + if(binary_data.size == 0) + { + unwind.error = 1; + break; + } + + // rjf: valid step -> push frame + CTRL_UnwindFrame *frame = push_array(arena, CTRL_UnwindFrame, 1); + frame->rip = rip; + frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); + MemoryCopy(frame->regs, regs_block, arch_reg_block_size); + DLLPushBack(unwind.first, unwind.last, frame); + unwind.count += 1; + + // rjf: unwind one step + UNW_Result unwind_step = {0}; + switch(arch) + { + default:{unwind_step.dead = 1;}break; + case Architecture_x64: + { + unwind_step = unw_pe_x64(binary_data, &dbgi->pe, module_vaddr_range.min, &memview, (UNW_X64_Regs *)regs_block); + }break; + } + + // rjf: cancel on bad step + if(unwind_step.dead != 0) + { + break; + } + if(unwind_step.missed_read != 0) + { + unwind.error = 1; + break; + } + if(unwind_step.stack_pointer == 0) + { + break; + } + } } dbgi_scope_close(scope); diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 60701850..0c9da33d 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -15,6 +15,10 @@ //////////////////////////////// //~ rjf: Frontend/UI Pass Tasks // +// [ ] n-row table selection, in watch window & other UIs, multi-selection +// ctrl+C +// [ ] UI_NavActions, OS_Event -> UI_Event (single event stream) +// // [ ] committing needs to happen when navigating focus away for any reason // [ ] better discoverability for view rules - have better help hover tooltip, // info on arguments, and better autocomplete lister From 55146b547b6bb405cab5395707547074761dd554 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 14:42:54 -0700 Subject: [PATCH 215/275] reading & organization pass over unwinding layer; deduplicate PE info with PE layer, move dwarf info to in-progress dwarf layer --- src/ctrl/ctrl_core.c | 4 +- src/raddbgi_from_dwarf/raddbgi_dwarf.h | 161 +++++ src/unwind/unwind.c | 886 +++++++++++++------------ src/unwind/unwind.h | 312 +-------- 4 files changed, 645 insertions(+), 718 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index ef1f9755..bea4d853 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1485,13 +1485,13 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma unwind.count += 1; // rjf: unwind one step - UNW_Result unwind_step = {0}; + UNW_Step unwind_step = {0}; switch(arch) { default:{unwind_step.dead = 1;}break; case Architecture_x64: { - unwind_step = unw_pe_x64(binary_data, &dbgi->pe, module_vaddr_range.min, &memview, (UNW_X64_Regs *)regs_block); + unwind_step = unw_unwind_pe_x64(binary_data, &dbgi->pe, module_vaddr_range.min, &memview, (REGS_RegBlockX64 *)regs_block); }break; } diff --git a/src/raddbgi_from_dwarf/raddbgi_dwarf.h b/src/raddbgi_from_dwarf/raddbgi_dwarf.h index ca868988..186f0486 100644 --- a/src/raddbgi_from_dwarf/raddbgi_dwarf.h +++ b/src/raddbgi_from_dwarf/raddbgi_dwarf.h @@ -1260,6 +1260,167 @@ if (success__) \ (x) = dwarf_leb128_decode(T,first__, (p)); \ }while(0) + +//////////////////////////////// +//~ allen: ELF/DW Unwind Types +// +// TODO(rjf): OLD TYPES FROM UNWINDER CODE. bucketing this here, and deferring dwarf-based +// unwinding info to future DWARF/linux work. +// +#if 0 + +// * applies to (any X: unwind(ELF/DW, X)) + +// EH: Exception Frames +typedef U8 UNW_DW_EhPtrEnc; +enum{ + UNW_DW_EhPtrEnc_TYPE_MASK = 0x0F, + UNW_DW_EhPtrEnc_PTR = 0x00, // Pointer sized unsigned value + UNW_DW_EhPtrEnc_ULEB128 = 0x01, // Unsigned LE base-128 value + UNW_DW_EhPtrEnc_UDATA2 = 0x02, // Unsigned 16-bit value + UNW_DW_EhPtrEnc_UDATA4 = 0x03, // Unsigned 32-bit value + UNW_DW_EhPtrEnc_UDATA8 = 0x04, // Unsigned 64-bit value + UNW_DW_EhPtrEnc_SIGNED = 0x08, // Signed pointer + UNW_DW_EhPtrEnc_SLEB128 = 0x09, // Signed LE base-128 value + UNW_DW_EhPtrEnc_SDATA2 = 0x0A, // Signed 16-bit value + UNW_DW_EhPtrEnc_SDATA4 = 0x0B, // Signed 32-bit value + UNW_DW_EhPtrEnc_SDATA8 = 0x0C, // Signed 64-bit value +}; +enum{ + UNW_DW_EhPtrEnc_MODIF_MASK = 0x70, + UNW_DW_EhPtrEnc_PCREL = 0x10, // Value is relative to the current program counter. + UNW_DW_EhPtrEnc_TEXTREL = 0x20, // Value is relative to the .text section. + UNW_DW_EhPtrEnc_DATAREL = 0x30, // Value is relative to the .got or .eh_frame_hdr section. + UNW_DW_EhPtrEnc_FUNCREL = 0x40, // Value is relative to the function. + UNW_DW_EhPtrEnc_ALIGNED = 0x50, // Value is aligned to an address unit sized boundary. +}; +enum{ + UNW_DW_EhPtrEnc_INDIRECT = 0x80, // This flag indicates that value is stored in virtual memory. + UNW_DW_EhPtrEnc_OMIT = 0xFF, +}; + +typedef struct UNW_DW_EhPtrCtx{ + U64 raw_base_vaddr; // address where pointer is being read + U64 text_vaddr; // base address of section with instructions (used for encoding pointer on SH and IA64) + U64 data_vaddr; // base address of data section (used for encoding pointer on x86-64) + U64 func_vaddr; // base address of function where IP is located +} UNW_DW_EhPtrCtx; + +// CIE: Common Information Entry +typedef struct UNW_DW_CIEUnpacked{ + U8 version; + UNW_DW_EhPtrEnc lsda_encoding; + UNW_DW_EhPtrEnc addr_encoding; + + B8 has_augmentation_size; + U64 augmentation_size; + String8 augmentation; + + U64 code_align_factor; + S64 data_align_factor; + U64 ret_addr_reg; + + U64 handler_ip; + + U64 cfi_range_min; + U64 cfi_range_max; +} UNW_DW_CIEUnpacked; + +typedef struct UNW_DW_CIEUnpackedNode{ + struct UNW_DW_CIEUnpackedNode *next; + UNW_DW_CIEUnpacked cie; + U64 offset; +} UNW_DW_CIEUnpackedNode; + +// FDE: Frame Description Entry +typedef struct UNW_DW_FDEUnpacked{ + U64 ip_voff_min; + U64 ip_voff_max; + U64 lsda_ip; + + U64 cfi_range_min; + U64 cfi_range_max; +} UNW_DW_FDEUnpacked; + +// CFI: Call Frame Information +typedef struct UNW_DW_CFIRecords{ + B32 valid; + UNW_DW_CIEUnpacked cie; + UNW_DW_FDEUnpacked fde; +} UNW_DW_CFIRecords; + +typedef enum UNW_DW_CFICFARule{ + UNW_DW_CFICFARule_REGOFF, + UNW_DW_CFICFARule_EXPR, +} UNW_DW_CFICFARule; + +typedef struct UNW_DW_CFICFACell{ + UNW_DW_CFICFARule rule; + union{ + struct{ + U64 reg_idx; + S64 offset; + }; + U64 expr_min; + U64 expr_max; + }; +} UNW_DW_CFICFACell; + +typedef enum UNW_DW_CFIRegisterRule{ + UNW_DW_CFIRegisterRule_SAME_VALUE, + UNW_DW_CFIRegisterRule_UNDEFINED, + UNW_DW_CFIRegisterRule_OFFSET, + UNW_DW_CFIRegisterRule_VAL_OFFSET, + UNW_DW_CFIRegisterRule_REGISTER, + UNW_DW_CFIRegisterRule_EXPRESSION, + UNW_DW_CFIRegisterRule_VAL_EXPRESSION, +} UNW_DW_CFIRegisterRule; + +typedef struct UNW_DW_CFICell{ + UNW_DW_CFIRegisterRule rule; + union{ + S64 n; + struct{ + U64 expr_min; + U64 expr_max; + }; + }; +} UNW_DW_CFICell; + +typedef struct UNW_DW_CFIRow{ + struct UNW_DW_CFIRow *next; + UNW_DW_CFICell *cells; + UNW_DW_CFICFACell cfa_cell; +} UNW_DW_CFIRow; + +typedef struct UNW_DW_CFIMachine{ + U64 cells_per_row; + UNW_DW_CIEUnpacked *cie; + UNW_DW_EhPtrCtx *ptr_ctx; + UNW_DW_CFIRow *initial_row; + U64 fde_ip; +} UNW_DW_CFIMachine; + +typedef U8 UNW_DW_CFADecode; +enum{ + UNW_DW_CFADecode_NOP = 0x0, + // 1,2,4,8 reserved for literal byte sizes + UNW_DW_CFADecode_ADDRESS = 0x9, + UNW_DW_CFADecode_ULEB128 = 0xA, + UNW_DW_CFADecode_SLEB128 = 0xB, +}; + +typedef U16 UNW_DW_CFAControlBits; +enum{ + UNW_DW_CFAControlBits_DEC1_MASK = 0x00F, + UNW_DW_CFAControlBits_DEC2_MASK = 0x0F0, + UNW_DW_CFAControlBits_IS_REG_0 = 0x100, + UNW_DW_CFAControlBits_IS_REG_1 = 0x200, + UNW_DW_CFAControlBits_IS_REG_2 = 0x400, + UNW_DW_CFAControlBits_NEW_ROW = 0x800, +}; +#endif + //////////////////////////////// //~ Dwarf Parser Functions diff --git a/src/unwind/unwind.c b/src/unwind/unwind.c index 85704be8..51c65f53 100644 --- a/src/unwind/unwind.c +++ b/src/unwind/unwind.c @@ -2,401 +2,39 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ allen: Unwind Functions - -//- mem view construction +//~ rjf: Memory View Helpers internal UNW_MemView -unw_memview_from_data(String8 data, U64 base_vaddr){ +unw_memview_from_data(String8 data, U64 base_vaddr) +{ UNW_MemView result = {0}; result.data = data.str; result.addr_first = base_vaddr; result.addr_opl = base_vaddr + data.size; - return(result); + return result; } -//- mem view user face for unwind users - internal B32 -unw_memview_read(UNW_MemView *memview, U64 addr, U64 size, void *out){ +unw_memview_read(UNW_MemView *memview, U64 addr, U64 size, void *out) +{ B32 result = 0; - if (memview->addr_first <= addr && addr + size <= memview->addr_opl){ + if(memview->addr_first <= addr && addr + size <= memview->addr_opl) + { MemoryCopy(out, (U8*)memview->data + addr - memview->addr_first, size); result = 1; } - return(result); + return result; } - //////////////////////////////// -//~ allen: PE X64 Unwind Functions +//~ rjf: PE/X64 Unwind Implementation -//- main interface +//- rjf: helpers -internal UNW_Result -unw_pe_x64(String8 bindata, PE_BinInfo *bin, - U64 base_vaddr, UNW_MemView *memview, UNW_X64_Regs *regs){ - UNW_Result result = {0}; - U64 missed_read_addr = 0; - - //- grab ip_voff (several places can use this) - U64 ip_voff = regs->rip.u64 - base_vaddr; - - //- get pdata entry from current ip - PE_IntelPdata *initial_pdata = 0; - { - U64 initial_pdata_off = pe_intel_pdata_off_from_voff__binary_search(bindata, bin, ip_voff); - if (initial_pdata_off != 0){ - initial_pdata = (PE_IntelPdata*)(bindata.str + initial_pdata_off); - } - } - - //- no pdata; unwind by reading stack pointer - if (initial_pdata == 0){ - // read ip from stack pointer - U64 sp = regs->rsp.u64; - U64 new_ip = 0; - if (!unw_memview_read_struct(memview, sp, &new_ip)){ - missed_read_addr = sp; - goto error_out; - } - - // advance stack pointer - U64 new_sp = sp + 8; - - // commit registers - regs->rip.u64 = new_ip; - regs->rsp.u64 = new_sp; - } - - //- got pdata; perform unwinding with exception handling - else{ - // try epilog unwind - B32 did_epilog_unwind = 0; - if (unw_pe_x64__voff_is_in_epilog(bindata, bin, ip_voff, initial_pdata)){ - result = unw_pe_x64__epilog(bindata, bin, base_vaddr, memview, regs); - did_epilog_unwind = 1; - } - - // try xdata unwind - if (!did_epilog_unwind){ - B32 did_machframe = 0; - - // get frame reg - REGS_Reg64 *frame_reg = 0; - U64 frame_off = 0; - - { - U64 unwind_info_off = initial_pdata->voff_unwind_info; - UNW_PE_Info *unwind_info = (UNW_PE_Info*)(pe_ptr_from_voff(bindata, bin, unwind_info_off)); - - U32 frame_reg_id = UNW_PE_INFO_REG_FROM_FRAME(unwind_info->frame); - U64 frame_off_val = UNW_PE_INFO_OFF_FROM_FRAME(unwind_info->frame); - - if (frame_reg_id != 0){ - frame_reg = unw_pe_x64__gpr_reg(regs, frame_reg_id); - // TODO(allen): at this point if frame_reg is zero, the exe is corrupted. - } - frame_off = frame_off_val; - } - - PE_IntelPdata *last_pdata = 0; - PE_IntelPdata *pdata = initial_pdata; - for (;pdata != last_pdata;){ - //- get unwind info & codes - U64 unwind_info_off = pdata->voff_unwind_info; - UNW_PE_Info *unwind_info = (UNW_PE_Info*)(pe_ptr_from_voff(bindata, bin, unwind_info_off)); - UNW_PE_Code *unwind_codes = (UNW_PE_Code*)(unwind_info + 1); - - //- get frame base - U64 frame_base = regs->rsp.u64; - if (frame_reg != 0){ - U64 raw_frame_base = frame_reg->u64; - U64 adjusted_frame_base = raw_frame_base - frame_off*16; - if (adjusted_frame_base < raw_frame_base){ - frame_base = adjusted_frame_base; - } - else{ - frame_base = 0; - } - } - - //- rjf: bad unwind info -> abort - if(unwind_info == 0) - { - result.dead = 1; - goto error_out; - } - - //- op code interpreter - UNW_PE_Code *code_ptr = unwind_codes; - UNW_PE_Code *code_opl = unwind_codes + unwind_info->codes_num; - for (UNW_PE_Code *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr){ - // extract op code parts - U32 op_code = UNW_PE_CODE_FROM_FLAGS(code_ptr->flags); - U32 op_info = UNW_PE_INFO_FROM_FLAGS(code_ptr->flags); - - // determine number of op code slots - U32 slot_count = unw_pe_x64__slot_count_from_op_code(op_code); - if (op_code == UNW_PE_OpCode_ALLOC_LARGE && op_info == 1){ - slot_count += 1; - } - - // check op code slot count - if (slot_count == 0 || code_ptr + slot_count > code_opl){ - result.dead = 1; - goto end_xdata_unwind; - } - - // set next op code pointer - next_code_ptr = code_ptr + slot_count; - - // interpret this op code - U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog; - if (code_voff <= ip_voff){ - switch (op_code){ - case UNW_PE_OpCode_PUSH_NONVOL: - { - // read value from stack pointer - U64 sp = regs->rsp.u64; - U64 value = 0; - if (!unw_memview_read_struct(memview, sp, &value)){ - missed_read_addr = sp; - goto error_out; - } - - // advance stack pointer - U64 new_sp = sp + 8; - - // commit registers - REGS_Reg64 *reg = unw_pe_x64__gpr_reg(regs, op_info); - reg->u64 = value; - regs->rsp.u64 = new_sp; - }break; - - case UNW_PE_OpCode_ALLOC_LARGE: - { - // read alloc size - U64 size = 0; - if (op_info == 0){ - size = code_ptr[1].u16*8; - } - else if (op_info == 1){ - size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - } - else{ - result.dead = 1; - goto end_xdata_unwind; - } - - // advance stack pointer - U64 sp = regs->rsp.u64; - U64 new_sp = sp + size; - - // advance stack pointer - regs->rsp.u64 = new_sp; - }break; - - case UNW_PE_OpCode_ALLOC_SMALL: - { - // advance stack pointer - regs->rsp.u64 += op_info*8 + 8; - }break; - - case UNW_PE_OpCode_SET_FPREG: - { - // put stack pointer back to the frame base - regs->rsp.u64 = frame_base; - }break; - - case UNW_PE_OpCode_SAVE_NONVOL: - { - // read value from frame base - U64 off = code_ptr[1].u16*8; - U64 addr = frame_base + off; - U64 value = 0; - if (!unw_memview_read_struct(memview, addr, &value)){ - missed_read_addr = addr; - goto error_out; - } - - // commit to register - REGS_Reg64 *reg = unw_pe_x64__gpr_reg(regs, op_info); - reg->u64 = value; - }break; - - case UNW_PE_OpCode_SAVE_NONVOL_FAR: - { - // read value from frame base - U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - U64 addr = frame_base + off; - U64 value = 0; - if (!unw_memview_read_struct(memview, addr, &value)){ - missed_read_addr = addr; - goto error_out; - } - - // commit to register - REGS_Reg64 *reg = unw_pe_x64__gpr_reg(regs, op_info); - reg->u64 = value; - }break; - - case UNW_PE_OpCode_EPILOG: - { - result.dead = 1; - }break; - - case UNW_PE_OpCode_SPARE_CODE: - { - result.dead = 1; - // Assert(!"Hit me!"); - // TODO(allen): ??? - }break; - - case UNW_PE_OpCode_SAVE_XMM128: - { - // read new register values - U8 buf[16]; - U64 off = code_ptr[1].u16*16; - U64 addr = frame_base + off; - if (!unw_memview_read(memview, addr, 16, buf)){ - missed_read_addr = addr; - goto error_out; - } - - // commit to register - void *xmm_reg = (®s->ymm0) + op_info; - MemoryCopy(xmm_reg, buf, sizeof(buf)); - }break; - - case UNW_PE_OpCode_SAVE_XMM128_FAR: - { - // read new register values - U8 buf[16]; - U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - U64 addr = frame_base + off; - if (!unw_memview_read(memview, addr, 16, buf)){ - missed_read_addr = addr; - goto error_out; - } - - // commit to register - void *xmm_reg = (®s->ymm0) + op_info; - MemoryCopy(xmm_reg, buf, sizeof(buf)); - }break; - - case UNW_PE_OpCode_PUSH_MACHFRAME: - { - // NOTE(rjf): this was found by stepping through kernel code after an exception was - // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main - - if (op_info > 1){ - result.dead = 1; - goto end_xdata_unwind; - } - - // read values - U64 sp_og = regs->rsp.u64; - U64 sp_adj = sp_og; - if (op_info == 1){ - sp_adj += 8; - } - - U64 ip_value = 0; - if (!unw_memview_read_struct(memview, sp_adj, &ip_value)){ - missed_read_addr = sp_adj; - goto error_out; - } - - U64 sp_after_ip = sp_adj + 8; - U16 ss_value = 0; - if (!unw_memview_read_struct(memview, sp_after_ip, &ss_value)){ - missed_read_addr = sp_after_ip; - goto error_out; - } - - U64 sp_after_ss = sp_after_ip + 8; - U64 rflags_value = 0; - if (!unw_memview_read_struct(memview, sp_after_ss, &rflags_value)){ - missed_read_addr = sp_after_ss; - goto error_out; - } - - U64 sp_after_rflags = sp_after_ss + 8; - U64 sp_value = 0; - if (!unw_memview_read_struct(memview, sp_after_rflags, &sp_value)){ - missed_read_addr = sp_after_rflags; - goto error_out; - } - - // commit registers - regs->rip.u64 = ip_value; - regs->ss.u16 = ss_value; - regs->rflags.u64 = rflags_value; - regs->rsp.u64 = sp_value; - - // mark machine frame - did_machframe = 1; - }break; - } - } - } - - //- iterate pdata chain - U32 flags = UNW_PE_INFO_FLAGS_FROM_HDR(unwind_info->header); - if (!(flags & UNW_PE_InfoFlag_CHAINED)){ - break; - } - - U64 code_count_rounded = AlignPow2(unwind_info->codes_num, 2); - U64 code_size = code_count_rounded*sizeof(UNW_PE_OpCode); - U64 chained_pdata_off = unwind_info_off + sizeof(UNW_PE_Info) + code_size; - - last_pdata = pdata; - pdata = (PE_IntelPdata*)pe_ptr_from_voff(bindata, bin, chained_pdata_off); - } - - if (!did_machframe){ - U64 sp = regs->rsp.u64; - U64 new_ip = 0; - if (!unw_memview_read_struct(memview, sp, &new_ip)){ - missed_read_addr = sp; - goto error_out; - } - - // advance stack pointer - U64 new_sp = sp + 8; - - // commit registers - regs->rip.u64 = new_ip; - regs->rsp.u64 = new_sp; - } - - end_xdata_unwind:; - } - } - - error_out:; - - if (missed_read_addr != 0){ - result.dead = 1; - result.missed_read = 1; - result.missed_read_addr = missed_read_addr; - } - - if (!result.dead){ - result.stack_pointer = regs->rsp.u64; - } - - return(result); -} - -//- pe x64 helpers - -internal UNW_Result -unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, - U64 base_vaddr, UNW_MemView*memview, UNW_X64_Regs *regs){ - UNW_Result result = {0}; +internal UNW_Step +unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, U64 base_vaddr, UNW_MemView*memview, REGS_RegBlockX64 *regs) +{ + UNW_Step result = {0}; U64 missed_read_addr = 0; //- setup parsing context @@ -412,27 +50,32 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, //- parsing loop - for (;keep_parsing;){ + for(;keep_parsing;) + { keep_parsing = 0; U8 inst_byte = 0; - if (off + sizeof(inst_byte) <= inst_size){ + if(off + sizeof(inst_byte) <= inst_size) + { void *ptr = (U8*)inst_base + off; MemoryCopy(&inst_byte, ptr, sizeof(inst_byte)); } off += 1; U8 rex = 0; - if ((inst_byte & 0xF0) == 0x40){ + if((inst_byte & 0xF0) == 0x40) + { rex = inst_byte & 0xF; // rex prefix - if (off + sizeof(inst_base) <= inst_size){ + if(off + sizeof(inst_base) <= inst_size) + { void *ptr = (U8*)inst_base + off; MemoryCopy(&inst_byte, ptr, sizeof(inst_byte)); } off += 1; } - switch (inst_byte){ + switch(inst_byte) + { // pop case 0x58: case 0x59: @@ -445,13 +88,14 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, { U64 sp = regs->rsp.u64; U64 value = 0; - if (!unw_memview_read_struct(memview, sp, &value)){ + if(!unw_memview_read_struct(memview, sp, &value)) + { missed_read_addr = sp; goto error_out; } // modify register - UNW_PE_X64_GprReg gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; + PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; REGS_Reg64 *reg = unw_pe_x64__gpr_reg(regs, gpr_reg); // not a final instruction @@ -470,7 +114,8 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, // read the 4-byte immediate S32 imm = 0; - if (off + sizeof(imm) < inst_size){ + if(off + sizeof(imm) < inst_size) + { void *ptr = (U8*)inst_base + off; MemoryCopy(&imm, ptr, sizeof(imm)); } @@ -491,7 +136,8 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, // read the 1-byte immediate S8 imm = 0; - if (off + sizeof(imm) < inst_size){ + if(off + sizeof(imm) < inst_size) + { void *ptr = (U8*)inst_base + off; MemoryCopy(&imm, ptr, sizeof(imm)); } @@ -507,11 +153,12 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, { // read source register U8 modrm = 0; - if (off + sizeof(modrm) < inst_size){ + if(off + sizeof(modrm) < inst_size) + { void *ptr = (U8*)inst_base + off; MemoryCopy(&modrm, ptr, sizeof(modrm)); } - UNW_PE_X64_GprReg gpr_reg = (modrm & 7) + (rex & 1)*8; + PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; REGS_Reg64 *reg = unw_pe_x64__gpr_reg(regs, gpr_reg); U64 reg_value = reg->u64; @@ -520,9 +167,11 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, S32 imm = 0; // read 1-byte immediate - if ((modrm >> 6) == 1){ + if((modrm >> 6) == 1) + { S8 imm8 = 0; - if (off + sizeof(imm8) < inst_size){ + if(off + sizeof(imm8) < inst_size) + { void *ptr = (U8*)inst_base + off; MemoryCopy(&imm8, ptr, sizeof(imm8)); } @@ -531,8 +180,10 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, } // read 4-byte immediate - else{ - if (off + sizeof(imm) < inst_size){ + else + { + if(off + sizeof(imm) < inst_size) + { void *ptr = (U8*)inst_base + off; MemoryCopy(&imm, ptr, sizeof(imm)); } @@ -549,14 +200,16 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, // read new ip U64 sp = regs->rsp.u64; U64 new_ip = 0; - if (!unw_memview_read_struct(memview, sp, &new_ip)){ + if(!unw_memview_read_struct(memview, sp, &new_ip)) + { missed_read_addr = sp; goto error_out; } // read 2-byte immediate & advance stack pointer U16 imm = 0; - if (off + sizeof(imm) < inst_size){ + if(off + sizeof(imm) < inst_size) + { void *ptr = (U8*)inst_base + off; MemoryCopy(&imm, ptr, sizeof(imm)); } @@ -577,7 +230,8 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, // read new ip U64 sp = regs->rsp.u64; U64 new_ip = 0; - if (!unw_memview_read_struct(memview, sp, &new_ip)){ + if(!unw_memview_read_struct(memview, sp, &new_ip)) + { missed_read_addr = sp; goto error_out; } @@ -611,7 +265,8 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, error_out:; - if (missed_read_addr != 0){ + if(missed_read_addr != 0) + { result.dead = 1; result.missed_read = 1; result.missed_read_addr = missed_read_addr; @@ -620,28 +275,9 @@ unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, return(result); } -internal U32 -unw_pe_x64__slot_count_from_op_code(UNW_PE_OpCode opcode){ - U32 result = 0; - switch (opcode){ - case UNW_PE_OpCode_PUSH_NONVOL: result = 1; break; - case UNW_PE_OpCode_ALLOC_LARGE: result = 2; break; - case UNW_PE_OpCode_ALLOC_SMALL: result = 1; break; - case UNW_PE_OpCode_SET_FPREG: result = 1; break; - case UNW_PE_OpCode_SAVE_NONVOL: result = 2; break; - case UNW_PE_OpCode_SAVE_NONVOL_FAR: result = 3; break; - case UNW_PE_OpCode_EPILOG: result = 2; break; - case UNW_PE_OpCode_SPARE_CODE: result = 3; break; - case UNW_PE_OpCode_SAVE_XMM128: result = 2; break; - case UNW_PE_OpCode_SAVE_XMM128_FAR: result = 3; break; - case UNW_PE_OpCode_PUSH_MACHFRAME: result = 1; break; - } - return(result); -} - internal B32 -unw_pe_x64__voff_is_in_epilog(String8 bindata, PE_BinInfo *bin, - U64 voff, PE_IntelPdata *final_pdata){ +unw_pe_x64__voff_is_in_epilog(String8 bindata, PE_BinInfo *bin, U64 voff, PE_IntelPdata *final_pdata) +{ // NOTE(allen): There are restrictions placed on how an epilog is allowed // to be formed (https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-160) // Here we interpret machine code directly according to the rules @@ -815,27 +451,409 @@ unw_pe_x64__voff_is_in_epilog(String8 bindata, PE_BinInfo *bin, } internal REGS_Reg64* -unw_pe_x64__gpr_reg(UNW_X64_Regs *regs, UNW_PE_X64_GprReg unw_reg){ +unw_pe_x64__gpr_reg(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 unw_reg){ static REGS_Reg64 dummy = {0}; REGS_Reg64 *result = &dummy; switch (unw_reg){ - case UNW_PE_X64_GprReg_RAX: result = ®s->rax; break; - case UNW_PE_X64_GprReg_RCX: result = ®s->rcx; break; - case UNW_PE_X64_GprReg_RDX: result = ®s->rdx; break; - case UNW_PE_X64_GprReg_RBX: result = ®s->rbx; break; - case UNW_PE_X64_GprReg_RSP: result = ®s->rsp; break; - case UNW_PE_X64_GprReg_RBP: result = ®s->rbp; break; - case UNW_PE_X64_GprReg_RSI: result = ®s->rsi; break; - case UNW_PE_X64_GprReg_RDI: result = ®s->rdi; break; - case UNW_PE_X64_GprReg_R8 : result = ®s->r8 ; break; - case UNW_PE_X64_GprReg_R9 : result = ®s->r9 ; break; - case UNW_PE_X64_GprReg_R10: result = ®s->r10; break; - case UNW_PE_X64_GprReg_R11: result = ®s->r11; break; - case UNW_PE_X64_GprReg_R12: result = ®s->r12; break; - case UNW_PE_X64_GprReg_R13: result = ®s->r13; break; - case UNW_PE_X64_GprReg_R14: result = ®s->r14; break; - case UNW_PE_X64_GprReg_R15: result = ®s->r15; break; + case PE_UnwindGprRegX64_RAX: result = ®s->rax; break; + case PE_UnwindGprRegX64_RCX: result = ®s->rcx; break; + case PE_UnwindGprRegX64_RDX: result = ®s->rdx; break; + case PE_UnwindGprRegX64_RBX: result = ®s->rbx; break; + case PE_UnwindGprRegX64_RSP: result = ®s->rsp; break; + case PE_UnwindGprRegX64_RBP: result = ®s->rbp; break; + case PE_UnwindGprRegX64_RSI: result = ®s->rsi; break; + case PE_UnwindGprRegX64_RDI: result = ®s->rdi; break; + case PE_UnwindGprRegX64_R8 : result = ®s->r8 ; break; + case PE_UnwindGprRegX64_R9 : result = ®s->r9 ; break; + case PE_UnwindGprRegX64_R10: result = ®s->r10; break; + case PE_UnwindGprRegX64_R11: result = ®s->r11; break; + case PE_UnwindGprRegX64_R12: result = ®s->r12; break; + case PE_UnwindGprRegX64_R13: result = ®s->r13; break; + case PE_UnwindGprRegX64_R14: result = ®s->r14; break; + case PE_UnwindGprRegX64_R15: result = ®s->r15; break; } return(result); } +//- rjf: unwind step + +internal UNW_Step +unw_unwind_pe_x64(String8 bindata, PE_BinInfo *bin, U64 base_vaddr, UNW_MemView *memview, REGS_RegBlockX64 *regs) +{ + UNW_Step result = {0}; + U64 missed_read_addr = 0; + + //- grab ip_voff (several places can use this) + U64 ip_voff = regs->rip.u64 - base_vaddr; + + //- get pdata entry from current ip + PE_IntelPdata *initial_pdata = 0; + { + U64 initial_pdata_off = pe_intel_pdata_off_from_voff__binary_search(bindata, bin, ip_voff); + if(initial_pdata_off != 0) + { + initial_pdata = (PE_IntelPdata*)(bindata.str + initial_pdata_off); + } + } + + //- no pdata; unwind by reading stack pointer + if(initial_pdata == 0) + { + // read ip from stack pointer + U64 sp = regs->rsp.u64; + U64 new_ip = 0; + if(!unw_memview_read_struct(memview, sp, &new_ip)) + { + missed_read_addr = sp; + goto error_out; + } + + // advance stack pointer + U64 new_sp = sp + 8; + + // commit registers + regs->rip.u64 = new_ip; + regs->rsp.u64 = new_sp; + } + + //- got pdata; perform unwinding with exception handling + else + { + // try epilog unwind + B32 did_epilog_unwind = 0; + if(unw_pe_x64__voff_is_in_epilog(bindata, bin, ip_voff, initial_pdata)) + { + result = unw_pe_x64__epilog(bindata, bin, base_vaddr, memview, regs); + did_epilog_unwind = 1; + } + + // try xdata unwind + if(!did_epilog_unwind) + { + B32 did_machframe = 0; + + // get frame reg + REGS_Reg64 *frame_reg = 0; + U64 frame_off = 0; + + { + U64 unwind_info_off = initial_pdata->voff_unwind_info; + PE_UnwindInfo *unwind_info = (PE_UnwindInfo*)(pe_ptr_from_voff(bindata, bin, unwind_info_off)); + + U32 frame_reg_id = PE_UNWIND_INFO_REG_FROM_FRAME(unwind_info->frame); + U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info->frame); + + if (frame_reg_id != 0){ + frame_reg = unw_pe_x64__gpr_reg(regs, frame_reg_id); + // TODO(allen): at this point if frame_reg is zero, the exe is corrupted. + } + frame_off = frame_off_val; + } + + PE_IntelPdata *last_pdata = 0; + PE_IntelPdata *pdata = initial_pdata; + for (;pdata != last_pdata;) + { + //- rjf: unpack unwind info & codes + U64 unwind_info_off = pdata->voff_unwind_info; + PE_UnwindInfo *unwind_info = (PE_UnwindInfo*)(pe_ptr_from_voff(bindata, bin, unwind_info_off)); + PE_UnwindCode *unwind_codes = (PE_UnwindCode*)(unwind_info + 1); + + //- rjf: unpack frame base + U64 frame_base = regs->rsp.u64; + if(frame_reg != 0) + { + U64 raw_frame_base = frame_reg->u64; + U64 adjusted_frame_base = raw_frame_base - frame_off*16; + if(adjusted_frame_base < raw_frame_base) + { + frame_base = adjusted_frame_base; + } + else + { + frame_base = 0; + } + } + + //- rjf: bad unwind info -> abort + if(unwind_info == 0) + { + result.dead = 1; + goto error_out; + } + + //- op code interpreter + PE_UnwindCode *code_ptr = unwind_codes; + PE_UnwindCode *code_opl = unwind_codes + unwind_info->codes_num; + for(PE_UnwindCode *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr) + { + // extract op code parts + U32 op_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr->flags); + U32 op_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr->flags); + + // determine number of op code slots + U32 slot_count = pe_slot_count_from_unwind_op_code(op_code); + if(op_code == PE_UnwindOpCode_ALLOC_LARGE && op_info == 1) + { + slot_count += 1; + } + + // check op code slot count + if (slot_count == 0 || code_ptr + slot_count > code_opl){ + result.dead = 1; + goto end_xdata_unwind; + } + + // set next op code pointer + next_code_ptr = code_ptr + slot_count; + + // interpret this op code + U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog; + if (code_voff <= ip_voff){ + switch (op_code){ + case PE_UnwindOpCode_PUSH_NONVOL: + { + // read value from stack pointer + U64 sp = regs->rsp.u64; + U64 value = 0; + if(!unw_memview_read_struct(memview, sp, &value)) + { + missed_read_addr = sp; + goto error_out; + } + + // advance stack pointer + U64 new_sp = sp + 8; + + // commit registers + REGS_Reg64 *reg = unw_pe_x64__gpr_reg(regs, op_info); + reg->u64 = value; + regs->rsp.u64 = new_sp; + }break; + + case PE_UnwindOpCode_ALLOC_LARGE: + { + // read alloc size + U64 size = 0; + if (op_info == 0){ + size = code_ptr[1].u16*8; + } + else if (op_info == 1){ + size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + } + else{ + result.dead = 1; + goto end_xdata_unwind; + } + + // advance stack pointer + U64 sp = regs->rsp.u64; + U64 new_sp = sp + size; + + // advance stack pointer + regs->rsp.u64 = new_sp; + }break; + + case PE_UnwindOpCode_ALLOC_SMALL: + { + // advance stack pointer + regs->rsp.u64 += op_info*8 + 8; + }break; + + case PE_UnwindOpCode_SET_FPREG: + { + // put stack pointer back to the frame base + regs->rsp.u64 = frame_base; + }break; + + case PE_UnwindOpCode_SAVE_NONVOL: + { + // read value from frame base + U64 off = code_ptr[1].u16*8; + U64 addr = frame_base + off; + U64 value = 0; + if (!unw_memview_read_struct(memview, addr, &value)){ + missed_read_addr = addr; + goto error_out; + } + + // commit to register + REGS_Reg64 *reg = unw_pe_x64__gpr_reg(regs, op_info); + reg->u64 = value; + }break; + + case PE_UnwindOpCode_SAVE_NONVOL_FAR: + { + // read value from frame base + U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + U64 addr = frame_base + off; + U64 value = 0; + if (!unw_memview_read_struct(memview, addr, &value)){ + missed_read_addr = addr; + goto error_out; + } + + // commit to register + REGS_Reg64 *reg = unw_pe_x64__gpr_reg(regs, op_info); + reg->u64 = value; + }break; + + case PE_UnwindOpCode_EPILOG: + { + result.dead = 1; + }break; + + case PE_UnwindOpCode_SPARE_CODE: + { + result.dead = 1; + // Assert(!"Hit me!"); + // TODO(allen): ??? + }break; + + case PE_UnwindOpCode_SAVE_XMM128: + { + // read new register values + U8 buf[16]; + U64 off = code_ptr[1].u16*16; + U64 addr = frame_base + off; + if (!unw_memview_read(memview, addr, 16, buf)){ + missed_read_addr = addr; + goto error_out; + } + + // commit to register + void *xmm_reg = (®s->ymm0) + op_info; + MemoryCopy(xmm_reg, buf, sizeof(buf)); + }break; + + case PE_UnwindOpCode_SAVE_XMM128_FAR: + { + // read new register values + U8 buf[16]; + U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + U64 addr = frame_base + off; + if (!unw_memview_read(memview, addr, 16, buf)){ + missed_read_addr = addr; + goto error_out; + } + + // commit to register + void *xmm_reg = (®s->ymm0) + op_info; + MemoryCopy(xmm_reg, buf, sizeof(buf)); + }break; + + case PE_UnwindOpCode_PUSH_MACHFRAME: + { + // NOTE(rjf): this was found by stepping through kernel code after an exception was + // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main + + if(op_info > 1) + { + result.dead = 1; + goto end_xdata_unwind; + } + + // read values + U64 sp_og = regs->rsp.u64; + U64 sp_adj = sp_og; + if(op_info == 1) + { + sp_adj += 8; + } + + U64 ip_value = 0; + if(!unw_memview_read_struct(memview, sp_adj, &ip_value)) + { + missed_read_addr = sp_adj; + goto error_out; + } + + U64 sp_after_ip = sp_adj + 8; + U16 ss_value = 0; + if(!unw_memview_read_struct(memview, sp_after_ip, &ss_value)) + { + missed_read_addr = sp_after_ip; + goto error_out; + } + + U64 sp_after_ss = sp_after_ip + 8; + U64 rflags_value = 0; + if(!unw_memview_read_struct(memview, sp_after_ss, &rflags_value)) + { + missed_read_addr = sp_after_ss; + goto error_out; + } + + U64 sp_after_rflags = sp_after_ss + 8; + U64 sp_value = 0; + if(!unw_memview_read_struct(memview, sp_after_rflags, &sp_value)) + { + missed_read_addr = sp_after_rflags; + goto error_out; + } + + // commit registers + regs->rip.u64 = ip_value; + regs->ss.u16 = ss_value; + regs->rflags.u64 = rflags_value; + regs->rsp.u64 = sp_value; + + // mark machine frame + did_machframe = 1; + }break; + } + } + } + + //- iterate pdata chain + U32 flags = PE_UNWIND_INFO_FLAGS_FROM_HDR(unwind_info->header); + if (!(flags & PE_UnwindInfoFlag_CHAINED)){ + break; + } + + U64 code_count_rounded = AlignPow2(unwind_info->codes_num, 2); + U64 code_size = code_count_rounded*sizeof(PE_UnwindOpCode); + U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size; + + last_pdata = pdata; + pdata = (PE_IntelPdata*)pe_ptr_from_voff(bindata, bin, chained_pdata_off); + } + + if(!did_machframe) + { + U64 sp = regs->rsp.u64; + U64 new_ip = 0; + if(!unw_memview_read_struct(memview, sp, &new_ip)) + { + missed_read_addr = sp; + goto error_out; + } + + // advance stack pointer + U64 new_sp = sp + 8; + + // commit registers + regs->rip.u64 = new_ip; + regs->rsp.u64 = new_sp; + } + + end_xdata_unwind:; + } + } + + error_out:; + + if(missed_read_addr != 0) + { + result.dead = 1; + result.missed_read = 1; + result.missed_read_addr = missed_read_addr; + } + + if(!result.dead) + { + result.stack_pointer = regs->rsp.u64; + } + + return(result); +} diff --git a/src/unwind/unwind.h b/src/unwind/unwind.h index 3d34d9bf..310e940c 100644 --- a/src/unwind/unwind.h +++ b/src/unwind/unwind.h @@ -5,11 +5,20 @@ #define UNWIND_H //////////////////////////////// -//~ allen: Unwind Types +//~ rjf: Memory View Types +// +// Memory views are used to provide a slice (or, in the future, slices) of data +// required to do a proper unwind. This is generally a very small region in an +// address space, generally some things on the stack. But, some formats don't +// restrict this in an organized way, and so theoretically you might have some +// unwind information require arbitrary reads at an unknown address. So this +// "memory view" concept serves as kind of a "stand-in" for "provided memory +// info from the user". This keeps the control flow of this layer simpler, so +// we aren't calling a user-supplied hook to read memory or anything like that. -// * applies to (any X,Y: unwind(X, Y)) - -typedef struct UNW_MemView{ +typedef struct UNW_MemView UNW_MemView; +struct UNW_MemView +{ // Upgrade Path: // 1. A list of ranges like this one // 2. Binary-searchable list of ranges @@ -18,297 +27,36 @@ typedef struct UNW_MemView{ void *data; U64 addr_first; U64 addr_opl; -} UNW_MemView; +}; -typedef struct UNW_Result{ +//////////////////////////////// +//~ rjf: Unwind Step Results + +typedef struct UNW_Step UNW_Step; +struct UNW_Step +{ B32 dead; B32 missed_read; U64 missed_read_addr; U64 stack_pointer; -} UNW_Result; - +}; //////////////////////////////// -//~ allen: X64 Unwind Types +//~ rjf: Memory View Helpers -// * applies to (any X: unwind(X, X64)) - -typedef REGS_RegBlockX64 UNW_X64_Regs; - - - - -//////////////////////////////// -//~ allen: PE X64 Unwind Types - -//- pe format unwind types - -#define UNW_PE_OpCodeXList(X) \ -X(PUSH_NONVOL , 0) \ -X(ALLOC_LARGE , 1) \ -X(ALLOC_SMALL , 2) \ -X(SET_FPREG , 3) \ -X(SAVE_NONVOL , 4) \ -X(SAVE_NONVOL_FAR, 5) \ -X(EPILOG , 6) \ -X(SPARE_CODE , 7) \ -X(SAVE_XMM128 , 8) \ -X(SAVE_XMM128_FAR, 9) \ -X(PUSH_MACHFRAME , 10) - -#define UNW_PE_CODE_FROM_FLAGS(f) ((f)&0xF) -#define UNW_PE_INFO_FROM_FLAGS(f) (((f) >> 4)&0xF) - -typedef U32 UNW_PE_OpCode; -enum UNW_PE_OpCodeEnum{ -#define X(N,C) UNW_PE_OpCode_##N = C, - UNW_PE_OpCodeXList(X) -#undef X -}; - -typedef union UNW_PE_Code{ - struct{ - U8 off_in_prolog; - U8 flags; - }; - U16 u16; -} UNW_PE_Code; - -typedef U8 UNW_PE_InfoFlags; -enum UNW_PE_InfoFlagsEnum{ - UNW_PE_InfoFlag_EHANDLER = (1 << 0), - UNW_PE_InfoFlag_UHANDLER = (1 << 1), - UNW_PE_InfoFlag_FHANDLER = 3, - UNW_PE_InfoFlag_CHAINED = (1 << 2), -} UNW_PE_InfoFlagsEnum; - -#define UNW_PE_INFO_VERSION_FROM_HDR(x) ((x)&0x7) -#define UNW_PE_INFO_FLAGS_FROM_HDR(x) (((x) >> 3)&0x1F) -#define UNW_PE_INFO_REG_FROM_FRAME(x) ((x)&0xF) -#define UNW_PE_INFO_OFF_FROM_FRAME(x) (((x) >> 4)&0xF) - -typedef struct UNW_PE_Info{ - U8 header; - U8 prolog_size; - U8 codes_num; - U8 frame; -} UNW_PE_Info; - - -//////////////////////////////// -//~ allen: PE X64 Unwind Types - -// * applies to (unwind(PE, X64)) - -typedef U8 UNW_PE_X64_GprReg; -enum{ - UNW_PE_X64_GprReg_RAX = 0, - UNW_PE_X64_GprReg_RCX = 1, - UNW_PE_X64_GprReg_RDX = 2, - UNW_PE_X64_GprReg_RBX = 3, - UNW_PE_X64_GprReg_RSP = 4, - UNW_PE_X64_GprReg_RBP = 5, - UNW_PE_X64_GprReg_RSI = 6, - UNW_PE_X64_GprReg_RDI = 7, - UNW_PE_X64_GprReg_R8 = 8, - UNW_PE_X64_GprReg_R9 = 9, - UNW_PE_X64_GprReg_R10 = 10, - UNW_PE_X64_GprReg_R11 = 11, - UNW_PE_X64_GprReg_R12 = 12, - UNW_PE_X64_GprReg_R13 = 13, - UNW_PE_X64_GprReg_R14 = 14, - UNW_PE_X64_GprReg_R15 = 15, -}; - - - - -//////////////////////////////// -//~ allen: ELF/DW Unwind Types - -// * applies to (any X: unwind(ELF/DW, X)) - -// EH: Exception Frames -typedef U8 UNW_DW_EhPtrEnc; -enum{ - UNW_DW_EhPtrEnc_TYPE_MASK = 0x0F, - UNW_DW_EhPtrEnc_PTR = 0x00, // Pointer sized unsigned value - UNW_DW_EhPtrEnc_ULEB128 = 0x01, // Unsigned LE base-128 value - UNW_DW_EhPtrEnc_UDATA2 = 0x02, // Unsigned 16-bit value - UNW_DW_EhPtrEnc_UDATA4 = 0x03, // Unsigned 32-bit value - UNW_DW_EhPtrEnc_UDATA8 = 0x04, // Unsigned 64-bit value - UNW_DW_EhPtrEnc_SIGNED = 0x08, // Signed pointer - UNW_DW_EhPtrEnc_SLEB128 = 0x09, // Signed LE base-128 value - UNW_DW_EhPtrEnc_SDATA2 = 0x0A, // Signed 16-bit value - UNW_DW_EhPtrEnc_SDATA4 = 0x0B, // Signed 32-bit value - UNW_DW_EhPtrEnc_SDATA8 = 0x0C, // Signed 64-bit value -}; -enum{ - UNW_DW_EhPtrEnc_MODIF_MASK = 0x70, - UNW_DW_EhPtrEnc_PCREL = 0x10, // Value is relative to the current program counter. - UNW_DW_EhPtrEnc_TEXTREL = 0x20, // Value is relative to the .text section. - UNW_DW_EhPtrEnc_DATAREL = 0x30, // Value is relative to the .got or .eh_frame_hdr section. - UNW_DW_EhPtrEnc_FUNCREL = 0x40, // Value is relative to the function. - UNW_DW_EhPtrEnc_ALIGNED = 0x50, // Value is aligned to an address unit sized boundary. -}; -enum{ - UNW_DW_EhPtrEnc_INDIRECT = 0x80, // This flag indicates that value is stored in virtual memory. - UNW_DW_EhPtrEnc_OMIT = 0xFF, -}; - -typedef struct UNW_DW_EhPtrCtx{ - U64 raw_base_vaddr; // address where pointer is being read - U64 text_vaddr; // base address of section with instructions (used for encoding pointer on SH and IA64) - U64 data_vaddr; // base address of data section (used for encoding pointer on x86-64) - U64 func_vaddr; // base address of function where IP is located -} UNW_DW_EhPtrCtx; - -// CIE: Common Information Entry -typedef struct UNW_DW_CIEUnpacked{ - U8 version; - UNW_DW_EhPtrEnc lsda_encoding; - UNW_DW_EhPtrEnc addr_encoding; - - B8 has_augmentation_size; - U64 augmentation_size; - String8 augmentation; - - U64 code_align_factor; - S64 data_align_factor; - U64 ret_addr_reg; - - U64 handler_ip; - - U64 cfi_range_min; - U64 cfi_range_max; -} UNW_DW_CIEUnpacked; - -typedef struct UNW_DW_CIEUnpackedNode{ - struct UNW_DW_CIEUnpackedNode *next; - UNW_DW_CIEUnpacked cie; - U64 offset; -} UNW_DW_CIEUnpackedNode; - -// FDE: Frame Description Entry -typedef struct UNW_DW_FDEUnpacked{ - U64 ip_voff_min; - U64 ip_voff_max; - U64 lsda_ip; - - U64 cfi_range_min; - U64 cfi_range_max; -} UNW_DW_FDEUnpacked; - -// CFI: Call Frame Information -typedef struct UNW_DW_CFIRecords{ - B32 valid; - UNW_DW_CIEUnpacked cie; - UNW_DW_FDEUnpacked fde; -} UNW_DW_CFIRecords; - -typedef enum UNW_DW_CFICFARule{ - UNW_DW_CFICFARule_REGOFF, - UNW_DW_CFICFARule_EXPR, -} UNW_DW_CFICFARule; - -typedef struct UNW_DW_CFICFACell{ - UNW_DW_CFICFARule rule; - union{ - struct{ - U64 reg_idx; - S64 offset; - }; - U64 expr_min; - U64 expr_max; - }; -} UNW_DW_CFICFACell; - -typedef enum UNW_DW_CFIRegisterRule{ - UNW_DW_CFIRegisterRule_SAME_VALUE, - UNW_DW_CFIRegisterRule_UNDEFINED, - UNW_DW_CFIRegisterRule_OFFSET, - UNW_DW_CFIRegisterRule_VAL_OFFSET, - UNW_DW_CFIRegisterRule_REGISTER, - UNW_DW_CFIRegisterRule_EXPRESSION, - UNW_DW_CFIRegisterRule_VAL_EXPRESSION, -} UNW_DW_CFIRegisterRule; - -typedef struct UNW_DW_CFICell{ - UNW_DW_CFIRegisterRule rule; - union{ - S64 n; - struct{ - U64 expr_min; - U64 expr_max; - }; - }; -} UNW_DW_CFICell; - -typedef struct UNW_DW_CFIRow{ - struct UNW_DW_CFIRow *next; - UNW_DW_CFICell *cells; - UNW_DW_CFICFACell cfa_cell; -} UNW_DW_CFIRow; - -typedef struct UNW_DW_CFIMachine{ - U64 cells_per_row; - UNW_DW_CIEUnpacked *cie; - UNW_DW_EhPtrCtx *ptr_ctx; - UNW_DW_CFIRow *initial_row; - U64 fde_ip; -} UNW_DW_CFIMachine; - -typedef U8 UNW_DW_CFADecode; -enum{ - UNW_DW_CFADecode_NOP = 0x0, - // 1,2,4,8 reserved for literal byte sizes - UNW_DW_CFADecode_ADDRESS = 0x9, - UNW_DW_CFADecode_ULEB128 = 0xA, - UNW_DW_CFADecode_SLEB128 = 0xB, -}; - -typedef U16 UNW_DW_CFAControlBits; -enum{ - UNW_DW_CFAControlBits_DEC1_MASK = 0x00F, - UNW_DW_CFAControlBits_DEC2_MASK = 0x0F0, - UNW_DW_CFAControlBits_IS_REG_0 = 0x100, - UNW_DW_CFAControlBits_IS_REG_1 = 0x200, - UNW_DW_CFAControlBits_IS_REG_2 = 0x400, - UNW_DW_CFAControlBits_NEW_ROW = 0x800, -}; - - - -//////////////////////////////// -//~ allen: Unwind Functions - -//- mem view construction internal UNW_MemView unw_memview_from_data(String8 data, U64 base_vaddr); - -//- mem view user face for unwind users internal B32 unw_memview_read(UNW_MemView *memview, U64 addr, U64 size, void *out); - #define unw_memview_read_struct(v,addr,p) unw_memview_read((v), (addr), sizeof(*(p)), (p)) - //////////////////////////////// -//~ allen: PE X64 Unwind Functions +//~ rjf: PE/X64 Unwind Implementation -//- main interface -internal UNW_Result unw_pe_x64(String8 bindata, PE_BinInfo *bin, - U64 base_vaddr, UNW_MemView *memview, - UNW_X64_Regs *regs_inout); +//- rjf: helpers +internal UNW_Step unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, U64 base_vaddr, UNW_MemView *memview, REGS_RegBlockX64 *regs_inout); +internal B32 unw_pe_x64__voff_is_in_epilog(String8 bindata, PE_BinInfo *bin, U64 voff, PE_IntelPdata *final_pdata); +internal REGS_Reg64 *unw_pe_x64__gpr_reg(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 unw_reg); +//- rjf: unwind step +internal UNW_Step unw_unwind_pe_x64(String8 bindata, PE_BinInfo *bin, U64 base_vaddr, UNW_MemView *memview, REGS_RegBlockX64 *regs_inout); -//- pe x64 helpers -internal UNW_Result unw_pe_x64__epilog(String8 bindata, PE_BinInfo *bin, - U64 base_vaddr, UNW_MemView*memview, - UNW_X64_Regs *regs_inout); - -internal U32 unw_pe_x64__slot_count_from_op_code(UNW_PE_OpCode opcode); -internal B32 unw_pe_x64__voff_is_in_epilog(String8 bindata, PE_BinInfo *bin, - U64 voff, PE_IntelPdata *final_pdata); - -internal REGS_Reg64 *unw_pe_x64__gpr_reg(UNW_X64_Regs *regs, UNW_PE_X64_GprReg unw_reg); - -#endif //UNWIND_H +#endif // UNWIND_H From 6d1c0d9f6d9d9d4728fac1bd095295ad7459ddc4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 15:37:31 -0700 Subject: [PATCH 216/275] louder & more informative exception info viz --- src/dbgi/dbgi.c | 2 +- src/df/gfx/df_gfx.c | 310 ++++++++++++++++++++++++++++++-------------- src/df/gfx/df_gfx.h | 6 + src/raddbg/raddbg.h | 2 +- 4 files changed, 219 insertions(+), 101 deletions(-) diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index ba702134..8746bf26 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -831,7 +831,7 @@ dbgi_parse_thread_entry_point(void *p) } //- rjf: if raddbg file is up to date based on timestamp, check the - // encoding generation number, to see if we need to regenerate it + // encoding generation number & size, to see if we need to regenerate it // regardless if(do_task && raddbgi_file_is_up_to_date) { diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 47813529..2535aae1 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -4684,107 +4684,12 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D Temp scratch = scratch_begin(&arena, 1); DF_IconKind icon = DF_IconKind_Null; String8 explanation = str8_lit("Not running"); - DF_Entity *thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity); - String8 thread_display_string = df_display_string_from_entity(scratch.arena, thread); - switch(stop_event.kind) { - default: + String8 stop_explanation = df_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon); + if(stop_explanation.size != 0) { - switch(stop_event.cause) - { - default:{}break; - case CTRL_EventCause_Finished: - { - if(!df_entity_is_nil(thread)) - { - explanation = push_str8f(scratch.arena, "%S completed step", thread_display_string); - } - else - { - explanation = str8_lit("Stopped"); - } - }break; - case CTRL_EventCause_UserBreakpoint: - { - if(!df_entity_is_nil(thread)) - { - icon = DF_IconKind_CircleFilled; - explanation = push_str8f(scratch.arena, "%S hit a breakpoint", thread_display_string); - } - }break; - case CTRL_EventCause_InterruptedByException: - { - if(!df_entity_is_nil(thread)) - { - icon = DF_IconKind_WarningBig; - switch(stop_event.exception_kind) - { - default: - { - explanation = push_str8f(scratch.arena, "%S interrupted - 0x%x", thread_display_string, stop_event.exception_code); - }break; - case CTRL_ExceptionKind_CppThrow: - { - explanation = push_str8f(scratch.arena, "Exception thrown on %S - 0x%x", thread_display_string, stop_event.exception_code); - }break; - case CTRL_ExceptionKind_MemoryRead: - { - explanation = push_str8f(scratch.arena, "Exception thrown on %S - 0x%x: Access violation reading 0x%I64x", - thread_display_string, - stop_event.exception_code, - stop_event.vaddr_rng.min); - }break; - case CTRL_ExceptionKind_MemoryWrite: - { - explanation = push_str8f(scratch.arena, "Exception thrown on %S - 0x%x: Access violation writing 0x%I64x", - thread_display_string, - stop_event.exception_code, - stop_event.vaddr_rng.min); - }break; - case CTRL_ExceptionKind_MemoryExecute: - { - explanation = push_str8f(scratch.arena, "Exception thrown on %S - 0x%x: Access violation executing 0x%I64x", - thread_display_string, - stop_event.exception_code, - stop_event.vaddr_rng.min); - }break; - } - } - else - { - icon = DF_IconKind_Pause; - explanation = str8_lit("Interrupted"); - } - }break; - case CTRL_EventCause_InterruptedByTrap: - { - icon = DF_IconKind_WarningBig; - explanation = push_str8f(scratch.arena, "%S interrupted by trap - 0x%x", thread_display_string, stop_event.exception_code); - }break; - case CTRL_EventCause_InterruptedByHalt: - { - icon = DF_IconKind_Pause; - explanation = str8_lit("Halted"); - }break; - } - }break; - case CTRL_EventKind_LaunchAndInitDone: - case CTRL_EventKind_LaunchAndHandshakeDone: - { - explanation = str8_lit("Launched"); - }break; - case CTRL_EventKind_AttachDone: - { - explanation = str8_lit("Attached"); - }break; - case CTRL_EventKind_DetachDone: - { - explanation = str8_lit("Detached"); - }break; - case CTRL_EventKind_KillDone: - { - explanation = str8_lit("Killed"); - }break; + explanation = stop_explanation; + } } if(icon != DF_IconKind_Null) { @@ -8483,6 +8388,141 @@ df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source) return strs; } +//////////////////////////////// +//~ rjf: Process Control Info Stringification + +internal String8 +df_string_from_exception_code(U32 code) +{ + String8 string = {0}; + for(EachNonZeroEnumVal(CTRL_ExceptionCodeKind, k)) + { + if(code == ctrl_exception_code_kind_code_table[k]) + { + string = ctrl_exception_code_kind_display_string_table[k]; + break; + } + } + return string; +} + +internal String8 +df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, DF_IconKind *icon_out) +{ + DF_IconKind icon = DF_IconKind_Null; + String8 explanation = {0}; + Temp scratch = scratch_begin(&arena, 1); + DF_Entity *thread = df_entity_from_ctrl_handle(event->machine_id, event->entity); + String8 thread_display_string = df_display_string_from_entity(scratch.arena, thread); + switch(event->kind) + { + default: + { + switch(event->cause) + { + default:{}break; + case CTRL_EventCause_Finished: + { + if(!df_entity_is_nil(thread)) + { + explanation = push_str8f(arena, "%S completed step", thread_display_string); + } + else + { + explanation = str8_lit("Stopped"); + } + }break; + case CTRL_EventCause_UserBreakpoint: + { + if(!df_entity_is_nil(thread)) + { + icon = DF_IconKind_CircleFilled; + explanation = push_str8f(arena, "%S hit a breakpoint", thread_display_string); + } + }break; + case CTRL_EventCause_InterruptedByException: + { + if(!df_entity_is_nil(thread)) + { + icon = DF_IconKind_WarningBig; + switch(event->exception_kind) + { + default: + { + String8 exception_code_string = df_string_from_exception_code(event->exception_code); + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x%s%S", thread_display_string, event->exception_code, exception_code_string.size > 0 ? ": " : "", exception_code_string); + }break; + case CTRL_ExceptionKind_CppThrow: + { + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: C++ exception", thread_display_string, event->exception_code); + }break; + case CTRL_ExceptionKind_MemoryRead: + { + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation reading 0x%I64x", + thread_display_string, + event->exception_code, + event->vaddr_rng.min); + }break; + case CTRL_ExceptionKind_MemoryWrite: + { + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation writing 0x%I64x", + thread_display_string, + event->exception_code, + event->vaddr_rng.min); + }break; + case CTRL_ExceptionKind_MemoryExecute: + { + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation executing 0x%I64x", + thread_display_string, + event->exception_code, + event->vaddr_rng.min); + }break; + } + } + else + { + icon = DF_IconKind_Pause; + explanation = str8_lit("Interrupted"); + } + }break; + case CTRL_EventCause_InterruptedByTrap: + { + icon = DF_IconKind_WarningBig; + explanation = push_str8f(arena, "%S interrupted by trap - 0x%x", thread_display_string, event->exception_code); + }break; + case CTRL_EventCause_InterruptedByHalt: + { + icon = DF_IconKind_Pause; + explanation = str8_lit("Halted"); + }break; + } + }break; + case CTRL_EventKind_LaunchAndInitDone: + case CTRL_EventKind_LaunchAndHandshakeDone: + { + explanation = str8_lit("Launched"); + }break; + case CTRL_EventKind_AttachDone: + { + explanation = str8_lit("Attached"); + }break; + case CTRL_EventKind_DetachDone: + { + explanation = str8_lit("Detached"); + }break; + case CTRL_EventKind_KillDone: + { + explanation = str8_lit("Killed"); + }break; + } + scratch_end(scratch); + if(icon_out) + { + *icon_out = icon; + } + return explanation; +} + //////////////////////////////// //~ rjf: UI Widgets: Fancy Buttons @@ -9269,6 +9309,29 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } } + ////////////////////////////// + //- rjf: build per-line background colors + // + Vec4F32 *line_bg_colors = push_array(scratch.arena, Vec4F32, dim_1s64(params->line_num_range)+1); + { + //- rjf: color line with stopper-thread red + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num < params->line_num_range.max; + line_num += 1, line_idx += 1) + { + DF_EntityList threads = params->line_ips[line_idx]; + for(DF_EntityNode *n = threads.first; n != 0; n = n->next) + { + if(n->entity == stopper_thread && (stop_event.cause == CTRL_EventCause_InterruptedByTrap || stop_event.cause == CTRL_EventCause_InterruptedByException)) + { + line_bg_colors[line_idx] = df_rgba_from_theme_color(DF_ThemeColor_FailureBackground); + line_bg_colors[line_idx].w *= 0.25f; + } + } + } + } + ////////////////////////////// //- rjf: build per-line context menus // @@ -9710,6 +9773,49 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } } + ////////////////////////////// + //- rjf: build exception annotations + // + UI_Focus(UI_FocusKind_Off) + { + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num < params->line_num_range.max; + line_num += 1, line_idx += 1) + { + DF_EntityList threads = params->line_ips[line_idx]; + for(DF_EntityNode *n = threads.first; n != 0; n = n->next) + { + DF_Entity *thread = n->entity; + if(thread == stopper_thread && + (stop_event.cause == CTRL_EventCause_InterruptedByException || + stop_event.cause == CTRL_EventCause_InterruptedByTrap)) + { + DF_IconKind icon = DF_IconKind_WarningBig; + String8 explanation = df_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon); + UI_Parent(line_extras_boxes[line_idx]) UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_Clickable, "###exception_info"); + UI_Parent(box) + { + UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_FailureBackground)) + UI_Font(df_font_from_slot(DF_FontSlot_Icons)) + UI_PrefWidth(ui_text_dim(10, 1)) + { + ui_label(df_g_icon_kind_text_table[DF_IconKind_WarningBig]); + } + UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_FailureBackground)) + UI_PrefWidth(ui_text_dim(10, 1)) + { + ui_label(explanation); + } + } + } + } + } + } + } + ////////////////////////////// //- rjf: build watch pin annotations // @@ -10139,6 +10245,12 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ TXTI_TokenArray *line_tokens = ¶ms->line_tokens[line_idx]; ui_set_next_text_padding(-2); UI_Key line_key = ui_key_from_stringf(top_container_box->key, "ln_%I64x", line_num); + Vec4F32 line_bg_color = line_bg_colors[line_idx]; + if(line_bg_color.w != 0) + { + ui_set_next_background_color(line_bg_color); + ui_set_next_flags(UI_BoxFlag_DrawBackground); + } UI_Box *line_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc|UI_BoxFlag_DrawText|UI_BoxFlag_DisableIDString, line_key); D_Bucket *line_bucket = d_bucket_make(); d_push_bucket(line_bucket); diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index c8399b4e..48dc090b 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -1019,6 +1019,12 @@ internal F32 df_font_size_from_slot(DF_Window *ws, DF_FontSlot slot); //- rjf: config serialization internal String8List df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source); +//////////////////////////////// +//~ rjf: Process Control Info Stringification + +internal String8 df_string_from_exception_code(U32 code); +internal String8 df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, DF_IconKind *icon_out); + //////////////////////////////// //~ rjf: UI Widgets: Fancy Buttons diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 0c9da33d..19d10e5e 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -56,7 +56,7 @@ // start with brighter color, but sometimes with darker - shouldn't it // always have the same color ordering? // -// [ ] middle mouse button on tab should close it +// [x] middle mouse button on tab should close it // [ ] pipe failure-to-launch errors back to frontend //////////////////////////////// From f561abfd63af57471e02df07ef66926b9de6e1e0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 15:43:00 -0700 Subject: [PATCH 217/275] show stopper-thread exception-info on entity tooltips, when applicable --- src/df/gfx/df_gfx.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 2535aae1..9d98f8f6 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -8790,6 +8790,25 @@ df_entity_tooltips(DF_Entity *entity) } UI_PrefWidth(ui_text_dim(10, 1)) ui_label(display_string); } + { + CTRL_Event stop_event = df_ctrl_last_stop_event(); + DF_Entity *stopper_thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity); + if(stopper_thread == entity) + { + ui_spacer(ui_em(1.5f, 1.f)); + DF_IconKind icon_kind = DF_IconKind_Null; + String8 explanation = df_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon_kind); + if(explanation.size != 0) + { + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_FailureBackground)) + { + UI_PrefWidth(ui_em(1.5f, 1.f)) UI_Font(df_font_from_slot(DF_FontSlot_Icons)) ui_label(df_g_icon_kind_text_table[icon_kind]); + UI_PrefWidth(ui_text_dim(10, 1)) ui_label(explanation); + } + } + } + } + ui_spacer(ui_em(1.5f, 1.f)); UI_PrefWidth(ui_children_sum(1)) UI_Row { UI_PrefWidth(ui_em(18.f, 1.f)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) ui_labelf("TID: "); From 206d48b363253f264edb78304d9ad2bf2c44453c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 Mar 2024 15:47:34 -0700 Subject: [PATCH 218/275] notes --- src/raddbg/raddbg.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 19d10e5e..df1afddc 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -213,7 +213,7 @@ // [ ] @feature disasm keyboard navigation & copy/paste // [ ] @feature debug info overrides (both path-based AND module-based) // [ ] configure tab size -// [ ] run-to-line needs to work if no processes are running +// [x] run-to-line needs to work if no processes are running // - place temp bp, attach "die on hit" flag or something like that? // [ ] auto-scroll output window // @@ -240,11 +240,11 @@ // expandable? It seems like this should be consistent (one way to edit, // one way to expand/collapse, that are distinct) // -// [ ] I didn't understand the terminology "Equip With Color". Does that just +// [x] I didn't understand the terminology "Equip With Color". Does that just // mean specify the color used to display it? Is "Apply Color" perhaps a // bit more user-friendly? // -// [ ] The cursor feels a bit too huge vertically. +// [x] The cursor feels a bit too huge vertically. // // [ ] The hex format for color values in the config file was a real // mindbender. It's prefixed with "0x", so I was assuming it was either From 6393766f828ff50c04d3d45ea36a4c15ea9fe1be Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 10:31:20 -0700 Subject: [PATCH 219/275] deduplicate txti/txt layer lexing --- src/df/gfx/df_gfx.c | 40 ++-- src/df/gfx/df_gfx.h | 4 +- src/df/gfx/df_view_rule_hooks.c | 2 +- src/df/gfx/df_views.c | 60 ++--- src/df/gfx/df_views.h | 2 +- src/txti/txti.c | 411 +++----------------------------- src/txti/txti.h | 107 +-------- 7 files changed, 91 insertions(+), 535 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 9d98f8f6..bb2d11d1 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -8056,18 +8056,18 @@ df_rgba_from_theme_color(DF_ThemeColor color) } internal DF_ThemeColor -df_theme_color_from_txti_token_kind(TXTI_TokenKind kind) +df_theme_color_from_txt_token_kind(TXT_TokenKind kind) { DF_ThemeColor color = DF_ThemeColor_CodeDefault; switch(kind) { default:break; - case TXTI_TokenKind_Keyword:{color = DF_ThemeColor_CodeKeyword;}break; - case TXTI_TokenKind_Numeric:{color = DF_ThemeColor_CodeNumeric;}break; - case TXTI_TokenKind_String: {color = DF_ThemeColor_CodeString;}break; - case TXTI_TokenKind_Meta: {color = DF_ThemeColor_CodeMeta;}break; - case TXTI_TokenKind_Comment:{color = DF_ThemeColor_CodeComment;}break; - case TXTI_TokenKind_Symbol: {color = DF_ThemeColor_CodeSymbol;}break; + case TXT_TokenKind_Keyword:{color = DF_ThemeColor_CodeKeyword;}break; + case TXT_TokenKind_Numeric:{color = DF_ThemeColor_CodeNumeric;}break; + case TXT_TokenKind_String: {color = DF_ThemeColor_CodeString;}break; + case TXT_TokenKind_Meta: {color = DF_ThemeColor_CodeMeta;}break; + case TXT_TokenKind_Comment:{color = DF_ThemeColor_CodeComment;}break; + case TXT_TokenKind_Symbol: {color = DF_ThemeColor_CodeSymbol;}break; } return color; } @@ -10063,7 +10063,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; String8 line_text = params->line_text[line_slice_idx]; - TXTI_TokenArray line_tokens = params->line_tokens[line_slice_idx]; + TXT_TokenArray line_tokens = params->line_tokens[line_slice_idx]; Rng1U64 line_range = params->line_ranges[line_slice_idx]; U64 mouse_pt_off = line_range.min + (mouse_pt.column-1); Rng1U64 expr_off_rng = txti_expr_range_from_line_off_range_string_tokens(mouse_pt_off, line_range, line_text, &line_tokens); @@ -10261,7 +10261,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { String8 line_string = params->line_text[line_idx]; Rng1U64 line_range = params->line_ranges[line_idx]; - TXTI_TokenArray *line_tokens = ¶ms->line_tokens[line_idx]; + TXT_TokenArray *line_tokens = ¶ms->line_tokens[line_idx]; ui_set_next_text_padding(-2); UI_Key line_key = ui_key_from_stringf(top_container_box->key, "ln_%I64x", line_num); Vec4F32 line_bg_color = line_bg_colors[line_idx]; @@ -10292,9 +10292,9 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } else { - TXTI_Token *line_tokens_first = line_tokens->v; - TXTI_Token *line_tokens_opl = line_tokens->v + line_tokens->count; - for(TXTI_Token *token = line_tokens_first; token < line_tokens_opl; token += 1) + TXT_Token *line_tokens_first = line_tokens->v; + TXT_Token *line_tokens_opl = line_tokens->v + line_tokens->count; + for(TXT_Token *token = line_tokens_first; token < line_tokens_opl; token += 1) { // rjf: token -> token string String8 token_string = {0}; @@ -10314,9 +10314,9 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ // rjf: token -> token color Vec4F32 token_color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); { - DF_ThemeColor new_color_kind = df_theme_color_from_txti_token_kind(token->kind); + DF_ThemeColor new_color_kind = df_theme_color_from_txt_token_kind(token->kind); F32 mix_t = 1.f; - if(token->kind == TXTI_TokenKind_Identifier) + if(token->kind == TXT_TokenKind_Identifier) { B32 mapped_special = 0; for(DF_EntityNode *n = params->relevant_binaries.first; n != 0; n = n->next) @@ -10808,12 +10808,12 @@ df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_s { Temp scratch = scratch_begin(&arena, 1); D_FancyStringList fancy_strings = {0}; - TXTI_TokenArray tokens = txti_token_array_from_string__cpp(scratch.arena, 0, string); - TXTI_Token *tokens_opl = tokens.v+tokens.count; + TXT_TokenArray tokens = txt_token_array_from_string__c_cpp(scratch.arena, 0, string); + TXT_Token *tokens_opl = tokens.v+tokens.count; S32 indirection_counter = 0; - for(TXTI_Token *token = tokens.v; token < tokens_opl; token += 1) + for(TXT_Token *token = tokens.v; token < tokens_opl; token += 1) { - DF_ThemeColor token_color = df_theme_color_from_txti_token_kind(token->kind); + DF_ThemeColor token_color = df_theme_color_from_txt_token_kind(token->kind); Vec4F32 token_color_rgba = df_rgba_from_theme_color(token_color); token_color_rgba.w *= alpha; String8 token_string = str8_substr(string, token->range); @@ -10833,7 +10833,7 @@ df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_s }; d_fancy_string_list_push(arena, &fancy_strings, &fancy_string); }break; - case TXTI_TokenKind_Identifier: + case TXT_TokenKind_Identifier: { D_FancyString fancy_string = { @@ -10844,7 +10844,7 @@ df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_s }; d_fancy_string_list_push(arena, &fancy_strings, &fancy_string); }break; - case TXTI_TokenKind_Numeric: + case TXT_TokenKind_Numeric: { Vec4F32 token_color_rgba_alt = token_color_rgba; token_color_rgba_alt.x *= 0.7f; diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 48dc090b..421084b5 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -453,7 +453,7 @@ struct DF_CodeSliceParams Rng1S64 line_num_range; String8 *line_text; Rng1U64 *line_ranges; - TXTI_TokenArray *line_tokens; + TXT_TokenArray *line_tokens; DF_EntityList *line_bps; DF_EntityList *line_ips; DF_EntityList *line_pins; @@ -1010,7 +1010,7 @@ internal DF_CmdSpecList df_cmd_spec_list_from_event_flags(Arena *arena, OS_Event //- rjf: colors internal Vec4F32 df_rgba_from_theme_color(DF_ThemeColor color); -internal DF_ThemeColor df_theme_color_from_txti_token_kind(TXTI_TokenKind kind); +internal DF_ThemeColor df_theme_color_from_txt_token_kind(TXT_TokenKind kind); //- rjf: fonts/sizes internal F_Tag df_font_from_slot(DF_FontSlot slot); diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index da3d8842..2c63c1d4 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -715,7 +715,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) code_slice_params.line_num_range = r1s64(1, info.lines_count); code_slice_params.line_text = push_array(scratch.arena, String8, info.lines_count); code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, info.lines_count); - code_slice_params.line_tokens = push_array(scratch.arena, TXTI_TokenArray, info.lines_count); + code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, info.lines_count); code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, info.lines_count); code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, info.lines_count); code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, info.lines_count); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index a6f1eacb..8084be2c 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -372,13 +372,13 @@ df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray //////////////////////////////// //~ rjf: Disassembly View -internal TXTI_TokenArray -df_txti_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, String8 string) +internal TXT_TokenArray +df_txt_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, String8 string) { Temp scratch = scratch_begin(&arena, 1); - TXTI_TokenChunkList tokens = {0}; + TXT_TokenChunkList tokens = {0}; { - TXTI_TokenKind active_token_kind = TXTI_TokenKind_Null; + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; U64 active_token_start_off = 0; U64 off = 0; B32 escaped = 0; @@ -388,8 +388,8 @@ df_txti_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, Strin U8 byte = (off+0 < string.size) ? string.str[off+0] : 0; U8 next_byte = (off+1 < string.size) ? string.str[off+1] : 0; B32 ender_found = 0; - advance = (active_token_kind != TXTI_TokenKind_Null ? 1 : 0); - if(off == string.size && active_token_kind != TXTI_TokenKind_Null) + advance = (active_token_kind != TXT_TokenKind_Null ? 1 : 0); + if(off == string.size && active_token_kind != TXT_TokenKind_Null) { ender_found = 1; advance = 1; @@ -397,38 +397,38 @@ df_txti_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, Strin switch(active_token_kind) { default: - case TXTI_TokenKind_Null: + case TXT_TokenKind_Null: { if(byte == ' ' || byte == '\t' || byte == '\v' || byte == '\f' || byte == '\r' || byte == '\n') { active_token_start_off = off; - active_token_kind = TXTI_TokenKind_Whitespace; + active_token_kind = TXT_TokenKind_Whitespace; advance = 1; } else if(('a' <= byte && byte <= 'z') || ('A' <= byte && byte <= 'Z') || byte == '_') { active_token_start_off = off; - active_token_kind = TXTI_TokenKind_Identifier; + active_token_kind = TXT_TokenKind_Identifier; advance = 1; } else if(byte == '\'') { active_token_start_off = off; - active_token_kind = TXTI_TokenKind_String; + active_token_kind = TXT_TokenKind_String; advance = 1; string_is_char = 1; } else if(byte == '"') { active_token_start_off = off; - active_token_kind = TXTI_TokenKind_String; + active_token_kind = TXT_TokenKind_String; advance = 1; string_is_char = 0; } else if(('0' <= byte && byte <= '9') || (byte == '.' && '0' <= next_byte && next_byte <= '9')) { active_token_start_off = off; - active_token_kind = TXTI_TokenKind_Numeric; + active_token_kind = TXT_TokenKind_Numeric; advance = 1; } else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' || @@ -439,29 +439,29 @@ df_txti_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, Strin byte == '>' || byte == ',' || byte == '.') { active_token_start_off = off; - active_token_kind = TXTI_TokenKind_Symbol; + active_token_kind = TXT_TokenKind_Symbol; advance = 1; } else { active_token_start_off = off; - active_token_kind = TXTI_TokenKind_Error; + active_token_kind = TXT_TokenKind_Error; advance = 1; } }break; - case TXTI_TokenKind_Whitespace: + case TXT_TokenKind_Whitespace: if(byte != ' ' && byte != '\t' && byte != '\v' && byte != '\f') { ender_found = 1; advance = 0; }break; - case TXTI_TokenKind_Identifier: + case TXT_TokenKind_Identifier: if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '_') { ender_found = 1; advance = 0; }break; - case TXTI_TokenKind_String: + case TXT_TokenKind_String: { U8 ender_byte = string_is_char ? '\'' : '"'; if(!escaped && byte == ender_byte) @@ -488,13 +488,13 @@ df_txti_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, Strin } } }break; - case TXTI_TokenKind_Numeric: + case TXT_TokenKind_Numeric: if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '.') { ender_found = 1; advance = 0; }break; - case TXTI_TokenKind_Symbol: + case TXT_TokenKind_Symbol: if(1) { // NOTE(rjf): avoiding maximum munch rule for now @@ -511,7 +511,7 @@ df_txti_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, Strin ender_found = 1; advance = 0; }break; - case TXTI_TokenKind_Error: + case TXT_TokenKind_Error: { ender_found = 1; advance = 0; @@ -519,22 +519,22 @@ df_txti_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, Strin } if(ender_found != 0) { - TXTI_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)}; - if(active_token_kind == TXTI_TokenKind_Identifier) + TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)}; + if(active_token_kind == TXT_TokenKind_Identifier) { String8 token_string = str8_substr(string, token.range); if(df_info_summary_from_string(arch, token_string).size != 0) { - token.kind = TXTI_TokenKind_Keyword; + token.kind = TXT_TokenKind_Keyword; } } - txti_token_chunk_list_push(arena, &tokens, 1024, &token); - active_token_kind = TXTI_TokenKind_Null; + txt_token_chunk_list_push(arena, &tokens, 1024, &token); + active_token_kind = TXT_TokenKind_Null; active_token_start_off = token.range.max; } } } - TXTI_TokenArray result = txti_token_array_from_chunk_list(arena, &tokens); + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); scratch_end(scratch); return result; } @@ -5844,8 +5844,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ui_spacer(ui_pct(1, 0)); ui_labelf("(read only)"); ui_labelf("%s", - info.line_end_kind == TXTI_LineEndKind_LF ? "lf" : - info.line_end_kind == TXTI_LineEndKind_CRLF ? "crlf" : + info.line_end_kind == TXT_LineEndKind_LF ? "lf" : + info.line_end_kind == TXT_LineEndKind_CRLF ? "crlf" : "bin"); } } @@ -6185,7 +6185,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) code_slice_params.line_num_range = visible_line_num_range; code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count); code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); - code_slice_params.line_tokens = push_array(scratch.arena, TXTI_TokenArray, visible_line_count); + code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, visible_line_count); code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, visible_line_count); code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, visible_line_count); code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, visible_line_count); @@ -6230,7 +6230,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) { U64 idx = line_num-visible_line_num_range.min; - TXTI_TokenArray tokens = df_txti_token_array_from_dasm_arch_string(scratch.arena, df_architecture_from_entity(process), code_slice_params.line_text[idx]); + TXT_TokenArray tokens = df_txt_token_array_from_dasm_arch_string(scratch.arena, df_architecture_from_entity(process), code_slice_params.line_text[idx]); code_slice_params.line_tokens[idx] = tokens; } diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 064609d8..e11c9e7d 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -438,7 +438,7 @@ internal void df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityLi //////////////////////////////// //~ rjf: Disassembly View -internal TXTI_TokenArray df_txti_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, String8 string); +internal TXT_TokenArray df_txt_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, String8 string); //////////////////////////////// //~ rjf: Eval/Watch Views diff --git a/src/txti/txti.c b/src/txti/txti.c index e7d9da25..d58e0fc4 100644 --- a/src/txti/txti.c +++ b/src/txti/txti.c @@ -72,355 +72,6 @@ txti_lang_kind_from_extension(String8 extension) return kind; } -//////////////////////////////// -//~ rjf: Token Type Functions - -internal void -txti_token_chunk_list_push(Arena *arena, TXTI_TokenChunkList *list, U64 cap, TXTI_Token *token) -{ - TXTI_TokenChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, TXTI_TokenChunkNode, 1); - SLLQueuePush(list->first, list->last, node); - node->cap = cap; - node->v = push_array_no_zero(arena, TXTI_Token, node->cap); - list->chunk_count += 1; - } - MemoryCopyStruct(&node->v[node->count], token); - node->count += 1; - list->token_count += 1; -} - -internal void -txti_token_list_push(Arena *arena, TXTI_TokenList *list, TXTI_Token *token) -{ - TXTI_TokenNode *node = push_array(arena, TXTI_TokenNode, 1); - MemoryCopyStruct(&node->v, token); - SLLQueuePush(list->first, list->last, node); - list->count += 1; -} - -internal TXTI_TokenArray -txti_token_array_from_chunk_list(Arena *arena, TXTI_TokenChunkList *list) -{ - TXTI_TokenArray array = {0}; - array.count = list->token_count; - array.v = push_array_no_zero(arena, TXTI_Token, array.count); - U64 idx = 0; - for(TXTI_TokenChunkNode *n = list->first; n != 0; n = n->next) - { - MemoryCopy(array.v+idx, n->v, n->count*sizeof(TXTI_Token)); - idx += n->count; - } - return array; -} - -internal TXTI_TokenArray -txti_token_array_from_list(Arena *arena, TXTI_TokenList *list) -{ - TXTI_TokenArray array = {0}; - array.count = list->count; - array.v = push_array_no_zero(arena, TXTI_Token, array.count); - U64 idx = 0; - for(TXTI_TokenNode *n = list->first; n != 0; n = n->next) - { - MemoryCopyStruct(array.v+idx, &n->v); - idx += 1; - } - return array; -} - -//////////////////////////////// -//~ rjf: Lexing Functions - -internal TXTI_TokenArray -txti_token_array_from_string__cpp(Arena *arena, U64 *bytes_processed_counter, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: generate token list - TXTI_TokenChunkList tokens = {0}; - { - B32 comment_is_single_line = 0; - B32 string_is_char = 0; - TXTI_TokenKind active_token_kind = TXTI_TokenKind_Null; - U64 active_token_start_idx = 0; - B32 escaped = 0; - B32 next_escaped = 0; - U64 byte_process_start_idx = 0; - for(U64 idx = 0; idx <= string.size;) - { - U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; - U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; - - // rjf: update counter - if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) - { - ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); - byte_process_start_idx = idx; - } - - // rjf: escaping - if(escaped && (byte != '\r' && byte != '\n')) - { - next_escaped = 0; - } - else if(!escaped && byte == '\\') - { - next_escaped = 1; - } - - // rjf: take starter, determine active token kind - if(active_token_kind == TXTI_TokenKind_Null) - { - // rjf: use next bytes to start a new token - if(0){} - else if(char_is_space(byte)) { active_token_kind = TXTI_TokenKind_Whitespace; } - else if(byte == '_' || - byte == '$' || - char_is_alpha(byte)) { active_token_kind = TXTI_TokenKind_Identifier; } - else if(char_is_digit(byte, 10) || - (byte == '.' && - char_is_digit(next_byte, 10))) { active_token_kind = TXTI_TokenKind_Numeric; } - else if(byte == '"') { active_token_kind = TXTI_TokenKind_String; string_is_char = 0; } - else if(byte == '\'') { active_token_kind = TXTI_TokenKind_String; string_is_char = 1; } - else if(byte == '/' && next_byte == '/') { active_token_kind = TXTI_TokenKind_Comment; comment_is_single_line = 1; } - else if(byte == '/' && next_byte == '*') { active_token_kind = TXTI_TokenKind_Comment; comment_is_single_line = 0; } - else if(byte == '~' || byte == '!' || - byte == '%' || byte == '^' || - byte == '&' || byte == '*' || - byte == '(' || byte == ')' || - byte == '-' || byte == '=' || - byte == '+' || byte == '[' || - byte == ']' || byte == '{' || - byte == '}' || byte == ':' || - byte == ';' || byte == ',' || - byte == '.' || byte == '<' || - byte == '>' || byte == '/' || - byte == '?' || byte == '|') { active_token_kind = TXTI_TokenKind_Symbol; } - else if(byte == '#') { active_token_kind = TXTI_TokenKind_Meta; } - - // rjf: start new token - if(active_token_kind != TXTI_TokenKind_Null) - { - active_token_start_idx = idx; - } - - // rjf: invalid token kind -> emit error - else - { - TXTI_Token token = {TXTI_TokenKind_Error, r1u64(idx, idx+1)}; - txti_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - - // rjf: look for ender - U64 ender_pad = 0; - B32 ender_found = 0; - if(active_token_kind != TXTI_TokenKind_Null && idx>active_token_start_idx) - { - if(idx == string.size) - { - ender_pad = 0; - ender_found = 1; - } - else switch(active_token_kind) - { - default:break; - case TXTI_TokenKind_Whitespace: - { - ender_found = !char_is_space(byte); - }break; - case TXTI_TokenKind_Identifier: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); - }break; - case TXTI_TokenKind_Numeric: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.'); - }break; - case TXTI_TokenKind_String: - { - ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); - ender_pad += 1; - }break; - case TXTI_TokenKind_Symbol: - { - ender_found = (byte != '~' && byte != '!' && - byte != '%' && byte != '^' && - byte != '&' && byte != '*' && - byte != '(' && byte != ')' && - byte != '-' && byte != '=' && - byte != '+' && byte != '[' && - byte != ']' && byte != '{' && - byte != '}' && byte != ':' && - byte != ';' && byte != ',' && - byte != '.' && byte != '<' && - byte != '>' && byte != '/' && - byte != '?' && byte != '|'); - }break; - case TXTI_TokenKind_Comment: - { - if(comment_is_single_line) - { - ender_found = (!escaped && (byte == '\r' || byte == '\n')); - } - else - { - ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/'); - ender_pad += 2; - } - }break; - case TXTI_TokenKind_Meta: - { - ender_found = (!escaped && (byte == '\r' || byte == '\n')); - }break; - } - } - - // rjf: next byte is ender => emit token - if(ender_found) - { - TXTI_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; - active_token_kind = TXTI_TokenKind_Null; - - // rjf: identifier -> keyword in special cases - if(token.kind == TXTI_TokenKind_Identifier) - { - read_only local_persist String8 cpp_keywords[] = - { - str8_lit_comp("alignas"), - str8_lit_comp("alignof"), - str8_lit_comp("and"), - str8_lit_comp("and_eq"), - str8_lit_comp("asm"), - str8_lit_comp("atomic_cancel"), - str8_lit_comp("atomic_commit"), - str8_lit_comp("atomic_noexcept"), - str8_lit_comp("auto"), - str8_lit_comp("bitand"), - str8_lit_comp("bitor"), - str8_lit_comp("bool"), - str8_lit_comp("break"), - str8_lit_comp("case"), - str8_lit_comp("catch"), - str8_lit_comp("char"), - str8_lit_comp("char8_t"), - str8_lit_comp("char16_t"), - str8_lit_comp("char32_t"), - str8_lit_comp("class"), - str8_lit_comp("compl"), - str8_lit_comp("concept"), - str8_lit_comp("const"), - str8_lit_comp("consteval"), - str8_lit_comp("constexpr"), - str8_lit_comp("constinit"), - str8_lit_comp("const_cast"), - str8_lit_comp("continue"), - str8_lit_comp("co_await"), - str8_lit_comp("co_return"), - str8_lit_comp("co_yield"), - str8_lit_comp("decltype"), - str8_lit_comp("default"), - str8_lit_comp("delete"), - str8_lit_comp("do"), - str8_lit_comp("double"), - str8_lit_comp("dynamic_cast"), - str8_lit_comp("else"), - str8_lit_comp("enum"), - str8_lit_comp("explicit"), - str8_lit_comp("export"), - str8_lit_comp("extern"), - str8_lit_comp("false"), - str8_lit_comp("float"), - str8_lit_comp("for"), - str8_lit_comp("friend"), - str8_lit_comp("goto"), - str8_lit_comp("if"), - str8_lit_comp("inline"), - str8_lit_comp("int"), - str8_lit_comp("long"), - str8_lit_comp("mutable"), - str8_lit_comp("namespace"), - str8_lit_comp("new"), - str8_lit_comp("noexcept"), - str8_lit_comp("not"), - str8_lit_comp("not_eq"), - str8_lit_comp("nullptr"), - str8_lit_comp("operator"), - str8_lit_comp("or"), - str8_lit_comp("or_eq"), - str8_lit_comp("private"), - str8_lit_comp("protected"), - str8_lit_comp("public"), - str8_lit_comp("reflexpr"), - str8_lit_comp("register"), - str8_lit_comp("reinterpret_cast"), - str8_lit_comp("requires"), - str8_lit_comp("return"), - str8_lit_comp("short"), - str8_lit_comp("signed"), - str8_lit_comp("sizeof"), - str8_lit_comp("static"), - str8_lit_comp("static_assert"), - str8_lit_comp("static_cast"), - str8_lit_comp("struct"), - str8_lit_comp("switch"), - str8_lit_comp("synchronized"), - str8_lit_comp("template"), - str8_lit_comp("this"), - str8_lit_comp("thread_local"), - str8_lit_comp("throw"), - str8_lit_comp("true"), - str8_lit_comp("try"), - str8_lit_comp("typedef"), - str8_lit_comp("typeid"), - str8_lit_comp("typename"), - str8_lit_comp("union"), - str8_lit_comp("unsigned"), - str8_lit_comp("using"), - str8_lit_comp("virtual"), - str8_lit_comp("void"), - str8_lit_comp("volatile"), - str8_lit_comp("wchar_t"), - str8_lit_comp("while"), - str8_lit_comp("xor"), - str8_lit_comp("xor_eq"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 keyword_idx = 0; keyword_idx < ArrayCount(cpp_keywords); keyword_idx += 1) - { - if(str8_match(cpp_keywords[keyword_idx], token_string, 0)) - { - token.kind = TXTI_TokenKind_Keyword; - break; - } - } - } - - // rjf: push - txti_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - - // rjf: increment by ender padding - idx += ender_pad; - } - - // rjf: advance by 1 byte if we haven't found an ender - if(!ender_found) - { - idx += 1; - } - escaped = next_escaped; - } - } - - //- rjf: token list -> token array - TXTI_TokenArray result = txti_token_array_from_chunk_list(arena, &tokens); - scratch_end(scratch); - return result; -} - //////////////////////////////// //~ rjf: Message Type Functions @@ -607,7 +258,7 @@ txti_slice_from_handle_line_range(Arena *arena, TXTI_Handle handle, Rng1S64 line result.line_count = (U64)dim_1s64(line_range_clamped)+1; result.line_text = push_array(arena, String8, result.line_count); result.line_ranges = push_array(arena, Rng1U64, result.line_count); - result.line_tokens = push_array(arena, TXTI_TokenArray, result.line_count); + result.line_tokens = push_array(arena, TXT_TokenArray, result.line_count); // rjf: fill line ranges & text U64 line_slice_idx = 0; @@ -626,7 +277,7 @@ txti_slice_from_handle_line_range(Arena *arena, TXTI_Handle handle, Rng1S64 line } // rjf: binary search to find first token - TXTI_Token *tokens_first = 0; + TXT_Token *tokens_first = 0; ProfScope("binary search to find first token") { Rng1U64 slice_range = r1u64(result.line_ranges[0].min, result.line_ranges[result.line_count-1].max); @@ -639,7 +290,7 @@ txti_slice_from_handle_line_range(Arena *arena, TXTI_Handle handle, Rng1S64 line { break; } - TXTI_Token *mid_token = &buffer->tokens.v[mid_idx]; + TXT_Token *mid_token = &buffer->tokens.v[mid_idx]; if(mid_token->range.min > slice_range.max) { opl_idx = mid_idx; @@ -661,18 +312,18 @@ txti_slice_from_handle_line_range(Arena *arena, TXTI_Handle handle, Rng1S64 line } // rjf: grab per-line tokens - TXTI_TokenList *line_tokens_lists = push_array(scratch.arena, TXTI_TokenList, result.line_count); + TXT_TokenList *line_tokens_lists = push_array(scratch.arena, TXT_TokenList, result.line_count); if(tokens_first != 0) ProfScope("grab per-line tokens") { - TXTI_Token *tokens_opl = buffer->tokens.v+buffer->tokens.count; + TXT_Token *tokens_opl = buffer->tokens.v+buffer->tokens.count; U64 line_slice_idx = 0; - for(TXTI_Token *token = tokens_first; token < tokens_opl && line_slice_idx < result.line_count;) + for(TXT_Token *token = tokens_first; token < tokens_opl && line_slice_idx < result.line_count;) { if(token->range.min < result.line_ranges[line_slice_idx].max) { if(token->range.max > result.line_ranges[line_slice_idx].min) { - txti_token_list_push(scratch.arena, &line_tokens_lists[line_slice_idx], token); + txt_token_list_push(scratch.arena, &line_tokens_lists[line_slice_idx], token); } B32 need_token_advance = 0; B32 need_line_advance = 0; @@ -697,7 +348,7 @@ txti_slice_from_handle_line_range(Arena *arena, TXTI_Handle handle, Rng1S64 line // rjf: bake per-line tokens to arrays for(U64 line_slice_idx = 0; line_slice_idx < result.line_count; line_slice_idx += 1) { - result.line_tokens[line_slice_idx] = txti_token_array_from_list(arena, &line_tokens_lists[line_slice_idx]); + result.line_tokens[line_slice_idx] = txt_token_array_from_list(arena, &line_tokens_lists[line_slice_idx]); } } } @@ -733,8 +384,8 @@ txti_string_from_handle_txt_rng(Arena *arena, TXTI_Handle handle, TxtRng range) switch(info.line_end_kind) { default: - case TXTI_LineEndKind_LF:{join.sep = str8_lit("\n");}break; - case TXTI_LineEndKind_CRLF:{join.sep = str8_lit("\r\n");}break; + case TXT_LineEndKind_LF:{join.sep = str8_lit("\n");}break; + case TXT_LineEndKind_CRLF:{join.sep = str8_lit("\r\n");}break; } result = str8_list_join(arena, &line_strings, &join); } @@ -755,18 +406,18 @@ txti_string_from_handle_line_num(Arena *arena, TXTI_Handle handle, S64 line_num) } internal Rng1U64 -txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXTI_TokenArray *line_tokens) +txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens) { Rng1U64 result = {0}; Temp scratch = scratch_begin(0, 0); { // rjf: unpack line info - TXTI_Token *line_tokens_first = line_tokens->v; - TXTI_Token *line_tokens_opl = line_tokens->v+line_tokens->count; + TXT_Token *line_tokens_first = line_tokens->v; + TXT_Token *line_tokens_opl = line_tokens->v+line_tokens->count; // rjf: find token containing `off` - TXTI_Token *pt_token = 0; - for(TXTI_Token *token = line_tokens_first; + TXT_Token *pt_token = 0; + for(TXT_Token *token = line_tokens_first; token < line_tokens_opl; token += 1) { @@ -778,14 +429,14 @@ txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, S switch(token->kind) { default:{}break; - case TXTI_TokenKind_Symbol: + case TXT_TokenKind_Symbol: { token_ender = (str8_match(token_string, str8_lit("]"), 0)); }break; - case TXTI_TokenKind_Identifier: - case TXTI_TokenKind_Keyword: - case TXTI_TokenKind_String: - case TXTI_TokenKind_Meta: + case TXT_TokenKind_Identifier: + case TXT_TokenKind_Keyword: + case TXT_TokenKind_String: + case TXT_TokenKind_Meta: { token_ender = 1; }break; @@ -809,7 +460,7 @@ txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, S { B32 walkback_done = 0; S32 nest = 0; - for(TXTI_Token *wb_token = pt_token; + for(TXT_Token *wb_token = pt_token; wb_token >= line_tokens_first && walkback_done == 0; wb_token -= 1) { @@ -819,7 +470,7 @@ txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, S switch(wb_token->kind) { default:{}break; - case TXTI_TokenKind_Symbol: + case TXT_TokenKind_Symbol: { B32 is_scope_resolution = str8_match(wb_token_string, str8_lit("::"), 0); B32 is_dot = str8_match(wb_token_string, str8_lit("."), 0); @@ -837,7 +488,7 @@ txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, S include_wb_token = 1; } }break; - case TXTI_TokenKind_Identifier: + case TXT_TokenKind_Identifier: { include_wb_token = 1; }break; @@ -868,9 +519,9 @@ txti_expr_range_from_handle_pt(TXTI_Handle handle, TxtPt pt) // rjf: unpack line info String8 line_text = slice.line_text[0]; Rng1U64 line_range = slice.line_ranges[0]; - TXTI_TokenArray line_tokens = slice.line_tokens[0]; - TXTI_Token *line_tokens_first = line_tokens.v; - TXTI_Token *line_tokens_opl = line_tokens.v+line_tokens.count; + TXT_TokenArray line_tokens = slice.line_tokens[0]; + TXT_Token *line_tokens_first = line_tokens.v; + TXT_Token *line_tokens_opl = line_tokens.v+line_tokens.count; U64 pt_off = line_range.min + (pt.column-1); // rjf: grab offset range of expression @@ -1002,12 +653,12 @@ txti_mut_thread_entry_point(void *p) case TXTI_LangKind_C: case TXTI_LangKind_CPlusPlus: { - lex_function = txti_token_array_from_string__cpp; + lex_function = txt_token_array_from_string__c_cpp; }break; } //- rjf: detect line end kind - TXTI_LineEndKind line_end_kind = TXTI_LineEndKind_Null; + TXT_LineEndKind line_end_kind = TXT_LineEndKind_Null; if(load_valid) { U64 lf_count = 0; @@ -1025,11 +676,11 @@ txti_mut_thread_entry_point(void *p) } if(cr_count >= lf_count/2 && lf_count >= 1) { - line_end_kind = TXTI_LineEndKind_CRLF; + line_end_kind = TXT_LineEndKind_CRLF; } else if(lf_count >= 1) { - line_end_kind = TXTI_LineEndKind_LF; + line_end_kind = TXT_LineEndKind_LF; } } @@ -1084,7 +735,7 @@ txti_mut_thread_entry_point(void *p) if(entity != 0) { entity->buffer_apply_gen += 1; - if(line_end_kind != TXTI_LineEndKind_Null) + if(line_end_kind != TXT_LineEndKind_Null) { entity->line_end_kind = line_end_kind; } diff --git a/src/txti/txti.h b/src/txti/txti.h index c43b3b27..18df67e3 100644 --- a/src/txti/txti.h +++ b/src/txti/txti.h @@ -56,88 +56,6 @@ struct TXTI_Handle U64 u64[2]; }; -//////////////////////////////// -//~ rjf: Parsed Text Info Types - -typedef enum TXTI_LineEndKind -{ - TXTI_LineEndKind_Null, - TXTI_LineEndKind_LF, - TXTI_LineEndKind_CRLF, - TXTI_LineEndKind_COUNT -} -TXTI_LineEndKind; - -typedef enum TXTI_TokenKind -{ - TXTI_TokenKind_Null, - TXTI_TokenKind_Error, - TXTI_TokenKind_Whitespace, - TXTI_TokenKind_Keyword, - TXTI_TokenKind_Identifier, - TXTI_TokenKind_Numeric, - TXTI_TokenKind_String, - TXTI_TokenKind_Symbol, - TXTI_TokenKind_Comment, - TXTI_TokenKind_Meta, // preprocessor, etc. - TXTI_TokenKind_COUNT -} -TXTI_TokenKind; - -typedef struct TXTI_Token TXTI_Token; -struct TXTI_Token -{ - TXTI_TokenKind kind; - Rng1U64 range; -}; - -typedef struct TXTI_TokenChunkNode TXTI_TokenChunkNode; -struct TXTI_TokenChunkNode -{ - TXTI_TokenChunkNode *next; - U64 count; - U64 cap; - TXTI_Token *v; -}; - -typedef struct TXTI_TokenChunkList TXTI_TokenChunkList; -struct TXTI_TokenChunkList -{ - TXTI_TokenChunkNode *first; - TXTI_TokenChunkNode *last; - U64 chunk_count; - U64 token_count; -}; - -typedef struct TXTI_TokenNode TXTI_TokenNode; -struct TXTI_TokenNode -{ - TXTI_TokenNode *next; - TXTI_Token v; -}; - -typedef struct TXTI_TokenList TXTI_TokenList; -struct TXTI_TokenList -{ - TXTI_TokenNode *first; - TXTI_TokenNode *last; - U64 count; -}; - -typedef struct TXTI_TokenArray TXTI_TokenArray; -struct TXTI_TokenArray -{ - U64 count; - TXTI_Token *v; -}; - -typedef struct TXTI_TokenArrayArray TXTI_TokenArrayArray; -struct TXTI_TokenArrayArray -{ - U64 count; - TXTI_TokenArray *v; -}; - //////////////////////////////// //~ rjf: Language Kinds @@ -150,7 +68,7 @@ typedef enum TXTI_LangKind } TXTI_LangKind; -typedef TXTI_TokenArray TXTI_LangLexFunctionType(Arena *arena, U64 *bytes_processed_counter, String8 string); +typedef TXT_TokenArray TXTI_LangLexFunctionType(Arena *arena, U64 *bytes_processed_counter, String8 string); //////////////////////////////// //~ rjf: Buffer Entity Types @@ -173,7 +91,7 @@ struct TXTI_Buffer U64 lines_max_size; // rjf: tokens - TXTI_TokenArray tokens; + TXT_TokenArray tokens; }; typedef struct TXTI_Entity TXTI_Entity; @@ -187,7 +105,7 @@ struct TXTI_Entity U64 mut_gen; // rjf: metadata - TXTI_LineEndKind line_end_kind; + TXT_LineEndKind line_end_kind; TXTI_LangKind lang_kind; U64 bytes_processed; U64 bytes_to_process; @@ -238,7 +156,7 @@ struct TXTI_BufferInfo { String8 path; U64 timestamp; - TXTI_LineEndKind line_end_kind; + TXT_LineEndKind line_end_kind; TXTI_LangKind lang_kind; U64 total_line_count; U64 last_line_size; @@ -255,7 +173,7 @@ struct TXTI_Slice U64 line_count; String8 *line_text; Rng1U64 *line_ranges; - TXTI_TokenArray *line_tokens; + TXT_TokenArray *line_tokens; }; //////////////////////////////// @@ -342,19 +260,6 @@ internal void txti_init(void); internal U64 txti_hash_from_string(String8 string); internal TXTI_LangKind txti_lang_kind_from_extension(String8 extension); -//////////////////////////////// -//~ rjf: Token Type Functions - -internal void txti_token_chunk_list_push(Arena *arena, TXTI_TokenChunkList *list, U64 cap, TXTI_Token *token); -internal void txti_token_list_push(Arena *arena, TXTI_TokenList *list, TXTI_Token *token); -internal TXTI_TokenArray txti_token_array_from_chunk_list(Arena *arena, TXTI_TokenChunkList *list); -internal TXTI_TokenArray txti_token_array_from_list(Arena *arena, TXTI_TokenList *list); - -//////////////////////////////// -//~ rjf: Lexing Functions - -internal TXTI_TokenArray txti_token_array_from_string__cpp(Arena *arena, U64 *bytes_processed_counter, String8 string); - //////////////////////////////// //~ rjf: Message Type Functions @@ -373,7 +278,7 @@ internal TXTI_BufferInfo txti_buffer_info_from_handle(Arena *arena, TXTI_Handle internal TXTI_Slice txti_slice_from_handle_line_range(Arena *arena, TXTI_Handle handle, Rng1S64 line_range); internal String8 txti_string_from_handle_txt_rng(Arena *arena, TXTI_Handle handle, TxtRng range); internal String8 txti_string_from_handle_line_num(Arena *arena, TXTI_Handle handle, S64 line_num); -internal Rng1U64 txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXTI_TokenArray *line_tokens); +internal Rng1U64 txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens); internal TxtRng txti_expr_range_from_handle_pt(TXTI_Handle handle, TxtPt pt); //- rjf: buffer mutations From ca6e75d46616748b2d7ec9930d3887e11d0e2180 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 10:42:46 -0700 Subject: [PATCH 220/275] allow c++14 digit separators in c/c++ lexing --- src/text_cache/text_cache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index fba7eefa..0a0363a7 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -195,7 +195,7 @@ txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, S }break; case TXT_TokenKind_Numeric: { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.'); + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); }break; case TXT_TokenKind_String: { From 4bc82db69eed8b563ab4ea5f4a86e56bb783d128 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 11:00:17 -0700 Subject: [PATCH 221/275] deduplicate txti/text_cache language stuff; port over odin lexing --- src/text_cache/text_cache.c | 257 ++++++++++++++++++++++++++++++++++-- src/text_cache/text_cache.h | 24 ++-- src/txti/txti.c | 42 +----- src/txti/txti.h | 19 +-- 4 files changed, 268 insertions(+), 74 deletions(-) diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 0a0363a7..894670c1 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -26,9 +26,27 @@ txt_lang_kind_from_extension(String8 extension) { kind = TXT_LangKind_CPlusPlus; } + else if(str8_match(extension, str8_lit("odin"), StringMatchFlag_CaseInsensitive)) + { + kind = TXT_LangKind_Odin; + } return kind; } +internal TXT_LangLexFunctionType * +txt_lex_function_from_lang_kind(TXT_LangKind kind) +{ + TXT_LangLexFunctionType *fn = 0; + switch(kind) + { + default:{}break; + case TXT_LangKind_C: {fn = txt_token_array_from_string__c_cpp;}break; + case TXT_LangKind_CPlusPlus: {fn = txt_token_array_from_string__c_cpp;}break; + case TXT_LangKind_Odin: {fn = txt_token_array_from_string__odin;}break; + } + return fn; +} + //////////////////////////////// //~ rjf: Token Type Functions @@ -378,6 +396,234 @@ txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, S return result; } +internal TXT_TokenArray +txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: generate token list + TXT_TokenChunkList tokens = {0}; + { + B32 comment_is_single_line = 0; + B32 string_is_char = 0; + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; + U64 active_token_start_idx = 0; + B32 escaped = 0; + B32 next_escaped = 0; + U64 byte_process_start_idx = 0; + for(U64 idx = 0; idx <= string.size;) + { + U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; + U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; + + // rjf: update counter + if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) + { + ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); + byte_process_start_idx = idx; + } + + // rjf: escaping + if(escaped && (byte != '\r' && byte != '\n')) + { + next_escaped = 0; + } + else if(!escaped && byte == '\\') + { + next_escaped = 1; + } + + // rjf: take starter, determine active token kind + if(active_token_kind == TXT_TokenKind_Null) + { + // rjf: use next bytes to start a new token + if(0){} + else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } + else if(byte == '_' || + byte == '$' || + char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } + else if(char_is_digit(byte, 10) || + (byte == '.' && + char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } + else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } + else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } + else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; } + else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; } + else if(byte == '~' || byte == '!' || + byte == '%' || byte == '^' || + byte == '&' || byte == '*' || + byte == '(' || byte == ')' || + byte == '-' || byte == '=' || + byte == '+' || byte == '[' || + byte == ']' || byte == '{' || + byte == '}' || byte == ':' || + byte == ';' || byte == ',' || + byte == '.' || byte == '<' || + byte == '>' || byte == '/' || + byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } + else if(byte == '#') { active_token_kind = TXT_TokenKind_Meta; } + + // rjf: start new token + if(active_token_kind != TXT_TokenKind_Null) + { + active_token_start_idx = idx; + } + + // rjf: invalid token kind -> emit error + else + { + TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + + // rjf: look for ender + U64 ender_pad = 0; + B32 ender_found = 0; + if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) + { + if(idx == string.size) + { + ender_pad = 0; + ender_found = 1; + } + else switch(active_token_kind) + { + default:break; + case TXT_TokenKind_Whitespace: + { + ender_found = !char_is_space(byte); + }break; + case TXT_TokenKind_Identifier: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); + }break; + case TXT_TokenKind_Numeric: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); + }break; + case TXT_TokenKind_String: + { + ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); + ender_pad += 1; + }break; + case TXT_TokenKind_Symbol: + { + ender_found = (byte != '~' && byte != '!' && + byte != '%' && byte != '^' && + byte != '&' && byte != '*' && + byte != '(' && byte != ')' && + byte != '-' && byte != '=' && + byte != '+' && byte != '[' && + byte != ']' && byte != '{' && + byte != '}' && byte != ':' && + byte != ';' && byte != ',' && + byte != '.' && byte != '<' && + byte != '>' && byte != '/' && + byte != '?' && byte != '|'); + }break; + case TXT_TokenKind_Comment: + { + if(comment_is_single_line) + { + ender_found = (!escaped && (byte == '\r' || byte == '\n')); + } + else + { + ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/'); + ender_pad += 2; + } + }break; + case TXT_TokenKind_Meta: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); + }break; + } + } + + // rjf: next byte is ender => emit token + if(ender_found) + { + TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; + active_token_kind = TXT_TokenKind_Null; + + // rjf: identifier -> keyword in special cases + if(token.kind == TXT_TokenKind_Identifier) + { + read_only local_persist String8 odin_keywords[] = + { + str8_lit_comp("asm"), + str8_lit_comp("auto_cast"), + str8_lit_comp("bit_set"), + str8_lit_comp("break"), + str8_lit_comp("case"), + str8_lit_comp("cast"), + str8_lit_comp("context"), + str8_lit_comp("continue"), + str8_lit_comp("defer"), + str8_lit_comp("distinct"), + str8_lit_comp("do"), + str8_lit_comp("dynamic"), + str8_lit_comp("else"), + str8_lit_comp("enum"), + str8_lit_comp("fallthrough"), + str8_lit_comp("for"), + str8_lit_comp("foreign"), + str8_lit_comp("if"), + str8_lit_comp("in"), + str8_lit_comp("map"), + str8_lit_comp("matrix"), + str8_lit_comp("not_in"), + str8_lit_comp("or_break"), + str8_lit_comp("or_continue"), + str8_lit_comp("or_else"), + str8_lit_comp("or_return"), + str8_lit_comp("package"), + str8_lit_comp("proc"), + str8_lit_comp("return"), + str8_lit_comp("struct"), + str8_lit_comp("switch"), + str8_lit_comp("transmute"), + str8_lit_comp("typeid"), + str8_lit_comp("union"), + str8_lit_comp("using"), + str8_lit_comp("when"), + str8_lit_comp("where"), + str8_lit_comp("import"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 keyword_idx = 0; keyword_idx < ArrayCount(odin_keywords); keyword_idx += 1) + { + if(str8_match(odin_keywords[keyword_idx], token_string, 0)) + { + token.kind = TXT_TokenKind_Keyword; + break; + } + } + } + + // rjf: push + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + + // rjf: increment by ender padding + idx += ender_pad; + } + + // rjf: advance by 1 byte if we haven't found an ender + if(!ender_found) + { + idx += 1; + } + escaped = next_escaped; + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Main Layer Initialization @@ -784,16 +1030,7 @@ txt_parse_thread__entry_point(void *p) } //- rjf: lang -> lex function - TXT_LangLexFunctionType *lex_function = 0; - switch(lang) - { - default:{}break; - case TXT_LangKind_C: - case TXT_LangKind_CPlusPlus: - { - lex_function = txt_token_array_from_string__c_cpp; - }break; - } + TXT_LangLexFunctionType *lex_function = txt_lex_function_from_lang_kind(lang); //- rjf: lex function * data -> tokens TXT_TokenArray tokens = {0}; diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index 3bced5bb..74437762 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -32,15 +32,6 @@ typedef enum TXT_TokenKind } TXT_TokenKind; -typedef enum TXT_LangKind -{ - TXT_LangKind_Null, - TXT_LangKind_C, - TXT_LangKind_CPlusPlus, - TXT_LangKind_COUNT -} -TXT_LangKind; - typedef struct TXT_Token TXT_Token; struct TXT_Token { @@ -105,6 +96,19 @@ struct TXT_TextInfo TXT_TokenArray tokens; }; +//////////////////////////////// +//~ rjf: Language Kind Types + +typedef enum TXT_LangKind +{ + TXT_LangKind_Null, + TXT_LangKind_C, + TXT_LangKind_CPlusPlus, + TXT_LangKind_Odin, + TXT_LangKind_COUNT +} +TXT_LangKind; + typedef TXT_TokenArray TXT_LangLexFunctionType(Arena *arena, U64 *bytes_processed_counter, String8 string); //////////////////////////////// @@ -234,6 +238,7 @@ global TXT_Shared *txt_shared = 0; //~ rjf: Basic Helpers internal TXT_LangKind txt_lang_kind_from_extension(String8 extension); +internal TXT_LangLexFunctionType *txt_lex_function_from_lang_kind(TXT_LangKind kind); //////////////////////////////// //~ rjf: Token Type Functions @@ -247,6 +252,7 @@ internal TXT_TokenArray txt_token_array_from_list(Arena *arena, TXT_TokenList *l //~ rjf: Lexing Functions internal TXT_TokenArray txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string); +internal TXT_TokenArray txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string); //////////////////////////////// //~ rjf: Main Layer Initialization diff --git a/src/txti/txti.c b/src/txti/txti.c index d58e0fc4..9fc4cf06 100644 --- a/src/txti/txti.c +++ b/src/txti/txti.c @@ -47,31 +47,6 @@ txti_hash_from_string(String8 string) return result; } -internal TXTI_LangKind -txti_lang_kind_from_extension(String8 extension) -{ - TXTI_LangKind kind = TXTI_LangKind_Null; - if(str8_match(extension, str8_lit("c"), 0) || - str8_match(extension, str8_lit("h"), 0)) - { - kind = TXTI_LangKind_C; - } - else if(str8_match(extension, str8_lit("cpp"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cxx"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cc"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("c++"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("C"), 0) || - str8_match(extension, str8_lit("hpp"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("hxx"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("hh"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("h++"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("H"), 0)) - { - kind = TXTI_LangKind_CPlusPlus; - } - return kind; -} - //////////////////////////////// //~ rjf: Message Type Functions @@ -628,14 +603,14 @@ txti_mut_thread_entry_point(void *p) //- rjf: load file if we need it B32 load_valid = 0; String8 file_contents = {0}; - TXTI_LangKind lang_kind = TXTI_LangKind_Null; + TXT_LangKind lang_kind = TXT_LangKind_Null; U64 timestamp = 0; if(msg->kind == TXTI_MsgKind_Reload) ProfScope("reload file") { FileProperties pre_load_props = os_properties_from_file_path(msg->string); OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, msg->string); file_contents = os_string_from_file_range(scratch.arena, file, r1u64(0, pre_load_props.size)); - lang_kind = txti_lang_kind_from_extension(str8_skip_last_dot(msg->string)); + lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(msg->string)); os_file_close(file); FileProperties post_load_props = os_properties_from_file_path(msg->string); load_valid = (post_load_props.modified == pre_load_props.modified); @@ -646,16 +621,7 @@ txti_mut_thread_entry_point(void *p) } //- rjf: nonzero lang kind -> unpack lang info - TXTI_LangLexFunctionType *lex_function = 0; - switch(lang_kind) - { - default:{}break; - case TXTI_LangKind_C: - case TXTI_LangKind_CPlusPlus: - { - lex_function = txt_token_array_from_string__c_cpp; - }break; - } + TXT_LangLexFunctionType *lex_function = txt_lex_function_from_lang_kind(lang_kind); //- rjf: detect line end kind TXT_LineEndKind line_end_kind = TXT_LineEndKind_Null; @@ -739,7 +705,7 @@ txti_mut_thread_entry_point(void *p) { entity->line_end_kind = line_end_kind; } - if(lang_kind != TXTI_LangKind_Null) + if(lang_kind != TXT_LangKind_Null) { entity->lang_kind = lang_kind; } diff --git a/src/txti/txti.h b/src/txti/txti.h index 18df67e3..48b1844b 100644 --- a/src/txti/txti.h +++ b/src/txti/txti.h @@ -56,20 +56,6 @@ struct TXTI_Handle U64 u64[2]; }; -//////////////////////////////// -//~ rjf: Language Kinds - -typedef enum TXTI_LangKind -{ - TXTI_LangKind_Null, - TXTI_LangKind_C, - TXTI_LangKind_CPlusPlus, - TXTI_LangKind_COUNT -} -TXTI_LangKind; - -typedef TXT_TokenArray TXTI_LangLexFunctionType(Arena *arena, U64 *bytes_processed_counter, String8 string); - //////////////////////////////// //~ rjf: Buffer Entity Types @@ -106,7 +92,7 @@ struct TXTI_Entity // rjf: metadata TXT_LineEndKind line_end_kind; - TXTI_LangKind lang_kind; + TXT_LangKind lang_kind; U64 bytes_processed; U64 bytes_to_process; U64 working_count; @@ -157,7 +143,7 @@ struct TXTI_BufferInfo String8 path; U64 timestamp; TXT_LineEndKind line_end_kind; - TXTI_LangKind lang_kind; + TXT_LangKind lang_kind; U64 total_line_count; U64 last_line_size; U64 max_line_size; @@ -258,7 +244,6 @@ internal void txti_init(void); //~ rjf: Basic Helpers internal U64 txti_hash_from_string(String8 string); -internal TXTI_LangKind txti_lang_kind_from_extension(String8 extension); //////////////////////////////// //~ rjf: Message Type Functions From 3e911a8c64466116c5b7362e517c6e18a5a5bbf5 Mon Sep 17 00:00:00 2001 From: righthandprincess Date: Mon, 29 Jan 2024 22:22:48 -0600 Subject: [PATCH 222/275] Improve disabled overlay Disabled overlay now respects the theme background color, as well as the theme inactive overlay color, improving readability across themes. --- src/df/gfx/df_gfx.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index bb2d11d1..af144a02 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6624,7 +6624,22 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D // rjf: disabled overlay if(b->disabled_t >= 0.005f) { - R_Rect2DInst *inst = d_rect(b->rect, v4f32(0, 0, 0, 0.5f*b->disabled_t), 0, 0, 1); + // rhp: disabled overlay color blends from plain background and inactive panel overlay + Vec4F32 bg = df_rgba_from_theme_color(DF_ThemeColor_PlainBackground); + Vec4F32 ov = df_rgba_from_theme_color(DF_ThemeColor_InactivePanelOverlay); + Vec4F32 color = {}; + color.x = bg.x * bg.w + ov.x * ov.w * (1.0f - bg.w); + color.y = bg.y * bg.w + ov.y * ov.w * (1.0f - bg.w); + color.z = bg.z * bg.w + ov.z * ov.w * (1.0f - bg.w); + color.w = bg.w + ov.w * (1.0f - bg.w); + if (1.0f - color.w < 0.01f) + { + color.x *= color.w; + color.y *= color.w; + color.z *= color.w; + } + color.w = 0.60f * b->disabled_t; + R_Rect2DInst *inst = d_rect(b->rect, color, 0, 0, 1); MemoryCopyArray(inst->corner_radii, b->corner_radii); } From 4027338a2f9c0fec6d00ea90a4120da97b7126bb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 11:30:47 -0700 Subject: [PATCH 223/275] adjust stripe counts --- src/dbgi/dbgi.c | 6 +++--- src/file_stream/file_stream.c | 34 ++++++++++++++++++++++++++++++- src/file_stream/file_stream.h | 8 ++++++++ src/geo_cache/geo_cache.c | 4 ++-- src/hash_store/hash_store.c | 4 ++-- src/task_system/task_system.c | 2 +- src/text_cache/text_cache.c | 4 ++-- src/texture_cache/texture_cache.c | 4 ++-- 8 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index 8746bf26..770c5da9 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -11,7 +11,7 @@ dbgi_init(void) dbgi_shared = push_array(arena, DBGI_Shared, 1); dbgi_shared->arena = arena; dbgi_shared->force_slots_count = 1024; - dbgi_shared->force_stripes_count = 64; + dbgi_shared->force_stripes_count = Min(dbgi_shared->force_slots_count, os_logical_core_count()); dbgi_shared->force_slots = push_array(arena, DBGI_ForceSlot, dbgi_shared->force_slots_count); dbgi_shared->force_stripes = push_array(arena, DBGI_ForceStripe, dbgi_shared->force_stripes_count); for(U64 idx = 0; idx < dbgi_shared->force_stripes_count; idx += 1) @@ -21,7 +21,7 @@ dbgi_init(void) dbgi_shared->force_stripes[idx].cv = os_condition_variable_alloc(); } dbgi_shared->binary_slots_count = 1024; - dbgi_shared->binary_stripes_count = 64; + dbgi_shared->binary_stripes_count = Min(dbgi_shared->binary_slots_count, os_logical_core_count()); dbgi_shared->binary_slots = push_array(arena, DBGI_BinarySlot, dbgi_shared->binary_slots_count); dbgi_shared->binary_stripes = push_array(arena, DBGI_BinaryStripe, dbgi_shared->binary_stripes_count); for(U64 idx = 0; idx < dbgi_shared->binary_stripes_count; idx += 1) @@ -31,7 +31,7 @@ dbgi_init(void) dbgi_shared->binary_stripes[idx].cv = os_condition_variable_alloc(); } dbgi_shared->fuzzy_search_slots_count = 64; - dbgi_shared->fuzzy_search_stripes_count = 8; + dbgi_shared->fuzzy_search_stripes_count = Min(dbgi_shared->fuzzy_search_slots_count, os_logical_core_count()); dbgi_shared->fuzzy_search_slots = push_array(arena, DBGI_FuzzySearchSlot, dbgi_shared->fuzzy_search_slots_count); dbgi_shared->fuzzy_search_stripes = push_array(arena, DBGI_FuzzySearchStripe, dbgi_shared->fuzzy_search_stripes_count); for(U64 idx = 0; idx < dbgi_shared->fuzzy_search_stripes_count; idx += 1) diff --git a/src/file_stream/file_stream.c b/src/file_stream/file_stream.c index ddfa92ed..cc6f025d 100644 --- a/src/file_stream/file_stream.c +++ b/src/file_stream/file_stream.c @@ -11,7 +11,7 @@ fs_init(void) fs_shared = push_array(arena, FS_Shared, 1); fs_shared->arena = arena; fs_shared->slots_count = 1024; - fs_shared->stripes_count = 64; + fs_shared->stripes_count = os_logical_core_count(); fs_shared->slots = push_array(arena, FS_Slot, fs_shared->slots_count); fs_shared->stripes = push_array(arena, FS_Stripe, fs_shared->stripes_count); for(U64 idx = 0; idx < fs_shared->stripes_count; idx += 1) @@ -30,6 +30,7 @@ fs_init(void) { fs_shared->streamers[idx] = os_launch_thread(fs_streamer_thread__entry_point, (void *)idx, 0); } + fs_shared->detector_thread = os_launch_thread(fs_detector_thread__entry_point, 0, 0); } //////////////////////////////// @@ -188,3 +189,34 @@ fs_streamer_thread__entry_point(void *p) scratch_end(scratch); } } + +//////////////////////////////// +//~ rjf: Change Detector Thread + +internal void +fs_detector_thread__entry_point(void *p) +{ + ThreadNameF("[fs] detector"); + for(;;) + { + U64 slots_per_stripe = fs_shared->slots_count/fs_shared->stripes_count; + for(U64 stripe_idx = 0; stripe_idx < fs_shared->stripes_count; stripe_idx += 1) + { + FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) for(U64 slot_in_stripe_idx = 0; slot_in_stripe_idx < slots_per_stripe; slot_in_stripe_idx += 1) + { + U64 slot_idx = stripe_idx*slots_per_stripe + slot_in_stripe_idx; + FS_Slot *slot = &fs_shared->slots[slot_idx]; + for(FS_Node *n = slot->first; n != 0; n = n->next) + { + FileProperties props = os_properties_from_file_path(n->path); + if(props.modified != n->timestamp && n->last_time_requested_us+100000 < os_now_microseconds()) + { + fs_u2s_enqueue_path(n->path, os_now_microseconds()+100000); + } + } + } + } + os_sleep_milliseconds(100); + } +} diff --git a/src/file_stream/file_stream.h b/src/file_stream/file_stream.h index 4d54a379..8ff10f43 100644 --- a/src/file_stream/file_stream.h +++ b/src/file_stream/file_stream.h @@ -56,6 +56,9 @@ struct FS_Shared // rjf: streamer threads U64 streamer_count; OS_Handle *streamers; + + // rjf: change detector threads + OS_Handle detector_thread; }; //////////////////////////////// @@ -81,4 +84,9 @@ internal String8 fs_u2s_dequeue_path(Arena *arena); internal void fs_streamer_thread__entry_point(void *p); +//////////////////////////////// +//~ rjf: Change Detector Thread + +internal void fs_detector_thread__entry_point(void *p); + #endif // FILE_STREAM_H diff --git a/src/geo_cache/geo_cache.c b/src/geo_cache/geo_cache.c index b871f951..58377510 100644 --- a/src/geo_cache/geo_cache.c +++ b/src/geo_cache/geo_cache.c @@ -11,7 +11,7 @@ geo_init(void) geo_shared = push_array(arena, GEO_Shared, 1); geo_shared->arena = arena; geo_shared->slots_count = 1024; - geo_shared->stripes_count = 64; + geo_shared->stripes_count = Min(geo_shared->slots_count, os_logical_core_count()); geo_shared->slots = push_array(arena, GEO_Slot, geo_shared->slots_count); geo_shared->stripes = push_array(arena, GEO_Stripe, geo_shared->stripes_count); geo_shared->stripes_free_nodes = push_array(arena, GEO_Node *, geo_shared->stripes_count); @@ -22,7 +22,7 @@ geo_init(void) geo_shared->stripes[idx].cv = os_condition_variable_alloc(); } geo_shared->fallback_slots_count = 1024; - geo_shared->fallback_stripes_count = 64; + geo_shared->fallback_stripes_count = Min(geo_shared->fallback_slots_count, os_logical_core_count()); geo_shared->fallback_slots = push_array(arena, GEO_KeyFallbackSlot, geo_shared->fallback_slots_count); geo_shared->fallback_stripes = push_array(arena, GEO_Stripe, geo_shared->fallback_stripes_count); for(U64 idx = 0; idx < geo_shared->fallback_stripes_count; idx += 1) diff --git a/src/hash_store/hash_store.c b/src/hash_store/hash_store.c index c80cd191..5a9570c6 100644 --- a/src/hash_store/hash_store.c +++ b/src/hash_store/hash_store.c @@ -28,7 +28,7 @@ hs_init(void) hs_shared = push_array(arena, HS_Shared, 1); hs_shared->arena = arena; hs_shared->slots_count = 4096; - hs_shared->stripes_count = 64; + hs_shared->stripes_count = Min(hs_shared->slots_count, os_logical_core_count()); hs_shared->slots = push_array(arena, HS_Slot, hs_shared->slots_count); hs_shared->stripes = push_array(arena, HS_Stripe, hs_shared->stripes_count); hs_shared->stripes_free_nodes = push_array(arena, HS_Node *, hs_shared->stripes_count); @@ -40,7 +40,7 @@ hs_init(void) stripe->cv = os_condition_variable_alloc(); } hs_shared->key_slots_count = 4096; - hs_shared->key_stripes_count = 64; + hs_shared->key_stripes_count = Min(hs_shared->key_slots_count, os_logical_core_count()); hs_shared->key_slots = push_array(arena, HS_KeySlot, hs_shared->key_slots_count); hs_shared->key_stripes = push_array(arena, HS_Stripe, hs_shared->key_stripes_count); for(U64 idx = 0; idx < hs_shared->key_stripes_count; idx += 1) diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index 07a14139..7cc6d1f6 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -27,7 +27,7 @@ ts_init(void) ts_shared = push_array(arena, TS_Shared, 1); ts_shared->arena = arena; ts_shared->artifact_slots_count = 1024; - ts_shared->artifact_stripes_count = 64; + ts_shared->artifact_stripes_count = Min(ts_shared->artifact_slots_count, os_logical_core_count()); ts_shared->artifact_slots = push_array(arena, TS_TaskArtifactSlot, ts_shared->artifact_slots_count); ts_shared->artifact_stripes = push_array(arena, TS_TaskArtifactStripe, ts_shared->artifact_stripes_count); for(U64 idx = 0; idx < ts_shared->artifact_stripes_count; idx += 1) diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 894670c1..33b40521 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -635,7 +635,7 @@ txt_init(void) txt_shared->arena = arena; txt_shared->slots_count = 1024; txt_shared->slots = push_array(arena, TXT_Slot, txt_shared->slots_count); - txt_shared->stripes_count = 64; + txt_shared->stripes_count = Min(txt_shared->slots_count, os_logical_core_count()); txt_shared->stripes = push_array(arena, TXT_Stripe, txt_shared->stripes_count); txt_shared->stripes_free_nodes = push_array(arena, TXT_Node *, txt_shared->stripes_count); for(U64 idx = 0; idx < txt_shared->stripes_count; idx += 1) @@ -645,7 +645,7 @@ txt_init(void) txt_shared->stripes[idx].cv = os_condition_variable_alloc(); } txt_shared->fallback_slots_count = 256; - txt_shared->fallback_stripes_count = 16; + txt_shared->fallback_stripes_count = Min(txt_shared->fallback_slots_count, os_logical_core_count()); txt_shared->fallback_slots = push_array(arena, TXT_KeyFallbackSlot, txt_shared->fallback_slots_count); txt_shared->fallback_stripes = push_array(arena, TXT_Stripe, txt_shared->fallback_stripes_count); for(U64 idx = 0; idx < txt_shared->fallback_stripes_count; idx += 1) diff --git a/src/texture_cache/texture_cache.c b/src/texture_cache/texture_cache.c index e2897228..9ef652e8 100644 --- a/src/texture_cache/texture_cache.c +++ b/src/texture_cache/texture_cache.c @@ -24,7 +24,7 @@ tex_init(void) tex_shared = push_array(arena, TEX_Shared, 1); tex_shared->arena = arena; tex_shared->slots_count = 1024; - tex_shared->stripes_count = 64; + tex_shared->stripes_count = Min(tex_shared->slots_count, os_logical_core_count()); tex_shared->slots = push_array(arena, TEX_Slot, tex_shared->slots_count); tex_shared->stripes = push_array(arena, TEX_Stripe, tex_shared->stripes_count); tex_shared->stripes_free_nodes = push_array(arena, TEX_Node *, tex_shared->stripes_count); @@ -35,7 +35,7 @@ tex_init(void) tex_shared->stripes[idx].cv = os_condition_variable_alloc(); } tex_shared->fallback_slots_count = 1024; - tex_shared->fallback_stripes_count = 64; + tex_shared->fallback_stripes_count = Min(tex_shared->fallback_slots_count, os_logical_core_count()); tex_shared->fallback_slots = push_array(arena, TEX_KeyFallbackSlot, tex_shared->fallback_slots_count); tex_shared->fallback_stripes = push_array(arena, TEX_Stripe, tex_shared->fallback_stripes_count); for(U64 idx = 0; idx < tex_shared->fallback_stripes_count; idx += 1) From 7cf8da0b4381a4cea66ef7ebb2d1f92b42416633 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 11:50:44 -0700 Subject: [PATCH 224/275] eliminate fallback key/hash pair cache in texture cache layer; we can rely on rewinding purely via the hash store layer --- src/df/gfx/df_view_rule_hooks.c | 16 ++++- src/df/gfx/df_views.c | 14 ++-- src/texture_cache/texture_cache.c | 103 ++++++------------------------ src/texture_cache/texture_cache.h | 28 ++------ 4 files changed, 46 insertions(+), 115 deletions(-) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 2c63c1d4..15b3f965 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -877,6 +877,17 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) U64 expected_size = topology_info.width*topology_info.height*r_tex2d_format_bytes_per_pixel_table[topology_info.fmt]; Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr+expected_size); + //- rjf: obtain key for this data range + U128 texture_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); + // HACK(rjf): we should not need to explicitly inform the process memory cache layer here - + // want a joined "get me the key & load it" operation here + ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0, 0, 0); + + //- rjf: hash & topology -> texture + TEX_Topology topology = tex_topology_make(v2s32((S32)topology_info.width, (S32)topology_info.height), topology_info.fmt); + R_Handle texture = tex_texture_from_key_topology(tex_scope, texture_key, topology); + +#if 0 //- rjf: unique identifying info about this address -> unique key U128 texture_key = {0}; { @@ -892,10 +903,8 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) //- rjf: address range -> hash U128 hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0, 0, 0); - - //- rjf: hash & topology -> texture - TEX_Topology topology = tex_topology_make(v2s32((S32)topology_info.width, (S32)topology_info.height), topology_info.fmt); R_Handle texture = tex_texture_from_key_hash_topology(tex_scope, texture_key, hash, topology); +#endif //- rjf: build preview F32 rate = 1 - pow_f32(2, (-15.f * df_dt())); @@ -941,6 +950,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) { if(dim.y > (F32)topology_info.height) { + U128 hash = hs_hash_from_key(texture_key, 0); String8 data = hs_data_from_hash(hs_scope, hash); U64 bytes_per_pixel = r_tex2d_format_bytes_per_pixel_table[topology.fmt]; U64 mouse_pixel_off = mouse_bitmap_px_off.y*topology_info.width + mouse_bitmap_px_off.x; diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 8084be2c..d10e8d73 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5024,7 +5024,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - DBGI_Scope *scope = dbgi_scope_open(); + DBGI_Scope *dbgi_scope = dbgi_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); DF_CodeViewState *tv = df_view_user_state(view, DF_CodeViewState); ////////////////////////////// @@ -5050,10 +5051,10 @@ DF_VIEW_UI_FUNCTION_DEF(Code) U64 unwind_count = ctrl_ctx.unwind_count; U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, rip_vaddr); + EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(dbgi_scope, process, rip_vaddr); ////////////////////////////// - //- rjf: unpack entity info + //- rjf: unpack file/text entity info // B32 entity_is_missing = !!(entity->flags & DF_EntityFlag_IsMissing && !(entity->flags & DF_EntityFlag_Output)); TXTI_Handle txti_handle = df_txti_handle_from_entity(entity); @@ -5467,7 +5468,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) String8 expr = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_rng); if(expr.size != 0) { - DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); + DF_Eval eval = df_eval_from_string(scratch.arena, dbgi_scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); if(eval.mode != EVAL_EvalMode_NULL) { df_set_hover_eval(ws, sig.mouse_expr_baseline_pos, ctrl_ctx, entity, sig.mouse_pt, 0, expr); @@ -5788,7 +5789,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) String8 full_path = df_full_path_from_entity(scratch.arena, entity); TXTI_Handle handle = txti_handle_from_path(full_path); TXTI_BufferInfo info = txti_buffer_info_from_handle(scratch.arena, handle); - DBGI_Parse *parse = df_dbgi_parse_from_binary_file(scope, binary); + DBGI_Parse *parse = df_dbgi_parse_from_binary_file(dbgi_scope, binary); if(parse->exe_props.modified < info.timestamp) { file_is_out_of_date = 1; @@ -5851,7 +5852,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code) } } - dbgi_scope_close(scope); + txt_scope_close(txt_scope); + dbgi_scope_close(dbgi_scope); scratch_end(scratch); ProfEnd(); } diff --git a/src/texture_cache/texture_cache.c b/src/texture_cache/texture_cache.c index 9ef652e8..300eda12 100644 --- a/src/texture_cache/texture_cache.c +++ b/src/texture_cache/texture_cache.c @@ -34,16 +34,6 @@ tex_init(void) tex_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); tex_shared->stripes[idx].cv = os_condition_variable_alloc(); } - tex_shared->fallback_slots_count = 1024; - tex_shared->fallback_stripes_count = Min(tex_shared->fallback_slots_count, os_logical_core_count()); - tex_shared->fallback_slots = push_array(arena, TEX_KeyFallbackSlot, tex_shared->fallback_slots_count); - tex_shared->fallback_stripes = push_array(arena, TEX_Stripe, tex_shared->fallback_stripes_count); - for(U64 idx = 0; idx < tex_shared->fallback_stripes_count; idx += 1) - { - tex_shared->fallback_stripes[idx].arena = arena_alloc(); - tex_shared->fallback_stripes[idx].rw_mutex = os_rw_mutex_alloc(); - tex_shared->fallback_stripes[idx].cv = os_condition_variable_alloc(); - } tex_shared->u2x_ring_size = KB(64); tex_shared->u2x_ring_base = push_array_no_zero(arena, U8, tex_shared->u2x_ring_size); tex_shared->u2x_ring_cv = os_condition_variable_alloc(); @@ -158,10 +148,9 @@ tex_scope_touch_node__stripe_r_guarded(TEX_Scope *scope, TEX_Node *node) //~ rjf: Cache Lookups internal R_Handle -tex_texture_from_key_hash_topology(TEX_Scope *scope, U128 key, U128 hash, TEX_Topology topology) +tex_texture_from_hash_topology(TEX_Scope *scope, U128 hash, TEX_Topology topology) { R_Handle handle = {0}; - if(!u128_match(u128_zero(), hash)) { U64 slot_idx = hash.u64[1]%tex_shared->slots_count; U64 stripe_idx = slot_idx%tex_shared->stripes_count; @@ -217,42 +206,23 @@ tex_texture_from_key_hash_topology(TEX_Scope *scope, U128 key, U128 hash, TEX_To } if(node_is_new) { - tex_u2x_enqueue_req(key, hash, topology, max_U64); + tex_u2x_enqueue_req(hash, topology, max_U64); } - if(r_handle_match(handle, r_handle_zero())) + } + return handle; +} + +internal R_Handle +tex_texture_from_key_topology(TEX_Scope *scope, U128 key, TEX_Topology topology) +{ + R_Handle handle = {0}; + for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) + { + U128 hash = hs_hash_from_key(key, rewind_idx); + handle = tex_texture_from_hash_topology(scope, hash, topology); + if(!r_handle_match(handle, r_handle_zero())) { - U128 fallback_hash = {0}; - U64 fallback_slot_idx = key.u64[1]%tex_shared->fallback_slots_count; - U64 fallback_stripe_idx = fallback_slot_idx%tex_shared->fallback_stripes_count; - TEX_KeyFallbackSlot *fallback_slot = &tex_shared->fallback_slots[fallback_slot_idx]; - TEX_Stripe *fallback_stripe = &tex_shared->fallback_stripes[fallback_stripe_idx]; - OS_MutexScopeR(fallback_stripe->rw_mutex) for(TEX_KeyFallbackNode *n = fallback_slot->first; n != 0; n = n->next) - { - if(u128_match(key, n->key)) - { - fallback_hash = n->hash; - break; - } - } - if(!u128_match(fallback_hash, u128_zero())) - { - U64 retry_slot_idx = fallback_hash.u64[1]%tex_shared->slots_count; - U64 retry_stripe_idx = retry_slot_idx%tex_shared->stripes_count; - TEX_Slot *retry_slot = &tex_shared->slots[retry_slot_idx]; - TEX_Stripe *retry_stripe = &tex_shared->stripes[retry_stripe_idx]; - OS_MutexScopeR(retry_stripe->rw_mutex) - { - for(TEX_Node *n = retry_slot->first; n != 0; n = n->next) - { - if(u128_match(fallback_hash, n->hash) && MemoryMatchStruct(&topology, &n->topology)) - { - handle = n->texture; - tex_scope_touch_node__stripe_r_guarded(scope, n); - break; - } - } - } - } + break; } } return handle; @@ -262,17 +232,16 @@ tex_texture_from_key_hash_topology(TEX_Scope *scope, U128 key, U128 hash, TEX_To //~ rjf: Transfer Threads internal B32 -tex_u2x_enqueue_req(U128 key, U128 hash, TEX_Topology top, U64 endt_us) +tex_u2x_enqueue_req(U128 hash, TEX_Topology top, U64 endt_us) { B32 good = 0; OS_MutexScope(tex_shared->u2x_ring_mutex) for(;;) { U64 unconsumed_size = tex_shared->u2x_ring_write_pos-tex_shared->u2x_ring_read_pos; U64 available_size = tex_shared->u2x_ring_size-unconsumed_size; - if(available_size >= sizeof(key)+sizeof(hash)+sizeof(top)) + if(available_size >= sizeof(hash)+sizeof(top)) { good = 1; - tex_shared->u2x_ring_write_pos += ring_write_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_write_pos, &key); tex_shared->u2x_ring_write_pos += ring_write_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_write_pos, &hash); tex_shared->u2x_ring_write_pos += ring_write_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_write_pos, &top); break; @@ -291,14 +260,13 @@ tex_u2x_enqueue_req(U128 key, U128 hash, TEX_Topology top, U64 endt_us) } internal void -tex_u2x_dequeue_req(U128 *key_out, U128 *hash_out, TEX_Topology *top_out) +tex_u2x_dequeue_req(U128 *hash_out, TEX_Topology *top_out) { OS_MutexScope(tex_shared->u2x_ring_mutex) for(;;) { U64 unconsumed_size = tex_shared->u2x_ring_write_pos-tex_shared->u2x_ring_read_pos; - if(unconsumed_size >= sizeof(*key_out)+sizeof(*hash_out)+sizeof(*top_out)) + if(unconsumed_size >= sizeof(*hash_out)+sizeof(*top_out)) { - tex_shared->u2x_ring_read_pos += ring_read_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_read_pos, key_out); tex_shared->u2x_ring_read_pos += ring_read_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_read_pos, hash_out); tex_shared->u2x_ring_read_pos += ring_read_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_read_pos, top_out); break; @@ -316,10 +284,9 @@ tex_xfer_thread__entry_point(void *p) HS_Scope *scope = hs_scope_open(); //- rjf: decode - U128 key = {0}; U128 hash = {0}; TEX_Topology top = {0}; - tex_u2x_dequeue_req(&key, &hash, &top); + tex_u2x_dequeue_req(&hash, &top); //- rjf: unpack hash U64 slot_idx = hash.u64[1]%tex_shared->slots_count; @@ -370,34 +337,6 @@ tex_xfer_thread__entry_point(void *p) } } - //- rjf: commit this key/hash pair to fallback cache - if(got_task && !u128_match(key, u128_zero()) && !u128_match(hash, u128_zero())) - { - U64 fallback_slot_idx = key.u64[1]%tex_shared->fallback_slots_count; - U64 fallback_stripe_idx = fallback_slot_idx%tex_shared->fallback_stripes_count; - TEX_KeyFallbackSlot *fallback_slot = &tex_shared->fallback_slots[fallback_slot_idx]; - TEX_Stripe *fallback_stripe = &tex_shared->fallback_stripes[fallback_stripe_idx]; - OS_MutexScopeW(fallback_stripe->rw_mutex) - { - TEX_KeyFallbackNode *node = 0; - for(TEX_KeyFallbackNode *n = fallback_slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key)) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(fallback_stripe->arena, TEX_KeyFallbackNode, 1); - SLLQueuePush(fallback_slot->first, fallback_slot->last, node); - } - node->key = key; - node->hash = hash; - } - } - hs_scope_close(scope); } } diff --git a/src/texture_cache/texture_cache.h b/src/texture_cache/texture_cache.h index 8245ccdd..ff8ac5a5 100644 --- a/src/texture_cache/texture_cache.h +++ b/src/texture_cache/texture_cache.h @@ -17,21 +17,6 @@ struct TEX_Topology //////////////////////////////// //~ rjf: Cache Types -typedef struct TEX_KeyFallbackNode TEX_KeyFallbackNode; -struct TEX_KeyFallbackNode -{ - TEX_KeyFallbackNode *next; - U128 key; - U128 hash; -}; - -typedef struct TEX_KeyFallbackSlot TEX_KeyFallbackSlot; -struct TEX_KeyFallbackSlot -{ - TEX_KeyFallbackNode *first; - TEX_KeyFallbackNode *last; -}; - typedef struct TEX_Node TEX_Node; struct TEX_Node { @@ -109,12 +94,6 @@ struct TEX_Shared TEX_Stripe *stripes; TEX_Node **stripes_free_nodes; - // rjf: fallback cache - U64 fallback_slots_count; - U64 fallback_stripes_count; - TEX_KeyFallbackSlot *fallback_slots; - TEX_Stripe *fallback_stripes; - // rjf: user -> xfer thread U64 u2x_ring_size; U8 *u2x_ring_base; @@ -168,13 +147,14 @@ internal void tex_scope_touch_node__stripe_r_guarded(TEX_Scope *scope, TEX_Node //////////////////////////////// //~ rjf: Cache Lookups -internal R_Handle tex_texture_from_key_hash_topology(TEX_Scope *scope, U128 key, U128 hash, TEX_Topology topology); +internal R_Handle tex_texture_from_hash_topology(TEX_Scope *scope, U128 hash, TEX_Topology topology); +internal R_Handle tex_texture_from_key_topology(TEX_Scope *scope, U128 key, TEX_Topology topology); //////////////////////////////// //~ rjf: Transfer Threads -internal B32 tex_u2x_enqueue_req(U128 key, U128 hash, TEX_Topology top, U64 endt_us); -internal void tex_u2x_dequeue_req(U128 *key_out, U128 *hash_out, TEX_Topology *top_out); +internal B32 tex_u2x_enqueue_req(U128 hash, TEX_Topology top, U64 endt_us); +internal void tex_u2x_dequeue_req(U128 *hash_out, TEX_Topology *top_out); internal void tex_xfer_thread__entry_point(void *p); //////////////////////////////// From f7e7aec355afeb1dae4d4f6c4fc79440f2bbfc75 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 11:55:15 -0700 Subject: [PATCH 225/275] bundle 'get key & stream' operation in process memory cache; eliminate old cache interaction in texture view rule hook --- src/ctrl/ctrl_core.c | 16 +++++++++++++--- src/ctrl/ctrl_core.h | 5 ++++- src/df/gfx/df_view_rule_hooks.c | 22 ---------------------- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index bea4d853..805153ee 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -881,7 +881,7 @@ ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) //- rjf: process memory cache interaction internal U128 -ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated) +ctrl_calc_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated) { U64 key_hash_data[] = { @@ -1049,6 +1049,16 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle return result; } +//- rjf: bundled key/stream helper + +internal U128 +ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated) +{ + U128 key = ctrl_calc_hash_store_key_from_process_vaddr_range(machine_id, process, range, zero_terminated); + ctrl_stored_hash_from_process_vaddr_range(machine_id, process, range, 0, 0, 0); + return key; +} + //- rjf: process memory cache reading helpers internal CTRL_ProcessMemorySlice @@ -1075,7 +1085,7 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) { U64 page_base_vaddr = page_range.min + page_idx*page_size; - U128 page_key = ctrl_hash_store_key_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); + U128 page_key = ctrl_calc_hash_store_key_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); B32 page_is_stale = 0; U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, &page_is_stale, endt_us); U128 page_last_hash = hs_hash_from_key(page_key, 1); @@ -3668,7 +3678,7 @@ ctrl_mem_stream_thread__entry_point(void *p) Rng1U64 vaddr_range = {0}; B32 zero_terminated = 0; ctrl_u2ms_dequeue_req(&machine_id, &process, &vaddr_range, &zero_terminated); - U128 key = ctrl_hash_store_key_from_process_vaddr_range(machine_id, process, vaddr_range, zero_terminated); + U128 key = ctrl_calc_hash_store_key_from_process_vaddr_range(machine_id, process, vaddr_range, zero_terminated); //- rjf: unpack process memory cache key U64 process_hash = ctrl_hash_from_string(str8_struct(&process)); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index cf459fe7..20f52b8c 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -637,9 +637,12 @@ internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); //~ rjf: Process Memory Functions //- rjf: process memory cache interaction -internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated); +internal U128 ctrl_calc_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated); internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, B32 *out_is_stale, U64 endt_us); +//- rjf: bundled key/stream helper +internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated); + //- rjf: process memory cache reading helpers internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, U64 endt_us); internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 endt_us); diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 15b3f965..eff10ef3 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -879,33 +879,11 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) //- rjf: obtain key for this data range U128 texture_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); - // HACK(rjf): we should not need to explicitly inform the process memory cache layer here - - // want a joined "get me the key & load it" operation here - ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0, 0, 0); //- rjf: hash & topology -> texture TEX_Topology topology = tex_topology_make(v2s32((S32)topology_info.width, (S32)topology_info.height), topology_info.fmt); R_Handle texture = tex_texture_from_key_topology(tex_scope, texture_key, topology); -#if 0 - //- rjf: unique identifying info about this address -> unique key - U128 texture_key = {0}; - { - U64 data[] = - { - (U64)process->ctrl_machine_id, - (U64)process->ctrl_handle.u64[0], - vaddr_range.min, - vaddr_range.max, - }; - texture_key = hs_hash_from_data(str8((U8 *)data, sizeof(data))); - } - - //- rjf: address range -> hash - U128 hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0, 0, 0); - R_Handle texture = tex_texture_from_key_hash_topology(tex_scope, texture_key, hash, topology); -#endif - //- rjf: build preview F32 rate = 1 - pow_f32(2, (-15.f * df_dt())); if(expected_size != 0) From 9dc484858a81f1eaee65264c441b5b3a692d4012 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 11:59:54 -0700 Subject: [PATCH 226/275] eliminate geo cache fallback key/hash cache; we can just use the hash store to rewind --- src/df/gfx/df_view_rule_hooks.c | 36 ++--------- src/geo_cache/geo_cache.c | 102 +++++++------------------------- src/geo_cache/geo_cache.h | 28 ++------- 3 files changed, 30 insertions(+), 136 deletions(-) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index eff10ef3..dbdd83b2 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -1112,39 +1112,13 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo) DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - //- rjf: produce unique keys for index buffer - U128 index_buffer_key = {0}; - { - U64 data[] = - { - (U64)process->ctrl_machine_id, - (U64)process->ctrl_handle.u64[0], - index_buffer_vaddr_range.min, - index_buffer_vaddr_range.max, - }; - index_buffer_key = hs_hash_from_data(str8((U8 *)data, sizeof(data))); - } - - //- rjf: produce unique keys for vertex buffer - U128 vertex_buffer_key = {0}; - { - U64 data[] = - { - (U64)process->ctrl_machine_id, - (U64)process->ctrl_handle.u64[0], - vertex_buffer_vaddr_range.min, - vertex_buffer_vaddr_range.max, - }; - vertex_buffer_key = hs_hash_from_data(str8((U8 *)data, sizeof(data))); - } - - //- rjf: address range -> hash - U128 index_buffer_hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, index_buffer_vaddr_range, 0, 0, 0); - U128 vertex_buffer_hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vertex_buffer_vaddr_range, 0, 0, 0); + //- rjf: obtain keys for index buffer & vertex buffer memory + U128 index_buffer_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, index_buffer_vaddr_range, 0); + U128 vertex_buffer_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vertex_buffer_vaddr_range, 0); //- rjf: get gpu buffers - R_Handle index_buffer = geo_buffer_from_key_hash(geo_scope, index_buffer_key, index_buffer_hash); - R_Handle vertex_buffer = geo_buffer_from_key_hash(geo_scope, vertex_buffer_key, vertex_buffer_hash); + R_Handle index_buffer = geo_buffer_from_key(geo_scope, index_buffer_key); + R_Handle vertex_buffer = geo_buffer_from_key(geo_scope, vertex_buffer_key); //- rjf: build preview F32 rate = 1 - pow_f32(2, (-15.f * df_dt())); diff --git a/src/geo_cache/geo_cache.c b/src/geo_cache/geo_cache.c index 58377510..cec24960 100644 --- a/src/geo_cache/geo_cache.c +++ b/src/geo_cache/geo_cache.c @@ -21,16 +21,6 @@ geo_init(void) geo_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); geo_shared->stripes[idx].cv = os_condition_variable_alloc(); } - geo_shared->fallback_slots_count = 1024; - geo_shared->fallback_stripes_count = Min(geo_shared->fallback_slots_count, os_logical_core_count()); - geo_shared->fallback_slots = push_array(arena, GEO_KeyFallbackSlot, geo_shared->fallback_slots_count); - geo_shared->fallback_stripes = push_array(arena, GEO_Stripe, geo_shared->fallback_stripes_count); - for(U64 idx = 0; idx < geo_shared->fallback_stripes_count; idx += 1) - { - geo_shared->fallback_stripes[idx].arena = arena_alloc(); - geo_shared->fallback_stripes[idx].rw_mutex = os_rw_mutex_alloc(); - geo_shared->fallback_stripes[idx].cv = os_condition_variable_alloc(); - } geo_shared->u2x_ring_size = KB(64); geo_shared->u2x_ring_base = push_array_no_zero(arena, U8, geo_shared->u2x_ring_size); geo_shared->u2x_ring_cv = os_condition_variable_alloc(); @@ -144,7 +134,7 @@ geo_scope_touch_node__stripe_r_guarded(GEO_Scope *scope, GEO_Node *node) //~ rjf: Cache Lookups internal R_Handle -geo_buffer_from_key_hash(GEO_Scope *scope, U128 key, U128 hash) +geo_buffer_from_hash(GEO_Scope *scope, U128 hash) { R_Handle handle = {0}; if(!u128_match(hash, u128_zero())) @@ -201,42 +191,23 @@ geo_buffer_from_key_hash(GEO_Scope *scope, U128 key, U128 hash) } if(node_is_new) { - geo_u2x_enqueue_req(key, hash, max_U64); + geo_u2x_enqueue_req(hash, max_U64); } - if(r_handle_match(handle, r_handle_zero())) + } + return handle; +} + +internal R_Handle +geo_buffer_from_key(GEO_Scope *scope, U128 key) +{ + R_Handle handle = {0}; + for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) + { + U128 hash = hs_hash_from_key(key, rewind_idx); + handle = geo_buffer_from_hash(scope, hash); + if(!r_handle_match(handle, r_handle_zero())) { - U128 fallback_hash = {0}; - U64 fallback_slot_idx = key.u64[1]%geo_shared->fallback_slots_count; - U64 fallback_stripe_idx = fallback_slot_idx%geo_shared->fallback_stripes_count; - GEO_KeyFallbackSlot *fallback_slot = &geo_shared->fallback_slots[fallback_slot_idx]; - GEO_Stripe *fallback_stripe = &geo_shared->fallback_stripes[fallback_stripe_idx]; - OS_MutexScopeR(fallback_stripe->rw_mutex) for(GEO_KeyFallbackNode *n = fallback_slot->first; n != 0; n = n->next) - { - if(u128_match(key, n->key)) - { - fallback_hash = n->hash; - break; - } - } - if(!u128_match(fallback_hash, u128_zero())) - { - U64 retry_slot_idx = fallback_hash.u64[1]%geo_shared->slots_count; - U64 retry_stripe_idx = retry_slot_idx%geo_shared->stripes_count; - GEO_Slot *retry_slot = &geo_shared->slots[retry_slot_idx]; - GEO_Stripe *retry_stripe = &geo_shared->stripes[retry_stripe_idx]; - OS_MutexScopeR(retry_stripe->rw_mutex) - { - for(GEO_Node *n = retry_slot->first; n != 0; n = n->next) - { - if(u128_match(fallback_hash, n->hash)) - { - handle = n->buffer; - geo_scope_touch_node__stripe_r_guarded(scope, n); - break; - } - } - } - } + break; } } return handle; @@ -246,17 +217,16 @@ geo_buffer_from_key_hash(GEO_Scope *scope, U128 key, U128 hash) //~ rjf: Transfer Threads internal B32 -geo_u2x_enqueue_req(U128 key, U128 hash, U64 endt_us) +geo_u2x_enqueue_req(U128 hash, U64 endt_us) { B32 good = 0; OS_MutexScope(geo_shared->u2x_ring_mutex) for(;;) { U64 unconsumed_size = geo_shared->u2x_ring_write_pos-geo_shared->u2x_ring_read_pos; U64 available_size = geo_shared->u2x_ring_size-unconsumed_size; - if(available_size >= sizeof(key)+sizeof(hash)) + if(available_size >= sizeof(hash)) { good = 1; - geo_shared->u2x_ring_write_pos += ring_write_struct(geo_shared->u2x_ring_base, geo_shared->u2x_ring_size, geo_shared->u2x_ring_write_pos, &key); geo_shared->u2x_ring_write_pos += ring_write_struct(geo_shared->u2x_ring_base, geo_shared->u2x_ring_size, geo_shared->u2x_ring_write_pos, &hash); break; } @@ -274,14 +244,13 @@ geo_u2x_enqueue_req(U128 key, U128 hash, U64 endt_us) } internal void -geo_u2x_dequeue_req(U128 *key_out, U128 *hash_out) +geo_u2x_dequeue_req(U128 *hash_out) { OS_MutexScope(geo_shared->u2x_ring_mutex) for(;;) { U64 unconsumed_size = geo_shared->u2x_ring_write_pos-geo_shared->u2x_ring_read_pos; - if(unconsumed_size >= sizeof(*key_out)+sizeof(*hash_out)) + if(unconsumed_size >= sizeof(*hash_out)) { - geo_shared->u2x_ring_read_pos += ring_read_struct(geo_shared->u2x_ring_base, geo_shared->u2x_ring_size, geo_shared->u2x_ring_read_pos, key_out); geo_shared->u2x_ring_read_pos += ring_read_struct(geo_shared->u2x_ring_base, geo_shared->u2x_ring_size, geo_shared->u2x_ring_read_pos, hash_out); break; } @@ -298,9 +267,8 @@ geo_xfer_thread__entry_point(void *p) HS_Scope *scope = hs_scope_open(); //- rjf: decode - U128 key = {0}; U128 hash = {0}; - geo_u2x_dequeue_req(&key, &hash); + geo_u2x_dequeue_req(&hash); //- rjf: unpack hash U64 slot_idx = hash.u64[1]%geo_shared->slots_count; @@ -351,34 +319,6 @@ geo_xfer_thread__entry_point(void *p) } } - //- rjf: commit this key/hash pair to fallback cache - if(got_task && !u128_match(key, u128_zero()) && !u128_match(hash, u128_zero())) - { - U64 fallback_slot_idx = key.u64[1]%geo_shared->fallback_slots_count; - U64 fallback_stripe_idx = fallback_slot_idx%geo_shared->fallback_stripes_count; - GEO_KeyFallbackSlot *fallback_slot = &geo_shared->fallback_slots[fallback_slot_idx]; - GEO_Stripe *fallback_stripe = &geo_shared->fallback_stripes[fallback_stripe_idx]; - OS_MutexScopeW(fallback_stripe->rw_mutex) - { - GEO_KeyFallbackNode *node = 0; - for(GEO_KeyFallbackNode *n = fallback_slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key)) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(fallback_stripe->arena, GEO_KeyFallbackNode, 1); - SLLQueuePush(fallback_slot->first, fallback_slot->last, node); - } - node->key = key; - node->hash = hash; - } - } - hs_scope_close(scope); } } diff --git a/src/geo_cache/geo_cache.h b/src/geo_cache/geo_cache.h index 256f29ac..60d882b3 100644 --- a/src/geo_cache/geo_cache.h +++ b/src/geo_cache/geo_cache.h @@ -7,21 +7,6 @@ //////////////////////////////// //~ rjf: Cache Types -typedef struct GEO_KeyFallbackNode GEO_KeyFallbackNode; -struct GEO_KeyFallbackNode -{ - GEO_KeyFallbackNode *next; - U128 key; - U128 hash; -}; - -typedef struct GEO_KeyFallbackSlot GEO_KeyFallbackSlot; -struct GEO_KeyFallbackSlot -{ - GEO_KeyFallbackNode *first; - GEO_KeyFallbackNode *last; -}; - typedef struct GEO_Node GEO_Node; struct GEO_Node { @@ -97,12 +82,6 @@ struct GEO_Shared GEO_Stripe *stripes; GEO_Node **stripes_free_nodes; - // rjf: fallback cache - U64 fallback_slots_count; - U64 fallback_stripes_count; - GEO_KeyFallbackSlot *fallback_slots; - GEO_Stripe *fallback_stripes; - // rjf: user -> xfer thread U64 u2x_ring_size; U8 *u2x_ring_base; @@ -151,13 +130,14 @@ internal void geo_scope_touch_node__stripe_r_guarded(GEO_Scope *scope, GEO_Node //////////////////////////////// //~ rjf: Cache Lookups -internal R_Handle geo_buffer_from_key_hash(GEO_Scope *scope, U128 key, U128 hash); +internal R_Handle geo_buffer_from_hash(GEO_Scope *scope, U128 hash); +internal R_Handle geo_buffer_from_key(GEO_Scope *scope, U128 key); //////////////////////////////// //~ rjf: Transfer Threads -internal B32 geo_u2x_enqueue_req(U128 key, U128 hash, U64 endt_us); -internal void geo_u2x_dequeue_req(U128 *key_out, U128 *hash_out); +internal B32 geo_u2x_enqueue_req(U128 hash, U64 endt_us); +internal void geo_u2x_dequeue_req(U128 *hash_out); internal void geo_xfer_thread__entry_point(void *p); //////////////////////////////// From 88b692c840360c7be8aa2fb09a25c71148ad33a4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 12:11:00 -0700 Subject: [PATCH 227/275] eliminate fallback cache in text cache layer; we can use the hash store layer to rewind --- src/ctrl/ctrl_core.c | 2 +- src/df/gfx/df_view_rule_hooks.c | 26 ++------ src/text_cache/text_cache.c | 111 ++++++++------------------------ src/text_cache/text_cache.h | 28 ++------ 4 files changed, 38 insertions(+), 129 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 805153ee..f101b03f 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1055,7 +1055,7 @@ internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated) { U128 key = ctrl_calc_hash_store_key_from_process_vaddr_range(machine_id, process, range, zero_terminated); - ctrl_stored_hash_from_process_vaddr_range(machine_id, process, range, 0, 0, 0); + ctrl_stored_hash_from_process_vaddr_range(machine_id, process, range, zero_terminated, 0, 0); return key; } diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index dbdd83b2..b64901c4 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -686,27 +686,13 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - //- rjf: unique identifying info about this address -> unique key - U128 text_key = {0}; - { - U64 data[] = - { - (U64)process->ctrl_machine_id, - (U64)process->ctrl_handle.u64[0], - vaddr_range.min, - vaddr_range.max, - }; - text_key = hs_hash_from_data(str8((U8 *)data, sizeof(data))); - } + //- rjf: unpack key for this region in memory + U128 text_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 1); - //- rjf: address range -> hash - U128 hash = ctrl_stored_hash_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 1, 0, 0); - - //- rjf: hash -> data - String8 data = hs_data_from_hash(hs_scope, hash); - - //- rjf: key * hash -> parsed text info - TXT_TextInfo info = txt_text_info_from_key_hash_lang(txt_scope, text_key, hash, top.lang); + //- rjf: key -> parsed text info + U128 text_hash = {0}; + TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, text_key, top.lang, &text_hash); + String8 data = hs_data_from_hash(hs_scope, text_hash); //- rjf: info -> code slice info DF_CodeSliceParams code_slice_params = {0}; diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 33b40521..c70e299d 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -644,16 +644,6 @@ txt_init(void) txt_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); txt_shared->stripes[idx].cv = os_condition_variable_alloc(); } - txt_shared->fallback_slots_count = 256; - txt_shared->fallback_stripes_count = Min(txt_shared->fallback_slots_count, os_logical_core_count()); - txt_shared->fallback_slots = push_array(arena, TXT_KeyFallbackSlot, txt_shared->fallback_slots_count); - txt_shared->fallback_stripes = push_array(arena, TXT_Stripe, txt_shared->fallback_stripes_count); - for(U64 idx = 0; idx < txt_shared->fallback_stripes_count; idx += 1) - { - txt_shared->fallback_stripes[idx].arena = arena_alloc(); - txt_shared->fallback_stripes[idx].rw_mutex = os_rw_mutex_alloc(); - txt_shared->fallback_stripes[idx].cv = os_condition_variable_alloc(); - } txt_shared->u2p_ring_size = KB(64); txt_shared->u2p_ring_base = push_array_no_zero(arena, U8, txt_shared->u2p_ring_size); txt_shared->u2p_ring_cv = os_condition_variable_alloc(); @@ -767,7 +757,7 @@ txt_scope_touch_node__stripe_r_guarded(TXT_Scope *scope, TXT_Node *node) //~ rjf: Cache Lookups internal TXT_TextInfo -txt_text_info_from_key_hash_lang(TXT_Scope *scope, U128 key, U128 hash, TXT_LangKind lang) +txt_text_info_from_hash_lang(TXT_Scope *scope, U128 hash, TXT_LangKind lang) { TXT_TextInfo info = {0}; if(!u128_match(hash, u128_zero())) @@ -825,63 +815,46 @@ txt_text_info_from_key_hash_lang(TXT_Scope *scope, U128 key, U128 hash, TXT_Lang } if(node_is_new) { - txt_u2p_enqueue_req(key, hash, lang, max_U64); - } - if(!found) - { - U128 fallback_hash = {0}; - TXT_LangKind fallback_lang = TXT_LangKind_Null; - U64 fallback_slot_idx = key.u64[1]%txt_shared->fallback_slots_count; - U64 fallback_stripe_idx = fallback_slot_idx%txt_shared->fallback_stripes_count; - TXT_KeyFallbackSlot *fallback_slot = &txt_shared->fallback_slots[fallback_slot_idx]; - TXT_Stripe *fallback_stripe = &txt_shared->fallback_stripes[fallback_stripe_idx]; - OS_MutexScopeR(fallback_stripe->rw_mutex) for(TXT_KeyFallbackNode *n = fallback_slot->first; n != 0; n = n->next) - { - if(u128_match(key, n->key)) - { - fallback_hash = n->hash; - break; - } - } - if(!u128_match(fallback_hash, u128_zero())) - { - U64 retry_slot_idx = fallback_hash.u64[1]%txt_shared->slots_count; - U64 retry_stripe_idx = retry_slot_idx%txt_shared->stripes_count; - TXT_Slot *retry_slot = &txt_shared->slots[retry_slot_idx]; - TXT_Stripe *retry_stripe = &txt_shared->stripes[retry_stripe_idx]; - OS_MutexScopeR(retry_stripe->rw_mutex) - { - for(TXT_Node *n = retry_slot->first; n != 0; n = n->next) - { - if(u128_match(fallback_hash, n->hash) && fallback_lang == n->lang) - { - MemoryCopyStruct(&info, &n->info); - txt_scope_touch_node__stripe_r_guarded(scope, n); - break; - } - } - } - } + txt_u2p_enqueue_req(hash, lang, max_U64); } } return info; } +internal TXT_TextInfo +txt_text_info_from_key_lang(TXT_Scope *scope, U128 key, TXT_LangKind lang, U128 *hash_out) +{ + TXT_TextInfo result = {0}; + for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) + { + U128 hash = hs_hash_from_key(key, rewind_idx); + result = txt_text_info_from_hash_lang(scope, hash, lang); + if(result.lines_count != 0) + { + if(hash_out) + { + *hash_out = hash; + } + break; + } + } + return result; +} + //////////////////////////////// //~ rjf: Transfer Threads internal B32 -txt_u2p_enqueue_req(U128 key, U128 hash, TXT_LangKind lang, U64 endt_us) +txt_u2p_enqueue_req(U128 hash, TXT_LangKind lang, U64 endt_us) { B32 good = 0; OS_MutexScope(txt_shared->u2p_ring_mutex) for(;;) { U64 unconsumed_size = txt_shared->u2p_ring_write_pos - txt_shared->u2p_ring_read_pos; U64 available_size = txt_shared->u2p_ring_size - unconsumed_size; - if(available_size >= sizeof(key)+sizeof(hash)) + if(available_size >= sizeof(hash)+sizeof(lang)) { good = 1; - txt_shared->u2p_ring_write_pos += ring_write_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_write_pos, &key); txt_shared->u2p_ring_write_pos += ring_write_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_write_pos, &hash); txt_shared->u2p_ring_write_pos += ring_write_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_write_pos, &lang); break; @@ -900,14 +873,13 @@ txt_u2p_enqueue_req(U128 key, U128 hash, TXT_LangKind lang, U64 endt_us) } internal void -txt_u2p_dequeue_req(U128 *key_out, U128 *hash_out, TXT_LangKind *lang_out) +txt_u2p_dequeue_req(U128 *hash_out, TXT_LangKind *lang_out) { OS_MutexScope(txt_shared->u2p_ring_mutex) for(;;) { U64 unconsumed_size = txt_shared->u2p_ring_write_pos - txt_shared->u2p_ring_read_pos; - if(unconsumed_size >= sizeof(*key_out) + sizeof(*hash_out)) + if(unconsumed_size >= sizeof(*hash_out) + sizeof(*lang_out)) { - txt_shared->u2p_ring_read_pos += ring_read_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_read_pos, key_out); txt_shared->u2p_ring_read_pos += ring_read_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_read_pos, hash_out); txt_shared->u2p_ring_read_pos += ring_read_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_read_pos, lang_out); break; @@ -925,10 +897,9 @@ txt_parse_thread__entry_point(void *p) HS_Scope *scope = hs_scope_open(); //- rjf: get next key - U128 key = {0}; U128 hash = {0}; TXT_LangKind lang = TXT_LangKind_Null; - txt_u2p_dequeue_req(&key, &hash, &lang); + txt_u2p_dequeue_req(&hash, &lang); //- rjf: unpack hash U64 slot_idx = hash.u64[1]%txt_shared->slots_count; @@ -1057,34 +1028,6 @@ txt_parse_thread__entry_point(void *p) } } - //- rjf: commit this key/hash pair to fallback cache - if(got_task && !u128_match(key, u128_zero()) && !u128_match(hash, u128_zero())) - { - U64 fallback_slot_idx = key.u64[1]%txt_shared->fallback_slots_count; - U64 fallback_stripe_idx = fallback_slot_idx%txt_shared->fallback_stripes_count; - TXT_KeyFallbackSlot *fallback_slot = &txt_shared->fallback_slots[fallback_slot_idx]; - TXT_Stripe *fallback_stripe = &txt_shared->fallback_stripes[fallback_stripe_idx]; - OS_MutexScopeW(fallback_stripe->rw_mutex) - { - TXT_KeyFallbackNode *node = 0; - for(TXT_KeyFallbackNode *n = fallback_slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key)) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(fallback_stripe->arena, TXT_KeyFallbackNode, 1); - SLLQueuePush(fallback_slot->first, fallback_slot->last, node); - } - node->key = key; - node->hash = hash; - } - } - hs_scope_close(scope); } } diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index 74437762..d5501ff9 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -114,21 +114,6 @@ typedef TXT_TokenArray TXT_LangLexFunctionType(Arena *arena, U64 *bytes_processe //////////////////////////////// //~ rjf: Cache Types -typedef struct TXT_KeyFallbackNode TXT_KeyFallbackNode; -struct TXT_KeyFallbackNode -{ - TXT_KeyFallbackNode *next; - U128 key; - U128 hash; -}; - -typedef struct TXT_KeyFallbackSlot TXT_KeyFallbackSlot; -struct TXT_KeyFallbackSlot -{ - TXT_KeyFallbackNode *first; - TXT_KeyFallbackNode *last; -}; - typedef struct TXT_Node TXT_Node; struct TXT_Node { @@ -206,12 +191,6 @@ struct TXT_Shared TXT_Stripe *stripes; TXT_Node **stripes_free_nodes; - // rjf: fallback cache - U64 fallback_slots_count; - U64 fallback_stripes_count; - TXT_KeyFallbackSlot *fallback_slots; - TXT_Stripe *fallback_stripes; - // rjf: user -> parse thread U64 u2p_ring_size; U8 *u2p_ring_base; @@ -280,13 +259,14 @@ internal void txt_scope_touch_node__stripe_r_guarded(TXT_Scope *scope, TXT_Node //////////////////////////////// //~ rjf: Cache Lookups -internal TXT_TextInfo txt_text_info_from_key_hash_lang(TXT_Scope *scope, U128 key, U128 hash, TXT_LangKind lang); +internal TXT_TextInfo txt_text_info_from_hash_lang(TXT_Scope *scope, U128 hash, TXT_LangKind lang); +internal TXT_TextInfo txt_text_info_from_key_lang(TXT_Scope *scope, U128 key, TXT_LangKind lang, U128 *hash_out); //////////////////////////////// //~ rjf: Transfer Threads -internal B32 txt_u2p_enqueue_req(U128 key, U128 hash, TXT_LangKind lang, U64 endt_us); -internal void txt_u2p_dequeue_req(U128 *key_out, U128 *hash_out, TXT_LangKind *lang_out); +internal B32 txt_u2p_enqueue_req(U128 hash, TXT_LangKind lang, U64 endt_us); +internal void txt_u2p_dequeue_req(U128 *hash_out, TXT_LangKind *lang_out); internal void txt_parse_thread__entry_point(void *p); //////////////////////////////// From 40ed36df3f042bdfb1a89334172ef8044632ed99 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 15:31:39 -0700 Subject: [PATCH 228/275] txti -> txt; checkpoint #1 --- src/df/gfx/df_views.c | 108 ++++++++++++++------ src/file_stream/file_stream.c | 80 +++++++++------ src/file_stream/file_stream.h | 3 +- src/raddbg/raddbg.h | 1 - src/text_cache/text_cache.c | 185 ++++++++++++++++++++++++++++++++++ src/text_cache/text_cache.h | 9 ++ 6 files changed, 321 insertions(+), 65 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index d10e8d73..3b7ffdef 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -4958,46 +4958,92 @@ DF_VIEW_CMD_FUNCTION_DEF(Code) case DF_CoreCmdKind_GoToNameAtCursor: { Temp scratch = scratch_begin(0, 0); - TXTI_Handle txti_handle = df_txti_handle_from_entity(entity); - TxtRng expr_range = txt_rng(tv->cursor, tv->mark); - if(txt_pt_match(tv->cursor, tv->mark)) + TXT_Scope *txt_scope = txt_scope_open(); + HS_Scope *hs_scope = hs_scope_open(); { - expr_range = txti_expr_range_from_handle_pt(txti_handle, tv->cursor); + // rjf: unpack entity info + String8 path = df_full_path_from_entity(scratch.arena, entity); + U128 key = fs_key_from_path(path); + TXT_LangKind lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(path)); + U128 hash = {0}; + TXT_TextInfo text_info = txt_text_info_from_key_lang(txt_scope, key, lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + + // rjf: determine expression range + Rng1U64 expr_range = {0}; + { + TxtRng selection_range = txt_rng(tv->cursor, tv->mark); + if(txt_pt_match(selection_range.min, selection_range.max)) + { + expr_range = txt_expr_off_range_from_info_data_pt(&text_info, data, tv->cursor); + } + else + { + expr_range = r1u64(txt_off_from_info_pt(&text_info, selection_range.min), txt_off_from_info_pt(&text_info, selection_range.max)); + } + } + + // rjf: expression range -> text + String8 expr_text = str8_substr(data, expr_range); + + // rjf: go to name + DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); + params.entity = df_handle_from_entity(entity); + params.string = expr_text; + df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName)); } - String8 expr_text = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_range); - - // rjf: go to name - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(entity); - params.string = expr_text; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName)); - + hs_scope_close(hs_scope); + txt_scope_close(txt_scope); scratch_end(scratch); }break; case DF_CoreCmdKind_ToggleWatchExpressionAtCursor: { Temp scratch = scratch_begin(0, 0); - TXTI_Handle txti_handle = df_txti_handle_from_entity(entity); - TxtRng expr_range = txt_rng(tv->cursor, tv->mark); - if(txt_pt_match(tv->cursor, tv->mark)) + TXT_Scope *txt_scope = txt_scope_open(); + HS_Scope *hs_scope = hs_scope_open(); { - expr_range = txti_expr_range_from_handle_pt(txti_handle, tv->cursor); + // rjf: unpack entity info + String8 path = df_full_path_from_entity(scratch.arena, entity); + U128 key = fs_key_from_path(path); + TXT_LangKind lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(path)); + U128 hash = {0}; + TXT_TextInfo text_info = txt_text_info_from_key_lang(txt_scope, key, lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + + // rjf: determine expression range + Rng1U64 expr_range = {0}; + { + TxtRng selection_range = txt_rng(tv->cursor, tv->mark); + if(txt_pt_match(selection_range.min, selection_range.max)) + { + expr_range = txt_expr_off_range_from_info_data_pt(&text_info, data, tv->cursor); + } + else + { + expr_range = r1u64(txt_off_from_info_pt(&text_info, selection_range.min), txt_off_from_info_pt(&text_info, selection_range.max)); + } + } + + // rjf: expression range -> text + String8 expr_text = str8_substr(data, expr_range); + + // rjf: toggle watch expr + DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); + params.string = expr_text; + df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression)); + + // rjf: flash marker for grabbed expr + DF_Entity *flash_marker = df_entity_alloc(0, entity, DF_EntityKind_FlashMarker); + df_entity_equip_death_timer(flash_marker, 0.5f); + df_entity_equip_txt_pt(flash_marker, txt_pt_from_info_off__linear_scan(&text_info, expr_range.min)); + df_entity_equip_txt_pt_alt(flash_marker, txt_pt_from_info_off__linear_scan(&text_info, expr_range.max)); + df_entity_equip_color_rgba(flash_marker, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); + scratch_end(scratch); } - String8 expr_text = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_range); - - // rjf: toggle watch expr - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.string = expr_text; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression)); - - // rjf: flash marker for grabbed expr - DF_Entity *flash_marker = df_entity_alloc(0, entity, DF_EntityKind_FlashMarker); - df_entity_equip_death_timer(flash_marker, 0.5f); - df_entity_equip_txt_pt(flash_marker, expr_range.min); - df_entity_equip_txt_pt_alt(flash_marker, expr_range.max); - df_entity_equip_color_rgba(flash_marker, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); + hs_scope_close(hs_scope); + txt_scope_close(txt_scope); scratch_end(scratch); }break; case DF_CoreCmdKind_PickFile: diff --git a/src/file_stream/file_stream.c b/src/file_stream/file_stream.c index cc6f025d..8120912d 100644 --- a/src/file_stream/file_stream.c +++ b/src/file_stream/file_stream.c @@ -37,55 +37,71 @@ fs_init(void) //~ rjf: Cache Interaction internal U128 -fs_hash_from_path(String8 path, U64 rewind_count, U64 endt_us) +fs_hash_from_path(String8 path, U64 endt_us) { Temp scratch = scratch_begin(0, 0); + U128 result = {0}; path = path_normalized_from_string(scratch.arena, path); U128 path_key = hs_hash_from_data(path); - U128 result = hs_hash_from_key(path_key, rewind_count); - if(u128_match(result, u128_zero())) + for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) { - U64 slot_idx = path_key.u64[0]%fs_shared->slots_count; - U64 stripe_idx = slot_idx%fs_shared->stripes_count; - FS_Slot *slot = &fs_shared->slots[slot_idx]; - FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) for(;;) + result = hs_hash_from_key(path_key, rewind_idx); + if(!u128_match(result, u128_zero())) { - FS_Node *node = 0; - for(FS_Node *n = slot->first; n != 0; n = n->next) + break; + } + else if(u128_match(result, u128_zero()) && rewind_idx == 0) + { + U64 slot_idx = path_key.u64[0]%fs_shared->slots_count; + U64 stripe_idx = slot_idx%fs_shared->stripes_count; + FS_Slot *slot = &fs_shared->slots[slot_idx]; + FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) for(;;) { - if(str8_match(path, n->path, 0)) + FS_Node *node = 0; + for(FS_Node *n = slot->first; n != 0; n = n->next) + { + if(str8_match(path, n->path, 0)) + { + node = n; + break; + } + } + if(node == 0) OS_MutexScopeRWPromote(stripe->rw_mutex) + { + node = push_array(stripe->arena, FS_Node, 1); + SLLQueuePush(slot->first, slot->last, node); + node->path = push_str8_copy(stripe->arena, path); + } + if(os_now_microseconds() >= ins_atomic_u64_eval(&node->last_time_requested_us)+1000000 && + fs_u2s_enqueue_path(path, endt_us)) + { + ins_atomic_u64_eval_assign(&node->last_time_requested_us, os_now_microseconds()); + } + result = hs_hash_from_key(path_key, 0); + if(u128_match(result, u128_zero()) && os_now_microseconds() <= endt_us) + { + os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); + } + else { - node = n; break; } } - if(node == 0) OS_MutexScopeRWPromote(stripe->rw_mutex) - { - node = push_array(stripe->arena, FS_Node, 1); - SLLQueuePush(slot->first, slot->last, node); - node->path = push_str8_copy(stripe->arena, path); - } - if(os_now_microseconds() >= ins_atomic_u64_eval(&node->last_time_requested_us)+1000000 && - fs_u2s_enqueue_path(path, endt_us)) - { - ins_atomic_u64_eval_assign(&node->last_time_requested_us, os_now_microseconds()); - } - result = hs_hash_from_key(path_key, rewind_count); - if(u128_match(result, u128_zero()) && os_now_microseconds() <= endt_us) - { - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); - } - else - { - break; - } } } scratch_end(scratch); return result; } +internal U128 +fs_key_from_path(String8 path) +{ + U128 key = hs_hash_from_data(path); + fs_hash_from_path(path, 0); + return key; +} + //////////////////////////////// //~ rjf: Streamer Threads diff --git a/src/file_stream/file_stream.h b/src/file_stream/file_stream.h index 8ff10f43..6a491e44 100644 --- a/src/file_stream/file_stream.h +++ b/src/file_stream/file_stream.h @@ -74,7 +74,8 @@ internal void fs_init(void); //////////////////////////////// //~ rjf: Cache Interaction -internal U128 fs_hash_from_path(String8 path, U64 rewind_count, U64 endt_us); +internal U128 fs_hash_from_path(String8 path, U64 endt_us); +internal U128 fs_key_from_path(String8 path); //////////////////////////////// //~ rjf: Streamer Threads diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index df1afddc..29893def 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -19,7 +19,6 @@ // ctrl+C // [ ] UI_NavActions, OS_Event -> UI_Event (single event stream) // -// [ ] committing needs to happen when navigating focus away for any reason // [ ] better discoverability for view rules - have better help hover tooltip, // info on arguments, and better autocomplete lister // diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index c70e299d..105d4877 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -841,6 +841,191 @@ txt_text_info_from_key_lang(TXT_Scope *scope, U128 key, TXT_LangKind lang, U128 return result; } +//////////////////////////////// +//~ rjf: Text Info Extractor Helpers + +internal U64 +txt_off_from_info_pt(TXT_TextInfo *info, TxtPt pt) +{ + U64 off = 0; + if(1 <= pt.line && pt.line <= info->lines_count) + { + Rng1U64 line_range = info->lines_ranges[pt.line-1]; + off = line_range.min + (pt.column-1); + } + return off; +} + +internal TxtPt +txt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off) +{ + TxtPt pt = {0}; + { + for(U64 line_idx = 0; line_idx < info->lines_count; line_idx += 1) + { + if(contains_1u64(info->lines_ranges[line_idx], off)) + { + pt.line = (S64)line_idx + 1; + pt.column = (S64)(off - info->lines_ranges[line_idx].min) + 1; + } + } + } + return pt; +} + +internal TXT_TokenArray +txt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num) +{ + TXT_TokenArray line_tokens = {0}; + if(1 <= line_num && line_num <= info->lines_count) + { + Rng1U64 line_range = info->lines_ranges[line_num-1]; + for(U64 token_idx = 0; token_idx < info->tokens.count; token_idx += 1) + { + Rng1U64 token_range = info->tokens.v[token_idx].range; + Rng1U64 token_x_line = intersect_1u64(token_range, line_range); + if(token_x_line.max > token_x_line.min) + { + if(line_tokens.v == 0) + { + line_tokens.v = info->tokens.v+token_idx; + } + line_tokens.count += 1; + } + else if(line_tokens.v != 0) + { + break; + } + } + } + return line_tokens; +} + +internal Rng1U64 +txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens) +{ + Rng1U64 result = {0}; + Temp scratch = scratch_begin(0, 0); + { + // rjf: unpack line info + TXT_Token *line_tokens_first = line_tokens->v; + TXT_Token *line_tokens_opl = line_tokens->v+line_tokens->count; + + // rjf: find token containing `off` + TXT_Token *pt_token = 0; + for(TXT_Token *token = line_tokens_first; + token < line_tokens_opl; + token += 1) + { + if(contains_1u64(token->range, off)) + { + Rng1U64 token_range_clamped = intersect_1u64(line_range, token->range); + String8 token_string = str8_substr(line_text, r1u64(token_range_clamped.max - line_range.min, token_range_clamped.max - line_range.min)); + B32 token_ender = 0; + switch(token->kind) + { + default:{}break; + case TXT_TokenKind_Symbol: + { + token_ender = (str8_match(token_string, str8_lit("]"), 0)); + }break; + case TXT_TokenKind_Identifier: + case TXT_TokenKind_Keyword: + case TXT_TokenKind_String: + case TXT_TokenKind_Meta: + { + token_ender = 1; + }break; + } + if(token_ender) + { + pt_token = token; + } + break; + } + } + + // rjf: found token containing `off`? -> mark that as our initial range + if(pt_token != 0) + { + result = pt_token->range; + } + + // rjf: walk back from pt_token - try to find plausible start of expression + if(pt_token != 0) + { + B32 walkback_done = 0; + S32 nest = 0; + for(TXT_Token *wb_token = pt_token; + wb_token >= line_tokens_first && walkback_done == 0; + wb_token -= 1) + { + Rng1U64 wb_token_range_clamped = intersect_1u64(line_range, wb_token->range); + String8 wb_token_string = str8_substr(line_text, r1u64(wb_token_range_clamped.min - line_range.min, wb_token_range_clamped.max - line_range.min)); + B32 include_wb_token = 0; + switch(wb_token->kind) + { + default:{}break; + case TXT_TokenKind_Symbol: + { + B32 is_scope_resolution = str8_match(wb_token_string, str8_lit("::"), 0); + B32 is_dot = str8_match(wb_token_string, str8_lit("."), 0); + B32 is_arrow = str8_match(wb_token_string, str8_lit("->"), 0); + B32 is_open_bracket = str8_match(wb_token_string, str8_lit("["), 0); + B32 is_close_bracket = str8_match(wb_token_string, str8_lit("]"), 0); + nest -= !!(is_open_bracket); + nest += !!(is_close_bracket); + if(is_scope_resolution || + is_dot || + is_arrow || + is_open_bracket|| + is_close_bracket) + { + include_wb_token = 1; + } + }break; + case TXT_TokenKind_Identifier: + { + include_wb_token = 1; + }break; + } + if(include_wb_token) + { + result = union_1u64(result, wb_token->range); + } + else if(nest == 0) + { + walkback_done = 1; + } + } + } + } + scratch_end(scratch); + return result; +} + +internal Rng1U64 +txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt) +{ + Rng1U64 result = {0}; + Temp scratch = scratch_begin(0, 0); + if(1 <= pt.line && pt.line <= info->lines_count) + { + // rjf: unpack line info + Rng1U64 line_range = info->lines_ranges[pt.line-1]; + String8 line_text = str8_substr(data, line_range); + TXT_TokenArray line_tokens = txt_token_array_from_info_line_num__linear_scan(info, pt.line); + TXT_Token *line_tokens_first = line_tokens.v; + TXT_Token *line_tokens_opl = line_tokens.v+line_tokens.count; + U64 pt_off = line_range.min + (pt.column-1); + + // rjf: grab offset range of expression + result = txt_expr_off_range_from_line_off_range_string_tokens(pt_off, line_range, line_text, &line_tokens); + } + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Transfer Threads diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index d5501ff9..d46f84e3 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -262,6 +262,15 @@ internal void txt_scope_touch_node__stripe_r_guarded(TXT_Scope *scope, TXT_Node internal TXT_TextInfo txt_text_info_from_hash_lang(TXT_Scope *scope, U128 hash, TXT_LangKind lang); internal TXT_TextInfo txt_text_info_from_key_lang(TXT_Scope *scope, U128 key, TXT_LangKind lang, U128 *hash_out); +//////////////////////////////// +//~ rjf: Text Info Extractor Helpers + +internal U64 txt_off_from_info_pt(TXT_TextInfo *info, TxtPt pt); +internal TxtPt txt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off); +internal TXT_TokenArray txt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num); +internal Rng1U64 txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens); +internal Rng1U64 txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt); + //////////////////////////////// //~ rjf: Transfer Threads From e80c69cb8fb08a021195027b44d2815c68fd99d6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 16:00:43 -0700 Subject: [PATCH 229/275] txti -> txt; checkpoint #2 --- src/df/gfx/df_views.c | 108 +++++++++++++++++++++--------------- src/text_cache/text_cache.h | 2 +- 2 files changed, 65 insertions(+), 45 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 3b7ffdef..1785cc9c 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5070,6 +5070,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); DBGI_Scope *dbgi_scope = dbgi_scope_open(); TXT_Scope *txt_scope = txt_scope_open(); DF_CodeViewState *tv = df_view_user_state(view, DF_CodeViewState); @@ -5103,17 +5104,21 @@ DF_VIEW_UI_FUNCTION_DEF(Code) //- rjf: unpack file/text entity info // B32 entity_is_missing = !!(entity->flags & DF_EntityFlag_IsMissing && !(entity->flags & DF_EntityFlag_Output)); - TXTI_Handle txti_handle = df_txti_handle_from_entity(entity); - TXTI_BufferInfo txti_buffer_info = txti_buffer_info_from_handle(scratch.arena, txti_handle); - B32 txti_buffer_is_ready = ((txti_buffer_info.timestamp != 0 || entity->flags & DF_EntityFlag_Output) && - (txti_buffer_info.bytes_processed == txti_buffer_info.bytes_to_process || txti_buffer_info.buffer_apply_gen != 0)); + String8 path = df_full_path_from_entity(scratch.arena, entity); + U128 key = fs_key_from_path(path); + TXT_LangKind lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(path)); + U128 hash = {0}; + TXT_TextInfo text_info = txt_text_info_from_key_lang(txt_scope, key, lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + B32 text_info_is_ready = (text_info.lines_count != 0); ////////////////////////////// //- rjf: buffer is pending -> equip view with loading information // - if(!entity_is_missing && !txti_buffer_is_ready) + if(!entity_is_missing && !text_info_is_ready) { - df_view_equip_loading_info(view, 1, txti_buffer_info.bytes_processed, txti_buffer_info.bytes_to_process); + // df_view_equip_loading_info(view, 1, txti_buffer_info.bytes_processed, txti_buffer_info.bytes_to_process); + df_view_equip_loading_info(view, 1, 0, 0); } ////////////////////////////// @@ -5125,12 +5130,12 @@ DF_VIEW_UI_FUNCTION_DEF(Code) view->scroll_pos.y.idx + 1 + num_possible_visible_lines); U64 visible_line_count = 0; { - visible_line_num_range.min = Clamp(1, visible_line_num_range.min, (S64)txti_buffer_info.total_line_count); - visible_line_num_range.max = Clamp(1, visible_line_num_range.max, (S64)txti_buffer_info.total_line_count); + visible_line_num_range.min = Clamp(1, visible_line_num_range.min, (S64)text_info.lines_count); + visible_line_num_range.max = Clamp(1, visible_line_num_range.max, (S64)text_info.lines_count); visible_line_num_range.min = Max(1, visible_line_num_range.min); visible_line_num_range.max = Max(1, visible_line_num_range.max); - target_visible_line_num_range.min = Clamp(1, target_visible_line_num_range.min, (S64)txti_buffer_info.total_line_count); - target_visible_line_num_range.max = Clamp(1, target_visible_line_num_range.max, (S64)txti_buffer_info.total_line_count); + target_visible_line_num_range.min = Clamp(1, target_visible_line_num_range.min, (S64)text_info.lines_count); + target_visible_line_num_range.max = Clamp(1, target_visible_line_num_range.max, (S64)text_info.lines_count); target_visible_line_num_range.min = Max(1, target_visible_line_num_range.min); target_visible_line_num_range.max = Max(1, target_visible_line_num_range.max); visible_line_count = (U64)dim_1s64(visible_line_num_range)+1; @@ -5142,11 +5147,11 @@ DF_VIEW_UI_FUNCTION_DEF(Code) S64 line_size_x = 0; Rng1S64 scroll_idx_rng[Axis2_COUNT] = {0}; { - line_size_x = (txti_buffer_info.max_line_size*big_glyph_advance*3)/2; + line_size_x = (text_info.lines_max_size*big_glyph_advance*3)/2; line_size_x = ClampBot(line_size_x, (S64)big_glyph_advance*120); line_size_x = ClampBot(line_size_x, (S64)code_area_dim.x); scroll_idx_rng[Axis2_X] = r1s64(0, line_size_x-(S64)code_area_dim.x); - scroll_idx_rng[Axis2_Y] = r1s64(0, (S64)txti_buffer_info.total_line_count-1); + scroll_idx_rng[Axis2_Y] = r1s64(0, (S64)text_info.lines_count-1); } ////////////////////////////// @@ -5154,7 +5159,6 @@ DF_VIEW_UI_FUNCTION_DEF(Code) // F32 margin_width_px = big_glyph_advance*3.5f; F32 line_num_width_px = big_glyph_advance * (log10(visible_line_num_range.max) + 3); - TXTI_Slice slice = txti_slice_from_handle_line_range(scratch.arena, txti_handle, visible_line_num_range); ////////////////////////////// //- rjf: get active search query @@ -5177,19 +5181,19 @@ DF_VIEW_UI_FUNCTION_DEF(Code) //- rjf: prepare code slice info bundle, for the viewable region of text // DF_CodeSliceParams code_slice_params = {0}; - if(txti_buffer_is_ready) + if(text_info_is_ready) { // rjf: fill basics code_slice_params.flags = DF_CodeSliceFlag_Margin|DF_CodeSliceFlag_LineNums; code_slice_params.line_num_range = visible_line_num_range; - code_slice_params.line_text = slice.line_text; - code_slice_params.line_ranges = slice.line_ranges; - code_slice_params.line_tokens = slice.line_tokens; - code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, slice.line_count); - code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, slice.line_count); - code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, slice.line_count); - code_slice_params.line_dasm2src = push_array(scratch.arena, DF_TextLineDasm2SrcInfoList, slice.line_count); - code_slice_params.line_src2dasm = push_array(scratch.arena, DF_TextLineSrc2DasmInfoList, slice.line_count); + code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count); + code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); + code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, visible_line_count); + code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, visible_line_count); + code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, visible_line_count); + code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, visible_line_count); + code_slice_params.line_dasm2src = push_array(scratch.arena, DF_TextLineDasm2SrcInfoList, visible_line_count); + code_slice_params.line_src2dasm = push_array(scratch.arena, DF_TextLineSrc2DasmInfoList, visible_line_count); code_slice_params.font = code_font; code_slice_params.font_size = code_font_size; code_slice_params.line_height_px = code_line_height; @@ -5199,6 +5203,18 @@ DF_VIEW_UI_FUNCTION_DEF(Code) code_slice_params.line_text_max_width_px = (F32)line_size_x; code_slice_params.flash_ranges = df_push_entity_child_list_with_kind(scratch.arena, entity, DF_EntityKind_FlashMarker); + // rjf: fill text info + { + S64 line_num = visible_line_num_range.min; + U64 line_idx = visible_line_num_range.min-1; + for(U64 visible_line_idx = 0; visible_line_idx < visible_line_count; visible_line_idx += 1, line_idx += 1, line_num += 1) + { + code_slice_params.line_text[visible_line_idx] = str8_substr(data, text_info.lines_ranges[line_idx]); + code_slice_params.line_ranges[visible_line_idx] = text_info.lines_ranges[line_idx]; + code_slice_params.line_tokens[visible_line_idx] = txt_token_array_from_info_line_num__linear_scan(&text_info, line_num); + } + } + // rjf: find visible breakpoints ProfScope("find visible breakpoints") { @@ -5305,7 +5321,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) //- rjf: build container // UI_Box *container_box = &ui_g_nil_box; - if(txti_buffer_is_ready) + if(text_info_is_ready) { ui_set_next_pref_width(ui_px(code_area_dim.x, 1)); ui_set_next_pref_height(ui_px(code_area_dim.y, 1)); @@ -5340,7 +5356,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ////////////////////////////// //- rjf: do searching operations // - if(txti_buffer_is_ready) + if(text_info_is_ready) { //- rjf: find text (forward) if(tv->find_text_fwd.size != 0) @@ -5349,14 +5365,14 @@ DF_VIEW_UI_FUNCTION_DEF(Code) B32 found = 0; B32 first = 1; S64 line_num_start = tv->cursor.line; - S64 line_num_last = (S64)txti_buffer_info.total_line_count; + S64 line_num_last = (S64)text_info.lines_count; for(S64 line_num = line_num_start;; first = 0) { // rjf: pop scratch temp_end(scratch); // rjf: gather line info - String8 line_string = txti_string_from_handle_line_num(scratch.arena, txti_handle, line_num); + String8 line_string = str8_substr(data, text_info.lines_ranges[line_num-1]); U64 search_start = 0; if(tv->cursor.line == line_num && first) { @@ -5405,14 +5421,14 @@ DF_VIEW_UI_FUNCTION_DEF(Code) B32 found = 0; B32 first = 1; S64 line_num_start = tv->cursor.line; - S64 line_num_last = (S64)txti_buffer_info.total_line_count; + S64 line_num_last = (S64)text_info.lines_count; for(S64 line_num = line_num_start;; first = 0) { // rjf: pop scratch temp_end(scratch); // rjf: gather line info - String8 line_string = txti_string_from_handle_line_num(scratch.arena, txti_handle, line_num); + String8 line_string = str8_substr(data, text_info.lines_ranges[line_num-1]); if(tv->cursor.line == line_num && first) { line_string = str8_prefix(line_string, tv->cursor.column-1); @@ -5470,11 +5486,11 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ////////////////////////////// //- rjf: do goto line // - if(txti_buffer_is_ready) if(tv->goto_line_num != 0) + if(text_info_is_ready) if(tv->goto_line_num != 0) { S64 line_num = tv->goto_line_num; tv->goto_line_num = 0; - line_num = Clamp(1, line_num, txti_buffer_info.total_line_count); + line_num = Clamp(1, line_num, text_info.lines_count); tv->cursor = tv->mark = txt_pt(line_num, 1); tv->center_cursor = !tv->contain_cursor || (line_num < target_visible_line_num_range.min+4 || target_visible_line_num_range.max-4 < line_num); } @@ -5485,16 +5501,16 @@ DF_VIEW_UI_FUNCTION_DEF(Code) B32 snap[Axis2_COUNT] = {0}; UI_Focus(UI_FocusKind_On) { - if(txti_buffer_is_ready && visible_line_num_range.max >= visible_line_num_range.min && ui_is_focus_active()) + if(text_info_is_ready && visible_line_num_range.max >= visible_line_num_range.min && ui_is_focus_active()) { - snap[Axis2_X] = snap[Axis2_Y] = df_do_txti_controls(txti_handle, ClampBot(num_possible_visible_lines, 10) - 10, &tv->cursor, &tv->mark, &tv->preferred_column); + //snap[Axis2_X] = snap[Axis2_Y] = df_do_txti_controls(txti_handle, ClampBot(num_possible_visible_lines, 10) - 10, &tv->cursor, &tv->mark, &tv->preferred_column); } } ////////////////////////////// //- rjf: build container contents // - if(txti_buffer_is_ready) UI_Parent(container_box) + if(text_info_is_ready) UI_Parent(container_box) { //- rjf: build fractional space container_box->view_off.x = container_box->view_off_target.x = view->scroll_pos.x.idx + view->scroll_pos.x.off; @@ -5511,7 +5527,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code) if(!ui_dragging(sig.base) && sig.mouse_expr_rng.min.line != 0 && sig.base.event_flags == 0) { TxtRng expr_rng = sig.mouse_expr_rng; - String8 expr = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_rng); + // TODO(rjf): @txt + String8 expr = {0};//txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_rng); if(expr.size != 0) { DF_Eval eval = df_eval_from_string(scratch.arena, dbgi_scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); @@ -5541,7 +5558,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ui_kill_action(); DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.entity = df_handle_from_entity(entity); - params.string = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, txti_expr_range_from_handle_pt(txti_handle, sig.mouse_pt)); + // TODO(rjf): @txt + //params.string = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, txti_expr_range_from_handle_pt(txti_handle, sig.mouse_pt)); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName)); } @@ -5613,7 +5631,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code) df_entity_equip_color_rgba(flash_range, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); df_entity_equip_txt_pt(flash_range, sig.copy_range.min); df_entity_equip_txt_pt_alt(flash_range, sig.copy_range.max); - String8 text = txti_string_from_handle_txt_rng(temp.arena, txti_handle, sig.copy_range); + // TODO(rjf): @txt + String8 text = {0};//txti_string_from_handle_txt_rng(temp.arena, txti_handle, sig.copy_range); os_set_clipboard_text(text); temp_end(temp); } @@ -5677,7 +5696,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ////////////////////////////// //- rjf: apply post-build view snapping rules // - if(txti_buffer_is_ready) + if(text_info_is_ready) { // rjf: center first match TxtPt next_match = df_text_search_match_array_find_nearest__linear_scan(&search_query_matches, tv->cursor, search_query_side).pt; @@ -5708,7 +5727,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) if(tv->center_cursor) { tv->center_cursor = 0; - String8 cursor_line = txti_string_from_handle_line_num(scratch.arena, txti_handle, tv->cursor.line); + String8 cursor_line = str8_substr(data, text_info.lines_ranges[tv->cursor.line-1]); F32 cursor_advance = f_dim_from_tag_size_string(code_font, code_font_size, str8_prefix(cursor_line, tv->cursor.column-1)).x; // rjf: scroll x @@ -5731,7 +5750,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) // rjf: snap in X if(snap[Axis2_X]) { - String8 cursor_line = txti_string_from_handle_line_num(scratch.arena, txti_handle, tv->cursor.line); + String8 cursor_line = str8_substr(data, text_info.lines_ranges[tv->cursor.line-1]); S64 cursor_off = (S64)(f_dim_from_tag_size_string(code_font, code_font_size, str8_prefix(cursor_line, tv->cursor.column-1)).x + margin_width_px + line_num_width_px); Rng1S64 visible_pixel_range = { @@ -5759,7 +5778,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) S64 min_delta = Min(0, cursor_visibility_range.min-(target_visible_line_num_range.min)); S64 max_delta = Max(0, cursor_visibility_range.max-(target_visible_line_num_range.min+num_possible_visible_lines)); S64 new_idx = view->scroll_pos.y.idx+min_delta+max_delta; - new_idx = Clamp(0, new_idx, (S64)txti_buffer_info.total_line_count-1); + new_idx = Clamp(0, new_idx, (S64)text_info.lines_count-1); ui_scroll_pt_target_idx(&view->scroll_pos.y, new_idx); } } @@ -5767,7 +5786,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ////////////////////////////// //- rjf: build horizontal scroll bar // - if(txti_buffer_is_ready) + if(text_info_is_ready) { ui_set_next_fixed_x(0); ui_set_next_fixed_y(code_area_dim.y); @@ -5785,7 +5804,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ////////////////////////////// //- rjf: build vertical scroll bar // - if(txti_buffer_is_ready) + if(text_info_is_ready) { ui_set_next_fixed_x(code_area_dim.x); ui_set_next_fixed_y(0); @@ -5803,7 +5822,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ////////////////////////////// //- rjf: top-level container interaction (scrolling) // - if(txti_buffer_is_ready) + if(text_info_is_ready) { UI_Signal sig = ui_signal_from_box(container_box); if(sig.scroll.x != 0) @@ -5848,7 +5867,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ////////////////////////////// //- rjf: build bottom info bar // - if(txti_buffer_is_ready) + if(text_info_is_ready) { ui_set_next_fixed_x(0); ui_set_next_fixed_y(code_area_dim.y + scroll_bar_dim); @@ -5900,6 +5919,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) txt_scope_close(txt_scope); dbgi_scope_close(dbgi_scope); + hs_scope_close(hs_scope); scratch_end(scratch); ProfEnd(); } diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index d46f84e3..47f8b868 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -283,4 +283,4 @@ internal void txt_parse_thread__entry_point(void *p); internal void txt_evictor_thread__entry_point(void *p); -#endif //TEXT_CACHE_H +#endif // TEXT_CACHE_H From 88798e4453d60d63fc19627c912393c95fbaadb0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 16:04:21 -0700 Subject: [PATCH 230/275] txti -> txt; checkpoint #3 --- src/df/gfx/df_views.c | 10 ++++------ src/text_cache/text_cache.c | 8 ++++++++ src/text_cache/text_cache.h | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 1785cc9c..ad3d54eb 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5503,6 +5503,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) { if(text_info_is_ready && visible_line_num_range.max >= visible_line_num_range.min && ui_is_focus_active()) { + // TODO(rjf): @txt //snap[Axis2_X] = snap[Axis2_Y] = df_do_txti_controls(txti_handle, ClampBot(num_possible_visible_lines, 10) - 10, &tv->cursor, &tv->mark, &tv->preferred_column); } } @@ -5527,8 +5528,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) if(!ui_dragging(sig.base) && sig.mouse_expr_rng.min.line != 0 && sig.base.event_flags == 0) { TxtRng expr_rng = sig.mouse_expr_rng; - // TODO(rjf): @txt - String8 expr = {0};//txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_rng); + String8 expr = txt_string_from_info_data_txt_rng(&text_info, data, expr_rng); if(expr.size != 0) { DF_Eval eval = df_eval_from_string(scratch.arena, dbgi_scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); @@ -5558,8 +5558,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) ui_kill_action(); DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.entity = df_handle_from_entity(entity); - // TODO(rjf): @txt - //params.string = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, txti_expr_range_from_handle_pt(txti_handle, sig.mouse_pt)); + params.string = txt_string_from_info_data_txt_rng(&text_info, data, sig.mouse_expr_rng); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName)); } @@ -5631,8 +5630,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) df_entity_equip_color_rgba(flash_range, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); df_entity_equip_txt_pt(flash_range, sig.copy_range.min); df_entity_equip_txt_pt_alt(flash_range, sig.copy_range.max); - // TODO(rjf): @txt - String8 text = {0};//txti_string_from_handle_txt_rng(temp.arena, txti_handle, sig.copy_range); + String8 text = txt_string_from_info_data_txt_rng(&text_info, data, sig.copy_range); os_set_clipboard_text(text); temp_end(temp); } diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 105d4877..5e24921a 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -1026,6 +1026,14 @@ txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt) return result; } +internal String8 +txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng) +{ + Rng1U64 rng_off = r1u64(txt_off_from_info_pt(info, rng.min), txt_off_from_info_pt(info, rng.max)); + String8 result = str8_substr(data, rng_off); + return result; +} + //////////////////////////////// //~ rjf: Transfer Threads diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index 47f8b868..e3c26127 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -270,6 +270,7 @@ internal TxtPt txt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off); internal TXT_TokenArray txt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num); internal Rng1U64 txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens); internal Rng1U64 txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt); +internal String8 txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng); //////////////////////////////// //~ rjf: Transfer Threads From 8792c2280c5921ba746746eadcff8c30f1749111 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 16:26:31 -0700 Subject: [PATCH 231/275] txti -> txt; checkpoint #4 --- src/df/gfx/df_views.c | 3 +- src/text_cache/text_cache.c | 64 +++++++++++++++++++++++++++++++++++-- src/text_cache/text_cache.h | 2 ++ 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index ad3d54eb..d3edb5e0 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5117,8 +5117,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) // if(!entity_is_missing && !text_info_is_ready) { - // df_view_equip_loading_info(view, 1, txti_buffer_info.bytes_processed, txti_buffer_info.bytes_to_process); - df_view_equip_loading_info(view, 1, 0, 0); + df_view_equip_loading_info(view, 1, text_info.bytes_processed, text_info.bytes_to_process); } ////////////////////////////// diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 5e24921a..40f44a11 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -774,6 +774,8 @@ txt_text_info_from_hash_lang(TXT_Scope *scope, U128 hash, TXT_LangKind lang) if(u128_match(hash, n->hash) && n->lang == lang) { MemoryCopyStruct(&info, &n->info); + info.bytes_processed = ins_atomic_u64_eval(&n->info.bytes_processed); + info.bytes_to_process = ins_atomic_u64_eval(&n->info.bytes_to_process); found = 1; txt_scope_touch_node__stripe_r_guarded(scope, n); break; @@ -1106,7 +1108,7 @@ txt_parse_thread__entry_point(void *p) { for(TXT_Node *n = slot->first; n != 0; n = n->next) { - if(u128_match(n->hash, hash)) + if(u128_match(n->hash, hash) && n->lang == lang) { got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); break; @@ -1128,6 +1130,28 @@ txt_parse_thread__entry_point(void *p) { info_arena = arena_alloc(); + //- rjf: grab pointers to working counters + U64 *bytes_processed_ptr = 0; + U64 *bytes_to_process_ptr = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TXT_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && n->lang == lang) + { + bytes_processed_ptr = &n->info.bytes_processed; + bytes_to_process_ptr = &n->info.bytes_to_process; + } + } + } + + //- rjf: set # of bytes to process + if(bytes_to_process_ptr) + { + // (line ending calc) (line counting) (line measuring) (lexing) + ins_atomic_u64_eval_assign(bytes_to_process_ptr, Min(data.size, 1024) + data.size + data.size + data.size*(lang != TXT_LangKind_Null)); + } + //- rjf: detect line end kind TXT_LineEndKind line_end_kind = TXT_LineEndKind_Null; { @@ -1155,6 +1179,12 @@ txt_parse_thread__entry_point(void *p) info.line_end_kind = line_end_kind; } + //- rjf: bump progress + if(bytes_processed_ptr) + { + ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024)); + } + //- rjf: count # of lines U64 line_count = 1; U64 byte_process_start_idx = 0; @@ -1168,6 +1198,16 @@ txt_parse_thread__entry_point(void *p) idx += 1; } } + if(idx && idx%1000 == 0) + { + ins_atomic_u64_add_eval(bytes_processed_ptr, 1000); + } + } + + //- rjf: bump progress + if(bytes_processed_ptr) + { + ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size); } //- rjf: allocate & store line ranges @@ -1191,6 +1231,16 @@ txt_parse_thread__entry_point(void *p) idx += 1; } } + if(idx && idx%1000 == 0) + { + ins_atomic_u64_add_eval(bytes_processed_ptr, 1000); + } + } + + //- rjf: bump progress + if(bytes_processed_ptr) + { + ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size + data.size); } //- rjf: lang -> lex function @@ -1200,9 +1250,15 @@ txt_parse_thread__entry_point(void *p) TXT_TokenArray tokens = {0}; if(lex_function != 0) { - tokens = lex_function(info_arena, 0, data); + tokens = lex_function(info_arena, bytes_processed_ptr, data); } info.tokens = tokens; + + //- rjf: bump progress + if(bytes_processed_ptr) + { + ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size + data.size + data.size*(lex_function != 0)); + } } //- rjf: commit results to cache @@ -1210,9 +1266,11 @@ txt_parse_thread__entry_point(void *p) { for(TXT_Node *n = slot->first; n != 0; n = n->next) { - if(u128_match(n->hash, hash)) + if(u128_match(n->hash, hash) && n->lang == lang) { n->arena = info_arena; + info.bytes_processed = n->info.bytes_processed; + info.bytes_to_process = n->info.bytes_to_process; MemoryCopyStruct(&n->info, &info); ins_atomic_u32_eval_assign(&n->is_working, 0); ins_atomic_u64_inc_eval(&n->load_count); diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index e3c26127..6562ce79 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -94,6 +94,8 @@ struct TXT_TextInfo U64 lines_max_size; TXT_LineEndKind line_end_kind; TXT_TokenArray tokens; + U64 bytes_processed; + U64 bytes_to_process; }; //////////////////////////////// From 4272258f9970f232d158331b72d40d6c472c4c05 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 16:38:12 -0700 Subject: [PATCH 232/275] txti -> txt; checkpoint #5 --- src/df/gfx/df_views.c | 7 +-- src/text_cache/text_cache.c | 95 ++++++++++++++++++++++++++++++++++++- src/text_cache/text_cache.h | 7 +++ 3 files changed, 105 insertions(+), 4 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index d3edb5e0..cf4e8911 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -4850,7 +4850,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(Code) // rjf: default to loading df_view_equip_loading_info(view, 1, 0, 0); - view->loading_t_target = 1.f; + view->loading_t = view->loading_t_target = 1.f; } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Code) @@ -5158,6 +5158,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) // F32 margin_width_px = big_glyph_advance*3.5f; F32 line_num_width_px = big_glyph_advance * (log10(visible_line_num_range.max) + 3); + TXT_LineTokensSlice slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, &text_info, data, visible_line_num_range); ////////////////////////////// //- rjf: get active search query @@ -5210,7 +5211,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) { code_slice_params.line_text[visible_line_idx] = str8_substr(data, text_info.lines_ranges[line_idx]); code_slice_params.line_ranges[visible_line_idx] = text_info.lines_ranges[line_idx]; - code_slice_params.line_tokens[visible_line_idx] = txt_token_array_from_info_line_num__linear_scan(&text_info, line_num); + code_slice_params.line_tokens[visible_line_idx] = slice.line_tokens[visible_line_idx]; } } @@ -6921,7 +6922,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(Output) // rjf: default to loading df_view_equip_loading_info(view, 1, 0, 0); - view->loading_t_target = 1.f; + view->loading_t = view->loading_t_target = 1.f; } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Output) diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 40f44a11..9252c172 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -1016,7 +1016,8 @@ txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt) // rjf: unpack line info Rng1U64 line_range = info->lines_ranges[pt.line-1]; String8 line_text = str8_substr(data, line_range); - TXT_TokenArray line_tokens = txt_token_array_from_info_line_num__linear_scan(info, pt.line); + TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, info, data, r1s64(pt.line, pt.line)); + TXT_TokenArray line_tokens = line_tokens_slice.line_tokens[0]; TXT_Token *line_tokens_first = line_tokens.v; TXT_Token *line_tokens_opl = line_tokens.v+line_tokens.count; U64 pt_off = line_range.min + (pt.column-1); @@ -1036,6 +1037,98 @@ txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng) return result; } +internal TXT_LineTokensSlice +txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range) +{ + TXT_LineTokensSlice result = {0}; + Temp scratch = scratch_begin(&arena, 1); + if(info->lines_count != 0) + { + Rng1S64 line_range_clamped = r1s64(Clamp(1, line_range.min, (S64)info->lines_count), Clamp(1, line_range.max, (S64)info->lines_count)); + U64 line_count = (U64)dim_1s64(line_range_clamped)+1; + + // rjf: allocate output arrays + result.line_tokens = push_array(arena, TXT_TokenArray, line_count); + + // rjf: binary search to find first token + TXT_Token *tokens_first = 0; + ProfScope("binary search to find first token") + { + Rng1U64 slice_range = r1u64(info->lines_ranges[line_range_clamped.min-1].min, info->lines_ranges[line_range_clamped.max-1].max); + U64 min_idx = 0; + U64 opl_idx = info->tokens.count; + for(;;) + { + U64 mid_idx = (opl_idx+min_idx)/2; + if(mid_idx >= opl_idx) + { + break; + } + TXT_Token *mid_token = &info->tokens.v[mid_idx]; + if(mid_token->range.min > slice_range.max) + { + opl_idx = mid_idx; + } + else if(mid_token->range.max < slice_range.min) + { + min_idx = mid_idx; + } + else if(tokens_first == 0 || mid_token->range.min < tokens_first->range.min) + { + tokens_first = mid_token; + opl_idx = mid_idx; + } + if(mid_idx == min_idx && mid_idx+1 == opl_idx) + { + break; + } + } + } + + // rjf: grab per-line tokens + TXT_TokenList *line_tokens_lists = push_array(scratch.arena, TXT_TokenList, line_count); + if(tokens_first != 0) ProfScope("grab per-line tokens") + { + TXT_Token *tokens_opl = info->tokens.v+info->tokens.count; + U64 line_slice_idx = 0; + for(TXT_Token *token = tokens_first; token < tokens_opl && line_slice_idx < line_count;) + { + if(token->range.min < info->lines_ranges[line_slice_idx+line_range.min-1].max) + { + if(token->range.max > info->lines_ranges[line_slice_idx+line_range.min-1].min) + { + txt_token_list_push(scratch.arena, &line_tokens_lists[line_slice_idx], token); + } + B32 need_token_advance = 0; + B32 need_line_advance = 0; + if(token->range.max >= info->lines_ranges[line_slice_idx+line_range.min-1].max) + { + need_line_advance = 1; + } + if(token->range.max <= info->lines_ranges[line_slice_idx+line_range.min-1].max) + { + need_token_advance += 1; + } + if(need_line_advance) { line_slice_idx += 1; } + if(need_token_advance) { token += 1; } + } + else + { + line_slice_idx += 1; + } + } + } + + // rjf: bake per-line tokens to arrays + for(U64 line_slice_idx = 0; line_slice_idx < line_count; line_slice_idx += 1) + { + result.line_tokens[line_slice_idx] = txt_token_array_from_list(arena, &line_tokens_lists[line_slice_idx]); + } + } + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Transfer Threads diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index 6562ce79..43e6f41a 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -98,6 +98,12 @@ struct TXT_TextInfo U64 bytes_to_process; }; +typedef struct TXT_LineTokensSlice TXT_LineTokensSlice; +struct TXT_LineTokensSlice +{ + TXT_TokenArray *line_tokens; +}; + //////////////////////////////// //~ rjf: Language Kind Types @@ -273,6 +279,7 @@ internal TXT_TokenArray txt_token_array_from_info_line_num__linear_scan(TXT_Text internal Rng1U64 txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens); internal Rng1U64 txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt); internal String8 txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng); +internal TXT_LineTokensSlice txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range); //////////////////////////////// //~ rjf: Transfer Threads From d73a3d41963e4be560b25e616be57e262eb5ed96 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 Mar 2024 16:47:15 -0700 Subject: [PATCH 233/275] plug txt-layer-provided tokens into text view rule - both source code & text view rule are now completely powered via the txt visualization layer, rather than the special-purpose txti layer, which is now being retired --- src/df/gfx/df_view_rule_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index b64901c4..1e443aa9 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -693,6 +693,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) U128 text_hash = {0}; TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, text_key, top.lang, &text_hash); String8 data = hs_data_from_hash(hs_scope, text_hash); + TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, &info, data, r1s64(1, info.lines_count)); //- rjf: info -> code slice info DF_CodeSliceParams code_slice_params = {0}; @@ -711,6 +712,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) { code_slice_params.line_text[line_idx] = str8_substr(data, info.lines_ranges[line_idx]); code_slice_params.line_ranges[line_idx] = info.lines_ranges[line_idx]; + code_slice_params.line_tokens[line_idx] = line_tokens_slice.line_tokens[line_idx]; } code_slice_params.font = df_font_from_slot(DF_FontSlot_Code); code_slice_params.font_size = ui_top_font_size(); From 4899f1871b1c2203b64251c85db626998b662db0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 Mar 2024 11:19:24 -0700 Subject: [PATCH 234/275] correctly close module file handles on module unloading in new demon layer --- src/dbgi/dbgi.c | 3 +-- src/demon/win32/demon_core_win32.c | 4 ++++ src/os/core/win32/os_core_win32.c | 9 ++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index 770c5da9..36879117 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -365,8 +365,7 @@ dbgi_binary_close(String8 exe_path) if(need_deletion) for(;;) { os_rw_mutex_drop_w(stripe->rw_mutex); - for(U64 start_t = os_now_microseconds(); - os_now_microseconds() <= start_t + 250;); + for(U64 start_t = os_now_microseconds(); os_now_microseconds() <= start_t + 250;); os_rw_mutex_take_w(stripe->rw_mutex); if(binary->refcount == 0 && ins_atomic_u64_eval(&binary->scope_touch_count) == 0) { diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index cb9ee117..42035c76 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -151,6 +151,10 @@ dmn_w32_entity_release(DMN_W32_Entity *entity) // rjf: free entity SLLStackPush(dmn_w32_shared->entities_first_free, t->e); t->e->gen += 1; + if(t->e->kind == DMN_W32_EntityKind_Module) + { + CloseHandle(t->e->handle); + } // rjf: remove from id -> entity map if(t->e->id != 0) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 9ee8c18f..077dce21 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -678,7 +678,8 @@ os_file_close(OS_Handle file) { if(os_handle_match(file, os_handle_zero())) { return; } HANDLE handle = (HANDLE)file.u64[0]; - CloseHandle(handle); + BOOL result = CloseHandle(handle); + (void)result; } internal U64 @@ -896,7 +897,8 @@ internal void os_file_map_close(OS_Handle map) { HANDLE handle = (HANDLE)map.u64[0]; - CloseHandle(handle); + BOOL result = CloseHandle(handle); + (void)result; } internal void * @@ -939,7 +941,8 @@ os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) internal void os_file_map_view_close(OS_Handle map, void *ptr) { - UnmapViewOfFile(ptr); + BOOL result = UnmapViewOfFile(ptr); + (void)result; } //- rjf: directory iteration From 53163f361044d5c03abcc69ca217965640250181 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 Mar 2024 12:26:15 -0700 Subject: [PATCH 235/275] ctrl: kill launch_and_handshake; begin extending run to be usable for launch-and-init and launch-and-run operations --- src/ctrl/ctrl_core.c | 351 ++++++++++++++++++++++++++++-------------- src/ctrl/ctrl_core.h | 12 +- src/df/core/df_core.c | 2 - src/df/gfx/df_gfx.c | 1 - 4 files changed, 242 insertions(+), 124 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index f101b03f..14e82d46 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -165,6 +165,7 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) // rjf: write flat parts str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->kind); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->run_flags); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->msg_id); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->machine_id); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity); @@ -263,6 +264,7 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) // rjf: read flat data read_off += str8_deserial_read_struct(string, read_off, &msg->kind); + read_off += str8_deserial_read_struct(string, read_off, &msg->run_flags); read_off += str8_deserial_read_struct(string, read_off, &msg->msg_id); read_off += str8_deserial_read_struct(string, read_off, &msg->machine_id); read_off += str8_deserial_read_struct(string, read_off, &msg->entity); @@ -1748,7 +1750,6 @@ ctrl_thread__entry_point(void *p) case CTRL_MsgKind_COUNT:{}break; //- rjf: target operations - case CTRL_MsgKind_LaunchAndHandshake:{ctrl_thread__launch_and_handshake(ctrl_ctx, msg);}break; case CTRL_MsgKind_LaunchAndInit: {ctrl_thread__launch_and_init (ctrl_ctx, msg);}break; case CTRL_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; case CTRL_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; @@ -2250,114 +2251,6 @@ ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size) //- rjf: msg kind implementations -internal void -ctrl_thread__launch_and_handshake(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DBGI_Scope *scope = dbgi_scope_open(); - - //- rjf: launch - OS_LaunchOptions opts = {0}; - { - opts.cmd_line = msg->cmd_line_string_list; - opts.path = msg->path; - opts.env = msg->env_string_list; - opts.inherit_env = msg->env_inherit; - } - U32 id = dmn_ctrl_launch(ctrl_ctx, &opts); - - //- rjf: record start - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Started; - ctrl_c2u_push_events(&evts); - } - - //- rjf: run to handshake - DMN_Event *stop_event = 0; - if(id != 0) - { - // rjf: prep run controls - DMN_Handle unfrozen_process = {0}; - DMN_RunCtrls run_ctrls = {0}; - { - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - run_ctrls.run_entities = &unfrozen_process; - run_ctrls.run_entity_count = 0; - } - - // rjf: run until handshake-signifying events - for(B32 done = 0; done == 0;) - { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_CreateProcess: - { - unfrozen_process = event->process; - run_ctrls.run_entity_count = 1; - }break; - case DMN_EventKind_Error: - case DMN_EventKind_Breakpoint: - case DMN_EventKind_Exception: - case DMN_EventKind_ExitProcess: - case DMN_EventKind_HandshakeComplete: - { - done = 1; - stop_event = event; - }break; - } - } - } - - //- rjf: record bad stop - if(stop_event == 0 && id == 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Error; - event->cause = CTRL_EventCause_Error; - ctrl_c2u_push_events(&evts); - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - if(stop_event != 0) - { - event->cause = ctrl_event_cause_from_dmn_event_kind(stop_event->kind); - event->machine_id = CTRL_MachineID_Local; - event->entity = stop_event->thread; - event->parent = stop_event->process; - event->exception_code = stop_event->code; - event->vaddr_rng = r1u64(stop_event->address, stop_event->address); - event->rip_vaddr = stop_event->instruction_pointer; - } - ctrl_c2u_push_events(&evts); - } - - //- rjf: push request resolution event - { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_LaunchAndHandshakeDone; - evt->machine_id= CTRL_MachineID_Local; - evt->msg_id = msg->msg_id; - evt->entity_id = id; - ctrl_c2u_push_events(&evts); - } - - dbgi_scope_close(scope); - scratch_end(scratch); - ProfEnd(); -} - internal void ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { @@ -2431,7 +2324,9 @@ ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) }break; //- rjf: exception -> done + case DMN_EventKind_Halt: case DMN_EventKind_Exception: + case DMN_EventKind_Error: { done = 1; stop_event = event; @@ -2717,6 +2612,9 @@ ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) run_ctrls.run_entities = &unfrozen_process; run_ctrls.run_entity_count = 1; }break; + case DMN_EventKind_Halt: + case DMN_EventKind_Exception: + case DMN_EventKind_Error: case DMN_EventKind_HandshakeComplete: { done = 1; @@ -2768,6 +2666,12 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { done = 1; } + if(event->kind == DMN_EventKind_Halt || + event->kind == DMN_EventKind_Exception || + event->kind == DMN_EventKind_Error) + { + done = 1; + } } } @@ -2816,6 +2720,12 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { done = 1; } + if(event->kind == DMN_EventKind_Halt || + event->kind == DMN_EventKind_Exception || + event->kind == DMN_EventKind_Error) + { + done = 1; + } } } @@ -3018,6 +2928,24 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); } + ////////////////////////////// + //- rjf: launch if needed + // + B32 launch_triggered = 0; + U32 launch_id = 0; + if(msg->run_flags & CTRL_RunFlag_Launch) + { + OS_LaunchOptions opts = {0}; + { + opts.cmd_line = msg->cmd_line_string_list; + opts.path = msg->path; + opts.env = msg->env_string_list; + opts.inherit_env = msg->env_inherit; + } + launch_id = dmn_ctrl_launch(ctrl_ctx, &opts); + launch_triggered = (launch_id != 0); + } + ////////////////////////////// //- rjf: record start // @@ -3036,6 +2964,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { B32 spoof_mode = 0; CTRL_Spoof spoof = {0}; + DMN_TrapChunkList entry_traps = {0}; for(;;) { ////////////////////////// @@ -3082,6 +3011,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ////////////////////////// //- rjf: determine event handling // + B32 launch_done_first_module = 0; B32 hard_stop = 0; CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); B32 use_stepping_logic = 0; @@ -3115,6 +3045,164 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) }break; } + ////////////////////////// + //- rjf: on launches, detect entry points, place traps + // + if(launch_triggered && !launch_done_first_module && event->kind == DMN_EventKind_LoadModule) + { + launch_done_first_module = 1; + + //- rjf: unpack process/module info + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); + CTRL_Entity *module = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->module); + U64 module_base_vaddr = module->vaddr_range.min; + String8 exe_path = module->string; + DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); + RDI_Parsed *rdi = &dbgi->rdi; + RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); + RDI_ParsedNameMap map = {0}; + rdi_name_map_parse(rdi, unparsed_map, &map); + + //- rjf: add trap for user-specified entry point, if specified + B32 entries_found = 0; + if(!entries_found) + { + for(String8Node *n = msg->strings.first; n != 0; n = n->next) + { + U32 procedure_id = 0; + { + String8 name = n->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + + //- rjf: add traps for all custom user entry points + if(!entries_found) + { + for(String8Node *n = ctrl_state->user_entry_points.first; n != 0; n = n->next) + { + U32 procedure_id = 0; + { + String8 name = n->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); + if(voff != 0) + { + DMN_Trap trap = {process->handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + break; + } + } + } + + //- rjf: add traps for all high-level entry points + if(!entries_found) + { + String8 hi_entry_points[] = + { + str8_lit("WinMain"), + str8_lit("wWinMain"), + str8_lit("main"), + str8_lit("wmain"), + }; + for(U64 idx = 0; idx < ArrayCount(hi_entry_points); idx += 1) + { + U32 procedure_id = 0; + { + String8 name = hi_entry_points[idx]; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); + } + } + } + + //- rjf: add trap for PE header entry + if(!entries_found) + { + U64 voff = dbgi->pe.entry_point; + if(voff != 0) + { + DMN_Trap trap = {process->handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + + //- rjf: add traps for all low-level entry points + if(!entries_found) + { + String8 lo_entry_points[] = + { + str8_lit("WinMainCRTStartup"), + str8_lit("wWinMainCRTStartup"), + str8_lit("mainCRTStartup"), + str8_lit("wmainCRTStartup"), + }; + for(U64 idx = 0; idx < ArrayCount(lo_entry_points); idx += 1) + { + U32 procedure_id = 0; + { + String8 name = lo_entry_points[idx]; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + + //- rjf: no entry point found -> done + if(entry_traps.trap_count == 0) + { + hard_stop = 1; + } + + //- rjf: found entry points -> add to joined traps + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &entry_traps); + } + ////////////////////////// //- rjf: unpack info about thread attached to event // @@ -3149,7 +3237,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // B32 hit_spoof = 0; B32 exception_stop = 0; - if(use_stepping_logic) + if(!hard_stop && use_stepping_logic) { if(event->kind == DMN_EventKind_Exception) { @@ -3183,17 +3271,32 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } //- rjf: for breakpoint events, gather bp info + B32 hit_entry = 0; B32 hit_user_bp = 0; B32 hit_trap_net_bp = 0; B32 hit_conditional_bp_but_filtered = 0; CTRL_TrapFlags hit_trap_flags = 0; - if(use_stepping_logic) + if(!hard_stop && use_stepping_logic) { if(event->kind == DMN_EventKind_Breakpoint) { Temp temp = temp_begin(scratch.arena); String8List conditions = {0}; + // rjf: entry breakpoints + for(DMN_TrapChunkNode *n = entry_traps.first; n != 0; n = n->next) + { + DMN_Trap *trap = n->v; + DMN_Trap *opl = n->v + n->count; + for(;trap < opl; trap += 1) + { + if(dmn_handle_match(trap->process, event->process) && trap->vaddr == event->instruction_pointer) + { + hit_entry = 1; + } + } + } + // rjf: user breakpoints for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) { @@ -3336,9 +3439,17 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } } + //- rjf: hit entry points on *any thread* cause a stop, if this msg says as such + B32 entry_stop = 0; + if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && hit_entry) + { + entry_stop = 1; + use_stepping_logic = 0; + } + //- rjf: user breakpoints on *any thread* cause a stop B32 user_bp_stop = 0; - if(use_stepping_logic && hit_user_bp) + if(!hard_stop && use_stepping_logic && hit_user_bp) { user_bp_stop = 1; use_stepping_logic = 0; @@ -3346,7 +3457,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: trap net on off-target threads are ignored B32 step_past_trap_net = 0; - if(use_stepping_logic && hit_trap_net_bp) + if(!hard_stop && use_stepping_logic && hit_trap_net_bp) { if(!dmn_handle_match(event->thread, target_thread)) { @@ -3357,7 +3468,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: trap net on on-target threads trigger trap net logic B32 use_trap_net_logic = 0; - if(use_stepping_logic && hit_trap_net_bp) + if(!hard_stop && use_stepping_logic && hit_trap_net_bp) { if(dmn_handle_match(event->thread, target_thread)) { @@ -3376,7 +3487,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: trap net logic: single step after hit B32 single_step_stop = 0; CTRL_EventCause single_step_stop_cause = CTRL_EventCause_Null; - if(use_trap_net_logic) + if(!hard_stop && use_trap_net_logic) { if(hit_trap_flags & CTRL_TrapFlag_SingleStepAfterHit) { @@ -3411,7 +3522,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: trap net logic: begin spoof mode B32 begin_spoof_mode = 0; - if(use_trap_net_logic) + if(!hard_stop && use_trap_net_logic) { if(hit_trap_flags & CTRL_TrapFlag_BeginSpoofMode) { @@ -3428,7 +3539,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: trap net logic: save stack pointer B32 save_stack_pointer = 0; - if(use_trap_net_logic) + if(!hard_stop && use_trap_net_logic) { if(hit_trap_flags & CTRL_TrapFlag_SaveStackPointer) { @@ -3442,7 +3553,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: trap net logic: end stepping B32 trap_net_stop = 0; - if(use_trap_net_logic) + if(!hard_stop && use_trap_net_logic) { if(hit_trap_flags & CTRL_TrapFlag_EndStepping) { @@ -3517,6 +3628,10 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { stage_stop_cause = CTRL_EventCause_UserBreakpoint; } + else if(entry_stop) + { + stage_stop_cause = CTRL_EventCause_EntryPoint; + } else if(trap_net_stop) { stage_stop_cause = CTRL_EventCause_Finished; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 20f52b8c..5c1e2605 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -215,7 +215,6 @@ struct CTRL_UserBreakpointList typedef enum CTRL_MsgKind { CTRL_MsgKind_Null, - CTRL_MsgKind_LaunchAndHandshake, CTRL_MsgKind_LaunchAndInit, CTRL_MsgKind_Attach, CTRL_MsgKind_Kill, @@ -227,10 +226,18 @@ typedef enum CTRL_MsgKind } CTRL_MsgKind; +typedef U32 CTRL_RunFlags; +enum +{ + CTRL_RunFlag_Launch = (1<<0), + CTRL_RunFlag_StopOnEntryPoint = (1<<1), +}; + typedef struct CTRL_Msg CTRL_Msg; struct CTRL_Msg { CTRL_MsgKind kind; + CTRL_RunFlags run_flags; CTRL_MsgID msg_id; CTRL_MachineID machine_id; DMN_Handle entity; @@ -295,7 +302,6 @@ typedef enum CTRL_EventKind CTRL_EventKind_MemRelease, //- rjf: ctrl requests - CTRL_EventKind_LaunchAndHandshakeDone, CTRL_EventKind_LaunchAndInitDone, CTRL_EventKind_AttachDone, CTRL_EventKind_KillDone, @@ -310,6 +316,7 @@ typedef enum CTRL_EventCause CTRL_EventCause_Null, CTRL_EventCause_Error, CTRL_EventCause_Finished, + CTRL_EventCause_EntryPoint, CTRL_EventCause_UserBreakpoint, CTRL_EventCause_InterruptedByTrap, CTRL_EventCause_InterruptedByException, @@ -708,7 +715,6 @@ internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ internal B32 ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size); //- rjf: msg kind implementations -internal void ctrl_thread__launch_and_handshake(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); internal void ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index a96dbe5e..d164c849 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6889,7 +6889,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) //- rjf: ctrl requests case CTRL_EventKind_LaunchAndInitDone: - case CTRL_EventKind_LaunchAndHandshakeDone: case CTRL_EventKind_AttachDone: case CTRL_EventKind_KillDone: case CTRL_EventKind_DetachDone: @@ -6903,7 +6902,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) switch(request_entity->subkind) { case CTRL_MsgKind_LaunchAndInit: - case CTRL_MsgKind_LaunchAndHandshake: { DF_Entity *target = df_entity_from_handle(request_entity->entity_handle); DF_Entity *process = df_entity_from_ctrl_id(event->machine_id, event->entity_id); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index af144a02..11d9a848 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -8513,7 +8513,6 @@ df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, } }break; case CTRL_EventKind_LaunchAndInitDone: - case CTRL_EventKind_LaunchAndHandshakeDone: { explanation = str8_lit("Launched"); }break; From ee056aa45d552ae0b83c2c5205e74b6e9c82cdca Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 Mar 2024 12:29:45 -0700 Subject: [PATCH 236/275] collapse user bp gathering helper, used only once --- src/df/core/df_core.c | 121 +++++++++++++++++++----------------------- src/df/core/df_core.h | 3 -- 2 files changed, 55 insertions(+), 69 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index d164c849..8f544d2a 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3757,71 +3757,6 @@ df_log_from_entity(DF_Entity *entity) //////////////////////////////// //~ rjf: Target Controls -//- rjf: control user breakpoint gathering - -internal CTRL_UserBreakpointList -df_push_ctrl_user_breakpoints(Arena *arena) -{ - CTRL_UserBreakpointList user_bps_out = {0}; - DF_EntityList user_bp_entities = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(DF_EntityNode *user_bp_n = user_bp_entities.first; - user_bp_n != 0; - user_bp_n = user_bp_n->next) - { - // rjf: unpack user breakpoint entity - DF_Entity *user_bp = user_bp_n->entity; - if(user_bp->b32 == 0) - { - continue; - } - DF_Entity *file = df_entity_ancestor_from_kind(user_bp, DF_EntityKind_File); - DF_Entity *symb = df_entity_child_from_kind(user_bp, DF_EntityKind_EntryPointName); - DF_EntityList overrides = df_possible_overrides_from_entity(arena, file); - for(DF_EntityNode *override_n = overrides.first; override_n != 0; override_n = override_n->next) - { - DF_Entity *override = override_n->entity; - DF_Entity *condition_child = df_entity_child_from_kind(user_bp, DF_EntityKind_Condition); - String8 condition = condition_child->name; - - // rjf: generate user breakpoint info depending on breakpoint placement - CTRL_UserBreakpointKind ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; - String8 ctrl_user_bp_string = {0}; - TxtPt ctrl_user_bp_pt = {0}; - U64 ctrl_user_bp_u64 = 0; - { - if(user_bp->flags & DF_EntityFlag_HasTextPoint) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; - ctrl_user_bp_string = df_full_path_from_entity(arena, override); - ctrl_user_bp_pt = user_bp->text_point; - } - else if(user_bp->flags & DF_EntityFlag_HasVAddr) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_VirtualAddress; - ctrl_user_bp_u64 = user_bp->vaddr; - } - else if(!df_entity_is_nil(symb)) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_SymbolNameAndOffset; - ctrl_user_bp_string = symb->name; - ctrl_user_bp_u64 = user_bp->u64; - } - } - - // rjf: push user breakpoint to list - { - CTRL_UserBreakpoint ctrl_user_bp = {ctrl_user_bp_kind}; - ctrl_user_bp.string = ctrl_user_bp_string; - ctrl_user_bp.pt = ctrl_user_bp_pt; - ctrl_user_bp.u64 = ctrl_user_bp_u64; - ctrl_user_bp.condition = condition; - ctrl_user_breakpoint_list_push(arena, &user_bps_out, &ctrl_user_bp); - } - } - } - return user_bps_out; -} - //- rjf: control message dispatching internal void @@ -3861,7 +3796,61 @@ df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_TrapList *run_traps) { MemoryCopyStruct(&msg.traps, run_traps); } - msg.user_bps = df_push_ctrl_user_breakpoints(scratch.arena); + for(DF_EntityNode *user_bp_n = user_bps.first; + user_bp_n != 0; + user_bp_n = user_bp_n->next) + { + // rjf: unpack user breakpoint entity + DF_Entity *user_bp = user_bp_n->entity; + if(user_bp->b32 == 0) + { + continue; + } + DF_Entity *file = df_entity_ancestor_from_kind(user_bp, DF_EntityKind_File); + DF_Entity *symb = df_entity_child_from_kind(user_bp, DF_EntityKind_EntryPointName); + DF_EntityList overrides = df_possible_overrides_from_entity(scratch.arena, file); + for(DF_EntityNode *override_n = overrides.first; override_n != 0; override_n = override_n->next) + { + DF_Entity *override = override_n->entity; + DF_Entity *condition_child = df_entity_child_from_kind(user_bp, DF_EntityKind_Condition); + String8 condition = condition_child->name; + + // rjf: generate user breakpoint info depending on breakpoint placement + CTRL_UserBreakpointKind ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; + String8 ctrl_user_bp_string = {0}; + TxtPt ctrl_user_bp_pt = {0}; + U64 ctrl_user_bp_u64 = 0; + { + if(user_bp->flags & DF_EntityFlag_HasTextPoint) + { + ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; + ctrl_user_bp_string = df_full_path_from_entity(scratch.arena, override); + ctrl_user_bp_pt = user_bp->text_point; + } + else if(user_bp->flags & DF_EntityFlag_HasVAddr) + { + ctrl_user_bp_kind = CTRL_UserBreakpointKind_VirtualAddress; + ctrl_user_bp_u64 = user_bp->vaddr; + } + else if(!df_entity_is_nil(symb)) + { + ctrl_user_bp_kind = CTRL_UserBreakpointKind_SymbolNameAndOffset; + ctrl_user_bp_string = symb->name; + ctrl_user_bp_u64 = user_bp->u64; + } + } + + // rjf: push user breakpoint to list + { + CTRL_UserBreakpoint ctrl_user_bp = {ctrl_user_bp_kind}; + ctrl_user_bp.string = ctrl_user_bp_string; + ctrl_user_bp.pt = ctrl_user_bp_pt; + ctrl_user_bp.u64 = ctrl_user_bp_u64; + ctrl_user_bp.condition = condition; + ctrl_user_breakpoint_list_push(scratch.arena, &msg.user_bps, &ctrl_user_bp); + } + } + } if(df_state->ctrl_solo_stepping_mode && !df_entity_is_nil(run_thread)) { msg.freeze_state_is_frozen = 0; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 07e42d08..7ba02bf4 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1563,9 +1563,6 @@ internal DF_Entity *df_log_from_entity(DF_Entity *entity); //////////////////////////////// //~ rjf: Target Controls -//- rjf: control user breakpoint gathering -internal CTRL_UserBreakpointList df_push_ctrl_user_breakpoints(Arena *arena); - //- rjf: control message dispatching internal void df_push_ctrl_msg(CTRL_Msg *msg); From 291bf3875d8bfb688d360dc2d099417c0a1b2625 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 Mar 2024 14:09:29 -0700 Subject: [PATCH 237/275] eliminate launch-and-init path, switch fully to separate 'launch' and 'run' paths; snap to selected thread if no stopper thread on stopped events; --- src/ctrl/ctrl_core.c | 381 +++--------------------------------------- src/ctrl/ctrl_core.h | 9 +- src/df/core/df_core.c | 46 +++-- src/df/core/df_core.h | 3 +- 4 files changed, 62 insertions(+), 377 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 14e82d46..2336cb7c 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -126,7 +126,7 @@ ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src) { MemoryCopyStruct(dst, src); dst->path = push_str8_copy(arena, src->path); - dst->strings = str8_list_copy(arena, &src->strings); + dst->entry_points = str8_list_copy(arena, &src->entry_points); dst->cmd_line_string_list = str8_list_copy(arena, &src->cmd_line_string_list); dst->env_string_list = str8_list_copy(arena, &src->env_string_list); dst->traps = ctrl_trap_list_copy(arena, &src->traps); @@ -179,9 +179,9 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->path.size); str8_serial_push_data(scratch.arena, &msgs_srlzed, msg->path.str, msg->path.size); - // rjf: write general string list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->strings.node_count); - for(String8Node *n = msg->strings.first; n != 0; n = n->next) + // rjf: write entry point string list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entry_points.node_count); + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) { str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); @@ -279,16 +279,16 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) msg->path.str = push_array_no_zero(arena, U8, msg->path.size); read_off += str8_deserial_read(string, read_off, msg->path.str, msg->path.size, 1); - // rjf: read general string list - U64 string_list_string_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &string_list_string_count); - for(U64 idx = 0; idx < string_list_string_count; idx += 1) + // rjf: read entry point string list + U64 entry_point_list_string_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &entry_point_list_string_count); + for(U64 idx = 0; idx < entry_point_list_string_count; idx += 1) { String8 str = {0}; read_off += str8_deserial_read_struct(string, read_off, &str.size); str.str = push_array_no_zero(arena, U8, str.size); read_off += str8_deserial_read(string, read_off, str.str, str.size, 1); - str8_list_push(arena, &msg->strings, str); + str8_list_push(arena, &msg->entry_points, str); } // rjf: read command line string list @@ -469,6 +469,7 @@ ctrl_entity_store_alloc(void) store->arena = arena; store->hash_slots_count = 1024; store->hash_slots = push_array(arena, CTRL_EntityHashSlot, store->hash_slots_count); + store->root = &ctrl_entity_nil; return store; } @@ -734,7 +735,7 @@ internal void ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) { //- rjf: construct root-level entities - if(!store->root) + if(store->root == &ctrl_entity_nil) { CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Architecture_Null, 0, dmn_handle_zero()); CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, architecture_from_context(), CTRL_MachineID_Local, dmn_handle_zero()); @@ -1750,7 +1751,7 @@ ctrl_thread__entry_point(void *p) case CTRL_MsgKind_COUNT:{}break; //- rjf: target operations - case CTRL_MsgKind_LaunchAndInit: {ctrl_thread__launch_and_init (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Launch: {ctrl_thread__launch (ctrl_ctx, msg);}break; case CTRL_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; case CTRL_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; case CTRL_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; @@ -1762,7 +1763,7 @@ ctrl_thread__entry_point(void *p) { arena_clear(ctrl_state->user_entry_point_arena); MemoryZeroStruct(&ctrl_state->user_entry_points); - for(String8Node *n = msg->strings.first; n != 0; n = n->next) + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) { str8_list_push(ctrl_state->user_entry_point_arena, &ctrl_state->user_entry_points, n->string); } @@ -2252,14 +2253,8 @@ ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size) //- rjf: msg kind implementations internal void -ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - ////////////////////////////// - //- rjf: launch - // OS_LaunchOptions opts = {0}; { opts.cmd_line = msg->cmd_line_string_list; @@ -2268,319 +2263,7 @@ ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) opts.inherit_env = msg->env_inherit; } U32 id = dmn_ctrl_launch(ctrl_ctx, &opts); - - ////////////////////////////// - //- rjf: record start - // - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Started; - ctrl_c2u_push_events(&evts); - } - - ////////////////////////////// - //- rjf: run to initialization (entry point) - // - DMN_Event *stop_event = 0; - if(id != 0) - { - DMN_Handle unfrozen_process[8] = {0}; - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - for(B32 done = 0; done == 0;) - { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - switch(event->kind) - { - default:{}break; - - //- rjf: new process -> freeze process - case DMN_EventKind_CreateProcess: - if(run_ctrls.run_entity_count < ArrayCount(unfrozen_process)) - { - unfrozen_process[run_ctrls.run_entity_count] = event->process; - run_ctrls.run_entities = &unfrozen_process[0]; - run_ctrls.run_entity_count += 1; - }break; - - //- rjf: breakpoint -> if it's the entry point, we're done. otherwise, keep going - case DMN_EventKind_Breakpoint: - { - for(DMN_TrapChunkNode *n = run_ctrls.traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - if(n->v[idx].vaddr == event->instruction_pointer) - { - done = 1; - stop_event = event; - goto end_look_for_entry_match; - } - } - } - end_look_for_entry_match:; - }break; - - //- rjf: exception -> done - case DMN_EventKind_Halt: - case DMN_EventKind_Exception: - case DMN_EventKind_Error: - { - done = 1; - stop_event = event; - }break; - - //- rjf: process ended? -> remove from unfrozen processes. zero processes -> done. - case DMN_EventKind_ExitProcess: - { - for(U64 idx = 0; idx < run_ctrls.run_entity_count; idx += 1) - { - if(dmn_handle_match(run_ctrls.run_entities[idx], event->process) && - idx+1 < run_ctrls.run_entity_count) - { - MemoryCopy(run_ctrls.run_entities+idx, run_ctrls.run_entities+idx+1, sizeof(DMN_Handle)*(run_ctrls.run_entity_count-(idx+1))); - break; - } - } - if(run_ctrls.run_entity_count > 0) - { - run_ctrls.run_entity_count -= 1; - } - if(run_ctrls.run_entity_count == 0) - { - done = 1; - stop_event = event; - } - }break; - - //- rjf: done with handshake -> ready to find entry point. search launched processes - case DMN_EventKind_HandshakeComplete: - { - DBGI_Scope *scope = dbgi_scope_open(); - - //- rjf: add traps for all possible entry points - for(U64 process_idx = 0; process_idx < run_ctrls.run_entity_count; process_idx += 1) - { - //- rjf: unpack process & first module info - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, run_ctrls.run_entities[process_idx]); - CTRL_Entity *module = &ctrl_entity_nil; - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) - { - if(child->kind == CTRL_EntityKind_Module) - { - module = child; - break; - } - } - U64 module_base_vaddr = module->vaddr_range.min; - String8 exe_path = module->string; - DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); - RDI_Parsed *rdi = &dbgi->rdi; - RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures); - RDI_ParsedNameMap map = {0}; - rdi_name_map_parse(rdi, unparsed_map, &map); - - //- rjf: add trap for user-specified entry point, if specified - B32 entries_found = 0; - if(!entries_found) - { - for(String8Node *n = msg->strings.first; n != 0; n = n->next) - { - U32 procedure_id = 0; - { - String8 name = n->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); - } - } - } - - //- rjf: add traps for all custom user entry points - if(!entries_found) - { - for(String8Node *n = ctrl_state->user_entry_points.first; n != 0; n = n->next) - { - U32 procedure_id = 0; - { - String8 name = n->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); - if(voff != 0) - { - DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); - break; - } - } - } - - //- rjf: add traps for all high-level entry points - if(!entries_found) - { - String8 hi_entry_points[] = - { - str8_lit("WinMain"), - str8_lit("wWinMain"), - str8_lit("main"), - str8_lit("wmain"), - }; - for(U64 idx = 0; idx < ArrayCount(hi_entry_points); idx += 1) - { - U32 procedure_id = 0; - { - String8 name = hi_entry_points[idx]; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); - } - } - } - - //- rjf: add trap for PE header entry - if(!entries_found) - { - U64 voff = dbgi->pe.entry_point; - if(voff != 0) - { - DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); - } - } - - //- rjf: add traps for all low-level entry points - if(!entries_found) - { - String8 lo_entry_points[] = - { - str8_lit("WinMainCRTStartup"), - str8_lit("wWinMainCRTStartup"), - str8_lit("mainCRTStartup"), - str8_lit("wmainCRTStartup"), - }; - for(U64 idx = 0; idx < ArrayCount(lo_entry_points); idx += 1) - { - U32 procedure_id = 0; - { - String8 name = lo_entry_points[idx]; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); - } - } - } - - //- rjf: no entry point found -> done - if(run_ctrls.traps.trap_count == 0) - { - done = 1; - stop_event = event; - } - } - - dbgi_scope_close(scope); - }break; - } - } - } - - ////////////////////////////// - //- rjf: record bad stop - // - if(stop_event == 0 && id == 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Error; - event->cause = CTRL_EventCause_Error; - ctrl_c2u_push_events(&evts); - } - - ////////////////////////////// - //- rjf: record stop - // - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->msg_id = msg->msg_id; - if(stop_event != 0) - { - event->cause = ctrl_event_cause_from_dmn_event_kind(stop_event->kind); - event->machine_id = CTRL_MachineID_Local; - event->entity = stop_event->thread; - event->parent = stop_event->process; - event->exception_code = stop_event->code; - event->vaddr_rng = r1u64(stop_event->address, stop_event->address); - event->rip_vaddr = stop_event->instruction_pointer; - } - ctrl_c2u_push_events(&evts); - } - - ////////////////////////////// - //- rjf: push request resolution event - // - { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_LaunchAndInitDone; - evt->machine_id= CTRL_MachineID_Local; - evt->msg_id = msg->msg_id; - evt->entity_id = id; - ctrl_c2u_push_events(&evts); - } - - ////////////////////////////// - //- rjf: disable 'step-over-stuck' behavior - // - { - ctrl_state->disable_stuck_thread_step = 1; - } - - scratch_end(scratch); - ProfEnd(); + (void)id; } internal void @@ -2928,24 +2611,6 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); } - ////////////////////////////// - //- rjf: launch if needed - // - B32 launch_triggered = 0; - U32 launch_id = 0; - if(msg->run_flags & CTRL_RunFlag_Launch) - { - OS_LaunchOptions opts = {0}; - { - opts.cmd_line = msg->cmd_line_string_list; - opts.path = msg->path; - opts.env = msg->env_string_list; - opts.inherit_env = msg->env_inherit; - } - launch_id = dmn_ctrl_launch(ctrl_ctx, &opts); - launch_triggered = (launch_id != 0); - } - ////////////////////////////// //- rjf: record start // @@ -3048,13 +2713,21 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ////////////////////////// //- rjf: on launches, detect entry points, place traps // - if(launch_triggered && !launch_done_first_module && event->kind == DMN_EventKind_LoadModule) + if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && !launch_done_first_module && event->kind == DMN_EventKind_HandshakeComplete) { launch_done_first_module = 1; //- rjf: unpack process/module info CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); - CTRL_Entity *module = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->module); + CTRL_Entity *module = &ctrl_entity_nil; + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Module) + { + module = child; + break; + } + } U64 module_base_vaddr = module->vaddr_range.min; String8 exe_path = module->string; DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); @@ -3067,7 +2740,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) B32 entries_found = 0; if(!entries_found) { - for(String8Node *n = msg->strings.first; n != 0; n = n->next) + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) { U32 procedure_id = 0; { @@ -3144,7 +2817,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { entries_found = 1; DMN_Trap trap = {process->handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &run_ctrls.traps, 256, &trap); + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); } } } diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 5c1e2605..1e08e558 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -215,7 +215,7 @@ struct CTRL_UserBreakpointList typedef enum CTRL_MsgKind { CTRL_MsgKind_Null, - CTRL_MsgKind_LaunchAndInit, + CTRL_MsgKind_Launch, CTRL_MsgKind_Attach, CTRL_MsgKind_Kill, CTRL_MsgKind_Detach, @@ -229,8 +229,7 @@ CTRL_MsgKind; typedef U32 CTRL_RunFlags; enum { - CTRL_RunFlag_Launch = (1<<0), - CTRL_RunFlag_StopOnEntryPoint = (1<<1), + CTRL_RunFlag_StopOnEntryPoint = (1<<0), }; typedef struct CTRL_Msg CTRL_Msg; @@ -247,7 +246,7 @@ struct CTRL_Msg B32 env_inherit; U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; String8 path; - String8List strings; + String8List entry_points; String8List cmd_line_string_list; String8List env_string_list; CTRL_TrapList traps; @@ -715,7 +714,7 @@ internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ internal B32 ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size); //- rjf: msg kind implementations -internal void ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 8f544d2a..a825534c 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3764,10 +3764,6 @@ df_push_ctrl_msg(CTRL_Msg *msg) { CTRL_Msg *dst = ctrl_msg_list_push(df_state->ctrl_msg_arena, &df_state->ctrl_msgs); ctrl_msg_deep_copy(df_state->ctrl_msg_arena, dst, msg); - if(dst->kind == CTRL_MsgKind_LaunchAndInit) - { - df_state->ctrl_is_running = 1; - } if(df_state->ctrl_soft_halt_issued == 0 && df_ctrl_targets_running()) { df_state->ctrl_soft_halt_issued = 1; @@ -3778,7 +3774,7 @@ df_push_ctrl_msg(CTRL_Msg *msg) //- rjf: control thread running internal void -df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_TrapList *run_traps) +df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_RunFlags flags, CTRL_TrapList *run_traps) { DBGI_Scope *scope = dbgi_scope_open(); Temp scratch = scratch_begin(0, 0); @@ -3788,6 +3784,7 @@ df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_TrapList *run_traps) { DF_EntityList user_bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); DF_Entity *process = df_entity_ancestor_from_kind(run_thread, DF_EntityKind_Process); + msg.run_flags = flags; msg.machine_id = run_thread->ctrl_machine_id; msg.entity = run_thread->ctrl_handle; msg.parent = process->ctrl_handle; @@ -3887,6 +3884,7 @@ df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_TrapList *run_traps) df_state->ctrl_last_run_kind = run; df_state->ctrl_last_run_frame_idx = df_frame_index(); df_state->ctrl_last_run_thread = df_handle_from_entity(run_thread); + df_state->ctrl_last_run_flags = flags; df_state->ctrl_last_run_traps = ctrl_trap_list_copy(df_state->ctrl_last_run_arena, &run_traps_copy); df_state->ctrl_is_running = 1; @@ -6599,6 +6597,19 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectThread)); } + // rjf: if no stop-causing thread, and if selected thread, snap to selected + if(df_entity_is_nil(stop_thread)) + { + DF_Entity *selected_thread = df_entity_from_handle(df_state->ctrl_ctx.thread); + if(!df_entity_is_nil(selected_thread)) + { + DF_CmdParams params = df_cmd_params_zero(); + params.entity = df_handle_from_entity(selected_thread); + df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); + df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindThread)); + } + } + // rjf: thread hit user breakpoint -> increment breakpoint hit count if(event->cause == CTRL_EventCause_UserBreakpoint) { @@ -6888,6 +6899,9 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) if(!df_entity_is_nil(request_entity)) { df_entity_mark_for_deletion(request_entity); + + // TODO(rjf): @launch_and_init_x +#if 0 switch(request_entity->subkind) { case CTRL_MsgKind_LaunchAndInit: @@ -6907,6 +6921,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } }break; } +#endif } // rjf: collect stop info @@ -7133,28 +7148,25 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) // rjf: build corresponding request entity DF_Entity *request_entity = df_entity_alloc(0, df_entity_root(), DF_EntityKind_CtrlRequest); { - request_entity->subkind = CTRL_MsgKind_LaunchAndInit; + request_entity->subkind = CTRL_MsgKind_Launch; request_entity->entity_handle = df_handle_from_entity(target); } // rjf: push message to launch { - CTRL_Msg msg = {CTRL_MsgKind_LaunchAndInit}; + CTRL_Msg msg = {CTRL_MsgKind_Launch}; msg.msg_id = request_entity->id; msg.path = path; msg.cmd_line_string_list = cmdln_strings; msg.env_inherit = 1; MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters); - str8_list_push(scratch.arena, &msg.strings, entry); + str8_list_push(scratch.arena, &msg.entry_points, entry); df_push_ctrl_msg(&msg); } } - // rjf: run if needed - if(core_cmd_kind == DF_CoreCmdKind_LaunchAndRun) - { - df_ctrl_run(DF_RunKind_Run, &df_g_nil_entity, 0); - } + // rjf: run + df_ctrl_run(DF_RunKind_Run, &df_g_nil_entity, CTRL_RunFlag_StopOnEntryPoint * (core_cmd_kind == DF_CoreCmdKind_LaunchAndInit), 0); } // rjf: no targets -> error @@ -7258,7 +7270,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } if(good_to_run) { - df_ctrl_run(DF_RunKind_Run, &df_g_nil_entity, 0); + df_ctrl_run(DF_RunKind_Run, &df_g_nil_entity, 0, 0); } else { @@ -7327,11 +7339,11 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } if(good && traps.count != 0) { - df_ctrl_run(DF_RunKind_Step, thread, &traps); + df_ctrl_run(DF_RunKind_Step, thread, 0, &traps); } if(good && traps.count == 0) { - df_ctrl_run(DF_RunKind_SingleStep, thread, &traps); + df_ctrl_run(DF_RunKind_SingleStep, thread, 0, &traps); } } }break; @@ -7344,7 +7356,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) { if(df_ctrl_targets_running()) { - df_ctrl_run(df_state->ctrl_last_run_kind, df_entity_from_handle(df_state->ctrl_last_run_thread), &df_state->ctrl_last_run_traps); + df_ctrl_run(df_state->ctrl_last_run_kind, df_entity_from_handle(df_state->ctrl_last_run_thread), df_state->ctrl_last_run_flags, &df_state->ctrl_last_run_traps); } }break; case DF_CoreCmdKind_SetThreadIP: diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 7ba02bf4..d73f5414 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1172,6 +1172,7 @@ struct DF_State DF_RunKind ctrl_last_run_kind; U64 ctrl_last_run_frame_idx; DF_Handle ctrl_last_run_thread; + CTRL_RunFlags ctrl_last_run_flags; CTRL_TrapList ctrl_last_run_traps; U64 ctrl_run_gen; B32 ctrl_is_running; @@ -1567,7 +1568,7 @@ internal DF_Entity *df_log_from_entity(DF_Entity *entity); internal void df_push_ctrl_msg(CTRL_Msg *msg); //- rjf: control thread running -internal void df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_TrapList *run_traps); +internal void df_ctrl_run(DF_RunKind run, DF_Entity *target, DF_Entity *run_thread, CTRL_RunFlags flags, CTRL_TrapList *run_traps); //- rjf: stopped info from the control thread internal CTRL_Event df_ctrl_last_stop_event(void); From 1da92b8dbc34950696aee02ba1e322fd3769abf6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 Mar 2024 14:24:06 -0700 Subject: [PATCH 238/275] store per-launch entry points in ctrl entity store; use to later correllate PIDs to custom entry points in run path --- src/ctrl/ctrl_core.c | 72 +++++++++++++++++++++++++++++++++++--------- src/ctrl/ctrl_core.h | 4 ++- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 2336cb7c..f88516c7 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -469,7 +469,9 @@ ctrl_entity_store_alloc(void) store->arena = arena; store->hash_slots_count = 1024; store->hash_slots = push_array(arena, CTRL_EntityHashSlot, store->hash_slots_count); - store->root = &ctrl_entity_nil; + CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Architecture_Null, 0, dmn_handle_zero(), 0); + CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, architecture_from_context(), CTRL_MachineID_Local, dmn_handle_zero(), 0); + (void)local_machine; return store; } @@ -573,7 +575,7 @@ ctrl_entity_string_release(CTRL_EntityStore *store, String8 string) //- rjf: entity construction/deletion internal CTRL_Entity * -ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle) +ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle, U64 id) { CTRL_Entity *entity = &ctrl_entity_nil; { @@ -597,6 +599,7 @@ ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind entity->arch = arch; entity->machine_id = machine_id; entity->handle = handle; + entity->id = id; entity->parent = parent; entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; if(parent != &ctrl_entity_nil) @@ -734,14 +737,6 @@ ctrl_entity_from_machine_id_handle(CTRL_EntityStore *store, CTRL_MachineID machi internal void ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) { - //- rjf: construct root-level entities - if(store->root == &ctrl_entity_nil) - { - CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Architecture_Null, 0, dmn_handle_zero()); - CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, architecture_from_context(), CTRL_MachineID_Local, dmn_handle_zero()); - (void)local_machine; - } - //- rjf: scan events & construct entities for(CTRL_EventNode *n = list->first; n != 0; n = n->next) { @@ -752,19 +747,29 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) case CTRL_EventKind_NewProc: { CTRL_Entity *machine = ctrl_entity_from_machine_id_handle(store, event->machine_id, dmn_handle_zero()); - CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->machine_id, event->entity); + CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->machine_id, event->entity, (U64)event->entity_id); }break; case CTRL_EventKind_EndProc: { CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); ctrl_entity_release(store, process); + for(CTRL_Entity *entry = store->root->first, *next = &ctrl_entity_nil; + entry != &ctrl_entity_nil; + entry = next) + { + next = entry->next; + if(entry->kind == CTRL_EntityKind_EntryPoint && entry->id == process->id) + { + ctrl_entity_release(store, entry); + } + } }break; //- rjf: threads case CTRL_EventKind_NewThread: { CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); - CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->machine_id, event->entity); + CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->machine_id, event->entity, (U64)event->entity_id); }break; case CTRL_EventKind_EndThread: { @@ -781,7 +786,7 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) case CTRL_EventKind_NewModule: { CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); - CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->machine_id, event->entity); + CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->machine_id, event->entity, event->vaddr_rng.min); ctrl_entity_equip_string(store, module, event->string); module->vaddr_range = event->vaddr_rng; }break; @@ -2255,6 +2260,7 @@ ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size) internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { + //- rjf: launch OS_LaunchOptions opts = {0}; { opts.cmd_line = msg->cmd_line_string_list; @@ -2263,7 +2269,14 @@ ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) opts.inherit_env = msg->env_inherit; } U32 id = dmn_ctrl_launch(ctrl_ctx, &opts); - (void)id; + + //- rjf: record (id -> entry points), so that we know custom entry points for this PID + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + String8 string = n->string; + CTRL_Entity *entry = ctrl_entity_alloc(ctrl_state->ctrl_thread_entity_store, ctrl_state->ctrl_thread_entity_store->root, CTRL_EntityKind_EntryPoint, Architecture_Null, 0, dmn_handle_zero(), (U64)id); + ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, entry, string); + } } internal void @@ -2736,7 +2749,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) RDI_ParsedNameMap map = {0}; rdi_name_map_parse(rdi, unparsed_map, &map); - //- rjf: add trap for user-specified entry point, if specified + //- rjf: add traps for user-specified entry points on this message, if specified B32 entries_found = 0; if(!entries_found) { @@ -2763,6 +2776,35 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } } + //- rjf: add traps for PID-correllated entry points + if(!entries_found) + { + for(CTRL_Entity *e = ctrl_state->ctrl_thread_entity_store->root->first; e != &ctrl_entity_nil; e = e->next) + { + if(e->id == process->id) + { + U32 procedure_id = 0; + { + String8 name = e->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + U64 voff = rdi_first_voff_from_proc(rdi, procedure_id); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + } + //- rjf: add traps for all custom user entry points if(!entries_found) { diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 1e08e558..88321132 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -48,6 +48,7 @@ typedef enum CTRL_EntityKind CTRL_EntityKind_Process, CTRL_EntityKind_Thread, CTRL_EntityKind_Module, + CTRL_EntityKind_EntryPoint, CTRL_EntityKind_COUNT } CTRL_EntityKind; @@ -64,6 +65,7 @@ struct CTRL_Entity Architecture arch; CTRL_MachineID machine_id; DMN_Handle handle; + U64 id; Rng1U64 vaddr_range; String8 string; }; @@ -617,7 +619,7 @@ internal String8 ctrl_entity_string_alloc(CTRL_EntityStore *store, String8 strin internal void ctrl_entity_string_release(CTRL_EntityStore *store, String8 string); //- rjf: entity construction/deletion -internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle); +internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle, U64 id); internal void ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity); //- rjf: entity equipment From 22185cee5f0fd5dfc7d551417bbe563cb3a80c57 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 Mar 2024 14:36:11 -0700 Subject: [PATCH 239/275] eliminate stuck-step disabling hack --- src/ctrl/ctrl_core.c | 11 +---------- src/ctrl/ctrl_core.h | 1 - 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index f88516c7..b20a2409 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1737,11 +1737,6 @@ ctrl_thread__entry_point(void *p) //- rjf: get next messages CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); - //- rjf: enable stuck-thread-step behavior in all cases - can be silently enabled by launch_and_init for subsequent messages - { - ctrl_state->disable_stuck_thread_step = 0; - } - //- rjf: process messages DMN_CtrlExclusiveAccessScope { @@ -2503,11 +2498,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // the user breakpoint. // B32 target_thread_is_on_user_bp_and_trap_net_trap = 0; - if(ctrl_state->disable_stuck_thread_step) - { - ctrl_state->disable_stuck_thread_step = 0; - } - else if(stop_event == 0 && !ctrl_state->disable_stuck_thread_step) + if(stop_event == 0) { // rjf: gather stuck threads DMN_HandleList stuck_threads = {0}; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 88321132..2ceee4c4 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -530,7 +530,6 @@ struct CTRL_State String8List user_entry_points; U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; U64 process_counter; - B32 disable_stuck_thread_step; // rjf: user -> memstream ring buffer U64 u2ms_ring_size; From a14d0f5b1825ec29e715c34d5db96ba7a84dde5f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 Mar 2024 15:25:27 -0700 Subject: [PATCH 240/275] rewire up target colors with processes/modules/threads; use first module path for correllation rather than entities & id correllation --- src/ctrl/ctrl_core.c | 39 +++++++------- src/ctrl/ctrl_core.h | 6 --- src/df/core/df_core.c | 77 ++++++++-------------------- src/df/core/df_core.mdesk | 1 - src/df/core/generated/df_core.meta.c | 15 ++---- src/df/core/generated/df_core.meta.h | 11 ++-- src/df/gfx/df_gfx.c | 16 ------ 7 files changed, 52 insertions(+), 113 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index b20a2409..60c79635 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -2314,14 +2314,15 @@ ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } } - //- rjf: push request resolution event + //- rjf: record stop { CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_AttachDone; - evt->machine_id= CTRL_MachineID_Local; - evt->msg_id = msg->msg_id; - evt->entity_id = !!attach_successful * msg->entity_id; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = CTRL_EventCause_Finished; + event->machine_id = CTRL_MachineID_Local; + event->msg_id = msg->msg_id; + event->entity_id = !!attach_successful * msg->entity_id; ctrl_c2u_push_events(&evts); } @@ -2366,16 +2367,17 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } } - //- rjf: push request resolution event + //- rjf: record stop { CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_KillDone; - evt->machine_id= CTRL_MachineID_Local; - evt->msg_id = msg->msg_id; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = CTRL_EventCause_Finished; + event->machine_id = CTRL_MachineID_Local; + event->msg_id = msg->msg_id; if(kill_worked) { - evt->entity = msg->entity; + event->entity = msg->entity; } ctrl_c2u_push_events(&evts); } @@ -2420,16 +2422,17 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } } - //- rjf: push request resolution event + //- rjf: record stop { CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_DetachDone; - evt->machine_id= CTRL_MachineID_Local; - evt->msg_id = msg->msg_id; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = CTRL_EventCause_Finished; + event->machine_id = CTRL_MachineID_Local; + event->msg_id = msg->msg_id; if(detach_worked) { - evt->entity = msg->entity; + event->entity = msg->entity; } ctrl_c2u_push_events(&evts); } diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 2ceee4c4..afc9f25d 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -302,12 +302,6 @@ typedef enum CTRL_EventKind CTRL_EventKind_MemDecommit, CTRL_EventKind_MemRelease, - //- rjf: ctrl requests - CTRL_EventKind_LaunchAndInitDone, - CTRL_EventKind_AttachDone, - CTRL_EventKind_KillDone, - CTRL_EventKind_DetachDone, - CTRL_EventKind_COUNT } CTRL_EventKind; diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index a825534c..f2c84a51 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -6803,11 +6803,28 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) DF_Entity *binary = df_entity_from_path(bin_path, DF_EntityFromPathFlag_All); df_entity_equip_entity_handle(module, df_handle_from_entity(binary)); - // rjf: is first -> attach process color if applicable - if(is_first && parent->flags & DF_EntityFlag_HasColor) + // rjf: is first -> find target, equip process & module & first thread with target color + if(is_first) { - Vec4F32 rgba = df_rgba_from_entity(parent); - df_entity_equip_color_rgba(module, rgba); + DF_EntityList targets = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); + for(DF_EntityNode *n = targets.first; n != 0; n = n->next) + { + DF_Entity *target = n->entity; + DF_Entity *exe = df_entity_child_from_kind(target, DF_EntityKind_Executable); + String8 exe_name = exe->name; + String8 exe_name_normalized = path_normalized_from_string(scratch.arena, exe_name); + String8 module_name_normalized = path_normalized_from_string(scratch.arena, module->name); + if(str8_match(exe_name_normalized, module_name_normalized, StringMatchFlag_CaseInsensitive) && + target->flags & DF_EntityFlag_HasColor) + { + DF_Entity *first_thread = df_entity_child_from_kind(parent, DF_EntityKind_Thread); + Vec4F32 rgba = df_rgba_from_entity(target); + df_entity_equip_color_rgba(parent, rgba); + df_entity_equip_color_rgba(first_thread, rgba); + df_entity_equip_color_rgba(module, rgba); + break; + } + } } }break; @@ -6885,50 +6902,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) case CTRL_EventKind_MemCommit:{}break; case CTRL_EventKind_MemDecommit:{}break; case CTRL_EventKind_MemRelease:{}break; - - //- rjf: ctrl requests - - case CTRL_EventKind_LaunchAndInitDone: - case CTRL_EventKind_AttachDone: - case CTRL_EventKind_KillDone: - case CTRL_EventKind_DetachDone: - { - // rjf: resolve request entities - DF_EntityID id = event->msg_id; - DF_Entity *request_entity = df_entity_from_id(id); - if(!df_entity_is_nil(request_entity)) - { - df_entity_mark_for_deletion(request_entity); - - // TODO(rjf): @launch_and_init_x -#if 0 - switch(request_entity->subkind) - { - case CTRL_MsgKind_LaunchAndInit: - { - DF_Entity *target = df_entity_from_handle(request_entity->entity_handle); - DF_Entity *process = df_entity_from_ctrl_id(event->machine_id, event->entity_id); - DF_Entity *thread = df_entity_child_from_kind(process, DF_EntityKind_Thread); - if(!df_entity_is_nil(target) && !df_entity_is_nil(process) && !df_entity_is_nil(thread)) - { - df_entity_equip_entity_handle(process, df_handle_from_entity(target)); - if(target->flags & DF_EntityFlag_HasColor) - { - Vec4F32 color = df_rgba_from_entity(target); - df_entity_equip_color_rgba(process, color); - df_entity_equip_color_rgba(thread, color); - } - } - }break; - } -#endif - } - - // rjf: collect stop info - arena_clear(df_state->ctrl_stop_arena); - MemoryCopyStruct(&df_state->ctrl_last_stop_event, event); - df_state->ctrl_last_stop_event.string = push_str8_copy(df_state->ctrl_stop_arena, df_state->ctrl_last_stop_event.string); - }break; } } @@ -7145,17 +7118,9 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } } - // rjf: build corresponding request entity - DF_Entity *request_entity = df_entity_alloc(0, df_entity_root(), DF_EntityKind_CtrlRequest); - { - request_entity->subkind = CTRL_MsgKind_Launch; - request_entity->entity_handle = df_handle_from_entity(target); - } - // rjf: push message to launch { CTRL_Msg msg = {CTRL_MsgKind_Launch}; - msg.msg_id = request_entity->id; msg.path = path; msg.cmd_line_string_list = cmdln_strings; msg.env_inherit = 1; diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index c34dcd9a..8135ead4 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -61,7 +61,6 @@ DF_EntityKindTable: {Dest dest 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Destination" } //- rjf: control system entities - {CtrlRequest ctrl_request 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Control Request" } {Process process 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Threads "Process" } {Thread thread 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Thread "Thread" } {Module module 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Module" } diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index 10fde1b9..aeab2adb 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -27,7 +27,7 @@ Rng1U64 df_g_cmd_param_slot_range_table[19] = {OffsetOf(DF_CmdParams, force_confirm), OffsetOf(DF_CmdParams, force_confirm) + sizeof(B32)}, }; -DF_IconKind df_g_entity_kind_icon_kind_table[27] = +DF_IconKind df_g_entity_kind_icon_kind_table[26] = { DF_IconKind_Null, DF_IconKind_Null, @@ -47,7 +47,6 @@ DF_IconKind_Null, DF_IconKind_Null, DF_IconKind_Null, DF_IconKind_Null, -DF_IconKind_Null, DF_IconKind_Threads, DF_IconKind_Thread, DF_IconKind_Module, @@ -58,7 +57,7 @@ DF_IconKind_Null, DF_IconKind_Null, }; -String8 df_g_entity_kind_display_string_table[27] = +String8 df_g_entity_kind_display_string_table[26] = { str8_lit_comp("Nil"), str8_lit_comp("Root"), @@ -78,7 +77,6 @@ str8_lit_comp("Execution Path"), str8_lit_comp("Entry Point Name"), str8_lit_comp("Source"), str8_lit_comp("Destination"), -str8_lit_comp("Control Request"), str8_lit_comp("Process"), str8_lit_comp("Thread"), str8_lit_comp("Module"), @@ -89,7 +87,7 @@ str8_lit_comp("Conversion Failure"), str8_lit_comp("EndedProcess"), }; -String8 df_g_entity_kind_name_label_table[27] = +String8 df_g_entity_kind_name_label_table[26] = { str8_lit_comp("Label"), str8_lit_comp("Label"), @@ -117,10 +115,9 @@ str8_lit_comp("Label"), str8_lit_comp("Label"), str8_lit_comp("Label"), str8_lit_comp("Label"), -str8_lit_comp("Label"), }; -DF_EntityKindFlags df_g_entity_kind_flags_table[27] = +DF_EntityKindFlags df_g_entity_kind_flags_table[26] = { (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), @@ -143,7 +140,6 @@ DF_EntityKindFlags df_g_entity_kind_flags_table[27] = (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 1*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 1*DF_EntityKindFlag_TreeMutationSoftHalt | 1*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), @@ -151,7 +147,7 @@ DF_EntityKindFlags df_g_entity_kind_flags_table[27] = (0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProfileConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProfileConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), }; -DF_EntityOpFlags df_g_entity_kind_op_flags_table[27] = +DF_EntityOpFlags df_g_entity_kind_op_flags_table[26] = { (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), @@ -171,7 +167,6 @@ DF_EntityOpFlags df_g_entity_kind_op_flags_table[27] = (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), (0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index a2454b39..839d6b19 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -35,7 +35,6 @@ DF_EntityKind_ExecutionPath, DF_EntityKind_EntryPointName, DF_EntityKind_Source, DF_EntityKind_Dest, -DF_EntityKind_CtrlRequest, DF_EntityKind_Process, DF_EntityKind_Thread, DF_EntityKind_Module, @@ -1517,11 +1516,11 @@ struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = }; C_LINKAGE_BEGIN extern Rng1U64 df_g_cmd_param_slot_range_table[19]; -extern DF_IconKind df_g_entity_kind_icon_kind_table[27]; -extern String8 df_g_entity_kind_display_string_table[27]; -extern String8 df_g_entity_kind_name_label_table[27]; -extern DF_EntityKindFlags df_g_entity_kind_flags_table[27]; -extern DF_EntityOpFlags df_g_entity_kind_op_flags_table[27]; +extern DF_IconKind df_g_entity_kind_icon_kind_table[26]; +extern String8 df_g_entity_kind_display_string_table[26]; +extern String8 df_g_entity_kind_name_label_table[26]; +extern DF_EntityKindFlags df_g_entity_kind_flags_table[26]; +extern DF_EntityOpFlags df_g_entity_kind_op_flags_table[26]; extern String8 df_g_cfg_src_string_table[4]; extern DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[4]; extern DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[4]; diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 11d9a848..ec29bafd 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -8512,22 +8512,6 @@ df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, }break; } }break; - case CTRL_EventKind_LaunchAndInitDone: - { - explanation = str8_lit("Launched"); - }break; - case CTRL_EventKind_AttachDone: - { - explanation = str8_lit("Attached"); - }break; - case CTRL_EventKind_DetachDone: - { - explanation = str8_lit("Detached"); - }break; - case CTRL_EventKind_KillDone: - { - explanation = str8_lit("Killed"); - }break; } scratch_end(scratch); if(icon_out) From 96ff5efe7c7c46bc8ece95dd897ad24dbf58bcfd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 08:54:08 -0700 Subject: [PATCH 241/275] allow delete/rename access on exe/debug handles --- src/dbgi/dbgi.c | 4 ++-- src/os/core/win32/os_core_win32.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index 36879117..de5d7143 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -690,7 +690,7 @@ dbgi_parse_thread_entry_point(void *p) void *exe_file_base = 0; if(do_task) { - exe_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, exe_path); + exe_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, exe_path); exe_file_props = os_properties_from_file(exe_file); exe_file_map = os_file_map_open(OS_AccessFlag_Read, exe_file); exe_file_base = os_file_map_view_open(exe_file_map, OS_AccessFlag_Read, r1u64(0, exe_file_props.size)); @@ -935,7 +935,7 @@ dbgi_parse_thread_entry_point(void *p) void *raddbgi_file_base = 0; if(do_task && raddbgi_file_is_up_to_date) { - raddbgi_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, raddbgi_path); + raddbgi_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, raddbgi_path); raddbgi_file_map = os_file_map_open(OS_AccessFlag_Read, raddbgi_file); raddbgi_file_props = os_properties_from_file(raddbgi_file); raddbgi_file_base = os_file_map_view_open(raddbgi_file_map, OS_AccessFlag_Read, r1u64(0, raddbgi_file_props.size)); diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 077dce21..0d13d0e4 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -662,7 +662,7 @@ os_file_open(OS_AccessFlags flags, String8 path) if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;} if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;} - if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE;} + if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;} if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;} HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, 0, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0); if(file != INVALID_HANDLE_VALUE) From dbb0c1e0a45eb3d4821b6726e705eb7af14eec71 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 09:36:09 -0700 Subject: [PATCH 242/275] file_stream: solidify retry mechanism; df: multiline controls for text_cache-based info, begin porting over txti-based systems --- src/base/base_core.h | 1 + src/df/gfx/df_gfx.c | 177 ++++++++++++++++++++++++++++++++++ src/df/gfx/df_gfx.h | 1 + src/df/gfx/df_views.c | 3 +- src/file_stream/file_stream.c | 78 ++++++++++----- src/file_stream/file_stream.h | 2 +- src/hash_store/hash_store.c | 7 +- src/text_cache/text_cache.c | 11 +++ src/text_cache/text_cache.h | 1 + 9 files changed, 252 insertions(+), 29 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index f0fddea2..c66772c1 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -168,6 +168,7 @@ # define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) # define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) # define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((volatile __int64 *)(x), c) +# define ins_atomic_u32_eval(x,c) InterlockedAdd((volatile LONG *)(x), 0) # define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) # define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) # define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile __int64 *)(x), (__int64)(c)) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index ec29bafd..459b55a8 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -10570,6 +10570,183 @@ df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF return sig; } +internal B32 +df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column) +{ + Temp scratch = scratch_begin(0, 0); + B32 change = 0; + UI_NavActionList *nav_actions = ui_nav_actions(); + for(UI_NavActionNode *n = nav_actions->first, *next = 0; n != 0; n = next) + { + next = n->next; + B32 taken = 0; + + String8 line = txt_string_from_info_data_line_num(info, data, cursor->line); + UI_NavTxtOp single_line_op = ui_nav_single_line_txt_op_from_action(scratch.arena, n->v, line, *cursor, *mark); + + //- rjf: invalid single-line op or endpoint units => try multiline + if(n->v.delta_unit == UI_NavDeltaUnit_EndPoint || single_line_op.flags & UI_NavTxtOpFlag_Invalid) + { + U64 line_count = info->lines_count; + String8 prev_line = txt_string_from_info_data_line_num(info, data, cursor->line-1); + String8 next_line = txt_string_from_info_data_line_num(info, data, cursor->line+1); + Vec2S32 delta = n->v.delta; + + //- rjf: wrap lines right + if(n->v.delta_unit != UI_NavDeltaUnit_EndPoint && delta.x > 0 && cursor->column == line.size+1 && cursor->line+1 <= line_count) + { + cursor->line += 1; + cursor->column = 1; + *preferred_column = 1; + change = 1; + taken = 1; + } + + //- rjf: wrap lines left + if(n->v.delta_unit != UI_NavDeltaUnit_EndPoint && delta.x < 0 && cursor->column == 1 && cursor->line-1 >= 1) + { + cursor->line -= 1; + cursor->column = prev_line.size+1; + *preferred_column = prev_line.size+1; + change = 1; + taken = 1; + } + + //- rjf: movement down (plain) + if(n->v.delta_unit == UI_NavDeltaUnit_Element && delta.y > 0 && cursor->line+1 <= line_count) + { + cursor->line += 1; + cursor->column = Min(*preferred_column, next_line.size+1); + change = 1; + taken = 1; + } + + //- rjf: movement up (plain) + if(n->v.delta_unit == UI_NavDeltaUnit_Element && delta.y < 0 && cursor->line-1 >= 1) + { + cursor->line -= 1; + cursor->column = Min(*preferred_column, prev_line.size+1); + change = 1; + taken = 1; + } + + //- rjf: movement down (chunk) + if(n->v.delta_unit == UI_NavDeltaUnit_Chunk && delta.y > 0 && cursor->line+1 <= line_count) + { + for(S64 line_num = cursor->line+1; line_num <= line_count; line_num += 1) + { + String8 line = txt_string_from_info_data_line_num(info, data, line_num); + U64 line_size = line.size; + if(line_size == 0) + { + cursor->line = line_num; + cursor->column = 1; + break; + } + else if(line_num == line_count) + { + cursor->line = line_num; + cursor->column = line_size+1; + } + } + change = 1; + taken = 1; + } + + //- rjf: movement up (chunk) + if(n->v.delta_unit == UI_NavDeltaUnit_Chunk && delta.y < 0 && cursor->line-1 >= 1) + { + for(S64 line_num = cursor->line-1; line_num > 0; line_num -= 1) + { + String8 line = txt_string_from_info_data_line_num(info, data, line_num); + U64 line_size = line.size; + if(line_size == 0) + { + cursor->line = line_num; + cursor->column = 1; + break; + } + else if(line_num == 1) + { + cursor->line = line_num; + cursor->column = 1; + } + } + change = 1; + taken = 1; + } + + //- rjf: movement down (page) + if(n->v.delta_unit == UI_NavDeltaUnit_Whole && delta.y > 0) + { + cursor->line += line_count_per_page; + cursor->column = 1; + cursor->line = Clamp(1, cursor->line, line_count); + change = 1; + taken = 1; + } + + //- rjf: movement up (page) + if(n->v.delta_unit == UI_NavDeltaUnit_Whole && delta.y < 0) + { + cursor->line -= line_count_per_page; + cursor->column = 1; + cursor->line = Clamp(1, cursor->line, line_count); + change = 1; + taken = 1; + } + + //- rjf: movement to endpoint (+) + if(n->v.delta_unit == UI_NavDeltaUnit_EndPoint && (delta.y > 0 || delta.x > 0)) + { + *cursor = txt_pt(line_count, info->lines_count ? dim_1u64(info->lines_ranges[info->lines_count-1])+1 : 1); + change = 1; + taken = 1; + } + + //- rjf: movement to endpoint (-) + if(n->v.delta_unit == UI_NavDeltaUnit_EndPoint && (delta.y < 0 || delta.x < 0)) + { + *cursor = txt_pt(1, 1); + change = 1; + taken = 1; + } + + //- rjf: stick mark to cursor, when we don't want to keep it in the same spot + if(!(n->v.flags & UI_NavActionFlag_KeepMark)) + { + *mark = *cursor; + } + } + + //- rjf: valid single-line op => do single-line op + else + { + *cursor = single_line_op.cursor; + *mark = single_line_op.mark; + *preferred_column = cursor->column; + change = 1; + taken = 1; + } + + //- rjf: copy + if(n->v.flags & UI_NavActionFlag_Copy) + { + String8 text = txt_string_from_info_data_txt_rng(info, data, txt_rng(*cursor, *mark)); + os_set_clipboard_text(text); + } + + //- rjf: consume + if(taken) + { + ui_nav_eat_action_node(nav_actions, n); + } + } + + scratch_end(scratch); + return change; +} + internal B32 df_do_txti_controls(TXTI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column) { diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 421084b5..d6250984 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -1046,6 +1046,7 @@ internal UI_BOX_CUSTOM_DRAW(df_bp_box_draw_extensions); internal DF_CodeSliceSignal df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string); internal DF_CodeSliceSignal df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...); +internal B32 df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); internal B32 df_do_txti_controls(TXTI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); internal B32 df_do_dasm_controls(DASM_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index cf4e8911..d543c9ec 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5503,8 +5503,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) { if(text_info_is_ready && visible_line_num_range.max >= visible_line_num_range.min && ui_is_focus_active()) { - // TODO(rjf): @txt - //snap[Axis2_X] = snap[Axis2_Y] = df_do_txti_controls(txti_handle, ClampBot(num_possible_visible_lines, 10) - 10, &tv->cursor, &tv->mark, &tv->preferred_column); + snap[Axis2_X] = snap[Axis2_Y] = df_do_txt_controls(&text_info, data, ClampBot(num_possible_visible_lines, 10) - 10, &tv->cursor, &tv->mark, &tv->preferred_column); } } diff --git a/src/file_stream/file_stream.c b/src/file_stream/file_stream.c index 8120912d..e1b411e5 100644 --- a/src/file_stream/file_stream.c +++ b/src/file_stream/file_stream.c @@ -73,10 +73,10 @@ fs_hash_from_path(String8 path, U64 endt_us) SLLQueuePush(slot->first, slot->last, node); node->path = push_str8_copy(stripe->arena, path); } - if(os_now_microseconds() >= ins_atomic_u64_eval(&node->last_time_requested_us)+1000000 && - fs_u2s_enqueue_path(path, endt_us)) + if(!ins_atomic_u32_eval_cond_assign(&node->is_working, 1, 0) && + !fs_u2s_enqueue_path(path, endt_us)) { - ins_atomic_u64_eval_assign(&node->last_time_requested_us, os_now_microseconds()); + ins_atomic_u32_eval_assign(&node->is_working, 0); } result = hs_hash_from_key(path_key, 0); if(u128_match(result, u128_zero()) && os_now_microseconds() <= endt_us) @@ -161,47 +161,75 @@ fs_streamer_thread__entry_point(void *p) for(;;) { Temp scratch = scratch_begin(0, 0); + + //- rjf: unpack path String8 path = fs_u2s_dequeue_path(scratch.arena); + U128 key = hs_hash_from_data(path); + U64 slot_idx = key.u64[0]%fs_shared->slots_count; + U64 stripe_idx = slot_idx%fs_shared->stripes_count; + FS_Slot *slot = &fs_shared->slots[slot_idx]; + FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; + + //- rjf: load + ProfBegin("load \"%.*s\"", str8_varg(path)); FileProperties pre_props = os_properties_from_file_path(path); OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, path); U64 data_arena_size = pre_props.size+ARENA_HEADER_SIZE; data_arena_size += KB(4)-1; data_arena_size -= data_arena_size%KB(4); + ProfBegin("allocate"); Arena *data_arena = arena_alloc__sized(data_arena_size, data_arena_size); + ProfEnd(); + ProfBegin("read"); String8 data = os_string_from_file_range(data_arena, file, r1u64(0, pre_props.size)); + ProfEnd(); os_file_close(file); FileProperties post_props = os_properties_from_file_path(path); + + //- rjf: abort if modification timestamps differ - we did not successfully read the file if(pre_props.modified != post_props.modified) { - arena_release(data_arena); - MemoryZeroStruct(&data); + ProfScope("abort") + { + arena_release(data_arena); + MemoryZeroStruct(&data); + data_arena = 0; + } } + + //- rjf: submit else { - U128 key = hs_hash_from_data(path); - hs_submit_data(key, &data_arena, data); - U64 slot_idx = key.u64[0]%fs_shared->slots_count; - U64 stripe_idx = slot_idx%fs_shared->stripes_count; - FS_Slot *slot = &fs_shared->slots[slot_idx]; - FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; - OS_MutexScopeW(stripe->rw_mutex) + ProfScope("submit") { - FS_Node *node = 0; - for(FS_Node *n = slot->first; n != 0; n = n->next) + hs_submit_data(key, &data_arena, data); + } + } + + //- rjf: commit info to cache + ProfScope("commit to cache") OS_MutexScopeW(stripe->rw_mutex) + { + FS_Node *node = 0; + for(FS_Node *n = slot->first; n != 0; n = n->next) + { + if(str8_match(n->path, path, 0)) { - if(str8_match(n->path, path, 0)) - { - node = n; - break; - } + node = n; + break; } - if(node != 0) + } + if(node != 0) + { + if(post_props.modified == pre_props.modified) { node->timestamp = post_props.modified; } + ins_atomic_u32_eval_assign(&node->is_working, 0); } - os_condition_variable_broadcast(stripe->cv); } + os_condition_variable_broadcast(stripe->cv); + + ProfEnd(); scratch_end(scratch); } } @@ -226,9 +254,13 @@ fs_detector_thread__entry_point(void *p) for(FS_Node *n = slot->first; n != 0; n = n->next) { FileProperties props = os_properties_from_file_path(n->path); - if(props.modified != n->timestamp && n->last_time_requested_us+100000 < os_now_microseconds()) + if(props.modified != n->timestamp) { - fs_u2s_enqueue_path(n->path, os_now_microseconds()+100000); + if(!ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0) && + !fs_u2s_enqueue_path(n->path, os_now_microseconds()+100000)) + { + ins_atomic_u32_eval_assign(&n->is_working, 0); + } } } } diff --git a/src/file_stream/file_stream.h b/src/file_stream/file_stream.h index 6a491e44..078b3547 100644 --- a/src/file_stream/file_stream.h +++ b/src/file_stream/file_stream.h @@ -13,7 +13,7 @@ struct FS_Node FS_Node *next; String8 path; U64 timestamp; - U64 last_time_requested_us; + B32 is_working; }; typedef struct FS_Slot FS_Slot; diff --git a/src/hash_store/hash_store.c b/src/hash_store/hash_store.c index 5a9570c6..501d888a 100644 --- a/src/hash_store/hash_store.c +++ b/src/hash_store/hash_store.c @@ -84,7 +84,7 @@ hs_submit_data(U128 key, Arena **data_arena, String8 data) HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; //- rjf: commit data to cache - if already there, just bump key refcount - OS_MutexScopeW(stripe->rw_mutex) + ProfScope("commit data to cache - if already there, just bump key refcount") OS_MutexScopeW(stripe->rw_mutex) { HS_Node *existing_node = 0; for(HS_Node *n = slot->first; n != 0; n = n->next) @@ -123,7 +123,7 @@ hs_submit_data(U128 key, Arena **data_arena, String8 data) //- rjf: commit this hash to key cache U128 key_expired_hash = {0}; - OS_MutexScopeW(key_stripe->rw_mutex) + ProfScope("commit this hash to key cache") OS_MutexScopeW(key_stripe->rw_mutex) { HS_KeyNode *key_node = 0; for(HS_KeyNode *n = key_slot->first; n != 0; n = n->next) @@ -152,7 +152,8 @@ hs_submit_data(U128 key, Arena **data_arena, String8 data) } //- rjf: if this key's history cache was full, dec key ref count of oldest hash - if(!u128_match(key_expired_hash, u128_zero())) + ProfScope("if this key's history cache was full, dec key ref count of oldest hash") + if(!u128_match(key_expired_hash, u128_zero())) { U64 old_hash_slot_idx = key_expired_hash.u64[1]%hs_shared->slots_count; U64 old_hash_stripe_idx = old_hash_slot_idx%hs_shared->stripes_count; diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 9252c172..6d06b1ea 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -1037,6 +1037,17 @@ txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng) return result; } +internal String8 +txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num) +{ + String8 result = {0}; + if(1 <= line_num && line_num <= info->lines_count) + { + result = str8_substr(data, info->lines_ranges[line_num-1]); + } + return result; +} + internal TXT_LineTokensSlice txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range) { diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index 43e6f41a..a3390f06 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -279,6 +279,7 @@ internal TXT_TokenArray txt_token_array_from_info_line_num__linear_scan(TXT_Text internal Rng1U64 txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens); internal Rng1U64 txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt); internal String8 txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng); +internal String8 txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num); internal TXT_LineTokensSlice txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range); //////////////////////////////// From f46691d79abaaa0aa9d61b199410a614c5e64a66 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 09:45:41 -0700 Subject: [PATCH 243/275] dasm -> dasmi; make room for new dasm_cache layer --- src/base/base_entry_point.c | 2 +- src/dasm/dasm.c | 222 ++++++++++++++++++------------------ src/dasm/dasm.h | 108 +++++++++--------- src/dasm_cache/dasm_cache.c | 0 src/dasm_cache/dasm_cache.h | 7 ++ src/df/core/df_core.c | 4 +- src/df/core/df_core.h | 2 +- src/df/gfx/df_gfx.c | 2 +- src/df/gfx/df_gfx.h | 2 +- src/df/gfx/df_views.c | 60 +++++----- 10 files changed, 208 insertions(+), 201 deletions(-) create mode 100644 src/dasm_cache/dasm_cache.c create mode 100644 src/dasm_cache/dasm_cache.h diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index cb6219a0..7fa1b0f0 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -46,7 +46,7 @@ main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **argum ctrl_init(); #endif #if defined(DASM_H) - dasm_init(); + dasmi_init(); #endif #if defined(OS_GRAPHICAL_H) os_graphical_init(); diff --git a/src/dasm/dasm.c b/src/dasm/dasm.c index 8eb51f1d..d995a1b0 100644 --- a/src/dasm/dasm.c +++ b/src/dasm/dasm.c @@ -5,30 +5,30 @@ //~ rjf: Main Layer Initialization internal void -dasm_init(void) +dasmi_init(void) { Arena *arena = arena_alloc(); - dasm_shared = push_array(arena, DASM_Shared, 1); - dasm_shared->arena = arena; - dasm_shared->entity_map.slots_count = 1024; - dasm_shared->entity_map.slots = push_array(arena, DASM_EntitySlot, dasm_shared->entity_map.slots_count); - dasm_shared->entity_map_stripes.count = 64; - dasm_shared->entity_map_stripes.v = push_array(arena, DASM_Stripe, dasm_shared->entity_map_stripes.count); - for(U64 idx = 0; idx < dasm_shared->entity_map_stripes.count; idx += 1) + dasmi_shared = push_array(arena, DASMI_Shared, 1); + dasmi_shared->arena = arena; + dasmi_shared->entity_map.slots_count = 1024; + dasmi_shared->entity_map.slots = push_array(arena, DASMI_EntitySlot, dasmi_shared->entity_map.slots_count); + dasmi_shared->entity_map_stripes.count = 64; + dasmi_shared->entity_map_stripes.v = push_array(arena, DASMI_Stripe, dasmi_shared->entity_map_stripes.count); + for(U64 idx = 0; idx < dasmi_shared->entity_map_stripes.count; idx += 1) { - dasm_shared->entity_map_stripes.v[idx].arena = arena_alloc(); - dasm_shared->entity_map_stripes.v[idx].rw_mutex = os_rw_mutex_alloc(); - dasm_shared->entity_map_stripes.v[idx].cv = os_condition_variable_alloc(); + dasmi_shared->entity_map_stripes.v[idx].arena = arena_alloc(); + dasmi_shared->entity_map_stripes.v[idx].rw_mutex = os_rw_mutex_alloc(); + dasmi_shared->entity_map_stripes.v[idx].cv = os_condition_variable_alloc(); } - dasm_shared->u2d_ring_mutex = os_mutex_alloc(); - dasm_shared->u2d_ring_cv = os_condition_variable_alloc(); - dasm_shared->u2d_ring_size = KB(64); - dasm_shared->u2d_ring_base = push_array_no_zero(arena, U8, dasm_shared->u2d_ring_size); - dasm_shared->decode_thread_count = Max(1, os_logical_core_count()-1); - dasm_shared->decode_threads = push_array(arena, OS_Handle, dasm_shared->decode_thread_count); - for(U64 idx = 0; idx < dasm_shared->decode_thread_count; idx += 1) + dasmi_shared->u2d_ring_mutex = os_mutex_alloc(); + dasmi_shared->u2d_ring_cv = os_condition_variable_alloc(); + dasmi_shared->u2d_ring_size = KB(64); + dasmi_shared->u2d_ring_base = push_array_no_zero(arena, U8, dasmi_shared->u2d_ring_size); + dasmi_shared->decode_thread_count = Max(1, os_logical_core_count()-1); + dasmi_shared->decode_threads = push_array(arena, OS_Handle, dasmi_shared->decode_thread_count); + for(U64 idx = 0; idx < dasmi_shared->decode_thread_count; idx += 1) { - dasm_shared->decode_threads[idx] = os_launch_thread(dasm_decode_thread_entry_point, (void *)idx, 0); + dasmi_shared->decode_threads[idx] = os_launch_thread(dasmi_decode_thread_entry_point, (void *)idx, 0); } } @@ -36,7 +36,7 @@ dasm_init(void) //~ rjf: Basic Helpers internal U64 -dasm_hash_from_string(String8 string) +dasmi_hash_from_string(String8 string) { U64 result = 5381; for(U64 i = 0; i < string.size; i += 1) @@ -50,13 +50,13 @@ dasm_hash_from_string(String8 string) //~ rjf: Instruction Type Functions internal void -dasm_inst_chunk_list_push(Arena *arena, DASM_InstChunkList *list, U64 cap, DASM_Inst *inst) +dasmi_inst_chunk_list_push(Arena *arena, DASMI_InstChunkList *list, U64 cap, DASMI_Inst *inst) { - DASM_InstChunkNode *node = list->last; + DASMI_InstChunkNode *node = list->last; if(node == 0 || node->count >= node->cap) { - node = push_array(arena, DASM_InstChunkNode, 1); - node->v = push_array_no_zero(arena, DASM_Inst, cap); + node = push_array(arena, DASMI_InstChunkNode, 1); + node->v = push_array_no_zero(arena, DASMI_Inst, cap); node->cap = cap; SLLQueuePush(list->first, list->last, node); list->node_count += 1; @@ -66,23 +66,23 @@ dasm_inst_chunk_list_push(Arena *arena, DASM_InstChunkList *list, U64 cap, DASM_ list->inst_count += 1; } -internal DASM_InstArray -dasm_inst_array_from_chunk_list(Arena *arena, DASM_InstChunkList *list) +internal DASMI_InstArray +dasmi_inst_array_from_chunk_list(Arena *arena, DASMI_InstChunkList *list) { - DASM_InstArray array = {0}; + DASMI_InstArray array = {0}; array.count = list->inst_count; - array.v = push_array_no_zero(arena, DASM_Inst, array.count); + array.v = push_array_no_zero(arena, DASMI_Inst, array.count); U64 idx = 0; - for(DASM_InstChunkNode *n = list->first; n != 0; n = n->next) + for(DASMI_InstChunkNode *n = list->first; n != 0; n = n->next) { - MemoryCopy(array.v+idx, n->v, sizeof(DASM_Inst)*n->count); + MemoryCopy(array.v+idx, n->v, sizeof(DASMI_Inst)*n->count); idx += n->count; } return array; } internal U64 -dasm_inst_array_idx_from_off__linear_scan(DASM_InstArray *array, U64 off) +dasmi_inst_array_idx_from_off__linear_scan(DASMI_InstArray *array, U64 off) { U64 result = 0; for(U64 idx = 0; idx < array->count; idx += 1) @@ -97,7 +97,7 @@ dasm_inst_array_idx_from_off__linear_scan(DASM_InstArray *array, U64 off) } internal U64 -dasm_inst_array_off_from_idx(DASM_InstArray *array, U64 idx) +dasmi_inst_array_off_from_idx(DASMI_InstArray *array, U64 idx) { U64 off = 0; if(idx < array->count) @@ -119,10 +119,10 @@ dasm_inst_array_off_from_idx(DASM_InstArray *array, U64 idx) #include "third_party/udis86/libudis86/syn.c" #include "third_party/udis86/libudis86/udis86.c" -internal DASM_InstChunkList -dasm_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data) +internal DASMI_InstChunkList +dasmi_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data) { - DASM_InstChunkList inst_list = {0}; + DASMI_InstChunkList inst_list = {0}; switch(arch) { default:{}break; @@ -157,8 +157,8 @@ dasm_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_coun // rjf: push String8 string = push_str8f(arena, "%s", udc.asm_buf); - DASM_Inst inst = {string, off, rel_voff}; - dasm_inst_chunk_list_push(arena, &inst_list, 1024, &inst); + DASMI_Inst inst = {string, off, rel_voff}; + dasmi_inst_chunk_list_push(arena, &inst_list, 1024, &inst); // rjf: increment off += size; @@ -178,21 +178,21 @@ dasm_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_coun //- rjf: opening handles & correllation with module -internal DASM_Handle -dasm_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range, Architecture arch) +internal DASMI_Handle +dasmi_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range, Architecture arch) { - DASM_Handle result = {0}; + DASMI_Handle result = {0}; if(machine != 0 && process.u64[0] != 0) { - U64 hash = dasm_hash_from_string(str8_struct(&process)); - U64 slot_idx = hash%dasm_shared->entity_map.slots_count; - U64 stripe_idx = slot_idx%dasm_shared->entity_map_stripes.count; - DASM_EntitySlot *slot = &dasm_shared->entity_map.slots[slot_idx]; - DASM_Stripe *stripe = &dasm_shared->entity_map_stripes.v[stripe_idx]; + U64 hash = dasmi_hash_from_string(str8_struct(&process)); + U64 slot_idx = hash%dasmi_shared->entity_map.slots_count; + U64 stripe_idx = slot_idx%dasmi_shared->entity_map_stripes.count; + DASMI_EntitySlot *slot = &dasmi_shared->entity_map.slots[slot_idx]; + DASMI_Stripe *stripe = &dasmi_shared->entity_map_stripes.v[stripe_idx]; OS_MutexScopeW(stripe->rw_mutex) { - DASM_Entity *entity = 0; - for(DASM_Entity *e = slot->first; e != 0; e = e->next) + DASMI_Entity *entity = 0; + for(DASMI_Entity *e = slot->first; e != 0; e = e->next) { if(e->machine_id == machine && dmn_handle_match(e->process, process) && @@ -205,13 +205,13 @@ dasm_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle proc } if(entity == 0) { - entity = push_array(stripe->arena, DASM_Entity, 1); + entity = push_array(stripe->arena, DASMI_Entity, 1); SLLQueuePush(slot->first, slot->last, entity); entity->machine_id = machine; entity->process = process; entity->vaddr_range= vaddr_range; entity->arch = arch; - entity->id = ins_atomic_u64_inc_eval(&dasm_shared->entity_id_gen); + entity->id = ins_atomic_u64_inc_eval(&dasmi_shared->entity_id_gen); entity->decode_inst_arena = arena_alloc__sized(MB(256), KB(64)); entity->decode_string_arena = arena_alloc__sized(GB(1), KB(64)); } @@ -224,21 +224,21 @@ dasm_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle proc //- rjf: asking for top-level info of a handle -internal DASM_BinaryInfo -dasm_binary_info_from_handle(Arena *arena, DASM_Handle handle) +internal DASMI_BinaryInfo +dasmi_binary_info_from_handle(Arena *arena, DASMI_Handle handle) { - DASM_BinaryInfo info = {0}; + DASMI_BinaryInfo info = {0}; { U64 hash = handle.u64[0]; U64 id = handle.u64[1]; - U64 slot_idx = hash%dasm_shared->entity_map.slots_count; - U64 stripe_idx = slot_idx%dasm_shared->entity_map_stripes.count; - DASM_EntitySlot *slot = &dasm_shared->entity_map.slots[slot_idx]; - DASM_Stripe *stripe = &dasm_shared->entity_map_stripes.v[stripe_idx]; + U64 slot_idx = hash%dasmi_shared->entity_map.slots_count; + U64 stripe_idx = slot_idx%dasmi_shared->entity_map_stripes.count; + DASMI_EntitySlot *slot = &dasmi_shared->entity_map.slots[slot_idx]; + DASMI_Stripe *stripe = &dasmi_shared->entity_map_stripes.v[stripe_idx]; OS_MutexScopeR(stripe->rw_mutex) { - DASM_Entity *entity = 0; - for(DASM_Entity *e = slot->first; e != 0; e = e->next) + DASMI_Entity *entity = 0; + for(DASMI_Entity *e = slot->first; e != 0; e = e->next) { if(e->id == id) { @@ -261,23 +261,23 @@ dasm_binary_info_from_handle(Arena *arena, DASM_Handle handle) //- rjf: asking for decoded instructions -internal DASM_InstArray -dasm_inst_array_from_handle(Arena *arena, DASM_Handle handle, U64 endt_us) +internal DASMI_InstArray +dasmi_inst_array_from_handle(Arena *arena, DASMI_Handle handle, U64 endt_us) { - DASM_InstArray result = {0}; + DASMI_InstArray result = {0}; if(handle.u64[0] != 0 || handle.u64[1] != 0) { U64 hash = handle.u64[0]; U64 id = handle.u64[1]; - U64 slot_idx = hash%dasm_shared->entity_map.slots_count; - U64 stripe_idx = slot_idx%dasm_shared->entity_map_stripes.count; - DASM_EntitySlot *slot = &dasm_shared->entity_map.slots[slot_idx]; - DASM_Stripe *stripe = &dasm_shared->entity_map_stripes.v[stripe_idx]; + U64 slot_idx = hash%dasmi_shared->entity_map.slots_count; + U64 stripe_idx = slot_idx%dasmi_shared->entity_map_stripes.count; + DASMI_EntitySlot *slot = &dasmi_shared->entity_map.slots[slot_idx]; + DASMI_Stripe *stripe = &dasmi_shared->entity_map_stripes.v[stripe_idx]; B32 sent = 0; OS_MutexScopeR(stripe->rw_mutex) for(;;) { - DASM_Entity *entity = 0; - for(DASM_Entity *e = slot->first; e != 0; e = e->next) + DASMI_Entity *entity = 0; + for(DASMI_Entity *e = slot->first; e != 0; e = e->next) { if(e->id == id) { @@ -294,8 +294,8 @@ dasm_inst_array_from_handle(Arena *arena, DASM_Handle handle, U64 endt_us) if(bytes_processed == bytes_to_process && bytes_processed != 0) { result.count = entity->decode_inst_array.count; - result.v = push_array_no_zero(arena, DASM_Inst, result.count); - MemoryCopy(result.v, entity->decode_inst_array.v, sizeof(DASM_Inst)*result.count); + result.v = push_array_no_zero(arena, DASMI_Inst, result.count); + MemoryCopy(result.v, entity->decode_inst_array.v, sizeof(DASMI_Inst)*result.count); for(U64 idx = 0; idx < result.count; idx += 1) { result.v[idx].string = push_str8_copy(arena, result.v[idx].string); @@ -305,8 +305,8 @@ dasm_inst_array_from_handle(Arena *arena, DASM_Handle handle, U64 endt_us) } if(!sent && entity != 0 && last_time_sent_us+10000 <= os_now_microseconds()) { - DASM_DecodeRequest req = {handle}; - sent = dasm_u2d_enqueue_request(&req, endt_us); + DASMI_DecodeRequest req = {handle}; + sent = dasmi_u2d_enqueue_request(&req, endt_us); ins_atomic_u64_eval_assign(&entity->last_time_sent_us, os_now_microseconds()); } if(os_now_microseconds() >= endt_us) @@ -323,70 +323,70 @@ dasm_inst_array_from_handle(Arena *arena, DASM_Handle handle, U64 endt_us) //~ rjf: Decode Threads internal B32 -dasm_u2d_enqueue_request(DASM_DecodeRequest *req, U64 endt_us) +dasmi_u2d_enqueue_request(DASMI_DecodeRequest *req, U64 endt_us) { B32 result = 0; - OS_MutexScope(dasm_shared->u2d_ring_mutex) for(;;) + OS_MutexScope(dasmi_shared->u2d_ring_mutex) for(;;) { - U64 unconsumed_size = (dasm_shared->u2d_ring_write_pos-dasm_shared->u2d_ring_read_pos); - U64 available_size = (dasm_shared->u2d_ring_size-unconsumed_size); + U64 unconsumed_size = (dasmi_shared->u2d_ring_write_pos-dasmi_shared->u2d_ring_read_pos); + U64 available_size = (dasmi_shared->u2d_ring_size-unconsumed_size); if(available_size >= sizeof(*req)) { result = 1; - dasm_shared->u2d_ring_write_pos += ring_write_struct(dasm_shared->u2d_ring_base, dasm_shared->u2d_ring_size, dasm_shared->u2d_ring_write_pos, req); - dasm_shared->u2d_ring_write_pos += 7; - dasm_shared->u2d_ring_write_pos -= dasm_shared->u2d_ring_write_pos%8; + dasmi_shared->u2d_ring_write_pos += ring_write_struct(dasmi_shared->u2d_ring_base, dasmi_shared->u2d_ring_size, dasmi_shared->u2d_ring_write_pos, req); + dasmi_shared->u2d_ring_write_pos += 7; + dasmi_shared->u2d_ring_write_pos -= dasmi_shared->u2d_ring_write_pos%8; break; } if(os_now_microseconds() >= endt_us) { break; } - os_condition_variable_wait(dasm_shared->u2d_ring_cv, dasm_shared->u2d_ring_mutex, endt_us); + os_condition_variable_wait(dasmi_shared->u2d_ring_cv, dasmi_shared->u2d_ring_mutex, endt_us); } if(result) { - os_condition_variable_broadcast(dasm_shared->u2d_ring_cv); + os_condition_variable_broadcast(dasmi_shared->u2d_ring_cv); } return result; } -internal DASM_DecodeRequest -dasm_u2d_dequeue_request(void) +internal DASMI_DecodeRequest +dasmi_u2d_dequeue_request(void) { - DASM_DecodeRequest req = {0}; - OS_MutexScope(dasm_shared->u2d_ring_mutex) for(;;) + DASMI_DecodeRequest req = {0}; + OS_MutexScope(dasmi_shared->u2d_ring_mutex) for(;;) { - U64 unconsumed_size = (dasm_shared->u2d_ring_write_pos-dasm_shared->u2d_ring_read_pos); - if(unconsumed_size >= sizeof(DASM_DecodeRequest)) + U64 unconsumed_size = (dasmi_shared->u2d_ring_write_pos-dasmi_shared->u2d_ring_read_pos); + if(unconsumed_size >= sizeof(DASMI_DecodeRequest)) { - dasm_shared->u2d_ring_read_pos += ring_read_struct(dasm_shared->u2d_ring_base, dasm_shared->u2d_ring_size, dasm_shared->u2d_ring_read_pos, &req); - dasm_shared->u2d_ring_read_pos += 7; - dasm_shared->u2d_ring_read_pos -= dasm_shared->u2d_ring_read_pos%8; + dasmi_shared->u2d_ring_read_pos += ring_read_struct(dasmi_shared->u2d_ring_base, dasmi_shared->u2d_ring_size, dasmi_shared->u2d_ring_read_pos, &req); + dasmi_shared->u2d_ring_read_pos += 7; + dasmi_shared->u2d_ring_read_pos -= dasmi_shared->u2d_ring_read_pos%8; break; } - os_condition_variable_wait(dasm_shared->u2d_ring_cv, dasm_shared->u2d_ring_mutex, max_U64); + os_condition_variable_wait(dasmi_shared->u2d_ring_cv, dasmi_shared->u2d_ring_mutex, max_U64); } - os_condition_variable_broadcast(dasm_shared->u2d_ring_cv); + os_condition_variable_broadcast(dasmi_shared->u2d_ring_cv); return req; } internal void -dasm_decode_thread_entry_point(void *p) +dasmi_decode_thread_entry_point(void *p) { for(;;) { Temp scratch = scratch_begin(0, 0); //- rjf: get next request & unpack - DASM_DecodeRequest req = dasm_u2d_dequeue_request(); - DASM_Handle handle = req.handle; + DASMI_DecodeRequest req = dasmi_u2d_dequeue_request(); + DASMI_Handle handle = req.handle; U64 hash = handle.u64[0]; U64 id = handle.u64[1]; - U64 slot_idx = hash%dasm_shared->entity_map.slots_count; - U64 stripe_idx = slot_idx%dasm_shared->entity_map_stripes.count; - DASM_EntitySlot *slot = &dasm_shared->entity_map.slots[slot_idx]; - DASM_Stripe *stripe = &dasm_shared->entity_map_stripes.v[stripe_idx]; + U64 slot_idx = hash%dasmi_shared->entity_map.slots_count; + U64 stripe_idx = slot_idx%dasmi_shared->entity_map_stripes.count; + DASMI_EntitySlot *slot = &dasmi_shared->entity_map.slots[slot_idx]; + DASMI_Stripe *stripe = &dasmi_shared->entity_map_stripes.v[stripe_idx]; //- rjf: request -> ctrl info B32 is_first_to_task = 0; @@ -397,8 +397,8 @@ dasm_decode_thread_entry_point(void *p) U64 *bytes_processed_counter = 0; OS_MutexScopeR(stripe->rw_mutex) { - DASM_Entity *entity = 0; - for(DASM_Entity *e = slot->first; e != 0; e = e->next) + DASMI_Entity *entity = 0; + for(DASMI_Entity *e = slot->first; e != 0; e = e->next) { if(e->id == id) { @@ -432,8 +432,8 @@ dasm_decode_thread_entry_point(void *p) { OS_MutexScopeW(stripe->rw_mutex) { - DASM_Entity *entity = 0; - for(DASM_Entity *e = slot->first; e != 0; e = e->next) + DASMI_Entity *entity = 0; + for(DASMI_Entity *e = slot->first; e != 0; e = e->next) { if(e->id == id) { @@ -463,14 +463,14 @@ dasm_decode_thread_entry_point(void *p) //- rjf: read next chunk & decode String8 data = {0}; - DASM_InstChunkList inst_list = {0}; + DASMI_InstChunkList inst_list = {0}; if(good_task) { data.str = push_array_no_zero(scratch.arena, U8, dim_1u64(chunk_vaddr_range)); data.size = dmn_process_read(ctrl_process, chunk_vaddr_range, data.str); if(data.size != 0) { - inst_list = dasm_inst_chunk_list_from_arch_addr_data(scratch.arena, bytes_processed_counter, arch, chunk_vaddr_range.min, data); + inst_list = dasmi_inst_chunk_list_from_arch_addr_data(scratch.arena, bytes_processed_counter, arch, chunk_vaddr_range.min, data); } } @@ -478,8 +478,8 @@ dasm_decode_thread_entry_point(void *p) { OS_MutexScopeW(stripe->rw_mutex) { - DASM_Entity *entity = 0; - for(DASM_Entity *e = slot->first; e != 0; e = e->next) + DASMI_Entity *entity = 0; + for(DASMI_Entity *e = slot->first; e != 0; e = e->next) { if(e->id == id) { @@ -489,11 +489,11 @@ dasm_decode_thread_entry_point(void *p) } if(entity != 0) { - DASM_Inst *new_chunk_base = push_array(entity->decode_inst_arena, DASM_Inst, inst_list.inst_count); + DASMI_Inst *new_chunk_base = push_array(entity->decode_inst_arena, DASMI_Inst, inst_list.inst_count); U64 off = 0; - for(DASM_InstChunkNode *node = inst_list.first; node != 0; node = node->next) + for(DASMI_InstChunkNode *node = inst_list.first; node != 0; node = node->next) { - MemoryCopy(new_chunk_base+off, node->v, sizeof(DASM_Inst)*node->count); + MemoryCopy(new_chunk_base+off, node->v, sizeof(DASMI_Inst)*node->count); off += node->count; } for(U64 idx = 0; idx < inst_list.inst_count; idx += 1) @@ -517,8 +517,8 @@ dasm_decode_thread_entry_point(void *p) { OS_MutexScopeR(stripe->rw_mutex) { - DASM_Entity *entity = 0; - for(DASM_Entity *e = slot->first; e != 0; e = e->next) + DASMI_Entity *entity = 0; + for(DASMI_Entity *e = slot->first; e != 0; e = e->next) { if(e->id == id) { diff --git a/src/dasm/dasm.h b/src/dasm/dasm.h index 6bf4450c..840fff0e 100644 --- a/src/dasm/dasm.h +++ b/src/dasm/dasm.h @@ -7,8 +7,8 @@ //////////////////////////////// //~ rjf: Handle Type -typedef struct DASM_Handle DASM_Handle; -struct DASM_Handle +typedef struct DASMI_Handle DASMI_Handle; +struct DASMI_Handle { U64 u64[2]; }; @@ -16,64 +16,64 @@ struct DASM_Handle //////////////////////////////// //~ rjf: Instruction Types -typedef struct DASM_Inst DASM_Inst; -struct DASM_Inst +typedef struct DASMI_Inst DASMI_Inst; +struct DASMI_Inst { String8 string; U64 off; U64 addr; }; -typedef struct DASM_InstChunkNode DASM_InstChunkNode; -struct DASM_InstChunkNode +typedef struct DASMI_InstChunkNode DASMI_InstChunkNode; +struct DASMI_InstChunkNode { - DASM_InstChunkNode *next; - DASM_Inst *v; + DASMI_InstChunkNode *next; + DASMI_Inst *v; U64 cap; U64 count; }; -typedef struct DASM_InstChunkList DASM_InstChunkList; -struct DASM_InstChunkList +typedef struct DASMI_InstChunkList DASMI_InstChunkList; +struct DASMI_InstChunkList { - DASM_InstChunkNode *first; - DASM_InstChunkNode *last; + DASMI_InstChunkNode *first; + DASMI_InstChunkNode *last; U64 node_count; U64 inst_count; }; -typedef struct DASM_InstArray DASM_InstArray; -struct DASM_InstArray +typedef struct DASMI_InstArray DASMI_InstArray; +struct DASMI_InstArray { - DASM_Inst *v; + DASMI_Inst *v; U64 count; }; //////////////////////////////// //~ rjf: Striped Access Types -typedef struct DASM_Stripe DASM_Stripe; -struct DASM_Stripe +typedef struct DASMI_Stripe DASMI_Stripe; +struct DASMI_Stripe { Arena *arena; OS_Handle cv; OS_Handle rw_mutex; }; -typedef struct DASM_StripeTable DASM_StripeTable; -struct DASM_StripeTable +typedef struct DASMI_StripeTable DASMI_StripeTable; +struct DASMI_StripeTable { U64 count; - DASM_Stripe *v; + DASMI_Stripe *v; }; //////////////////////////////// //~ rjf: Entity Cache Types -typedef struct DASM_Entity DASM_Entity; -struct DASM_Entity +typedef struct DASMI_Entity DASMI_Entity; +struct DASMI_Entity { - DASM_Entity *next; + DASMI_Entity *next; // rjf: key info CTRL_MachineID machine_id; @@ -91,28 +91,28 @@ struct DASM_Entity // rjf: decoded instruction data Arena *decode_inst_arena; Arena *decode_string_arena; - DASM_InstArray decode_inst_array; + DASMI_InstArray decode_inst_array; }; -typedef struct DASM_EntitySlot DASM_EntitySlot; -struct DASM_EntitySlot +typedef struct DASMI_EntitySlot DASMI_EntitySlot; +struct DASMI_EntitySlot { - DASM_Entity *first; - DASM_Entity *last; + DASMI_Entity *first; + DASMI_Entity *last; }; -typedef struct DASM_EntityMap DASM_EntityMap; -struct DASM_EntityMap +typedef struct DASMI_EntityMap DASMI_EntityMap; +struct DASMI_EntityMap { U64 slots_count; - DASM_EntitySlot *slots; + DASMI_EntitySlot *slots; }; //////////////////////////////// //~ rjf: Introspection Info Types -typedef struct DASM_BinaryInfo DASM_BinaryInfo; -struct DASM_BinaryInfo +typedef struct DASMI_BinaryInfo DASMI_BinaryInfo; +struct DASMI_BinaryInfo { CTRL_MachineID machine_id; DMN_Handle process; @@ -124,23 +124,23 @@ struct DASM_BinaryInfo //////////////////////////////// //~ rjf: Decode Request Types -typedef struct DASM_DecodeRequest DASM_DecodeRequest; -struct DASM_DecodeRequest +typedef struct DASMI_DecodeRequest DASMI_DecodeRequest; +struct DASMI_DecodeRequest { - DASM_Handle handle; + DASMI_Handle handle; }; //////////////////////////////// //~ rjf: Shared State -typedef struct DASM_Shared DASM_Shared; -struct DASM_Shared +typedef struct DASMI_Shared DASMI_Shared; +struct DASMI_Shared { Arena *arena; // rjf: entity table - DASM_EntityMap entity_map; - DASM_StripeTable entity_map_stripes; + DASMI_EntityMap entity_map; + DASMI_StripeTable entity_map_stripes; U64 entity_id_gen; // rjf: user -> decode ring @@ -159,49 +159,49 @@ struct DASM_Shared //////////////////////////////// //~ rjf: Globals -global DASM_Shared *dasm_shared = 0; +global DASMI_Shared *dasmi_shared = 0; //////////////////////////////// //~ rjf: Main Layer Initialization -internal void dasm_init(void); +internal void dasmi_init(void); //////////////////////////////// //~ rjf: Basic Helpers -internal U64 dasm_hash_from_string(String8 string); +internal U64 dasmi_hash_from_string(String8 string); //////////////////////////////// //~ rjf: Instruction Type Functions -internal void dasm_inst_chunk_list_push(Arena *arena, DASM_InstChunkList *list, U64 cap, DASM_Inst *inst); -internal DASM_InstArray dasm_inst_array_from_chunk_list(Arena *arena, DASM_InstChunkList *list); -internal U64 dasm_inst_array_idx_from_off__linear_scan(DASM_InstArray *array, U64 off); -internal U64 dasm_inst_array_off_from_idx(DASM_InstArray *array, U64 idx); +internal void dasmi_inst_chunk_list_push(Arena *arena, DASMI_InstChunkList *list, U64 cap, DASMI_Inst *inst); +internal DASMI_InstArray dasmi_inst_array_from_chunk_list(Arena *arena, DASMI_InstChunkList *list); +internal U64 dasmi_inst_array_idx_from_off__linear_scan(DASMI_InstArray *array, U64 off); +internal U64 dasmi_inst_array_off_from_idx(DASMI_InstArray *array, U64 idx); //////////////////////////////// //~ rjf: Disassembly Functions -internal DASM_InstChunkList dasm_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data); +internal DASMI_InstChunkList dasmi_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data); //////////////////////////////// //~ rjf: Cache Lookups //- rjf: opening handles & correllation with module -internal DASM_Handle dasm_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range, Architecture arch); +internal DASMI_Handle dasmi_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range, Architecture arch); //- rjf: asking for top-level info of a handle -internal DASM_BinaryInfo dasm_binary_info_from_handle(Arena *arena, DASM_Handle handle); +internal DASMI_BinaryInfo dasmi_binary_info_from_handle(Arena *arena, DASMI_Handle handle); //- rjf: asking for decoded instructions -internal DASM_InstArray dasm_inst_array_from_handle(Arena *arena, DASM_Handle handle, U64 endt_us); +internal DASMI_InstArray dasmi_inst_array_from_handle(Arena *arena, DASMI_Handle handle, U64 endt_us); //////////////////////////////// //~ rjf: Decode Threads -internal B32 dasm_u2d_enqueue_request(DASM_DecodeRequest *req, U64 endt_us); -internal DASM_DecodeRequest dasm_u2d_dequeue_request(void); +internal B32 dasmi_u2d_enqueue_request(DASMI_DecodeRequest *req, U64 endt_us); +internal DASMI_DecodeRequest dasmi_u2d_dequeue_request(void); -internal void dasm_decode_thread_entry_point(void *p); +internal void dasmi_decode_thread_entry_point(void *p); #endif //DASM_H diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c new file mode 100644 index 00000000..e69de29b diff --git a/src/dasm_cache/dasm_cache.h b/src/dasm_cache/dasm_cache.h new file mode 100644 index 00000000..c01bb535 --- /dev/null +++ b/src/dasm_cache/dasm_cache.h @@ -0,0 +1,7 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DASM_CACHE_H +#define DASM_CACHE_H + +#endif // DASM_CACHE_H diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index f2c84a51..8c707722 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1400,11 +1400,11 @@ df_txti_handle_from_entity(DF_Entity *entity) //- rjf: entity -> disasm info -internal DASM_Handle +internal DASMI_Handle df_dasm_handle_from_process_vaddr(DF_Entity *process, U64 vaddr) { Rng1U64 disasm_vaddr_rng = r1u64(AlignDownPow2(vaddr, KB(4)), AlignDownPow2(vaddr, KB(4)) + KB(16)); - DASM_Handle dasm_handle = dasm_handle_from_ctrl_process_range_arch(process->ctrl_machine_id, process->ctrl_handle, disasm_vaddr_rng, process->arch); + DASMI_Handle dasm_handle = dasmi_handle_from_ctrl_process_range_arch(process->ctrl_machine_id, process->ctrl_handle, disasm_vaddr_rng, process->arch); return dasm_handle; } diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index d73f5414..42adbd22 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1404,7 +1404,7 @@ internal DF_EntityFuzzyItemArray df_entity_fuzzy_item_array_from_entity_array_ne internal TXTI_Handle df_txti_handle_from_entity(DF_Entity *entity); //- rjf: entity -> disasm info -internal DASM_Handle df_dasm_handle_from_process_vaddr(DF_Entity *process, U64 vaddr); +internal DASMI_Handle df_dasm_handle_from_process_vaddr(DF_Entity *process, U64 vaddr); //- rjf: full path building, from file/folder entities internal String8 df_full_path_from_entity(Arena *arena, DF_Entity *entity); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 459b55a8..c359b090 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -10926,7 +10926,7 @@ df_do_txti_controls(TXTI_Handle handle, U64 line_count_per_page, TxtPt *cursor, } internal B32 -df_do_dasm_controls(DASM_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column) +df_do_dasm_controls(DASMI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column) { Temp scratch = scratch_begin(0, 0); B32 change = 0; diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index d6250984..2ffecb41 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -1048,7 +1048,7 @@ internal DF_CodeSliceSignal df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, internal B32 df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); internal B32 df_do_txti_controls(TXTI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); -internal B32 df_do_dasm_controls(DASM_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); +internal B32 df_do_dasm_controls(DASMI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); //////////////////////////////// //~ rjf: UI Widgets: Fancy Labels diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index d543c9ec..9b835fbf 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -6008,12 +6008,12 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) }break; case DF_CoreCmdKind_ToggleBreakpointAtCursor: { - DASM_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASM_BinaryInfo dasm_info = dasm_binary_info_from_handle(scratch.arena, dasm_handle); - DASM_InstArray insts = dasm_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); + DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); + DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); + DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); if(insts.count != 0) { - U64 off = dasm_inst_array_off_from_idx(&insts, dv->cursor.line-1); + U64 off = dasmi_inst_array_off_from_idx(&insts, dv->cursor.line-1); U64 vaddr = dasm_info.vaddr_range.min+off; DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.vaddr = vaddr; @@ -6024,12 +6024,12 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) }break; case DF_CoreCmdKind_ToggleWatchPinAtCursor: { - DASM_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASM_BinaryInfo dasm_info = dasm_binary_info_from_handle(scratch.arena, dasm_handle); - DASM_InstArray insts = dasm_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); + DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); + DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); + DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); if(insts.count != 0) { - U64 off = dasm_inst_array_off_from_idx(&insts, dv->cursor.line-1); + U64 off = dasmi_inst_array_off_from_idx(&insts, dv->cursor.line-1); U64 vaddr = dasm_info.vaddr_range.min+off; DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); p.vaddr = vaddr; @@ -6041,12 +6041,12 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) }break; case DF_CoreCmdKind_RunToCursor: { - DASM_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASM_BinaryInfo dasm_info = dasm_binary_info_from_handle(scratch.arena, dasm_handle); - DASM_InstArray insts = dasm_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); + DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); + DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); + DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); if(insts.count != 0) { - U64 off = dasm_inst_array_off_from_idx(&insts, dv->cursor.line-1); + U64 off = dasmi_inst_array_off_from_idx(&insts, dv->cursor.line-1); U64 vaddr = dasm_info.vaddr_range.min+off; DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.vaddr = vaddr; @@ -6056,14 +6056,14 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) }break; case DF_CoreCmdKind_SetNextStatement: { - DASM_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASM_BinaryInfo dasm_info = dasm_binary_info_from_handle(scratch.arena, dasm_handle); - DASM_InstArray insts = dasm_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); + DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); + DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); + DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); DF_Entity *thread = df_entity_from_handle(params.entity); S64 line_num = (cmd->params.text_point.line == 0 ? dv->cursor.line : cmd->params.text_point.line); if(insts.count != 0) { - U64 off = dasm_inst_array_off_from_idx(&insts, line_num-1); + U64 off = dasmi_inst_array_off_from_idx(&insts, line_num-1); U64 vaddr = dasm_info.vaddr_range.min+off; DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.vaddr = vaddr; @@ -6175,12 +6175,12 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: unpack entity info // DF_Entity *process = df_entity_from_handle(dv->process); - DASM_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASM_BinaryInfo dasm_info = dasm_binary_info_from_handle(scratch.arena, dasm_handle); + DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); + DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); Rng1U64 disasm_vaddr_rng = dasm_info.vaddr_range; DF_Entity *module = df_module_from_process_vaddr(process, disasm_vaddr_rng.min); DF_Entity *binary = df_binary_file_from_module(module); - DASM_InstArray insts = dasm_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); + DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); B32 has_disasm = (insts.count != 0); B32 is_loading = (!has_disasm && !df_entity_is_nil(process) && dim_1u64(disasm_vaddr_rng) != 0 && !df_ctrl_targets_running()); @@ -6270,7 +6270,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) { U64 idx = line_num-visible_line_num_range.min; - DASM_Inst *inst = &insts.v[visible_line_num_range.min+idx-1]; + DASMI_Inst *inst = &insts.v[visible_line_num_range.min+idx-1]; String8 symbol_name = {0}; if(inst->addr != 0) { @@ -6312,7 +6312,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(contains_1u64(disasm_vaddr_rng, rip_vaddr)) { U64 rip_off = rip_vaddr - disasm_vaddr_rng.min; - S64 line_num = dasm_inst_array_idx_from_off__linear_scan(&insts, rip_off)+1; + S64 line_num = dasmi_inst_array_idx_from_off__linear_scan(&insts, rip_off)+1; if(contains_1s64(visible_line_num_range, line_num)) { U64 slice_line_idx = (line_num-visible_line_num_range.min); @@ -6332,7 +6332,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(bp->flags & DF_EntityFlag_HasVAddr && contains_1u64(disasm_vaddr_rng, bp->vaddr)) { U64 off = bp->vaddr-disasm_vaddr_rng.min; - U64 idx = dasm_inst_array_idx_from_off__linear_scan(&insts, off); + U64 idx = dasmi_inst_array_idx_from_off__linear_scan(&insts, off); S64 line_num = (S64)(idx+1); if(contains_1s64(visible_line_num_range, line_num)) { @@ -6353,7 +6353,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(pin->flags & DF_EntityFlag_HasVAddr && contains_1u64(disasm_vaddr_rng, pin->vaddr)) { U64 off = pin->vaddr-disasm_vaddr_rng.min; - U64 idx = dasm_inst_array_idx_from_off__linear_scan(&insts, off); + U64 idx = dasmi_inst_array_idx_from_off__linear_scan(&insts, off); S64 line_num = (S64)(idx+1); if(contains_1s64(visible_line_num_range, line_num)) { @@ -6370,7 +6370,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) DF_Entity *binary = df_binary_file_from_module(module); for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) { - U64 vaddr = disasm_vaddr_rng.min + dasm_inst_array_off_from_idx(&insts, line_num-1); + U64 vaddr = disasm_vaddr_rng.min + dasmi_inst_array_off_from_idx(&insts, line_num-1); U64 voff = df_voff_from_vaddr(module, vaddr); U64 slice_idx = line_num-visible_line_num_range.min; DF_TextLineDasm2SrcInfoNode *dasm2src_n = push_array(scratch.arena, DF_TextLineDasm2SrcInfoNode, 1); @@ -6397,7 +6397,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) { U64 vaddr = dv->goto_vaddr; dv->goto_vaddr = 0; - U64 line_idx = dasm_inst_array_idx_from_off__linear_scan(&insts, vaddr-disasm_vaddr_rng.min); + U64 line_idx = dasmi_inst_array_idx_from_off__linear_scan(&insts, vaddr-disasm_vaddr_rng.min); S64 line_num = (S64)(line_idx+1); dv->cursor = dv->mark = txt_pt(line_num, 1); dv->center_cursor = !dv->contain_cursor || (line_num < visible_line_num_range.min+8 || visible_line_num_range.max-8 < line_num); @@ -6446,7 +6446,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); if(eval.mode != EVAL_EvalMode_NULL) { - U64 off = dasm_inst_array_off_from_idx(&insts, sig.mouse_expr_rng.min.line-1); + U64 off = dasmi_inst_array_off_from_idx(&insts, sig.mouse_expr_rng.min.line-1); U64 vaddr = disasm_vaddr_rng.min+off; df_set_hover_eval(ws, sig.mouse_expr_baseline_pos, ctrl_ctx, process, sig.mouse_pt, vaddr, expr); } @@ -6470,7 +6470,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(sig.clicked_margin_line_num != 0) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.vaddr = disasm_vaddr_rng.min+dasm_inst_array_off_from_idx(&insts, sig.clicked_margin_line_num-1); + params.vaddr = disasm_vaddr_rng.min+dasmi_inst_array_off_from_idx(&insts, sig.clicked_margin_line_num-1); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddressBreakpoint)); } @@ -6478,7 +6478,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: dropped entity onto line? -> do drop if(sig.dropped_entity_line_num != 0 && !df_entity_is_nil(sig.dropped_entity)) { - U64 drop_vaddr = disasm_vaddr_rng.min+dasm_inst_array_off_from_idx(&insts, sig.dropped_entity_line_num-1); + U64 drop_vaddr = disasm_vaddr_rng.min+dasmi_inst_array_off_from_idx(&insts, sig.dropped_entity_line_num-1); DF_Entity *dropped_entity = sig.dropped_entity; switch(dropped_entity->kind) { @@ -6541,7 +6541,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(sig.run_to_line_num != 0 && contains_1s64(visible_line_num_range, sig.run_to_line_num)) { DF_CmdParams params = df_cmd_params_from_window(ws); - params.vaddr = disasm_vaddr_rng.min+dasm_inst_array_off_from_idx(&insts, sig.run_to_line_num-1); + params.vaddr = disasm_vaddr_rng.min+dasmi_inst_array_off_from_idx(&insts, sig.run_to_line_num-1); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToAddress)); } @@ -6549,7 +6549,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: go to source if(sig.goto_src_line_num != 0 && contains_1s64(visible_line_num_range, sig.goto_src_line_num)) { - U64 vaddr = disasm_vaddr_rng.min+dasm_inst_array_off_from_idx(&insts, sig.goto_src_line_num-1); + U64 vaddr = disasm_vaddr_rng.min+dasmi_inst_array_off_from_idx(&insts, sig.goto_src_line_num-1); DF_Entity *module = df_module_from_process_vaddr(process, vaddr); DF_Entity *binary = df_binary_file_from_module(module); U64 voff = df_voff_from_vaddr(module, vaddr); From c91cd6953625d244e7c201221b8f89031aa8e842 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 10:57:34 -0700 Subject: [PATCH 244/275] first pass at new hash-store-based disassembly cache layer; can serve as a general-purpose asynchronous disassembly visualization cache layer, regardless of where that data ultimately comes from - can click into a file, process memory cache, etc. --- src/base/base_entry_point.c | 3 + src/dasm/dasm.c | 2 + src/dasm_cache/dasm_cache.c | 530 ++++++++++++++++++++++++++++++++++ src/dasm_cache/dasm_cache.h | 206 +++++++++++++ src/raddbg/raddbg_main.cpp | 2 + src/task_system/task_system.c | 2 +- src/text_cache/text_cache.c | 6 +- src/text_cache/text_cache.h | 10 +- 8 files changed, 756 insertions(+), 5 deletions(-) diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index 7fa1b0f0..d8f9edee 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -33,6 +33,9 @@ main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **argum #if defined(TEXT_CACHE_H) txt_init(); #endif +#if defined(DASM_CACHE_H) + dasm_init(); +#endif #if defined(DBGI_H) dbgi_init(); #endif diff --git a/src/dasm/dasm.c b/src/dasm/dasm.c index d995a1b0..c96a4322 100644 --- a/src/dasm/dasm.c +++ b/src/dasm/dasm.c @@ -110,6 +110,7 @@ dasmi_inst_array_off_from_idx(DASMI_InstArray *array, U64 idx) //////////////////////////////// //~ rjf: Disassembly Functions +#if 0 #include "third_party/udis86/config.h" #include "third_party/udis86/udis86.h" #include "third_party/udis86/libudis86/decode.c" @@ -118,6 +119,7 @@ dasmi_inst_array_off_from_idx(DASMI_InstArray *array, U64 idx) #include "third_party/udis86/libudis86/syn-intel.c" #include "third_party/udis86/libudis86/syn.c" #include "third_party/udis86/libudis86/udis86.c" +#endif internal DASMI_InstChunkList dasmi_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data) diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c index e69de29b..6aadffd7 100644 --- a/src/dasm_cache/dasm_cache.c +++ b/src/dasm_cache/dasm_cache.c @@ -0,0 +1,530 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Instruction Type Functions + +internal void +dasm_inst_chunk_list_push(Arena *arena, DASM_InstChunkList *list, U64 cap, DASM_Inst *inst) +{ + DASM_InstChunkNode *node = list->last; + if(node == 0 || node->count >= node->cap) + { + node = push_array(arena, DASM_InstChunkNode, 1); + node->v = push_array_no_zero(arena, DASM_Inst, cap); + node->cap = cap; + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + } + MemoryCopyStruct(&node->v[node->count], inst); + node->count += 1; + list->inst_count += 1; +} + +internal DASM_InstArray +dasm_inst_array_from_chunk_list(Arena *arena, DASM_InstChunkList *list) +{ + DASM_InstArray array = {0}; + array.count = list->inst_count; + array.v = push_array_no_zero(arena, DASM_Inst, array.count); + U64 idx = 0; + for(DASM_InstChunkNode *n = list->first; n != 0; n = n->next) + { + MemoryCopy(array.v+idx, n->v, sizeof(DASM_Inst)*n->count); + idx += n->count; + } + return array; +} + +internal U64 +dasm_inst_array_idx_from_code_off__linear_scan(DASM_InstArray *array, U64 off) +{ + U64 result = 0; + for(U64 idx = 0; idx < array->count; idx += 1) + { + if(array->v[idx].code_off == off) + { + result = idx; + break; + } + } + return result; +} + +internal U64 +dasm_inst_array_code_off_from_idx(DASM_InstArray *array, U64 idx) +{ + U64 off = 0; + if(idx < array->count) + { + off = array->v[idx].code_off; + } + return off; +} + +//////////////////////////////// +//~ rjf: Disassembly Decoding Function + +#include "third_party/udis86/config.h" +#include "third_party/udis86/udis86.h" +#include "third_party/udis86/libudis86/decode.c" +#include "third_party/udis86/libudis86/itab.c" +#include "third_party/udis86/libudis86/syn-att.c" +#include "third_party/udis86/libudis86/syn-intel.c" +#include "third_party/udis86/libudis86/syn.c" +#include "third_party/udis86/libudis86/udis86.c" + +internal DASM_Info +dasm_info_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: decode + DASM_InstChunkList inst_list = {0}; + String8List inst_strings = {0}; + switch(arch) + { + default:{}break; + + //- rjf: x86/x64 decoding + case Architecture_x64: + case Architecture_x86: + { + // rjf: grab context + struct ud udc; + ud_init(&udc); + ud_set_mode(&udc, bit_size_from_arch(arch)); + ud_set_pc(&udc, addr); + ud_set_input_buffer(&udc, data.str, data.size); + ud_set_vendor(&udc, UD_VENDOR_ANY); + ud_set_syntax(&udc, UD_SYN_INTEL); + + // rjf: disassemble + U64 byte_process_start_off = 0; + for(U64 off = 0; off < data.size;) + { + // rjf: disassemble one instruction + U64 size = ud_disassemble(&udc); + if(size == 0) + { + break; + } + + // rjf: analyze + struct ud_operand *first_op = (struct ud_operand *)ud_insn_opr(&udc, 0); + U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(&udc, first_op) : 0; + + // rjf: push + String8 string = push_str8f(scratch.arena, "%s\n", udc.asm_buf); + DASM_Inst inst = {off, rel_voff, r1u64(inst_strings.total_size, inst_strings.total_size+string.size-1)}; + dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); + str8_list_push(scratch.arena, &inst_strings, string); + + // rjf: increment + off += size; + if(bytes_processed_counter != 0 && (off-byte_process_start_off >= 1000)) + { + ins_atomic_u64_add_eval(bytes_processed_counter, (off-byte_process_start_off)); + byte_process_start_off = off; + } + } + }break; + } + + //- rjf: fill result + DASM_Info info = {0}; + info.text = str8_list_join(arena, &inst_strings, 0); + info.insts = dasm_inst_array_from_chunk_list(arena, &inst_list); + + scratch_end(scratch); + return info; +} + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +dasm_init(void) +{ + Arena *arena = arena_alloc(); + dasm_shared = push_array(arena, DASM_Shared, 1); + dasm_shared->arena = arena; + dasm_shared->slots_count = 1024; + dasm_shared->stripes_count = Min(dasm_shared->slots_count, os_logical_core_count()); + dasm_shared->slots = push_array(arena, DASM_Slot, dasm_shared->slots_count); + dasm_shared->stripes = push_array(arena, DASM_Stripe, dasm_shared->stripes_count); + for(U64 idx = 0; idx < dasm_shared->stripes_count; idx += 1) + { + dasm_shared->stripes[idx].arena = arena_alloc(); + dasm_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + dasm_shared->stripes[idx].cv = os_condition_variable_alloc(); + } + dasm_shared->u2p_ring_size = KB(64); + dasm_shared->u2p_ring_base = push_array_no_zero(arena, U8, dasm_shared->u2p_ring_size); + dasm_shared->u2p_ring_cv = os_condition_variable_alloc(); + dasm_shared->u2p_ring_mutex = os_mutex_alloc(); + dasm_shared->parse_thread_count = 1; + dasm_shared->parse_threads = push_array(arena, OS_Handle, dasm_shared->parse_thread_count); + for(U64 idx = 0; idx < dasm_shared->parse_thread_count; idx += 1) + { + dasm_shared->parse_threads[idx] = os_launch_thread(dasm_parse_thread__entry_point, (void *)idx, 0); + } + dasm_shared->evictor_thread = os_launch_thread(dasm_evictor_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: User Clock + +internal void +dasm_user_clock_tick(void) +{ + ins_atomic_u64_inc_eval(&dasm_shared->user_clock_idx); +} + +internal U64 +dasm_user_clock_idx(void) +{ + U64 idx = ins_atomic_u64_eval(&dasm_shared->user_clock_idx); + return idx; +} + +//////////////////////////////// +//~ rjf: Scoped Access + +internal DASM_Scope * +dasm_scope_open(void) +{ + if(dasm_tctx == 0) + { + Arena *arena = arena_alloc(); + dasm_tctx = push_array(arena, DASM_TCTX, 1); + dasm_tctx->arena = arena; + } + DASM_Scope *scope = dasm_tctx->free_scope; + if(scope != 0) + { + SLLStackPop(dasm_tctx->free_scope); + } + else + { + scope = push_array_no_zero(dasm_tctx->arena, DASM_Scope, 1); + } + MemoryZeroStruct(scope); + return scope; +} + +internal void +dasm_scope_close(DASM_Scope *scope) +{ + for(DASM_Touch *t = scope->top_touch, *next = 0; t != 0; t = next) + { + next = t->next; + U64 slot_idx = t->hash.u64[1]%dasm_shared->slots_count; + U64 stripe_idx = slot_idx%dasm_shared->stripes_count; + DASM_Slot *slot = &dasm_shared->slots[slot_idx]; + DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(t->hash, n->hash) && t->addr == n->addr && t->arch == n->arch) + { + ins_atomic_u64_dec_eval(&n->scope_ref_count); + break; + } + } + } + SLLStackPush(dasm_tctx->free_touch, t); + } + SLLStackPush(dasm_tctx->free_scope, scope); +} + +internal void +dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_Node *node) +{ + DASM_Touch *touch = dasm_tctx->free_touch; + ins_atomic_u64_inc_eval(&node->scope_ref_count); + ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); + ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, dasm_user_clock_idx()); + if(touch != 0) + { + SLLStackPop(dasm_tctx->free_touch); + } + else + { + touch = push_array_no_zero(dasm_tctx->arena, DASM_Touch, 1); + } + MemoryZeroStruct(touch); + touch->hash = node->hash; + touch->addr = node->addr; + touch->arch = node->arch; + SLLStackPush(scope->top_touch, touch); +} + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal DASM_Info +dasm_info_from_hash_addr_arch(DASM_Scope *scope, U128 hash, U64 addr, Architecture arch) +{ + DASM_Info info = {0}; + if(!u128_match(hash, u128_zero())) + { + U64 slot_idx = hash.u64[1]%dasm_shared->slots_count; + U64 stripe_idx = slot_idx%dasm_shared->stripes_count; + DASM_Slot *slot = &dasm_shared->slots[slot_idx]; + DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; + B32 found = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && addr == n->addr && arch == n->arch) + { + MemoryCopyStruct(&info, &n->info); + found = 1; + dasm_scope_touch_node__stripe_r_guarded(scope, n); + break; + } + } + } + B32 node_is_new = 0; + if(!found) + { + OS_MutexScopeW(stripe->rw_mutex) + { + DASM_Node *node = 0; + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && addr == n->addr && arch == n->arch) + { + node = n; + break; + } + } + if(node == 0) + { + node = stripe->free_node; + if(node) + { + SLLStackPop(stripe->free_node); + } + else + { + node = push_array_no_zero(stripe->arena, DASM_Node, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->hash = hash; + node->addr = addr; + node->arch = arch; + node_is_new = 1; + } + } + } + if(node_is_new) + { + dasm_u2p_enqueue_req(hash, addr, arch, max_U64); + } + } + return info; +} + +internal DASM_Info +dasm_info_from_key_addr_arch(DASM_Scope *scope, U128 key, U64 addr, Architecture arch, U128 *hash_out) +{ + DASM_Info result = {0}; + for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) + { + U128 hash = hs_hash_from_key(key, rewind_idx); + result = dasm_info_from_hash_addr_arch(scope, hash, addr, arch); + if(result.insts.count != 0) + { + if(hash_out) + { + *hash_out = hash; + } + break; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Parse Threads + +internal B32 +dasm_u2p_enqueue_req(U128 hash, U64 addr, Architecture arch, U64 endt_us) +{ + B32 good = 0; + OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) + { + U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos; + U64 available_size = dasm_shared->u2p_ring_size - unconsumed_size; + if(available_size >= sizeof(hash)+sizeof(addr)+sizeof(arch)) + { + good = 1; + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &hash); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &addr); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &arch); + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(dasm_shared->u2p_ring_cv, dasm_shared->u2p_ring_mutex, endt_us); + } + if(good) + { + os_condition_variable_broadcast(dasm_shared->u2p_ring_cv); + } + return good; +} + +internal void +dasm_u2p_dequeue_req(U128 *hash_out, U64 *addr_out, Architecture *arch_out) +{ + OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) + { + U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos; + if(unconsumed_size >= sizeof(*hash_out)+sizeof(*addr_out)+sizeof(*arch_out)) + { + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, hash_out); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, addr_out); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, arch_out); + break; + } + os_condition_variable_wait(dasm_shared->u2p_ring_cv, dasm_shared->u2p_ring_mutex, max_U64); + } + os_condition_variable_broadcast(dasm_shared->u2p_ring_mutex); +} + +internal void +dasm_parse_thread__entry_point(void *p) +{ + ThreadNameF("[dasm] parse thread #%I64u", (U64)p); + for(;;) + { + //- rjf: get next request + U128 hash = {0}; + U64 addr = 0; + Architecture arch = Architecture_Null; + dasm_u2p_dequeue_req(&hash, &addr, &arch); + HS_Scope *hs_scope = hs_scope_open(); + + //- rjf: unpack hash + U64 slot_idx = hash.u64[1]%dasm_shared->slots_count; + U64 stripe_idx = slot_idx%dasm_shared->stripes_count; + DASM_Slot *slot = &dasm_shared->slots[slot_idx]; + DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; + + //- rjf: take task + B32 got_task = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && n->addr == addr && n->arch == arch) + { + got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); + break; + } + } + } + + //- rjf: hash -> data + String8 data = {0}; + if(got_task) + { + data = hs_data_from_hash(hs_scope, hash); + } + + //- rjf: data -> disassembly info + Arena *info_arena = 0; + DASM_Info info = {0}; + if(got_task && data.size != 0) + { + info_arena = arena_alloc(); + info = dasm_info_from_arch_addr_data(info_arena, 0, arch, addr, data); + } + + //- rjf: commit results to cache + if(got_task) OS_MutexScopeW(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && n->addr == addr && n->arch == arch) + { + n->info_arena = info_arena; + MemoryCopyStruct(&n->info, &info); + ins_atomic_u32_eval_assign(&n->is_working, 0); + ins_atomic_u64_inc_eval(&n->load_count); + break; + } + } + } + + hs_scope_close(hs_scope); + } +} + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void +dasm_evictor_thread__entry_point(void *p) +{ + ThreadNameF("[dasm] evictor thread"); + for(;;) + { + U64 check_time_us = os_now_microseconds(); + U64 check_time_user_clocks = dasm_user_clock_idx(); + U64 evict_threshold_us = 10*1000000; + U64 evict_threshold_user_clocks = 10; + for(U64 slot_idx = 0; slot_idx < dasm_shared->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%dasm_shared->stripes_count; + DASM_Slot *slot = &dasm_shared->slots[slot_idx]; + DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; + B32 slot_has_work = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + slot_has_work = 1; + break; + } + } + } + if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + DLLRemove(slot->first, slot->last, n); + if(n->info_arena != 0) + { + arena_release(n->info_arena); + } + SLLStackPush(stripe->free_node, n); + } + } + } + os_sleep_milliseconds(5); + } + os_sleep_milliseconds(1000); + } +} diff --git a/src/dasm_cache/dasm_cache.h b/src/dasm_cache/dasm_cache.h index c01bb535..77657c25 100644 --- a/src/dasm_cache/dasm_cache.h +++ b/src/dasm_cache/dasm_cache.h @@ -4,4 +4,210 @@ #ifndef DASM_CACHE_H #define DASM_CACHE_H +//////////////////////////////// +//~ rjf: Instruction Types + +typedef struct DASM_Inst DASM_Inst; +struct DASM_Inst +{ + U64 code_off; + U64 addr; + Rng1U64 text_range; +}; + +typedef struct DASM_InstChunkNode DASM_InstChunkNode; +struct DASM_InstChunkNode +{ + DASM_InstChunkNode *next; + DASM_Inst *v; + U64 cap; + U64 count; +}; + +typedef struct DASM_InstChunkList DASM_InstChunkList; +struct DASM_InstChunkList +{ + DASM_InstChunkNode *first; + DASM_InstChunkNode *last; + U64 node_count; + U64 inst_count; +}; + +typedef struct DASM_InstArray DASM_InstArray; +struct DASM_InstArray +{ + DASM_Inst *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Value Bundle Type + +typedef struct DASM_Info DASM_Info; +struct DASM_Info +{ + String8 text; + DASM_InstArray insts; +}; + +//////////////////////////////// +//~ rjf: Cache Types + +typedef struct DASM_Node DASM_Node; +struct DASM_Node +{ + // rjf: links + DASM_Node *next; + DASM_Node *prev; + + // rjf: key + U128 hash; + U64 addr; + Architecture arch; + + // rjf: value + Arena *info_arena; + DASM_Info info; + + // rjf: metadata + B32 is_working; + U64 scope_ref_count; + U64 last_time_touched_us; + U64 last_user_clock_idx_touched; + U64 load_count; +}; + +typedef struct DASM_Slot DASM_Slot; +struct DASM_Slot +{ + DASM_Node *first; + DASM_Node *last; +}; + +typedef struct DASM_Stripe DASM_Stripe; +struct DASM_Stripe +{ + Arena *arena; + OS_Handle rw_mutex; + OS_Handle cv; + DASM_Node *free_node; +}; + +//////////////////////////////// +//~ rjf: Scoped Access Types + +typedef struct DASM_Touch DASM_Touch; +struct DASM_Touch +{ + DASM_Touch *next; + U128 hash; + U64 addr; + Architecture arch; +}; + +typedef struct DASM_Scope DASM_Scope; +struct DASM_Scope +{ + DASM_Scope *next; + DASM_Touch *top_touch; +}; + +//////////////////////////////// +//~ rjf: Thread Context + +typedef struct DASM_TCTX DASM_TCTX; +struct DASM_TCTX +{ + Arena *arena; + DASM_Scope *free_scope; + DASM_Touch *free_touch; +}; + +//////////////////////////////// +//~ rjf: Shared State + +typedef struct DASM_Shared DASM_Shared; +struct DASM_Shared +{ + Arena *arena; + + // rjf: user clock + U64 user_clock_idx; + + // rjf: cache + U64 slots_count; + U64 stripes_count; + DASM_Slot *slots; + DASM_Stripe *stripes; + + // rjf: user -> parse thread + U64 u2p_ring_size; + U8 *u2p_ring_base; + U64 u2p_ring_write_pos; + U64 u2p_ring_read_pos; + OS_Handle u2p_ring_cv; + OS_Handle u2p_ring_mutex; + + // rjf: parse threads + U64 parse_thread_count; + OS_Handle *parse_threads; + + // rjf: evictor thread + OS_Handle evictor_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static DASM_TCTX *dasm_tctx = 0; +global DASM_Shared *dasm_shared = 0; + +//////////////////////////////// +//~ rjf: Instruction Type Functions + +internal void dasm_inst_chunk_list_push(Arena *arena, DASM_InstChunkList *list, U64 cap, DASM_Inst *inst); +internal DASM_InstArray dasm_inst_array_from_chunk_list(Arena *arena, DASM_InstChunkList *list); +internal U64 dasm_inst_array_idx_from_code_off__linear_scan(DASM_InstArray *array, U64 off); +internal U64 dasm_inst_array_code_off_from_idx(DASM_InstArray *array, U64 idx); + +//////////////////////////////// +//~ rjf: Disassembly Decoding Function + +internal DASM_Info dasm_info_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data); + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void dasm_init(void); + +//////////////////////////////// +//~ rjf: User Clock + +internal void dasm_user_clock_tick(void); +internal U64 dasm_user_clock_idx(void); + +//////////////////////////////// +//~ rjf: Scoped Access + +internal DASM_Scope *dasm_scope_open(void); +internal void dasm_scope_close(DASM_Scope *scope); +internal void dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_Node *node); + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal DASM_Info dasm_info_from_hash_addr_arch(DASM_Scope *scope, U128 hash, U64 addr, Architecture arch); +internal DASM_Info dasm_info_from_key_addr_arch(DASM_Scope *scope, U128 key, U64 addr, Architecture arch, U128 *hash_out); +//////////////////////////////// +//~ rjf: Parse Threads + +internal B32 dasm_u2p_enqueue_req(U128 hash, U64 addr, Architecture arch, U64 endt_us); +internal void dasm_u2p_dequeue_req(U128 *hash_out, U64 *addr_out, Architecture *arch_out); +internal void dasm_parse_thread__entry_point(void *p); + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void dasm_evictor_thread__entry_point(void *p); + #endif // DASM_CACHE_H diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index cac25614..5006858b 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -29,6 +29,7 @@ #include "hash_store/hash_store.h" #include "file_stream/file_stream.h" #include "text_cache/text_cache.h" +#include "dasm_cache/dasm_cache.h" #include "path/path.h" #include "txti/txti.h" #include "coff/coff.h" @@ -67,6 +68,7 @@ #include "hash_store/hash_store.c" #include "file_stream/file_stream.c" #include "text_cache/text_cache.c" +#include "dasm_cache/dasm_cache.c" #include "path/path.c" #include "txti/txti.c" #include "coff/coff.c" diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c index 7cc6d1f6..98571094 100644 --- a/src/task_system/task_system.c +++ b/src/task_system/task_system.c @@ -181,7 +181,7 @@ internal void ts_task_thread__entry_point(void *p) { U64 thread_idx = (U64)p; - ThreadNameF("[ts] task thread #%I64u", thread_idx+1); + ThreadNameF("[ts] task thread #%I64u", thread_idx); TS_TaskThread *thread = &ts_shared->task_threads[thread_idx]; for(;;) { diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 6d06b1ea..cdfd0784 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -721,7 +721,7 @@ txt_scope_close(TXT_Scope *scope) { for(TXT_Node *n = slot->first; n != 0; n = n->next) { - if(u128_match(hash, n->hash)) + if(u128_match(hash, n->hash) && touch->lang == n->lang) { ins_atomic_u64_dec_eval(&n->scope_ref_count); break; @@ -750,6 +750,7 @@ txt_scope_touch_node__stripe_r_guarded(TXT_Scope *scope, TXT_Node *node) } MemoryZeroStruct(touch); touch->hash = node->hash; + touch->lang = node->lang; SLLStackPush(scope->top_touch, touch); } @@ -1193,12 +1194,11 @@ txt_parse_thread__entry_point(void *p) { for(;;) { - HS_Scope *scope = hs_scope_open(); - //- rjf: get next key U128 hash = {0}; TXT_LangKind lang = TXT_LangKind_Null; txt_u2p_dequeue_req(&hash, &lang); + HS_Scope *scope = hs_scope_open(); //- rjf: unpack hash U64 slot_idx = hash.u64[1]%txt_shared->slots_count; diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index a3390f06..20b5ec15 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -125,12 +125,19 @@ typedef TXT_TokenArray TXT_LangLexFunctionType(Arena *arena, U64 *bytes_processe typedef struct TXT_Node TXT_Node; struct TXT_Node { + // rjf: links TXT_Node *next; TXT_Node *prev; + + // rjf: key U128 hash; TXT_LangKind lang; + + // rjf: artifacts Arena *arena; TXT_TextInfo info; + + // rjf: metadata B32 is_working; U64 scope_ref_count; U64 last_time_touched_us; @@ -161,6 +168,7 @@ struct TXT_Touch { TXT_Touch *next; U128 hash; + TXT_LangKind lang; }; typedef struct TXT_Scope TXT_Scope; @@ -283,7 +291,7 @@ internal String8 txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 internal TXT_LineTokensSlice txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range); //////////////////////////////// -//~ rjf: Transfer Threads +//~ rjf: Parse Threads internal B32 txt_u2p_enqueue_req(U128 hash, TXT_LangKind lang, U64 endt_us); internal void txt_u2p_dequeue_req(U128 *hash_out, TXT_LangKind *lang_out); From d3570e8147d47e7874cecb3f32ad986d47c13a46 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 11:36:57 -0700 Subject: [PATCH 245/275] further progress on disassembly cache; instead of caching the text via the disassembly cache, simply submit into the hash store; this allows the disassembly cache to be composed with other caches, like the text analysis cache. + plug this system into the disassembly view rule, so now we can disassemble arbitrary pointers in the watch window --- src/dasm_cache/dasm_cache.c | 175 +++++++++++++++++--------------- src/dasm_cache/dasm_cache.h | 8 +- src/df/gfx/df_view_rule_hooks.c | 128 ++++++++++++++++++++++- src/df/gfx/df_view_rule_hooks.h | 8 ++ 4 files changed, 231 insertions(+), 88 deletions(-) diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c index 6aadffd7..caecb1b1 100644 --- a/src/dasm_cache/dasm_cache.c +++ b/src/dasm_cache/dasm_cache.c @@ -1,6 +1,18 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Third Party Includes + +#include "third_party/udis86/config.h" +#include "third_party/udis86/udis86.h" +#include "third_party/udis86/libudis86/decode.c" +#include "third_party/udis86/libudis86/itab.c" +#include "third_party/udis86/libudis86/syn-att.c" +#include "third_party/udis86/libudis86/syn-intel.c" +#include "third_party/udis86/libudis86/syn.c" +#include "third_party/udis86/libudis86/udis86.c" + //////////////////////////////// //~ rjf: Instruction Type Functions @@ -62,84 +74,6 @@ dasm_inst_array_code_off_from_idx(DASM_InstArray *array, U64 idx) return off; } -//////////////////////////////// -//~ rjf: Disassembly Decoding Function - -#include "third_party/udis86/config.h" -#include "third_party/udis86/udis86.h" -#include "third_party/udis86/libudis86/decode.c" -#include "third_party/udis86/libudis86/itab.c" -#include "third_party/udis86/libudis86/syn-att.c" -#include "third_party/udis86/libudis86/syn-intel.c" -#include "third_party/udis86/libudis86/syn.c" -#include "third_party/udis86/libudis86/udis86.c" - -internal DASM_Info -dasm_info_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: decode - DASM_InstChunkList inst_list = {0}; - String8List inst_strings = {0}; - switch(arch) - { - default:{}break; - - //- rjf: x86/x64 decoding - case Architecture_x64: - case Architecture_x86: - { - // rjf: grab context - struct ud udc; - ud_init(&udc); - ud_set_mode(&udc, bit_size_from_arch(arch)); - ud_set_pc(&udc, addr); - ud_set_input_buffer(&udc, data.str, data.size); - ud_set_vendor(&udc, UD_VENDOR_ANY); - ud_set_syntax(&udc, UD_SYN_INTEL); - - // rjf: disassemble - U64 byte_process_start_off = 0; - for(U64 off = 0; off < data.size;) - { - // rjf: disassemble one instruction - U64 size = ud_disassemble(&udc); - if(size == 0) - { - break; - } - - // rjf: analyze - struct ud_operand *first_op = (struct ud_operand *)ud_insn_opr(&udc, 0); - U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(&udc, first_op) : 0; - - // rjf: push - String8 string = push_str8f(scratch.arena, "%s\n", udc.asm_buf); - DASM_Inst inst = {off, rel_voff, r1u64(inst_strings.total_size, inst_strings.total_size+string.size-1)}; - dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, string); - - // rjf: increment - off += size; - if(bytes_processed_counter != 0 && (off-byte_process_start_off >= 1000)) - { - ins_atomic_u64_add_eval(bytes_processed_counter, (off-byte_process_start_off)); - byte_process_start_off = off; - } - } - }break; - } - - //- rjf: fill result - DASM_Info info = {0}; - info.text = str8_list_join(arena, &inst_strings, 0); - info.insts = dasm_inst_array_from_chunk_list(arena, &inst_list); - - scratch_end(scratch); - return info; -} - //////////////////////////////// //~ rjf: Main Layer Initialization @@ -406,6 +340,8 @@ dasm_parse_thread__entry_point(void *p) ThreadNameF("[dasm] parse thread #%I64u", (U64)p); for(;;) { + Temp scratch = scratch_begin(0, 0); + //- rjf: get next request U128 hash = {0}; U64 addr = 0; @@ -440,13 +376,89 @@ dasm_parse_thread__entry_point(void *p) data = hs_data_from_hash(hs_scope, hash); } - //- rjf: data -> disassembly info + //- rjf: data * arch * addr -> decode artifacts + DASM_InstChunkList inst_list = {0}; + String8List inst_strings = {0}; + if(got_task) + { + switch(arch) + { + default:{}break; + + //- rjf: x86/x64 decoding + case Architecture_x64: + case Architecture_x86: + { + // rjf: grab context + struct ud udc; + ud_init(&udc); + ud_set_mode(&udc, bit_size_from_arch(arch)); + ud_set_pc(&udc, addr); + ud_set_input_buffer(&udc, data.str, data.size); + ud_set_vendor(&udc, UD_VENDOR_ANY); + ud_set_syntax(&udc, UD_SYN_INTEL); + + // rjf: disassemble + U64 byte_process_start_off = 0; + for(U64 off = 0; off < data.size;) + { + // rjf: disassemble one instruction + U64 size = ud_disassemble(&udc); + if(size == 0) + { + break; + } + + // rjf: analyze + struct ud_operand *first_op = (struct ud_operand *)ud_insn_opr(&udc, 0); + U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(&udc, first_op) : 0; + + // rjf: push + String8 string = push_str8f(scratch.arena, "%s", udc.asm_buf); + DASM_Inst inst = {off, rel_voff, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + string.size)}; + dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); + str8_list_push(scratch.arena, &inst_strings, string); + + // rjf: increment + off += size; + } + }break; + } + } + + //- rjf: artifacts -> value bundle Arena *info_arena = 0; DASM_Info info = {0}; - if(got_task && data.size != 0) + if(got_task) { + //- rjf: produce joined text + Arena *text_arena = arena_alloc(); + StringJoin text_join = {0}; + text_join.sep = str8_lit("\n"); + String8 text = str8_list_join(text_arena, &inst_strings, &text_join); + + //- rjf: produce unique key for this disassembly's text + U128 text_key = {0}; + { + U64 hash_data[] = + { + hash.u64[0], + hash.u64[1], + addr, + (U64)arch, + 0x4d534144, + }; + text_key = hs_hash_from_data(str8((U8 *)hash_data, sizeof(hash_data))); + } + + //- rjf: submit text data to hash store + U128 text_hash = hs_submit_data(text_key, &text_arena, text); + + //- rjf: produce value bundle info_arena = arena_alloc(); - info = dasm_info_from_arch_addr_data(info_arena, 0, arch, addr, data); + info.text_key = text_key; + info.insts = dasm_inst_array_from_chunk_list(info_arena, &inst_list); } //- rjf: commit results to cache @@ -466,6 +478,7 @@ dasm_parse_thread__entry_point(void *p) } hs_scope_close(hs_scope); + scratch_end(scratch); } } diff --git a/src/dasm_cache/dasm_cache.h b/src/dasm_cache/dasm_cache.h index 77657c25..beb71088 100644 --- a/src/dasm_cache/dasm_cache.h +++ b/src/dasm_cache/dasm_cache.h @@ -46,7 +46,7 @@ struct DASM_InstArray typedef struct DASM_Info DASM_Info; struct DASM_Info { - String8 text; + U128 text_key; DASM_InstArray insts; }; @@ -170,11 +170,6 @@ internal DASM_InstArray dasm_inst_array_from_chunk_list(Arena *arena, DASM_InstC internal U64 dasm_inst_array_idx_from_code_off__linear_scan(DASM_InstArray *array, U64 off); internal U64 dasm_inst_array_code_off_from_idx(DASM_InstArray *array, U64 idx); -//////////////////////////////// -//~ rjf: Disassembly Decoding Function - -internal DASM_Info dasm_info_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data); - //////////////////////////////// //~ rjf: Main Layer Initialization @@ -198,6 +193,7 @@ internal void dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_No internal DASM_Info dasm_info_from_hash_addr_arch(DASM_Scope *scope, U128 hash, U64 addr, Architecture arch); internal DASM_Info dasm_info_from_key_addr_arch(DASM_Scope *scope, U128 key, U64 addr, Architecture arch, U128 *hash_out); + //////////////////////////////// //~ rjf: Parse Threads diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 1e443aa9..079517bd 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -314,6 +314,36 @@ df_view_rule_hooks__txt_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ct return result; } +internal DF_DisasmTopologyInfo +df_view_rule_hooks__disasm_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) +{ + Temp scratch = scratch_begin(0, 0); + DF_DisasmTopologyInfo result = zero_struct; + { + StringJoin join = {0}; + join.sep = str8_lit(" "); + DF_CfgNode *size_cfg = df_cfg_node_child_from_string(cfg, str8_lit("size"), 0); + DF_CfgNode *arch_cfg = df_cfg_node_child_from_string(cfg, str8_lit("arch"), 0); + String8List size_expr_strs = {0}; + String8 arch_string = {0}; + for(DF_CfgNode *child = size_cfg->first; child != &df_g_nil_cfg_node; child = child->next) + { + str8_list_push(scratch.arena, &size_expr_strs, child->string); + } + arch_string = arch_cfg->first->string; + String8 size_expr = str8_list_join(scratch.arena, &size_expr_strs, &join); + DF_Eval size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, size_expr); + DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, size_eval); + if(str8_match(arch_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) + { + result.arch = Architecture_x64; + } + result.size_cap = size_val_eval.imm_u64; + } + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: "array" @@ -736,6 +766,17 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) //////////////////////////////// //~ rjf: "disasm" +typedef struct DF_ViewRuleHooks_DisasmState DF_ViewRuleHooks_DisasmState; +struct DF_ViewRuleHooks_DisasmState +{ + B32 initialized; + TxtPt cursor; + TxtPt mark; + S64 preferred_column; + U64 last_open_frame_idx; + F32 loaded_t; +}; + DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm) { DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); @@ -748,7 +789,92 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm) DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm) { - + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + DASM_Scope *dasm_scope = dasm_scope_open(); + DF_ViewRuleHooks_DisasmState *state = df_view_rule_block_user_state(key, DF_ViewRuleHooks_DisasmState); + if(!state->initialized) + { + state->initialized = 1; + state->cursor = state->mark = txt_pt(1, 1); + } + if(state->last_open_frame_idx+1 < df_frame_index()) + { + state->loaded_t = 0; + } + state->last_open_frame_idx = df_frame_index(); + { + //- rjf: unpack params + DF_DisasmTopologyInfo top = df_view_rule_hooks__disasm_topology_info_from_cfg(dbgi_scope, ctrl_ctx, parse_ctx, macro_map, cfg); + + //- rjf: resolve to address value & range + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); + U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; + Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); + + //- rjf: unpack thread/process of eval + DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); + + //- rjf: unpack key for this region in memory + U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); + + //- rjf: key -> parsed text info + U128 data_hash = {0}; + DASM_Info dasm_info = dasm_info_from_key_addr_arch(dasm_scope, dasm_key, vaddr_range.min, top.arch, &data_hash); + String8 dasm_text_data = {0}; + TXT_TextInfo dasm_text_info = {0}; + for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) + { + U128 dasm_text_hash = hs_hash_from_key(dasm_info.text_key, rewind_idx); + dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); + dasm_text_info = txt_text_info_from_hash_lang(txt_scope, dasm_text_hash, TXT_LangKind_Null); + if(dasm_text_info.lines_count != 0) + { + break; + } + } + TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, &dasm_text_info, dasm_text_data, r1s64(1, dasm_info.insts.count)); + + //- rjf: info -> code slice info + DF_CodeSliceParams code_slice_params = {0}; + { + code_slice_params.flags = DF_CodeSliceFlag_LineNums; + code_slice_params.line_num_range = r1s64(1, dasm_text_info.lines_count); + code_slice_params.line_text = push_array(scratch.arena, String8, dasm_text_info.lines_count); + code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, dasm_text_info.lines_count); + code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, dasm_text_info.lines_count); + code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, dasm_text_info.lines_count); + code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, dasm_text_info.lines_count); + code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, dasm_text_info.lines_count); + code_slice_params.line_dasm2src = push_array(scratch.arena, DF_TextLineDasm2SrcInfoList, dasm_text_info.lines_count); + code_slice_params.line_src2dasm = push_array(scratch.arena, DF_TextLineSrc2DasmInfoList, dasm_text_info.lines_count); + for(U64 line_idx = 0; line_idx < dasm_text_info.lines_count; line_idx += 1) + { + code_slice_params.line_text[line_idx] = str8_substr(dasm_text_data, dasm_info.insts.v[line_idx].text_range); + code_slice_params.line_ranges[line_idx] = dasm_info.insts.v[line_idx].text_range; + code_slice_params.line_tokens[line_idx] = line_tokens_slice.line_tokens[line_idx]; + } + code_slice_params.font = df_font_from_slot(DF_FontSlot_Code); + code_slice_params.font_size = ui_top_font_size(); + code_slice_params.line_height_px = ui_top_font_size()*1.5f; + code_slice_params.margin_width_px = 0; + code_slice_params.line_num_width_px = ui_top_font_size()*5.f; + code_slice_params.line_text_max_width_px = ui_top_font_size()*2.f*dasm_text_info.lines_max_size; + } + + //- rjf: build code slice + if(dasm_info.insts.count != 0 && dasm_text_info.lines_count != 0) + UI_Padding(ui_pct(1, 0)) UI_PrefWidth(ui_px(dasm_text_info.lines_max_size*ui_top_font_size()*1.2f, 1.f)) UI_Column UI_Padding(ui_pct(1, 0)) + { + DF_CodeSliceSignal sig = df_code_slice(ws, ctrl_ctx, parse_ctx, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###code_slice")); + } + } + dasm_scope_close(dasm_scope); + txt_scope_close(txt_scope); + hs_scope_close(hs_scope); + scratch_end(scratch); } //////////////////////////////// diff --git a/src/df/gfx/df_view_rule_hooks.h b/src/df/gfx/df_view_rule_hooks.h index c57d9ca4..4ac8729e 100644 --- a/src/df/gfx/df_view_rule_hooks.h +++ b/src/df/gfx/df_view_rule_hooks.h @@ -29,6 +29,13 @@ struct DF_TxtTopologyInfo U64 size_cap; }; +typedef struct DF_DisasmTopologyInfo DF_DisasmTopologyInfo; +struct DF_DisasmTopologyInfo +{ + Architecture arch; + U64 size_cap; +}; + //////////////////////////////// //~ rjf: Helpers @@ -37,5 +44,6 @@ internal void df_view_rule_hooks__eval_commit_rgba(DF_Eval eval, TG_Graph *graph internal DF_BitmapTopologyInfo df_view_rule_hooks__bitmap_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); internal DF_GeoTopologyInfo df_view_rule_hooks__geo_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); internal DF_TxtTopologyInfo df_view_rule_hooks__txt_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); +internal DF_DisasmTopologyInfo df_view_rule_hooks__disasm_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); #endif //DF_VIEW_RULE_HOOKS_H From bcbb4142cf48eef511399d60e333058c34e94a21 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 12:01:14 -0700 Subject: [PATCH 246/275] plug in x64 intel-syntax disassembly 'language' into text analysis cache layer, to use that layer to naturally do parser/highlighter work for disassembly --- src/df/gfx/df_view_rule_hooks.c | 2 +- src/text_cache/text_cache.c | 179 +++++++++++++++++++++++++++++++- src/text_cache/text_cache.h | 2 + 3 files changed, 179 insertions(+), 4 deletions(-) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 079517bd..f97a1ec7 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -829,7 +829,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm) { U128 dasm_text_hash = hs_hash_from_key(dasm_info.text_key, rewind_idx); dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); - dasm_text_info = txt_text_info_from_hash_lang(txt_scope, dasm_text_hash, TXT_LangKind_Null); + dasm_text_info = txt_text_info_from_hash_lang(txt_scope, dasm_text_hash, TXT_LangKind_DisasmX64Intel); if(dasm_text_info.lines_count != 0) { break; diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index cdfd0784..cca92ef5 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -40,9 +40,10 @@ txt_lex_function_from_lang_kind(TXT_LangKind kind) switch(kind) { default:{}break; - case TXT_LangKind_C: {fn = txt_token_array_from_string__c_cpp;}break; - case TXT_LangKind_CPlusPlus: {fn = txt_token_array_from_string__c_cpp;}break; - case TXT_LangKind_Odin: {fn = txt_token_array_from_string__odin;}break; + case TXT_LangKind_C: {fn = txt_token_array_from_string__c_cpp;}break; + case TXT_LangKind_CPlusPlus: {fn = txt_token_array_from_string__c_cpp;}break; + case TXT_LangKind_Odin: {fn = txt_token_array_from_string__odin;}break; + case TXT_LangKind_DisasmX64Intel:{fn = txt_token_array_from_string__disasm_x64_intel;}break; } return fn; } @@ -624,6 +625,178 @@ txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, St return result; } +internal TXT_TokenArray +txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: parse tokens + TXT_TokenChunkList tokens = {0}; + { + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; + U64 active_token_start_off = 0; + U64 off = 0; + B32 escaped = 0; + B32 string_is_char = 0; + for(U64 advance = 0; off <= string.size; off += advance) + { + U8 byte = (off+0 < string.size) ? string.str[off+0] : 0; + U8 next_byte = (off+1 < string.size) ? string.str[off+1] : 0; + B32 ender_found = 0; + advance = (active_token_kind != TXT_TokenKind_Null ? 1 : 0); + if(off == string.size && active_token_kind != TXT_TokenKind_Null) + { + ender_found = 1; + advance = 1; + } + switch(active_token_kind) + { + default: + case TXT_TokenKind_Null: + { + if(byte == ' ' || byte == '\t' || byte == '\v' || byte == '\f' || byte == '\r' || byte == '\n') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Whitespace; + advance = 1; + } + else if(('a' <= byte && byte <= 'z') || ('A' <= byte && byte <= 'Z') || byte == '_') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Identifier; + advance = 1; + } + else if(byte == '\'') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_String; + advance = 1; + string_is_char = 1; + } + else if(byte == '"') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_String; + advance = 1; + string_is_char = 0; + } + else if(('0' <= byte && byte <= '9') || (byte == '.' && '0' <= next_byte && next_byte <= '9')) + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Numeric; + advance = 1; + } + else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' || + byte == '&' || byte == '*' || byte == '(' || byte == ')' || + byte == '-' || byte == '=' || byte == '+' || byte == '[' || + byte == ']' || byte == '{' || byte == '}' || byte == ';' || + byte == ':' || byte == '?' || byte == '/' || byte == '<' || + byte == '>' || byte == ',' || byte == '.') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Symbol; + advance = 1; + } + else + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Error; + advance = 1; + } + }break; + case TXT_TokenKind_Whitespace: + if(byte != ' ' && byte != '\t' && byte != '\v' && byte != '\f') + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_Identifier: + if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '_') + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_String: + { + U8 ender_byte = string_is_char ? '\'' : '"'; + if(!escaped && byte == ender_byte) + { + ender_found = 1; + advance = 1; + } + else if(escaped) + { + escaped = 0; + advance = 1; + } + else if(byte == '\\') + { + escaped = 1; + advance = 1; + } + else + { + U8 byte_class = utf8_class[byte>>3]; + if(byte_class > 1) + { + advance = (U64)byte_class; + } + } + }break; + case TXT_TokenKind_Numeric: + if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '.') + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_Symbol: + if(1) + { + // NOTE(rjf): avoiding maximum munch rule for now + ender_found = 1; + advance = 0; + } + else if(byte != '~' && byte != '!' && byte != '#' && byte != '%' && + byte != '^' && byte != '&' && byte != '*' && byte != '(' && + byte != ')' && byte != '-' && byte != '=' && byte != '+' && + byte != '[' && byte != ']' && byte != '{' && byte != '}' && + byte != ';' && byte != ':' && byte != '?' && byte != '/' && + byte != '<' && byte != '>' && byte != ',' && byte != '.') + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_Error: + { + ender_found = 1; + advance = 0; + }break; + } + if(ender_found != 0) + { + TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)}; + if(active_token_kind == TXT_TokenKind_Identifier) + { + String8 token_string = str8_substr(string, token.range); + B32 identifier_is_instruction = 0; + if(identifier_is_instruction) + { + token.kind = TXT_TokenKind_Keyword; + } + } + txt_token_chunk_list_push(arena, &tokens, 1024, &token); + active_token_kind = TXT_TokenKind_Null; + active_token_start_off = token.range.max; + } + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Main Layer Initialization diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index 20b5ec15..537c3659 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -113,6 +113,7 @@ typedef enum TXT_LangKind TXT_LangKind_C, TXT_LangKind_CPlusPlus, TXT_LangKind_Odin, + TXT_LangKind_DisasmX64Intel, TXT_LangKind_COUNT } TXT_LangKind; @@ -248,6 +249,7 @@ internal TXT_TokenArray txt_token_array_from_list(Arena *arena, TXT_TokenList *l internal TXT_TokenArray txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string); internal TXT_TokenArray txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string); +internal TXT_TokenArray txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string); //////////////////////////////// //~ rjf: Main Layer Initialization From 614b9bc537917f017fd1815fbf91ac9b19dc352c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 14:38:35 -0700 Subject: [PATCH 247/275] extend dasm cache with style parameters; switch over primary disassembly ui path to dasm cache --- src/dasm_cache/dasm_cache.c | 48 +++++++--- src/dasm_cache/dasm_cache.h | 30 +++++- src/df/gfx/df_view_rule_hooks.c | 2 +- src/df/gfx/df_views.c | 160 ++++++++++++++++---------------- src/text_cache/text_cache.c | 12 +++ src/text_cache/text_cache.h | 1 + 6 files changed, 156 insertions(+), 97 deletions(-) diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c index caecb1b1..c0ce2ffd 100644 --- a/src/dasm_cache/dasm_cache.c +++ b/src/dasm_cache/dasm_cache.c @@ -161,7 +161,11 @@ dasm_scope_close(DASM_Scope *scope) { for(DASM_Node *n = slot->first; n != 0; n = n->next) { - if(u128_match(t->hash, n->hash) && t->addr == n->addr && t->arch == n->arch) + if(u128_match(t->hash, n->hash) && + t->addr == n->addr && + t->arch == n->arch && + t->style_flags == n->style_flags && + t->syntax == n->syntax) { ins_atomic_u64_dec_eval(&n->scope_ref_count); break; @@ -192,6 +196,8 @@ dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_Node *node) touch->hash = node->hash; touch->addr = node->addr; touch->arch = node->arch; + touch->style_flags = node->style_flags; + touch->syntax = node->syntax; SLLStackPush(scope->top_touch, touch); } @@ -199,7 +205,7 @@ dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_Node *node) //~ rjf: Cache Lookups internal DASM_Info -dasm_info_from_hash_addr_arch(DASM_Scope *scope, U128 hash, U64 addr, Architecture arch) +dasm_info_from_hash_addr_arch_style(DASM_Scope *scope, U128 hash, U64 addr, Architecture arch, DASM_StyleFlags style_flags, DASM_Syntax syntax) { DASM_Info info = {0}; if(!u128_match(hash, u128_zero())) @@ -213,7 +219,11 @@ dasm_info_from_hash_addr_arch(DASM_Scope *scope, U128 hash, U64 addr, Architectu { for(DASM_Node *n = slot->first; n != 0; n = n->next) { - if(u128_match(hash, n->hash) && addr == n->addr && arch == n->arch) + if(u128_match(hash, n->hash) && + addr == n->addr && + arch == n->arch && + style_flags == n->style_flags && + syntax == n->syntax) { MemoryCopyStruct(&info, &n->info); found = 1; @@ -230,7 +240,11 @@ dasm_info_from_hash_addr_arch(DASM_Scope *scope, U128 hash, U64 addr, Architectu DASM_Node *node = 0; for(DASM_Node *n = slot->first; n != 0; n = n->next) { - if(u128_match(hash, n->hash) && addr == n->addr && arch == n->arch) + if(u128_match(hash, n->hash) && + addr == n->addr && + arch == n->arch && + style_flags == n->style_flags && + syntax == n->syntax) { node = n; break; @@ -252,26 +266,28 @@ dasm_info_from_hash_addr_arch(DASM_Scope *scope, U128 hash, U64 addr, Architectu node->hash = hash; node->addr = addr; node->arch = arch; + node->style_flags = style_flags; + node->syntax = syntax; node_is_new = 1; } } } if(node_is_new) { - dasm_u2p_enqueue_req(hash, addr, arch, max_U64); + dasm_u2p_enqueue_req(hash, addr, arch, style_flags, syntax, max_U64); } } return info; } internal DASM_Info -dasm_info_from_key_addr_arch(DASM_Scope *scope, U128 key, U64 addr, Architecture arch, U128 *hash_out) +dasm_info_from_key_addr_arch_style(DASM_Scope *scope, U128 key, U64 addr, Architecture arch, DASM_StyleFlags style_flags, DASM_Syntax syntax, U128 *hash_out) { DASM_Info result = {0}; for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) { U128 hash = hs_hash_from_key(key, rewind_idx); - result = dasm_info_from_hash_addr_arch(scope, hash, addr, arch); + result = dasm_info_from_hash_addr_arch_style(scope, hash, addr, arch, style_flags, syntax); if(result.insts.count != 0) { if(hash_out) @@ -288,7 +304,7 @@ dasm_info_from_key_addr_arch(DASM_Scope *scope, U128 key, U64 addr, Architecture //~ rjf: Parse Threads internal B32 -dasm_u2p_enqueue_req(U128 hash, U64 addr, Architecture arch, U64 endt_us) +dasm_u2p_enqueue_req(U128 hash, U64 addr, Architecture arch, DASM_StyleFlags style_flags, DASM_Syntax syntax, U64 endt_us) { B32 good = 0; OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) @@ -301,6 +317,8 @@ dasm_u2p_enqueue_req(U128 hash, U64 addr, Architecture arch, U64 endt_us) dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &hash); dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &addr); dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &arch); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &style_flags); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &syntax); break; } if(os_now_microseconds() >= endt_us) @@ -317,7 +335,7 @@ dasm_u2p_enqueue_req(U128 hash, U64 addr, Architecture arch, U64 endt_us) } internal void -dasm_u2p_dequeue_req(U128 *hash_out, U64 *addr_out, Architecture *arch_out) +dasm_u2p_dequeue_req(U128 *hash_out, U64 *addr_out, Architecture *arch_out, DASM_StyleFlags *style_flags_out, DASM_Syntax *syntax_out) { OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) { @@ -327,6 +345,8 @@ dasm_u2p_dequeue_req(U128 *hash_out, U64 *addr_out, Architecture *arch_out) dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, hash_out); dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, addr_out); dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, arch_out); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, style_flags_out); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, syntax_out); break; } os_condition_variable_wait(dasm_shared->u2p_ring_cv, dasm_shared->u2p_ring_mutex, max_U64); @@ -346,7 +366,9 @@ dasm_parse_thread__entry_point(void *p) U128 hash = {0}; U64 addr = 0; Architecture arch = Architecture_Null; - dasm_u2p_dequeue_req(&hash, &addr, &arch); + DASM_StyleFlags style_flags = 0; + DASM_Syntax syntax = DASM_Syntax_Intel; + dasm_u2p_dequeue_req(&hash, &addr, &arch, &style_flags, &syntax); HS_Scope *hs_scope = hs_scope_open(); //- rjf: unpack hash @@ -466,7 +488,11 @@ dasm_parse_thread__entry_point(void *p) { for(DASM_Node *n = slot->first; n != 0; n = n->next) { - if(u128_match(n->hash, hash) && n->addr == addr && n->arch == arch) + if(u128_match(n->hash, hash) && + addr == n->addr && + arch == n->arch && + style_flags == n->style_flags && + syntax == n->syntax) { n->info_arena = info_arena; MemoryCopyStruct(&n->info, &info); diff --git a/src/dasm_cache/dasm_cache.h b/src/dasm_cache/dasm_cache.h index beb71088..6daa60b1 100644 --- a/src/dasm_cache/dasm_cache.h +++ b/src/dasm_cache/dasm_cache.h @@ -4,6 +4,24 @@ #ifndef DASM_CACHE_H #define DASM_CACHE_H +//////////////////////////////// +//~ rjf: Stringification Types + +typedef U32 DASM_StyleFlags; +enum +{ + DASM_StyleFlag_Addresses = (1<<0), + DASM_StyleFlag_CodeBytes = (1<<1), +}; + +typedef enum DASM_Syntax +{ + DASM_Syntax_Intel, + DASM_Syntax_ATT, + DASM_Syntax_COUNT +} +DASM_Syntax; + //////////////////////////////// //~ rjf: Instruction Types @@ -64,6 +82,8 @@ struct DASM_Node U128 hash; U64 addr; Architecture arch; + DASM_StyleFlags style_flags; + DASM_Syntax syntax; // rjf: value Arena *info_arena; @@ -103,6 +123,8 @@ struct DASM_Touch U128 hash; U64 addr; Architecture arch; + DASM_StyleFlags style_flags; + DASM_Syntax syntax; }; typedef struct DASM_Scope DASM_Scope; @@ -191,14 +213,14 @@ internal void dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_No //////////////////////////////// //~ rjf: Cache Lookups -internal DASM_Info dasm_info_from_hash_addr_arch(DASM_Scope *scope, U128 hash, U64 addr, Architecture arch); -internal DASM_Info dasm_info_from_key_addr_arch(DASM_Scope *scope, U128 key, U64 addr, Architecture arch, U128 *hash_out); +internal DASM_Info dasm_info_from_hash_addr_arch_style(DASM_Scope *scope, U128 hash, U64 addr, Architecture arch, DASM_StyleFlags style_flags, DASM_Syntax syntax); +internal DASM_Info dasm_info_from_key_addr_arch_style(DASM_Scope *scope, U128 key, U64 addr, Architecture arch, DASM_StyleFlags style_flags, DASM_Syntax syntax, U128 *hash_out); //////////////////////////////// //~ rjf: Parse Threads -internal B32 dasm_u2p_enqueue_req(U128 hash, U64 addr, Architecture arch, U64 endt_us); -internal void dasm_u2p_dequeue_req(U128 *hash_out, U64 *addr_out, Architecture *arch_out); +internal B32 dasm_u2p_enqueue_req(U128 hash, U64 addr, Architecture arch, DASM_StyleFlags style_flags, DASM_Syntax syntax, U64 endt_us); +internal void dasm_u2p_dequeue_req(U128 *hash_out, U64 *addr_out, Architecture *arch_out, DASM_StyleFlags *style_flags_out, DASM_Syntax *syntax_out); internal void dasm_parse_thread__entry_point(void *p); //////////////////////////////// diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index f97a1ec7..7e8e5252 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -822,7 +822,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm) //- rjf: key -> parsed text info U128 data_hash = {0}; - DASM_Info dasm_info = dasm_info_from_key_addr_arch(dasm_scope, dasm_key, vaddr_range.min, top.arch, &data_hash); + DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, vaddr_range.min, top.arch, 0, DASM_Syntax_Intel, &data_hash); String8 dasm_text_data = {0}; TXT_TextInfo dasm_text_info = {0}; for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 9b835fbf..a6291b2e 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5501,7 +5501,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) B32 snap[Axis2_COUNT] = {0}; UI_Focus(UI_FocusKind_On) { - if(text_info_is_ready && visible_line_num_range.max >= visible_line_num_range.min && ui_is_focus_active()) + if(ui_is_focus_active() && text_info_is_ready && visible_line_num_range.max >= visible_line_num_range.min) { snap[Axis2_X] = snap[Axis2_Y] = df_do_txt_controls(&text_info, data, ClampBot(num_possible_visible_lines, 10) - 10, &tv->cursor, &tv->mark, &tv->preferred_column); } @@ -6133,22 +6133,16 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - DBGI_Scope *scope = dbgi_scope_open(); + HS_Scope *hs_scope = hs_scope_open(); + DASM_Scope *dasm_scope = dasm_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + DBGI_Scope *dbgi_scope = dbgi_scope_open(); DF_DisasmViewState *dv = df_view_user_state(view, DF_DisasmViewState); ////////////////////////////// //- rjf: extract invariants // DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - - ////////////////////////////// - //- rjf: unpack ctrl ctx & make parse ctx - // - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); - U64 unwind_count = ctrl_ctx.unwind_count; - U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(selected_thread, unwind_count); - DF_Entity *selected_thread_process = df_entity_ancestor_from_kind(selected_thread, DF_EntityKind_Process); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, selected_thread_process, rip_vaddr); F_Tag code_font = df_font_from_slot(DF_FontSlot_Code); F32 code_font_size = df_font_size_from_slot(ws, DF_FontSlot_Code); F_Metrics code_font_metrics = f_metrics_from_tag_size(code_font, code_font_size); @@ -6159,37 +6153,54 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim - bottom_bar_dim.y); S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; - B32 is_focused = ui_is_focus_active(); + + ////////////////////////////// + //- rjf: unpack ctrl ctx & make parse ctx + // + DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *selected_process = df_entity_ancestor_from_kind(selected_thread, DF_EntityKind_Process); + U64 unwind_count = ctrl_ctx.unwind_count; + U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(selected_thread, unwind_count); + EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(dbgi_scope, selected_process, rip_vaddr); ////////////////////////////// //- rjf: no disasm process open? -> snap to selected thread // if(df_entity_is_nil(df_entity_from_handle(dv->process))) { - dv->process = df_handle_from_entity(selected_thread_process); + dv->process = df_handle_from_entity(selected_process); dv->base_vaddr = rip_vaddr; dv->goto_vaddr = rip_vaddr; } ////////////////////////////// - //- rjf: unpack entity info + //- rjf: unpack disassembly info // DF_Entity *process = df_entity_from_handle(dv->process); - DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); - Rng1U64 disasm_vaddr_rng = dasm_info.vaddr_range; - DF_Entity *module = df_module_from_process_vaddr(process, disasm_vaddr_rng.min); + Architecture arch = df_architecture_from_entity(process); + U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(4)); + Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64)); + U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0); + U128 dasm_data_hash = {0}; + DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, DASM_StyleFlag_Addresses, DASM_Syntax_Intel, &dasm_data_hash); + U128 dasm_text_hash = {0}; + TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, dasm_info.text_key, txt_lang_kind_from_architecture(arch), &dasm_text_hash); + String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); + B32 has_disasm = (dasm_info.insts.count != 0 && dasm_text_info.lines_count != 0); + B32 is_loading = (!has_disasm && !df_entity_is_nil(process) && dim_1u64(dasm_vaddr_range) != 0); + + ////////////////////////////// + //- rjf: unpack module info for this region + // + DF_Entity *module = df_module_from_process_vaddr(process, dasm_vaddr_range.min); DF_Entity *binary = df_binary_file_from_module(module); - DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); - B32 has_disasm = (insts.count != 0); - B32 is_loading = (!has_disasm && !df_entity_is_nil(process) && dim_1u64(disasm_vaddr_rng) != 0 && !df_ctrl_targets_running()); ////////////////////////////// //- rjf: is loading -> equip view with loading information // if(is_loading) { - df_view_equip_loading_info(view, is_loading, dasm_info.bytes_processed, dasm_info.bytes_to_process); + df_view_equip_loading_info(view, is_loading, 0, 0); } ////////////////////////////// @@ -6199,8 +6210,8 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) view->scroll_pos.y.idx + (S64)(view->scroll_pos.y.off) + 1 + num_possible_visible_lines); U64 visible_line_count = 0; { - visible_line_num_range.min = Clamp(1, visible_line_num_range.min, (S64)insts.count); - visible_line_num_range.max = Clamp(1, visible_line_num_range.max, (S64)insts.count); + visible_line_num_range.min = Clamp(1, visible_line_num_range.min, (S64)dasm_info.insts.count); + visible_line_num_range.max = Clamp(1, visible_line_num_range.max, (S64)dasm_info.insts.count); visible_line_count = (U64)dim_1s64(visible_line_num_range)+1; } @@ -6209,6 +6220,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) // F32 margin_width_px = big_glyph_advance*3.5f; F32 line_num_width_px = big_glyph_advance * (log10(visible_line_num_range.max) + 3); + TXT_LineTokensSlice slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, &dasm_text_info, dasm_text_data, visible_line_num_range); ////////////////////////////// //- rjf: calculate scroll bounds @@ -6220,7 +6232,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) line_size_x = ClampBot(line_size_x, (S64)big_glyph_advance*120); line_size_x = ClampBot(line_size_x, (S64)code_area_dim.x); scroll_idx_rng[Axis2_X] = r1s64(0, line_size_x-(S64)code_area_dim.x); - scroll_idx_rng[Axis2_Y] = r1s64(0, (S64)insts.count-1); + scroll_idx_rng[Axis2_Y] = r1s64(0, (S64)dasm_info.insts.count-1); } ////////////////////////////// @@ -6244,6 +6256,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: prepare code slice info bundle, for the viewable region of text // DF_CodeSliceParams code_slice_params = {0}; + if(has_disasm) { // rjf: fill basics code_slice_params.flags = DF_CodeSliceFlag_Margin|DF_CodeSliceFlag_LineNums; @@ -6266,37 +6279,16 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) code_slice_params.flash_ranges = df_push_entity_child_list_with_kind(scratch.arena, process, DF_EntityKind_FlashMarker); df_entity_list_push(scratch.arena, &code_slice_params.relevant_binaries, binary); - // rjf: fill line text - for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) + // rjf: fill text info { - U64 idx = line_num-visible_line_num_range.min; - DASMI_Inst *inst = &insts.v[visible_line_num_range.min+idx-1]; - String8 symbol_name = {0}; - if(inst->addr != 0) + S64 line_num = visible_line_num_range.min; + U64 line_idx = visible_line_num_range.min-1; + for(U64 visible_line_idx = 0; visible_line_idx < visible_line_count; visible_line_idx += 1, line_idx += 1, line_num += 1) { - symbol_name = df_symbol_name_from_binary_voff(scratch.arena, binary, df_voff_from_vaddr(module, inst->addr)); + code_slice_params.line_text[visible_line_idx] = str8_substr(dasm_text_data, dasm_text_info.lines_ranges[line_idx]); + code_slice_params.line_ranges[visible_line_idx] = dasm_text_info.lines_ranges[line_idx]; + code_slice_params.line_tokens[visible_line_idx] = slice.line_tokens[visible_line_idx]; } - code_slice_params.line_text[idx] = push_str8f(scratch.arena, "0x%016I64x %S%s%S%s", - disasm_vaddr_rng.min + inst->off, - inst->string, - symbol_name.size ? " (" : "", - symbol_name, - symbol_name.size ? ")" : ""); - } - - // rjf: fill line ranges - for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) - { - U64 idx = line_num-visible_line_num_range.min; - code_slice_params.line_ranges[idx] = r1u64(0, code_slice_params.line_text[idx].size); - } - - // rjf: fill line tokens - for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) - { - U64 idx = line_num-visible_line_num_range.min; - TXT_TokenArray tokens = df_txt_token_array_from_dasm_arch_string(scratch.arena, df_architecture_from_entity(process), code_slice_params.line_text[idx]); - code_slice_params.line_tokens[idx] = tokens; } // rjf: find live threads mapping to this disassembly @@ -6309,10 +6301,10 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) DF_Entity *thread = thread_n->entity; U64 unwind_count = (thread == selected_thread) ? ctrl_ctx.unwind_count : 0; U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - if(contains_1u64(disasm_vaddr_rng, rip_vaddr)) + if(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) { - U64 rip_off = rip_vaddr - disasm_vaddr_rng.min; - S64 line_num = dasmi_inst_array_idx_from_off__linear_scan(&insts, rip_off)+1; + U64 rip_off = rip_vaddr - dasm_vaddr_range.min; + S64 line_num = dasm_inst_array_idx_from_code_off__linear_scan(&dasm_info.insts, rip_off)+1; if(contains_1s64(visible_line_num_range, line_num)) { U64 slice_line_idx = (line_num-visible_line_num_range.min); @@ -6329,10 +6321,10 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) for(DF_EntityNode *n = bps.first; n != 0; n = n->next) { DF_Entity *bp = n->entity; - if(bp->flags & DF_EntityFlag_HasVAddr && contains_1u64(disasm_vaddr_rng, bp->vaddr)) + if(bp->flags & DF_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, bp->vaddr)) { - U64 off = bp->vaddr-disasm_vaddr_rng.min; - U64 idx = dasmi_inst_array_idx_from_off__linear_scan(&insts, off); + U64 off = bp->vaddr-dasm_vaddr_range.min; + U64 idx = dasm_inst_array_idx_from_code_off__linear_scan(&dasm_info.insts, off); S64 line_num = (S64)(idx+1); if(contains_1s64(visible_line_num_range, line_num)) { @@ -6350,10 +6342,10 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) for(DF_EntityNode *n = pins.first; n != 0; n = n->next) { DF_Entity *pin = n->entity; - if(pin->flags & DF_EntityFlag_HasVAddr && contains_1u64(disasm_vaddr_rng, pin->vaddr)) + if(pin->flags & DF_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, pin->vaddr)) { - U64 off = pin->vaddr-disasm_vaddr_rng.min; - U64 idx = dasmi_inst_array_idx_from_off__linear_scan(&insts, off); + U64 off = pin->vaddr-dasm_vaddr_range.min; + U64 idx = dasm_inst_array_idx_from_code_off__linear_scan(&dasm_info.insts, off); S64 line_num = (S64)(idx+1); if(contains_1s64(visible_line_num_range, line_num)) { @@ -6366,11 +6358,11 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) // rjf: fill dasm -> src info { - DF_Entity *module = df_module_from_process_vaddr(process, disasm_vaddr_rng.min); + DF_Entity *module = df_module_from_process_vaddr(process, dasm_vaddr_range.min); DF_Entity *binary = df_binary_file_from_module(module); for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) { - U64 vaddr = disasm_vaddr_rng.min + dasmi_inst_array_off_from_idx(&insts, line_num-1); + U64 vaddr = dasm_vaddr_range.min + dasm_inst_array_code_off_from_idx(&dasm_info.insts, line_num-1); U64 voff = df_voff_from_vaddr(module, vaddr); U64 slice_idx = line_num-visible_line_num_range.min; DF_TextLineDasm2SrcInfoNode *dasm2src_n = push_array(scratch.arena, DF_TextLineDasm2SrcInfoNode, 1); @@ -6385,9 +6377,12 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: do keyboard interaction // B32 snap[Axis2_COUNT] = {0}; - if(!is_loading && is_focused && visible_line_num_range.max > visible_line_num_range.min) + UI_Focus(UI_FocusKind_On) { - snap[Axis2_X] = snap[Axis2_Y] = df_do_dasm_controls(dasm_handle, ClampBot(visible_line_count, 10) - 10, &dv->cursor, &dv->mark, &dv->preferred_column); + if(ui_is_focus_active() && !is_loading && visible_line_num_range.max >= visible_line_num_range.min) + { + snap[Axis2_X] = snap[Axis2_Y] = df_do_txt_controls(&dasm_text_info, dasm_text_data, ClampBot(visible_line_count, 10) - 10, &dv->cursor, &dv->mark, &dv->preferred_column); + } } ////////////////////////////// @@ -6397,7 +6392,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) { U64 vaddr = dv->goto_vaddr; dv->goto_vaddr = 0; - U64 line_idx = dasmi_inst_array_idx_from_off__linear_scan(&insts, vaddr-disasm_vaddr_rng.min); + U64 line_idx = dasm_inst_array_idx_from_code_off__linear_scan(&dasm_info.insts, vaddr-dasm_vaddr_range.min); S64 line_num = (S64)(line_idx+1); dv->cursor = dv->mark = txt_pt(line_num, 1); dv->center_cursor = !dv->contain_cursor || (line_num < visible_line_num_range.min+8 || visible_line_num_range.max-8 < line_num); @@ -6431,7 +6426,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: build code slice DF_CodeSliceSignal sig = {0}; - UI_Focus(is_focused ? UI_FocusKind_On : UI_FocusKind_Off) + UI_Focus(UI_FocusKind_On) { sig = df_code_slicef(ws, &ctrl_ctx, &parse_ctx, &code_slice_params, &dv->cursor, &dv->mark, &dv->preferred_column, "dasm_slice_%p", view); } @@ -6443,11 +6438,11 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) String8 expr = str8_substr(code_slice_params.line_text[line_idx], r1u64(sig.mouse_expr_rng.min.column-1, sig.mouse_expr_rng.max.column-1)); if(expr.size != 0) { - DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); + DF_Eval eval = df_eval_from_string(scratch.arena, dbgi_scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); if(eval.mode != EVAL_EvalMode_NULL) { - U64 off = dasmi_inst_array_off_from_idx(&insts, sig.mouse_expr_rng.min.line-1); - U64 vaddr = disasm_vaddr_rng.min+off; + U64 off = dasm_inst_array_code_off_from_idx(&dasm_info.insts, sig.mouse_expr_rng.min.line-1); + U64 vaddr = dasm_vaddr_range.min+off; df_set_hover_eval(ws, sig.mouse_expr_baseline_pos, ctrl_ctx, process, sig.mouse_pt, vaddr, expr); } } @@ -6470,7 +6465,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(sig.clicked_margin_line_num != 0) { DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.vaddr = disasm_vaddr_rng.min+dasmi_inst_array_off_from_idx(&insts, sig.clicked_margin_line_num-1); + params.vaddr = dasm_vaddr_range.min+dasm_inst_array_code_off_from_idx(&dasm_info.insts, sig.clicked_margin_line_num-1); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddressBreakpoint)); } @@ -6478,7 +6473,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: dropped entity onto line? -> do drop if(sig.dropped_entity_line_num != 0 && !df_entity_is_nil(sig.dropped_entity)) { - U64 drop_vaddr = disasm_vaddr_rng.min+dasmi_inst_array_off_from_idx(&insts, sig.dropped_entity_line_num-1); + U64 drop_vaddr = dasm_vaddr_range.min+dasm_inst_array_code_off_from_idx(&dasm_info.insts, sig.dropped_entity_line_num-1); DF_Entity *dropped_entity = sig.dropped_entity; switch(dropped_entity->kind) { @@ -6541,7 +6536,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(sig.run_to_line_num != 0 && contains_1s64(visible_line_num_range, sig.run_to_line_num)) { DF_CmdParams params = df_cmd_params_from_window(ws); - params.vaddr = disasm_vaddr_rng.min+dasmi_inst_array_off_from_idx(&insts, sig.run_to_line_num-1); + params.vaddr = dasm_vaddr_range.min+dasm_inst_array_code_off_from_idx(&dasm_info.insts, sig.run_to_line_num-1); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToAddress)); } @@ -6549,7 +6544,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: go to source if(sig.goto_src_line_num != 0 && contains_1s64(visible_line_num_range, sig.goto_src_line_num)) { - U64 vaddr = disasm_vaddr_rng.min+dasmi_inst_array_off_from_idx(&insts, sig.goto_src_line_num-1); + U64 vaddr = dasm_vaddr_range.min+dasm_inst_array_code_off_from_idx(&dasm_info.insts, sig.goto_src_line_num-1); DF_Entity *module = df_module_from_process_vaddr(process, vaddr); DF_Entity *binary = df_binary_file_from_module(module); U64 voff = df_voff_from_vaddr(module, vaddr); @@ -6631,12 +6626,12 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(snap[Axis2_Y]) { Rng1S64 cursor_visibility_range = r1s64(dv->cursor.line-4, dv->cursor.line+4); - cursor_visibility_range.min = Clamp(0, cursor_visibility_range.min, (S64)insts.count); - cursor_visibility_range.max = Clamp(0, cursor_visibility_range.max, (S64)insts.count); + cursor_visibility_range.min = Clamp(0, cursor_visibility_range.min, (S64)dasm_info.insts.count); + cursor_visibility_range.max = Clamp(0, cursor_visibility_range.max, (S64)dasm_info.insts.count); S64 min_delta = Min(0, cursor_visibility_range.min-visible_line_num_range.min); S64 max_delta = Max(0, cursor_visibility_range.max-visible_line_num_range.max); S64 new_idx = view->scroll_pos.y.idx+min_delta+max_delta; - new_idx = Clamp(0, new_idx, (S64)insts.count-1); + new_idx = Clamp(0, new_idx, (S64)dasm_info.insts.count-1); ui_scroll_pt_target_idx(&view->scroll_pos.y, new_idx); } } @@ -6716,8 +6711,8 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_Font(code_font) { - DF_Entity *module = df_module_from_process_vaddr(process, disasm_vaddr_rng.min); - U64 cursor_vaddr = (1 <= dv->cursor.line && dv->cursor.line <= insts.count) ? (disasm_vaddr_rng.min+insts.v[dv->cursor.line-1].off) : 0; + DF_Entity *module = df_module_from_process_vaddr(process, dasm_vaddr_range.min); + U64 cursor_vaddr = (1 <= dv->cursor.line && dv->cursor.line <= dasm_info.insts.count) ? (dasm_vaddr_range.min+dasm_info.insts.v[dv->cursor.line-1].code_off) : 0; ui_labelf("%S", path_normalized_from_string(scratch.arena, module->name)); ui_spacer(ui_em(1.5f, 1)); ui_labelf("Address: 0x%I64x, Row: %I64d, Col: %I64d", cursor_vaddr, dv->cursor.line, dv->cursor.column); @@ -6727,7 +6722,10 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) } } - dbgi_scope_close(scope); + dbgi_scope_close(dbgi_scope); + txt_scope_close(txt_scope); + dasm_scope_close(dasm_scope); + hs_scope_close(hs_scope); scratch_end(scratch); ProfEnd(); } diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index cca92ef5..079e4806 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -33,6 +33,18 @@ txt_lang_kind_from_extension(String8 extension) return kind; } +internal TXT_LangKind +txt_lang_kind_from_architecture(Architecture arch) +{ + TXT_LangKind kind = TXT_LangKind_Null; + switch(arch) + { + default:{}break; + case Architecture_x64:{kind = TXT_LangKind_DisasmX64Intel;}break; + } + return kind; +} + internal TXT_LangLexFunctionType * txt_lex_function_from_lang_kind(TXT_LangKind kind) { diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index 537c3659..17b32ea9 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -234,6 +234,7 @@ global TXT_Shared *txt_shared = 0; //~ rjf: Basic Helpers internal TXT_LangKind txt_lang_kind_from_extension(String8 extension); +internal TXT_LangKind txt_lang_kind_from_architecture(Architecture arch); internal TXT_LangLexFunctionType *txt_lex_function_from_lang_kind(TXT_LangKind kind); //////////////////////////////// From 2f5cc748d824a2f9867b9628ecd0ee9375b3d495 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 14:42:56 -0700 Subject: [PATCH 248/275] use disasm style parameters in dasm_cache disassembly path --- src/dasm_cache/dasm_cache.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c index c0ce2ffd..a3935cae 100644 --- a/src/dasm_cache/dasm_cache.c +++ b/src/dasm_cache/dasm_cache.c @@ -418,7 +418,7 @@ dasm_parse_thread__entry_point(void *p) ud_set_pc(&udc, addr); ud_set_input_buffer(&udc, data.str, data.size); ud_set_vendor(&udc, UD_VENDOR_ANY); - ud_set_syntax(&udc, UD_SYN_INTEL); + ud_set_syntax(&udc, syntax == DASM_Syntax_Intel ? UD_SYN_INTEL : UD_SYN_ATT); // rjf: disassemble U64 byte_process_start_off = 0; @@ -436,11 +436,16 @@ dasm_parse_thread__entry_point(void *p) U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(&udc, first_op) : 0; // rjf: push - String8 string = push_str8f(scratch.arena, "%s", udc.asm_buf); + String8 addr_part = {0}; + if(style_flags & DASM_StyleFlag_Addresses) + { + addr_part = push_str8f(scratch.arena, "%016I64X ", addr+off); + } + String8 inst_string = push_str8f(scratch.arena, "%S%s", addr_part, udc.asm_buf); DASM_Inst inst = {off, rel_voff, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + string.size)}; + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, string); + str8_list_push(scratch.arena, &inst_strings, inst_string); // rjf: increment off += size; From f75ae9eb4aff3ef197b2185b4a7b3bc63ac6c81d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 14:53:38 -0700 Subject: [PATCH 249/275] transition disassembly command processing paths to dasm cache --- src/df/gfx/df_views.c | 233 +++++++----------------------------------- src/df/gfx/df_views.h | 5 - 2 files changed, 38 insertions(+), 200 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index a6291b2e..e0a05f0d 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -369,176 +369,6 @@ df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray qsort(array.v, array.count, sizeof(DF_EntityListerItem), (int (*)(const void *, const void *))df_qsort_compare_entity_lister__strength); } -//////////////////////////////// -//~ rjf: Disassembly View - -internal TXT_TokenArray -df_txt_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - TXT_TokenChunkList tokens = {0}; - { - TXT_TokenKind active_token_kind = TXT_TokenKind_Null; - U64 active_token_start_off = 0; - U64 off = 0; - B32 escaped = 0; - B32 string_is_char = 0; - for(U64 advance = 0; off <= string.size; off += advance) - { - U8 byte = (off+0 < string.size) ? string.str[off+0] : 0; - U8 next_byte = (off+1 < string.size) ? string.str[off+1] : 0; - B32 ender_found = 0; - advance = (active_token_kind != TXT_TokenKind_Null ? 1 : 0); - if(off == string.size && active_token_kind != TXT_TokenKind_Null) - { - ender_found = 1; - advance = 1; - } - switch(active_token_kind) - { - default: - case TXT_TokenKind_Null: - { - if(byte == ' ' || byte == '\t' || byte == '\v' || byte == '\f' || byte == '\r' || byte == '\n') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Whitespace; - advance = 1; - } - else if(('a' <= byte && byte <= 'z') || ('A' <= byte && byte <= 'Z') || byte == '_') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Identifier; - advance = 1; - } - else if(byte == '\'') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_String; - advance = 1; - string_is_char = 1; - } - else if(byte == '"') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_String; - advance = 1; - string_is_char = 0; - } - else if(('0' <= byte && byte <= '9') || (byte == '.' && '0' <= next_byte && next_byte <= '9')) - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Numeric; - advance = 1; - } - else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' || - byte == '&' || byte == '*' || byte == '(' || byte == ')' || - byte == '-' || byte == '=' || byte == '+' || byte == '[' || - byte == ']' || byte == '{' || byte == '}' || byte == ';' || - byte == ':' || byte == '?' || byte == '/' || byte == '<' || - byte == '>' || byte == ',' || byte == '.') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Symbol; - advance = 1; - } - else - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Error; - advance = 1; - } - }break; - case TXT_TokenKind_Whitespace: - if(byte != ' ' && byte != '\t' && byte != '\v' && byte != '\f') - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_Identifier: - if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '_') - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_String: - { - U8 ender_byte = string_is_char ? '\'' : '"'; - if(!escaped && byte == ender_byte) - { - ender_found = 1; - advance = 1; - } - else if(escaped) - { - escaped = 0; - advance = 1; - } - else if(byte == '\\') - { - escaped = 1; - advance = 1; - } - else - { - U8 byte_class = utf8_class[byte>>3]; - if(byte_class > 1) - { - advance = (U64)byte_class; - } - } - }break; - case TXT_TokenKind_Numeric: - if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '.') - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_Symbol: - if(1) - { - // NOTE(rjf): avoiding maximum munch rule for now - ender_found = 1; - advance = 0; - } - else if(byte != '~' && byte != '!' && byte != '#' && byte != '%' && - byte != '^' && byte != '&' && byte != '*' && byte != '(' && - byte != ')' && byte != '-' && byte != '=' && byte != '+' && - byte != '[' && byte != ']' && byte != '{' && byte != '}' && - byte != ';' && byte != ':' && byte != '?' && byte != '/' && - byte != '<' && byte != '>' && byte != ',' && byte != '.') - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_Error: - { - ender_found = 1; - advance = 0; - }break; - } - if(ender_found != 0) - { - TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)}; - if(active_token_kind == TXT_TokenKind_Identifier) - { - String8 token_string = str8_substr(string, token.range); - if(df_info_summary_from_string(arch, token_string).size != 0) - { - token.kind = TXT_TokenKind_Keyword; - } - } - txt_token_chunk_list_push(arena, &tokens, 1024, &token); - active_token_kind = TXT_TokenKind_Null; - active_token_start_off = token.range.max; - } - } - } - TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); - scratch_end(scratch); - return result; -} - //////////////////////////////// //~ rjf: Eval/Watch Views @@ -5945,8 +5775,28 @@ DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Disassembly) DF_VIEW_CMD_FUNCTION_DEF(Disassembly) { Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + DASM_Scope *dasm_scope = dasm_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); DF_DisasmViewState *dv = df_view_user_state(view, DF_DisasmViewState); + + ////////////////////////////// + //- rjf: unpack disassembly info + // DF_Entity *process = df_entity_from_handle(dv->process); + Architecture arch = df_architecture_from_entity(process); + U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(4)); + Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64)); + U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0); + U128 dasm_data_hash = {0}; + DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, DASM_StyleFlag_Addresses, DASM_Syntax_Intel, &dasm_data_hash); + U128 dasm_text_hash = {0}; + TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, dasm_info.text_key, txt_lang_kind_from_architecture(arch), &dasm_text_hash); + String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); + + ////////////////////////////// + //- rjf: process commands + // for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) { DF_Cmd *cmd = &n->cmd; @@ -6008,13 +5858,10 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) }break; case DF_CoreCmdKind_ToggleBreakpointAtCursor: { - DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); - DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); - if(insts.count != 0) + if(1 <= dv->cursor.line && dv->cursor.line <= dasm_info.insts.count) { - U64 off = dasmi_inst_array_off_from_idx(&insts, dv->cursor.line-1); - U64 vaddr = dasm_info.vaddr_range.min+off; + U64 off = dasm_inst_array_code_off_from_idx(&dasm_info.insts, dv->cursor.line-1); + U64 vaddr = dasm_vaddr_range.min+off; DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.vaddr = vaddr; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); @@ -6024,30 +5871,25 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) }break; case DF_CoreCmdKind_ToggleWatchPinAtCursor: { - DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); - DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); - if(insts.count != 0) + if(1 <= dv->cursor.line && dv->cursor.line <= dasm_info.insts.count) { - U64 off = dasmi_inst_array_off_from_idx(&insts, dv->cursor.line-1); - U64 vaddr = dasm_info.vaddr_range.min+off; + U64 off = dasm_inst_array_code_off_from_idx(&dasm_info.insts, dv->cursor.line-1); + U64 vaddr = dasm_vaddr_range.min+off; DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); p.vaddr = vaddr; p.string = params.string; df_cmd_params_mark_slot(&p, DF_CmdParamSlot_VirtualAddr); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchPin)); + dv->contain_cursor = 1; } }break; case DF_CoreCmdKind_RunToCursor: { - DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); - DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); - if(insts.count != 0) + if(1 <= dv->cursor.line && dv->cursor.line <= dasm_info.insts.count) { - U64 off = dasmi_inst_array_off_from_idx(&insts, dv->cursor.line-1); - U64 vaddr = dasm_info.vaddr_range.min+off; + U64 off = dasm_inst_array_code_off_from_idx(&dasm_info.insts, dv->cursor.line-1); + U64 vaddr = dasm_vaddr_range.min+off; DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.vaddr = vaddr; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); @@ -6056,15 +5898,12 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) }break; case DF_CoreCmdKind_SetNextStatement: { - DASMI_Handle dasm_handle = df_dasm_handle_from_process_vaddr(process, dv->base_vaddr); - DASMI_BinaryInfo dasm_info = dasmi_binary_info_from_handle(scratch.arena, dasm_handle); - DASMI_InstArray insts = dasmi_inst_array_from_handle(scratch.arena, dasm_handle, os_now_microseconds()+100); - DF_Entity *thread = df_entity_from_handle(params.entity); S64 line_num = (cmd->params.text_point.line == 0 ? dv->cursor.line : cmd->params.text_point.line); - if(insts.count != 0) + DF_Entity *thread = df_entity_from_handle(params.entity); + if(1 <= line_num && line_num <= dasm_info.insts.count) { - U64 off = dasmi_inst_array_off_from_idx(&insts, line_num-1); - U64 vaddr = dasm_info.vaddr_range.min+off; + U64 off = dasm_inst_array_code_off_from_idx(&dasm_info.insts, line_num-1); + U64 vaddr = dasm_vaddr_range.min+off; DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.vaddr = vaddr; params.entity = df_handle_from_entity(thread); @@ -6126,6 +5965,10 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) }break; } } + + hs_scope_close(hs_scope); + dasm_scope_close(dasm_scope); + txt_scope_close(txt_scope); scratch_end(scratch); } diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index e11c9e7d..1d27436b 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -435,11 +435,6 @@ internal DF_EntityListerItemList df_entity_lister_item_list_from_needle(Arena *a internal DF_EntityListerItemArray df_entity_lister_item_array_from_list(Arena *arena, DF_EntityListerItemList list); internal void df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray array); -//////////////////////////////// -//~ rjf: Disassembly View - -internal TXT_TokenArray df_txt_token_array_from_dasm_arch_string(Arena *arena, Architecture arch, String8 string); - //////////////////////////////// //~ rjf: Eval/Watch Views From 09f74805e0e59cb302af3dcca6a842bb60fb3a09 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 14:54:52 -0700 Subject: [PATCH 250/275] restore old demon layer linux implementation, to not have to seek back in version control to find it when porting --- src/demon/linux/demon_os_linux.c | 2106 ++++++++++++++++++++++++++++++ src/demon/linux/demon_os_linux.h | 222 ++++ 2 files changed, 2328 insertions(+) create mode 100644 src/demon/linux/demon_os_linux.c create mode 100644 src/demon/linux/demon_os_linux.h diff --git a/src/demon/linux/demon_os_linux.c b/src/demon/linux/demon_os_linux.c new file mode 100644 index 00000000..0c92f461 --- /dev/null +++ b/src/demon/linux/demon_os_linux.c @@ -0,0 +1,2106 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +// TODO(allen): run controls: ignore_previous_exception + +//////////////////////////////// +//~ allen: Elf Parsing Code + +#include "syms/syms_elf_inc.c" + +//////////////////////////////// +//~ rjf: Globals + +global B32 demon_lnx_already_has_halt_injection = false; +global U64 demon_lnx_halt_code = 0; +global U64 demon_lnx_halt_user_data = 0; + +global B32 demon_lnx_new_process_pending = false; + +global Arena *demon_lnx_event_arena = 0; +global DEMON_EventList demon_lnx_queued_events = {0}; + +global U32 demon_lnx_ptrace_options = (PTRACE_O_TRACEEXIT| + PTRACE_O_EXITKILL| + PTRACE_O_TRACEFORK| + PTRACE_O_TRACEVFORK| + PTRACE_O_TRACECLONE); + +//////////////////////////////// +//~ rjf: Helpers + +internal DEMON_LNX_ThreadExt* +demon_lnx_thread_ext(DEMON_Entity *entity){ + DEMON_LNX_ThreadExt *result = (DEMON_LNX_ThreadExt*)&entity->ext; + return(result); +} + +internal B32 +demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node){ + B32 result = false; + + int attach_result = ptrace(PTRACE_ATTACH, pid, 0, 0); + if (attach_result == -1){ + // TODO(allen): attach denied + } + else{ + // return a new attachment node as soon as the ptrace exists. we use these nodes + // for cleanup on failure *and* for initializing on success. either way we need + // to see all new attachments whether or not they fully initialized correctly. + DEMON_LNX_AttachNode *proc_attachment = push_array_no_zero(arena, DEMON_LNX_AttachNode, 1); + proc_attachment->next = 0; + proc_attachment->pid = pid; + *new_node = proc_attachment; + + int status = 0; + pid_t wait_id = waitpid(pid, &status, __WALL); + // NOTE(allen): if wait_id != pid we don't know what that means; study that case before + // deciding how error handling around it works. + if (wait_id == pid){ + int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); + if (setoptions_result == -1){ + // TODO(allen): setup failed + } + else{ + result = true; + } + } + } + + return(result); +} + +internal String8 +demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid){ + // get symbolic path + Temp scratch = scratch_begin(&arena, 1); + String8 exe_symbol_path = push_str8f(scratch.arena, "/proc/%d/exe", pid); + + // try to read the link for a bit + Temp restore_point = temp_begin(arena); + B32 got_final_result = false; + U8 *buffer = 0; + int size = 0; + S64 cap = PATH_MAX; + for (S64 r = 0; r < 4; cap *= 2, r += 1){ + temp_end(restore_point); + buffer = push_array_no_zero(arena, U8, cap); + size = readlink((char*)exe_symbol_path.str, (char*)buffer, cap); + if (size < cap){ + got_final_result = true; + break; + } + } + + // finalize result + String8 result = {0}; + if (!got_final_result || size == -1){ + temp_end(restore_point); + } + else{ + arena_put_back(arena, (cap - size - 1)); + result = str8(buffer, size + 1); + } + + scratch_end(scratch); + return(result); +} + +internal int +demon_lnx_open_memory_fd_for_pid(pid_t pid){ + Temp scratch = scratch_begin(0, 0); + String8 memory_path = push_str8f(scratch.arena, "/proc/%i/mem", pid); + int result = open((char*)memory_path.str, O_RDWR); + scratch_end(scratch); + return(result); +} + +internal Architecture +demon_lnx_arch_from_pid(pid_t pid){ + Temp scratch = scratch_begin(0, 0); + Architecture result = Architecture_Null; + + // exe path + String8 exe_path = demon_lnx_executable_path_from_pid(scratch.arena, pid); + + // handle to exe + int exe_fd = -1; + if (exe_path.size != 0){ + exe_fd = open((char*)exe_path.str, O_RDONLY); + } + + // elf identification + B32 is_elf = false; + U8 e_ident[SYMS_ElfIdentifier_NIDENT] = {0}; + if (exe_fd >= 0){ + if (pread(exe_fd, e_ident, sizeof(e_ident), 0) == sizeof(e_ident)){ + is_elf = (e_ident[SYMS_ElfIdentifier_MAG0] == 0x7f && + e_ident[SYMS_ElfIdentifier_MAG1] == 'E' && + e_ident[SYMS_ElfIdentifier_MAG2] == 'L' && + e_ident[SYMS_ElfIdentifier_MAG3] == 'F'); + } + } + + // elf class + U8 elf_class = 0; + if (is_elf){ + elf_class = e_ident[SYMS_ElfIdentifier_CLASS]; + } + + // exe header data + SYMS_ElfEhdr64 ehdr = {0}; + switch (elf_class){ + case 1: + { + SYMS_ElfEhdr32 ehdr32 = {0}; + if (pread(exe_fd, &ehdr32, sizeof(ehdr32), 0) == sizeof(ehdr32)){ + ehdr = syms_elf_ehdr64_from_ehdr32(ehdr32); + } + }break; + + case 2: + { + pread(exe_fd, &ehdr, sizeof(ehdr), 0); + }break; + } + + // determine machine type + switch (ehdr.e_machine){ + case SYMS_ElfMachineKind_386: + { + result = Architecture_x86; + }break; + + case SYMS_ElfMachineKind_ARM: + { + result = Architecture_arm32; + }break; + + case SYMS_ElfMachineKind_X86_64: + { + result = Architecture_x64; + }break; + + case SYMS_ElfMachineKind_AARCH64: + { + result = Architecture_arm64; + }break; + } + + scratch_end(scratch); + return(result); +} + +internal DEMON_LNX_ProcessAux +demon_lnx_aux_from_pid(pid_t pid, Architecture arch){ + DEMON_LNX_ProcessAux result = {0}; + B32 addr_32bit = (arch == Architecture_x86 || arch == Architecture_arm32); + + // open aux data + Temp scratch = scratch_begin(0, 0); + String8 auxv_symbol_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); + int aux_fd = open((char*)auxv_symbol_path.str, O_RDONLY); + + // scan aux data + if (aux_fd >= 0){ + for (;;){ + result.filled = true; + + // read next aux + U64 type = 0; + U64 val = 0; + if (addr_32bit){ + SYMS_ElfAuxv32 aux; + if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ + goto brkloop; + } + type = aux.a_type; + val = aux.a_val; + } + else{ + SYMS_ElfAuxv64 aux; + if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ + goto brkloop; + } + type = aux.a_type; + val = aux.a_val; + } + + // place value in result + switch (type){ + default:break; + case SYMS_ElfAuxType_NULL: goto brkloop; break; + case SYMS_ElfAuxType_PHNUM: result.phnum = val; break; + case SYMS_ElfAuxType_PHENT: result.phent = val; break; + case SYMS_ElfAuxType_PHDR: result.phdr = val; break; + case SYMS_ElfAuxType_EXECFN: result.execfn = val; break; + } + } + brkloop:; + + close(aux_fd); + } + + scratch_end(scratch); + return(result); +} + +internal DEMON_LNX_PhdrInfo +demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phentsize, U64 phcount){ + DEMON_LNX_PhdrInfo result = {0}; + result.range.min = max_U64; + + // how much phdr will we read? + U64 phdr_size_expected = (is_32bit?sizeof(SYMS_ElfPhdr32):sizeof(SYMS_ElfPhdr64)); + U64 phdr_stride = (phentsize?phentsize:phdr_size_expected); + U64 phdr_read_size = ClampTop(phdr_stride, phdr_size_expected); + + // scan table + U64 va = phvaddr; + for (U64 i = 0; i < phcount; i += 1, va += phdr_stride){ + + // get type and range + SYMS_ElfPKind p_type = 0; + U64 p_vaddr = 0; + U64 p_memsz = 0; + + if (is_32bit){ + SYMS_ElfPhdr32 phdr32 = {0}; + demon_lnx_read_memory(memory_fd, &phdr32, va, phdr_read_size); + p_type = phdr32.p_type; + p_vaddr = phdr32.p_vaddr; + p_memsz = phdr32.p_memsz; + } + else{ + SYMS_ElfPhdr64 phdr64 = {0}; + demon_lnx_read_memory(memory_fd, &phdr64, va, phdr_read_size); + p_type = phdr64.p_type; + p_vaddr = phdr64.p_vaddr; + p_memsz = phdr64.p_memsz; + } + + // save useful info + switch (p_type){ + case SYMS_ElfPKind_Dynamic: + { + result.dynamic = p_vaddr; + }break; + case SYMS_ElfPKind_Load: + { + U64 min = p_vaddr; + U64 max = p_vaddr + p_memsz; + result.range.min = Min(result.range.min, min); + result.range.max = Max(result.range.max, max); + }break; + } + } + + return(result); +} + +internal DEMON_LNX_ModuleNode* +demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){ + Architecture arch = (Architecture)process->arch; + B32 is_32bit = (arch == Architecture_x86 || arch == Architecture_arm32); + int memory_fd = (int)process->ext_u64; + + // aux from pid + DEMON_LNX_ProcessAux aux = demon_lnx_aux_from_pid((pid_t)process->id, arch); + + // extract info from program headers + DEMON_LNX_PhdrInfo phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, + aux.phdr, aux.phent, aux.phnum); + + // linkmap first from memory space & dyn address + U64 first_linkmap_va = 0; + if (phdr_info.dynamic != 0){ + U64 off = phdr_info.dynamic; + for (;;){ + SYMS_ElfDyn64 dyn = {0}; + if (is_32bit){ + SYMS_ElfDyn32 dyn32 = {0}; + demon_lnx_read_memory(memory_fd, &dyn32, off, sizeof(dyn32)); + dyn.tag = dyn32.tag; + dyn.val = dyn32.val; + off += sizeof(dyn32); + } + else{ + demon_lnx_read_memory(memory_fd, &dyn, off, sizeof(dyn)); + off += sizeof(dyn); + } + + if (dyn.tag == SYMS_ElfDynTag_NULL){ + break; + } + + if (dyn.tag == SYMS_ElfDynTag_PLTGOT){ + // True for x86 and x64 + // vas[0] virtual address of .dynamic + // vas[2] callback for resolving function address of relocation and if successful jumps to it. + // + // Code that sets up PLTGOT is in glibc/sysdeps/x86_64/dl_machine.h -> elf_machine_runtime_setup + U64 vas_off = dyn.val; + U64 vas[3] = {0}; + demon_lnx_read_memory(memory_fd, vas, vas_off, sizeof(vas)); + first_linkmap_va = vas[1]; + break; + } + } + } + + // setup output list + DEMON_LNX_ModuleNode *first = 0; + DEMON_LNX_ModuleNode *last = 0; + + // main module + { + DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); + SLLQueuePush(first, last, node); + node->vaddr = phdr_info.range.min; + node->size = phdr_info.range.max - phdr_info.range.min; + node->name = aux.execfn; + } + + // iterate link maps + if (first_linkmap_va != 0){ + U64 linkmap_va = first_linkmap_va; + + for (;;){ + SYMS_ElfLinkMap64 linkmap = {0}; + if (is_32bit){ + // TOOD(nick): endian awarness + SYMS_ElfLinkMap32 linkmap32 = {0}; + demon_lnx_read_memory(memory_fd, &linkmap32, linkmap_va, sizeof(linkmap32)); + linkmap.base = linkmap32.base; + linkmap.name = linkmap32.name; + linkmap.ld = linkmap32.ld; + linkmap.next = linkmap32.next; + } + else{ + demon_lnx_read_memory(memory_fd, &linkmap, linkmap_va, sizeof(linkmap)); + } + + if (linkmap.base != 0){ + // find phdrs for this module + SYMS_U64 phvaddr = 0; + SYMS_U64 phentsize = 0; + SYMS_U64 phcount = 0; + + if (is_32bit){ + SYMS_ElfEhdr32 ehdr = {0}; + demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); + phvaddr = ehdr.e_phoff + linkmap.base; + phentsize = ehdr.e_phentsize; + phcount = ehdr.e_phnum; + } + else{ + SYMS_ElfEhdr64 ehdr = {0}; + demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); + phvaddr = ehdr.e_phoff + linkmap.base; + phentsize = ehdr.e_phentsize; + phcount = ehdr.e_phnum; + } + + // extract info from phdrs + DEMON_LNX_PhdrInfo module_phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, + phvaddr, phentsize, phcount); + + // save module node + DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); + SLLQueuePush(first, last, node); + node->vaddr = linkmap.base; + node->size = module_phdr_info.range.max - module_phdr_info.range.min; + node->name = linkmap.name; + } + + linkmap_va = linkmap.next; + if (linkmap_va == 0){ + break; + } + } + } + + return(first); +} + +internal U64 +demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size){ + U64 bytes_read = 0; + U8 *ptr = (U8*)dst; + U8 *opl = ptr + size; + U64 cursor = src; + for (;ptr < opl;){ + size_t to_read = (size_t)(opl - ptr); + ssize_t actual_read = pread(memory_fd, ptr, to_read, cursor); + if (actual_read == -1){ + break; + } + ptr += actual_read; + cursor += actual_read; + bytes_read += actual_read; + } + return(bytes_read); +} + +internal B32 +demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size){ + B32 result = true; + U8 *ptr = (U8*)src; + U8 *opl = ptr + size; + U64 cursor = dst; + for (;ptr < opl;){ + size_t to_write = (size_t)(opl - ptr); + ssize_t actual_write = pwrite(memory_fd, ptr, to_write, cursor); + if (actual_write == -1){ + result = false; + break; + } + ptr += actual_write; + cursor += actual_write; + } + return(result); +} + +internal String8 +demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address){ + // TODO(allen): this could be done better with a demon_lnx_read_memory + // that returns a read amount instead of a success/fail. + + // scan piece by piece + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 max_cap = 256; + U64 cap = max_cap; + U64 read_p = address; + for (;;){ + U8 *block = push_array(scratch.arena, U8, cap); + for (;cap > 0;){ + if (demon_lnx_read_memory(memory_fd, block, read_p, cap)){ + break; + } + cap /= 2; + } + read_p += cap; + + U64 block_opl = 0; + for (;block_opl < cap; block_opl += 1){ + if (block[block_opl] == 0){ + break; + } + } + + if (block_opl > 0){ + str8_list_push(scratch.arena, &list, str8(block, block_opl)); + } + + if (block_opl < cap || cap == 0){ + break; + } + } + + // assemble results + String8 result = str8_list_join(arena, &list, 0); + scratch_end(scratch); + return(result); +} + +internal void +demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src){ + dst->rax.u64 = src->rax; + dst->rcx.u64 = src->rcx; + dst->rdx.u64 = src->rdx; + dst->rbx.u64 = src->rbx; + dst->rsp.u64 = src->rsp; + dst->rbp.u64 = src->rbp; + dst->rsi.u64 = src->rsi; + dst->rdi.u64 = src->rdi; + dst->r8.u64 = src->r8; + dst->r9.u64 = src->r9; + dst->r10.u64 = src->r10; + dst->r11.u64 = src->r11; + dst->r12.u64 = src->r12; + dst->r13.u64 = src->r13; + dst->r14.u64 = src->r14; + dst->r15.u64 = src->r15; + dst->cs.u16 = src->cs; + dst->ds.u16 = src->ds; + dst->es.u16 = src->es; + dst->fs.u16 = src->fs; + dst->gs.u16 = src->gs; + dst->ss.u16 = src->ss; + dst->fsbase.u64 = src->fsbase; + dst->gsbase.u64 = src->gsbase; + dst->rip.u64 = src->rip; + dst->rflags.u64 = src->rflags; +} + +internal void +demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src){ + dst->rax = src->rax.u64; + dst->rcx = src->rcx.u64; + dst->rdx = src->rdx.u64; + dst->rbx = src->rbx.u64; + dst->rsp = src->rsp.u64; + dst->rbp = src->rbp.u64; + dst->rsi = src->rsi.u64; + dst->rdi = src->rdi.u64; + dst->r8 = src->r8.u64; + dst->r9 = src->r9.u64; + dst->r10 = src->r10.u64; + dst->r11 = src->r11.u64; + dst->r12 = src->r12.u64; + dst->r13 = src->r13.u64; + dst->r14 = src->r14.u64; + dst->r15 = src->r15.u64; + dst->cs = src->cs.u16; + dst->ds = src->ds.u16; + dst->es = src->es.u16; + dst->fs = src->fs.u16; + dst->gs = src->gs.u16; + dst->ss = src->ss.u16; + dst->fsbase = src->fsbase.u64; + dst->gsbase = src->gsbase.u64; + dst->rip = src->rip.u64; + dst->rflags = src->rflags.u64; +} + +//////////////////////////////// + +internal String8 +demon_lnx_read_int_string(Arena *arena, int fd, int radix){ + String8 integer = str8(0,0); + + int to_read = 0; + int to_seek = 0; + for (;;){ + char b = 0; + if (read(fd, &b, sizeof(b)) == 0){ + break; + } + to_seek += 1; + if ( ! char_is_digit(b, radix)){ + break; + } + to_read += 1; + } + + if (lseek(fd, -to_seek, SEEK_CUR) != -1) { + char *buf = push_array_no_zero(arena, char, to_read + 1); + read(fd, buf, to_read); + buf[to_read] = '\0'; + integer = str8((U8*)buf, (U64)to_read); + } + + return(integer); +} + +internal U64 +demon_lnx_read_u64(int fd, int radix){ + Temp scratch = scratch_begin(0, 0); + String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); + U64 result = u64_from_str8(integer, radix); + scratch_end(scratch); + return(result); +} + +internal S64 +demon_lnx_read_s64(int fd, int radix){ + Temp scratch = scratch_begin(0, 0); + String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); + S64 result = s64_from_str8(integer, radix); + scratch_end(scratch); + return(result); +} + +internal B32 +demon_lnx_read_expect(int fd, char expect){ + char got = 0; + read(fd, &got, sizeof(got)); + B32 result = (got == expect); + if (!result){ + lseek(fd, -1, SEEK_CUR); + } + return(result); +} + +internal int +demon_lnx_read_whitespace(int fd){ + int whitespace_size = 0; + for (;;){ + if (!demon_lnx_read_expect(fd, ' ')){ + if (!demon_lnx_read_expect(fd, '\t')){ + break; + } + } + whitespace_size += 1; + } + return whitespace_size; +} + +internal String8 +demon_lnx_read_string(Arena *arena, int fd){ + String8 result = str8(0,0); + + int to_read = 0; + int to_seek = 0; + for (;;){ + char b = 0; + if (read(fd, &b, sizeof(b)) == 0) { + break; + } + to_seek += 1; + if (b == '\0' || b == '\n'){ + break; + } + to_read += 1; + } + + if (to_seek > 0 && lseek(fd, -to_seek, SEEK_CUR) != -1){ + char *buf = push_array_no_zero(arena, char, to_read + 1); + read(fd, buf, to_read); + buf[to_read] = '\0'; + result = str8((U8*)buf, to_read); + } + + return(result); +} + +internal int +demon_lnx_open_maps(pid_t pid){ + Temp scratch = scratch_begin(0, 0); + String8 path = push_str8f(scratch.arena, "/proc/%d/maps", pid); + int maps = open((char*)path.str, O_RDONLY); + scratch_end(scratch); + return(maps); +} + +internal B32 +demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out){ + B32 is_parsed = false; + MemoryZeroStruct(entry_out); + do{ + U64 address_lo = 0; + U64 address_hi = 0; + DEMON_LNX_PermFlags perms = 0; + U64 offset = 0; + U64 dev_major = 0; + U64 dev_minor = 0; + U64 inode = 0; + String8 pathname = str8(0,0); + + // address range + address_lo = demon_lnx_read_u64(maps, 16); + if (!demon_lnx_read_expect(maps, '-')){ + break; + } + address_hi = demon_lnx_read_u64(maps, 16); + if (demon_lnx_read_whitespace(maps) == 0){ + break; + } + + // permission flags + char b; + if (read(maps, &b, sizeof(b)) == 0){ + break; + } + if (b=='r'){ + perms |= DEMON_LNX_PermFlags_Read; + } + if (read(maps, &b, sizeof(b)) == 0){ + break; + } + if (b=='w'){ + perms |= DEMON_LNX_PermFlags_Write; + } + if (read(maps, &b, sizeof(b)) == 0){ + break; + } + if (b=='x'){ + perms |= DEMON_LNX_PermFlags_Exec; + } + if (read(maps, &b, sizeof(b)) == 0){ + break; + } + if (b == 'p'){ + perms |= DEMON_LNX_PermFlags_Private; + } + if (demon_lnx_read_whitespace(maps) == 0){ + break; + } + + // offset + offset = demon_lnx_read_u64(maps, 16); + if (demon_lnx_read_whitespace(maps) == 0){ + break; + } + + // dev + dev_major = demon_lnx_read_u64(maps, 10); + if (!demon_lnx_read_expect(maps, ':')){ + break; + } + dev_minor = demon_lnx_read_u64(maps, 10); + if (demon_lnx_read_whitespace(maps) == 0){ + break; + } + + // inode + inode = demon_lnx_read_u64(maps, 10); + if (demon_lnx_read_whitespace(maps) == 10){ + break; + } + + // pathname + pathname = demon_lnx_read_string(arena, maps); + + // emit entry if en + b = 0; + read(maps, &b, sizeof(b)); + if (b != '\n' && b != '\0') { + break; + } + + // fill result + entry_out->address_lo = address_lo; + entry_out->address_hi = address_hi; + entry_out->perms = perms; + entry_out->offset = offset; + entry_out->dev_major = (U32)dev_major; + entry_out->dev_minor = (U32)dev_minor; + entry_out->inode = inode; + entry_out->pathname = pathname; + entry_out->type = DEMON_LNX_MapsEntryType_Null; + entry_out->stack_tid = 0; + + if (str8_match(pathname, str8_lit("/"), StringMatchFlag_RightSideSloppy)){ + entry_out->type = DEMON_LNX_MapsEntryType_Path; + } else if (str8_match(pathname, str8_lit("[heap]"), 0)){ + entry_out->type = DEMON_LNX_MapsEntryType_Heap; + } else if (str8_match(pathname, str8_lit("[stack]"), 0)){ + entry_out->type = DEMON_LNX_MapsEntryType_Stack; + } else if (str8_match(pathname, str8_lit("[stack:"), StringMatchFlag_RightSideSloppy)){ + entry_out->type = DEMON_LNX_MapsEntryType_Stack; + String8 tid = str8_substr(pathname, r1u64(7, pathname.size - 8)); + entry_out->stack_tid = (pid_t)u64_from_str8(tid, 10); + } + + is_parsed = true; + }while(0); + return(is_parsed); +} + +//////////////////////////////// +//~ rjf: @demon_os_hooks Main Layer Initialization + +internal void +demon_os_init(void){ + demon_lnx_event_arena = arena_alloc(); +} + +//////////////////////////////// +//~ rjf: @demon_os_hooks Running/Halting + +internal DEMON_EventList +demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){ + DEMON_EventList result = {0}; + + if (demon_ent_root == 0){ + demon_push_event(arena, &result, DEMON_EventKind_NotInitialized); + } + else if (demon_ent_root->first == 0 && !demon_lnx_new_process_pending){ + demon_push_event(arena, &result, DEMON_EventKind_NotAttached); + } + else{ + Temp scratch = scratch_begin(&arena, 1); + + // use queued events if there are any + if (demon_lnx_queued_events.first != 0){ + // copy event queue + for (DEMON_Event *node = demon_lnx_queued_events.first; + node != 0; + node = node->next){ + DEMON_Event *copy = push_array_no_zero(arena, DEMON_Event, 1); + MemoryCopyStruct(copy, node); + SLLQueuePush(result.first, result.last, copy); + } + result.count = demon_lnx_queued_events.count; + + // zero stored queue + MemoryZeroStruct(&demon_lnx_queued_events); + arena_clear(demon_lnx_event_arena); + } + + // get the single step thread (if any) + DEMON_Entity *single_step_thread = controls->single_step_thread; + + // do setup + B32 did_setup = false; + U8 *trap_swap_bytes = 0; + + if (result.first == 0){ + // TODO(allen): per-Architecture implementation of single steps + // set single step bit + if (single_step_thread != 0){ + switch (single_step_thread->arch){ + case Architecture_x86: + { + // TODO(allen): possibly buggy + SYMS_RegX86 regs = {0}; + demon_os_read_regs_x86(single_step_thread, ®s); + regs.eflags.u32 |= 0x100; + demon_os_write_regs_x86(single_step_thread, ®s); + }break; + + case Architecture_x64: + { + // TODO(allen): possibly buggy + SYMS_RegX64 regs = {0}; + demon_os_read_regs_x64(single_step_thread, ®s); + regs.rflags.u64 |= 0x100; + demon_os_write_regs_x64(single_step_thread, ®s); + }break; + } + } + + // TODO(allen): per-Architecture implementation of traps + trap_swap_bytes = push_array_no_zero(scratch.arena, U8, controls->trap_count); + + { + DEMON_OS_Trap *trap = controls->traps; + for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ + if (demon_os_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)){ + U8 int3 = 0xCC; + demon_os_write_memory(trap->process, trap->address, &int3, 1); + } + else{ + trap_swap_bytes[i] = 0xCC; + } + } + } + + did_setup = true; + } + + // do run + B32 did_run = false; + if (did_setup){ + // continue non-frozen threads + DEMON_LNX_EntityNode *resume_threads = 0; + for (DEMON_Entity *process = demon_ent_root->first; + process != 0; + process = process->next){ + if (process->kind == DEMON_EntityKind_Process){ + + // determine if this process is frozen + B32 process_is_frozen = false; + if (controls->run_entities_are_processes){ + for (U64 i = 0; i < controls->run_entity_count; i += 1){ + if (controls->run_entities[i] == process){ + process_is_frozen = true; + break; + } + } + } + + for (DEMON_Entity *thread = process->first; + thread != 0; + thread = thread->next){ + if (thread->kind == DEMON_EntityKind_Thread){ + // determine if this thread is frozen + B32 is_frozen = false; + + if (controls->single_step_thread != 0 && + controls->single_step_thread != thread){ + is_frozen = true; + } + else{ + + if (controls->run_entities_are_processes){ + is_frozen = process_is_frozen; + } + else{ + for (U64 i = 0; i < controls->run_entity_count; i += 1){ + if (controls->run_entities[i] == thread){ + is_frozen = true; + break; + } + } + } + + if (controls->run_entities_are_unfrozen){ + is_frozen = !is_frozen; + } + } + + // continue if not frozen + if (!is_frozen){ + errno = 0; + ptrace(PTRACE_CONT, (pid_t)thread->id, 0, 0); + DEMON_LNX_EntityNode *thread_node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); + SLLStackPush(resume_threads, thread_node); + thread_node->entity = thread; + } + } + } + } + } + + // get next stop + wait_for_stop: + B32 did_dummy_stop = false; + int status = 0; + pid_t wait_id = waitpid(-1, &status, __WALL); + + // increment demon time + demon_time += 1; + + // handle devent + DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, wait_id); + if (thread == 0){ + if (wait_id >= 0){ + // TODO(allen): this isn't a great situation! From what I can tell there's no + // options that I am super happy with for going from unknown tid -> pid. + // We can parse it out of /proc//status; but I don't want to do that until + // I'm forced to, because it seems like this shouldn't happen if the ptrace + // API works correctly and we don't have any bugs in our demon entity system. + } + } + else{ + B32 thread_exit = false; + U64 exit_code = 0; + + DEMON_Entity *process = thread->parent; + // NOTE(allen): hitting this assert should never ever be possible, if our entities + // are wired up correctly. it doesn't matter what ptrace or waitpid are doing. + Assert(process != 0); + + // read register info + U64 instruction_pointer = 0; + union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0}; + + switch (thread->arch){ + case Architecture_x86: + { + demon_os_read_regs_x86(thread, ®s.x86); + instruction_pointer = regs.x86.eip.u32; + }break; + + case Architecture_x64: + { + demon_os_read_regs_x64(thread, ®s.x64); + instruction_pointer = regs.x64.rip.u64; + }break; + } + + // check stop status + if (WIFEXITED(status)){ + thread_exit = true; + } + if (WIFSIGNALED(status)){ + exit_code = WTERMSIG(status); + thread_exit = true; + } + + // extra event list + DEMON_EventList stop_events = {0}; + + if (WIFSTOPPED(status)){ + switch (WSTOPSIG(status)){ + case SIGTRAP: + { + switch (status >> 8){ + case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): + { + // TODO(allen): (not sure actually, study this part) + thread_exit = true; + }break; + + case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): + { + // new thread coming + unsigned long new_tid = 0; + int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid); + if (get_message_result == -1){ + // TODO(allen): this isn't right, time to give up on getting this process. + // this will likely lead to getting unrecognized wait_id s later. So we need + // this stuff in the log to make sense of it still. + } + else{ + // thread entity + DEMON_Entity *new_thread = demon_ent_new(process, DEMON_EntityKind_Thread, new_tid); + demon_thread_count += 1; + DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); + thread_ext->expecting_dummy_sigstop = true; + + // thread event + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(new_thread); + } + }break; + + case (SIGTRAP | (PTRACE_EVENT_FORK << 8)): + case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)): + { + // new process coming + unsigned long new_pid = 0; + int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid); + if (get_message_result == -1){ + // TODO(allen): this isn't right, time to give up on getting this process. + // this will likely lead to getting unrecognized wait_id s later. So we need + // this stuff in the log to make sense of it still. + } + else{ + Architecture arch = demon_lnx_arch_from_pid(new_pid); + + // process entity + DEMON_Entity *new_process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, new_pid); + new_process->arch = arch; + new_process->ext_u64 = demon_lnx_open_memory_fd_for_pid(new_pid); + + demon_lnx_new_process_pending = false; + + // thread entity + DEMON_Entity *new_thread = demon_ent_new(new_process, DEMON_EntityKind_Thread, new_pid); + demon_thread_count += 1; + DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); + thread_ext->expecting_dummy_sigstop = true; + + // process event + { + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateProcess); + e->process = demon_ent_handle_from_ptr(new_process); + } + + // thread event + { + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); + e->process = demon_ent_handle_from_ptr(new_process); + e->thread = demon_ent_handle_from_ptr(new_thread); + } + } + }break; + + default: + { + // check single step + DEMON_EventKind e_kind = DEMON_EventKind_Trap; + if (thread == single_step_thread){ + e_kind = DEMON_EventKind_SingleStep; + } + + // check bp + if (e_kind == DEMON_EventKind_Trap){ + DEMON_OS_Trap *trap = controls->traps; + for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ + if (trap->process == process && trap->address == instruction_pointer - 1){ + e_kind = DEMON_EventKind_Breakpoint; + break; + } + } + } + + // adjust ip after breakpoint + if (e_kind == DEMON_EventKind_Breakpoint){ + // TODO(allen): possibly buggy + switch (thread->arch){ + case Architecture_x86: + { + instruction_pointer -= 1; + regs.x86.eip.u32 = instruction_pointer; + demon_os_write_regs_x86(thread, ®s.x86); + }break; + + case Architecture_x64: + { + instruction_pointer -= 1; + regs.x64.rip.u64 = instruction_pointer; + demon_os_write_regs_x64(thread, ®s.x64); + }break; + } + } + + // event + DEMON_Event *e = demon_push_event(arena, &stop_events, e_kind); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + e->instruction_pointer = instruction_pointer; + }break; + } + }break; + + case SIGSTOP: + { + // TODO(allen): we need to figure out how we want to tell apart: + // SIGSTOP All-Stop, SIGSTOP Halt, SIGSTOP "User" + // what we're doing right now == big-time race conditions + + DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); + + if (thread_ext->expecting_dummy_sigstop){ + thread_ext->expecting_dummy_sigstop = false; + did_dummy_stop = true; + } + else if (demon_lnx_already_has_halt_injection){ + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Halt); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + e->instruction_pointer = instruction_pointer; + } + else{ + // TODO(allen): a signal we don't want to mess with (except to record that it happened maybe) + // we should "hand it back" + } + }break; + + default: + { +#if 0 + // these are a little special. the program cannot continue after these + // unless the user first does something to change the state (move the IP, change a variable, w/e) + case SIGABRT:case SIGFPE:case SIGSEGV: +#endif + + // event + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Exception); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + e->instruction_pointer = instruction_pointer; + e->signo = WSTOPSIG(status); + }break; + } + } + + // entity cleanup + if (thread_exit){ + if (thread->id == process->id){ + // generate events for threads & modules + for (DEMON_Entity *entity = process->first; + entity != 0; + entity = entity->next){ + if (entity->kind == DEMON_EntityKind_Thread){ + DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(entity); + } + else{ + DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule); + e->process = demon_ent_handle_from_ptr(process); + e->module = demon_ent_handle_from_ptr(entity); + } + } + + // exit event + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitProcess); + e->process = demon_ent_handle_from_ptr(process); + e->code = exit_code; + + // free entity + demon_ent_release_root_and_children(process); + } + else{ + // exit event + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + e->code = exit_code; + + // free entity + demon_ent_release_root_and_children(thread); + } + } + + // update all module lists (for each process ...) + DEMON_EventList module_change_events = {0}; + + for (DEMON_Entity *proc_node = demon_ent_root->first; + proc_node != 0; + proc_node = proc_node->next){ + DEMON_LNX_ModuleNode *first_module = demon_lnx_module_list_from_process(scratch.arena, proc_node); + + DEMON_LNX_EntityNode *first_unloaded = 0; + DEMON_LNX_EntityNode *last_unloaded = 0; + + // compute the delta (mark known modules, save list of unloaded modules) + for (DEMON_Entity *entity = proc_node->first; + entity != 0; + entity = entity->next){ + if (entity->kind == DEMON_EntityKind_Module){ + U64 base = entity->id; + U64 name = entity->ext_u64; + B32 still_exists = false; + for (DEMON_LNX_ModuleNode *module_node = first_module; + module_node != 0; + module_node = module_node->next){ + if (module_node->vaddr == base && module_node->name == name){ + module_node->already_known = true; + still_exists = true; + break; + } + } + if (!still_exists){ + DEMON_LNX_EntityNode *node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); + SLLQueuePush(first_unloaded, last_unloaded, node); + node->entity = entity; + } + } + } + + // handle unloads + for (DEMON_LNX_EntityNode *unloaded_node = first_unloaded; + unloaded_node != 0; + unloaded_node = unloaded_node->next){ + DEMON_Entity *module = unloaded_node->entity; + + // event + { + DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_UnloadModule); + e->process = demon_ent_handle_from_ptr(proc_node); + e->module = demon_ent_handle_from_ptr(module); + } + + // free entity + demon_ent_release_root_and_children(module); + } + + // handle loads + for (DEMON_LNX_ModuleNode *module_node = first_module; + module_node != 0; + module_node = module_node->next){ + if (!module_node->already_known){ + // entity + DEMON_Entity *module = demon_ent_new(proc_node, DEMON_EntityKind_Module, module_node->vaddr); + demon_module_count += 1; + module->ext_u64 = module_node->name; + + // event + { + DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_LoadModule); + e->process = demon_ent_handle_from_ptr(proc_node); + e->module = demon_ent_handle_from_ptr(module); + e->address = module_node->vaddr; + e->size = module_node->size; + } + } + } + } + + // concat the events list (with module changes first) + result.count = module_change_events.count + stop_events.count; + result.first = module_change_events.first; + result.last = module_change_events.last; + if (stop_events.first != 0){ + if (result.first != 0){ + result.last->next = stop_events.first; + result.last = stop_events.last; + } + else{ + result.first = stop_events.first; + result.last = stop_events.last; + } + } + } + + // do we have a reason to keep going? + B32 skip_this_stop = false; + if (did_dummy_stop && result.count == 0){ + skip_this_stop = true; + } + + // ignore this stop, resume and wait again + if (skip_this_stop){ + if (wait_id != 0){ + ptrace(PTRACE_CONT, (pid_t)wait_id, 0, 0); + } + goto wait_for_stop; + } + + // stop all running threads + for (DEMON_LNX_EntityNode *node = resume_threads; + node != 0; + node = node->next){ + DEMON_Entity *thread = node->entity; + pid_t thread_id = (pid_t)thread->id; + if (thread_id != wait_id){ + union sigval sv = {0}; + sigqueue(thread_id, SIGSTOP, sv); + + DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); + thread_ext->expecting_dummy_sigstop = true; + } + } + + did_run = true; + } + + // cleanup + if (did_run){ + // TODO(allen): per-Architecture + // unset traps + { + DEMON_OS_Trap *trap = controls->traps; + for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ + U8 og_byte = trap_swap_bytes[i]; + if (og_byte != 0xCC){ + demon_os_write_memory(trap->process, trap->address, &og_byte, 1); + } + } + } + + // TODO(allen): per-Architecture + // unset single step bit + // the single step bit is automatically unset whenever we single step + // but if *something else* happened, it will still be there ready to + // confound us later; so here we're just being sure it's taken out. + if (single_step_thread != 0){ + // TODO(allen): possibly buggy + switch (single_step_thread->arch){ + case Architecture_x86: + { + SYMS_RegX86 regs = {0}; + demon_os_read_regs_x86(single_step_thread, ®s); + regs.eflags.u32 &= ~0x100; + demon_os_write_regs_x86(single_step_thread, ®s); + }break; + + case Architecture_x64: + { + SYMS_RegX64 regs = {0}; + demon_os_read_regs_x64(single_step_thread, ®s); + regs.rflags.u64 &= ~0x100; + demon_os_write_regs_x64(single_step_thread, ®s); + }break; + } + } + } + + scratch_end(scratch); + } + + return(result); +} + +internal void +demon_os_halt(U64 code, U64 user_data){ + if (demon_ent_root != 0 && !demon_lnx_already_has_halt_injection){ + DEMON_Entity *process = demon_ent_root->first; + if (process != 0){ + demon_lnx_already_has_halt_injection = true; + demon_lnx_halt_code = code; + demon_lnx_halt_user_data = user_data; + union sigval sv = {0}; + if (sigqueue(process->id, SIGSTOP, sv) == -1){ + demon_lnx_already_has_halt_injection = false; + } + } + } +} + +// NOTE(allen): siginfo hint from old code: +#if 0 +{ + switch (siginfo.si_code){ + // SI_KERNEL (hit int3; 0xCC) + case 0x80: + { + // TODO(allen): breakpoint event + }break; + + // TRAP_UNK, TRAP_HWBKPT, TRAP_BRKPT, TRAP_TRACE + case 0x5: case 0x4: case 0x1: case 0x2: + { + // TODO(allen): breakpoint event (?) + }break; + + case 0x3: case 0x0: + { + // TODO(allen): do nothing I guess? + }break; + } +} +#endif + +//////////////////////////////// +//~ rjf: @demon_os_hooks Target Process Launching/Attaching/Killing/Detaching/Halting + +internal U32 +demon_os_launch_process(OS_LaunchOptions *options){ + U32 result = 0; + Temp scratch = scratch_begin(0, 0); + + // arrange options + char *binary = 0; + char **args = 0; + if (options->cmd_line.node_count > 0){ + args = push_array_no_zero(scratch.arena, char*, options->cmd_line.node_count + 1); + char **arg_ptr = args; + for (String8Node *node = options->cmd_line.first; + node != 0; + node = node->next, arg_ptr += 1){ + String8 string = push_str8_copy(scratch.arena, node->string); + *arg_ptr = (char*)string.str; + } + *arg_ptr = 0; + binary = args[0]; + } + + char *path = 0; + { + String8 string = push_str8_copy(scratch.arena, options->path); + path = (char*)string.str; + } + + char **env = 0; + if (options->env.node_count > 0){ + env = push_array_no_zero(scratch.arena, char*, options->env.node_count + 1); + char **env_ptr = env; + for (String8Node *node = options->env.first; + node != 0; + node = node->next, env_ptr += 1){ + String8 string = push_str8_copy(scratch.arena, node->string); + *env_ptr = (char*)string.str; + } + *env_ptr = 0; + } + + // fork + if (binary != 0){ + pid_t pid = fork(); + if (pid == -1){ + // TODO(allen): fork error + } + else if (pid == 0){ + // NOTE(allen): child process + int ptrace_result = ptrace(PTRACE_TRACEME, 0, 0, 0); + if (ptrace_result != -1){ + int chdir_result = chdir(path); + if (chdir_result != -1){ + execve(binary, args, env); + } + } + // failed to init fully; abort so the parent can clean up the child + abort(); + } + else{ + // NOTE(allen): parent process + + // wait for child + int status = 0; + pid_t wait_id = waitpid(pid, &status, __WALL); + + // determine child launch status + enum{ + LaunchCode_Null, + LaunchCode_FailBeforePtrace, + LaunchCode_FailAfterPtrace, + LaunchCode_Success, + }; + U32 launch_result = LaunchCode_Null; + // NOTE(allen): if wait_id != pid we don't know what that means; study that case before + // deciding how error handling around it works. + if (wait_id == pid){ + if (WIFSTOPPED(status)){ + if (WSTOPSIG(status) == SIGTRAP){ + launch_result = LaunchCode_Success; + } + else{ + launch_result = LaunchCode_FailAfterPtrace; + } + } + else{ + launch_result = LaunchCode_FailBeforePtrace; + } + } + + // handle launch result + switch (launch_result){ + default: + { + // TODO(allen): error that we do not understand + }break; + + case LaunchCode_FailBeforePtrace: + { + // TODO(allen): child ptrace init failed + }break; + + case LaunchCode_FailAfterPtrace: + { + // need to specifically pull the exit status out of the child + // or it will sit around as a zombie forever since it is ptraced. + B32 cleanup_good = false; + int detach_result = ptrace(PTRACE_DETACH, pid, 0, (void*)SIGCONT); + if (detach_result != -1){ + int status_cleanup = 0; + pid_t wait_id_cleanup = waitpid(pid, &status_cleanup, __WALL); + if (wait_id_cleanup == pid){ + cleanup_good = true; + } + } + if (cleanup_good){ + // TODO(allen): child init failed + } + else{ + // TODO(allen): child init failed; something went wrong and a process may have leaked + } + }break; + + case LaunchCode_Success: + { + int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); + if (setoptions_result == -1){ + // TODO(allen): ptrace setup failed; need to kill the child and clean it up + } + else{ + result = pid; + + Architecture arch = demon_lnx_arch_from_pid(pid); + + // process entity + DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, pid); + demon_proc_count += 1; + process->arch = arch; + process->ext_u64 = demon_lnx_open_memory_fd_for_pid(pid); + + // thread entity + DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, pid); + demon_thread_count += 1; + + // process event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_CreateProcess); + e->process = demon_ent_handle_from_ptr(process); + } + + // thread event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_CreateThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + } + + // get module list + DEMON_LNX_ModuleNode *module_list = demon_lnx_module_list_from_process(scratch.arena, process); + + // for each module ... + for (DEMON_LNX_ModuleNode *node = module_list; + node != 0; + node = node->next){ + // module entity + DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, node->vaddr); + demon_module_count += 1; + module->ext_u64 = node->name; + + // event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_LoadModule); + e->process = demon_ent_handle_from_ptr(process); + e->module = demon_ent_handle_from_ptr(module); + e->address = node->vaddr; + e->size = node->size; + } + } + + // handshake event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_HandshakeComplete); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + } + } + }break; + } + } + } + + scratch_end(scratch); + return(result); +} + +internal B32 +demon_os_attach_process(U32 pid){ + B32 result = false; + + Temp scratch = scratch_begin(0, 0); + DEMON_LNX_AttachNode *attachments = 0; + DEMON_LNX_AttachNode *the_process = 0; + + // TODO(allen): double check that this logic only lets us + // "attach" when pid is the id of the main thread of a process. + + // attach this process + B32 attached_proc = false; + if (kill(pid, 0) == -1){ + // TODO(allen): process does not exist + } + else{ + attached_proc = demon_lnx_attach_pid(scratch.arena, pid, &the_process); + if (the_process != 0){ + SLLStackPush(attachments, the_process); + } + } + + // open thread list + if (attached_proc){ + String8 threads_path = push_str8f(scratch.arena, "/proc/%d/task", pid); + DIR *proc_dir = opendir((char*)threads_path.str); + if (proc_dir == 0){ + // TODO(allen): could not read proc threads somehow; no good! + } + else{ + + // attach all threads + B32 attached_all_threads = true; + for (;;){ + struct dirent *entry = readdir(proc_dir); + if (entry == 0){ + break; + } + + String8 name = str8_cstring(entry->d_name); + if (str8_is_integer(name, 10)){ + pid_t tid = u64_from_str8(name, 10); + if (tid != pid){ + DEMON_LNX_AttachNode *new_attachment = 0; + B32 attached_this_thread = demon_lnx_attach_pid(scratch.arena, tid, &new_attachment); + if (new_attachment != 0){ + SLLStackPush(attachments, new_attachment); + } + if (!attached_this_thread){ + attached_all_threads = false; + break; + } + } + } + } + closedir(proc_dir); + + if (attached_all_threads){ + result = true; + } + } + } + + // initialize new entities on success + if (result){ + Architecture arch = demon_lnx_arch_from_pid(the_process->pid); + + // process entity + DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, the_process->pid); + demon_proc_count += 1; + process->arch = arch; + process->ext_u64 = demon_lnx_open_memory_fd_for_pid(the_process->pid); + + // process event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_CreateProcess); + e->process = demon_ent_handle_from_ptr(process); + } + + // TODO(allen): happens on windows here? + + for (DEMON_LNX_AttachNode *node = attachments; + node != 0; + node = node->next){ + DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, node->pid); + demon_thread_count += 1; + + // thread event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_CreateThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + } + } + + // TODO(allen): sync modules in process + } + + // cleanup on failure + else{ + for (DEMON_LNX_AttachNode *node = attachments; + node != 0; + node = node->next){ + ptrace(PTRACE_DETACH, node->pid, 0, (void*)SIGCONT); + } + } + + scratch_end(scratch); + return(result); +} + +internal B32 +demon_os_kill_process(DEMON_Entity *process, U32 exit_code){ + B32 result = false; + if (process != 0){ + if (kill(process->id, SIGKILL) != -1){ + result = true; + } + } + return(result); +} + +internal B32 +demon_os_detach_process(DEMON_Entity *process){ + B32 result = false; + if (process != 0){ + int detach_result = ptrace(PTRACE_DETACH, process->id, 0, 0); + result = (detach_result != -1); + } + return(0); +} + +//////////////////////////////// +//~ rjf: @demon_os_hooks Entity Functions + +//- rjf: cleanup + +internal void +demon_os_entity_cleanup(DEMON_Entity *entity) +{ + // NOTE(rjf): no-op +} + +//- rjf: introspection + +internal String8 +demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){ + DEMON_Entity *process = module->parent; + int memory_fd = (int)process->ext_u64; + U64 name_va = module->ext_u64; + String8 result = demon_lnx_read_memory_str(arena, memory_fd, name_va); + return(result); +} + +internal U64 +demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread){ + Temp scratch = scratch_begin(0, 0); + + U64 stack_base = 0; + + DEMON_Entity *process = thread->parent; + + // id for main thread is zero + B32 is_main_thread = (thread->id == process->id); + pid_t match_tid = is_main_thread ? 0 : thread->id; + + // open /proc/$pid/maps + int maps = demon_lnx_open_maps(process->id); + + // look for entry with stack markings and matching thread id + for (;;){ + DEMON_LNX_MapsEntry e; + Temp temp = temp_begin(scratch.arena); + if (!demon_lnx_next_map(temp.arena, maps, &e)){ + break; + } + if (e.type == DEMON_LNX_MapsEntryType_Stack && e.stack_tid == match_tid){ + stack_base = e.address_lo; + break; + } + temp_end(temp); + } + + scratch_end(scratch); + return(stack_base); +} + +internal U64 +demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){ + U64 result = 0; + switch (thread->arch){ + case Architecture_x64: + case Architecture_x86: + { + U32 fsbase = 0; + pid_t tid = (pid_t)thread->id; + if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){ + result = (U64)fsbase; + } + if (thread->arch == Architecture_x64){ + result += 8; + } + else{ + result += 4; + } + }break; + } + return(result); +} + +//- rjf: target process memory allocation/protection + +internal U64 +demon_os_reserve_memory(DEMON_Entity *process, U64 size){ + U64 result = 0; + NotImplemented; + return(result); +} + +internal void +demon_os_set_memory_protect_flags(DEMON_Entity *process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags){ + NotImplemented; +} + +internal void +demon_os_release_memory(DEMON_Entity *process, U64 vaddr, U64 size){ + NotImplemented; +} + +//- rjf: target process memory reading/writing + +internal U64 +demon_os_read_memory(DEMON_Entity *process, void *dst, U64 src_address, U64 size){ + int memory_fd = (int)process->ext_u64; + U64 result = demon_lnx_read_memory(memory_fd, dst, src_address, size); + return(result); +} + +internal B32 +demon_os_write_memory(DEMON_Entity *process, U64 dst_address, void *src, U64 size){ + int memory_fd = (int)process->ext_u64; + B32 result = demon_lnx_write_memory(memory_fd, dst_address, src, size); + return(result); +} + +//- rjf: thread registers reading/writing + +internal B32 +demon_os_read_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *dst){ + B32 result = false; + NotImplemented; + return(result); +} + +internal B32 +demon_os_write_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *src){ + B32 result = false; + NotImplemented; + return(result); +} + +internal B32 +demon_os_read_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *dst){ + pid_t tid = (pid_t)thread->id; + + // gpr + B32 got_gpr = false; + DEMON_LNX_UserX64 ctx = {0}; + struct iovec iov_gpr = {0}; + iov_gpr.iov_len = sizeof(ctx); + iov_gpr.iov_base = &ctx; + if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr) != -1){ + demon_lnx_regs_x64_from_usr_regs_x64(dst, &ctx.regs); + got_gpr = true; + } + + // fpr + B32 got_fpr = false; + if (got_gpr){ + B32 got_xsave = false; + { + U8 xsave_buffer[KB(4)]; + struct iovec iov_xsave = {0}; + iov_xsave.iov_len = sizeof(xsave_buffer); + iov_xsave.iov_base = xsave_buffer; + if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave) != -1){ + SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; + syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &xsave->legacy); + + // TODO(allen): this is a lie; ymm can technically move around + // we need some more low-level-assembly-fu to do this hardcore. + B32 has_ymm_registers = ((xsave->header.xstate_bv & 4) != 0); + if (has_ymm_registers){ + syms_x64_regs__set_full_regs_from_xsave_avx_extension(dst, xsave->ymmh); + } + + got_xsave = true; + } + } + + B32 got_fxsave = false; + if (!got_xsave){ + SYMS_XSaveLegacy fxsave = {0}; + struct iovec iov_fxsave = {0}; + iov_fxsave.iov_len = sizeof(fxsave); + iov_fxsave.iov_base = &fxsave; + if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave) != -1){ + syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &fxsave); + got_fxsave = true; + } + } + + if (got_xsave || got_fxsave){ + got_fpr = true; + } + } + + // debug + B32 got_debug = false; + if (got_fpr){ + got_debug = true; + SYMS_Reg32 *dr_d = &dst->dr0; + for (U32 i = 0; i < 8; i += 1, dr_d += 1){ + if (i != 4 && i != 5){ + U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); + errno = 0; + int peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0); + if (errno == 0){ + dr_d->u32 = (U32)peek_result; + } + else{ + got_debug = false; + } + } + } + } + + // got everything + B32 result = got_debug; + return(result); +} + +internal B32 +demon_os_write_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *src){ + pid_t tid = (pid_t)thread->id; + + // gpr + DEMON_LNX_UserX64 ctx = {0}; + demon_lnx_usr_regs_x64_from_regs_x64(&ctx.regs, src); + + struct iovec iov_gpr = {0}; + iov_gpr.iov_base = &ctx; + iov_gpr.iov_len = sizeof(ctx); + int gpr_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr); + B32 gpr_success = (gpr_result != -1); + + // fpr + int xsave_result = 0; + int fxsave_result = 0; + + { + U8 xsave_buffer[KB(4)] = {0}; + SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; + syms_x64_regs__set_xsave_legacy_from_full_regs(&xsave->legacy, src); + + xsave->header.xstate_bv = 7; + + // TODO(allen): this is a lie; ymm can technically move around + // we need some more low-level-assembly-fu to do this hardcore. + syms_x64_regs__set_xsave_avx_extension_from_full_regs(xsave->ymmh, src); + + { + struct iovec iov_xsave = {0}; + iov_xsave.iov_base = &xsave; + iov_xsave.iov_len = sizeof(xsave); + xsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave); + } + + if (xsave_result == -1){ + struct iovec iov_fxsave = {0}; + iov_fxsave.iov_base = &xsave->legacy; + iov_fxsave.iov_len = sizeof(xsave->legacy); + fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave); + } + } + + B32 fpr_success = (xsave_result != -1 || fxsave_result != -1); + + // debug + B32 dr_success = true; + { + SYMS_Reg32 *dr_s = &src->dr0; + for (U32 i = 0; i < 8; i += 1, dr_s += 1){ + if (i != 4 && i != 5){ + U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); + errno = 0; + int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s->u32); + if (poke_result == -1){ + dr_success = false; + } + } + } + } + + // assemble result + B32 result = (gpr_success && fpr_success && dr_success); + + return(result); +} + +//////////////////////////////// +//~ rjf: @demon_os_hooks Process Listing + +internal void +demon_os_proc_iter_begin(DEMON_ProcessIter *iter){ + DIR *dir = opendir("/proc"); + MemoryZeroStruct(iter); + iter->v[0] = IntFromPtr(dir); +} + +internal B32 +demon_os_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out){ + // scan for a process id + B32 got_pid = false; + String8 pid_string = {0}; + + DIR *dir = (DIR*)PtrFromInt(iter->v[0]); + if (dir != 0 && iter->v[1] == 0){ + for (;;){ + struct dirent *d = readdir(dir); + if (d == 0){ + break; + } + + // check file name is integer + String8 file_name = str8_cstring((char*)d->d_name); + B32 is_integer = str8_is_integer(file_name, 10); + + // break on integers (which represent processes) + if (is_integer){ + got_pid = true; + pid_string = file_name; + break; + } + } + } + + // mark iterator dead if nothing found + if (!got_pid){ + iter->v[1] = 1; + } + + // if got process id convert pid -> process info + B32 result = false; + if (got_pid){ + // determine the name we will report + pid_t pid = u64_from_str8(pid_string, 10); + String8 name = demon_lnx_executable_path_from_pid(arena, pid); + if (name.size == 0){ + name = str8_lit(""); + } + + // finish conversion + info_out->name = name; + info_out->pid = pid; + result = true; + } + + return(result); +} + +internal void +demon_os_proc_iter_end(DEMON_ProcessIter *iter){ + DIR *dir = (DIR*)PtrFromInt(iter->v[0]); + if (dir != 0){ + closedir(dir); + } + MemoryZeroStruct(iter); +} diff --git a/src/demon/linux/demon_os_linux.h b/src/demon/linux/demon_os_linux.h new file mode 100644 index 00000000..4e039e35 --- /dev/null +++ b/src/demon/linux/demon_os_linux.h @@ -0,0 +1,222 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON_OS_LINUX_H +#define DEMON_OS_LINUX_H + +// TODO(allen): Potential Upgrades: +// +// memory fd upgrade - Right now for each process we hold open a file +// descriptor for the process's memory (/proc/%d/mem) for the entire lifetime +// of the process; it could be opened and closed with some kind of LRU cache +// to put a finite cap on the number of handles the demon holds +// + +//////////////////////////////// +//~ NOTE(allen): Get The Linux Includes + +#include +#include +#include +#include +#include +#include +#include + +//////////////////////////////// +//~ NOTE(allen): Linux Demon Types + +//- entities + +// Demon Linux Entity Extensions +// Process: ext_u64 set to memory file descriptor +// Thread : ext_u64 cast to DEMON_LNX_ThreadExt +// Module : ext_u64 set to U64 (address of name) + +struct DEMON_LNX_ThreadExt{ + B32 expecting_dummy_sigstop; +}; +StaticAssert(sizeof(DEMON_LNX_ThreadExt) <= sizeof(Member(DEMON_Entity, ext_u64)), check_demon_lnx_thread_ext); + +//- helpers + +struct DEMON_LNX_AttachNode{ + DEMON_LNX_AttachNode *next; + pid_t pid; +}; + +struct DEMON_LNX_ProcessAux{ + B32 filled; + U64 phnum; + U64 phent; + U64 phdr; + U64 execfn; +}; + +struct DEMON_LNX_PhdrInfo{ + Rng1U64 range; + U64 dynamic; +}; + +struct DEMON_LNX_ModuleNode{ + DEMON_LNX_ModuleNode *next; + U64 vaddr; + U64 size; + U64 name; + U64 already_known; +}; + +struct DEMON_LNX_EntityNode{ + DEMON_LNX_EntityNode *next; + DEMON_Entity *entity; +}; + +//////////////////////////////// +//~ NOTE(allen): Linux Demon Register Layouts + +// these are defined in but only for one architecture at a time +// (and we can't really trick it into giving us both in any obvious way) +// we define them here so that we have them all "at once" + +struct DEMON_LNX_UserRegsX64{ + U64 r15; + U64 r14; + U64 r13; + U64 r12; + U64 rbp; + U64 rbx; + U64 r11; + U64 r10; + U64 r9; + U64 r8; + U64 rax; + U64 rcx; + U64 rdx; + U64 rsi; + U64 rdi; + U64 orig_rax; + U64 rip; + U64 cs; + U64 rflags; + U64 rsp; + U64 ss; + U64 fsbase; + U64 gsbase; + U64 ds; + U64 es; + U64 fs; + U64 gs; +}; + +struct DEMON_LNX_UserX64{ + DEMON_LNX_UserRegsX64 regs; + S32 u_fpvalid, _pad0; + SYMS_XSaveLegacy i387; + U64 u_tsize, u_dsize, u_ssize, start_code, start_stack; + U64 signal; + S32 reserved, _pad1; + U64 u_ar0, u_fpstate; + U64 magic; + U8 u_comm[32]; + U64 u_debugreg[8]; +}; + +struct DEMON_LNX_UserRegsX86{ + U32 ebx; + U32 ecx; + U32 edx; + U32 esi; + U32 edi; + U32 ebp; + U32 eax; + U32 ds; + U32 es; + U32 fs; + U32 gs; + U32 orig_eax; + U32 eip; + U32 cs; + U32 eflags; + U32 sp; + U32 ss; +}; + +struct DEMON_LNX_UserX86{ + DEMON_LNX_UserRegsX86 regs; + S32 u_fpvalid; + SYMS_FSave i387; + U32 u_tsize, u_dsize, u_ssize, start_code, start_stack; + S32 signal, reserved; + U32 u_ar0, u_fpstate; + U32 magic; + U8 u_comm[32]; + U32 u_debugreg[8]; +}; + +//////////////////////////////// + +enum +{ + DEMON_LNX_PermFlags_Read = (1 << 0), + DEMON_LNX_PermFlags_Write = (1 << 1), + DEMON_LNX_PermFlags_Exec = (1 << 2), + DEMON_LNX_PermFlags_Private = (1 << 3) +}; +typedef int DEMON_LNX_PermFlags; + +enum +{ + DEMON_LNX_MapsEntryType_Null, + DEMON_LNX_MapsEntryType_Path, + DEMON_LNX_MapsEntryType_Heap, + DEMON_LNX_MapsEntryType_Stack, + DEMON_LNX_MapsEntryType_VDSO, +}; +typedef int DEMON_LNX_MapsEntryType; + +struct DEMON_LNX_MapsEntry +{ + U64 address_lo; + U64 address_hi; + DEMON_LNX_PermFlags perms; + U64 offset; + U32 dev_major; + U32 dev_minor; + U64 inode; + String8 pathname; + DEMON_LNX_MapsEntryType type; + pid_t stack_tid; +}; + +//////////////////////////////// +//~ rjf: Helpers + +internal DEMON_LNX_ThreadExt* demon_lnx_thread_ext(DEMON_Entity *entity); + +internal B32 demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node); + +internal String8 demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid); +internal int demon_lnx_open_memory_fd_for_pid(pid_t pid); + +internal Architecture demon_lnx_arch_from_pid(pid_t pid); +internal DEMON_LNX_ProcessAux demon_lnx_aux_from_pid(pid_t pid, Architecture arch); +internal DEMON_LNX_PhdrInfo demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, + U64 phvaddr, U64 phstride, U64 phcount); +internal DEMON_LNX_ModuleNode* demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process); + +internal U64 demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size); +internal B32 demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size); +internal String8 demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address); + +internal void demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src); +internal void demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src); + +internal String8 demon_lnx_read_int_string(int fd); +internal B32 demon_lnx_read_expect(int fd, char expect); +internal int demon_lnx_read_whitespace(int fd); +internal String8 demon_lnx_read_string(Arena *arena, int fd); + +internal int demon_lnx_open_maps(pid_t pid); +internal B32 demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out); + +#endif //DEMON_OS_LINUX_H From 0ead1c034c43e87da1ed107b24ac02ced475de63 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 14:58:25 -0700 Subject: [PATCH 251/275] eliminate old dasm layer, since we're all caught up with dasm_cache --- src/dasm/dasm.c | 542 ------------------------------------- src/dasm/dasm.h | 207 -------------- src/df/core/df_core.c | 10 - src/df/core/df_core.h | 3 - src/df/gfx/df_gfx.c | 10 - src/df/gfx/df_gfx.h | 1 - src/raddbg/raddbg_main.cpp | 2 - 7 files changed, 775 deletions(-) delete mode 100644 src/dasm/dasm.c delete mode 100644 src/dasm/dasm.h diff --git a/src/dasm/dasm.c b/src/dasm/dasm.c deleted file mode 100644 index c96a4322..00000000 --- a/src/dasm/dasm.c +++ /dev/null @@ -1,542 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -dasmi_init(void) -{ - Arena *arena = arena_alloc(); - dasmi_shared = push_array(arena, DASMI_Shared, 1); - dasmi_shared->arena = arena; - dasmi_shared->entity_map.slots_count = 1024; - dasmi_shared->entity_map.slots = push_array(arena, DASMI_EntitySlot, dasmi_shared->entity_map.slots_count); - dasmi_shared->entity_map_stripes.count = 64; - dasmi_shared->entity_map_stripes.v = push_array(arena, DASMI_Stripe, dasmi_shared->entity_map_stripes.count); - for(U64 idx = 0; idx < dasmi_shared->entity_map_stripes.count; idx += 1) - { - dasmi_shared->entity_map_stripes.v[idx].arena = arena_alloc(); - dasmi_shared->entity_map_stripes.v[idx].rw_mutex = os_rw_mutex_alloc(); - dasmi_shared->entity_map_stripes.v[idx].cv = os_condition_variable_alloc(); - } - dasmi_shared->u2d_ring_mutex = os_mutex_alloc(); - dasmi_shared->u2d_ring_cv = os_condition_variable_alloc(); - dasmi_shared->u2d_ring_size = KB(64); - dasmi_shared->u2d_ring_base = push_array_no_zero(arena, U8, dasmi_shared->u2d_ring_size); - dasmi_shared->decode_thread_count = Max(1, os_logical_core_count()-1); - dasmi_shared->decode_threads = push_array(arena, OS_Handle, dasmi_shared->decode_thread_count); - for(U64 idx = 0; idx < dasmi_shared->decode_thread_count; idx += 1) - { - dasmi_shared->decode_threads[idx] = os_launch_thread(dasmi_decode_thread_entry_point, (void *)idx, 0); - } -} - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -dasmi_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -//////////////////////////////// -//~ rjf: Instruction Type Functions - -internal void -dasmi_inst_chunk_list_push(Arena *arena, DASMI_InstChunkList *list, U64 cap, DASMI_Inst *inst) -{ - DASMI_InstChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, DASMI_InstChunkNode, 1); - node->v = push_array_no_zero(arena, DASMI_Inst, cap); - node->cap = cap; - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - } - MemoryCopyStruct(&node->v[node->count], inst); - node->count += 1; - list->inst_count += 1; -} - -internal DASMI_InstArray -dasmi_inst_array_from_chunk_list(Arena *arena, DASMI_InstChunkList *list) -{ - DASMI_InstArray array = {0}; - array.count = list->inst_count; - array.v = push_array_no_zero(arena, DASMI_Inst, array.count); - U64 idx = 0; - for(DASMI_InstChunkNode *n = list->first; n != 0; n = n->next) - { - MemoryCopy(array.v+idx, n->v, sizeof(DASMI_Inst)*n->count); - idx += n->count; - } - return array; -} - -internal U64 -dasmi_inst_array_idx_from_off__linear_scan(DASMI_InstArray *array, U64 off) -{ - U64 result = 0; - for(U64 idx = 0; idx < array->count; idx += 1) - { - if(array->v[idx].off == off) - { - result = idx; - break; - } - } - return result; -} - -internal U64 -dasmi_inst_array_off_from_idx(DASMI_InstArray *array, U64 idx) -{ - U64 off = 0; - if(idx < array->count) - { - off = array->v[idx].off; - } - return off; -} - -//////////////////////////////// -//~ rjf: Disassembly Functions - -#if 0 -#include "third_party/udis86/config.h" -#include "third_party/udis86/udis86.h" -#include "third_party/udis86/libudis86/decode.c" -#include "third_party/udis86/libudis86/itab.c" -#include "third_party/udis86/libudis86/syn-att.c" -#include "third_party/udis86/libudis86/syn-intel.c" -#include "third_party/udis86/libudis86/syn.c" -#include "third_party/udis86/libudis86/udis86.c" -#endif - -internal DASMI_InstChunkList -dasmi_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data) -{ - DASMI_InstChunkList inst_list = {0}; - switch(arch) - { - default:{}break; - - //- rjf: x86/x64 decoding - case Architecture_x64: - case Architecture_x86: - { - // rjf: grab context - struct ud udc; - ud_init(&udc); - ud_set_mode(&udc, bit_size_from_arch(arch)); - ud_set_pc(&udc, addr); - ud_set_input_buffer(&udc, data.str, data.size); - ud_set_vendor(&udc, UD_VENDOR_ANY); - ud_set_syntax(&udc, UD_SYN_INTEL); - - // rjf: disassemble - U64 byte_process_start_off = 0; - for(U64 off = 0; off < data.size;) - { - // rjf: disassemble one instruction - U64 size = ud_disassemble(&udc); - if(size == 0) - { - break; - } - - // rjf: analyze - struct ud_operand *first_op = (struct ud_operand *)ud_insn_opr(&udc, 0); - U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(&udc, first_op) : 0; - - // rjf: push - String8 string = push_str8f(arena, "%s", udc.asm_buf); - DASMI_Inst inst = {string, off, rel_voff}; - dasmi_inst_chunk_list_push(arena, &inst_list, 1024, &inst); - - // rjf: increment - off += size; - if(bytes_processed_counter != 0 && (off-byte_process_start_off >= 1000)) - { - ins_atomic_u64_add_eval(bytes_processed_counter, (off-byte_process_start_off)); - byte_process_start_off = off; - } - } - }break; - } - return inst_list; -} - -//////////////////////////////// -//~ rjf: Cache Lookups - -//- rjf: opening handles & correllation with module - -internal DASMI_Handle -dasmi_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range, Architecture arch) -{ - DASMI_Handle result = {0}; - if(machine != 0 && process.u64[0] != 0) - { - U64 hash = dasmi_hash_from_string(str8_struct(&process)); - U64 slot_idx = hash%dasmi_shared->entity_map.slots_count; - U64 stripe_idx = slot_idx%dasmi_shared->entity_map_stripes.count; - DASMI_EntitySlot *slot = &dasmi_shared->entity_map.slots[slot_idx]; - DASMI_Stripe *stripe = &dasmi_shared->entity_map_stripes.v[stripe_idx]; - OS_MutexScopeW(stripe->rw_mutex) - { - DASMI_Entity *entity = 0; - for(DASMI_Entity *e = slot->first; e != 0; e = e->next) - { - if(e->machine_id == machine && - dmn_handle_match(e->process, process) && - MemoryMatchStruct(&e->vaddr_range, &vaddr_range) && - e->arch == arch) - { - entity = e; - break; - } - } - if(entity == 0) - { - entity = push_array(stripe->arena, DASMI_Entity, 1); - SLLQueuePush(slot->first, slot->last, entity); - entity->machine_id = machine; - entity->process = process; - entity->vaddr_range= vaddr_range; - entity->arch = arch; - entity->id = ins_atomic_u64_inc_eval(&dasmi_shared->entity_id_gen); - entity->decode_inst_arena = arena_alloc__sized(MB(256), KB(64)); - entity->decode_string_arena = arena_alloc__sized(GB(1), KB(64)); - } - result.u64[0] = hash; - result.u64[1] = entity->id; - } - } - return result; -} - -//- rjf: asking for top-level info of a handle - -internal DASMI_BinaryInfo -dasmi_binary_info_from_handle(Arena *arena, DASMI_Handle handle) -{ - DASMI_BinaryInfo info = {0}; - { - U64 hash = handle.u64[0]; - U64 id = handle.u64[1]; - U64 slot_idx = hash%dasmi_shared->entity_map.slots_count; - U64 stripe_idx = slot_idx%dasmi_shared->entity_map_stripes.count; - DASMI_EntitySlot *slot = &dasmi_shared->entity_map.slots[slot_idx]; - DASMI_Stripe *stripe = &dasmi_shared->entity_map_stripes.v[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) - { - DASMI_Entity *entity = 0; - for(DASMI_Entity *e = slot->first; e != 0; e = e->next) - { - if(e->id == id) - { - entity = e; - break; - } - } - if(entity != 0) - { - info.machine_id = entity->machine_id; - info.process = entity->process; - info.vaddr_range = entity->vaddr_range; - info.bytes_processed = ins_atomic_u64_eval(&entity->bytes_processed); - info.bytes_to_process = ins_atomic_u64_eval(&entity->bytes_to_process); - } - } - } - return info; -} - -//- rjf: asking for decoded instructions - -internal DASMI_InstArray -dasmi_inst_array_from_handle(Arena *arena, DASMI_Handle handle, U64 endt_us) -{ - DASMI_InstArray result = {0}; - if(handle.u64[0] != 0 || handle.u64[1] != 0) - { - U64 hash = handle.u64[0]; - U64 id = handle.u64[1]; - U64 slot_idx = hash%dasmi_shared->entity_map.slots_count; - U64 stripe_idx = slot_idx%dasmi_shared->entity_map_stripes.count; - DASMI_EntitySlot *slot = &dasmi_shared->entity_map.slots[slot_idx]; - DASMI_Stripe *stripe = &dasmi_shared->entity_map_stripes.v[stripe_idx]; - B32 sent = 0; - OS_MutexScopeR(stripe->rw_mutex) for(;;) - { - DASMI_Entity *entity = 0; - for(DASMI_Entity *e = slot->first; e != 0; e = e->next) - { - if(e->id == id) - { - entity = e; - break; - } - } - U64 last_time_sent_us = 0; - if(entity != 0) - { - U64 bytes_processed = ins_atomic_u64_eval(&entity->bytes_processed); - U64 bytes_to_process = ins_atomic_u64_eval(&entity->bytes_to_process); - last_time_sent_us = ins_atomic_u64_eval(&entity->last_time_sent_us); - if(bytes_processed == bytes_to_process && bytes_processed != 0) - { - result.count = entity->decode_inst_array.count; - result.v = push_array_no_zero(arena, DASMI_Inst, result.count); - MemoryCopy(result.v, entity->decode_inst_array.v, sizeof(DASMI_Inst)*result.count); - for(U64 idx = 0; idx < result.count; idx += 1) - { - result.v[idx].string = push_str8_copy(arena, result.v[idx].string); - } - break; - } - } - if(!sent && entity != 0 && last_time_sent_us+10000 <= os_now_microseconds()) - { - DASMI_DecodeRequest req = {handle}; - sent = dasmi_u2d_enqueue_request(&req, endt_us); - ins_atomic_u64_eval_assign(&entity->last_time_sent_us, os_now_microseconds()); - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Decode Threads - -internal B32 -dasmi_u2d_enqueue_request(DASMI_DecodeRequest *req, U64 endt_us) -{ - B32 result = 0; - OS_MutexScope(dasmi_shared->u2d_ring_mutex) for(;;) - { - U64 unconsumed_size = (dasmi_shared->u2d_ring_write_pos-dasmi_shared->u2d_ring_read_pos); - U64 available_size = (dasmi_shared->u2d_ring_size-unconsumed_size); - if(available_size >= sizeof(*req)) - { - result = 1; - dasmi_shared->u2d_ring_write_pos += ring_write_struct(dasmi_shared->u2d_ring_base, dasmi_shared->u2d_ring_size, dasmi_shared->u2d_ring_write_pos, req); - dasmi_shared->u2d_ring_write_pos += 7; - dasmi_shared->u2d_ring_write_pos -= dasmi_shared->u2d_ring_write_pos%8; - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait(dasmi_shared->u2d_ring_cv, dasmi_shared->u2d_ring_mutex, endt_us); - } - if(result) - { - os_condition_variable_broadcast(dasmi_shared->u2d_ring_cv); - } - return result; -} - -internal DASMI_DecodeRequest -dasmi_u2d_dequeue_request(void) -{ - DASMI_DecodeRequest req = {0}; - OS_MutexScope(dasmi_shared->u2d_ring_mutex) for(;;) - { - U64 unconsumed_size = (dasmi_shared->u2d_ring_write_pos-dasmi_shared->u2d_ring_read_pos); - if(unconsumed_size >= sizeof(DASMI_DecodeRequest)) - { - dasmi_shared->u2d_ring_read_pos += ring_read_struct(dasmi_shared->u2d_ring_base, dasmi_shared->u2d_ring_size, dasmi_shared->u2d_ring_read_pos, &req); - dasmi_shared->u2d_ring_read_pos += 7; - dasmi_shared->u2d_ring_read_pos -= dasmi_shared->u2d_ring_read_pos%8; - break; - } - os_condition_variable_wait(dasmi_shared->u2d_ring_cv, dasmi_shared->u2d_ring_mutex, max_U64); - } - os_condition_variable_broadcast(dasmi_shared->u2d_ring_cv); - return req; -} - -internal void -dasmi_decode_thread_entry_point(void *p) -{ - for(;;) - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: get next request & unpack - DASMI_DecodeRequest req = dasmi_u2d_dequeue_request(); - DASMI_Handle handle = req.handle; - U64 hash = handle.u64[0]; - U64 id = handle.u64[1]; - U64 slot_idx = hash%dasmi_shared->entity_map.slots_count; - U64 stripe_idx = slot_idx%dasmi_shared->entity_map_stripes.count; - DASMI_EntitySlot *slot = &dasmi_shared->entity_map.slots[slot_idx]; - DASMI_Stripe *stripe = &dasmi_shared->entity_map_stripes.v[stripe_idx]; - - //- rjf: request -> ctrl info - B32 is_first_to_task = 0; - CTRL_MachineID ctrl_machine_id = 0; - DMN_Handle ctrl_process = {0}; - Rng1U64 vaddr_range = {0}; - Architecture arch = Architecture_Null; - U64 *bytes_processed_counter = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - DASMI_Entity *entity = 0; - for(DASMI_Entity *e = slot->first; e != 0; e = e->next) - { - if(e->id == id) - { - entity = e; - break; - } - } - if(entity != 0) - { - U64 initial_working_count = ins_atomic_u32_eval_cond_assign(&entity->working_count, 1, 0); - if(initial_working_count == 0) - { - is_first_to_task = 1; - ctrl_machine_id = entity->machine_id; - ctrl_process = entity->process; - vaddr_range = entity->vaddr_range; - arch = entity->arch; - bytes_processed_counter = &entity->bytes_processed; - U64 bytes_to_process = dim_1u64(vaddr_range); - ins_atomic_u64_eval_assign(&entity->bytes_processed, 0); - ins_atomic_u64_eval_assign(&entity->bytes_to_process, bytes_to_process); - } - } - } - - //- rjf: bad handle or machine id -> bad task - B32 good_task = (is_first_to_task && ctrl_process.u64[0] != 0 && ctrl_machine_id != 0 && arch != Architecture_Null && bytes_processed_counter != 0); - - //- rjf: good task -> clear entity's info - if(good_task) - { - OS_MutexScopeW(stripe->rw_mutex) - { - DASMI_Entity *entity = 0; - for(DASMI_Entity *e = slot->first; e != 0; e = e->next) - { - if(e->id == id) - { - entity = e; - break; - } - } - if(entity != 0) - { - arena_clear(entity->decode_inst_arena); - arena_clear(entity->decode_string_arena); - MemoryZeroStruct(&entity->decode_inst_array); - } - } - } - - //- rjf: good task -> read process memory & decode instructions - stop each - // 4k and write into cache, so users can read incremental results - if(good_task) - { - U64 chunk_size = KB(4); - for(U64 off = 0; vaddr_range.min+off < vaddr_range.max; off += chunk_size) - { - Rng1U64 chunk_vaddr_range = r1u64(vaddr_range.min+off, vaddr_range.min+off+chunk_size); - chunk_vaddr_range.min = ClampTop(chunk_vaddr_range.min, vaddr_range.max); - chunk_vaddr_range.max = ClampTop(chunk_vaddr_range.max, vaddr_range.max); - - //- rjf: read next chunk & decode - String8 data = {0}; - DASMI_InstChunkList inst_list = {0}; - if(good_task) - { - data.str = push_array_no_zero(scratch.arena, U8, dim_1u64(chunk_vaddr_range)); - data.size = dmn_process_read(ctrl_process, chunk_vaddr_range, data.str); - if(data.size != 0) - { - inst_list = dasmi_inst_chunk_list_from_arch_addr_data(scratch.arena, bytes_processed_counter, arch, chunk_vaddr_range.min, data); - } - } - - //- rjf: write into cache - { - OS_MutexScopeW(stripe->rw_mutex) - { - DASMI_Entity *entity = 0; - for(DASMI_Entity *e = slot->first; e != 0; e = e->next) - { - if(e->id == id) - { - entity = e; - break; - } - } - if(entity != 0) - { - DASMI_Inst *new_chunk_base = push_array(entity->decode_inst_arena, DASMI_Inst, inst_list.inst_count); - U64 off = 0; - for(DASMI_InstChunkNode *node = inst_list.first; node != 0; node = node->next) - { - MemoryCopy(new_chunk_base+off, node->v, sizeof(DASMI_Inst)*node->count); - off += node->count; - } - for(U64 idx = 0; idx < inst_list.inst_count; idx += 1) - { - new_chunk_base[idx].string = push_str8_copy(entity->decode_string_arena, new_chunk_base[idx].string); - } - entity->decode_inst_array.count += inst_list.inst_count; - if(entity->decode_inst_array.v == 0) - { - entity->decode_inst_array.v = new_chunk_base; - } - } - } - os_condition_variable_broadcast(stripe->cv); - } - } - } - - //- rjf: mark task as complete - if(good_task) - { - OS_MutexScopeR(stripe->rw_mutex) - { - DASMI_Entity *entity = 0; - for(DASMI_Entity *e = slot->first; e != 0; e = e->next) - { - if(e->id == id) - { - entity = e; - break; - } - } - if(entity != 0) - { - U64 bytes_to_process = ins_atomic_u64_eval(&entity->bytes_to_process); - ins_atomic_u64_eval_assign(&entity->bytes_processed, bytes_to_process); - ins_atomic_u64_eval_assign(&entity->working_count, 0); - } - } - } - - scratch_end(scratch); - } -} diff --git a/src/dasm/dasm.h b/src/dasm/dasm.h deleted file mode 100644 index 840fff0e..00000000 --- a/src/dasm/dasm.h +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DASM_H -#define DASM_H - -//////////////////////////////// -//~ rjf: Handle Type - -typedef struct DASMI_Handle DASMI_Handle; -struct DASMI_Handle -{ - U64 u64[2]; -}; - -//////////////////////////////// -//~ rjf: Instruction Types - -typedef struct DASMI_Inst DASMI_Inst; -struct DASMI_Inst -{ - String8 string; - U64 off; - U64 addr; -}; - -typedef struct DASMI_InstChunkNode DASMI_InstChunkNode; -struct DASMI_InstChunkNode -{ - DASMI_InstChunkNode *next; - DASMI_Inst *v; - U64 cap; - U64 count; -}; - -typedef struct DASMI_InstChunkList DASMI_InstChunkList; -struct DASMI_InstChunkList -{ - DASMI_InstChunkNode *first; - DASMI_InstChunkNode *last; - U64 node_count; - U64 inst_count; -}; - -typedef struct DASMI_InstArray DASMI_InstArray; -struct DASMI_InstArray -{ - DASMI_Inst *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Striped Access Types - -typedef struct DASMI_Stripe DASMI_Stripe; -struct DASMI_Stripe -{ - Arena *arena; - OS_Handle cv; - OS_Handle rw_mutex; -}; - -typedef struct DASMI_StripeTable DASMI_StripeTable; -struct DASMI_StripeTable -{ - U64 count; - DASMI_Stripe *v; -}; - -//////////////////////////////// -//~ rjf: Entity Cache Types - -typedef struct DASMI_Entity DASMI_Entity; -struct DASMI_Entity -{ - DASMI_Entity *next; - - // rjf: key info - CTRL_MachineID machine_id; - DMN_Handle process; - Rng1U64 vaddr_range; - Architecture arch; - U64 id; - - // rjf: top-level info - U64 last_time_sent_us; - U64 working_count; - U64 bytes_processed; - U64 bytes_to_process; - - // rjf: decoded instruction data - Arena *decode_inst_arena; - Arena *decode_string_arena; - DASMI_InstArray decode_inst_array; -}; - -typedef struct DASMI_EntitySlot DASMI_EntitySlot; -struct DASMI_EntitySlot -{ - DASMI_Entity *first; - DASMI_Entity *last; -}; - -typedef struct DASMI_EntityMap DASMI_EntityMap; -struct DASMI_EntityMap -{ - U64 slots_count; - DASMI_EntitySlot *slots; -}; - -//////////////////////////////// -//~ rjf: Introspection Info Types - -typedef struct DASMI_BinaryInfo DASMI_BinaryInfo; -struct DASMI_BinaryInfo -{ - CTRL_MachineID machine_id; - DMN_Handle process; - Rng1U64 vaddr_range; - U64 bytes_processed; - U64 bytes_to_process; -}; - -//////////////////////////////// -//~ rjf: Decode Request Types - -typedef struct DASMI_DecodeRequest DASMI_DecodeRequest; -struct DASMI_DecodeRequest -{ - DASMI_Handle handle; -}; - -//////////////////////////////// -//~ rjf: Shared State - -typedef struct DASMI_Shared DASMI_Shared; -struct DASMI_Shared -{ - Arena *arena; - - // rjf: entity table - DASMI_EntityMap entity_map; - DASMI_StripeTable entity_map_stripes; - U64 entity_id_gen; - - // rjf: user -> decode ring - OS_Handle u2d_ring_mutex; - OS_Handle u2d_ring_cv; - U64 u2d_ring_size; - U8 *u2d_ring_base; - U64 u2d_ring_write_pos; - U64 u2d_ring_read_pos; - - // rjf: decode threads - U64 decode_thread_count; - OS_Handle *decode_threads; -}; - -//////////////////////////////// -//~ rjf: Globals - -global DASMI_Shared *dasmi_shared = 0; - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void dasmi_init(void); - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 dasmi_hash_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Instruction Type Functions - -internal void dasmi_inst_chunk_list_push(Arena *arena, DASMI_InstChunkList *list, U64 cap, DASMI_Inst *inst); -internal DASMI_InstArray dasmi_inst_array_from_chunk_list(Arena *arena, DASMI_InstChunkList *list); -internal U64 dasmi_inst_array_idx_from_off__linear_scan(DASMI_InstArray *array, U64 off); -internal U64 dasmi_inst_array_off_from_idx(DASMI_InstArray *array, U64 idx); - -//////////////////////////////// -//~ rjf: Disassembly Functions - -internal DASMI_InstChunkList dasmi_inst_chunk_list_from_arch_addr_data(Arena *arena, U64 *bytes_processed_counter, Architecture arch, U64 addr, String8 data); - -//////////////////////////////// -//~ rjf: Cache Lookups - -//- rjf: opening handles & correllation with module -internal DASMI_Handle dasmi_handle_from_ctrl_process_range_arch(CTRL_MachineID machine, DMN_Handle process, Rng1U64 vaddr_range, Architecture arch); - -//- rjf: asking for top-level info of a handle -internal DASMI_BinaryInfo dasmi_binary_info_from_handle(Arena *arena, DASMI_Handle handle); - -//- rjf: asking for decoded instructions -internal DASMI_InstArray dasmi_inst_array_from_handle(Arena *arena, DASMI_Handle handle, U64 endt_us); - -//////////////////////////////// -//~ rjf: Decode Threads - -internal B32 dasmi_u2d_enqueue_request(DASMI_DecodeRequest *req, U64 endt_us); -internal DASMI_DecodeRequest dasmi_u2d_dequeue_request(void); - -internal void dasmi_decode_thread_entry_point(void *p); - -#endif //DASM_H diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 8c707722..2552da8e 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1398,16 +1398,6 @@ df_txti_handle_from_entity(DF_Entity *entity) return handle; } -//- rjf: entity -> disasm info - -internal DASMI_Handle -df_dasm_handle_from_process_vaddr(DF_Entity *process, U64 vaddr) -{ - Rng1U64 disasm_vaddr_rng = r1u64(AlignDownPow2(vaddr, KB(4)), AlignDownPow2(vaddr, KB(4)) + KB(16)); - DASMI_Handle dasm_handle = dasmi_handle_from_ctrl_process_range_arch(process->ctrl_machine_id, process->ctrl_handle, disasm_vaddr_rng, process->arch); - return dasm_handle; -} - //- rjf: full path building, from file/folder entities internal String8 diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 42adbd22..c97f215a 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1403,9 +1403,6 @@ internal DF_EntityFuzzyItemArray df_entity_fuzzy_item_array_from_entity_array_ne //- rjf: entity -> text info internal TXTI_Handle df_txti_handle_from_entity(DF_Entity *entity); -//- rjf: entity -> disasm info -internal DASMI_Handle df_dasm_handle_from_process_vaddr(DF_Entity *process, U64 vaddr); - //- rjf: full path building, from file/folder entities internal String8 df_full_path_from_entity(Arena *arena, DF_Entity *entity); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index c359b090..b2f09821 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -10925,16 +10925,6 @@ df_do_txti_controls(TXTI_Handle handle, U64 line_count_per_page, TxtPt *cursor, return change; } -internal B32 -df_do_dasm_controls(DASMI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column) -{ - Temp scratch = scratch_begin(0, 0); - B32 change = 0; - UI_NavActionList *nav_actions = ui_nav_actions(); - scratch_end(scratch); - return change; -} - //////////////////////////////// //~ rjf: UI Widgets: Fancy Labels diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 2ffecb41..ae1d455f 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -1048,7 +1048,6 @@ internal DF_CodeSliceSignal df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, internal B32 df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); internal B32 df_do_txti_controls(TXTI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); -internal B32 df_do_dasm_controls(DASMI_Handle handle, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); //////////////////////////////// //~ rjf: UI Widgets: Fancy Labels diff --git a/src/raddbg/raddbg_main.cpp b/src/raddbg/raddbg_main.cpp index 5006858b..32b3f3df 100644 --- a/src/raddbg/raddbg_main.cpp +++ b/src/raddbg/raddbg_main.cpp @@ -48,7 +48,6 @@ #include "eval/eval_inc.h" #include "unwind/unwind.h" #include "ctrl/ctrl_inc.h" -#include "dasm/dasm.h" #include "font_provider/font_provider_inc.h" #include "render/render_inc.h" #include "texture_cache/texture_cache.h" @@ -87,7 +86,6 @@ #include "eval/eval_inc.c" #include "unwind/unwind.c" #include "ctrl/ctrl_inc.c" -#include "dasm/dasm.c" #include "font_provider/font_provider_inc.c" #include "render/render_inc.c" #include "texture_cache/texture_cache.c" From 1904d4ca0da15e59332ffbd3db3bd34e425cfdec Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 15:19:25 -0700 Subject: [PATCH 252/275] support copy from disasm (finally) --- src/df/gfx/df_views.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index e0a05f0d..15b65416 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -6346,18 +6346,10 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) //- rjf: copy text if(!txt_pt_match(sig.copy_range.min, sig.copy_range.max)) { - // TODO(rjf) -#if 0 Temp temp = temp_begin(scratch.arena); - DF_Entity *flash_range = df_entity_alloc(entity, DF_EntityKind_FlashMarker); - df_entity_equip_death_timer(flash_range, 0.5f); - df_entity_equip_color_rgba(flash_range, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); - df_entity_equip_txt_pt(flash_range, sig.copy_range.min); - df_entity_equip_txt_pt_alt(flash_range, sig.copy_range.max); - String8 text = txti_string_from_handle_txt_rng(temp.arena, txti_handle, sig.copy_range); + String8 text = txt_string_from_info_data_txt_rng(&dasm_text_info, dasm_text_data, sig.copy_range); os_set_clipboard_text(text); temp_end(temp); -#endif } //- rjf: toggle cursor watch From 3931edb3f1f96bd6260b45d6ef8bc07decc47621 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 15:21:18 -0700 Subject: [PATCH 253/275] notes --- src/raddbg/raddbg.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 29893def..b0491ddb 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -86,7 +86,7 @@ // // [ ] ** Converter performance & heuristics for asynchronously doing it early // -// [ ] disasm animation & go-to-address +// [x] disasm animation & go-to-address // // [ ] visualize remapped files (via path map) @@ -209,9 +209,9 @@ // "save" option in the menus. // // [ ] @cleanup @feature double & triple click select in source views -// [ ] @feature disasm keyboard navigation & copy/paste // [ ] @feature debug info overrides (both path-based AND module-based) // [ ] configure tab size +// [x] @feature disasm keyboard navigation & copy/paste // [x] run-to-line needs to work if no processes are running // - place temp bp, attach "die on hit" flag or something like that? // [ ] auto-scroll output window From 7f50beae2a2dc5fdb7e2e265199d6940f83e3bb7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 15:21:18 -0700 Subject: [PATCH 254/275] notes --- src/raddbg/raddbg.h | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index b0491ddb..72b217cd 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -8,9 +8,6 @@ // [ ] unwinding -> in-process-memory EXE info // [ ] "root" concept in hash store, which buckets keys & allows usage code to // jettison a collection of keys in retained mode fashion -// [x] solidify synchronization mechanisms for usage of demon layer -// [x] TLS eval correctness -// [x] freezing thread while running -> soft-halt //////////////////////////////// //~ rjf: Frontend/UI Pass Tasks @@ -55,7 +52,6 @@ // start with brighter color, but sometimes with darker - shouldn't it // always have the same color ordering? // -// [x] middle mouse button on tab should close it // [ ] pipe failure-to-launch errors back to frontend //////////////////////////////// @@ -85,16 +81,10 @@ // since that's not normally how Windows fonts work. // // [ ] ** Converter performance & heuristics for asynchronously doing it early -// -// [x] disasm animation & go-to-address -// -// [ ] visualize remapped files (via path map) //////////////////////////////// //~ rjf: Hot, Medium Priority Tasks (Low-Hanging-Fruit Features, UI Jank, Cleanup) // -// [ ] Watch Window Filtering -// // [ ] investigate /DEBUG:FASTLINK - can we somehow alert that we do not // support it? // @@ -211,9 +201,6 @@ // [ ] @cleanup @feature double & triple click select in source views // [ ] @feature debug info overrides (both path-based AND module-based) // [ ] configure tab size -// [x] @feature disasm keyboard navigation & copy/paste -// [x] run-to-line needs to work if no processes are running -// - place temp bp, attach "die on hit" flag or something like that? // [ ] auto-scroll output window // // [ ] C++ virtual inheritance member visualization in watch window @@ -239,12 +226,6 @@ // expandable? It seems like this should be consistent (one way to edit, // one way to expand/collapse, that are distinct) // -// [x] I didn't understand the terminology "Equip With Color". Does that just -// mean specify the color used to display it? Is "Apply Color" perhaps a -// bit more user-friendly? -// -// [x] The cursor feels a bit too huge vertically. -// // [ ] The hex format for color values in the config file was a real // mindbender. It's prefixed with "0x", so I was assuming it was either // Windows Big Endian (0xAARRGGBB) or Mac Little Endian (0xAABBGGRR). To @@ -413,6 +394,24 @@ // [ ] convert UI layout pass to not be naive recursive version // [ ] (big change) parallelize window ui build codepaths per-panel +//////////////////////////////// +//~ rjf: Recently Completed Task Log +// +// [x] solidify synchronization mechanisms for usage of demon layer +// [x] TLS eval correctness +// [x] freezing thread while running -> soft-halt +// [x] Watch Window Filtering +// [x] @feature disasm keyboard navigation & copy/paste +// [x] run-to-line needs to work if no processes are running +// - place temp bp, attach "die on hit" flag or something like that? +// [x] disasm animation & go-to-address +// [x] middle mouse button on tab should close it +// [x] I didn't understand the terminology "Equip With Color". Does that just +// mean specify the color used to display it? Is "Apply Color" perhaps a +// bit more user-friendly? +// +// [x] The cursor feels a bit too huge vertically. + #ifndef RADDBG_H #define RADDBG_H From 5aa8aa1c6661eca1649369d104c4a3d6839f4d1f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 28 Mar 2024 19:56:33 -0700 Subject: [PATCH 255/275] fix expandability rules for function pointer types; identifiers -> keywords in disassembly --- src/df/core/df_core.c | 4 ++++ src/text_cache/text_cache.c | 13 ++----------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 2552da8e..ddb0b3cb 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -5580,6 +5580,10 @@ df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalViz { break; } + if(kind == TG_Kind_Function) + { + break; + } } } diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 079e4806..3c69d0cb 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -675,7 +675,7 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed else if(('a' <= byte && byte <= 'z') || ('A' <= byte && byte <= 'Z') || byte == '_') { active_token_start_off = off; - active_token_kind = TXT_TokenKind_Identifier; + active_token_kind = TXT_TokenKind_Keyword; advance = 1; } else if(byte == '\'') @@ -722,7 +722,7 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed ender_found = 1; advance = 0; }break; - case TXT_TokenKind_Identifier: + case TXT_TokenKind_Keyword: if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '_') { ender_found = 1; @@ -787,15 +787,6 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed if(ender_found != 0) { TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)}; - if(active_token_kind == TXT_TokenKind_Identifier) - { - String8 token_string = str8_substr(string, token.range); - B32 identifier_is_instruction = 0; - if(identifier_is_instruction) - { - token.kind = TXT_TokenKind_Keyword; - } - } txt_token_chunk_list_push(arena, &tokens, 1024, &token); active_token_kind = TXT_TokenKind_Null; active_token_start_off = token.range.max; From 6c8963cd0623aa058f82085b6ad4e79c3dab40da Mon Sep 17 00:00:00 2001 From: Mohit Sethi Date: Sat, 17 Feb 2024 21:58:27 +0000 Subject: [PATCH 256/275] Disable Alt+Enter fullscreen --- src/render/d3d11/render_d3d11.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/render/d3d11/render_d3d11.cpp b/src/render/d3d11/render_d3d11.cpp index 4599433c..30205966 100644 --- a/src/render/d3d11/render_d3d11.cpp +++ b/src/render/d3d11/render_d3d11.cpp @@ -496,6 +496,8 @@ r_window_equip(OS_Handle handle) os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); os_exit_process(1); } + + r_d3d11_state->dxgi_factory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER); //- rjf: create framebuffer & view window->swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void **)(&window->framebuffer)); From 7c7b44e940e40e3b27e699a7fe15ed245c62ac67 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 08:37:26 -0700 Subject: [PATCH 257/275] attempt to auto-resolve numeric evaluations into addresses in frontend eval path --- src/df/core/df_core.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index ddb0b3cb..d0243672 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4178,6 +4178,24 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, result); } + //- rjf: try to resolve basic integral values into symbols + if(result.mode == EVAL_EvalMode_Value && parse.expr->kind != EVAL_ExprKind_Cast && + (tg_key_match(result.type_key, tg_key_basic(TG_Kind_S64)) || + tg_key_match(result.type_key, tg_key_basic(TG_Kind_U64)) || + tg_key_match(result.type_key, tg_key_basic(TG_Kind_S32)) || + tg_key_match(result.type_key, tg_key_basic(TG_Kind_U32)))) + { + U64 vaddr = result.imm_u64; + DF_Entity *module = df_module_from_process_vaddr(process, vaddr); + DF_Entity *binary = df_binary_file_from_module(module); + U64 voff = df_voff_from_vaddr(module, vaddr); + String8 symbol_name = df_symbol_name_from_binary_voff(scratch.arena, binary, voff); + if(symbol_name.size != 0) + { + result.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, tg_key_basic(TG_Kind_Void), 0); + } + } + scratch_end(scratch); ProfEnd(); return result; From d9675f256571a8c7f26689efc8d3aa6dc73b4cfa Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 08:52:37 -0700 Subject: [PATCH 258/275] allow assembly-style dereferences in eval parser; register/register-alias syntax highlighting --- src/df/core/df_core.c | 2 +- src/df/gfx/df_gfx.c | 28 +++++++++++++++++++++---- src/df/gfx/df_gfx.mdesk | 2 ++ src/df/gfx/generated/df_gfx.meta.c | 33 ++++++++++++++++++++---------- src/df/gfx/generated/df_gfx.meta.h | 23 +++++++++++---------- src/eval/eval_parser.c | 32 +++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 27 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index d0243672..791a79ba 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4179,7 +4179,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ } //- rjf: try to resolve basic integral values into symbols - if(result.mode == EVAL_EvalMode_Value && parse.expr->kind != EVAL_ExprKind_Cast && + if((result.mode == EVAL_EvalMode_Value || result.mode == EVAL_EvalMode_Reg) && parse.expr->kind != EVAL_ExprKind_Cast && (tg_key_match(result.type_key, tg_key_basic(TG_Kind_S64)) || tg_key_match(result.type_key, tg_key_basic(TG_Kind_U64)) || tg_key_match(result.type_key, tg_key_basic(TG_Kind_S32)) || diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index b2f09821..943bfac4 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -10314,13 +10314,13 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { DF_ThemeColor new_color_kind = df_theme_color_from_txt_token_kind(token->kind); F32 mix_t = 1.f; - if(token->kind == TXT_TokenKind_Identifier) + if(token->kind == TXT_TokenKind_Identifier || token->kind == TXT_TokenKind_Keyword) { B32 mapped_special = 0; for(DF_EntityNode *n = params->relevant_binaries.first; n != 0; n = n->next) { DF_Entity *binary = n->entity; - if(!mapped_special) + if(!mapped_special && token->kind == TXT_TokenKind_Identifier) { U64 voff = df_voff_from_binary_symbol_name(binary, token_string); if(voff != 0) @@ -10330,7 +10330,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ mix_t = selected_thread_module->alive_t; } } - if(!mapped_special) + if(!mapped_special && token->kind == TXT_TokenKind_Identifier) { U64 type_num = df_type_num_from_binary_name(binary, token_string); if(type_num != 0) @@ -10340,7 +10340,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ mix_t = selected_thread_module->alive_t; } } - if(!mapped_special) + if(!mapped_special && token->kind == TXT_TokenKind_Identifier) { U64 local_num = eval_num_from_string(parse_ctx->locals_map, token_string); if(local_num != 0) @@ -10350,6 +10350,26 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ mix_t = selected_thread_module->alive_t; } } + if(!mapped_special) + { + U64 reg_num = eval_num_from_string(parse_ctx->regs_map, token_string); + if(reg_num != 0) + { + mapped_special = 1; + new_color_kind = DF_ThemeColor_CodeRegister; + mix_t = selected_thread_module->alive_t; + } + } + if(!mapped_special) + { + U64 alias_num = eval_num_from_string(parse_ctx->reg_alias_map, token_string); + if(alias_num != 0) + { + mapped_special = 1; + new_color_kind = DF_ThemeColor_CodeRegister; + mix_t = selected_thread_module->alive_t; + } + } break; } } diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index ba56a42d..14ad8d43 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -265,6 +265,7 @@ DF_ThemeTable: {CodeFunction "Code (Function)" code_function } {CodeType "Code (Type)" code_type } {CodeLocal "Code (Local)" code_local } + {CodeRegister "Code (Register)" code_register } {CodeKeyword "Code (Keyword)" code_keyword } {CodeSymbol "Code (Symbol)" code_symbol } {CodeNumeric "Code (Numeric)" code_numeric } @@ -349,6 +350,7 @@ DF_ThemePresetColorTable: (code_function 0x7fcc99ff 0x2a7a45ff 0xdcdcaaff 0x74531fff 0x1c7dd1ff 0xc39d36ff 0xcc5735ff 0x7fcc99ff 0x49b2ffff ) (code_type 0x66b2e5ff 0x2c688fff 0x4ec9b0ff 0x2b91afff 0x1c7dd1ff 0x66b2e5ff 0xd8a51dff 0x66b2e5ff 0x49b2ffff ) (code_local 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff ) + (code_register 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff ) (code_keyword 0xf7bf5eff 0xa47729ff 0x569cd6ff 0x0000ffff 0x63980fff 0xc39d36ff 0xac7b0bff 0xd08f20ff 0xff0000ff ) (code_symbol 0x994c32ff 0x6c2d18ff 0xb4b4b4ff 0x000000ff 0x839496ff 0x2e5256ff 0x994c32ff 0x994c32ff 0xffffffff ) (code_numeric 0x4ce54cff 0x2c7d2cff 0xb5cea8ff 0x000000ff 0xcb4b20ff 0x657b83ff 0x6b8e23ff 0x50ff30ff 0x2cff50ff ) diff --git a/src/df/gfx/generated/df_gfx.meta.c b/src/df/gfx/generated/df_gfx.meta.c index 38a43990..dde6d4cf 100644 --- a/src/df/gfx/generated/df_gfx.meta.c +++ b/src/df/gfx/generated/df_gfx.meta.c @@ -30,7 +30,7 @@ str8_lit_comp("four_coder"), str8_lit_comp("far_manager"), }; -Vec4F32 df_g_theme_preset_colors__default_dark[53] = +Vec4F32 df_g_theme_preset_colors__default_dark[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0xe5e5e5ff), @@ -41,6 +41,7 @@ rgba_from_u32_lit_comp(0xe5e5e5ff), rgba_from_u32_lit_comp(0x7fcc99ff), rgba_from_u32_lit_comp(0x66b2e5ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xf7bf5eff), rgba_from_u32_lit_comp(0x994c32ff), rgba_from_u32_lit_comp(0x4ce54cff), @@ -87,7 +88,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__default_light[53] = +Vec4F32 df_g_theme_preset_colors__default_light[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x383838ff), @@ -98,6 +99,7 @@ rgba_from_u32_lit_comp(0x282828ff), rgba_from_u32_lit_comp(0x2a7a45ff), rgba_from_u32_lit_comp(0x2c688fff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xa47729ff), rgba_from_u32_lit_comp(0x6c2d18ff), rgba_from_u32_lit_comp(0x2c7d2cff), @@ -144,7 +146,7 @@ rgba_from_u32_lit_comp(0x0000000d), rgba_from_u32_lit_comp(0x0000003b), }; -Vec4F32 df_g_theme_preset_colors__vs_dark[53] = +Vec4F32 df_g_theme_preset_colors__vs_dark[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0xe5e5e5ff), @@ -155,6 +157,7 @@ rgba_from_u32_lit_comp(0xd4d4d4ff), rgba_from_u32_lit_comp(0xdcdcaaff), rgba_from_u32_lit_comp(0x4ec9b0ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0x569cd6ff), rgba_from_u32_lit_comp(0xb4b4b4ff), rgba_from_u32_lit_comp(0xb5cea8ff), @@ -201,7 +204,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__vs_light[53] = +Vec4F32 df_g_theme_preset_colors__vs_light[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x1e1e1eff), @@ -212,6 +215,7 @@ rgba_from_u32_lit_comp(0x000000ff), rgba_from_u32_lit_comp(0x74531fff), rgba_from_u32_lit_comp(0x2b91afff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0x0000ffff), rgba_from_u32_lit_comp(0x000000ff), rgba_from_u32_lit_comp(0x000000ff), @@ -258,7 +262,7 @@ rgba_from_u32_lit_comp(0x0000000d), rgba_from_u32_lit_comp(0x0000003b), }; -Vec4F32 df_g_theme_preset_colors__solarized_dark[53] = +Vec4F32 df_g_theme_preset_colors__solarized_dark[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0xe5e5e5ff), @@ -269,6 +273,7 @@ rgba_from_u32_lit_comp(0x839496ff), rgba_from_u32_lit_comp(0x1c7dd1ff), rgba_from_u32_lit_comp(0x1c7dd1ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0x63980fff), rgba_from_u32_lit_comp(0x839496ff), rgba_from_u32_lit_comp(0xcb4b20ff), @@ -315,7 +320,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__solarized_light[53] = +Vec4F32 df_g_theme_preset_colors__solarized_light[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x1e1e1eff), @@ -326,6 +331,7 @@ rgba_from_u32_lit_comp(0x74878cff), rgba_from_u32_lit_comp(0xc39d36ff), rgba_from_u32_lit_comp(0x66b2e5ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xc39d36ff), rgba_from_u32_lit_comp(0x2e5256ff), rgba_from_u32_lit_comp(0x657b83ff), @@ -372,7 +378,7 @@ rgba_from_u32_lit_comp(0x0000000d), rgba_from_u32_lit_comp(0x0000003b), }; -Vec4F32 df_g_theme_preset_colors__handmade_hero[53] = +Vec4F32 df_g_theme_preset_colors__handmade_hero[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0xa08563ff), @@ -383,6 +389,7 @@ rgba_from_u32_lit_comp(0xa08563ff), rgba_from_u32_lit_comp(0xcc5735ff), rgba_from_u32_lit_comp(0xd8a51dff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xac7b0bff), rgba_from_u32_lit_comp(0x994c32ff), rgba_from_u32_lit_comp(0x6b8e23ff), @@ -429,7 +436,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__four_coder[53] = +Vec4F32 df_g_theme_preset_colors__four_coder[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x90b080ff), @@ -440,6 +447,7 @@ rgba_from_u32_lit_comp(0x90b080ff), rgba_from_u32_lit_comp(0x7fcc99ff), rgba_from_u32_lit_comp(0x66b2e5ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xd08f20ff), rgba_from_u32_lit_comp(0x994c32ff), rgba_from_u32_lit_comp(0x50ff30ff), @@ -486,7 +494,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__far_manager[53] = +Vec4F32 df_g_theme_preset_colors__far_manager[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x00ffffff), @@ -497,6 +505,7 @@ rgba_from_u32_lit_comp(0x00ffffff), rgba_from_u32_lit_comp(0x49b2ffff), rgba_from_u32_lit_comp(0x49b2ffff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xff0000ff), rgba_from_u32_lit_comp(0xffffffff), rgba_from_u32_lit_comp(0x2cff50ff), @@ -755,7 +764,7 @@ DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29] = {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("theme"), str8_lit_comp("Theme"), DF_NameKind_Null, DF_IconKind_Palette, DF_VIEW_SETUP_FUNCTION_NAME(Theme), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Theme), DF_VIEW_CMD_FUNCTION_NAME(Theme), DF_VIEW_UI_FUNCTION_NAME(Theme)}, }; -String8 df_g_theme_color_display_string_table[53] = +String8 df_g_theme_color_display_string_table[54] = { str8_lit_comp("Null"), str8_lit_comp("Plain Text"), @@ -766,6 +775,7 @@ str8_lit_comp("Code (Default)"), str8_lit_comp("Code (Function)"), str8_lit_comp("Code (Type)"), str8_lit_comp("Code (Local)"), +str8_lit_comp("Code (Register)"), str8_lit_comp("Code (Keyword)"), str8_lit_comp("Code (Symbol)"), str8_lit_comp("Code (Numeric)"), @@ -812,7 +822,7 @@ str8_lit_comp("Inactive Panel Overlay"), str8_lit_comp("Drop Shadow"), }; -String8 df_g_theme_color_cfg_string_table[53] = +String8 df_g_theme_color_cfg_string_table[54] = { str8_lit_comp("null"), str8_lit_comp("plain_text"), @@ -823,6 +833,7 @@ str8_lit_comp("code_default"), str8_lit_comp("code_function"), str8_lit_comp("code_type"), str8_lit_comp("code_local"), +str8_lit_comp("code_register"), str8_lit_comp("code_keyword"), str8_lit_comp("code_symbol"), str8_lit_comp("code_numeric"), diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/df/gfx/generated/df_gfx.meta.h index 23ced75c..595f1ecd 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/df/gfx/generated/df_gfx.meta.h @@ -51,6 +51,7 @@ DF_ThemeColor_CodeDefault, DF_ThemeColor_CodeFunction, DF_ThemeColor_CodeType, DF_ThemeColor_CodeLocal, +DF_ThemeColor_CodeRegister, DF_ThemeColor_CodeKeyword, DF_ThemeColor_CodeSymbol, DF_ThemeColor_CodeNumeric, @@ -250,15 +251,15 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo); C_LINKAGE_BEGIN extern String8 df_g_theme_preset_display_string_table[9]; extern String8 df_g_theme_preset_code_string_table[9]; -extern Vec4F32 df_g_theme_preset_colors__default_dark[53]; -extern Vec4F32 df_g_theme_preset_colors__default_light[53]; -extern Vec4F32 df_g_theme_preset_colors__vs_dark[53]; -extern Vec4F32 df_g_theme_preset_colors__vs_light[53]; -extern Vec4F32 df_g_theme_preset_colors__solarized_dark[53]; -extern Vec4F32 df_g_theme_preset_colors__solarized_light[53]; -extern Vec4F32 df_g_theme_preset_colors__handmade_hero[53]; -extern Vec4F32 df_g_theme_preset_colors__four_coder[53]; -extern Vec4F32 df_g_theme_preset_colors__far_manager[53]; +extern Vec4F32 df_g_theme_preset_colors__default_dark[54]; +extern Vec4F32 df_g_theme_preset_colors__default_light[54]; +extern Vec4F32 df_g_theme_preset_colors__vs_dark[54]; +extern Vec4F32 df_g_theme_preset_colors__vs_light[54]; +extern Vec4F32 df_g_theme_preset_colors__solarized_dark[54]; +extern Vec4F32 df_g_theme_preset_colors__solarized_light[54]; +extern Vec4F32 df_g_theme_preset_colors__handmade_hero[54]; +extern Vec4F32 df_g_theme_preset_colors__four_coder[54]; +extern Vec4F32 df_g_theme_preset_colors__far_manager[54]; extern Vec4F32* df_g_theme_preset_colors_table[9]; extern DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[7]; extern String8 df_g_cmd_param_slot_2_view_spec_dst_map[7]; @@ -267,8 +268,8 @@ extern DF_StringBindingPair df_g_default_binding_table[97]; extern String8 df_g_binding_version_remap_old_name_table[3]; extern String8 df_g_binding_version_remap_new_name_table[3]; extern DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29]; -extern String8 df_g_theme_color_display_string_table[53]; -extern String8 df_g_theme_color_cfg_string_table[53]; +extern String8 df_g_theme_color_display_string_table[54]; +extern String8 df_g_theme_color_cfg_string_table[54]; read_only global U8 df_g_icon_font_bytes__data[] = { 0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x80,0x00,0x03,0x00,0x70,0x47,0x53,0x55,0x42,0x20,0x8b,0x25,0x7a,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x4f,0x53,0x2f,0x32,0x56,0x44,0x49,0xa0,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0x2a,0x09,0xe2,0xc2,0x00,0x00,0x01,0xb0,0x00,0x00,0x05,0xec,0x63,0x76,0x74,0x20, diff --git a/src/eval/eval_parser.c b/src/eval/eval_parser.c index 8d5ec73e..71bf8a1b 100644 --- a/src/eval/eval_parser.c +++ b/src/eval/eval_parser.c @@ -775,6 +775,38 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 } } + //- rjf: descent to assembly-style dereference sub-expression + else if(token.kind == EVAL_TokenKind_Symbol && str8_match(token_string, str8_lit("["), 0)) + { + // rjf: skip [ + it += 1; + + // rjf: parse [] contents + EVAL_TokenArray nested_parse_tokens = eval_token_array_make_first_opl(it, it_opl); + EVAL_ParseResult nested_parse = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, &nested_parse_tokens, eval_g_max_precedence); + eval_error_list_concat_in_place(&result.errors, &nested_parse.errors); + atom = nested_parse.expr; + it = nested_parse.last_token; + + // rjf: build cast-to-U64*, and dereference operators + atom = eval_expr(arena, EVAL_ExprKind_Cast, token_string.str, eval_expr_leaf_type(arena, token_string.str, tg_cons_type_make(ctx->type_graph, TG_Kind_Ptr, tg_key_basic(TG_Kind_U64), 0)), atom, 0); + atom = eval_expr(arena, EVAL_ExprKind_Deref, token_string.str, atom, 0, 0); + + // rjf: expect ] + EVAL_Token close_paren_maybe = eval_token_at_it(it, tokens); + String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); + if(close_paren_maybe.kind != EVAL_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit("]"), 0)) + { + eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Missing ]."); + } + + // rjf: consume ) + else + { + it += 1; + } + } + //- rjf: leaf (identifier, literal) else if(token.kind != EVAL_TokenKind_Symbol) { From 60e1f105e480a7484721d9e2b63f59ef25bc5c41 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 09:22:13 -0700 Subject: [PATCH 259/275] raddbgi: correctly encode bitfields; type_graph: correctly stringify bitfield types --- src/df/gfx/df_views.c | 4 ++-- src/lib_raddbgi_format/raddbgi_format.h | 1 + src/lib_raddbgi_make/raddbgi_make.c | 1 + src/type_graph/type_graph.c | 32 ++++++++++++++++++++++--- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 15b65416..65286173 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5785,7 +5785,7 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) // DF_Entity *process = df_entity_from_handle(dv->process); Architecture arch = df_architecture_from_entity(process); - U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(4)); + U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(64)); Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64)); U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0); U128 dasm_data_hash = {0}; @@ -6021,7 +6021,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) // DF_Entity *process = df_entity_from_handle(dv->process); Architecture arch = df_architecture_from_entity(process); - U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(4)); + U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(64)); Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64)); U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0); U128 dasm_data_hash = {0}; diff --git a/src/lib_raddbgi_format/raddbgi_format.h b/src/lib_raddbgi_format/raddbgi_format.h index 6f89ccca..16a03d44 100644 --- a/src/lib_raddbgi_format/raddbgi_format.h +++ b/src/lib_raddbgi_format/raddbgi_format.h @@ -533,6 +533,7 @@ typedef struct RDI_TypeNode{ // (kind = Bitfield) struct{ + RDI_U32 direct_type_idx; RDI_U32 off; RDI_U32 size; } bitfield; diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 88026e8b..7f15dcbe 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -2763,6 +2763,7 @@ rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM //- rjf: fill bitfield info else if(dst->kind == RDI_TypeKind_Bitfield) { + dst->bitfield.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 dst->bitfield.off = src->off; dst->bitfield.size = src->count; } diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c index 30661277..16558851 100644 --- a/src/type_graph/type_graph.c +++ b/src/type_graph/type_graph.c @@ -440,7 +440,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Ke } //- rjf: constructed types - if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed) + else if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed) { // rjf: unpack direct type B32 direct_type_is_good = 0; @@ -607,6 +607,29 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Ke type->direct_type_key = direct_type_key; } + //- rjf: bitfields + else if(RDI_TypeKind_Bitfield == rdi_type->kind) + { + // rjf: unpack direct type + TG_Key direct_type_key = zero_struct; + U64 direct_type_byte_size = 0; + if(rdi_type->bitfield.direct_type_idx < type_node_idx) + { + RDI_TypeNode *direct_type_node = &rdi->type_nodes[rdi_type->bitfield.direct_type_idx]; + TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); + direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->bitfield.direct_type_idx); + direct_type_byte_size = direct_type_node->byte_size; + } + + // rjf: produce + type = push_array(arena, TG_Type, 1); + type->kind = kind; + type->byte_size = direct_type_byte_size; + type->direct_type_key = direct_type_key; + type->off = (U32)rdi_type->bitfield.off; + type->count = (U64)rdi_type->bitfield.size; + } + //- rjf: incomplete types else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete) { @@ -1257,8 +1280,11 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key ke case TG_Kind_Bitfield: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_rhs_string_from_key(arena, graph, rdi, direct, out, prec); + Temp scratch = scratch_begin(&arena, 1); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); + tg_rhs_string_from_key(arena, graph, rdi, type->direct_type_key, out, prec); + str8_list_pushf(arena, out, ": %I64u", type->count); + scratch_end(scratch); }break; case TG_Kind_Modifier: From 60030b298b822a9b27238e80ab98f479a0b43f33 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 09:51:38 -0700 Subject: [PATCH 260/275] bitfield support in address mode -> value mode evaluation path --- src/df/core/df_core.c | 16 +++++++++++++++- src/type_graph/type_graph.c | 14 +++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 791a79ba..f8659b66 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4219,7 +4219,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ TG_Key type_key = eval.type_key; TG_Kind type_kind = tg_kind_from_key(type_key); U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); - if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= 8) + if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= sizeof(U64)*2) { Temp scratch = scratch_begin(0, 0); Rng1U64 vaddr_range = r1u64(eval.offset, eval.offset + type_byte_size); @@ -4231,6 +4231,20 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ MemoryCopy(eval.imm_u128, data.str, Min(data.size, sizeof(U64)*2)); eval.mode = EVAL_EvalMode_Value; + // rjf: mask&shift, for bitfields + if(type_kind == TG_Kind_Bitfield && type_byte_size <= sizeof(U64)) + { + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type_key); + U64 valid_bits_mask = 0; + for(U64 idx = 0; idx < type->count; idx += 1) + { + valid_bits_mask |= (1<> type->off; + eval.imm_u64 = eval.imm_u64 & valid_bits_mask; + eval.type_key = type->direct_type_key; + } + // rjf: manually sign-extend switch(type_kind) { diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c index 16558851..4a9af695 100644 --- a/src/type_graph/type_graph.c +++ b/src/type_graph/type_graph.c @@ -1151,8 +1151,11 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key ke case TG_Kind_Bitfield: { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_lhs_string_from_key(arena, graph, rdi, direct, out, prec, skip_return); + Temp scratch = scratch_begin(&arena, 1); + TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); + tg_lhs_string_from_key(arena, graph, rdi, type->direct_type_key, out, prec, skip_return); + str8_list_pushf(arena, out, ": %I64u", type->count); + scratch_end(scratch); }break; case TG_Kind_Modifier: @@ -1280,11 +1283,8 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key ke case TG_Kind_Bitfield: { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - tg_rhs_string_from_key(arena, graph, rdi, type->direct_type_key, out, prec); - str8_list_pushf(arena, out, ": %I64u", type->count); - scratch_end(scratch); + TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); + tg_rhs_string_from_key(arena, graph, rdi, direct, out, prec); }break; case TG_Kind_Modifier: From 4b3941c17fc00a9715c8208d4bcea5fc880dd101 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 10:09:57 -0700 Subject: [PATCH 261/275] sketch out non-utf8 string visualization in frontend eval paths; simple retry mechanism for large memory reads that may fail across page boundaries in ctrl process memory cache --- src/ctrl/ctrl_core.c | 33 ++++++++++++++++++++++++++++----- src/ctrl/ctrl_core.h | 2 +- src/df/gfx/df_gfx.c | 24 ++++++++++++++++++++---- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 60c79635..f5ce967e 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1209,14 +1209,24 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac } internal CTRL_ProcessMemorySlice -ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 endt_us) +ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 element_size, U64 endt_us) { CTRL_ProcessMemorySlice result = ctrl_query_cached_data_from_process_vaddr_range(arena, machine_id, process, r1u64(vaddr, vaddr+limit), endt_us); - for(U64 idx = 0; idx < result.data.size; idx += 1) + U64 element_count = result.data.size/element_size; + for(U64 element_idx = 0; element_idx < element_count; element_idx += 1) { - if(result.data.str[idx] == 0) + B32 element_is_zero = 1; + for(U64 element_byte_idx = 0; element_byte_idx < element_size; element_byte_idx += 1) { - result.data.size = idx; + if(result.data.str[element_idx*element_size + element_byte_idx] != 0) + { + element_is_zero = 0; + break; + } + } + if(element_is_zero) + { + result.data.size = element_idx*element_size; break; } } @@ -3561,7 +3571,20 @@ ctrl_mem_stream_thread__entry_point(void *p) else { range_base = push_array_no_zero(range_arena, U8, range_size); - U64 bytes_read = dmn_process_read(process, vaddr_range_clamped, range_base); + U64 bytes_read = 0; + U64 retry_count = 0; + for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped; retry_count < 64; retry_count += 1) + { + bytes_read = dmn_process_read(process, vaddr_range_clamped_retry, range_base); + if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min) + { + vaddr_range_clamped_retry.max -= (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2; + } + else + { + break; + } + } if(bytes_read == 0) { arena_release(range_arena); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index afc9f25d..879b404b 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -646,7 +646,7 @@ internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machin //- rjf: process memory cache reading helpers internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, U64 endt_us); -internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 endt_us); +internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 element_size, U64 endt_us); //- rjf: process memory writing internal B32 ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *src); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 943bfac4..9494e6f0 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6877,8 +6877,16 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(!has_array && direct_type_is_string && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && eval.mode == EVAL_EvalMode_Addr) { U64 string_memory_addr = value_eval.imm_u64; - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, string_memory_addr, 256, 0); - String8 text = df_eval_escaped_from_raw_string(arena, text_slice.data); + U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval.type_key); + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, element_size, 0); + String8 raw_text = {0}; + switch(element_size) + { + default:{raw_text = text_slice.data;}break; + case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break; + case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break; + } + String8 text = df_eval_escaped_from_raw_string(arena, raw_text); space_taken += f_dim_from_tag_size_string(font, font_size, text).x; space_taken += 2*f_dim_from_tag_size_string(font, font_size, str8_lit("\"")).x; str8_list_push(arena, &list, str8_lit("\"")); @@ -6953,8 +6961,16 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags special_case = 1; DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, 0); - String8 text = df_eval_escaped_from_raw_string(arena, text_slice.data); + U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval_type->direct_type_key); + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, element_size, 0); + String8 raw_text = {0}; + switch(element_size) + { + default:{raw_text = text_slice.data;}break; + case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break; + case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break; + } + String8 text = df_eval_escaped_from_raw_string(arena, raw_text); space_taken += f_dim_from_tag_size_string(font, font_size, text).x; space_taken += 2*f_dim_from_tag_size_string(font, font_size, str8_lit("\"")).x; str8_list_push(arena, &list, str8_lit("\"")); From 7c3fabfc399d505cf3f4edf64bdad6071f0ab6d9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 10:13:29 -0700 Subject: [PATCH 262/275] wchar test in mule_main --- src/mule/mule_main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index bcb62a42..1260db25 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -274,6 +274,9 @@ type_coverage_eval_tests(void){ "With multiple lines in it\r\n" "\t> What ways might it be rendered?\n" "\t> How would it deal with line endings?\r\n"; + wchar_t a_wide_string[] = + L"This is a string, but instead of being encoded in a stream of bytes,\n" + L"it is encoded in a stream of 2-byte packages!\n"; void *pointer = &basics; Basics *pointer_to_basics = &basics; From 7496f3b8cce46f04ffae8a3d95c9e1ffadf06959 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 10:22:06 -0700 Subject: [PATCH 263/275] dont over-ambitiously respond to exceptions/errors on kill/detach --- src/ctrl/ctrl_core.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index f5ce967e..f96c8ed8 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -2368,9 +2368,7 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { done = 1; } - if(event->kind == DMN_EventKind_Halt || - event->kind == DMN_EventKind_Exception || - event->kind == DMN_EventKind_Error) + if(event->kind == DMN_EventKind_Halt) { done = 1; } @@ -2423,9 +2421,7 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { done = 1; } - if(event->kind == DMN_EventKind_Halt || - event->kind == DMN_EventKind_Exception || - event->kind == DMN_EventKind_Error) + if(event->kind == DMN_EventKind_Halt) { done = 1; } From 6eb8e37d4d85c418682ebce9d01ab50348e217f4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 10:42:14 -0700 Subject: [PATCH 264/275] default to hexadecimal radix in register-mode hover-evaluations --- src/df/gfx/df_gfx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 9494e6f0..0d2da2b1 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -5048,7 +5048,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D DF_ExpandKey parent_key = df_expand_key_make(5381, 1); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), 1); DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, expr, parent_key, key); - DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, 10, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); + U32 default_radix = (eval.mode == EVAL_EvalMode_Reg ? 16 : 10); + DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); //- rjf: animate { From 2842901f9c33c21c651d69b049aa9b54127246d3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 10:58:05 -0700 Subject: [PATCH 265/275] ui: extend box->signal path with double-drag, triple-drag info --- src/ui/ui_core.c | 66 ++++++++++++++++++++++++++++++++++++++++++------ src/ui/ui_core.h | 46 ++++++++++++++++++++------------- 2 files changed, 86 insertions(+), 26 deletions(-) diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 80cffce5..19a577f1 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2448,13 +2448,24 @@ ui_signal_from_box(UI_Box *box) ui_state->active_box_key[evt_mouse_button_kind] = box->key; sig.f |= (UI_SignalFlag_LeftPressed<drag_start_mouse = evt->pos; - if(ui_key_match(box->key, ui_state->last_press_key[evt_mouse_button_kind]) && - evt->timestamp_us-ui_state->last_press_timestamp_us[evt_mouse_button_kind] <= 1000000*os_double_click_time()) + if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) && + evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_double_click_time()) { sig.f |= (UI_SignalFlag_LeftDoubleClicked<last_press_key[evt_mouse_button_kind] = box->key; - ui_state->last_press_timestamp_us[evt_mouse_button_kind] = evt->timestamp_us; + if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) && + ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][1]) && + evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_double_click_time() && + ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] - ui_state->press_timestamp_history_us[evt_mouse_button_kind][1] <= 1000000*os_double_click_time()) + { + sig.f |= (UI_SignalFlag_LeftTripleClicked<press_timestamp_history_us[evt_mouse_button_kind][1], &ui_state->press_timestamp_history_us[evt_mouse_button_kind][0], + sizeof(ui_state->press_timestamp_history_us[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_timestamp_history_us[evt_mouse_button_kind])-1); + MemoryCopy(&ui_state->press_key_history[evt_mouse_button_kind][1], &ui_state->press_key_history[evt_mouse_button_kind][0], + sizeof(ui_state->press_key_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_key_history[evt_mouse_button_kind])-1); + ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] = evt->timestamp_us; + ui_state->press_key_history[evt_mouse_button_kind][0] = box->key; taken = 1; } @@ -2619,12 +2630,51 @@ ui_signal_from_box(UI_Box *box) ////////////////////////////// //- rjf: active -> dragging // - for(EachEnumVal(UI_MouseButtonKind, k)) + if(box->flags & UI_BoxFlag_MouseClickable) { - if(ui_key_match(ui_state->active_box_key[k], box->key) || - sig.f & (UI_SignalFlag_LeftPressed<active_box_key[k], box->key) || + sig.f & (UI_SignalFlag_LeftPressed< double-dragging + // + if(box->flags & UI_BoxFlag_MouseClickable) + { + for(EachEnumVal(UI_MouseButtonKind, k)) + { + if(sig.f & (UI_SignalFlag_LeftDragging<press_key_history[k][0], box->key) && + ui_key_match(ui_state->press_key_history[k][1], box->key) && + ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time()) + { + sig.f |= (UI_SignalFlag_LeftDoubleDragging< triple-dragging + // + if(box->flags & UI_BoxFlag_MouseClickable) + { + for(EachEnumVal(UI_MouseButtonKind, k)) + { + if(sig.f & (UI_SignalFlag_LeftDragging<press_key_history[k][0], box->key) && + ui_key_match(ui_state->press_key_history[k][1], box->key) && + ui_key_match(ui_state->press_key_history[k][2], box->key) && + ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time() && + ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*os_double_click_time()) + { + sig.f |= (UI_SignalFlag_LeftTripleDragging< box was previously double-clicked, user is still holding button + UI_SignalFlag_LeftDoubleDragging = (1<<6), + UI_SignalFlag_MiddleDoubleDragging= (1<<7), + UI_SignalFlag_RightDoubleDragging = (1<<8), + + // rjf: triple-dragging -> box was previously triple-clicked, user is still holding button + UI_SignalFlag_LeftTripleDragging = (1<<9), + UI_SignalFlag_MiddleTripleDragging= (1<<10), + UI_SignalFlag_RightTripleDragging = (1<<11), + // rjf: released -> box was previously pressed & user released, in or out of bounds - UI_SignalFlag_LeftReleased = (1<<6), - UI_SignalFlag_MiddleReleased = (1<<7), - UI_SignalFlag_RightReleased = (1<<8), + UI_SignalFlag_LeftReleased = (1<<12), + UI_SignalFlag_MiddleReleased = (1<<13), + UI_SignalFlag_RightReleased = (1<<14), // rjf: clicked -> box was previously pressed & user released, in bounds - UI_SignalFlag_LeftClicked = (1<<9), - UI_SignalFlag_MiddleClicked = (1<<10), - UI_SignalFlag_RightClicked = (1<<11), + UI_SignalFlag_LeftClicked = (1<<15), + UI_SignalFlag_MiddleClicked = (1<<16), + UI_SignalFlag_RightClicked = (1<<17), // rjf: double clicked -> box was previously clicked, pressed again - UI_SignalFlag_LeftDoubleClicked = (1<<12), - UI_SignalFlag_MiddleDoubleClicked = (1<<13), - UI_SignalFlag_RightDoubleClicked = (1<<14), + UI_SignalFlag_LeftDoubleClicked = (1<<18), + UI_SignalFlag_MiddleDoubleClicked = (1<<19), + UI_SignalFlag_RightDoubleClicked = (1<<20), // rjf: triple clicked -> box was previously clicked twice, pressed again - UI_SignalFlag_LeftTripleClicked = (1<<15), - UI_SignalFlag_MiddleTripleClicked = (1<<16), - UI_SignalFlag_RightTripleClicked = (1<<17), + UI_SignalFlag_LeftTripleClicked = (1<<21), + UI_SignalFlag_MiddleTripleClicked = (1<<22), + UI_SignalFlag_RightTripleClicked = (1<<23), // rjf: keyboard pressed -> box had focus, user activated via their keyboard - UI_SignalFlag_KeyboardPressed = (1<<18), + UI_SignalFlag_KeyboardPressed = (1<<24), // rjf: passive mouse info - UI_SignalFlag_Hovering = (1<<19), // hovering specifically this box - UI_SignalFlag_MouseOver = (1<<20), // mouse is over, but may be occluded + UI_SignalFlag_Hovering = (1<<25), // hovering specifically this box + UI_SignalFlag_MouseOver = (1<<26), // mouse is over, but may be occluded // rjf: committing state changes via user interaction - UI_SignalFlag_Commit = (1<<21), + UI_SignalFlag_Commit = (1<<27), // rjf: high-level combos UI_SignalFlag_Pressed = UI_SignalFlag_LeftPressed|UI_SignalFlag_KeyboardPressed, @@ -484,8 +494,8 @@ struct UI_State UI_Key hot_box_key; UI_Key active_box_key[UI_MouseButtonKind_COUNT]; UI_Key clipboard_copy_key; - U64 last_press_timestamp_us[UI_MouseButtonKind_COUNT]; - UI_Key last_press_key[UI_MouseButtonKind_COUNT]; + U64 press_timestamp_history_us[UI_MouseButtonKind_COUNT][3]; + UI_Key press_key_history[UI_MouseButtonKind_COUNT][3]; Vec2F32 drag_start_mouse; Arena *drag_state_arena; String8 drag_state_data; From 8c5c0be0408f4d3d601ec7548594d6ac392b61ea Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 11:17:01 -0700 Subject: [PATCH 266/275] ui: further improvements to double/triple dragging detection; df: use double/triple dragging to determine mouse-drag-range. dbl -> use token range, triple -> use line. pick appropriate side of mouse drag range on drag based on side of mark. --- src/base/base_core.c | 8 ++++++++ src/base/base_core.h | 1 + src/df/gfx/df_gfx.c | 45 ++++++++++++++++++++++++++++++++++++++++++-- src/ui/ui_core.c | 10 ++++++++-- src/ui/ui_core.h | 1 + 5 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/base/base_core.c b/src/base/base_core.c index 24a6aaaa..2d40fe34 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -387,6 +387,14 @@ txt_rng_union(TxtRng a, TxtRng b) return result; } +internal B32 +txt_rng_contains(TxtRng r, TxtPt pt) +{ + B32 result = ((txt_pt_less_than(r.min, pt) || txt_pt_match(r.min, pt)) && + txt_pt_less_than(pt, r.max)); + return result; +} + //////////////////////////////// //~ rjf: Toolchain/Environment Enum Functions diff --git a/src/base/base_core.h b/src/base/base_core.h index c66772c1..87add9df 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -738,6 +738,7 @@ internal TxtPt txt_pt_max(TxtPt a, TxtPt b); internal TxtRng txt_rng(TxtPt min, TxtPt max); internal TxtRng txt_rng_intersect(TxtRng a, TxtRng b); internal TxtRng txt_rng_union(TxtRng a, TxtRng b); +internal B32 txt_rng_contains(TxtRng r, TxtPt pt); //////////////////////////////// //~ rjf: Toolchain/Environment Enum Functions diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 0d2da2b1..02a9ba04 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -9963,6 +9963,28 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ result.mouse_pt = mouse_pt; } + ////////////////////////////// + //- rjf: mouse point -> mouse token range, mouse line range + // + TxtRng mouse_token_rng = txt_rng(mouse_pt, mouse_pt); + TxtRng mouse_line_rng = txt_rng(mouse_pt, mouse_pt); + if(contains_1s64(params->line_num_range, mouse_pt.line)) + { + TXT_TokenArray *line_tokens = ¶ms->line_tokens[mouse_pt.line-params->line_num_range.min]; + Rng1U64 line_range = params->line_ranges[mouse_pt.line-params->line_num_range.min]; + U64 mouse_pt_off = (mouse_pt.column-1) + line_range.min; + for(U64 line_token_idx = 0; line_token_idx < line_tokens->count; line_token_idx += 1) + { + TXT_Token *line_token = &line_tokens->v[line_token_idx]; + if(contains_1u64(line_token->range, mouse_pt_off)) + { + mouse_token_rng = txt_rng(txt_pt(mouse_pt.line, 1+line_token->range.min-line_range.min), txt_pt(mouse_pt.line, 1+line_token->range.max-line_range.min)); + break; + } + } + mouse_line_rng = txt_rng(txt_pt(mouse_pt.line, 1), txt_pt(mouse_pt.line, 1+line_range.max)); + } + ////////////////////////////// //- rjf: interact with margin box & text box // @@ -9970,6 +9992,17 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_Signal text_container_sig = ui_signal_from_box(text_container_box); DF_Entity *line_drag_entity = &df_g_nil_entity; { + //- rjf: determine mouse drag range + TxtRng mouse_drag_rng = txt_rng(mouse_pt, mouse_pt); + if(text_container_sig.f & UI_SignalFlag_LeftTripleDragging) + { + mouse_drag_rng = mouse_line_rng; + } + else if(text_container_sig.f & UI_SignalFlag_LeftDoubleDragging) + { + mouse_drag_rng = mouse_token_rng; + } + //- rjf: clicking/dragging over the text container if(!ctrlified && ui_dragging(text_container_sig)) { @@ -9987,9 +10020,17 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } if(ui_pressed(text_container_sig)) { - *mark = mouse_pt; + *cursor = mouse_drag_rng.max; + *mark = mouse_drag_rng.min; + } + if(txt_pt_less_than(mouse_pt, *mark)) + { + *cursor = mouse_drag_rng.min; + } + else + { + *cursor = mouse_drag_rng.max; } - *cursor = mouse_pt; *preferred_column = cursor->column; } diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 19a577f1..be62687e 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2464,8 +2464,11 @@ ui_signal_from_box(UI_Box *box) sizeof(ui_state->press_timestamp_history_us[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_timestamp_history_us[evt_mouse_button_kind])-1); MemoryCopy(&ui_state->press_key_history[evt_mouse_button_kind][1], &ui_state->press_key_history[evt_mouse_button_kind][0], sizeof(ui_state->press_key_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_key_history[evt_mouse_button_kind])-1); + MemoryCopy(&ui_state->press_pos_history[evt_mouse_button_kind][1], &ui_state->press_pos_history[evt_mouse_button_kind][0], + sizeof(ui_state->press_pos_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_pos_history[evt_mouse_button_kind])-1); ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] = evt->timestamp_us; ui_state->press_key_history[evt_mouse_button_kind][0] = box->key; + ui_state->press_pos_history[evt_mouse_button_kind][0] = evt_mouse; taken = 1; } @@ -2652,7 +2655,8 @@ ui_signal_from_box(UI_Box *box) if(sig.f & (UI_SignalFlag_LeftDragging<press_key_history[k][0], box->key) && ui_key_match(ui_state->press_key_history[k][1], box->key) && - ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time()) + ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time() && + length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f) { sig.f |= (UI_SignalFlag_LeftDoubleDragging<press_key_history[k][1], box->key) && ui_key_match(ui_state->press_key_history[k][2], box->key) && ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time() && - ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*os_double_click_time()) + ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*os_double_click_time() && + length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f && + length_2f32(sub_2f32(ui_state->press_pos_history[k][1], ui_state->press_pos_history[k][2])) < 10.f) { sig.f |= (UI_SignalFlag_LeftTripleDragging< Date: Fri, 29 Mar 2024 11:28:45 -0700 Subject: [PATCH 267/275] eliminate old text searching thread code --- src/df/gfx/df_gfx.c | 299 ------------------------------------------ src/df/gfx/df_gfx.h | 76 ----------- src/df/gfx/df_views.c | 56 -------- 3 files changed, 431 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 02a9ba04..a4bc8282 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -7643,305 +7643,6 @@ df_push_search_string(Arena *arena) return result; } -//////////////////////////////// -//~ rjf: Background Text Searching Thread - -internal void -df_text_search_match_chunk_list_push(Arena *arena, DF_TextSearchMatchChunkList *list, U64 cap, DF_TextSearchMatch *match) -{ - DF_TextSearchMatchChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, DF_TextSearchMatchChunkNode, 1); - node->cap = cap; - node->v = push_array_no_zero(arena, DF_TextSearchMatch, node->cap); - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - } - node->v[node->count] = *match; - node->count += 1; - list->total_count += 1; -} - -internal DF_TextSearchMatchArray -df_text_search_match_array_from_chunk_list(Arena *arena, DF_TextSearchMatchChunkList *chunks) -{ - DF_TextSearchMatchArray array = {0}; - array.count = chunks->total_count; - array.v = push_array_no_zero(arena, DF_TextSearchMatch, array.count); - U64 idx = 0; - for(DF_TextSearchMatchChunkNode *node = chunks->first; node != 0; node = node->next) - { - MemoryCopy(array.v+idx, node->v, node->count * sizeof(DF_TextSearchMatch)); - idx += node->count; - } - return array; -} - -internal U64 -df_text_search_little_hash_from_hash(U128 hash) -{ - // TODO(rjf): [ ] @de2ctrl df_text_search_little_hash_from_hash - U64 little_hash = 0; - MemoryCopy(&little_hash, &hash, sizeof(little_hash)); - return little_hash; -} - -internal void -df_text_search_thread_entry_point(void *p) -{ -#if 0 - // TODO(rjf): [ ] @de2ctrl text searcher -- wound up in DE_Hash - - //- rjf: types - typedef enum WorkKind - { - WorkKind_Search, - WorkKind_GarbageCollect, - WorkKind_COUNT - } - WorkKind; - typedef struct WorkNode WorkNode; - struct WorkNode - { - WorkNode *next; - WorkKind kind; - U128 hash; - String8 needle; - DF_TextSliceFlags flags; - TxtPt start_pt; - }; - - //- rjf: set up local debug engine map - Arena *local_map_arena = arena_alloc(); - DE_ContentMap local_map = {0}; - DE_PipelineHint hint = zero_struct; - - //- rjf: loop over work - for(;;) - { - //- rjf: begin - Temp scratch = scratch_begin(0, 0); - DE_Session *session = de_session_begin(); - - //- rjf: wait for changes - os_mutex_take(df_gfx_state->tsrch_wakeup_mutex); - os_condition_variable_wait(df_gfx_state->tsrch_wakeup_cv, df_gfx_state->tsrch_wakeup_mutex, os_now_microseconds()+1000000); - os_mutex_drop(df_gfx_state->tsrch_wakeup_mutex); - - //- rjf: gather all searches to complete - WorkNode *first_work_node = 0; - WorkNode *last_work_node = 0; - for(U64 slot_idx = 0; slot_idx < df_gfx_state->tsrch_slot_count; slot_idx += 1) - { - //- rjf: slot idx -> slot * stripe - DF_TextSearchCacheSlot *slot = &df_gfx_state->tsrch_slots[slot_idx]; - U64 stripe_idx = slot_idx%df_gfx_state->tsrch_stripe_count; - OS_Handle stripe_rw_mutex = df_gfx_state->tsrch_stripe_rw_mutexes[stripe_idx]; - - //- rjf: gather nodes in this slot - os_rw_mutex_take_r(stripe_rw_mutex); - { - for(DF_TextSearchCacheNode *n = slot->first; n != 0; n = n->next) - { - B32 not_done = (n->good == 0); - B32 expired = (os_now_microseconds() >= n->last_time_touched_us + 10000000); - if(not_done || expired) - { - WorkNode *work = push_array(scratch.arena, WorkNode, 1); - work->kind = not_done ? WorkKind_Search : WorkKind_GarbageCollect; - work->hash = n->hash; - work->needle = push_str8_copy(scratch.arena, n->needle); - work->flags = n->flags; - work->start_pt = n->start_pt; - SLLQueuePush(first_work_node, last_work_node, work); - } - } - } - os_rw_mutex_drop_r(stripe_rw_mutex); - } - - //- rjf: perform all searches - for(WorkNode *work_node = first_work_node; work_node != 0; work_node = work_node->next) - { - //- rjf: unpack work node - WorkKind kind = work_node->kind; - DE_Hash hash = work_node->hash; - String8 needle = work_node->needle; - DF_TextSliceFlags flags = work_node->flags; - TxtPt start_pt = work_node->start_pt; - - //- rjf: work params -> slot/stripe info - U64 little_hash = df_text_search_little_hash_from_hash(hash); - U64 slot_idx = little_hash%df_gfx_state->tsrch_slot_count; - DF_TextSearchCacheSlot *slot = &df_gfx_state->tsrch_slots[slot_idx]; - U64 stripe_idx = slot_idx%df_gfx_state->tsrch_stripe_count; - OS_Handle stripe_rw_mutex = df_gfx_state->tsrch_stripe_rw_mutexes[stripe_idx]; - - //- rjf: do work - switch(kind) - { - //- rjf: search - default: - case WorkKind_Search: - { - //- rjf: hash -> artifacts - DE_Key hash2data_key = de_key_hash(DE_KeyFunc_DataFromHash, &hash); - DE_Val *hash2data_val = de_shared_chained_lookup(local_map_arena, &local_map, de_shared, &hint, &hash2data_key); - DE_ContentBlock *hash2data_block = de_session_node_access_via_val(session, hash2data_val); - String8 data = hash2data_block->data; - DE_Key hash2txti_key = de_key_hash(DE_KeyFunc_TxtiFromHash, &hash); - DE_Val *hash2txti_val = de_shared_chained_lookup(local_map_arena, &local_map, de_shared, &hint, &hash2txti_key); - DE_ContentBlock *hash2txti_block = de_session_node_access_via_val(session, hash2txti_val); - DE_InfoTxt *txt = hash2txti_block->txt; - - //- rjf: start pt -> search start offset - U64 start_off = 0; - if(1 <= start_pt.line && start_pt.line <= txt->line_count) - { - start_off = txt->line_ranges[start_pt.line-1].min; - if(1 <= start_pt.column && start_pt.column <= dim_1u64(txt->line_ranges[start_pt.line-1])) - { - start_off += (start_pt.column-1); - } - } - - //- rjf: search for all needle occurrences - U8 *byte_first = data.str; - U8 *byte_opl = data.str+data.size; - U8 *byte_start = byte_first + start_off; - U64 num_bytes_traversed = 0; - for(U8 *byte = byte_start; num_bytes_traversed < data.size;) - { - String8 rest_of_data = str8(byte, byte_opl-byte); - String8 next_needle_size = str8_prefix(rest_of_data, needle.size); - B32 found_match = str8_match(next_needle_size, needle, StringMatchFlag_CaseInsensitive); - - // rjf: record match - if(found_match) - { - U64 match_off = (U64)(byte-byte_first); - TxtPt match_pt = de_txt_pt_from_txti_off(txt, match_off); - DF_TextSearchMatch match = {match_pt}; - os_rw_mutex_take_w(stripe_rw_mutex); - { - DF_TextSearchCacheNode *node = 0; - for(DF_TextSearchCacheNode *n = slot->first; n != 0; n = n->next) - { - if(MemoryMatchStruct(&hash, &n->hash) && - str8_match(needle, n->needle, 0) && - flags == n->flags) - { - node = n; - } - } - df_text_search_match_chunk_list_push(node->arena, &node->search_matches, 256, &match); - node->good = 1; - } - os_rw_mutex_drop_w(stripe_rw_mutex); - } - - // rjf: increment - byte += 1; - num_bytes_traversed += 1; - if(byte >= byte_opl) - { - byte = byte_first; - } - } - - }break; - - //- rjf: garbage collect - case WorkKind_GarbageCollect: - { - os_rw_mutex_take_w(stripe_rw_mutex); - { - DF_TextSearchCacheNode *node = 0; - for(DF_TextSearchCacheNode *n = slot->first; n != 0; n = n->next) - { - if(MemoryMatchStruct(&hash, &n->hash) && - str8_match(needle, n->needle, 0) && - flags == n->flags) - { - node = n; - } - } - if(node != 0) - { - DLLRemove(slot->first, slot->last, node); - arena_release(node->arena); - } - } - os_rw_mutex_drop_w(stripe_rw_mutex); - }break; - } - } - - //- rjf: end - de_session_end(session); - scratch_end(scratch); - } -#endif -} - -internal int -df_text_search_match_array_qsort_compare(TxtPt *a, TxtPt *b) -{ - int result = 0; - if(txt_pt_less_than(*a, *b)) - { - result = -1; - } - else if(txt_pt_less_than(*b, *a)) - { - result = +1; - } - return result; -} - -internal void -df_text_search_match_array_sort_in_place(DF_TextSearchMatchArray *array) -{ - qsort(array->v, array->count, sizeof(DF_TextSearchMatch), (int (*)(const void *, const void *))df_text_search_match_array_qsort_compare); -} - -internal DF_TextSearchMatch -df_text_search_match_array_find_nearest__linear_scan(DF_TextSearchMatchArray *array, TxtPt pt, Side side) -{ - ProfBeginFunction(); - DF_TextSearchMatch result = {0}; - if(array->count != 0) - { - S64 best_line_distance = max_S64; - S64 best_column_distance = max_S64; - B32 best_matches_side = 0; - for(U64 idx = 0; idx < array->count; idx += 1) - { - S64 line_distance = abs_s64(array->v[idx].pt.line - pt.line); - S64 column_distance = abs_s64(array->v[idx].pt.column - pt.column); - B32 matches_side = (side == Side_Max ? txt_pt_less_than(pt, array->v[idx].pt) : - side == Side_Min ? txt_pt_less_than(array->v[idx].pt, pt) : - 1); - if(matches_side >= best_matches_side && line_distance == 0 && column_distance < best_column_distance) - { - best_matches_side = matches_side; - best_line_distance = 0; - best_column_distance = column_distance; - result = array->v[idx]; - } - else if(matches_side >= best_matches_side && line_distance < best_line_distance) - { - best_matches_side = matches_side; - best_line_distance = line_distance; - result = array->v[idx]; - } - } - } - ProfEnd(); - return result; -} - //////////////////////////////// //~ rjf: Colors, Fonts, Config diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index ae1d455f..c20510f2 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -47,71 +47,6 @@ struct DF_StringBindingPair DF_Binding binding; }; -//////////////////////////////// -//~ rjf: Text Searching Types - -typedef struct DF_TextSearchMatch DF_TextSearchMatch; -struct DF_TextSearchMatch -{ - TxtPt pt; -}; - -typedef struct DF_TextSearchMatchChunkNode DF_TextSearchMatchChunkNode; -struct DF_TextSearchMatchChunkNode -{ - DF_TextSearchMatchChunkNode *next; - DF_TextSearchMatch *v; - U64 count; - U64 cap; -}; - -typedef struct DF_TextSearchMatchChunkList DF_TextSearchMatchChunkList; -struct DF_TextSearchMatchChunkList -{ - DF_TextSearchMatchChunkNode *first; - DF_TextSearchMatchChunkNode *last; - U64 node_count; - U64 total_count; -}; - -typedef struct DF_TextSearchMatchArray DF_TextSearchMatchArray; -struct DF_TextSearchMatchArray -{ - DF_TextSearchMatch *v; - U64 count; -}; - -typedef struct DF_TextSearchCacheNode DF_TextSearchCacheNode; -struct DF_TextSearchCacheNode -{ - // rjf: links - DF_TextSearchCacheNode *next; - DF_TextSearchCacheNode *prev; - - // rjf: allocation - Arena *arena; - - // rjf: search parameters - U128 hash; - String8 needle; - DF_TextSliceFlags flags; - TxtPt start_pt; - - // rjf: search results - B32 good; - DF_TextSearchMatchChunkList search_matches; - - // rjf: last time touched - U64 last_time_touched_us; -}; - -typedef struct DF_TextSearchCacheSlot DF_TextSearchCacheSlot; -struct DF_TextSearchCacheSlot -{ - DF_TextSearchCacheNode *first; - DF_TextSearchCacheNode *last; -}; - //////////////////////////////// //~ rjf: Key Map Types @@ -985,17 +920,6 @@ internal void df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_Ct internal void df_set_search_string(String8 string); internal String8 df_push_search_string(Arena *arena); -//////////////////////////////// -//~ rjf: Text Searching - -internal void df_text_search_match_chunk_list_push(Arena *arena, DF_TextSearchMatchChunkList *list, U64 cap, DF_TextSearchMatch *match); -internal DF_TextSearchMatchArray df_text_search_match_array_from_chunk_list(Arena *arena, DF_TextSearchMatchChunkList *chunks); -internal U64 df_text_search_little_hash_from_hash(U128 hash); -internal void df_text_search_thread_entry_point(void *p); -internal int df_text_search_match_array_qsort_compare(TxtPt *a, TxtPt *b); -internal void df_text_search_match_array_sort_in_place(DF_TextSearchMatchArray *array); -internal DF_TextSearchMatch df_text_search_match_array_find_nearest__linear_scan(DF_TextSearchMatchArray *array, TxtPt pt, Side side); - //////////////////////////////// //~ rjf: Colors, Fonts, Config diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 65286173..b168524b 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -5172,17 +5172,6 @@ DF_VIEW_UI_FUNCTION_DEF(Code) tv->center_cursor = 1; } - ////////////////////////////// - //- rjf: search query -> matches - // - DF_TextSearchMatchArray search_query_matches = {0}; -#if 0 - { - search_query_matches = df_text_search_match_array_from_entity_needle(scratch.arena, entity, search_query, entity_line_string_flags, tv->cursor); - df_text_search_match_array_sort_in_place(&search_query_matches); - } -#endif - ////////////////////////////// //- rjf: do searching operations // @@ -5525,23 +5514,6 @@ DF_VIEW_UI_FUNCTION_DEF(Code) // if(text_info_is_ready) { - // rjf: center first match - TxtPt next_match = df_text_search_match_array_find_nearest__linear_scan(&search_query_matches, tv->cursor, search_query_side).pt; - if(search_query.size != 0 && next_match.line != 0) - { - // TODO(rjf): [ ] @de2ctrl -#if 0 - DF_TextSlice match_line_slice = df_text_slice_from_entity(scratch.arena, entity, r1s64(next_match.line, next_match.line), entity_line_string_flags); - String8 match_line = match_line_slice.visible_range_text; - F32 match_advance = f_dim_from_tag_size_string(code_font, code_font_size, str8_prefix(match_line, next_match.column-1)).x; - container_box->view_off_target.x = match_advance - code_area_dim.x/2; - container_box->view_off_target.y = next_match.line*code_line_height - code_area_dim.y/2 + code_line_height*1.5f; - container_box->view_off_target.x = ClampBot(container_box->view_off_target.x, 0); - container_box->view_off_target.y = ClampBot(container_box->view_off_target.y, 0); - tv->drifted_for_search = 1; -#endif - } - // rjf: contain => snap if(tv->contain_cursor) { @@ -6983,17 +6955,6 @@ DF_VIEW_UI_FUNCTION_DEF(Output) tv->center_cursor = 1; } - ////////////////////////////// - //- rjf: search query -> matches - // - DF_TextSearchMatchArray search_query_matches = {0}; -#if 0 - { - search_query_matches = df_text_search_match_array_from_entity_needle(scratch.arena, entity, search_query, entity_line_string_flags, tv->cursor); - df_text_search_match_array_sort_in_place(&search_query_matches); - } -#endif - ////////////////////////////// //- rjf: do searching operations // @@ -7212,23 +7173,6 @@ DF_VIEW_UI_FUNCTION_DEF(Output) // if(txti_buffer_is_ready) { - // rjf: center first match - TxtPt next_match = df_text_search_match_array_find_nearest__linear_scan(&search_query_matches, tv->cursor, search_query_side).pt; - if(search_query.size != 0 && next_match.line != 0) - { - // TODO(rjf): [ ] @de2ctrl -#if 0 - DF_TextSlice match_line_slice = df_text_slice_from_entity(scratch.arena, entity, r1s64(next_match.line, next_match.line), entity_line_string_flags); - String8 match_line = match_line_slice.visible_range_text; - F32 match_advance = f_dim_from_tag_size_string(code_font, code_font_size, str8_prefix(match_line, next_match.column-1)).x; - container_box->view_off_target.x = match_advance - code_area_dim.x/2; - container_box->view_off_target.y = next_match.line*code_line_height - code_area_dim.y/2 + code_line_height*1.5f; - container_box->view_off_target.x = ClampBot(container_box->view_off_target.x, 0); - container_box->view_off_target.y = ClampBot(container_box->view_off_target.y, 0); - tv->drifted_for_search = 1; -#endif - } - // rjf: contain => snap if(tv->contain_cursor) { From c1b92c1b2717424a6e2ecc3be04cb64ea3b47ece Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 11:51:20 -0700 Subject: [PATCH 268/275] reintroduce support for address/code-bytes toggling in disassembly view; also reintroduce support for toggle-watch-expr and goto-name commands --- src/dasm_cache/dasm_cache.c | 29 +++++++++++- src/df/core/df_core.h | 15 +------ src/df/gfx/df_views.c | 89 ++++++++++++++++--------------------- src/df/gfx/df_views.h | 1 + src/text_cache/text_cache.c | 13 ++++++ 5 files changed, 81 insertions(+), 66 deletions(-) diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c index a3935cae..7bc0ec02 100644 --- a/src/dasm_cache/dasm_cache.c +++ b/src/dasm_cache/dasm_cache.c @@ -383,7 +383,11 @@ dasm_parse_thread__entry_point(void *p) { for(DASM_Node *n = slot->first; n != 0; n = n->next) { - if(u128_match(n->hash, hash) && n->addr == addr && n->arch == arch) + if(u128_match(n->hash, hash) && + n->addr == addr && + n->arch == arch && + n->style_flags == style_flags && + n->syntax == syntax) { got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); break; @@ -441,7 +445,26 @@ dasm_parse_thread__entry_point(void *p) { addr_part = push_str8f(scratch.arena, "%016I64X ", addr+off); } - String8 inst_string = push_str8f(scratch.arena, "%S%s", addr_part, udc.asm_buf); + String8 code_bytes_part = {0}; + if(style_flags & DASM_StyleFlag_CodeBytes) + { + String8List code_bytes_strings = {0}; + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit("{")); + for(U64 byte_idx = 0; byte_idx < size || byte_idx < 16; byte_idx += 1) + { + if(byte_idx < size) + { + str8_list_pushf(scratch.arena, &code_bytes_strings, "%02x%s ", (U32)data.str[off+byte_idx], byte_idx == size-1 ? "}" : ""); + } + else if(byte_idx < 8) + { + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); + } + } + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); + code_bytes_part = str8_list_join(scratch.arena, &code_bytes_strings, 0); + } + String8 inst_string = push_str8f(scratch.arena, "%S%S%s", addr_part, code_bytes_part, udc.asm_buf); DASM_Inst inst = {off, rel_voff, r1u64(inst_strings.total_size + inst_strings.node_count, inst_strings.total_size + inst_strings.node_count + inst_string.size)}; dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); @@ -474,6 +497,8 @@ dasm_parse_thread__entry_point(void *p) hash.u64[1], addr, (U64)arch, + (U64)style_flags, + (U64)syntax, 0x4d534144, }; text_key = hs_hash_from_data(str8((U8 *)hash_data, sizeof(hash_data))); diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index c97f215a..b038b254 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -511,20 +511,7 @@ struct DF_EntityFuzzyItemArray }; //////////////////////////////// -//~ rjf: Text Slices (output type from data which can be used to produce readable text) - -//- rjf: text slice construction flags - -typedef U32 DF_TextSliceFlags; -enum -{ - DF_TextSliceFlag_CodeBytes = (1<<0), - DF_TextSliceFlag_Addresses = (1<<1), - DF_TextSliceFlag_Tokens = (1<<2), - DF_TextSliceFlag_Src2Dasm = (1<<3), - DF_TextSliceFlag_Dasm2Src = (1<<4), - DF_TextSliceFlag_VirtualOff= (1<<5), -}; +//~ rjf: Source <-> Disasm Types //- rjf: debug info for mapping src -> disasm diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index b168524b..d48213ed 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -4863,13 +4863,6 @@ DF_VIEW_CMD_FUNCTION_DEF(Code) params.string = expr_text; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression)); - - // rjf: flash marker for grabbed expr - DF_Entity *flash_marker = df_entity_alloc(0, entity, DF_EntityKind_FlashMarker); - df_entity_equip_death_timer(flash_marker, 0.5f); - df_entity_equip_txt_pt(flash_marker, txt_pt_from_info_off__linear_scan(&text_info, expr_range.min)); - df_entity_equip_txt_pt_alt(flash_marker, txt_pt_from_info_off__linear_scan(&text_info, expr_range.max)); - df_entity_equip_color_rgba(flash_marker, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); scratch_end(scratch); } hs_scope_close(hs_scope); @@ -5442,15 +5435,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code) //- rjf: copy text if(!txt_pt_match(sig.copy_range.min, sig.copy_range.max)) { - Temp temp = temp_begin(scratch.arena); - DF_Entity *flash_range = df_entity_alloc(0, entity, DF_EntityKind_FlashMarker); - df_entity_equip_death_timer(flash_range, 0.5f); - df_entity_equip_color_rgba(flash_range, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); - df_entity_equip_txt_pt(flash_range, sig.copy_range.min); - df_entity_equip_txt_pt_alt(flash_range, sig.copy_range.max); String8 text = txt_string_from_info_data_txt_rng(&text_info, data, sig.copy_range); os_set_clipboard_text(text); - temp_end(temp); } //- rjf: toggle cursor watch @@ -5736,6 +5722,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(Disassembly) dv->mark = txt_pt(1, 1); dv->preferred_column = 1; dv->find_text_arena = df_view_push_arena_ext(view); + dv->style_flags = DASM_StyleFlag_Addresses; } } @@ -5761,7 +5748,7 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64)); U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0); U128 dasm_data_hash = {0}; - DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, DASM_StyleFlag_Addresses, DASM_Syntax_Intel, &dasm_data_hash); + DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, dv->style_flags, DASM_Syntax_Intel, &dasm_data_hash); U128 dasm_text_hash = {0}; TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, dasm_info.text_key, txt_lang_kind_from_architecture(arch), &dasm_text_hash); String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); @@ -5884,56 +5871,63 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly) df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetThreadIP)); } }break; + case DF_CoreCmdKind_ToggleCodeBytesVisibility: + { + dv->style_flags ^= DASM_StyleFlag_CodeBytes; + }break; + case DF_CoreCmdKind_ToggleAddressVisibility: + { + dv->style_flags ^= DASM_StyleFlag_Addresses; + }break; case DF_CoreCmdKind_GoToNameAtCursor: { - // TODO(rjf) -#if 0 - Temp scratch = scratch_begin(0, 0); - TXTI_Handle txti_handle = df_txti_handle_from_entity(entity); - TxtRng expr_range = txt_rng(tv->cursor, tv->mark); - if(txt_pt_match(tv->cursor, tv->mark)) + // rjf: determine expression range + Rng1U64 expr_range = {0}; { - expr_range = txti_expr_range_from_handle_pt(txti_handle, tv->cursor); + TxtRng selection_range = txt_rng(dv->cursor, dv->mark); + if(txt_pt_match(selection_range.min, selection_range.max)) + { + expr_range = txt_expr_off_range_from_info_data_pt(&dasm_text_info, dasm_text_data, dv->cursor); + } + else + { + expr_range = r1u64(txt_off_from_info_pt(&dasm_text_info, selection_range.min), txt_off_from_info_pt(&dasm_text_info, selection_range.max)); + } } - String8 expr_text = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_range); + + // rjf: expression range -> text + String8 expr_text = str8_substr(dasm_text_data, expr_range); // rjf: go to name DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(entity); params.string = expr_text; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName)); - - scratch_end(scratch); -#endif }break; case DF_CoreCmdKind_ToggleWatchExpressionAtCursor: { - // TODO(rjf) -#if 0 - Temp scratch = scratch_begin(0, 0); - TXTI_Handle txti_handle = df_txti_handle_from_entity(entity); - TxtRng expr_range = txt_rng(tv->cursor, tv->mark); - if(txt_pt_match(tv->cursor, tv->mark)) + // rjf: determine expression range + Rng1U64 expr_range = {0}; { - expr_range = txti_expr_range_from_handle_pt(txti_handle, tv->cursor); + TxtRng selection_range = txt_rng(dv->cursor, dv->mark); + if(txt_pt_match(selection_range.min, selection_range.max)) + { + expr_range = txt_expr_off_range_from_info_data_pt(&dasm_text_info, dasm_text_data, dv->cursor); + } + else + { + expr_range = r1u64(txt_off_from_info_pt(&dasm_text_info, selection_range.min), txt_off_from_info_pt(&dasm_text_info, selection_range.max)); + } } - String8 expr_text = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_range); + + // rjf: expression range -> text + String8 expr_text = str8_substr(dasm_text_data, expr_range); // rjf: toggle watch expr DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.string = expr_text; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression)); - - // rjf: flash marker for grabbed expr - DF_Entity *flash_marker = df_entity_alloc(entity, DF_EntityKind_FlashMarker); - df_entity_equip_death_timer(flash_marker, 0.5f); - df_entity_equip_txt_pt(flash_marker, expr_range.min); - df_entity_equip_txt_pt_alt(flash_marker, expr_range.max); - df_entity_equip_color_rgba(flash_marker, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); - scratch_end(scratch); -#endif }break; } } @@ -5997,7 +5991,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64)); U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0); U128 dasm_data_hash = {0}; - DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, DASM_StyleFlag_Addresses, DASM_Syntax_Intel, &dasm_data_hash); + DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, dv->style_flags, DASM_Syntax_Intel, &dasm_data_hash); U128 dasm_text_hash = {0}; TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, dasm_info.text_key, txt_lang_kind_from_architecture(arch), &dasm_text_hash); String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); @@ -7157,11 +7151,6 @@ DF_VIEW_UI_FUNCTION_DEF(Output) if(!txt_pt_match(sig.copy_range.min, sig.copy_range.max)) { Temp temp = temp_begin(scratch.arena); - DF_Entity *flash_range = df_entity_alloc(0, entity, DF_EntityKind_FlashMarker); - df_entity_equip_death_timer(flash_range, 0.5f); - df_entity_equip_color_rgba(flash_range, df_rgba_from_theme_color(DF_ThemeColor_Highlight0)); - df_entity_equip_txt_pt(flash_range, sig.copy_range.min); - df_entity_equip_txt_pt_alt(flash_range, sig.copy_range.max); String8 text = txti_string_from_handle_txt_rng(temp.arena, txti_handle, sig.copy_range); os_set_clipboard_text(text); temp_end(temp); diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 1d27436b..ebccf953 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -364,6 +364,7 @@ struct DF_DisasmViewState TxtPt mark; S64 preferred_column; B32 drifted_for_search; + DASM_StyleFlags style_flags; // rjf: per-frame command info S64 goto_line_num; diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 3c69d0cb..a9a3ea43 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -650,6 +650,7 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed U64 off = 0; B32 escaped = 0; B32 string_is_char = 0; + S32 brace_nest = 0; for(U64 advance = 0; off <= string.size; off += advance) { U8 byte = (off+0 < string.size) ? string.str[off+0] : 0; @@ -708,6 +709,14 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed active_token_start_off = off; active_token_kind = TXT_TokenKind_Symbol; advance = 1; + if(byte == '{') + { + brace_nest += 1; + } + else if(byte == '}') + { + brace_nest -= 1; + } } else { @@ -786,6 +795,10 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed } if(ender_found != 0) { + if(brace_nest != 0 && active_token_kind == TXT_TokenKind_Keyword) + { + active_token_kind = TXT_TokenKind_Numeric; + } TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)}; txt_token_chunk_list_push(arena, &tokens, 1024, &token); active_token_kind = TXT_TokenKind_Null; From 81c79c0ac2e72cc26c8e830173466987cff15131 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 12:52:19 -0700 Subject: [PATCH 269/275] sketch out parts of 'whole ui' eval viz pipeline build stage; fix copypaste issue with string viz --- src/df/core/df_core.mdesk | 7 +++++++ src/df/gfx/df_gfx.c | 4 ++-- src/df/gfx/df_gfx.h | 7 +++++++ src/df/gfx/df_gfx.mdesk | 30 +++++++++++++++--------------- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 8135ead4..8c38aa73 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -462,6 +462,13 @@ DF_CoreCmdTable:// | | | // rows, this stage offers the ability to build a ui // stretching over all of the rows. // +// whole ui build, "wu" -> sometimes, more sophisticated interfaces need to be +// provided for a view rule, that stretch beyond the +// limits of what could be offered inside a watch +// window block. in such cases, the eval/view-rule +// combo will be granted its own tab for example, and +// this stage is used to fill such a ui. +// // A few other bits are included for various ways in which a view rule may be // applied throughout the eval visualization pipeline. A list follows: // diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index a4bc8282..d6b7ed78 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6878,8 +6878,8 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(!has_array && direct_type_is_string && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && eval.mode == EVAL_EvalMode_Addr) { U64 string_memory_addr = value_eval.imm_u64; - U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval.type_key); - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, element_size, 0); + U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type_key); + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, string_memory_addr, 256, element_size, 0); String8 raw_text = {0}; switch(element_size) { diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index c20510f2..ae72efcf 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -281,6 +281,7 @@ enum DF_GfxViewRuleSpecInfoFlag_LineStringize = (1<<1), DF_GfxViewRuleSpecInfoFlag_RowUI = (1<<2), DF_GfxViewRuleSpecInfoFlag_BlockUI = (1<<3), + DF_GfxViewRuleSpecInfoFlag_WholeUI = (1<<4), }; #define DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(name) void name(void) @@ -299,10 +300,15 @@ enum #define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name) df_gfx_view_rule_block_ui__##name #define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name)) +#define DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, struct DF_Panel *panel, struct DF_View *view, Rng2F32 rect, DBGI_Scope *dbgi_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, struct DF_CfgNode *cfg) +#define DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME(name) df_gfx_view_rule_whole_ui__##name +#define DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_WHOLW_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME(name)) + typedef DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(DF_GfxViewRuleVizRowProdHookFunctionType); typedef DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(DF_GfxViewRuleLineStringizeHookFunctionType); typedef DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GfxViewRuleRowUIFunctionType); typedef DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GfxViewRuleBlockUIFunctionType); +typedef DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_SIG(DF_GfxViewRuleWholeUIFunctionType); typedef struct DF_GfxViewRuleSpecInfo DF_GfxViewRuleSpecInfo; struct DF_GfxViewRuleSpecInfo @@ -313,6 +319,7 @@ struct DF_GfxViewRuleSpecInfo DF_GfxViewRuleLineStringizeHookFunctionType *line_stringize; DF_GfxViewRuleRowUIFunctionType *row_ui; DF_GfxViewRuleBlockUIFunctionType *block_ui; + DF_GfxViewRuleWholeUIFunctionType *whole_ui; }; typedef struct DF_GfxViewRuleSpecInfoArray DF_GfxViewRuleSpecInfoArray; diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index 14ad8d43..92a4283e 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -231,23 +231,23 @@ DF_CmdParamSlot2ViewSpecMap: // // NOTE(rjf): see @view_rule_info -@table(string vr ls ru bu) +@table(string vr ls ru bu wu) DF_GfxViewRuleTable: { - {"array" - - - -} - {"list" x - - -} - {"dec" - x - -} - {"bin" - x - -} - {"oct" - x - -} - {"hex" - x - -} - {"only" x x - -} - {"omit" x x - -} - {"no_addr" - x - -} - {"rgba" - - x x} - {"text" - - - x} - {"disasm" - - - x} - {"bitmap" - - x x} - {"geo" - - x x} + {"array" - - - - - } + {"list" x - - - - } + {"dec" - x - - - } + {"bin" - x - - - } + {"oct" - x - - - } + {"hex" - x - - - } + {"only" x x - - - } + {"omit" x x - - - } + {"no_addr" - x - - - } + {"rgba" - - x x - } + {"text" - - - x - } + {"disasm" - - - x - } + {"bitmap" - - x x x } + {"geo" - - x x - } } //////////////////////////////// From f2dd1e3c2dfd4bc8c8352b8704d70cf72742038f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 14:02:46 -0700 Subject: [PATCH 270/275] further sketching & setting up for escape-hatch-style view rule uis --- src/df/core/df_core.mdesk | 50 ++++------- src/df/core/generated/df_core.meta.h | 8 -- src/df/gfx/df_gfx.c | 19 ++-- src/df/gfx/df_gfx.h | 9 +- src/df/gfx/df_gfx.mdesk | 19 +++- src/df/gfx/df_view_rule_hooks.c | 129 ++++++++++++++++----------- src/df/gfx/df_views.c | 25 +++++- src/df/gfx/generated/df_gfx.meta.c | 31 +++---- src/df/gfx/generated/df_gfx.meta.h | 16 +++- 9 files changed, 180 insertions(+), 126 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 8c38aa73..354798a6 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -16,14 +16,6 @@ DF_CfgSrcTable: //////////////////////////////// //~ rjf: Entity Kind Tables -@table(name) -DF_NameKindTable: -{ - {Null} - {EntityName} - {EntityKindName} -} - @table(name name_lower op_delete op_freeze op_edit op_rename op_enable op_cond op_dup lf_mut_user_cfg tr_mut_user_cfg lf_mut_prof_cfg tr_mut_prof_cfg lf_mut_halt lf_mut_dbg tr_mut_halt tr_mut_dbg name_is_code user_lifetime name_label icon_kind display_string) DF_EntityKindTable: { @@ -81,24 +73,24 @@ DF_EntityKindTable: @table(name, name_lower, c_type) DF_CmdParamSlotTable: { - {Window, window, `DF_Handle`} - {Panel, panel, `DF_Handle`} - {DestPanel, dest_panel, `DF_Handle`} - {PrevView, prev_view, `DF_Handle`} - {View, view, `DF_Handle`} - {Entity, entity, `DF_Handle`} - {EntityList, entity_list, `DF_HandleList`} - {String, string, `String8`} - {FilePath, file_path, `String8`} - {TextPoint, text_point, `TxtPt`} - {CmdSpec, cmd_spec, `struct DF_CmdSpec *`} - {ViewSpec, view_spec, `struct DF_ViewSpec *`} - {VirtualAddr, vaddr, `U64`} - {VirtualOff, voff, `U64`} - {Index, index, `U64`} - {ID, id, `U64`} - {PreferDisassembly, prefer_dasm, `B32`} - {ForceConfirm, force_confirm,`B32`} + {Window window `DF_Handle`} + {Panel panel `DF_Handle`} + {DestPanel dest_panel `DF_Handle`} + {PrevView prev_view `DF_Handle`} + {View view `DF_Handle`} + {Entity entity `DF_Handle`} + {EntityList entity_list `DF_HandleList`} + {String string `String8`} + {FilePath file_path `String8`} + {TextPoint text_point `TxtPt`} + {CmdSpec cmd_spec `struct DF_CmdSpec *`} + {ViewSpec view_spec `struct DF_ViewSpec *`} + {VirtualAddr vaddr `U64`} + {VirtualOff voff `U64`} + {Index index `U64`} + {ID id `U64`} + {PreferDisassembly prefer_dasm `B32`} + {ForceConfirm force_confirm `B32`} } @table(name lister_omit q_slot q_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_required canonical_icon string display_name desc search_tags ) @@ -1706,12 +1698,6 @@ DF_DevToggleTable: COUNT, } -@enum DF_NameKind: -{ - @expand(DF_NameKindTable, a) `$(a.name)`, - COUNT, -} - @enum DF_CoreCmdKind: { @expand(DF_CoreCmdTable, a) `$(a.name)`, diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index 839d6b19..c0c52a0b 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -46,14 +46,6 @@ DF_EntityKind_EndedProcess, DF_EntityKind_COUNT, } DF_EntityKind; -typedef enum DF_NameKind -{ -DF_NameKind_Null, -DF_NameKind_EntityName, -DF_NameKind_EntityKindName, -DF_NameKind_COUNT, -} DF_NameKind; - typedef enum DF_CoreCmdKind { DF_CoreCmdKind_Null, diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index d6b7ed78..b3fffc7d 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -9149,7 +9149,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ ui_set_next_pref_width(ui_px(params->margin_width_px, 1)); ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); ui_set_next_child_layout_axis(Axis2_Y); - margin_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable, str8_lit("margin_container")); + margin_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable), str8_lit("margin_container")); UI_Parent(margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) { U64 line_idx = 0; @@ -9162,7 +9162,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ DF_EntityList line_pins = params->line_pins[line_idx]; ui_set_next_hover_cursor(OS_Cursor_HandPoint); ui_set_next_background_color(v4f32(0, 0, 0, 0)); - UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); + UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); UI_Parent(line_margin_box) { //- rjf: build margin thread ip ui @@ -9215,7 +9215,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ ui_set_next_text_alignment(UI_TextAlign_Center); UI_Key thread_box_key = ui_key_from_stringf(top_container_box->key, "###ip_%p", thread); UI_Box *thread_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc| - UI_BoxFlag_Clickable| + UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| UI_BoxFlag_AnimatePosX| UI_BoxFlag_DrawText, thread_box_key); @@ -9341,7 +9341,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_BoxFlag_DrawHotEffects| UI_BoxFlag_DrawBorder| UI_BoxFlag_AnimatePosX| - UI_BoxFlag_Clickable| + UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| UI_BoxFlag_DisableTextTrunc, "%S##bp_%p", df_g_icon_kind_text_table[DF_IconKind_CircleFilled], @@ -9408,7 +9408,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_BoxFlag_DrawActiveEffects| UI_BoxFlag_DrawHotEffects| UI_BoxFlag_DrawBorder| - UI_BoxFlag_Clickable| + UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| UI_BoxFlag_AnimatePosX| UI_BoxFlag_DisableTextTrunc, "%S##watch_%p", @@ -9472,7 +9472,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { ui_set_next_hover_cursor(ctrlified ? OS_Cursor_HandPoint : OS_Cursor_IBar); ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - text_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable, str8_lit("text_container")); + text_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable), str8_lit("text_container")); } ////////////////////////////// @@ -9530,7 +9530,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ String8 explanation = df_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon); UI_Parent(line_extras_boxes[line_idx]) UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_Clickable, "###exception_info"); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder, "###exception_info"); UI_Parent(box) { UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_FailureBackground)) @@ -9580,7 +9580,10 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ ui_spacer(ui_em(1.5f, 1.f)); ui_set_next_pref_width(ui_children_sum(1)); UI_Key pin_box_key = ui_key_from_stringf(ui_key_zero(), "###pin_%p", pin); - UI_Box *pin_box = ui_build_box_from_key(UI_BoxFlag_AnimatePos|UI_BoxFlag_Clickable|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawBorder, pin_box_key); + UI_Box *pin_box = ui_build_box_from_key(UI_BoxFlag_AnimatePos| + UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawBorder, pin_box_key); UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(10, 1)) { Vec4F32 pin_color = df_rgba_from_theme_color(DF_ThemeColor_WeakText); diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index ae72efcf..0809b846 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -113,7 +113,7 @@ struct DF_ViewSpecInfo DF_ViewSpecFlags flags; String8 name; String8 display_string; - DF_NameKind name_kind; + enum DF_NameKind name_kind; DF_IconKind icon_kind; DF_ViewSetupFunctionType *setup_hook; DF_ViewStringFromStateFunctionType *string_from_state_hook; @@ -302,7 +302,7 @@ enum #define DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, struct DF_Panel *panel, struct DF_View *view, Rng2F32 rect, DBGI_Scope *dbgi_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, struct DF_CfgNode *cfg) #define DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME(name) df_gfx_view_rule_whole_ui__##name -#define DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_WHOLW_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME(name)) +#define DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME(name)) typedef DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(DF_GfxViewRuleVizRowProdHookFunctionType); typedef DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(DF_GfxViewRuleLineStringizeHookFunctionType); @@ -383,8 +383,9 @@ enum typedef U32 DF_CodeSliceFlags; enum { - DF_CodeSliceFlag_Margin = (1<<0), - DF_CodeSliceFlag_LineNums = (1<<1), + DF_CodeSliceFlag_Clickable = (1<<0), + DF_CodeSliceFlag_Margin = (1<<1), + DF_CodeSliceFlag_LineNums = (1<<2), }; typedef struct DF_CodeSliceParams DF_CodeSliceParams; diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index 92a4283e..4fbcbf72 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -177,6 +177,14 @@ DF_BindingVersionRemapTable: //////////////////////////////// //~ rjf: Gfx Layer View Kinds +@table(name) +DF_NameKindTable: +{ + {Null} + {EntityName} + {EntityKindName} +} + @table(name, name_lower, display_string, name_kind, icon, parameterized_by_entity, can_serialize, can_serialize_entity_path, can_filter, filter_is_code, typing_automatically_filters, inc_in_docs, docs_desc) DF_GfxViewTable: { @@ -196,6 +204,7 @@ DF_GfxViewTable: { PendingEntity "pending_entity" "Pending Entity" EntityName FileOutline 1 0 0 0 0 0 0 "" } { Code "code" "Code" EntityName FileOutline 1 1 1 0 0 0 0 "" } { Disassembly "disassembly" "Disassembly" Null Glasses 0 1 0 0 0 0 1 "Displays disassembled instructions in a textual form from the selected thread's containing process virtual address space." } + { EvalViewer "eval_viewer" "Evaluation Viewer" Null Binoculars 0 1 0 0 0 0 0 "." } { Watch "watch" "Watch" Null Binoculars 0 1 0 1 1 1 1 "The familiar 'watch window' debugger interface. Allows the inputting of a number of expressions. Each expression in the table is evaluated within the context of the selected thread's selected call stack frame. If applicable (depending on visualization rules and the expression's type), these expressions may be hierarchically expanded, which displays children as more rows in the table. The values of these expressions may also be edited, and if possible, can be used to write to registers or memory in attached processes. Also contains a new *view rule* column, not found in other major debuggers, which allows per-row specification of various visualization rules. These view rules may be used to visualize and inspect the evaluation of expressions in a variety of ways. To learn more, read the 'View Rules' section." } { Locals "locals" "Locals" Null Binoculars 0 1 0 1 1 1 1 "Nearly identical to `Watch`, but automatically filled with local variables found within the selected call stack frame of the selected thread, according to the associated debug info. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } { Registers "registers" "Registers" Null Binoculars 0 1 0 1 1 1 1 "Nearly identical to `Watch`, but automatically filled with all register names according to the selected thread's architecture. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } @@ -402,6 +411,12 @@ DF_ThemePresetColorTable: //- rjf: enums +@enum DF_NameKind: +{ + @expand(DF_NameKindTable, a) `$(a.name)`, + COUNT, +} + @enum DF_GfxViewKind: { @expand(DF_GfxViewTable a) `$(a.name)`, @@ -541,6 +556,8 @@ DF_ThemePresetColorTable: `$(a.ru == "x" -> "DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`; @expand(DF_GfxViewRuleTable a) `$(a.bu == "x" -> "DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`; + @expand(DF_GfxViewRuleTable a) + `$(a.wu == "x" -> "DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`; } //- rjf: gfx view rule tables @@ -548,7 +565,7 @@ DF_ThemePresetColorTable: @data(DF_GfxViewRuleSpecInfo) @c_file df_g_gfx_view_rule_spec_info_table: { @expand(DF_GfxViewRuleTable a) - ```{ str8_lit_comp("$(a.string)"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*$(a.vr == "x"))|(DF_GfxViewRuleSpecInfoFlag_LineStringize*$(a.ls == "x"))|(DF_GfxViewRuleSpecInfoFlag_RowUI*$(a.ru == "x"))|(DF_GfxViewRuleSpecInfoFlag_BlockUI*$(a.bu == "x")), $(a.vr == "x" -> "DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vr != "x" -> 0), $(a.ls == "x" -> "DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME("..a.name_lower..")") $(a.ls != "x" -> 0), $(a.ru == "x" -> "DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME("..a.name_lower..")") $(a.ru != "x" -> 0), $(a.bu == "x" -> "DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME("..a.name_lower..")") $(a.bu != "x" -> 0), }```; + ```{ str8_lit_comp("$(a.string)"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*$(a.vr == "x"))|(DF_GfxViewRuleSpecInfoFlag_LineStringize*$(a.ls == "x"))|(DF_GfxViewRuleSpecInfoFlag_RowUI*$(a.ru == "x"))|(DF_GfxViewRuleSpecInfoFlag_BlockUI*$(a.bu == "x")), $(a.vr == "x" -> "DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vr != "x" -> 0), $(a.ls == "x" -> "DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME("..a.name_lower..")") $(a.ls != "x" -> 0), $(a.ru == "x" -> "DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME("..a.name_lower..")") $(a.ru != "x" -> 0), $(a.bu == "x" -> "DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME("..a.name_lower..")") $(a.bu != "x" -> 0), $(a.wu == "x" -> "DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME("..a.name_lower..")") $(a.wu != "x" -> 0) }```; } //- rjf: default view spec info table diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 7e8e5252..898af62f 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -692,72 +692,89 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) Temp scratch = scratch_begin(0, 0); HS_Scope *hs_scope = hs_scope_open(); TXT_Scope *txt_scope = txt_scope_open(); + + ////////////////////////////// + //- rjf: get & initialize state + // DF_ViewRuleHooks_TextState *state = df_view_rule_block_user_state(key, DF_ViewRuleHooks_TextState); if(!state->initialized) { state->initialized = 1; state->cursor = state->mark = txt_pt(1, 1); } - if(state->last_open_frame_idx+1 < df_frame_index()) + + ////////////////////////////// + //- rjf: unpack evaluation / view rule params + // + DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); + DF_TxtTopologyInfo top = df_view_rule_hooks__txt_topology_info_from_cfg(dbgi_scope, ctrl_ctx, parse_ctx, macro_map, cfg); + DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); + U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; + Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); + + ////////////////////////////// + //- rjf: evaluation info -> text visualization info + // + String8 data = {0}; + TXT_TextInfo info = {0}; + TXT_LineTokensSlice line_tokens_slice = {0}; { - state->loaded_t = 0; - } - state->last_open_frame_idx = df_frame_index(); - { - //- rjf: unpack params - DF_TxtTopologyInfo top = df_view_rule_hooks__txt_topology_info_from_cfg(dbgi_scope, ctrl_ctx, parse_ctx, macro_map, cfg); - - //- rjf: resolve to address value & range - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); - - //- rjf: unpack thread/process of eval - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - - //- rjf: unpack key for this region in memory - U128 text_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 1); - - //- rjf: key -> parsed text info U128 text_hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, text_key, top.lang, &text_hash); - String8 data = hs_data_from_hash(hs_scope, text_hash); - TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, &info, data, r1s64(1, info.lines_count)); - - //- rjf: info -> code slice info - DF_CodeSliceParams code_slice_params = {0}; + U128 text_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 1); + info = txt_text_info_from_key_lang(txt_scope, text_key, top.lang, &text_hash); + data = hs_data_from_hash(hs_scope, text_hash); + line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, &info, data, r1s64(1, info.lines_count)); + } + + ////////////////////////////// + //- rjf: info -> code slice info + // + DF_CodeSliceParams code_slice_params = {0}; + { + code_slice_params.flags = DF_CodeSliceFlag_LineNums; + code_slice_params.line_num_range = r1s64(1, info.lines_count); + code_slice_params.line_text = push_array(scratch.arena, String8, info.lines_count); + code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, info.lines_count); + code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, info.lines_count); + code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, info.lines_count); + code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, info.lines_count); + code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, info.lines_count); + code_slice_params.line_dasm2src = push_array(scratch.arena, DF_TextLineDasm2SrcInfoList, info.lines_count); + code_slice_params.line_src2dasm = push_array(scratch.arena, DF_TextLineSrc2DasmInfoList, info.lines_count); + for(U64 line_idx = 0; line_idx < info.lines_count; line_idx += 1) { - code_slice_params.flags = DF_CodeSliceFlag_LineNums; - code_slice_params.line_num_range = r1s64(1, info.lines_count); - code_slice_params.line_text = push_array(scratch.arena, String8, info.lines_count); - code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, info.lines_count); - code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, info.lines_count); - code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, info.lines_count); - code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, info.lines_count); - code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, info.lines_count); - code_slice_params.line_dasm2src = push_array(scratch.arena, DF_TextLineDasm2SrcInfoList, info.lines_count); - code_slice_params.line_src2dasm = push_array(scratch.arena, DF_TextLineSrc2DasmInfoList, info.lines_count); - for(U64 line_idx = 0; line_idx < info.lines_count; line_idx += 1) - { - code_slice_params.line_text[line_idx] = str8_substr(data, info.lines_ranges[line_idx]); - code_slice_params.line_ranges[line_idx] = info.lines_ranges[line_idx]; - code_slice_params.line_tokens[line_idx] = line_tokens_slice.line_tokens[line_idx]; - } - code_slice_params.font = df_font_from_slot(DF_FontSlot_Code); - code_slice_params.font_size = ui_top_font_size(); - code_slice_params.line_height_px = ui_top_font_size()*1.5f; - code_slice_params.margin_width_px = 0; - code_slice_params.line_num_width_px = ui_top_font_size()*5.f; - code_slice_params.line_text_max_width_px = ui_top_font_size()*2.f*info.lines_max_size; + code_slice_params.line_text[line_idx] = str8_substr(data, info.lines_ranges[line_idx]); + code_slice_params.line_ranges[line_idx] = info.lines_ranges[line_idx]; + code_slice_params.line_tokens[line_idx] = line_tokens_slice.line_tokens[line_idx]; + } + code_slice_params.font = df_font_from_slot(DF_FontSlot_Code); + code_slice_params.font_size = ui_top_font_size(); + code_slice_params.line_height_px = ui_top_font_size()*1.5f; + code_slice_params.margin_width_px = 0; + code_slice_params.line_num_width_px = ui_top_font_size()*5.f; + code_slice_params.line_text_max_width_px = ui_top_font_size()*2.f*info.lines_max_size; + } + + ////////////////////////////// + //- rjf: build UI + // + if(info.lines_count != 0) + { + //- rjf: build top-level container + UI_Box *container = &ui_g_nil_box; + UI_PrefWidth(ui_px(dim.x, 1.f)) UI_PrefHeight(ui_px(dim.y, 1.f)) + { + container = ui_build_box_from_stringf(UI_BoxFlag_AllowOverflow|UI_BoxFlag_Clip, "###text_container"); } //- rjf: build code slice - if(info.lines_count != 0) UI_Padding(ui_pct(1, 0)) UI_PrefWidth(ui_px(info.lines_max_size*ui_top_font_size()*1.2f, 1.f)) UI_Column UI_Padding(ui_pct(1, 0)) + UI_WidthFill UI_HeightFill UI_Parent(container) { - DF_CodeSliceSignal sig = df_code_slice(ws, ctrl_ctx, parse_ctx, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###code_slice")); + DF_CodeSliceSignal slice_sig = df_code_slice(ws, ctrl_ctx, parse_ctx, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###slice")); } } + txt_scope_close(txt_scope); hs_scope_close(hs_scope); scratch_end(scratch); @@ -1002,10 +1019,11 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) F32 rate = 1 - pow_f32(2, (-15.f * df_dt())); if(expected_size != 0) { + F32 img_dim = dim.y - ui_top_font_size()*2.f; UI_Padding(ui_pct(1.f, 0.f)) - UI_PrefWidth(ui_px(dim.y*((F32)topology_info.width/(F32)topology_info.height), 1.f)) + UI_PrefWidth(ui_px(img_dim*((F32)topology_info.width/(F32)topology_info.height), 1.f)) UI_Column UI_Padding(ui_pct(1.f, 0.f)) - UI_PrefHeight(ui_px(dim.y, 1.f)) + UI_PrefHeight(ui_px(img_dim, 1.f)) { ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable|UI_BoxFlag_DrawHotEffects, "image_box"); @@ -1114,6 +1132,11 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) scratch_end(scratch); } +DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(bitmap) +{ + +} + //////////////////////////////// //~ rjf: "geo" diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index d48213ed..d963cc39 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1052,7 +1052,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW UI_Parent(canvas_box) UI_WidthFill UI_HeightFill { Vec2F32 canvas_dim = v2f32(scroll_list_params.dim_px.x - ui_top_font_size()*1.5f, - (row->skipped_size_in_rows+row->size_in_rows+row->chopped_size_in_rows)*scroll_list_params.row_height_px - scroll_list_params.row_height_px); + (row->skipped_size_in_rows+row->size_in_rows+row->chopped_size_in_rows)*scroll_list_params.row_height_px); row->expand_ui_rule_spec->info.block_ui(ws, row->key, row->eval, scope, &ctrl_ctx, &parse_ctx, ¯o_map, row->expand_ui_rule_node, canvas_dim); } } @@ -1064,6 +1064,13 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW next_cursor_tbl = v2s64(DF_EvalWatchViewColumnKind_Expr, (semantic_idx+1)); pressed = 1; } + if(ui_double_clicked(sig)) + { + DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); + p.view_spec = df_view_spec_from_gfx_view_kind(DF_GfxViewKind_EvalViewer); + df_cmd_params_mark_slot(&p, DF_CmdParamSlot_ViewSpec); + df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenTab)); + } } //- rjf: build normal row @@ -5007,7 +5014,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) if(text_info_is_ready) { // rjf: fill basics - code_slice_params.flags = DF_CodeSliceFlag_Margin|DF_CodeSliceFlag_LineNums; + code_slice_params.flags = DF_CodeSliceFlag_Margin|DF_CodeSliceFlag_LineNums|DF_CodeSliceFlag_Clickable; code_slice_params.line_num_range = visible_line_num_range; code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count); code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); @@ -6068,7 +6075,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) if(has_disasm) { // rjf: fill basics - code_slice_params.flags = DF_CodeSliceFlag_Margin|DF_CodeSliceFlag_LineNums; + code_slice_params.flags = DF_CodeSliceFlag_Margin|DF_CodeSliceFlag_LineNums|DF_CodeSliceFlag_Clickable; code_slice_params.line_num_range = visible_line_num_range; code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count); code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); @@ -6531,6 +6538,16 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) ProfEnd(); } +//////////////////////////////// +//~ rjf: EvalViewer @view_hook_impl + +DF_VIEW_SETUP_FUNCTION_DEF(EvalViewer) {} +DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(EvalViewer) { return str8_lit(""); } +DF_VIEW_CMD_FUNCTION_DEF(EvalViewer) {} +DF_VIEW_UI_FUNCTION_DEF(EvalViewer) +{ +} + //////////////////////////////// //~ rjf: Watch @view_hook_impl @@ -6903,7 +6920,7 @@ DF_VIEW_UI_FUNCTION_DEF(Output) if(txti_buffer_is_ready) { // rjf: fill basics - code_slice_params.flags = DF_CodeSliceFlag_LineNums; + code_slice_params.flags = DF_CodeSliceFlag_LineNums|DF_CodeSliceFlag_Clickable; code_slice_params.line_num_range = visible_line_num_range; code_slice_params.line_text = slice.line_text; code_slice_params.line_ranges = slice.line_ranges; diff --git a/src/df/gfx/generated/df_gfx.meta.c b/src/df/gfx/generated/df_gfx.meta.c index dde6d4cf..287fc4c8 100644 --- a/src/df/gfx/generated/df_gfx.meta.c +++ b/src/df/gfx/generated/df_gfx.meta.c @@ -715,23 +715,23 @@ str8_lit_comp("open_profile"), DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[14] = { -{ str8_lit_comp("array"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, 0, 0, 0, }, -{ str8_lit_comp("list"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(list) , 0, 0, 0, }, -{ str8_lit_comp("dec"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(dec) , 0, 0, }, -{ str8_lit_comp("bin"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(bin) , 0, 0, }, -{ str8_lit_comp("oct"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(oct) , 0, 0, }, -{ str8_lit_comp("hex"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(hex) , 0, 0, }, -{ str8_lit_comp("only"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(only) , DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(only) , 0, 0, }, -{ str8_lit_comp("omit"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(omit) , DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(omit) , 0, 0, }, -{ str8_lit_comp("no_addr"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(no_addr) , 0, 0, }, -{ str8_lit_comp("rgba"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(rgba) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(rgba) , }, -{ str8_lit_comp("text"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, 0, DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(text) , }, -{ str8_lit_comp("disasm"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, 0, DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(disasm) , }, -{ str8_lit_comp("bitmap"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(bitmap) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(bitmap) , }, -{ str8_lit_comp("geo"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(geo) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(geo) , }, +{ str8_lit_comp("array"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, 0, 0, 0, 0 }, +{ str8_lit_comp("list"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(list) , 0, 0, 0, 0 }, +{ str8_lit_comp("dec"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(dec) , 0, 0, 0 }, +{ str8_lit_comp("bin"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(bin) , 0, 0, 0 }, +{ str8_lit_comp("oct"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(oct) , 0, 0, 0 }, +{ str8_lit_comp("hex"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(hex) , 0, 0, 0 }, +{ str8_lit_comp("only"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(only) , DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(only) , 0, 0, 0 }, +{ str8_lit_comp("omit"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(omit) , DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(omit) , 0, 0, 0 }, +{ str8_lit_comp("no_addr"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(no_addr) , 0, 0, 0 }, +{ str8_lit_comp("rgba"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(rgba) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(rgba) , 0 }, +{ str8_lit_comp("text"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, 0, DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(text) , 0 }, +{ str8_lit_comp("disasm"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, 0, DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(disasm) , 0 }, +{ str8_lit_comp("bitmap"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(bitmap) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(bitmap) , DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_NAME(bitmap) }, +{ str8_lit_comp("geo"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(geo) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(geo) , 0 }, }; -DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29] = +DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[30] = { {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("null"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Null), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null), DF_VIEW_CMD_FUNCTION_NAME(Null), DF_VIEW_UI_FUNCTION_NAME(Null)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("empty"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Empty), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Empty), DF_VIEW_CMD_FUNCTION_NAME(Empty), DF_VIEW_UI_FUNCTION_NAME(Empty)}, @@ -749,6 +749,7 @@ DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29] = {(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("pending_entity"), str8_lit_comp("Pending Entity"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(PendingEntity), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(PendingEntity), DF_VIEW_CMD_FUNCTION_NAME(PendingEntity), DF_VIEW_UI_FUNCTION_NAME(PendingEntity)}, {(0|1*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("code"), str8_lit_comp("Code"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(Code), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Code), DF_VIEW_CMD_FUNCTION_NAME(Code), DF_VIEW_UI_FUNCTION_NAME(Code)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("disassembly"), str8_lit_comp("Disassembly"), DF_NameKind_Null, DF_IconKind_Glasses, DF_VIEW_SETUP_FUNCTION_NAME(Disassembly), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Disassembly), DF_VIEW_CMD_FUNCTION_NAME(Disassembly), DF_VIEW_UI_FUNCTION_NAME(Disassembly)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("eval_viewer"), str8_lit_comp("Evaluation Viewer"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(EvalViewer), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(EvalViewer), DF_VIEW_CMD_FUNCTION_NAME(EvalViewer), DF_VIEW_UI_FUNCTION_NAME(EvalViewer)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("watch"), str8_lit_comp("Watch"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Watch), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Watch), DF_VIEW_CMD_FUNCTION_NAME(Watch), DF_VIEW_UI_FUNCTION_NAME(Watch)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("locals"), str8_lit_comp("Locals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Locals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Locals), DF_VIEW_CMD_FUNCTION_NAME(Locals), DF_VIEW_UI_FUNCTION_NAME(Locals)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("registers"), str8_lit_comp("Registers"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Registers), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Registers), DF_VIEW_CMD_FUNCTION_NAME(Registers), DF_VIEW_UI_FUNCTION_NAME(Registers)}, diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/df/gfx/generated/df_gfx.meta.h index 595f1ecd..f9efdf56 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/df/gfx/generated/df_gfx.meta.h @@ -6,6 +6,14 @@ #ifndef DF_GFX_META_H #define DF_GFX_META_H +typedef enum DF_NameKind +{ +DF_NameKind_Null, +DF_NameKind_EntityName, +DF_NameKind_EntityKindName, +DF_NameKind_COUNT, +} DF_NameKind; + typedef enum DF_GfxViewKind { DF_GfxViewKind_Null, @@ -24,6 +32,7 @@ DF_GfxViewKind_Modules, DF_GfxViewKind_PendingEntity, DF_GfxViewKind_Code, DF_GfxViewKind_Disassembly, +DF_GfxViewKind_EvalViewer, DF_GfxViewKind_Watch, DF_GfxViewKind_Locals, DF_GfxViewKind_Registers, @@ -129,6 +138,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(Modules); DF_VIEW_SETUP_FUNCTION_DEF(PendingEntity); DF_VIEW_SETUP_FUNCTION_DEF(Code); DF_VIEW_SETUP_FUNCTION_DEF(Disassembly); +DF_VIEW_SETUP_FUNCTION_DEF(EvalViewer); DF_VIEW_SETUP_FUNCTION_DEF(Watch); DF_VIEW_SETUP_FUNCTION_DEF(Locals); DF_VIEW_SETUP_FUNCTION_DEF(Registers); @@ -158,6 +168,7 @@ DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Modules); DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(PendingEntity); DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Code); DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Disassembly); +DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(EvalViewer); DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch); DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Locals); DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Registers); @@ -187,6 +198,7 @@ DF_VIEW_CMD_FUNCTION_DEF(Modules); DF_VIEW_CMD_FUNCTION_DEF(PendingEntity); DF_VIEW_CMD_FUNCTION_DEF(Code); DF_VIEW_CMD_FUNCTION_DEF(Disassembly); +DF_VIEW_CMD_FUNCTION_DEF(EvalViewer); DF_VIEW_CMD_FUNCTION_DEF(Watch); DF_VIEW_CMD_FUNCTION_DEF(Locals); DF_VIEW_CMD_FUNCTION_DEF(Registers); @@ -216,6 +228,7 @@ DF_VIEW_UI_FUNCTION_DEF(Modules); DF_VIEW_UI_FUNCTION_DEF(PendingEntity); DF_VIEW_UI_FUNCTION_DEF(Code); DF_VIEW_UI_FUNCTION_DEF(Disassembly); +DF_VIEW_UI_FUNCTION_DEF(EvalViewer); DF_VIEW_UI_FUNCTION_DEF(Watch); DF_VIEW_UI_FUNCTION_DEF(Locals); DF_VIEW_UI_FUNCTION_DEF(Registers); @@ -248,6 +261,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap); DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo); +DF_GFX_VIEW_RULE_WHOLE_UI_FUNCTION_DEF(bitmap); C_LINKAGE_BEGIN extern String8 df_g_theme_preset_display_string_table[9]; extern String8 df_g_theme_preset_code_string_table[9]; @@ -267,7 +281,7 @@ extern String8 df_g_cmd_param_slot_2_view_spec_cmd_map[7]; extern DF_StringBindingPair df_g_default_binding_table[97]; extern String8 df_g_binding_version_remap_old_name_table[3]; extern String8 df_g_binding_version_remap_new_name_table[3]; -extern DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29]; +extern DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[30]; extern String8 df_g_theme_color_display_string_table[54]; extern String8 df_g_theme_color_cfg_string_table[54]; read_only global U8 df_g_icon_font_bytes__data[] = From 8342cfbd531d210c7ca5f6f35a6212f59767eb9b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 30 Mar 2024 10:46:51 +0000 Subject: [PATCH 271/275] Add `slice` view --- src/df/core/df_core.mdesk | 1 + src/df/core/generated/df_core.meta.c | 3 +- src/df/core/generated/df_core.meta.h | 2 + src/df/gfx/df_view_rule_hooks.c | 76 ++++++++++++++++++++++++++++ src/font_cache/font_cache.c | 6 ++- 5 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 354798a6..1eb541bc 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -485,6 +485,7 @@ DF_CoreViewRuleTable: { {Null null "" - - - - "" - "" } {Array array "array" - - x - "Array" x "Specifies that a pointer points to N elements, rather than only 1." } + {Slice slice "slice" - - x - "Slice" x "Specifies that a struct to be rendered as a slice." } {List list "list" - - - x "List" x "Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list." } {ByteSwap bswap "bswap" x - x - "Byte Swap" x "Specifies that all integer primitives should be byte-swapped, such that their endianness is reversed." } {BaseDec base_dec "dec" x - - - "Decimal Base (Base 10)" x "Specifies that all integral evaluations should appear in base-10 form." } diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index aeab2adb..53e70812 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -419,10 +419,11 @@ DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[206] = { str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, }; -DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[16] = +DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[17] = { {str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, {str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(array) , 0, }, +{str8_lit_comp("slice"), str8_lit_comp("Slice"), str8_lit_comp("Specifies that a struct to be rendered as a slice."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(slice) , 0, }, {str8_lit_comp("list"), str8_lit_comp("List"), str8_lit_comp("Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(list) , }, {str8_lit_comp("bswap"), str8_lit_comp("Byte Swap"), str8_lit_comp("Specifies that all integer primitives should be byte-swapped, such that their endianness is reversed."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(bswap) , 0, }, {str8_lit_comp("dec"), str8_lit_comp("Decimal Base (Base 10)"), str8_lit_comp("Specifies that all integral evaluations should appear in base-10 form."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index c0c52a0b..5340e74a 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -335,6 +335,7 @@ typedef enum DF_CoreViewRuleKind { DF_CoreViewRuleKind_Null, DF_CoreViewRuleKind_Array, +DF_CoreViewRuleKind_Slice, DF_CoreViewRuleKind_List, DF_CoreViewRuleKind_ByteSwap, DF_CoreViewRuleKind_BaseDec, @@ -401,6 +402,7 @@ B32 force_confirm; }; DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only); diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 898af62f..3fa52f1c 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -382,6 +382,82 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) return eval; } +//////////////////////////////// +//~ bill: "slice" + + +internal TG_Member *tg_member_from_name(TG_MemberArray array, String8 name, StringMatchFlags flags) +{ + for (U64 i = 0; i < array.count; i++) + { + TG_Member *member = &array.v[i]; + if (str8_match(member->name, name, flags)) + { + return member; + } + } + return NULL; +} + +internal U64 df_evaluate_integer_from_eval(EVAL_ParseCtx *parse_ctx, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, TG_Member *member) +{ + DF_Eval res = zero_struct; + res.mode = EVAL_EvalMode_Addr; + res.offset = eval.offset + member->off; + res.type_key = member->type_key; + res = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, res); + if (res.mode == EVAL_EvalMode_Value) + { + return res.imm_u64; + } + return 0; +} + +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) +{ + TG_Key type_key = eval.type_key; + TG_Kind type_kind = tg_kind_from_key(type_key); + + if (type_kind == TG_Kind_Struct) + { + Temp scratch = scratch_begin(&arena, 1); + DF_CfgNode *struct_node = val->last; + if (struct_node != &df_g_nil_cfg_node) + { + + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); + TG_Member *member_ptr = NULL; + TG_Member *member_len = NULL; + member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("data"), StringMatchFlag_CaseInsensitive); + member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("str"), StringMatchFlag_CaseInsensitive); + member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("ptr"), StringMatchFlag_CaseInsensitive); + + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("len"), StringMatchFlag_CaseInsensitive); + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("length"), StringMatchFlag_CaseInsensitive); + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("count"), StringMatchFlag_CaseInsensitive); + member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("size"), StringMatchFlag_CaseInsensitive); + + if (member_ptr && member_len) + { + U64 slice_len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); + + TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, member_ptr->type_key); + TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, slice_len); + + // TODO(bill): How do you make this render with the original name, if possible? + DF_Eval new_eval = zero_struct; + new_eval.mode = EVAL_EvalMode_Addr; + new_eval.offset = eval.offset + member_ptr->off; + new_eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); + + eval = new_eval; + } + } + scratch_end(scratch); + } + return eval; +} + //////////////////////////////// //~ rjf: "list" diff --git a/src/font_cache/font_cache.c b/src/font_cache/font_cache.c index b3b8eaa2..ced8a853 100644 --- a/src/font_cache/font_cache.c +++ b/src/font_cache/font_cache.c @@ -10,6 +10,10 @@ #include "third_party/blake2/blake2b.c" #endif +#ifndef F_TAB_STRING +#define F_TAB_STRING " " +#endif + internal F_Hash f_hash_from_string(String8 string) { @@ -617,7 +621,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F_RunFlags flags, Stri B32 is_tab = (piece_substring.size == 1 && piece_substring.str[0] == '\t'); if(is_tab) { - piece_substring = str8_lit(" "); + piece_substring = str8_lit(F_TAB_STRING); } //- rjf: piece substring -> raster cache info From 5d2d13d9d96924083473230f035b2f0f7c536579 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 30 Mar 2024 11:59:04 +0000 Subject: [PATCH 272/275] Dumb `map` rendering showing keys only (including dummy ones) --- src/df/core/df_core.mdesk | 1 + src/df/core/generated/df_core.meta.c | 3 +- src/df/core/generated/df_core.meta.h | 2 + src/df/gfx/df_view_rule_hooks.c | 93 +++++++++++++++++++++++++++- 4 files changed, 96 insertions(+), 3 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 1eb541bc..6cde1472 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -500,6 +500,7 @@ DF_CoreViewRuleTable: {Disasm disasm "disasm" - x - x "Disassembly" x "Displays as disassembled instructions, interpreting the data as raw machine code." } {Bitmap bitmap "bitmap" - x - x "Bitmap" x "Displays as a bitmap, interpreting the data as raw pixel data." } {Geo geo "geo" - x - x "Geometry" x "Displays as geometry, interpreting the data as vertex data." } + {OdinMap odin_map "odin_map" - - x - "Odin map" x "Specifies that a struct to be rendered as an Odin map type." } } //////////////////////////////// diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index 53e70812..4fd22249 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -419,7 +419,7 @@ DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[206] = { str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, }; -DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[17] = +DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[18] = { {str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, {str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(array) , 0, }, @@ -438,6 +438,7 @@ DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[17] = {str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), str8_lit_comp("Displays as disassembled instructions, interpreting the data as raw machine code."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(disasm) , }, {str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), str8_lit_comp("Displays as a bitmap, interpreting the data as raw pixel data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(bitmap) , }, {str8_lit_comp("geo"), str8_lit_comp("Geometry"), str8_lit_comp("Displays as geometry, interpreting the data as vertex data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(geo) , }, +{str8_lit_comp("odin_map"), str8_lit_comp("Odin map"), str8_lit_comp("Specifies that a struct to be rendered as an Odin map type."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(odin_map) , 0, }, }; String8 df_g_icon_kind_text_table[69] = diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index 5340e74a..bcec746a 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -350,6 +350,7 @@ DF_CoreViewRuleKind_Text, DF_CoreViewRuleKind_Disasm, DF_CoreViewRuleKind_Bitmap, DF_CoreViewRuleKind_Geo, +DF_CoreViewRuleKind_OdinMap, DF_CoreViewRuleKind_COUNT, } DF_CoreViewRuleKind; @@ -404,6 +405,7 @@ B32 force_confirm; DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice); DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap); +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(omit); diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 3fa52f1c..946e3095 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -420,10 +420,10 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) if (type_kind == TG_Kind_Struct) { - Temp scratch = scratch_begin(&arena, 1); DF_CfgNode *struct_node = val->last; if (struct_node != &df_g_nil_cfg_node) { + Temp scratch = scratch_begin(&arena, 1); TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); TG_Member *member_ptr = NULL; @@ -452,12 +452,101 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) eval = new_eval; } + + scratch_end(scratch); } - scratch_end(scratch); } return eval; } + +//////////////////////////////// +//~ bill: "odin_map" + +DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) +{ + TG_Key type_key = eval.type_key; + TG_Kind type_kind = tg_kind_from_key(type_key); + + if (type_kind == TG_Kind_Struct) + { + DF_CfgNode *struct_node = val->last; + if (struct_node != &df_g_nil_cfg_node) + { + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); + + TG_Member *member_data = tg_member_from_name(data_members, str8_lit("data"), 0); + TG_Member *member_len = tg_member_from_name(data_members, str8_lit("len"), 0); + + if (member_data && member_len) + { + TG_Key metadata = member_data->type_key; + metadata = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, metadata); + if (tg_kind_from_key(metadata) != TG_Kind_Struct) + { + return eval; + } + + TG_MemberArray md_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, metadata); + TG_Member *m_key = tg_member_from_name(md_members, str8_lit("key"), 0); + TG_Member *m_value = tg_member_from_name(md_members, str8_lit("value"), 0); + TG_Member *m_hash = tg_member_from_name(md_members, str8_lit("hash"), 0); + TG_Member *m_key_cell = tg_member_from_name(md_members, str8_lit("key_cell"), 0); + TG_Member *m_value_cell = tg_member_from_name(md_members, str8_lit("value_cell"), 0); + + if (m_key == NULL || + m_value == NULL || + m_hash == NULL || + m_key_cell == NULL || + m_value_cell == NULL) + { + return eval; + } + + TG_Key key = m_key->type_key; + TG_Key value = m_value->type_key; + TG_Key hash = m_hash->type_key; + TG_Key key_cell = m_key_cell->type_key; + TG_Key value_cell = m_value_cell->type_key; + + U64 size_key = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, key); + U64 size_value = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, value); + U64 size_hash = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, hash); + U64 size_key_cell = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, key_cell); + U64 size_value_cell = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, value_cell); + + U64 raw_data = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_data); + U64 ptr = raw_data & ~(U64)63; + U64 len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); + U64 cap_log2 = raw_data & 63; + U64 cap = cap_log2 ? ((U64)1)<type_graph, TG_Kind_Array, key, cap); + } + else + { + U64 cap_key_cell = (size_key * cap) / size_key_cell; + array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, key_cell, cap_key_cell); + } + + DF_Eval new_eval = zero_struct; + new_eval.mode = EVAL_EvalMode_Value; + new_eval.imm_u64 = ptr; + new_eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); + eval = new_eval; + + } + } + } + + return eval; +} + + //////////////////////////////// //~ rjf: "list" From 57fb0eb833a5bd6ae73f7a8f621e09b04b04d2c2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 30 Mar 2024 13:47:18 +0000 Subject: [PATCH 273/275] VERY basic `map` support with map cell info --- src/df/gfx/df_view_rule_hooks.c | 121 +++++++++++++++++++++++++++----- 1 file changed, 103 insertions(+), 18 deletions(-) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 946e3095..4b5482e4 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -425,7 +425,7 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) { Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); TG_Member *member_ptr = NULL; TG_Member *member_len = NULL; member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("data"), StringMatchFlag_CaseInsensitive); @@ -463,6 +463,92 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) //////////////////////////////// //~ bill: "odin_map" + +typedef struct DF_OdinMapCellInfo DF_OdinMapCellInfo; +struct DF_OdinMapCellInfo { + U64 size_of_type; + U64 size_of_cell; + U64 elements_per_cell; +}; + +internal DF_OdinMapCellInfo df_odin_map_cell_info(Arena *arena, EVAL_ParseCtx *parse_ctx, TG_Key type, TG_Key cell_type) +{ + DF_OdinMapCellInfo info = zero_struct; + info.size_of_type = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, type); + info.size_of_cell = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, cell_type); + + if (info.size_of_type != info.size_of_cell) { + Temp scratch = scratch_begin(&arena, 1); + + TG_Kind kind = tg_kind_from_key(cell_type); + Assert(kind == TG_Kind_Struct); + + TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, cell_type); + Assert(data_members.count >= 1); + TG_Key array_type = data_members.v[0].type_key; + U64 size_of_array = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, array_type); + if (size_of_array > 0 && info.size_of_type > 0) { + info.elements_per_cell = size_of_array / info.size_of_type; + } + + scratch_end(scratch); + + } + if (info.elements_per_cell == 0) { + info.elements_per_cell = 1; + } + + return info; +} + + +internal U64 df_odin_map_cell_index(U64 base, DF_OdinMapCellInfo const *info, U64 index) +{ + U64 elements_per_cell = info->elements_per_cell; + U64 size_of_cell = info->size_of_cell; + U64 size_of_type = info->size_of_type; + U64 cell_index = 0; + U64 data_index = 0; + switch (elements_per_cell) { + case 1: + return base + (index * size_of_cell); + case 2: + cell_index = index >> 1; + data_index = index & 1; + break; + case 4: + cell_index = index >> 2; + data_index = index & 3; + break; + case 8: + cell_index = index >> 3; + data_index = index & 7; + break; + case 16: + cell_index = index >> 4; + data_index = index & 15; + break; + case 32: + cell_index = index >> 5; + data_index = index & 31; + break; + default: + cell_index = index / elements_per_cell; + data_index = index % elements_per_cell; + break; + } + return base + (cell_index * size_of_cell) + (data_index * size_of_type); +} + +// internal void dbg_printf(char const *fmt, ...) { +// va_list argp; +// va_start(argp, fmt); +// char buf[4096] = {}; +// vsnprintf_s(buf, 4095, fmt, argp); +// va_end(argp); +// OutputDebugStringA(buf); +// } + DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) { TG_Key type_key = eval.type_key; @@ -509,12 +595,6 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) TG_Key key_cell = m_key_cell->type_key; TG_Key value_cell = m_value_cell->type_key; - U64 size_key = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, key); - U64 size_value = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, value); - U64 size_hash = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, hash); - U64 size_key_cell = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, key_cell); - U64 size_value_cell = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, value_cell); - U64 raw_data = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_data); U64 ptr = raw_data & ~(U64)63; U64 len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); @@ -523,20 +603,25 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) TG_Key array_type = zero_struct; - if (size_key == size_key_cell) - { - array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, key, cap); - } - else - { - U64 cap_key_cell = (size_key * cap) / size_key_cell; - array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, key_cell, cap_key_cell); - } + DF_OdinMapCellInfo key_cell_info = df_odin_map_cell_info(arena, parse_ctx, key, key_cell); + DF_OdinMapCellInfo value_cell_info = df_odin_map_cell_info(arena, parse_ctx, value, value_cell); + + U64 key_ptr = ptr; + U64 value_ptr = df_odin_map_cell_index(key_ptr, &key_cell_info, cap); + U64 hash_ptr = df_odin_map_cell_index(value_ptr, &value_cell_info, cap); + (void)value_ptr; + (void)hash_ptr; + + TG_Key key_array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, key_cell, cap/key_cell_info.elements_per_cell); + // TG_Key value_array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, value_cell, cap/value_cell_info.elements_per_cell); + // TG_Key hash_array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, hash, cap); + // (void)value_array_type; + // (void)hash_array_type; DF_Eval new_eval = zero_struct; new_eval.mode = EVAL_EvalMode_Value; - new_eval.imm_u64 = ptr; - new_eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); + new_eval.imm_u64 = key_ptr; + new_eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, key_array_type, 0); eval = new_eval; } From f23979e20aa11c398046c65d8547b4599437d677 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 30 Mar 2024 13:57:49 +0000 Subject: [PATCH 274/275] Mock out logic for map iteration --- src/df/gfx/df_view_rule_hooks.c | 47 +++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 4b5482e4..3d64e57e 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -549,6 +549,22 @@ internal U64 df_odin_map_cell_index(U64 base, DF_OdinMapCellInfo const *info, U6 // OutputDebugStringA(buf); // } + +internal U64 df_evaluate_hash_from_offset(EVAL_ParseCtx *parse_ctx, DF_CtrlCtx *ctrl_ctx, U64 offset, TG_Key hash_type) +{ + DF_Eval res = zero_struct; + res.mode = EVAL_EvalMode_Addr; + res.offset = offset; + res.type_key = hash_type; + res = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, res); + if (res.mode == EVAL_EvalMode_Value) + { + return res.imm_u64; + } + return 0; +} + + DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) { TG_Key type_key = eval.type_key; @@ -605,6 +621,7 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) DF_OdinMapCellInfo key_cell_info = df_odin_map_cell_info(arena, parse_ctx, key, key_cell); DF_OdinMapCellInfo value_cell_info = df_odin_map_cell_info(arena, parse_ctx, value, value_cell); + U64 size_of_hash = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, hash); U64 key_ptr = ptr; U64 value_ptr = df_odin_map_cell_index(key_ptr, &key_cell_info, cap); @@ -612,12 +629,32 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) (void)value_ptr; (void)hash_ptr; - TG_Key key_array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, key_cell, cap/key_cell_info.elements_per_cell); - // TG_Key value_array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, value_cell, cap/value_cell_info.elements_per_cell); - // TG_Key hash_array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, hash, cap); - // (void)value_array_type; - // (void)hash_array_type; + U64 TOMBSTONE_MASK = ((U64)1u)<<(size_of_hash*8 - 1); + for (U64 i = 0; i < cap; i += 1) { + U64 offset_hash = hash_ptr + i*size_of_hash; + + U64 h = df_evaluate_hash_from_offset(parse_ctx, ctrl_ctx, offset_hash, hash); + if (h != 0 && (h & TOMBSTONE_MASK) == 0) { + U64 offset_key = df_odin_map_cell_index(key_ptr, &key_cell_info, i); + U64 offset_value = df_odin_map_cell_index(value_ptr, &value_cell_info, i); + + + DF_Eval addr_key = zero_struct; + addr_key.mode = EVAL_EvalMode_Addr; + addr_key.offset = offset_key; + addr_key.type_key = key; + + DF_Eval addr_value = zero_struct; + addr_value.mode = EVAL_EvalMode_Addr; + addr_value.offset = offset_value; + addr_value.type_key = value; + + // render element + } + } + + TG_Key key_array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, key_cell, cap/key_cell_info.elements_per_cell); DF_Eval new_eval = zero_struct; new_eval.mode = EVAL_EvalMode_Value; new_eval.imm_u64 = key_ptr; From 5ae60aedc57e5fee95f997356e44bee4b0b7c910 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 30 Mar 2024 14:13:06 +0000 Subject: [PATCH 275/275] Correct brace style --- src/df/gfx/df_view_rule_hooks.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 3d64e57e..4d7bb5b4 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -631,11 +631,13 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_map) U64 TOMBSTONE_MASK = ((U64)1u)<<(size_of_hash*8 - 1); - for (U64 i = 0; i < cap; i += 1) { + for (U64 i = 0; i < cap; i += 1) + { U64 offset_hash = hash_ptr + i*size_of_hash; U64 h = df_evaluate_hash_from_offset(parse_ctx, ctrl_ctx, offset_hash, hash); - if (h != 0 && (h & TOMBSTONE_MASK) == 0) { + if (h != 0 && (h & TOMBSTONE_MASK) == 0) + { U64 offset_key = df_odin_map_cell_index(key_ptr, &key_cell_info, i); U64 offset_value = df_odin_map_cell_index(value_ptr, &value_cell_info, i);